From ed193c2d18689806226f3fff7db7e814ed9267a1 Mon Sep 17 00:00:00 2001 From: lif Date: Sat, 4 Apr 2020 22:49:48 -0700 Subject: [PATCH] WIP: convert to haxeflixel --- .gitignore | 3 +- CODEGUIDE.md => AIR/CODEGUIDE.md | 0 FAQ.md => AIR/FAQ.md | 0 Installation.md => AIR/Installation.md | 0 LICENSE.md => AIR/LICENSE.md | 0 README.md => AIR/README.md | 0 .../USING LEVEL EDITOR.md | 0 {intra => AIR/intra}/Intra-AIR.as3proj | 0 {intra => AIR/intra}/Intra.dam | 0 {intra => AIR/intra}/Minimaps.dam | 0 {intra => AIR/intra}/PackageApp.bat | 0 {intra => AIR/intra}/Run.bat | 0 {intra => AIR/intra}/RunMobile.bat | 0 {intra => AIR/intra}/Z_HELP.txt | 0 .../intra}/bat/CreateCertificate.bat | 0 .../intra}/bat/InstallAirRuntime.bat | 0 {intra => AIR/intra}/bat/InstallGame.bat | 0 {intra => AIR/intra}/bat/PackagerExe.bat | 0 {intra => AIR/intra}/bat/SetupApplication.bat | 0 .../intra}/bat/SetupApplication_Mac.bat | 0 {intra => AIR/intra}/bat/SetupSDK.bat | 0 {intra => AIR/intra}/bat/SetupSDK_Mac.bat | 0 .../intra}/bat/mCreateCertificate.bat | 0 {intra => AIR/intra}/bat/mPackager.bat | 0 {intra => AIR/intra}/bat/mRun.bat | 0 .../intra}/bat/mSetupApplication.bat | 0 {intra => AIR/intra}/bat/mSetupSDK.bat | 0 {intra => AIR/intra}/bin/Default-568h@2x.png | Bin {intra => AIR/intra}/bin/Default.png | Bin {intra => AIR/intra}/bin/joyquery.exe | Bin {intra => AIR/intra}/bin/js/swfobject.js | 0 .../hsrc/awerwer/com/FRESteamWorksTest.hx | 115 + .../steam/Assets/FRESteamWorkswin.hx | 170 + .../com/amanitadesign/steam/FRESteamWorks.hx | 333 ++ .../com/amanitadesign/steam/SteamConstants.hx | 21 + .../com/amanitadesign/steam/SteamEvent.hx | 55 + .../nativeextensions/MacJoystick.hx | 42 + .../nativeextensions/MacJoystickEvent.hx | 26 + .../nativeextensions/MacJoystickManager.hx | 76 + AIR/intra/hsrc/com/FRESteamWorksTest.hx | 115 + .../steam/Assets/FRESteamWorkswin.hx | 170 + .../com/amanitadesign/steam/FRESteamWorks.hx | 335 ++ .../com/amanitadesign/steam/SteamConstants.hx | 21 + .../com/amanitadesign/steam/SteamEvent.hx | 55 + .../amanitadesign/steam/old/FRESteamWorks.hx | 154 + .../amanitadesign/steam/old/SteamConstants.hx | 10 + .../com/amanitadesign/steam/old/SteamEvent.hx | 45 + AIR/intra/hsrc/data/CLASS_ID.hx | 81 + AIR/intra/hsrc/data/CSV_Data.hx | 319 ++ AIR/intra/hsrc/data/Common_Sprites.hx | 66 + AIR/intra/hsrc/data/NPC_Data_EN.hx | 3948 ++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_ES.hx | 3948 ++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_IT.hx | 3948 ++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_JP.hx | 3948 ++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_KR.hx | 3947 ++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_PT.hx | 3952 +++++++++++++++++ AIR/intra/hsrc/data/NPC_Data_ZHS.hx | 3949 ++++++++++++++++ AIR/intra/hsrc/data/SoundData.hx | 849 ++++ AIR/intra/hsrc/data/TileData.hx | 1240 ++++++ AIR/intra/hsrc/entity/decoration/Eye_Light.hx | 35 + AIR/intra/hsrc/entity/decoration/Light.hx | 201 + .../hsrc/entity/decoration/Map_Preview.hx | 39 + AIR/intra/hsrc/entity/decoration/Nonsolid.hx | 48 + .../hsrc/entity/decoration/RetroEffect.hx | 130 + .../hsrc/entity/decoration/Solid_Sprite.hx | 179 + .../hsrc/entity/decoration/Water_Anim.hx | 199 + .../hsrc/entity/enemy/apartment/Dash_Trap.hx | 286 ++ .../hsrc/entity/enemy/apartment/Gasguy.hx | 202 + AIR/intra/hsrc/entity/enemy/apartment/Rat.hx | 213 + .../hsrc/entity/enemy/apartment/Silverfish.hx | 282 ++ .../hsrc/entity/enemy/apartment/Splitboss.hx | 653 +++ .../hsrc/entity/enemy/apartment/Teleguy.hx | 211 + .../hsrc/entity/enemy/bedroom/Annoyer.hx | 324 ++ .../hsrc/entity/enemy/bedroom/Pew_Laser.hx | 188 + .../hsrc/entity/enemy/bedroom/Shieldy.hx | 216 + AIR/intra/hsrc/entity/enemy/bedroom/Slime.hx | 355 ++ .../hsrc/entity/enemy/bedroom/Sun_Guy.hx | 635 +++ .../hsrc/entity/enemy/circus/Circus_Folks.hx | 1001 +++++ AIR/intra/hsrc/entity/enemy/circus/Contort.hx | 295 ++ .../hsrc/entity/enemy/circus/Fire_Pillar.hx | 125 + AIR/intra/hsrc/entity/enemy/circus/Lion.hx | 541 +++ AIR/intra/hsrc/entity/enemy/crowd/Dog.hx | 275 ++ AIR/intra/hsrc/entity/enemy/crowd/Frog.hx | 309 ++ AIR/intra/hsrc/entity/enemy/crowd/Person.hx | 173 + AIR/intra/hsrc/entity/enemy/crowd/Rotator.hx | 79 + .../hsrc/entity/enemy/crowd/Spike_Roller.hx | 284 ++ AIR/intra/hsrc/entity/enemy/crowd/WallBoss.hx | 896 ++++ AIR/intra/hsrc/entity/enemy/etc/Briar_Boss.hx | 1263 ++++++ AIR/intra/hsrc/entity/enemy/etc/Chaser.hx | 193 + .../hsrc/entity/enemy/etc/ControlsDeity.hx | 211 + .../hsrc/entity/enemy/etc/Follower_Bro.hx | 84 + AIR/intra/hsrc/entity/enemy/etc/Red_Walker.hx | 63 + AIR/intra/hsrc/entity/enemy/etc/Sadbro.hx | 74 + AIR/intra/hsrc/entity/enemy/etc/Sage_Boss.hx | 879 ++++ AIR/intra/hsrc/entity/enemy/etc/Space_Face.hx | 66 + AIR/intra/hsrc/entity/enemy/etc/Wall_Laser.hx | 87 + .../hsrc/entity/enemy/hotel/Burst_Plant.hx | 212 + AIR/intra/hsrc/entity/enemy/hotel/Dustmaid.hx | 161 + AIR/intra/hsrc/entity/enemy/hotel/Eye_Boss.hx | 751 ++++ .../hsrc/entity/enemy/hotel/Steam_Pipe.hx | 207 + .../hsrc/entity/enemy/redcave/Four_Shooter.hx | 189 + AIR/intra/hsrc/entity/enemy/redcave/Mover.hx | 121 + .../hsrc/entity/enemy/redcave/On_Off_Laser.hx | 207 + .../hsrc/entity/enemy/redcave/Red_Boss.hx | 851 ++++ .../hsrc/entity/enemy/redcave/Slasher.hx | 448 ++ .../hsrc/entity/enemy/suburb/Suburb_Killer.hx | 81 + .../hsrc/entity/enemy/suburb/Suburb_Walker.hx | 301 ++ AIR/intra/hsrc/entity/gadget/Big_Door.hx | 297 ++ AIR/intra/hsrc/entity/gadget/Button.hx | 109 + .../hsrc/entity/gadget/Challenge_Gate.hx | 58 + AIR/intra/hsrc/entity/gadget/Checkpoint.hx | 290 ++ AIR/intra/hsrc/entity/gadget/Console.hx | 278 ++ AIR/intra/hsrc/entity/gadget/CrackedTile.hx | 64 + AIR/intra/hsrc/entity/gadget/Dash_Pad.hx | 84 + AIR/intra/hsrc/entity/gadget/Door.hx | 736 +++ AIR/intra/hsrc/entity/gadget/Dust.hx | 172 + AIR/intra/hsrc/entity/gadget/Gate.hx | 211 + AIR/intra/hsrc/entity/gadget/Go_Detector.hx | 112 + AIR/intra/hsrc/entity/gadget/Growth_Gate.hx | 58 + AIR/intra/hsrc/entity/gadget/Hole.hx | 53 + AIR/intra/hsrc/entity/gadget/Jump_Trigger.hx | 134 + AIR/intra/hsrc/entity/gadget/Key.hx | 56 + AIR/intra/hsrc/entity/gadget/KeyBlock.hx | 429 ++ AIR/intra/hsrc/entity/gadget/Pillar_Switch.hx | 81 + AIR/intra/hsrc/entity/gadget/Propelled.hx | 306 ++ .../hsrc/entity/gadget/SinglePushBlock.hx | 152 + AIR/intra/hsrc/entity/gadget/Stop_Marker.hx | 40 + AIR/intra/hsrc/entity/gadget/Switch_Pillar.hx | 81 + AIR/intra/hsrc/entity/gadget/Treasure.hx | 396 ++ .../hsrc/entity/interactive/Black_Thing.hx | 198 + .../hsrc/entity/interactive/Dungeon_Statue.hx | 88 + AIR/intra/hsrc/entity/interactive/Elevator.hx | 223 + .../hsrc/entity/interactive/Fisherman.hx | 81 + .../hsrc/entity/interactive/Health_Cicada.hx | 280 ++ AIR/intra/hsrc/entity/interactive/NPC.hx | 1426 ++++++ .../hsrc/entity/interactive/Red_Pillar.hx | 145 + .../hsrc/entity/interactive/Terminal_Gate.hx | 83 + .../hsrc/entity/interactive/npc/Forest_NPC.hx | 150 + .../hsrc/entity/interactive/npc/Happy_NPC.hx | 197 + .../interactive/npc/Huge_Fucking_Stag.hx | 32 + .../hsrc/entity/interactive/npc/Mitra.hx | 910 ++++ .../hsrc/entity/interactive/npc/Redsea_NPC.hx | 110 + AIR/intra/hsrc/entity/interactive/npc/Sage.hx | 770 ++++ .../entity/interactive/npc/Shadow_Briar.hx | 472 ++ .../hsrc/entity/interactive/npc/Space_NPC.hx | 136 + .../hsrc/entity/interactive/npc/Trade_NPC.hx | 809 ++++ AIR/intra/hsrc/entity/player/Broom.hx | 337 ++ AIR/intra/hsrc/entity/player/Foot_Overlay.hx | 266 ++ AIR/intra/hsrc/entity/player/HealthBar.hx | 122 + AIR/intra/hsrc/entity/player/HealthPickup.hx | 97 + AIR/intra/hsrc/entity/player/Miniminimap.hx | 139 + AIR/intra/hsrc/entity/player/Player.hx | 1630 +++++++ AIR/intra/hsrc/entity/player/Transformer.hx | 245 + AIR/intra/hsrc/extension/JoyQuery/Joystick.hx | 240 + AIR/intra/hsrc/helper/ANEFix.hx | 160 + AIR/intra/hsrc/helper/Achievements.hx | 253 ++ AIR/intra/hsrc/helper/Cutscene.hx | 467 ++ AIR/intra/hsrc/helper/DH.hx | 628 +++ AIR/intra/hsrc/helper/EventScripts.hx | 567 +++ AIR/intra/hsrc/helper/Joypad_Config_Group.hx | 294 ++ AIR/intra/hsrc/helper/Parabola_Thing.hx | 106 + AIR/intra/hsrc/helper/S_NPC.hx | 126 + AIR/intra/hsrc/helper/ScreenFade.hx | 173 + AIR/intra/hsrc/helper/SpriteFactory.hx | 538 +++ AIR/intra/hsrc/helper/SteamThing.hx | 16 + AIR/intra/hsrc/helper/UI_Offsets.hx | 170 + AIR/intra/hsrc/org/flixel/AnoSprite.hx | 48 + AIR/intra/hsrc/org/flixel/FlxBasic.hx | 153 + AIR/intra/hsrc/org/flixel/FlxButton.hx | 355 ++ AIR/intra/hsrc/org/flixel/FlxCamera.hx | 711 +++ AIR/intra/hsrc/org/flixel/FlxEmitter.hx | 380 ++ AIR/intra/hsrc/org/flixel/FlxG.hx | 1321 ++++++ AIR/intra/hsrc/org/flixel/FlxGame.hx | 825 ++++ AIR/intra/hsrc/org/flixel/FlxGroup.hx | 639 +++ AIR/intra/hsrc/org/flixel/FlxObject.hx | 1182 +++++ AIR/intra/hsrc/org/flixel/FlxParticle.hx | 92 + AIR/intra/hsrc/org/flixel/FlxPath.hx | 280 ++ AIR/intra/hsrc/org/flixel/FlxPoint.hx | 101 + AIR/intra/hsrc/org/flixel/FlxRect.hx | 175 + AIR/intra/hsrc/org/flixel/FlxSave.hx | 194 + AIR/intra/hsrc/org/flixel/FlxSound.hx | 508 +++ AIR/intra/hsrc/org/flixel/FlxSprite.hx | 1060 +++++ AIR/intra/hsrc/org/flixel/FlxState.hx | 24 + AIR/intra/hsrc/org/flixel/FlxText.hx | 305 ++ AIR/intra/hsrc/org/flixel/FlxTileblock.hx | 94 + AIR/intra/hsrc/org/flixel/FlxTilemap.hx | 1509 +++++++ AIR/intra/hsrc/org/flixel/FlxTimer.hx | 171 + AIR/intra/hsrc/org/flixel/FlxU.hx | 621 +++ .../org/flixel/plugin/DebugPathDisplay.hx | 111 + .../hsrc/org/flixel/plugin/TimerManager.hx | 87 + .../plugin/photonstorm/API/FlxKongregate.hx | 346 ++ .../plugin/photonstorm/BaseTypes/Bullet.hx | 234 + .../photonstorm/BaseTypes/MouseSpring.hx | 94 + .../flixel/plugin/photonstorm/FX/BaseFX.hx | 110 + .../flixel/plugin/photonstorm/FX/BlurFX.hx | 133 + .../plugin/photonstorm/FX/CenterSlideFX.hx | 249 ++ .../plugin/photonstorm/FX/FloodFillFX.hx | 128 + .../flixel/plugin/photonstorm/FX/GlitchFX.hx | 119 + .../flixel/plugin/photonstorm/FX/PlasmaFX.hx | 170 + .../plugin/photonstorm/FX/RainbowLineFX.hx | 260 ++ .../flixel/plugin/photonstorm/FX/RevealFX.hx | 113 + .../plugin/photonstorm/FX/SineWaveFX.hx | 329 ++ .../plugin/photonstorm/FX/StarfieldFX.hx | 283 ++ .../plugin/photonstorm/FX/WowCopperFX.hx | 304 ++ .../org/flixel/plugin/photonstorm/FlxBar.hx | 658 +++ .../plugin/photonstorm/FlxBitmapFont.hx | 503 +++ .../plugin/photonstorm/FlxButtonPlus.hx | 500 +++ .../flixel/plugin/photonstorm/FlxCollision.hx | 210 + .../org/flixel/plugin/photonstorm/FlxColor.hx | 534 +++ .../flixel/plugin/photonstorm/FlxControl.hx | 178 + .../plugin/photonstorm/FlxControlHandler.hx | 1423 ++++++ .../flixel/plugin/photonstorm/FlxCoreUtils.hx | 70 + .../org/flixel/plugin/photonstorm/FlxDelay.hx | 163 + .../flixel/plugin/photonstorm/FlxDisplay.hx | 181 + .../flixel/plugin/photonstorm/FlxExplode.hx | 15 + .../plugin/photonstorm/FlxExtendedSprite.hx | 889 ++++ .../flixel/plugin/photonstorm/FlxFlectrum.hx | 702 +++ .../org/flixel/plugin/photonstorm/FlxFlod.hx | 254 ++ .../flixel/plugin/photonstorm/FlxGradient.hx | 251 ++ .../plugin/photonstorm/FlxGridOverlay.hx | 186 + .../plugin/photonstorm/FlxLinkedGroup.hx | 33 + .../org/flixel/plugin/photonstorm/FlxMath.hx | 609 +++ .../plugin/photonstorm/FlxMouseControl.hx | 270 ++ .../plugin/photonstorm/FlxPowerTools.hx | 23 + .../plugin/photonstorm/FlxScreenGrab.hx | 178 + .../plugin/photonstorm/FlxScrollZone.hx | 257 ++ .../plugin/photonstorm/FlxScrollingText.hx | 310 ++ .../flixel/plugin/photonstorm/FlxSpecialFX.hx | 308 ++ .../flixel/plugin/photonstorm/FlxVelocity.hx | 364 ++ .../flixel/plugin/photonstorm/FlxWeapon.hx | 690 +++ .../flixel/plugin/photonstorm/PNGEncoder.hx | 140 + AIR/intra/hsrc/org/flixel/system/FlxAnim.hx | 52 + .../hsrc/org/flixel/system/FlxDebugger.hx | 233 + AIR/intra/hsrc/org/flixel/system/FlxList.hx | 48 + .../hsrc/org/flixel/system/FlxPreloader.hx | 215 + .../hsrc/org/flixel/system/FlxQuadTree.hx | 612 +++ AIR/intra/hsrc/org/flixel/system/FlxReplay.hx | 201 + AIR/intra/hsrc/org/flixel/system/FlxTile.hx | 80 + .../org/flixel/system/FlxTilemapBuffer.hx | 120 + AIR/intra/hsrc/org/flixel/system/FlxWindow.hx | 327 ++ .../hsrc/org/flixel/system/ObjectPool.hx | 32 + AIR/intra/hsrc/org/flixel/system/debug/Log.hx | 91 + .../hsrc/org/flixel/system/debug/Perf.hx | 209 + AIR/intra/hsrc/org/flixel/system/debug/VCR.hx | 599 +++ AIR/intra/hsrc/org/flixel/system/debug/Vis.hx | 170 + .../hsrc/org/flixel/system/debug/Watch.hx | 213 + .../org/flixel/system/debug/WatchEntry.hx | 207 + .../hsrc/org/flixel/system/input/Input.hx | 189 + .../hsrc/org/flixel/system/input/Keyboard.hx | 210 + .../hsrc/org/flixel/system/input/Mouse.hx | 338 ++ .../org/flixel/system/replay/FrameRecord.hx | 142 + .../org/flixel/system/replay/MouseRecord.hx | 42 + {intra => AIR/intra}/mPackageApp.bat | 0 {intra => AIR/intra}/mRun.bat | 0 {intra => AIR/intra}/obj/Intra-AIRConfig.old | 0 {intra => AIR/intra}/obj/Intra-AIRConfig.xml | 0 {intra => AIR/intra}/src/Intra.as | 0 {intra => AIR/intra}/src/Main.as | 0 {intra => AIR/intra}/src/Preloader.as | 0 {intra => AIR/intra}/src/Save.as | 0 {intra => AIR/intra}/src/awerwer/com.zip | Bin .../src/awerwer/com/FRESteamWorksLibLinux.swc | Bin .../src/awerwer/com/FRESteamWorksTest.as | 0 .../steam/Assets/FRESteamWorkswin.as | 0 .../amanitadesign/steam/Assets/descriptor.xml | 0 .../com/amanitadesign/steam/FRESteamWorks.as | 0 .../com/amanitadesign/steam/SteamConstants.as | 0 .../com/amanitadesign/steam/SteamEvent.as | 0 {intra => AIR/intra}/src/buildmap.py | 0 .../nativeextensions/MacJoystick.as | 0 .../nativeextensions/MacJoystickEvent.as | 0 .../nativeextensions/MacJoystickManager.as | 0 .../intra}/src/com/FRESteamWorksLibLinux.swc | Bin .../intra}/src/com/FRESteamWorksTest.as | 0 .../steam/Assets/FRESteamWorkswin.as | 0 .../amanitadesign/steam/Assets/descriptor.xml | 0 .../com/amanitadesign/steam/FRESteamWorks.as | 0 .../com/amanitadesign/steam/SteamConstants.as | 0 .../src/com/amanitadesign/steam/SteamEvent.as | 0 .../amanitadesign/steam/old/FRESteamWorks.as | 0 .../amanitadesign/steam/old/SteamConstants.as | 0 .../com/amanitadesign/steam/old/SteamEvent.as | 0 {intra => AIR/intra}/src/csv/APARTMENT_BG.csv | 0 .../intra}/src/csv/APARTMENT_BG2.csv | 0 {intra => AIR/intra}/src/csv/APARTMENT_FG.csv | 0 {intra => AIR/intra}/src/csv/BEACH_BG.csv | 0 {intra => AIR/intra}/src/csv/BEACH_BG2.csv | 0 {intra => AIR/intra}/src/csv/BEACH_FG.csv | 0 {intra => AIR/intra}/src/csv/BEDROOM_BG.csv | 0 {intra => AIR/intra}/src/csv/BEDROOM_BG2.csv | 0 {intra => AIR/intra}/src/csv/BEDROOM_FG.csv | 0 {intra => AIR/intra}/src/csv/BLANK_BG.csv | 0 {intra => AIR/intra}/src/csv/BLUE_BG.csv | 0 {intra => AIR/intra}/src/csv/BLUE_BG2.csv | 0 {intra => AIR/intra}/src/csv/BLUE_FG.csv | 0 {intra => AIR/intra}/src/csv/CIRCUS_BG.csv | 0 {intra => AIR/intra}/src/csv/CIRCUS_BG2.csv | 0 {intra => AIR/intra}/src/csv/CIRCUS_FG.csv | 0 {intra => AIR/intra}/src/csv/CLIFF_BG.csv | 0 {intra => AIR/intra}/src/csv/CLIFF_BG2.csv | 0 {intra => AIR/intra}/src/csv/CROWD_BG.csv | 0 {intra => AIR/intra}/src/csv/CROWD_BG2.csv | 0 {intra => AIR/intra}/src/csv/CROWD_FG.csv | 0 {intra => AIR/intra}/src/csv/DEBUG_BG.csv | 0 {intra => AIR/intra}/src/csv/DEBUG_BG2.csv | 0 {intra => AIR/intra}/src/csv/DEBUG_FG.csv | 0 {intra => AIR/intra}/src/csv/DRAWER_BG.csv | 0 {intra => AIR/intra}/src/csv/DRAWER_BG2.csv | 0 {intra => AIR/intra}/src/csv/DRAWER_FG.csv | 0 {intra => AIR/intra}/src/csv/FIELDS_BG.csv | 0 {intra => AIR/intra}/src/csv/FIELDS_BG2.csv | 0 {intra => AIR/intra}/src/csv/FIELDS_FG.csv | 0 {intra => AIR/intra}/src/csv/FOREST_BG.csv | 0 {intra => AIR/intra}/src/csv/FOREST_BG2.csv | 0 {intra => AIR/intra}/src/csv/FOREST_FG.csv | 0 {intra => AIR/intra}/src/csv/GO_BG.csv | 0 {intra => AIR/intra}/src/csv/GO_BG2.csv | 0 {intra => AIR/intra}/src/csv/GO_BG2_old.csv | 0 {intra => AIR/intra}/src/csv/GO_FG.csv | 0 {intra => AIR/intra}/src/csv/HAPPY_BG.csv | 0 {intra => AIR/intra}/src/csv/HAPPY_BG2.csv | 0 {intra => AIR/intra}/src/csv/HAPPY_FG.csv | 0 {intra => AIR/intra}/src/csv/HOTEL_BG.csv | 0 {intra => AIR/intra}/src/csv/HOTEL_BG2.csv | 0 {intra => AIR/intra}/src/csv/HOTEL_FG.csv | 0 .../intra}/src/csv/Minimap_Apartment.csv | 0 .../intra}/src/csv/Minimap_Beach.csv | 0 .../intra}/src/csv/Minimap_Bedroom.csv | 0 {intra => AIR/intra}/src/csv/Minimap_Cell.csv | 0 .../intra}/src/csv/Minimap_Circus.csv | 0 .../intra}/src/csv/Minimap_Cliff.csv | 0 .../intra}/src/csv/Minimap_Crowd.csv | 0 .../intra}/src/csv/Minimap_Fields.csv | 0 .../intra}/src/csv/Minimap_Forest.csv | 0 .../intra}/src/csv/Minimap_Hotel.csv | 0 .../intra}/src/csv/Minimap_Overworld.csv | 0 .../intra}/src/csv/Minimap_Redcave.csv | 0 .../intra}/src/csv/Minimap_Redsea.csv | 0 .../intra}/src/csv/Minimap_Space.csv | 0 .../intra}/src/csv/Minimap_Street.csv | 0 .../intra}/src/csv/Minimap_Suburb.csv | 0 .../intra}/src/csv/Minimap_Terminal.csv | 0 {intra => AIR/intra}/src/csv/NEXUS_BG.csv | 0 {intra => AIR/intra}/src/csv/NEXUS_BG2.csv | 0 {intra => AIR/intra}/src/csv/NEXUS_FG.csv | 0 {intra => AIR/intra}/src/csv/OVERWORLD_BG.csv | 0 .../intra}/src/csv/OVERWORLD_BG2.csv | 0 {intra => AIR/intra}/src/csv/OVERWORLD_FG.csv | 0 {intra => AIR/intra}/src/csv/REDCAVE_BG.csv | 0 {intra => AIR/intra}/src/csv/REDCAVE_BG2.csv | 0 {intra => AIR/intra}/src/csv/REDCAVE_FG.csv | 0 {intra => AIR/intra}/src/csv/REDSEA_BG.csv | 0 {intra => AIR/intra}/src/csv/REDSEA_BG2.csv | 0 {intra => AIR/intra}/src/csv/REDSEA_FG.csv | 0 {intra => AIR/intra}/src/csv/SPACE_BG.csv | 0 {intra => AIR/intra}/src/csv/SPACE_BG2.csv | 0 {intra => AIR/intra}/src/csv/SPACE_FG.csv | 0 {intra => AIR/intra}/src/csv/STREET_BG.csv | 0 {intra => AIR/intra}/src/csv/STREET_BG2.csv | 0 {intra => AIR/intra}/src/csv/STREET_FG.csv | 0 {intra => AIR/intra}/src/csv/SUBURB_BG.csv | 0 {intra => AIR/intra}/src/csv/SUBURB_BG2.csv | 0 {intra => AIR/intra}/src/csv/SUBURB_FG.csv | 0 {intra => AIR/intra}/src/csv/TERMINAL_BG.csv | 0 {intra => AIR/intra}/src/csv/TERMINAL_BG2.csv | 0 {intra => AIR/intra}/src/csv/TERMINAL_FG.csv | 0 {intra => AIR/intra}/src/csv/TRAIN_BG.csv | 0 {intra => AIR/intra}/src/csv/TRAIN_BG2.csv | 0 {intra => AIR/intra}/src/csv/TRAIN_FG.csv | 0 {intra => AIR/intra}/src/csv/WINDMILL_BG.csv | 0 {intra => AIR/intra}/src/csv/WINDMILL_BG2.csv | 0 {intra => AIR/intra}/src/csv/WINDMILL_FG.csv | 0 {intra => AIR/intra}/src/data/CLASS_ID.as | 0 {intra => AIR/intra}/src/data/CSV_Data.as | 0 .../intra}/src/data/Common_Sprites.as | 0 {intra => AIR/intra}/src/data/NPC_Data_EN.as | 0 {intra => AIR/intra}/src/data/NPC_Data_ES.as | 0 {intra => AIR/intra}/src/data/NPC_Data_IT.as | 0 {intra => AIR/intra}/src/data/NPC_Data_JP.as | 0 {intra => AIR/intra}/src/data/NPC_Data_KR.as | 0 {intra => AIR/intra}/src/data/NPC_Data_PT.as | 0 {intra => AIR/intra}/src/data/NPC_Data_ZHS.as | 0 {intra => AIR/intra}/src/data/SoundData.as | 0 {intra => AIR/intra}/src/data/TileData.as | 0 {intra => AIR/intra}/src/data/dialogue_EN.txt | 0 {intra => AIR/intra}/src/data/dialogue_ES.txt | 0 {intra => AIR/intra}/src/data/dialogue_IT.txt | 0 .../intra}/src/data/dialogue_ZHS.txt | 0 {intra => AIR/intra}/src/data/dialogue_jp.txt | 0 .../intra}/src/data/dialogue_pt-br.txt | 0 {intra => AIR/intra}/src/data/gen_npc.py | 0 .../intra}/src/data/kr/dialogue_kr.py | 0 .../intra}/src/data/kr/make_kr_npc_data.bat | 0 .../intra}/src/data/make_npc_data.bat | 0 .../intra}/src/entity/decoration/Eye_Light.as | 0 .../intra}/src/entity/decoration/Light.as | 0 .../src/entity/decoration/Map_Preview.as | 0 .../intra}/src/entity/decoration/Nonsolid.as | 0 .../src/entity/decoration/RetroEffect.as | 0 .../src/entity/decoration/Solid_Sprite.as | 0 .../src/entity/decoration/Water_Anim.as | 0 .../src/entity/enemy/apartment/Dash_Trap.as | 0 .../src/entity/enemy/apartment/Gasguy.as | 0 .../intra}/src/entity/enemy/apartment/Rat.as | 0 .../src/entity/enemy/apartment/Silverfish.as | 0 .../src/entity/enemy/apartment/Splitboss.as | 0 .../src/entity/enemy/apartment/Teleguy.as | 0 .../src/entity/enemy/bedroom/Annoyer.as | 0 .../src/entity/enemy/bedroom/Pew_Laser.as | 0 .../src/entity/enemy/bedroom/Shieldy.as | 0 .../intra}/src/entity/enemy/bedroom/Slime.as | 0 .../src/entity/enemy/bedroom/Sun_Guy.as | 0 .../src/entity/enemy/circus/Circus_Folks.as | 0 .../intra}/src/entity/enemy/circus/Contort.as | 0 .../src/entity/enemy/circus/Fire_Pillar.as | 0 .../intra}/src/entity/enemy/circus/Lion.as | 0 .../intra}/src/entity/enemy/crowd/Dog.as | 0 .../intra}/src/entity/enemy/crowd/Frog.as | 0 .../intra}/src/entity/enemy/crowd/Person.as | 0 .../intra}/src/entity/enemy/crowd/Rotator.as | 0 .../src/entity/enemy/crowd/Spike_Roller.as | 0 .../intra}/src/entity/enemy/crowd/WallBoss.as | 0 .../intra}/src/entity/enemy/etc/Briar_Boss.as | 0 .../intra}/src/entity/enemy/etc/Chaser.as | 0 .../src/entity/enemy/etc/ControlsDeity.as | 0 .../src/entity/enemy/etc/Follower_Bro.as | 0 .../intra}/src/entity/enemy/etc/Red_Walker.as | 0 .../intra}/src/entity/enemy/etc/Sadbro.as | 0 .../intra}/src/entity/enemy/etc/Sage_Boss.as | 0 .../intra}/src/entity/enemy/etc/Space_Face.as | 0 .../intra}/src/entity/enemy/etc/Wall_Laser.as | 0 .../src/entity/enemy/hotel/Burst_Plant.as | 0 .../intra}/src/entity/enemy/hotel/Dustmaid.as | 0 .../intra}/src/entity/enemy/hotel/Eye_Boss.as | 0 .../src/entity/enemy/hotel/Steam_Pipe.as | 0 .../src/entity/enemy/redcave/Four_Shooter.as | 0 .../intra}/src/entity/enemy/redcave/Mover.as | 0 .../src/entity/enemy/redcave/On_Off_Laser.as | 0 .../src/entity/enemy/redcave/Red_Boss.as | 0 .../src/entity/enemy/redcave/Slasher.as | 0 .../src/entity/enemy/suburb/Suburb_Killer.as | 0 .../src/entity/enemy/suburb/Suburb_Walker.as | 0 .../intra}/src/entity/gadget/Big_Door.as | 0 .../intra}/src/entity/gadget/Button.as | 0 .../src/entity/gadget/Challenge_Gate.as | 0 .../intra}/src/entity/gadget/Checkpoint.as | 0 .../intra}/src/entity/gadget/Console.as | 0 .../intra}/src/entity/gadget/CrackedTile.as | 0 .../intra}/src/entity/gadget/Dash_Pad.as | 0 .../intra}/src/entity/gadget/Door.as | 0 .../intra}/src/entity/gadget/Dust.as | 0 .../intra}/src/entity/gadget/Gate.as | 0 .../intra}/src/entity/gadget/Go_Detector.as | 0 .../intra}/src/entity/gadget/Growth_Gate.as | 0 .../intra}/src/entity/gadget/Hole.as | 0 .../intra}/src/entity/gadget/Jump_Trigger.as | 0 {intra => AIR/intra}/src/entity/gadget/Key.as | 0 .../intra}/src/entity/gadget/KeyBlock.as | 0 .../intra}/src/entity/gadget/Pillar_Switch.as | 0 .../intra}/src/entity/gadget/Propelled.as | 0 .../src/entity/gadget/SinglePushBlock.as | 0 .../intra}/src/entity/gadget/Stop_Marker.as | 0 .../intra}/src/entity/gadget/Switch_Pillar.as | 0 .../intra}/src/entity/gadget/Treasure.as | 0 .../src/entity/interactive/Black_Thing.as | 0 .../src/entity/interactive/Dungeon_Statue.as | 0 .../intra}/src/entity/interactive/Elevator.as | 0 .../src/entity/interactive/Fisherman.as | 0 .../src/entity/interactive/Health_Cicada.as | 0 .../intra}/src/entity/interactive/NPC.as | 0 .../src/entity/interactive/Red_Pillar.as | 0 .../src/entity/interactive/Terminal_Gate.as | 0 .../src/entity/interactive/npc/Forest_NPC.as | 0 .../src/entity/interactive/npc/Happy_NPC.as | 0 .../interactive/npc/Huge_Fucking_Stag.as | 0 .../src/entity/interactive/npc/Mitra.as | 0 .../src/entity/interactive/npc/Redsea_NPC.as | 0 .../intra}/src/entity/interactive/npc/Sage.as | 0 .../entity/interactive/npc/Shadow_Briar.as | 0 .../src/entity/interactive/npc/Space_NPC.as | 0 .../src/entity/interactive/npc/Trade_NPC.as | 0 .../intra}/src/entity/player/Broom.as | 0 .../intra}/src/entity/player/Foot_Overlay.as | 0 .../intra}/src/entity/player/HealthBar.as | 0 .../intra}/src/entity/player/HealthPickup.as | 0 .../intra}/src/entity/player/Miniminimap.as | 0 .../intra}/src/entity/player/Player.as | 0 .../intra}/src/entity/player/Transformer.as | 0 .../intra}/src/extension/JoyQuery/Joystick.as | 0 {intra => AIR/intra}/src/global/Keys.as | 0 {intra => AIR/intra}/src/global/Registry.as | 0 {intra => AIR/intra}/src/helper/ANEFix.as | 0 .../intra}/src/helper/Achievements.as | 0 {intra => AIR/intra}/src/helper/Cutscene.as | 0 {intra => AIR/intra}/src/helper/DH.as | 0 .../intra}/src/helper/EventScripts.as | 0 .../intra}/src/helper/Joypad_Config_Group.as | 0 .../intra}/src/helper/Parabola_Thing.as | 0 {intra => AIR/intra}/src/helper/S_NPC.as | 0 {intra => AIR/intra}/src/helper/ScreenFade.as | 0 .../intra}/src/helper/SpriteFactory.as | 0 {intra => AIR/intra}/src/helper/SteamThing.as | 0 {intra => AIR/intra}/src/helper/UI_Offsets.as | 0 {intra => AIR/intra}/src/helper/invertRGB.pbj | Bin {intra => AIR/intra}/src/helper/static.pbj | Bin {intra => AIR/intra}/src/lua/Intra.lua | 0 .../intra}/src/lua/Intra_settings.lua | 0 {intra => AIR/intra}/src/lua/csvTilemap.lua | 0 .../intra}/src/lua/csvTilemap_settings.lua | 0 {intra => AIR/intra}/src/noairSave.as | 0 .../intra}/src/org/flixel/AnoSprite.as | 0 .../intra}/src/org/flixel/FlxBasic.as | 0 .../intra}/src/org/flixel/FlxButton.as | 0 .../intra}/src/org/flixel/FlxCamera.as | 0 .../intra}/src/org/flixel/FlxEmitter.as | 0 {intra => AIR/intra}/src/org/flixel/FlxG.as | 0 .../intra}/src/org/flixel/FlxGame.as | 0 .../intra}/src/org/flixel/FlxGroup.as | 0 .../intra}/src/org/flixel/FlxObject.as | 0 .../intra}/src/org/flixel/FlxParticle.as | 0 .../intra}/src/org/flixel/FlxPath.as | 0 .../intra}/src/org/flixel/FlxPoint.as | 0 .../intra}/src/org/flixel/FlxRect.as | 0 .../intra}/src/org/flixel/FlxSave.as | 0 .../intra}/src/org/flixel/FlxSound.as | 0 .../intra}/src/org/flixel/FlxSprite.as | 0 .../intra}/src/org/flixel/FlxState.as | 0 .../intra}/src/org/flixel/FlxText.as | 0 .../intra}/src/org/flixel/FlxTileblock.as | 0 .../intra}/src/org/flixel/FlxTilemap.as | 0 .../intra}/src/org/flixel/FlxTimer.as | 0 {intra => AIR/intra}/src/org/flixel/FlxU.as | 0 .../intra}/src/org/flixel/data/autotiles.png | Bin .../src/org/flixel/data/autotiles_alt.png | Bin .../intra}/src/org/flixel/data/beep.mp3 | Bin .../intra}/src/org/flixel/data/button.png | Bin .../intra}/src/org/flixel/data/cursor.png | Bin .../intra}/src/org/flixel/data/default.png | Bin .../intra}/src/org/flixel/data/handle.png | Bin .../intra}/src/org/flixel/data/logo.png | Bin .../src/org/flixel/data/logo_corners.png | Bin .../intra}/src/org/flixel/data/logo_light.png | Bin .../intra}/src/org/flixel/data/nokiafc22.ttf | Bin .../intra}/src/org/flixel/data/vcr/flixel.png | Bin .../intra}/src/org/flixel/data/vcr/open.png | Bin .../intra}/src/org/flixel/data/vcr/pause.png | Bin .../intra}/src/org/flixel/data/vcr/play.png | Bin .../src/org/flixel/data/vcr/record_off.png | Bin .../src/org/flixel/data/vcr/record_on.png | Bin .../src/org/flixel/data/vcr/restart.png | Bin .../intra}/src/org/flixel/data/vcr/step.png | Bin .../intra}/src/org/flixel/data/vcr/stop.png | Bin .../intra}/src/org/flixel/data/vis/bounds.png | Bin .../src/org/flixel/plugin/DebugPathDisplay.as | 0 .../src/org/flixel/plugin/TimerManager.as | 0 .../plugin/photonstorm/API/FlxKongregate.as | 0 .../plugin/photonstorm/BaseTypes/Bullet.as | 0 .../photonstorm/BaseTypes/MouseSpring.as | 0 .../flixel/plugin/photonstorm/FX/BaseFX.as | 0 .../flixel/plugin/photonstorm/FX/BlurFX.as | 0 .../plugin/photonstorm/FX/CenterSlideFX.as | 0 .../plugin/photonstorm/FX/FloodFillFX.as | 0 .../flixel/plugin/photonstorm/FX/GlitchFX.as | 0 .../flixel/plugin/photonstorm/FX/PlasmaFX.as | 0 .../plugin/photonstorm/FX/RainbowLineFX.as | 0 .../flixel/plugin/photonstorm/FX/RevealFX.as | 0 .../plugin/photonstorm/FX/SineWaveFX.as | 0 .../plugin/photonstorm/FX/StarfieldFX.as | 0 .../plugin/photonstorm/FX/WowCopperFX.as | 0 .../org/flixel/plugin/photonstorm/FlxBar.as | 0 .../plugin/photonstorm/FlxBitmapFont.as | 0 .../plugin/photonstorm/FlxButtonPlus.as | 0 .../flixel/plugin/photonstorm/FlxCollision.as | 0 .../org/flixel/plugin/photonstorm/FlxColor.as | 0 .../flixel/plugin/photonstorm/FlxControl.as | 0 .../plugin/photonstorm/FlxControlHandler.as | 0 .../flixel/plugin/photonstorm/FlxCoreUtils.as | 0 .../org/flixel/plugin/photonstorm/FlxDelay.as | 0 .../flixel/plugin/photonstorm/FlxDisplay.as | 0 .../flixel/plugin/photonstorm/FlxExplode.as | 0 .../plugin/photonstorm/FlxExtendedSprite.as | 0 .../flixel/plugin/photonstorm/FlxFlectrum.as | 0 .../org/flixel/plugin/photonstorm/FlxFlod.as | 0 .../flixel/plugin/photonstorm/FlxGradient.as | 0 .../plugin/photonstorm/FlxGridOverlay.as | 0 .../plugin/photonstorm/FlxLinkedGroup.as | 0 .../org/flixel/plugin/photonstorm/FlxMath.as | 0 .../plugin/photonstorm/FlxMouseControl.as | 0 .../plugin/photonstorm/FlxPowerTools.as | 0 .../plugin/photonstorm/FlxScreenGrab.as | 0 .../plugin/photonstorm/FlxScrollZone.as | 0 .../plugin/photonstorm/FlxScrollingText.as | 0 .../flixel/plugin/photonstorm/FlxSpecialFX.as | 0 .../flixel/plugin/photonstorm/FlxVelocity.as | 0 .../flixel/plugin/photonstorm/FlxWeapon.as | 0 .../flixel/plugin/photonstorm/PNGEncoder.as | 0 .../intra}/src/org/flixel/system/FlxAnim.as | 0 .../src/org/flixel/system/FlxDebugger.as | 0 .../intra}/src/org/flixel/system/FlxList.as | 0 .../src/org/flixel/system/FlxPreloader.as | 0 .../src/org/flixel/system/FlxQuadTree.as | 0 .../intra}/src/org/flixel/system/FlxReplay.as | 0 .../intra}/src/org/flixel/system/FlxTile.as | 0 .../src/org/flixel/system/FlxTilemapBuffer.as | 0 .../intra}/src/org/flixel/system/FlxWindow.as | 0 .../src/org/flixel/system/ObjectPool.as | 0 .../intra}/src/org/flixel/system/debug/Log.as | 0 .../src/org/flixel/system/debug/Perf.as | 0 .../intra}/src/org/flixel/system/debug/VCR.as | 0 .../intra}/src/org/flixel/system/debug/Vis.as | 0 .../src/org/flixel/system/debug/Watch.as | 0 .../src/org/flixel/system/debug/WatchEntry.as | 0 .../src/org/flixel/system/input/Input.as | 0 .../src/org/flixel/system/input/Keyboard.as | 0 .../src/org/flixel/system/input/Mouse.as | 0 .../org/flixel/system/replay/FrameRecord.as | 0 .../org/flixel/system/replay/MouseRecord.as | 0 .../intra}/src/states/ControlsState.as | 0 .../intra}/src/states/DialogueState.as | 0 .../intra}/src/states/EndingState.as | 0 {intra => AIR/intra}/src/states/IntroScene.as | 0 .../intra}/src/states/MinimapState.as | 0 .../intra}/src/states/MobileConfig.as | 0 {intra => AIR/intra}/src/states/PauseState.as | 0 {intra => AIR/intra}/src/states/PlayState.as | 0 .../intra}/src/states/PushableFlxState.as | 0 {intra => AIR/intra}/src/states/RoamState.as | 0 {intra => AIR/intra}/src/states/TitleState.as | 0 .../intra}/src/states/noairPauseState.as | 0 {intra => AIR/intra}/src/xml/Intra.xml | 0 {intra => AIR/intra}/xml_app/application.xml | 0 .../intra}/xml_app/application_mac.xml | 0 .../intra}/xml_app/mapplicationdroid.xml | 0 intra/Project.xml | 82 + .../res => assets/images}/font/11x12_ZHS.png | Bin .../res => assets/images}/font/8x8-kr.png | Bin .../res => assets/images}/font/es_white.png | Bin .../images}/font/font-black-apple-7x8.png | Bin .../res => assets/images}/font/font-black.png | Bin .../images}/font/font-white-apple-7x8.png | Bin .../res => assets/images}/font/jp_white.png | Bin .../images}/font/jp_white_test.png | Bin .../res => assets/images}/font/kr_white.png | Bin .../res => assets/images}/medals/boss.gif | Bin .../res => assets/images}/medals/card.gif | Bin .../res => assets/images}/medals/cards.gif | Bin .../res => assets/images}/medals/fields.jpg | Bin .../images}/medals/greenlight.gif | Bin .../images}/medals/greenlight.jpg | Bin .../res => assets/images}/medals/health.gif | Bin .../res => assets/images}/medals/palyer.jpg | Bin .../res => assets/images}/medals/secret.gif | Bin .../images}/sprites/animtiles/beach_anims.png | Bin .../images}/sprites/animtiles/cell_anims.png | Bin .../sprites/animtiles/conveyer_anim_tiles.png | Bin .../sprites/animtiles/fields_anims.png | Bin .../images}/sprites/animtiles/flame_anims.png | Bin .../sprites/animtiles/forest_anims.png | Bin .../images}/sprites/animtiles/go_anims.png | Bin .../images}/sprites/animtiles/happy_anims.png | Bin .../images}/sprites/animtiles/shoreline.png | Bin .../sprites/animtiles/shoreline_old.png | Bin .../sprites/animtiles/shoreline_old2.png | Bin .../sprites/animtiles/suburbs_anims.png | Bin .../images}/sprites/animtiles/terminal.png | Bin .../sprites/animtiles/torch_pillars.png | Bin .../images}/sprites/animtiles/water_edges.png | Bin .../sprites/animtiles/windmill_drops.png | Bin .../images}/sprites/broom_cell.png | Bin .../images}/sprites/broom_reflection.png | Bin .../images}/sprites/dame/dame-buttons.png | Bin .../images}/sprites/dame/dame-events.png | Bin .../images}/sprites/dame/dame-gates.png | Bin .../images}/sprites/dame/dame-slime.png | Bin .../sprites/dame/dame-switch-pillar.png | Bin .../sprites/dame/dame-treasure-boxes.png | Bin .../images}/sprites/dame/dame_circusfolk.png | Bin .../images}/sprites/dame/dame_dog.png | Bin .../images}/sprites/dame/dame_frog.png | Bin .../images}/sprites/dame/dame_generic_npc.png | Bin .../sprites/dame/dame_jump_triggers.png | Bin .../images}/sprites/dame/dame_npc_mitra.png | Bin .../images}/sprites/dame/dame_npc_rock.png | Bin .../images}/sprites/dame/dame_npc_sage.png | Bin .../images}/sprites/dame/dame_npc_statue.png | Bin .../images}/sprites/dame/dame_person.png | Bin .../images}/sprites/dame/dame_red_pillars.png | Bin .../sprites/dame/dame_spike_rollers.png | Bin .../sprites/dame/dame_spring_triggers.png | Bin .../sprites/dame/dame_terminal_gate.png | Bin .../images}/sprites/dame/dame_trade_npc.png | Bin .../images}/sprites/dame/dameblackthing.png | Bin .../dame/doorsfordame-whitedungeon.png | Bin .../images}/sprites/decoration/BLANK_BG.png | Bin .../images}/sprites/decoration/SPACE_BG.png | Bin .../images}/sprites/decoration/TREE.png | Bin .../images}/sprites/decoration/briar_BG.png | Bin .../images}/sprites/decoration/eyelight.png | Bin .../images}/sprites/decoration/grass_1.png | Bin .../sprites/decoration/grass_REDSEA.png | Bin .../images}/sprites/decoration/nexus_bg.png | Bin .../sprites/decoration/nexus_cardgem.png | Bin .../decoration/nexus_door_preview_fade.png | Bin .../decoration/nexus_door_preview_overlay.png | Bin .../nexus_door_preview_placeholder.png | Bin .../decoration/overlay_APARTMENT_water.png | Bin .../decoration/overlay_FIELDS_grass.png | Bin .../decoration/overlay_REDCAVE_water.png | Bin .../sprites/decoration/overlay_REDSEA.png | Bin .../decoration/overlay_WINDMILL_water.png | Bin .../sprites/decoration/overlay_water.png | Bin .../decoration/overlays/apartment_overlay.png | Bin .../decoration/overlays/beach_overlay.png | Bin .../decoration/overlays/bedroom_overlay.png | Bin .../decoration/overlays/blue_overlay.png | Bin .../decoration/overlays/circus_overlay.png | Bin .../decoration/overlays/cliff_overlay.png | Bin .../decoration/overlays/crowd_overlay.png | Bin .../decoration/overlays/debug_overlay.png | Bin .../decoration/overlays/ending_overlay.png | Bin .../decoration/overlays/forest_overlay.png | Bin .../decoration/overlays/go_overlay - Copy.png | Bin .../decoration/overlays/go_overlay.png | Bin .../decoration/overlays/happy_blend.png | Bin .../decoration/overlays/happy_overlay.png | Bin .../decoration/overlays/hotel_overlay.png | Bin .../overlays/hotel_roof_overlay.png | Bin .../decoration/overlays/nexus_overlay.png | Bin .../decoration/overlays/redcave_overlay .png | Bin .../decoration/overlays/redsea_overlay.png | Bin .../decoration/overlays/space_overlay.png | Bin .../decoration/overlays/street_overlay.png | Bin .../decoration/overlays/suburbs_overlay.png | Bin .../overlays/suburbs_overlay_dark.png | Bin .../decoration/overlays/terminal_overlay.png | Bin .../decoration/overlays/windmill_overlay.png | Bin .../decoration/overlays/windmill_overlay2.png | Bin .../images}/sprites/decoration/palmtree.xcf | Bin .../images}/sprites/decoration/pixelation.png | Bin .../decoration/player_overlay_foot_test.png | Bin .../images}/sprites/decoration/rail.png | Bin .../images}/sprites/decoration/rail_CROWD.png | Bin .../images}/sprites/decoration/rail_NEXUS.png | Bin .../sprites/decoration/red_cave_left.png | Bin .../sprites/decoration/scanlineoverlay.png | Bin .../sprites/decoration/scanlineoverlay.xcf | Bin .../decoration/shadows/28x10_shadow.png | Bin .../sprites/decoration/shadows/8x8_shadow.png | Bin .../images}/sprites/decoration/whirlpool.png | Bin .../sprites/decoration/whiteportal.png | Bin .../images}/sprites/ending/cast.png | Bin .../images}/sprites/ending/cast.xcf | Bin .../images}/sprites/ending/go.png | Bin .../images}/sprites/ending/screenies.png | Bin .../images}/sprites/enemies/annoyer.png | Bin .../sprites/enemies/apartment/dash_trap.png | Bin .../sprites/enemies/apartment/gas_guy.png | Bin .../enemies/apartment/gas_guy_cloud.png | Bin .../images}/sprites/enemies/apartment/rat.png | Bin .../sprites/enemies/apartment/silverfish.png | Bin .../sprites/enemies/apartment/splitboss.png | Bin .../enemies/apartment/splitboss_fireball.png | Bin .../enemies/apartment/splitboss_old.png | Bin .../enemies/apartment/teleport_guy.png | Bin .../sprites/enemies/bedroom/slime_goo.png | Bin .../images}/sprites/enemies/circus/arthur.png | Bin .../sprites/enemies/circus/arthur_javiera.png | Bin .../sprites/enemies/circus/contort_big.png | Bin .../sprites/enemies/circus/contort_small.png | Bin .../sprites/enemies/circus/fire_pillar.png | Bin .../enemies/circus/fire_pillar_base.png | Bin .../sprites/enemies/circus/javiera.png | Bin .../sprites/enemies/circus/javiera_juggle.png | Bin .../images}/sprites/enemies/circus/lion.png | Bin .../sprites/enemies/circus/lion_fireballs.png | Bin .../sprites/enemies/circus/shockwave.png | Bin .../images}/sprites/enemies/crowd/dog.png | Bin .../sprites/enemies/crowd/f_rotator.png | Bin .../sprites/enemies/crowd/f_rotator_ball.png | Bin .../sprites/enemies/crowd/f_wallboss_face.png | Bin .../enemies/crowd/f_wallboss_face_old.png | Bin .../enemies/crowd/f_wallboss_l_hand.png | Bin .../enemies/crowd/f_wallboss_l_hand_old.png | Bin .../images}/sprites/enemies/crowd/frog.png | Bin .../sprites/enemies/crowd/frog_bullet.png | Bin .../images}/sprites/enemies/crowd/person.png | Bin .../sprites/enemies/crowd/spike_roller.png | Bin .../enemies/crowd/spike_roller_horizontal.png | Bin .../crowd/spike_roller_horizontal_shadow.png | Bin .../enemies/crowd/spike_roller_shadow.png | Bin .../sprites/enemies/crowd/wallboss_bullet.png | Bin .../sprites/enemies/crowd/wallboss_laser.png | Bin .../sprites/enemies/crowd/wallboss_wall.png | Bin .../sprites/enemies/enemy_explode_2.png | Bin .../sprites/enemies/etc/briar_arm_left.png | Bin .../sprites/enemies/etc/briar_arm_right.png | Bin .../sprites/enemies/etc/briar_blue_thorn.png | Bin .../enemies/etc/briar_blue_thorn_old.png | Bin .../sprites/enemies/etc/briar_body.png | Bin .../sprites/enemies/etc/briar_core.png | Bin .../enemies/etc/briar_dust_explosion.png | Bin .../sprites/enemies/etc/briar_fire_eye.png | Bin .../enemies/etc/briar_ground_thorn.png | Bin .../sprites/enemies/etc/briar_happy_thorn.png | Bin .../sprites/enemies/etc/briar_ice_crystal.png | Bin .../enemies/etc/briar_ice_explosion.png | Bin .../sprites/enemies/etc/briar_mist.png | Bin .../sprites/enemies/etc/briar_overhang.png | Bin .../enemies/etc/briar_thorn_bullet.png | Bin .../images}/sprites/enemies/etc/chaser.png | Bin .../sprites/enemies/etc/sage_attacks.png | Bin .../images}/sprites/enemies/etc/sage_boss.png | Bin .../enemies/etc/sage_fight_long_dust.png | Bin .../sprites/enemies/etc/space_face.png | Bin .../sprites/enemies/etc/space_face_eyes.png | Bin .../images}/sprites/enemies/four_shooter.png | Bin .../sprites/enemies/hotel/burst_plant.png | Bin .../enemies/hotel/burst_plant_bullet.png | Bin .../sprites/enemies/hotel/dustmaid.png | Bin .../sprites/enemies/hotel/eye_boss_bullet.png | Bin .../sprites/enemies/hotel/eye_boss_splash.png | Bin .../sprites/enemies/hotel/eye_boss_water.png | Bin .../images}/sprites/enemies/hotel/steam.png | Bin .../sprites/enemies/hotel/steam_pipe.png | Bin .../images}/sprites/enemies/light_orb.png | Bin .../images}/sprites/enemies/mover.png | Bin .../enemies/old_sprites/enemy_explode_1.png | Bin .../enemies/old_sprites/old_annoyer.png | Bin .../enemies/old_sprites/old_shieldy.png | Bin .../sprites/enemies/old_sprites/old_slime.png | Bin .../enemies/old_sprites/red_boss_old.png | Bin .../enemies/old_sprites/redwalker_old.png | Bin .../sprites/enemies/old_sprites/slime_old.png | Bin .../enemies/old_sprites/sun_guy_old.png | Bin .../enemies/old_sprites/sun_guy_wave_old.png | Bin .../enemies/old_sprites/wall_laser.png | Bin .../enemies/old_sprites/wall_laser_laser.png | Bin .../images}/sprites/enemies/on_off_laser.png | Bin .../images}/sprites/enemies/pew_laser.png | Bin .../sprites/enemies/pew_laser_bullet.png | Bin .../images}/sprites/enemies/red_boss.png | Bin .../enemies/redcave/f_four_shooter.png | Bin .../enemies/redcave/f_four_shooter_bullet.png | Bin .../sprites/enemies/redcave/f_mover.png | Bin .../sprites/enemies/redcave/f_mover2.png | Bin .../sprites/enemies/redcave/f_mover_old.png | Bin .../sprites/enemies/redcave/f_on_off_h.png | Bin .../sprites/enemies/redcave/f_on_off_v.png | Bin .../sprites/enemies/redcave/f_slasher.png | Bin .../sprites/enemies/redcave/f_slasher2.png | Bin .../enemies/redcave/f_slasher_long.png | Bin .../sprites/enemies/redcave/f_slasher_old.png | Bin .../enemies/redcave/f_slasher_wide.png | Bin .../enemies/redcave/on_off_shooter.png | Bin .../enemies/redcave/red_boss_big_wave.png | Bin .../enemies/redcave/red_boss_bullet.png | Bin .../enemies/redcave/red_boss_ripple.png | Bin .../enemies/redcave/red_boss_small_wave.png | Bin .../enemies/redcave/red_boss_tentacle.png | Bin .../enemies/redcave/red_boss_warning.png | Bin .../sprites/enemies/redcave/red_pillar.png | Bin .../enemies/redcave/red_pillar_old.png | Bin .../enemies/redcave/red_pillar_ripple.png | Bin .../images}/sprites/enemies/redwalker.png | Bin .../images}/sprites/enemies/shieldy.png | Bin .../images}/sprites/enemies/slasher.png | Bin .../images}/sprites/enemies/slime.png | Bin .../images}/sprites/enemies/slime_bullet.png | Bin .../sprites/enemies/suburb/suburb_killer.png | Bin .../sprites/enemies/suburb/suburb_walker.png | Bin .../images}/sprites/enemies/sun_guy.png | Bin .../images}/sprites/enemies/sun_guy_wave.png | Bin .../images}/sprites/enemies/twowalker.png | Bin .../images}/sprites/gadgets/big_door.png | Bin .../images}/sprites/gadgets/big_keys.png | Bin .../images}/sprites/gadgets/biofilm.png | Bin .../images}/sprites/gadgets/buttons.png | Bin .../sprites/gadgets/challenge_gate.png | Bin .../images}/sprites/gadgets/checkpoint.png | Bin .../images}/sprites/gadgets/console.png | Bin .../images}/sprites/gadgets/crackedtiles.png | Bin .../images}/sprites/gadgets/dash_pads.png | Bin .../images}/sprites/gadgets/doors.png | Bin .../images}/sprites/gadgets/dust.png | Bin .../images}/sprites/gadgets/elevator.png | Bin .../images}/sprites/gadgets/gate_green.png | Bin .../images}/sprites/gadgets/gates.png | Bin .../images}/sprites/gadgets/growth_gate.png | Bin .../images}/sprites/gadgets/hole.png | Bin .../images}/sprites/gadgets/key.png | Bin .../images}/sprites/gadgets/key_green.png | Bin .../images}/sprites/gadgets/key_sparkle.png | Bin .../images}/sprites/gadgets/keyhole.png | Bin .../sprites/gadgets/moving_platform.png | Bin .../sprites/gadgets/moving_platform_poof.png | Bin .../images}/sprites/gadgets/nexus_door.png | Bin .../images}/sprites/gadgets/nexus_pad.png | Bin .../images}/sprites/gadgets/pillar_switch.png | Bin .../images}/sprites/gadgets/propelled.png | Bin .../images}/sprites/gadgets/pushyblocks.png | Bin .../images}/sprites/gadgets/sludge.png | Bin .../images}/sprites/gadgets/solid_tile.png | Bin .../images}/sprites/gadgets/spring_pad.png | Bin .../images}/sprites/gadgets/stop_marker.png | Bin .../images}/sprites/gadgets/treasureboxes.png | Bin .../sprites/gadgets/whirlpool_door.png | Bin .../sprites/gadgets/windmill_blade.png | Bin .../sprites/gadgets/windmill_inside.png | Bin .../sprites/gadgets/windmill_shell.png | Bin .../sprites/inventory/big_health_pickup.png | Bin .../images}/sprites/inventory/broom-icon.png | Bin .../images}/sprites/inventory/broom.png | Bin .../images}/sprites/inventory/broom_old.png | Bin .../sprites/inventory/checkpoint_save_box.png | Bin .../images}/sprites/inventory/controls.png | Bin .../images}/sprites/inventory/dohickies.png | Bin .../images}/sprites/inventory/header.png | Bin .../images}/sprites/inventory/header.xcf | Bin .../images}/sprites/inventory/header_old.png | Bin .../sprites/inventory/health_piece.png | Bin .../images}/sprites/inventory/inventory.png | Bin .../sprites/inventory/item_jump_shoes.png | Bin .../sprites/inventory/item_long_attack.png | Bin .../images}/sprites/inventory/item_none.png | Bin .../sprites/inventory/item_tranformer.png | Bin .../sprites/inventory/item_wide_attack.png | Bin .../images}/sprites/inventory/keyitems.png | Bin .../images}/sprites/inventory/knife.png | Bin .../images}/sprites/inventory/life_cicada.png | Bin .../sprites/inventory/long_attack_h.png | Bin .../sprites/inventory/long_attack_v.png | Bin .../images}/sprites/inventory/selector.png | Bin .../sprites/inventory/settings-selector.png | Bin .../images}/sprites/inventory/settings.png | Bin .../sprites/inventory/small_health_pickup.png | Bin .../sprites/inventory/wide_attack_h.png | Bin .../sprites/inventory/wide_attack_v.png | Bin .../res => assets/images}/sprites/jplayer.png | Bin .../images}/sprites/jplayer_cell.png | Bin .../images}/sprites/jplayer_reflection.png | Bin .../images}/sprites/light/5-frame-glow.png | Bin .../sprites/light/beach-screen-light.png | Bin .../images}/sprites/light/cone-light.png | Bin .../images}/sprites/light/glow-light.png | Bin .../images}/sprites/map_even.png | Bin .../images}/sprites/menu/arrow.png | Bin .../images}/sprites/menu/arrows.png | Bin .../images}/sprites/menu/autosave_icon.png | Bin .../images}/sprites/menu/card_1.png | Bin .../images}/sprites/menu/card_empty.png | Bin .../images}/sprites/menu/card_sheet.png | Bin .../sprites/menu/cards_page example.png | Bin .../sprites/menu/dialogue_blinky_box.png | Bin .../images}/sprites/menu/dialogue_box.png | Bin .../images}/sprites/menu/equipped_icon.png | Bin .../images}/sprites/menu/long_icon.png | Bin .../images}/sprites/menu/m_mobile_c.png | Bin .../images}/sprites/menu/m_mobile_circle.png | Bin .../images}/sprites/menu/m_mobile_down.png | Bin .../images}/sprites/menu/m_mobile_left.png | Bin .../images}/sprites/menu/m_mobile_pause.png | Bin .../images}/sprites/menu/m_mobile_right.png | Bin .../images}/sprites/menu/m_mobile_up.png | Bin .../images}/sprites/menu/m_mobile_x.png | Bin .../images}/sprites/menu/menu_bg.png | Bin .../sprites/menu/menu_select_active.png | Bin .../sprites/menu/menu_select_inactive.png | Bin .../images}/sprites/menu/menudialogue_box.png | Bin .../images}/sprites/menu/none_icon.png | Bin .../images}/sprites/menu/secret_trophies.png | Bin .../images}/sprites/menu/transformer_icon.png | Bin .../images}/sprites/menu/volume_bar.png | Bin .../images}/sprites/menu/wide_icon.png | Bin .../images}/sprites/mobile/button_c.png | Bin .../images}/sprites/mobile/button_dpad.png | Bin .../images}/sprites/mobile/button_menu.png | Bin .../images}/sprites/mobile/button_x.png | Bin .../images}/sprites/mobile/dpad.png | Bin .../images}/sprites/mobile/mobile_bg.png | Bin .../sprites/mobile/screenedge_left.png | Bin .../sprites/mobile/screenedge_right.png | Bin .../images}/sprites/mobile/thumb.png | Bin .../images}/sprites/npcs/beach_npcs.png | Bin .../images}/sprites/npcs/big_statue.png | Bin .../images}/sprites/npcs/bike.png | Bin .../images}/sprites/npcs/biofilm.png | Bin .../images}/sprites/npcs/blue_npcs.png | Bin .../images}/sprites/npcs/briar.png | Bin .../images}/sprites/npcs/cell_bodies.png | Bin .../images}/sprites/npcs/cliffs_npcs.png | Bin .../images}/sprites/npcs/cube_kings.png | Bin .../images}/sprites/npcs/cube_kings_old.png | Bin .../images}/sprites/npcs/easter/dev_npcs.png | Bin .../images}/sprites/npcs/easter/randoms.png | Bin .../images}/sprites/npcs/easter/smoke_red.png | Bin .../images}/sprites/npcs/fields_npcs.png | Bin .../images}/sprites/npcs/fisherman.png | Bin .../images}/sprites/npcs/follower_bro.png | Bin .../images}/sprites/npcs/forest_npcs.png | Bin .../images}/sprites/npcs/forest_stag.png | Bin .../images}/sprites/npcs/geoms.png | Bin .../images}/sprites/npcs/hamster_wheel.png | Bin .../images}/sprites/npcs/happy_npcs.png | Bin .../images}/sprites/npcs/hotel_npcs.png | Bin .../images}/sprites/npcs/mitra.png | Bin .../images}/sprites/npcs/mitra_bike.png | Bin .../images}/sprites/npcs/note_rock.png | Bin .../images}/sprites/npcs/npc.png | Bin .../images}/sprites/npcs/redsea_npcs.png | Bin .../images}/sprites/npcs/sadman.png | Bin .../images}/sprites/npcs/sage.png | Bin .../images}/sprites/npcs/sage_statue.png | Bin .../images}/sprites/npcs/shadow_briar.png | Bin .../images}/sprites/npcs/snowman.png | Bin .../images}/sprites/npcs/space_npcs.png | Bin .../images}/sprites/npcs/suburb_killers.png | Bin .../images}/sprites/npcs/suburb_walkers.png | Bin .../images}/sprites/npcs/trade_npcs.png | Bin .../sprites/player_mobile_indicator.png | Bin .../images}/sprites/redboss_alternate.png | Bin .../images}/sprites/screen_config.png | Bin .../images}/sprites/young_player.png | Bin .../images}/sprites/young_player_cell.png | Bin .../sprites/young_player_reflection.png | Bin .../images}/tilemaps/apartment_tilemap.png | Bin .../images}/tilemaps/beach_tilemap.png | Bin .../images}/tilemaps/beach_tilemap_old.png | Bin intra/{src/res => assets/images}/tilemaps/bed | Bin .../images}/tilemaps/bedroom_tilemap.png | Bin .../images}/tilemaps/blackwhite_tilemap.png | Bin .../images}/tilemaps/blank_tiles.png | Bin .../images}/tilemaps/blue_tilemap.png | Bin .../images}/tilemaps/cell_tilemap.png | Bin .../images}/tilemaps/cell_tilemap_old.png | Bin .../images}/tilemaps/circus_tilemap.png | Bin .../images}/tilemaps/cliff_tilemap.png | Bin .../images}/tilemaps/cliff_tilemap_old.png | Bin .../images}/tilemaps/crowd_tilemap.png | Bin .../images}/tilemaps/crowd_tilemap_old.png | Bin .../images}/tilemaps/crowd_tilemap_old2.png | Bin .../images}/tilemaps/fields_tilemap.png | Bin .../images}/tilemaps/fields_tilemap_old.png | Bin .../images}/tilemaps/fields_tilemap_old2.png | Bin .../images}/tilemaps/fields_tilemap_old3.png | Bin .../images}/tilemaps/forest_tilemap.png | Bin .../images}/tilemaps/go_tilemap.png | Bin .../images}/tilemaps/happy_tilemap.png | Bin .../images}/tilemaps/hotel_tilemap.png | Bin .../images}/tilemaps/mini_minimap_tiles.png | Bin .../images}/tilemaps/minimap_tiles.png | Bin .../images}/tilemaps/mockup_tiles.png | Bin .../images}/tilemaps/nexus_tilemap.png | Bin .../images}/tilemaps/nexus_tilemap_old.png | Bin .../images}/tilemaps/old/blank_tiles_old.png | Bin .../tilemaps/old/old_beach_tilemap.png | Bin .../tilemaps/old/old_bedroom_tilemap.png | Bin .../tilemaps/old/overworld_tilemap.png | Bin .../tilemaps/old/overworld_tilemap_old.png | Bin .../tilemaps/old/street_tilemap_old.png | Bin .../images}/tilemaps/overworld_tilemap.png | Bin .../tilemaps/overworld_tilemap.png.bak | Bin .../tilemaps/overworld_tilemap_dark.png | Bin .../tilemaps/overworld_tilemap_old.png | Bin .../images}/tilemaps/redcave_tiles.png | Bin .../images}/tilemaps/redsea_tiles.png | Bin .../images}/tilemaps/space_tilemap.png | Bin .../images}/tilemaps/street_tilemap.png | Bin .../images}/tilemaps/suburb_tilemap.png | Bin .../images}/tilemaps/terminal_tilemap.png | Bin .../images}/tilemaps/train_tiles.png | Bin .../images}/tilemaps/windmill_tilemap.png | Bin .../{src/res => assets/images}/title/door.png | Bin .../res => assets/images}/title/door_glow.png | Bin .../images}/title/door_spinglow1.png | Bin .../images}/title/door_spinglow2.png | Bin .../images}/title/intraisloading.png | Bin .../images}/title/press_enter.png | Bin .../res => assets/images}/title/selector.png | Bin .../res => assets/images}/title/title_bg.png | Bin .../images}/title/title_overlay1.png | Bin .../images}/title/title_overlay2.png | Bin .../images}/title/title_text.png | Bin .../images}/title/title_text_white.png | Bin .../images}/title/titlepicture.png | Bin .../images}/title/titlepicture.xcf | Bin .../assets/music}/OLD/gladys-esque.mp3 | Bin .../assets/music}/OLD/old-bedroom.mp3 | Bin {mp3 => intra/assets/music}/OLD/old-boss.mp3 | Bin .../assets/music}/OLD/old-terminal.mp3 | Bin .../assets/music}/OLD/old-white-palace.mp3 | Bin {mp3 => intra/assets/music}/OLD/old_happy.mp3 | Bin .../assets/music}/OLD/older-terminal.mp3 | Bin .../assets/music}/OLD/older-white-palace.mp3 | Bin .../assets/music}/anodyne_TRAILER_1.mp3 | Bin .../assets/music}/apartment-boss.mp3 | Bin {mp3 => intra/assets/music}/apartment.mp3 | Bin {mp3 => intra/assets/music}/beach.mp3 | Bin {mp3 => intra/assets/music}/bedroom-boss.mp3 | Bin {mp3 => intra/assets/music}/bedroom.mp3 | Bin {mp3 => intra/assets/music}/blank.mp3 | Bin {mp3 => intra/assets/music}/blue.mp3 | Bin {mp3 => intra/assets/music}/boss.mp3 | Bin {mp3 => intra/assets/music}/briar-fight.mp3 | Bin {mp3 => intra/assets/music}/cell.mp3 | Bin {mp3 => intra/assets/music}/circus-boss.mp3 | Bin {mp3 => intra/assets/music}/circus.mp3 | Bin {mp3 => intra/assets/music}/cliff.mp3 | Bin {mp3 => intra/assets/music}/crowd.mp3 | Bin {mp3 => intra/assets/music}/crowd_boss.mp3 | Bin {mp3 => intra/assets/music}/ending.mp3 | Bin {mp3 => intra/assets/music}/fields.mp3 | Bin {mp3 => intra/assets/music}/forest.mp3 | Bin {mp3 => intra/assets/music}/gameover.mp3 | Bin {mp3 => intra/assets/music}/go.mp3 | Bin {mp3 => intra/assets/music}/happy-init.mp3 | Bin {mp3 => intra/assets/music}/happy.mp3 | Bin {mp3 => intra/assets/music}/hotel-boss.mp3 | Bin {mp3 => intra/assets/music}/hotel.mp3 | Bin {mp3 => intra/assets/music}/mitra.mp3 | Bin {mp3 => intra/assets/music}/nexus.mp3 | Bin {mp3 => intra/assets/music}/overworld.mp3 | Bin {mp3 => intra/assets/music}/pre_terminal.mp3 | Bin {mp3 => intra/assets/music}/red_cave.mp3 | Bin {mp3 => intra/assets/music}/red_sea.mp3 | Bin {mp3 => intra/assets/music}/redcave-boss.mp3 | Bin {mp3 => intra/assets/music}/roof.mp3 | Bin {mp3 => intra/assets/music}/sacrificial.mp3 | Bin {mp3 => intra/assets/music}/sagefight.mp3 | Bin {mp3 => intra/assets/music}/soft.mp3 | Bin {mp3 => intra/assets/music}/space.mp3 | Bin {mp3 => intra/assets/music}/street.mp3 | Bin {mp3 => intra/assets/music}/suburb.mp3 | Bin {mp3 => intra/assets/music}/terminal.mp3 | Bin {mp3 => intra/assets/music}/title.mp3 | Bin {mp3 => intra/assets/music}/windmill.mp3 | Bin {sfx => intra/assets/sounds}/4sht_pop.mp3 | Bin {sfx => intra/assets/sounds}/4sht_shoot.mp3 | Bin .../assets/sounds}/big_door_locked.mp3 | Bin {sfx => intra/assets/sounds}/big_wave.mp3 | Bin {sfx => intra/assets/sounds}/briar_shine.mp3 | Bin {sfx => intra/assets/sounds}/broom_hit.mp3 | Bin {sfx => intra/assets/sounds}/bubble_1.mp3 | Bin {sfx => intra/assets/sounds}/bubble_2.mp3 | Bin {sfx => intra/assets/sounds}/bubble_3.mp3 | Bin {sfx => intra/assets/sounds}/bubble_loop.mp3 | Bin .../assets/sounds}/bubble_triple.mp3 | Bin {sfx => intra/assets/sounds}/button_down.mp3 | Bin {sfx => intra/assets/sounds}/button_up.mp3 | Bin {sfx => intra/assets/sounds}/cicada_chirp.mp3 | Bin {sfx => intra/assets/sounds}/cross2.mp3 | Bin {sfx => intra/assets/sounds}/cross3.mp3 | Bin {sfx => intra/assets/sounds}/cross4.mp3 | Bin {sfx => intra/assets/sounds}/dash_pad_1.mp3 | Bin {sfx => intra/assets/sounds}/dash_pad_2.mp3 | Bin .../assets/sounds}/dialogue_blip.mp3 | Bin .../assets/sounds}/dialogue_bloop.mp3 | Bin {sfx => intra/assets/sounds}/dog_bark.mp3 | Bin {sfx => intra/assets/sounds}/dog_dash.mp3 | Bin {sfx => intra/assets/sounds}/dust_explode.mp3 | Bin .../assets/sounds}/dustmaid_alert.mp3 | Bin {sfx => intra/assets/sounds}/dustpoof.mp3 | Bin .../assets/sounds}/elevator_close.mp3 | Bin .../assets/sounds}/elevator_open.mp3 | Bin {sfx => intra/assets/sounds}/enter_Door.mp3 | Bin {sfx => intra/assets/sounds}/fall_1.mp3 | Bin {sfx => intra/assets/sounds}/fall_in_hole.mp3 | Bin {sfx => intra/assets/sounds}/fireball.mp3 | Bin {sfx => intra/assets/sounds}/flame_pillar.mp3 | Bin {sfx => intra/assets/sounds}/floor_crack.mp3 | Bin {sfx => intra/assets/sounds}/gasguy_move.mp3 | Bin {sfx => intra/assets/sounds}/gasguy_shoot.mp3 | Bin .../assets/sounds}/get_small_health.mp3 | Bin {sfx => intra/assets/sounds}/gettreasure.mp3 | Bin {sfx => intra/assets/sounds}/hit_ground_1.mp3 | Bin {sfx => intra/assets/sounds}/hit_slime.mp3 | Bin {sfx => intra/assets/sounds}/hit_wall.mp3 | Bin {sfx => intra/assets/sounds}/keyget.mp3 | Bin .../assets/sounds}/ladder_step_1.mp3 | Bin .../assets/sounds}/ladder_step_2.mp3 | Bin {sfx => intra/assets/sounds}/laser-pew.mp3 | Bin {sfx => intra/assets/sounds}/laser_charge.mp3 | Bin {sfx => intra/assets/sounds}/laser_fire.mp3 | Bin {sfx => intra/assets/sounds}/menu_move.mp3 | Bin {sfx => intra/assets/sounds}/menu_select.mp3 | Bin {sfx => intra/assets/sounds}/mover_die.mp3 | Bin {sfx => intra/assets/sounds}/mover_move.mp3 | Bin {sfx => intra/assets/sounds}/noise_step_1.mp3 | Bin .../assets/sounds}/on_off_laser_shoot.mp3 | Bin {sfx => intra/assets/sounds}/open.mp3 | Bin {sfx => intra/assets/sounds}/pause_sound.mp3 | Bin {sfx => intra/assets/sounds}/player_hit_1.mp3 | Bin .../assets/sounds}/player_jump_down.mp3 | Bin .../assets/sounds}/player_jump_up.mp3 | Bin {sfx => intra/assets/sounds}/puddle_down.mp3 | Bin {sfx => intra/assets/sounds}/puddle_step.mp3 | Bin {sfx => intra/assets/sounds}/puddle_up.mp3 | Bin {sfx => intra/assets/sounds}/pushblock.mp3 | Bin {sfx => intra/assets/sounds}/rain.mp3 | Bin {sfx => intra/assets/sounds}/rat_move.mp3 | Bin .../assets/sounds}/red_cave_rise.mp3 | Bin .../assets/sounds}/redboss_death.mp3 | Bin {sfx => intra/assets/sounds}/redboss_moan.mp3 | Bin .../assets/sounds}/sb_ball_appear.mp3 | Bin {sfx => intra/assets/sounds}/sb_dash.mp3 | Bin {sfx => intra/assets/sounds}/sb_hurt.mp3 | Bin {sfx => intra/assets/sounds}/sb_split.mp3 | Bin {sfx => intra/assets/sounds}/sf_move.mp3 | Bin {sfx => intra/assets/sounds}/shieldy-hit.mp3 | Bin .../assets/sounds}/shieldy_ineffective.mp3 | Bin {sfx => intra/assets/sounds}/slasher_atk.mp3 | Bin {sfx => intra/assets/sounds}/slime_shoot.mp3 | Bin {sfx => intra/assets/sounds}/slime_splash.mp3 | Bin {sfx => intra/assets/sounds}/slime_walk.mp3 | Bin {sfx => intra/assets/sounds}/small_wave.mp3 | Bin {sfx => intra/assets/sounds}/space.mp3 | Bin {sfx => intra/assets/sounds}/sparkle_1.mp3 | Bin {sfx => intra/assets/sounds}/sparkle_2.mp3 | Bin {sfx => intra/assets/sounds}/sparkle_3.mp3 | Bin .../assets/sounds}/spring_bounce.mp3 | Bin {sfx => intra/assets/sounds}/stream.mp3 | Bin .../assets/sounds}/sun_guy_charge.mp3 | Bin .../assets/sounds}/sun_guy_death_long.mp3 | Bin .../assets/sounds}/sun_guy_death_short.mp3 | Bin .../assets/sounds}/sun_guy_scream.mp3 | Bin .../assets/sounds}/sun_guy_scream2.mp3 | Bin .../assets/sounds}/swing_broom_1.mp3 | Bin .../assets/sounds}/swing_broom_2.mp3 | Bin .../assets/sounds}/swing_broom_3.mp3 | Bin {sfx => intra/assets/sounds}/talk_1.mp3 | Bin {sfx => intra/assets/sounds}/talk_2.mp3 | Bin {sfx => intra/assets/sounds}/talk_3.mp3 | Bin {sfx => intra/assets/sounds}/talk_death.mp3 | Bin {sfx => intra/assets/sounds}/teleguy_down.mp3 | Bin {sfx => intra/assets/sounds}/teleguy_up.mp3 | Bin .../assets/sounds}/teleport_down.mp3 | Bin {sfx => intra/assets/sounds}/teleport_up.mp3 | Bin {sfx => intra/assets/sounds}/unlock.mp3 | Bin {sfx => intra/assets/sounds}/water_step.mp3 | Bin {sfx => intra/assets/sounds}/wavesandwind.mp3 | Bin .../assets/sounds}/wb_hit_ground.mp3 | Bin {sfx => intra/assets/sounds}/wb_moan.mp3 | Bin {sfx => intra/assets/sounds}/wb_moan_2.mp3 | Bin {sfx => intra/assets/sounds}/wb_shoot.mp3 | Bin .../assets/sounds}/wb_tap_ground.mp3 | Bin intra/{bin => }/icons/1024.jpg | Bin intra/{bin => }/icons/1024.png | Bin intra/{bin => }/icons/114.png | Bin intra/{bin => }/icons/144.png | Bin intra/{bin => }/icons/22_29.png | Bin intra/{bin => }/icons/320.png | Bin intra/{bin => }/icons/44_58.png | Bin intra/{bin => }/icons/58.png | Bin intra/{bin => }/icons/64.png | Bin intra/{bin => }/icons/640.png | Bin intra/{bin => }/icons/72.png | Bin intra/{bin => }/icons/96.png | Bin intra/{bin => }/icons/IntraAIR128.png | Bin intra/{bin => }/icons/IntraAIR29.png | Bin intra/{bin => }/icons/IntraAIR32.png | Bin intra/{bin => }/icons/IntraAIR48.png | Bin intra/{bin => }/icons/IntraAIR512.png | Bin intra/{bin => }/icons/IntraAIR57.png | Bin intra/{bin => }/icons/ouya_icon.png | Bin intra/source/Intra.hx | 1792 ++++++++ intra/source/Main.hx | 205 + intra/source/Preloader.hx | 21 + intra/source/Save.hx | 430 ++ intra/source/awerwer/com.zip | Bin 0 -> 15264 bytes .../awerwer/com/FRESteamWorksLibLinux.swc | Bin 0 -> 7423 bytes intra/source/awerwer/com/FRESteamWorksTest.hx | 115 + .../steam/Assets/FRESteamWorkswin.hx | 170 + .../amanitadesign/steam/Assets/descriptor.xml | 20 + .../com/amanitadesign/steam/FRESteamWorks.hx | 333 ++ .../com/amanitadesign/steam/SteamConstants.hx | 21 + .../com/amanitadesign/steam/SteamEvent.hx | 55 + intra/source/buildmap.py | 256 ++ .../nativeextensions/MacJoystick.hx | 42 + .../nativeextensions/MacJoystickEvent.hx | 26 + .../nativeextensions/MacJoystickManager.hx | 76 + intra/source/com/FRESteamWorksLibLinux.swc | Bin 0 -> 7423 bytes intra/source/com/FRESteamWorksTest.hx | 115 + .../steam/Assets/FRESteamWorkswin.hx | 170 + .../amanitadesign/steam/Assets/descriptor.xml | 20 + .../com/amanitadesign/steam/FRESteamWorks.hx | 335 ++ .../com/amanitadesign/steam/SteamConstants.hx | 21 + .../com/amanitadesign/steam/SteamEvent.hx | 55 + .../amanitadesign/steam/old/FRESteamWorks.hx | 154 + .../amanitadesign/steam/old/SteamConstants.hx | 10 + .../com/amanitadesign/steam/old/SteamEvent.hx | 45 + intra/source/csv/APARTMENT_BG.csv | 80 + intra/source/csv/APARTMENT_BG2.csv | 90 + intra/source/csv/APARTMENT_FG.csv | 90 + intra/source/csv/BEACH_BG.csv | 70 + intra/source/csv/BEACH_BG2.csv | 50 + intra/source/csv/BEACH_FG.csv | 50 + intra/source/csv/BEDROOM_BG.csv | 50 + intra/source/csv/BEDROOM_BG2.csv | 50 + intra/source/csv/BEDROOM_FG.csv | 50 + intra/source/csv/BLANK_BG.csv | 80 + intra/source/csv/BLUE_BG.csv | 50 + intra/source/csv/BLUE_BG2.csv | 50 + intra/source/csv/BLUE_FG.csv | 10 + intra/source/csv/CIRCUS_BG.csv | 90 + intra/source/csv/CIRCUS_BG2.csv | 90 + intra/source/csv/CIRCUS_FG.csv | 90 + intra/source/csv/CLIFF_BG.csv | 80 + intra/source/csv/CLIFF_BG2.csv | 80 + intra/source/csv/CROWD_BG.csv | 80 + intra/source/csv/CROWD_BG2.csv | 80 + intra/source/csv/CROWD_FG.csv | 80 + intra/source/csv/DEBUG_BG.csv | 100 + intra/source/csv/DEBUG_BG2.csv | 30 + intra/source/csv/DEBUG_FG.csv | 30 + intra/source/csv/DRAWER_BG.csv | 110 + intra/source/csv/DRAWER_BG2.csv | 70 + intra/source/csv/DRAWER_FG.csv | 70 + intra/source/csv/FIELDS_BG.csv | 120 + intra/source/csv/FIELDS_BG2.csv | 100 + intra/source/csv/FIELDS_FG.csv | 120 + intra/source/csv/FOREST_BG.csv | 90 + intra/source/csv/FOREST_BG2.csv | 90 + intra/source/csv/FOREST_FG.csv | 90 + intra/source/csv/GO_BG.csv | 60 + intra/source/csv/GO_BG2.csv | 60 + intra/source/csv/GO_BG2_old.csv | 60 + intra/source/csv/GO_FG.csv | 60 + intra/source/csv/HAPPY_BG.csv | 30 + intra/source/csv/HAPPY_BG2.csv | 30 + intra/source/csv/HAPPY_FG.csv | 10 + intra/source/csv/HOTEL_BG.csv | 120 + intra/source/csv/HOTEL_BG2.csv | 120 + intra/source/csv/HOTEL_FG.csv | 120 + intra/source/csv/Minimap_Apartment.csv | 8 + intra/source/csv/Minimap_Beach.csv | 7 + intra/source/csv/Minimap_Bedroom.csv | 5 + intra/source/csv/Minimap_Cell.csv | 9 + intra/source/csv/Minimap_Circus.csv | 9 + intra/source/csv/Minimap_Cliff.csv | 8 + intra/source/csv/Minimap_Crowd.csv | 8 + intra/source/csv/Minimap_Fields.csv | 12 + intra/source/csv/Minimap_Forest.csv | 9 + intra/source/csv/Minimap_Hotel.csv | 12 + intra/source/csv/Minimap_Overworld.csv | 10 + intra/source/csv/Minimap_Redcave.csv | 7 + intra/source/csv/Minimap_Redsea.csv | 7 + intra/source/csv/Minimap_Space.csv | 8 + intra/source/csv/Minimap_Street.csv | 7 + intra/source/csv/Minimap_Suburb.csv | 8 + intra/source/csv/Minimap_Terminal.csv | 5 + intra/source/csv/NEXUS_BG.csv | 100 + intra/source/csv/NEXUS_BG2.csv | 100 + intra/source/csv/NEXUS_FG.csv | 100 + intra/source/csv/OVERWORLD_BG.csv | 100 + intra/source/csv/OVERWORLD_BG2.csv | 100 + intra/source/csv/OVERWORLD_FG.csv | 100 + intra/source/csv/REDCAVE_BG.csv | 100 + intra/source/csv/REDCAVE_BG2.csv | 100 + intra/source/csv/REDCAVE_FG.csv | 70 + intra/source/csv/REDSEA_BG.csv | 70 + intra/source/csv/REDSEA_BG2.csv | 40 + intra/source/csv/REDSEA_FG.csv | 70 + intra/source/csv/SPACE_BG.csv | 80 + intra/source/csv/SPACE_BG2.csv | 80 + intra/source/csv/SPACE_FG.csv | 80 + intra/source/csv/STREET_BG.csv | 70 + intra/source/csv/STREET_BG2.csv | 70 + intra/source/csv/STREET_FG.csv | 70 + intra/source/csv/SUBURB_BG.csv | 80 + intra/source/csv/SUBURB_BG2.csv | 10 + intra/source/csv/SUBURB_FG.csv | 10 + intra/source/csv/TERMINAL_BG.csv | 50 + intra/source/csv/TERMINAL_BG2.csv | 50 + intra/source/csv/TERMINAL_FG.csv | 30 + intra/source/csv/TRAIN_BG.csv | 90 + intra/source/csv/TRAIN_BG2.csv | 80 + intra/source/csv/TRAIN_FG.csv | 80 + intra/source/csv/WINDMILL_BG.csv | 80 + intra/source/csv/WINDMILL_BG2.csv | 80 + intra/source/csv/WINDMILL_FG.csv | 30 + intra/source/data/CLASS_ID.hx | 81 + intra/source/data/CSV_Data.hx | 319 ++ intra/source/data/Common_Sprites.hx | 66 + intra/source/data/NPC_Data_EN.hx | 3948 ++++++++++++++++ intra/source/data/NPC_Data_ES.hx | 3948 ++++++++++++++++ intra/source/data/NPC_Data_IT.hx | 3948 ++++++++++++++++ intra/source/data/NPC_Data_JP.hx | 3948 ++++++++++++++++ intra/source/data/NPC_Data_KR.hx | 3947 ++++++++++++++++ intra/source/data/NPC_Data_PT.hx | 3952 +++++++++++++++++ intra/source/data/NPC_Data_ZHS.hx | 3949 ++++++++++++++++ intra/source/data/SoundData.hx | 849 ++++ intra/source/data/TileData.hx | 1240 ++++++ intra/source/data/dialogue_EN.txt | 1778 ++++++++ intra/source/data/dialogue_ES.txt | 2665 +++++++++++ intra/source/data/dialogue_IT.txt | 2667 +++++++++++ intra/source/data/dialogue_ZHS.txt | 2665 +++++++++++ intra/source/data/dialogue_jp.txt | 2396 ++++++++++ intra/source/data/dialogue_pt-br.txt | 2373 ++++++++++ intra/source/data/gen_npc.py | 147 + intra/source/data/kr/dialogue_kr.py | 2464 ++++++++++ intra/source/data/kr/make_kr_npc_data.bat | 4 + intra/source/data/make_npc_data.bat | 3 + intra/source/entity/decoration/Eye_Light.hx | 35 + intra/source/entity/decoration/Light.hx | 201 + intra/source/entity/decoration/Map_Preview.hx | 39 + intra/source/entity/decoration/Nonsolid.hx | 48 + intra/source/entity/decoration/RetroEffect.hx | 130 + .../source/entity/decoration/Solid_Sprite.hx | 179 + intra/source/entity/decoration/Water_Anim.hx | 199 + .../entity/enemy/apartment/Dash_Trap.hx | 286 ++ intra/source/entity/enemy/apartment/Gasguy.hx | 202 + intra/source/entity/enemy/apartment/Rat.hx | 213 + .../entity/enemy/apartment/Silverfish.hx | 282 ++ .../entity/enemy/apartment/Splitboss.hx | 653 +++ .../source/entity/enemy/apartment/Teleguy.hx | 211 + intra/source/entity/enemy/bedroom/Annoyer.hx | 324 ++ .../source/entity/enemy/bedroom/Pew_Laser.hx | 188 + intra/source/entity/enemy/bedroom/Shieldy.hx | 216 + intra/source/entity/enemy/bedroom/Slime.hx | 355 ++ intra/source/entity/enemy/bedroom/Sun_Guy.hx | 635 +++ .../entity/enemy/circus/Circus_Folks.hx | 1001 +++++ intra/source/entity/enemy/circus/Contort.hx | 295 ++ .../source/entity/enemy/circus/Fire_Pillar.hx | 125 + intra/source/entity/enemy/circus/Lion.hx | 541 +++ intra/source/entity/enemy/crowd/Dog.hx | 275 ++ intra/source/entity/enemy/crowd/Frog.hx | 309 ++ intra/source/entity/enemy/crowd/Person.hx | 173 + intra/source/entity/enemy/crowd/Rotator.hx | 79 + .../source/entity/enemy/crowd/Spike_Roller.hx | 284 ++ intra/source/entity/enemy/crowd/WallBoss.hx | 896 ++++ intra/source/entity/enemy/etc/Briar_Boss.hx | 1263 ++++++ intra/source/entity/enemy/etc/Chaser.hx | 193 + .../source/entity/enemy/etc/ControlsDeity.hx | 211 + intra/source/entity/enemy/etc/Follower_Bro.hx | 84 + intra/source/entity/enemy/etc/Red_Walker.hx | 63 + intra/source/entity/enemy/etc/Sadbro.hx | 74 + intra/source/entity/enemy/etc/Sage_Boss.hx | 879 ++++ intra/source/entity/enemy/etc/Space_Face.hx | 66 + intra/source/entity/enemy/etc/Wall_Laser.hx | 87 + .../source/entity/enemy/hotel/Burst_Plant.hx | 212 + intra/source/entity/enemy/hotel/Dustmaid.hx | 161 + intra/source/entity/enemy/hotel/Eye_Boss.hx | 751 ++++ intra/source/entity/enemy/hotel/Steam_Pipe.hx | 207 + .../entity/enemy/redcave/Four_Shooter.hx | 189 + intra/source/entity/enemy/redcave/Mover.hx | 121 + .../entity/enemy/redcave/On_Off_Laser.hx | 207 + intra/source/entity/enemy/redcave/Red_Boss.hx | 851 ++++ intra/source/entity/enemy/redcave/Slasher.hx | 448 ++ .../entity/enemy/suburb/Suburb_Killer.hx | 81 + .../entity/enemy/suburb/Suburb_Walker.hx | 301 ++ intra/source/entity/gadget/Big_Door.hx | 297 ++ intra/source/entity/gadget/Button.hx | 109 + intra/source/entity/gadget/Challenge_Gate.hx | 58 + intra/source/entity/gadget/Checkpoint.hx | 290 ++ intra/source/entity/gadget/Console.hx | 278 ++ intra/source/entity/gadget/CrackedTile.hx | 64 + intra/source/entity/gadget/Dash_Pad.hx | 84 + intra/source/entity/gadget/Door.hx | 736 +++ intra/source/entity/gadget/Dust.hx | 172 + intra/source/entity/gadget/Gate.hx | 211 + intra/source/entity/gadget/Go_Detector.hx | 112 + intra/source/entity/gadget/Growth_Gate.hx | 58 + intra/source/entity/gadget/Hole.hx | 53 + intra/source/entity/gadget/Jump_Trigger.hx | 134 + intra/source/entity/gadget/Key.hx | 56 + intra/source/entity/gadget/KeyBlock.hx | 429 ++ intra/source/entity/gadget/Pillar_Switch.hx | 81 + intra/source/entity/gadget/Propelled.hx | 306 ++ intra/source/entity/gadget/SinglePushBlock.hx | 152 + intra/source/entity/gadget/Stop_Marker.hx | 40 + intra/source/entity/gadget/Switch_Pillar.hx | 81 + intra/source/entity/gadget/Treasure.hx | 396 ++ .../source/entity/interactive/Black_Thing.hx | 198 + .../entity/interactive/Dungeon_Statue.hx | 88 + intra/source/entity/interactive/Elevator.hx | 223 + intra/source/entity/interactive/Fisherman.hx | 81 + .../entity/interactive/Health_Cicada.hx | 280 ++ intra/source/entity/interactive/NPC.hx | 1426 ++++++ intra/source/entity/interactive/Red_Pillar.hx | 145 + .../entity/interactive/Terminal_Gate.hx | 83 + .../entity/interactive/npc/Forest_NPC.hx | 150 + .../entity/interactive/npc/Happy_NPC.hx | 197 + .../interactive/npc/Huge_Fucking_Stag.hx | 32 + intra/source/entity/interactive/npc/Mitra.hx | 910 ++++ .../entity/interactive/npc/Redsea_NPC.hx | 110 + intra/source/entity/interactive/npc/Sage.hx | 770 ++++ .../entity/interactive/npc/Shadow_Briar.hx | 472 ++ .../entity/interactive/npc/Space_NPC.hx | 136 + .../entity/interactive/npc/Trade_NPC.hx | 809 ++++ intra/source/entity/player/Broom.hx | 337 ++ intra/source/entity/player/Foot_Overlay.hx | 266 ++ intra/source/entity/player/HealthBar.hx | 122 + intra/source/entity/player/HealthPickup.hx | 97 + intra/source/entity/player/Miniminimap.hx | 139 + intra/source/entity/player/Player.hx | 1630 +++++++ intra/source/entity/player/Transformer.hx | 245 + intra/source/extension/JoyQuery/Joystick.hx | 240 + intra/source/global/Keys.hx | 535 +++ intra/source/global/Registry.hx | 794 ++++ intra/source/helper/ANEFix.hx | 160 + intra/source/helper/Achievements.hx | 253 ++ intra/source/helper/Cutscene.hx | 467 ++ intra/source/helper/DH.hx | 629 +++ intra/source/helper/EventScripts.hx | 567 +++ intra/source/helper/Joypad_Config_Group.hx | 294 ++ intra/source/helper/Parabola_Thing.hx | 106 + intra/source/helper/S_NPC.hx | 126 + intra/source/helper/ScreenFade.hx | 173 + intra/source/helper/SpriteFactory.hx | 538 +++ intra/source/helper/SteamThing.hx | 16 + intra/source/helper/UI_Offsets.hx | 170 + intra/source/helper/invertRGB.pbj | Bin 0 -> 245 bytes intra/source/helper/static.pbj | Bin 0 -> 382 bytes intra/source/lua/Intra.lua | 93 + intra/source/lua/Intra_settings.lua | 7 + intra/source/lua/csvTilemap.lua | 45 + intra/source/lua/csvTilemap_settings.lua | 7 + intra/source/noairSave.hx | 322 ++ intra/source/org/flixel/AnoSprite.hx | 48 + intra/source/org/flixel/FlxBasic.hx | 153 + intra/source/org/flixel/FlxButton.hx | 355 ++ intra/source/org/flixel/FlxCamera.hx | 711 +++ intra/source/org/flixel/FlxEmitter.hx | 380 ++ intra/source/org/flixel/FlxG.hx | 1321 ++++++ intra/source/org/flixel/FlxGame.hx | 825 ++++ intra/source/org/flixel/FlxGroup.hx | 639 +++ intra/source/org/flixel/FlxObject.hx | 1182 +++++ intra/source/org/flixel/FlxParticle.hx | 92 + intra/source/org/flixel/FlxPath.hx | 280 ++ intra/source/org/flixel/FlxPoint.hx | 101 + intra/source/org/flixel/FlxRect.hx | 175 + intra/source/org/flixel/FlxSave.hx | 194 + intra/source/org/flixel/FlxSound.hx | 508 +++ intra/source/org/flixel/FlxSprite.hx | 1060 +++++ intra/source/org/flixel/FlxState.hx | 24 + intra/source/org/flixel/FlxText.hx | 305 ++ intra/source/org/flixel/FlxTileblock.hx | 94 + intra/source/org/flixel/FlxTilemap.hx | 1509 +++++++ intra/source/org/flixel/FlxTimer.hx | 171 + intra/source/org/flixel/FlxU.hx | 621 +++ intra/source/org/flixel/data/autotiles.png | Bin 0 -> 3677 bytes .../source/org/flixel/data/autotiles_alt.png | Bin 0 -> 3686 bytes intra/source/org/flixel/data/beep.mp3 | Bin 0 -> 2114 bytes intra/source/org/flixel/data/button.png | Bin 0 -> 287 bytes intra/source/org/flixel/data/cursor.png | Bin 0 -> 706 bytes intra/source/org/flixel/data/default.png | Bin 0 -> 197 bytes intra/source/org/flixel/data/handle.png | Bin 0 -> 174 bytes intra/source/org/flixel/data/logo.png | Bin 0 -> 172 bytes intra/source/org/flixel/data/logo_corners.png | Bin 0 -> 1515 bytes intra/source/org/flixel/data/logo_light.png | Bin 0 -> 1804 bytes intra/source/org/flixel/data/nokiafc22.ttf | Bin 0 -> 16272 bytes intra/source/org/flixel/data/vcr/flixel.png | Bin 0 -> 214 bytes intra/source/org/flixel/data/vcr/open.png | Bin 0 -> 178 bytes intra/source/org/flixel/data/vcr/pause.png | Bin 0 -> 124 bytes intra/source/org/flixel/data/vcr/play.png | Bin 0 -> 156 bytes .../source/org/flixel/data/vcr/record_off.png | Bin 0 -> 198 bytes .../source/org/flixel/data/vcr/record_on.png | Bin 0 -> 251 bytes intra/source/org/flixel/data/vcr/restart.png | Bin 0 -> 172 bytes intra/source/org/flixel/data/vcr/step.png | Bin 0 -> 163 bytes intra/source/org/flixel/data/vcr/stop.png | Bin 0 -> 117 bytes intra/source/org/flixel/data/vis/bounds.png | Bin 0 -> 173 bytes .../org/flixel/plugin/DebugPathDisplay.hx | 111 + .../source/org/flixel/plugin/TimerManager.hx | 87 + .../plugin/photonstorm/API/FlxKongregate.hx | 346 ++ .../plugin/photonstorm/BaseTypes/Bullet.hx | 234 + .../photonstorm/BaseTypes/MouseSpring.hx | 94 + .../flixel/plugin/photonstorm/FX/BaseFX.hx | 110 + .../flixel/plugin/photonstorm/FX/BlurFX.hx | 133 + .../plugin/photonstorm/FX/CenterSlideFX.hx | 249 ++ .../plugin/photonstorm/FX/FloodFillFX.hx | 128 + .../flixel/plugin/photonstorm/FX/GlitchFX.hx | 119 + .../flixel/plugin/photonstorm/FX/PlasmaFX.hx | 170 + .../plugin/photonstorm/FX/RainbowLineFX.hx | 260 ++ .../flixel/plugin/photonstorm/FX/RevealFX.hx | 113 + .../plugin/photonstorm/FX/SineWaveFX.hx | 329 ++ .../plugin/photonstorm/FX/StarfieldFX.hx | 283 ++ .../plugin/photonstorm/FX/WowCopperFX.hx | 304 ++ .../org/flixel/plugin/photonstorm/FlxBar.hx | 658 +++ .../plugin/photonstorm/FlxBitmapFont.hx | 503 +++ .../plugin/photonstorm/FlxButtonPlus.hx | 500 +++ .../flixel/plugin/photonstorm/FlxCollision.hx | 210 + .../org/flixel/plugin/photonstorm/FlxColor.hx | 534 +++ .../flixel/plugin/photonstorm/FlxControl.hx | 178 + .../plugin/photonstorm/FlxControlHandler.hx | 1423 ++++++ .../flixel/plugin/photonstorm/FlxCoreUtils.hx | 70 + .../org/flixel/plugin/photonstorm/FlxDelay.hx | 163 + .../flixel/plugin/photonstorm/FlxDisplay.hx | 181 + .../flixel/plugin/photonstorm/FlxExplode.hx | 15 + .../plugin/photonstorm/FlxExtendedSprite.hx | 889 ++++ .../flixel/plugin/photonstorm/FlxFlectrum.hx | 702 +++ .../org/flixel/plugin/photonstorm/FlxFlod.hx | 254 ++ .../flixel/plugin/photonstorm/FlxGradient.hx | 251 ++ .../plugin/photonstorm/FlxGridOverlay.hx | 186 + .../plugin/photonstorm/FlxLinkedGroup.hx | 33 + .../org/flixel/plugin/photonstorm/FlxMath.hx | 609 +++ .../plugin/photonstorm/FlxMouseControl.hx | 270 ++ .../plugin/photonstorm/FlxPowerTools.hx | 23 + .../plugin/photonstorm/FlxScreenGrab.hx | 178 + .../plugin/photonstorm/FlxScrollZone.hx | 257 ++ .../plugin/photonstorm/FlxScrollingText.hx | 310 ++ .../flixel/plugin/photonstorm/FlxSpecialFX.hx | 308 ++ .../flixel/plugin/photonstorm/FlxVelocity.hx | 364 ++ .../flixel/plugin/photonstorm/FlxWeapon.hx | 690 +++ .../flixel/plugin/photonstorm/PNGEncoder.hx | 140 + intra/source/org/flixel/system/FlxAnim.hx | 52 + intra/source/org/flixel/system/FlxDebugger.hx | 233 + intra/source/org/flixel/system/FlxList.hx | 48 + .../source/org/flixel/system/FlxPreloader.hx | 215 + intra/source/org/flixel/system/FlxQuadTree.hx | 612 +++ intra/source/org/flixel/system/FlxReplay.hx | 201 + intra/source/org/flixel/system/FlxTile.hx | 80 + .../org/flixel/system/FlxTilemapBuffer.hx | 120 + intra/source/org/flixel/system/FlxWindow.hx | 327 ++ intra/source/org/flixel/system/ObjectPool.hx | 32 + intra/source/org/flixel/system/debug/Log.hx | 91 + intra/source/org/flixel/system/debug/Perf.hx | 209 + intra/source/org/flixel/system/debug/VCR.hx | 599 +++ intra/source/org/flixel/system/debug/Vis.hx | 170 + intra/source/org/flixel/system/debug/Watch.hx | 213 + .../org/flixel/system/debug/WatchEntry.hx | 207 + intra/source/org/flixel/system/input/Input.hx | 189 + .../org/flixel/system/input/Keyboard.hx | 210 + intra/source/org/flixel/system/input/Mouse.hx | 338 ++ .../org/flixel/system/replay/FrameRecord.hx | 142 + .../org/flixel/system/replay/MouseRecord.hx | 42 + intra/source/states/ControlsState.hx | 232 + intra/source/states/DialogueState.hx | 423 ++ intra/source/states/EndingState.hx | 635 +++ intra/source/states/IntroScene.hx | 126 + intra/source/states/MinimapState.hx | 237 + intra/source/states/MobileConfig.hx | 37 + intra/source/states/PauseState.hx | 2196 +++++++++ intra/source/states/PlayState.hx | 2074 +++++++++ intra/source/states/PushableFlxState.hx | 48 + intra/source/states/RoamState.hx | 616 +++ intra/source/states/TitleState.hx | 1045 +++++ intra/source/states/noairPauseState.hx | 1798 ++++++++ intra/source/xml/Intra.xml | 3210 +++++++++++++ 1637 files changed, 223288 insertions(+), 1 deletion(-) rename CODEGUIDE.md => AIR/CODEGUIDE.md (100%) rename FAQ.md => AIR/FAQ.md (100%) rename Installation.md => AIR/Installation.md (100%) rename LICENSE.md => AIR/LICENSE.md (100%) rename README.md => AIR/README.md (100%) rename USING LEVEL EDITOR.md => AIR/USING LEVEL EDITOR.md (100%) rename {intra => AIR/intra}/Intra-AIR.as3proj (100%) rename {intra => AIR/intra}/Intra.dam (100%) rename {intra => AIR/intra}/Minimaps.dam (100%) rename {intra => AIR/intra}/PackageApp.bat (100%) rename {intra => AIR/intra}/Run.bat (100%) rename {intra => AIR/intra}/RunMobile.bat (100%) rename {intra => AIR/intra}/Z_HELP.txt (100%) rename {intra => AIR/intra}/bat/CreateCertificate.bat (100%) rename {intra => AIR/intra}/bat/InstallAirRuntime.bat (100%) rename {intra => AIR/intra}/bat/InstallGame.bat (100%) rename {intra => AIR/intra}/bat/PackagerExe.bat (100%) rename {intra => AIR/intra}/bat/SetupApplication.bat (100%) rename {intra => AIR/intra}/bat/SetupApplication_Mac.bat (100%) rename {intra => AIR/intra}/bat/SetupSDK.bat (100%) rename {intra => AIR/intra}/bat/SetupSDK_Mac.bat (100%) rename {intra => AIR/intra}/bat/mCreateCertificate.bat (100%) rename {intra => AIR/intra}/bat/mPackager.bat (100%) rename {intra => AIR/intra}/bat/mRun.bat (100%) rename {intra => AIR/intra}/bat/mSetupApplication.bat (100%) rename {intra => AIR/intra}/bat/mSetupSDK.bat (100%) rename {intra => AIR/intra}/bin/Default-568h@2x.png (100%) rename {intra => AIR/intra}/bin/Default.png (100%) rename {intra => AIR/intra}/bin/joyquery.exe (100%) rename {intra => AIR/intra}/bin/js/swfobject.js (100%) create mode 100644 AIR/intra/hsrc/awerwer/com/FRESteamWorksTest.hx create mode 100644 AIR/intra/hsrc/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx create mode 100644 AIR/intra/hsrc/awerwer/com/amanitadesign/steam/FRESteamWorks.hx create mode 100644 AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamConstants.hx create mode 100644 AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamEvent.hx create mode 100644 AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystick.hx create mode 100644 AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx create mode 100644 AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickManager.hx create mode 100644 AIR/intra/hsrc/com/FRESteamWorksTest.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/FRESteamWorks.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/SteamConstants.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/SteamEvent.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/old/FRESteamWorks.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/old/SteamConstants.hx create mode 100644 AIR/intra/hsrc/com/amanitadesign/steam/old/SteamEvent.hx create mode 100644 AIR/intra/hsrc/data/CLASS_ID.hx create mode 100644 AIR/intra/hsrc/data/CSV_Data.hx create mode 100644 AIR/intra/hsrc/data/Common_Sprites.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_EN.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_ES.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_IT.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_JP.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_KR.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_PT.hx create mode 100644 AIR/intra/hsrc/data/NPC_Data_ZHS.hx create mode 100644 AIR/intra/hsrc/data/SoundData.hx create mode 100644 AIR/intra/hsrc/data/TileData.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Eye_Light.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Light.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Map_Preview.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Nonsolid.hx create mode 100644 AIR/intra/hsrc/entity/decoration/RetroEffect.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Solid_Sprite.hx create mode 100644 AIR/intra/hsrc/entity/decoration/Water_Anim.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Dash_Trap.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Gasguy.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Rat.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Silverfish.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Splitboss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/apartment/Teleguy.hx create mode 100644 AIR/intra/hsrc/entity/enemy/bedroom/Annoyer.hx create mode 100644 AIR/intra/hsrc/entity/enemy/bedroom/Pew_Laser.hx create mode 100644 AIR/intra/hsrc/entity/enemy/bedroom/Shieldy.hx create mode 100644 AIR/intra/hsrc/entity/enemy/bedroom/Slime.hx create mode 100644 AIR/intra/hsrc/entity/enemy/bedroom/Sun_Guy.hx create mode 100644 AIR/intra/hsrc/entity/enemy/circus/Circus_Folks.hx create mode 100644 AIR/intra/hsrc/entity/enemy/circus/Contort.hx create mode 100644 AIR/intra/hsrc/entity/enemy/circus/Fire_Pillar.hx create mode 100644 AIR/intra/hsrc/entity/enemy/circus/Lion.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/Dog.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/Frog.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/Person.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/Rotator.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/Spike_Roller.hx create mode 100644 AIR/intra/hsrc/entity/enemy/crowd/WallBoss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Briar_Boss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Chaser.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/ControlsDeity.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Follower_Bro.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Red_Walker.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Sadbro.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Sage_Boss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Space_Face.hx create mode 100644 AIR/intra/hsrc/entity/enemy/etc/Wall_Laser.hx create mode 100644 AIR/intra/hsrc/entity/enemy/hotel/Burst_Plant.hx create mode 100644 AIR/intra/hsrc/entity/enemy/hotel/Dustmaid.hx create mode 100644 AIR/intra/hsrc/entity/enemy/hotel/Eye_Boss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/hotel/Steam_Pipe.hx create mode 100644 AIR/intra/hsrc/entity/enemy/redcave/Four_Shooter.hx create mode 100644 AIR/intra/hsrc/entity/enemy/redcave/Mover.hx create mode 100644 AIR/intra/hsrc/entity/enemy/redcave/On_Off_Laser.hx create mode 100644 AIR/intra/hsrc/entity/enemy/redcave/Red_Boss.hx create mode 100644 AIR/intra/hsrc/entity/enemy/redcave/Slasher.hx create mode 100644 AIR/intra/hsrc/entity/enemy/suburb/Suburb_Killer.hx create mode 100644 AIR/intra/hsrc/entity/enemy/suburb/Suburb_Walker.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Big_Door.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Button.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Challenge_Gate.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Checkpoint.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Console.hx create mode 100644 AIR/intra/hsrc/entity/gadget/CrackedTile.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Dash_Pad.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Door.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Dust.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Gate.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Go_Detector.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Growth_Gate.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Hole.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Jump_Trigger.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Key.hx create mode 100644 AIR/intra/hsrc/entity/gadget/KeyBlock.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Pillar_Switch.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Propelled.hx create mode 100644 AIR/intra/hsrc/entity/gadget/SinglePushBlock.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Stop_Marker.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Switch_Pillar.hx create mode 100644 AIR/intra/hsrc/entity/gadget/Treasure.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Black_Thing.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Dungeon_Statue.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Elevator.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Fisherman.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Health_Cicada.hx create mode 100644 AIR/intra/hsrc/entity/interactive/NPC.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Red_Pillar.hx create mode 100644 AIR/intra/hsrc/entity/interactive/Terminal_Gate.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Forest_NPC.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Happy_NPC.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Huge_Fucking_Stag.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Mitra.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Redsea_NPC.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Sage.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Shadow_Briar.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Space_NPC.hx create mode 100644 AIR/intra/hsrc/entity/interactive/npc/Trade_NPC.hx create mode 100644 AIR/intra/hsrc/entity/player/Broom.hx create mode 100644 AIR/intra/hsrc/entity/player/Foot_Overlay.hx create mode 100644 AIR/intra/hsrc/entity/player/HealthBar.hx create mode 100644 AIR/intra/hsrc/entity/player/HealthPickup.hx create mode 100644 AIR/intra/hsrc/entity/player/Miniminimap.hx create mode 100644 AIR/intra/hsrc/entity/player/Player.hx create mode 100644 AIR/intra/hsrc/entity/player/Transformer.hx create mode 100644 AIR/intra/hsrc/extension/JoyQuery/Joystick.hx create mode 100644 AIR/intra/hsrc/helper/ANEFix.hx create mode 100644 AIR/intra/hsrc/helper/Achievements.hx create mode 100644 AIR/intra/hsrc/helper/Cutscene.hx create mode 100644 AIR/intra/hsrc/helper/DH.hx create mode 100644 AIR/intra/hsrc/helper/EventScripts.hx create mode 100644 AIR/intra/hsrc/helper/Joypad_Config_Group.hx create mode 100644 AIR/intra/hsrc/helper/Parabola_Thing.hx create mode 100644 AIR/intra/hsrc/helper/S_NPC.hx create mode 100644 AIR/intra/hsrc/helper/ScreenFade.hx create mode 100644 AIR/intra/hsrc/helper/SpriteFactory.hx create mode 100644 AIR/intra/hsrc/helper/SteamThing.hx create mode 100644 AIR/intra/hsrc/helper/UI_Offsets.hx create mode 100644 AIR/intra/hsrc/org/flixel/AnoSprite.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxBasic.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxButton.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxCamera.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxEmitter.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxG.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxGame.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxGroup.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxObject.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxParticle.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxPath.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxPoint.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxRect.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxSave.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxSound.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxSprite.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxState.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxText.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxTileblock.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxTilemap.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxTimer.hx create mode 100644 AIR/intra/hsrc/org/flixel/FlxU.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/DebugPathDisplay.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/TimerManager.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/API/FlxKongregate.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BaseFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BlurFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/GlitchFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RevealFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBar.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBitmapFont.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxButtonPlus.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCollision.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxColor.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControl.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControlHandler.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCoreUtils.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDelay.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDisplay.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExplode.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlectrum.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlod.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGradient.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGridOverlay.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMath.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMouseControl.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxPowerTools.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScreenGrab.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollZone.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollingText.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxSpecialFX.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxVelocity.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxWeapon.hx create mode 100644 AIR/intra/hsrc/org/flixel/plugin/photonstorm/PNGEncoder.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxAnim.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxDebugger.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxList.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxPreloader.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxQuadTree.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxReplay.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxTile.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxTilemapBuffer.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/FlxWindow.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/ObjectPool.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/Log.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/Perf.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/VCR.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/Vis.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/Watch.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/debug/WatchEntry.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/input/Input.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/input/Keyboard.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/input/Mouse.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/replay/FrameRecord.hx create mode 100644 AIR/intra/hsrc/org/flixel/system/replay/MouseRecord.hx rename {intra => AIR/intra}/mPackageApp.bat (100%) rename {intra => AIR/intra}/mRun.bat (100%) rename {intra => AIR/intra}/obj/Intra-AIRConfig.old (100%) rename {intra => AIR/intra}/obj/Intra-AIRConfig.xml (100%) rename {intra => AIR/intra}/src/Intra.as (100%) rename {intra => AIR/intra}/src/Main.as (100%) rename {intra => AIR/intra}/src/Preloader.as (100%) rename {intra => AIR/intra}/src/Save.as (100%) rename {intra => AIR/intra}/src/awerwer/com.zip (100%) rename {intra => AIR/intra}/src/awerwer/com/FRESteamWorksLibLinux.swc (100%) rename {intra => AIR/intra}/src/awerwer/com/FRESteamWorksTest.as (100%) rename {intra => AIR/intra}/src/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.as (100%) rename {intra => AIR/intra}/src/awerwer/com/amanitadesign/steam/Assets/descriptor.xml (100%) rename {intra => AIR/intra}/src/awerwer/com/amanitadesign/steam/FRESteamWorks.as (100%) rename {intra => AIR/intra}/src/awerwer/com/amanitadesign/steam/SteamConstants.as (100%) rename {intra => AIR/intra}/src/awerwer/com/amanitadesign/steam/SteamEvent.as (100%) rename {intra => AIR/intra}/src/buildmap.py (100%) rename {intra => AIR/intra}/src/ca/wegetsignal/nativeextensions/MacJoystick.as (100%) rename {intra => AIR/intra}/src/ca/wegetsignal/nativeextensions/MacJoystickEvent.as (100%) rename {intra => AIR/intra}/src/ca/wegetsignal/nativeextensions/MacJoystickManager.as (100%) rename {intra => AIR/intra}/src/com/FRESteamWorksLibLinux.swc (100%) rename {intra => AIR/intra}/src/com/FRESteamWorksTest.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/Assets/FRESteamWorkswin.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/Assets/descriptor.xml (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/FRESteamWorks.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/SteamConstants.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/SteamEvent.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/old/FRESteamWorks.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/old/SteamConstants.as (100%) rename {intra => AIR/intra}/src/com/amanitadesign/steam/old/SteamEvent.as (100%) rename {intra => AIR/intra}/src/csv/APARTMENT_BG.csv (100%) rename {intra => AIR/intra}/src/csv/APARTMENT_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/APARTMENT_FG.csv (100%) rename {intra => AIR/intra}/src/csv/BEACH_BG.csv (100%) rename {intra => AIR/intra}/src/csv/BEACH_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/BEACH_FG.csv (100%) rename {intra => AIR/intra}/src/csv/BEDROOM_BG.csv (100%) rename {intra => AIR/intra}/src/csv/BEDROOM_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/BEDROOM_FG.csv (100%) rename {intra => AIR/intra}/src/csv/BLANK_BG.csv (100%) rename {intra => AIR/intra}/src/csv/BLUE_BG.csv (100%) rename {intra => AIR/intra}/src/csv/BLUE_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/BLUE_FG.csv (100%) rename {intra => AIR/intra}/src/csv/CIRCUS_BG.csv (100%) rename {intra => AIR/intra}/src/csv/CIRCUS_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/CIRCUS_FG.csv (100%) rename {intra => AIR/intra}/src/csv/CLIFF_BG.csv (100%) rename {intra => AIR/intra}/src/csv/CLIFF_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/CROWD_BG.csv (100%) rename {intra => AIR/intra}/src/csv/CROWD_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/CROWD_FG.csv (100%) rename {intra => AIR/intra}/src/csv/DEBUG_BG.csv (100%) rename {intra => AIR/intra}/src/csv/DEBUG_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/DEBUG_FG.csv (100%) rename {intra => AIR/intra}/src/csv/DRAWER_BG.csv (100%) rename {intra => AIR/intra}/src/csv/DRAWER_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/DRAWER_FG.csv (100%) rename {intra => AIR/intra}/src/csv/FIELDS_BG.csv (100%) rename {intra => AIR/intra}/src/csv/FIELDS_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/FIELDS_FG.csv (100%) rename {intra => AIR/intra}/src/csv/FOREST_BG.csv (100%) rename {intra => AIR/intra}/src/csv/FOREST_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/FOREST_FG.csv (100%) rename {intra => AIR/intra}/src/csv/GO_BG.csv (100%) rename {intra => AIR/intra}/src/csv/GO_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/GO_BG2_old.csv (100%) rename {intra => AIR/intra}/src/csv/GO_FG.csv (100%) rename {intra => AIR/intra}/src/csv/HAPPY_BG.csv (100%) rename {intra => AIR/intra}/src/csv/HAPPY_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/HAPPY_FG.csv (100%) rename {intra => AIR/intra}/src/csv/HOTEL_BG.csv (100%) rename {intra => AIR/intra}/src/csv/HOTEL_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/HOTEL_FG.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Apartment.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Beach.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Bedroom.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Cell.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Circus.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Cliff.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Crowd.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Fields.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Forest.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Hotel.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Overworld.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Redcave.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Redsea.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Space.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Street.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Suburb.csv (100%) rename {intra => AIR/intra}/src/csv/Minimap_Terminal.csv (100%) rename {intra => AIR/intra}/src/csv/NEXUS_BG.csv (100%) rename {intra => AIR/intra}/src/csv/NEXUS_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/NEXUS_FG.csv (100%) rename {intra => AIR/intra}/src/csv/OVERWORLD_BG.csv (100%) rename {intra => AIR/intra}/src/csv/OVERWORLD_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/OVERWORLD_FG.csv (100%) rename {intra => AIR/intra}/src/csv/REDCAVE_BG.csv (100%) rename {intra => AIR/intra}/src/csv/REDCAVE_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/REDCAVE_FG.csv (100%) rename {intra => AIR/intra}/src/csv/REDSEA_BG.csv (100%) rename {intra => AIR/intra}/src/csv/REDSEA_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/REDSEA_FG.csv (100%) rename {intra => AIR/intra}/src/csv/SPACE_BG.csv (100%) rename {intra => AIR/intra}/src/csv/SPACE_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/SPACE_FG.csv (100%) rename {intra => AIR/intra}/src/csv/STREET_BG.csv (100%) rename {intra => AIR/intra}/src/csv/STREET_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/STREET_FG.csv (100%) rename {intra => AIR/intra}/src/csv/SUBURB_BG.csv (100%) rename {intra => AIR/intra}/src/csv/SUBURB_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/SUBURB_FG.csv (100%) rename {intra => AIR/intra}/src/csv/TERMINAL_BG.csv (100%) rename {intra => AIR/intra}/src/csv/TERMINAL_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/TERMINAL_FG.csv (100%) rename {intra => AIR/intra}/src/csv/TRAIN_BG.csv (100%) rename {intra => AIR/intra}/src/csv/TRAIN_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/TRAIN_FG.csv (100%) rename {intra => AIR/intra}/src/csv/WINDMILL_BG.csv (100%) rename {intra => AIR/intra}/src/csv/WINDMILL_BG2.csv (100%) rename {intra => AIR/intra}/src/csv/WINDMILL_FG.csv (100%) rename {intra => AIR/intra}/src/data/CLASS_ID.as (100%) rename {intra => AIR/intra}/src/data/CSV_Data.as (100%) rename {intra => AIR/intra}/src/data/Common_Sprites.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_EN.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_ES.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_IT.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_JP.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_KR.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_PT.as (100%) rename {intra => AIR/intra}/src/data/NPC_Data_ZHS.as (100%) rename {intra => AIR/intra}/src/data/SoundData.as (100%) rename {intra => AIR/intra}/src/data/TileData.as (100%) rename {intra => AIR/intra}/src/data/dialogue_EN.txt (100%) rename {intra => AIR/intra}/src/data/dialogue_ES.txt (100%) rename {intra => AIR/intra}/src/data/dialogue_IT.txt (100%) rename {intra => AIR/intra}/src/data/dialogue_ZHS.txt (100%) rename {intra => AIR/intra}/src/data/dialogue_jp.txt (100%) rename {intra => AIR/intra}/src/data/dialogue_pt-br.txt (100%) rename {intra => AIR/intra}/src/data/gen_npc.py (100%) rename {intra => AIR/intra}/src/data/kr/dialogue_kr.py (100%) rename {intra => AIR/intra}/src/data/kr/make_kr_npc_data.bat (100%) rename {intra => AIR/intra}/src/data/make_npc_data.bat (100%) rename {intra => AIR/intra}/src/entity/decoration/Eye_Light.as (100%) rename {intra => AIR/intra}/src/entity/decoration/Light.as (100%) rename {intra => AIR/intra}/src/entity/decoration/Map_Preview.as (100%) rename {intra => AIR/intra}/src/entity/decoration/Nonsolid.as (100%) rename {intra => AIR/intra}/src/entity/decoration/RetroEffect.as (100%) rename {intra => AIR/intra}/src/entity/decoration/Solid_Sprite.as (100%) rename {intra => AIR/intra}/src/entity/decoration/Water_Anim.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Dash_Trap.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Gasguy.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Rat.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Silverfish.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Splitboss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/apartment/Teleguy.as (100%) rename {intra => AIR/intra}/src/entity/enemy/bedroom/Annoyer.as (100%) rename {intra => AIR/intra}/src/entity/enemy/bedroom/Pew_Laser.as (100%) rename {intra => AIR/intra}/src/entity/enemy/bedroom/Shieldy.as (100%) rename {intra => AIR/intra}/src/entity/enemy/bedroom/Slime.as (100%) rename {intra => AIR/intra}/src/entity/enemy/bedroom/Sun_Guy.as (100%) rename {intra => AIR/intra}/src/entity/enemy/circus/Circus_Folks.as (100%) rename {intra => AIR/intra}/src/entity/enemy/circus/Contort.as (100%) rename {intra => AIR/intra}/src/entity/enemy/circus/Fire_Pillar.as (100%) rename {intra => AIR/intra}/src/entity/enemy/circus/Lion.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/Dog.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/Frog.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/Person.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/Rotator.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/Spike_Roller.as (100%) rename {intra => AIR/intra}/src/entity/enemy/crowd/WallBoss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Briar_Boss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Chaser.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/ControlsDeity.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Follower_Bro.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Red_Walker.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Sadbro.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Sage_Boss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Space_Face.as (100%) rename {intra => AIR/intra}/src/entity/enemy/etc/Wall_Laser.as (100%) rename {intra => AIR/intra}/src/entity/enemy/hotel/Burst_Plant.as (100%) rename {intra => AIR/intra}/src/entity/enemy/hotel/Dustmaid.as (100%) rename {intra => AIR/intra}/src/entity/enemy/hotel/Eye_Boss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/hotel/Steam_Pipe.as (100%) rename {intra => AIR/intra}/src/entity/enemy/redcave/Four_Shooter.as (100%) rename {intra => AIR/intra}/src/entity/enemy/redcave/Mover.as (100%) rename {intra => AIR/intra}/src/entity/enemy/redcave/On_Off_Laser.as (100%) rename {intra => AIR/intra}/src/entity/enemy/redcave/Red_Boss.as (100%) rename {intra => AIR/intra}/src/entity/enemy/redcave/Slasher.as (100%) rename {intra => AIR/intra}/src/entity/enemy/suburb/Suburb_Killer.as (100%) rename {intra => AIR/intra}/src/entity/enemy/suburb/Suburb_Walker.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Big_Door.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Button.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Challenge_Gate.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Checkpoint.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Console.as (100%) rename {intra => AIR/intra}/src/entity/gadget/CrackedTile.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Dash_Pad.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Door.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Dust.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Gate.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Go_Detector.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Growth_Gate.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Hole.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Jump_Trigger.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Key.as (100%) rename {intra => AIR/intra}/src/entity/gadget/KeyBlock.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Pillar_Switch.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Propelled.as (100%) rename {intra => AIR/intra}/src/entity/gadget/SinglePushBlock.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Stop_Marker.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Switch_Pillar.as (100%) rename {intra => AIR/intra}/src/entity/gadget/Treasure.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Black_Thing.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Dungeon_Statue.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Elevator.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Fisherman.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Health_Cicada.as (100%) rename {intra => AIR/intra}/src/entity/interactive/NPC.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Red_Pillar.as (100%) rename {intra => AIR/intra}/src/entity/interactive/Terminal_Gate.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Forest_NPC.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Happy_NPC.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Huge_Fucking_Stag.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Mitra.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Redsea_NPC.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Sage.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Shadow_Briar.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Space_NPC.as (100%) rename {intra => AIR/intra}/src/entity/interactive/npc/Trade_NPC.as (100%) rename {intra => AIR/intra}/src/entity/player/Broom.as (100%) rename {intra => AIR/intra}/src/entity/player/Foot_Overlay.as (100%) rename {intra => AIR/intra}/src/entity/player/HealthBar.as (100%) rename {intra => AIR/intra}/src/entity/player/HealthPickup.as (100%) rename {intra => AIR/intra}/src/entity/player/Miniminimap.as (100%) rename {intra => AIR/intra}/src/entity/player/Player.as (100%) rename {intra => AIR/intra}/src/entity/player/Transformer.as (100%) rename {intra => AIR/intra}/src/extension/JoyQuery/Joystick.as (100%) rename {intra => AIR/intra}/src/global/Keys.as (100%) rename {intra => AIR/intra}/src/global/Registry.as (100%) rename {intra => AIR/intra}/src/helper/ANEFix.as (100%) rename {intra => AIR/intra}/src/helper/Achievements.as (100%) rename {intra => AIR/intra}/src/helper/Cutscene.as (100%) rename {intra => AIR/intra}/src/helper/DH.as (100%) rename {intra => AIR/intra}/src/helper/EventScripts.as (100%) rename {intra => AIR/intra}/src/helper/Joypad_Config_Group.as (100%) rename {intra => AIR/intra}/src/helper/Parabola_Thing.as (100%) rename {intra => AIR/intra}/src/helper/S_NPC.as (100%) rename {intra => AIR/intra}/src/helper/ScreenFade.as (100%) rename {intra => AIR/intra}/src/helper/SpriteFactory.as (100%) rename {intra => AIR/intra}/src/helper/SteamThing.as (100%) rename {intra => AIR/intra}/src/helper/UI_Offsets.as (100%) rename {intra => AIR/intra}/src/helper/invertRGB.pbj (100%) rename {intra => AIR/intra}/src/helper/static.pbj (100%) rename {intra => AIR/intra}/src/lua/Intra.lua (100%) rename {intra => AIR/intra}/src/lua/Intra_settings.lua (100%) rename {intra => AIR/intra}/src/lua/csvTilemap.lua (100%) rename {intra => AIR/intra}/src/lua/csvTilemap_settings.lua (100%) rename {intra => AIR/intra}/src/noairSave.as (100%) rename {intra => AIR/intra}/src/org/flixel/AnoSprite.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxBasic.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxButton.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxCamera.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxEmitter.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxG.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxGame.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxGroup.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxObject.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxParticle.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxPath.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxPoint.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxRect.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxSave.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxSound.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxSprite.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxState.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxText.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxTileblock.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxTilemap.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxTimer.as (100%) rename {intra => AIR/intra}/src/org/flixel/FlxU.as (100%) rename {intra => AIR/intra}/src/org/flixel/data/autotiles.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/autotiles_alt.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/beep.mp3 (100%) rename {intra => AIR/intra}/src/org/flixel/data/button.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/cursor.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/default.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/handle.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/logo.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/logo_corners.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/logo_light.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/nokiafc22.ttf (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/flixel.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/open.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/pause.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/play.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/record_off.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/record_on.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/restart.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/step.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vcr/stop.png (100%) rename {intra => AIR/intra}/src/org/flixel/data/vis/bounds.png (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/DebugPathDisplay.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/TimerManager.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/API/FlxKongregate.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/BaseTypes/Bullet.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/BaseFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/BlurFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/CenterSlideFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/FloodFillFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/GlitchFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/PlasmaFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/RainbowLineFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/RevealFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/SineWaveFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/StarfieldFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FX/WowCopperFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxBar.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxBitmapFont.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxButtonPlus.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxCollision.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxColor.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxControl.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxControlHandler.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxCoreUtils.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxDelay.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxDisplay.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxExplode.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxExtendedSprite.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxFlectrum.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxFlod.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxGradient.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxGridOverlay.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxLinkedGroup.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxMath.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxMouseControl.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxPowerTools.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxScreenGrab.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxScrollZone.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxScrollingText.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxSpecialFX.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxVelocity.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/FlxWeapon.as (100%) rename {intra => AIR/intra}/src/org/flixel/plugin/photonstorm/PNGEncoder.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxAnim.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxDebugger.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxList.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxPreloader.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxQuadTree.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxReplay.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxTile.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxTilemapBuffer.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/FlxWindow.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/ObjectPool.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/Log.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/Perf.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/VCR.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/Vis.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/Watch.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/debug/WatchEntry.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/input/Input.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/input/Keyboard.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/input/Mouse.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/replay/FrameRecord.as (100%) rename {intra => AIR/intra}/src/org/flixel/system/replay/MouseRecord.as (100%) rename {intra => AIR/intra}/src/states/ControlsState.as (100%) rename {intra => AIR/intra}/src/states/DialogueState.as (100%) rename {intra => AIR/intra}/src/states/EndingState.as (100%) rename {intra => AIR/intra}/src/states/IntroScene.as (100%) rename {intra => AIR/intra}/src/states/MinimapState.as (100%) rename {intra => AIR/intra}/src/states/MobileConfig.as (100%) rename {intra => AIR/intra}/src/states/PauseState.as (100%) rename {intra => AIR/intra}/src/states/PlayState.as (100%) rename {intra => AIR/intra}/src/states/PushableFlxState.as (100%) rename {intra => AIR/intra}/src/states/RoamState.as (100%) rename {intra => AIR/intra}/src/states/TitleState.as (100%) rename {intra => AIR/intra}/src/states/noairPauseState.as (100%) rename {intra => AIR/intra}/src/xml/Intra.xml (100%) rename {intra => AIR/intra}/xml_app/application.xml (100%) rename {intra => AIR/intra}/xml_app/application_mac.xml (100%) rename {intra => AIR/intra}/xml_app/mapplicationdroid.xml (100%) create mode 100644 intra/Project.xml rename intra/{src/res => assets/images}/font/11x12_ZHS.png (100%) rename intra/{src/res => assets/images}/font/8x8-kr.png (100%) rename intra/{src/res => assets/images}/font/es_white.png (100%) rename intra/{src/res => assets/images}/font/font-black-apple-7x8.png (100%) rename intra/{src/res => assets/images}/font/font-black.png (100%) rename intra/{src/res => assets/images}/font/font-white-apple-7x8.png (100%) rename intra/{src/res => assets/images}/font/jp_white.png (100%) rename intra/{src/res => assets/images}/font/jp_white_test.png (100%) rename intra/{src/res => assets/images}/font/kr_white.png (100%) rename intra/{src/res => assets/images}/medals/boss.gif (100%) rename intra/{src/res => assets/images}/medals/card.gif (100%) rename intra/{src/res => assets/images}/medals/cards.gif (100%) rename intra/{src/res => assets/images}/medals/fields.jpg (100%) rename intra/{src/res => assets/images}/medals/greenlight.gif (100%) rename intra/{src/res => assets/images}/medals/greenlight.jpg (100%) rename intra/{src/res => assets/images}/medals/health.gif (100%) rename intra/{src/res => assets/images}/medals/palyer.jpg (100%) rename intra/{src/res => assets/images}/medals/secret.gif (100%) rename intra/{src/res => assets/images}/sprites/animtiles/beach_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/cell_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/conveyer_anim_tiles.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/fields_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/flame_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/forest_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/go_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/happy_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/shoreline.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/shoreline_old.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/shoreline_old2.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/suburbs_anims.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/terminal.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/torch_pillars.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/water_edges.png (100%) rename intra/{src/res => assets/images}/sprites/animtiles/windmill_drops.png (100%) rename intra/{src/res => assets/images}/sprites/broom_cell.png (100%) rename intra/{src/res => assets/images}/sprites/broom_reflection.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-buttons.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-events.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-gates.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-slime.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-switch-pillar.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame-treasure-boxes.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_circusfolk.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_dog.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_frog.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_generic_npc.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_jump_triggers.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_npc_mitra.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_npc_rock.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_npc_sage.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_npc_statue.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_person.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_red_pillars.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_spike_rollers.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_spring_triggers.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_terminal_gate.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dame_trade_npc.png (100%) rename intra/{src/res => assets/images}/sprites/dame/dameblackthing.png (100%) rename intra/{src/res => assets/images}/sprites/dame/doorsfordame-whitedungeon.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/BLANK_BG.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/SPACE_BG.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/TREE.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/briar_BG.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/eyelight.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/grass_1.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/grass_REDSEA.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/nexus_bg.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/nexus_cardgem.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/nexus_door_preview_fade.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/nexus_door_preview_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/nexus_door_preview_placeholder.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_APARTMENT_water.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_FIELDS_grass.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_REDCAVE_water.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_REDSEA.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_WINDMILL_water.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlay_water.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/apartment_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/beach_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/bedroom_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/blue_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/circus_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/cliff_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/crowd_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/debug_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/ending_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/forest_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/go_overlay - Copy.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/go_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/happy_blend.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/happy_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/hotel_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/hotel_roof_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/nexus_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/redcave_overlay .png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/redsea_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/space_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/street_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/suburbs_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/suburbs_overlay_dark.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/terminal_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/windmill_overlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/overlays/windmill_overlay2.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/palmtree.xcf (100%) rename intra/{src/res => assets/images}/sprites/decoration/pixelation.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/player_overlay_foot_test.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/rail.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/rail_CROWD.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/rail_NEXUS.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/red_cave_left.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/scanlineoverlay.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/scanlineoverlay.xcf (100%) rename intra/{src/res => assets/images}/sprites/decoration/shadows/28x10_shadow.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/shadows/8x8_shadow.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/whirlpool.png (100%) rename intra/{src/res => assets/images}/sprites/decoration/whiteportal.png (100%) rename intra/{src/res => assets/images}/sprites/ending/cast.png (100%) rename intra/{src/res => assets/images}/sprites/ending/cast.xcf (100%) rename intra/{src/res => assets/images}/sprites/ending/go.png (100%) rename intra/{src/res => assets/images}/sprites/ending/screenies.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/annoyer.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/dash_trap.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/gas_guy.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/gas_guy_cloud.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/rat.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/silverfish.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/splitboss.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/splitboss_fireball.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/splitboss_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/apartment/teleport_guy.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/bedroom/slime_goo.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/arthur.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/arthur_javiera.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/contort_big.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/contort_small.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/fire_pillar.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/fire_pillar_base.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/javiera.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/javiera_juggle.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/lion.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/lion_fireballs.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/circus/shockwave.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/dog.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_rotator.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_rotator_ball.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_wallboss_face.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_wallboss_face_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_wallboss_l_hand.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/f_wallboss_l_hand_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/frog.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/frog_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/person.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/spike_roller.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/spike_roller_horizontal.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/spike_roller_horizontal_shadow.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/spike_roller_shadow.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/wallboss_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/wallboss_laser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/crowd/wallboss_wall.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/enemy_explode_2.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_arm_left.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_arm_right.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_blue_thorn.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_blue_thorn_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_body.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_core.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_dust_explosion.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_fire_eye.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_ground_thorn.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_happy_thorn.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_ice_crystal.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_ice_explosion.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_mist.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_overhang.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/briar_thorn_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/chaser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/sage_attacks.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/sage_boss.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/sage_fight_long_dust.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/space_face.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/etc/space_face_eyes.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/four_shooter.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/burst_plant.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/burst_plant_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/dustmaid.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/eye_boss_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/eye_boss_splash.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/eye_boss_water.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/steam.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/hotel/steam_pipe.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/light_orb.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/mover.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/enemy_explode_1.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/old_annoyer.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/old_shieldy.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/old_slime.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/red_boss_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/redwalker_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/slime_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/sun_guy_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/sun_guy_wave_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/wall_laser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/old_sprites/wall_laser_laser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/on_off_laser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/pew_laser.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/pew_laser_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/red_boss.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_four_shooter.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_four_shooter_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_mover.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_mover2.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_mover_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_on_off_h.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_on_off_v.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_slasher.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_slasher2.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_slasher_long.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_slasher_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/f_slasher_wide.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/on_off_shooter.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_big_wave.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_ripple.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_small_wave.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_tentacle.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_boss_warning.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_pillar.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_pillar_old.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redcave/red_pillar_ripple.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/redwalker.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/shieldy.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/slasher.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/slime.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/slime_bullet.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/suburb/suburb_killer.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/suburb/suburb_walker.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/sun_guy.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/sun_guy_wave.png (100%) rename intra/{src/res => assets/images}/sprites/enemies/twowalker.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/big_door.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/big_keys.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/biofilm.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/buttons.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/challenge_gate.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/checkpoint.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/console.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/crackedtiles.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/dash_pads.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/doors.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/dust.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/elevator.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/gate_green.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/gates.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/growth_gate.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/hole.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/key.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/key_green.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/key_sparkle.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/keyhole.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/moving_platform.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/moving_platform_poof.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/nexus_door.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/nexus_pad.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/pillar_switch.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/propelled.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/pushyblocks.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/sludge.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/solid_tile.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/spring_pad.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/stop_marker.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/treasureboxes.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/whirlpool_door.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/windmill_blade.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/windmill_inside.png (100%) rename intra/{src/res => assets/images}/sprites/gadgets/windmill_shell.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/big_health_pickup.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/broom-icon.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/broom.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/broom_old.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/checkpoint_save_box.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/controls.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/dohickies.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/header.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/header.xcf (100%) rename intra/{src/res => assets/images}/sprites/inventory/header_old.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/health_piece.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/inventory.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/item_jump_shoes.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/item_long_attack.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/item_none.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/item_tranformer.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/item_wide_attack.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/keyitems.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/knife.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/life_cicada.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/long_attack_h.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/long_attack_v.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/selector.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/settings-selector.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/settings.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/small_health_pickup.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/wide_attack_h.png (100%) rename intra/{src/res => assets/images}/sprites/inventory/wide_attack_v.png (100%) rename intra/{src/res => assets/images}/sprites/jplayer.png (100%) rename intra/{src/res => assets/images}/sprites/jplayer_cell.png (100%) rename intra/{src/res => assets/images}/sprites/jplayer_reflection.png (100%) rename intra/{src/res => assets/images}/sprites/light/5-frame-glow.png (100%) rename intra/{src/res => assets/images}/sprites/light/beach-screen-light.png (100%) rename intra/{src/res => assets/images}/sprites/light/cone-light.png (100%) rename intra/{src/res => assets/images}/sprites/light/glow-light.png (100%) rename intra/{src/res => assets/images}/sprites/map_even.png (100%) rename intra/{src/res => assets/images}/sprites/menu/arrow.png (100%) rename intra/{src/res => assets/images}/sprites/menu/arrows.png (100%) rename intra/{src/res => assets/images}/sprites/menu/autosave_icon.png (100%) rename intra/{src/res => assets/images}/sprites/menu/card_1.png (100%) rename intra/{src/res => assets/images}/sprites/menu/card_empty.png (100%) rename intra/{src/res => assets/images}/sprites/menu/card_sheet.png (100%) rename intra/{src/res => assets/images}/sprites/menu/cards_page example.png (100%) rename intra/{src/res => assets/images}/sprites/menu/dialogue_blinky_box.png (100%) rename intra/{src/res => assets/images}/sprites/menu/dialogue_box.png (100%) rename intra/{src/res => assets/images}/sprites/menu/equipped_icon.png (100%) rename intra/{src/res => assets/images}/sprites/menu/long_icon.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_c.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_circle.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_down.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_left.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_pause.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_right.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_up.png (100%) rename intra/{src/res => assets/images}/sprites/menu/m_mobile_x.png (100%) rename intra/{src/res => assets/images}/sprites/menu/menu_bg.png (100%) rename intra/{src/res => assets/images}/sprites/menu/menu_select_active.png (100%) rename intra/{src/res => assets/images}/sprites/menu/menu_select_inactive.png (100%) rename intra/{src/res => assets/images}/sprites/menu/menudialogue_box.png (100%) rename intra/{src/res => assets/images}/sprites/menu/none_icon.png (100%) rename intra/{src/res => assets/images}/sprites/menu/secret_trophies.png (100%) rename intra/{src/res => assets/images}/sprites/menu/transformer_icon.png (100%) rename intra/{src/res => assets/images}/sprites/menu/volume_bar.png (100%) rename intra/{src/res => assets/images}/sprites/menu/wide_icon.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/button_c.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/button_dpad.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/button_menu.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/button_x.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/dpad.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/mobile_bg.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/screenedge_left.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/screenedge_right.png (100%) rename intra/{src/res => assets/images}/sprites/mobile/thumb.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/beach_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/big_statue.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/bike.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/biofilm.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/blue_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/briar.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/cell_bodies.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/cliffs_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/cube_kings.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/cube_kings_old.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/easter/dev_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/easter/randoms.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/easter/smoke_red.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/fields_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/fisherman.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/follower_bro.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/forest_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/forest_stag.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/geoms.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/hamster_wheel.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/happy_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/hotel_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/mitra.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/mitra_bike.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/note_rock.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/npc.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/redsea_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/sadman.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/sage.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/sage_statue.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/shadow_briar.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/snowman.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/space_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/suburb_killers.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/suburb_walkers.png (100%) rename intra/{src/res => assets/images}/sprites/npcs/trade_npcs.png (100%) rename intra/{src/res => assets/images}/sprites/player_mobile_indicator.png (100%) rename intra/{src/res => assets/images}/sprites/redboss_alternate.png (100%) rename intra/{src/res => assets/images}/sprites/screen_config.png (100%) rename intra/{src/res => assets/images}/sprites/young_player.png (100%) rename intra/{src/res => assets/images}/sprites/young_player_cell.png (100%) rename intra/{src/res => assets/images}/sprites/young_player_reflection.png (100%) rename intra/{src/res => assets/images}/tilemaps/apartment_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/beach_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/beach_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/bed (100%) rename intra/{src/res => assets/images}/tilemaps/bedroom_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/blackwhite_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/blank_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/blue_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/cell_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/cell_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/circus_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/cliff_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/cliff_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/crowd_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/crowd_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/crowd_tilemap_old2.png (100%) rename intra/{src/res => assets/images}/tilemaps/fields_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/fields_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/fields_tilemap_old2.png (100%) rename intra/{src/res => assets/images}/tilemaps/fields_tilemap_old3.png (100%) rename intra/{src/res => assets/images}/tilemaps/forest_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/go_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/happy_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/hotel_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/mini_minimap_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/minimap_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/mockup_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/nexus_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/nexus_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/blank_tiles_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/old_beach_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/old_bedroom_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/overworld_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/overworld_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/old/street_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/overworld_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/overworld_tilemap.png.bak (100%) rename intra/{src/res => assets/images}/tilemaps/overworld_tilemap_dark.png (100%) rename intra/{src/res => assets/images}/tilemaps/overworld_tilemap_old.png (100%) rename intra/{src/res => assets/images}/tilemaps/redcave_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/redsea_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/space_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/street_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/suburb_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/terminal_tilemap.png (100%) rename intra/{src/res => assets/images}/tilemaps/train_tiles.png (100%) rename intra/{src/res => assets/images}/tilemaps/windmill_tilemap.png (100%) rename intra/{src/res => assets/images}/title/door.png (100%) rename intra/{src/res => assets/images}/title/door_glow.png (100%) rename intra/{src/res => assets/images}/title/door_spinglow1.png (100%) rename intra/{src/res => assets/images}/title/door_spinglow2.png (100%) rename intra/{src/res => assets/images}/title/intraisloading.png (100%) rename intra/{src/res => assets/images}/title/press_enter.png (100%) rename intra/{src/res => assets/images}/title/selector.png (100%) rename intra/{src/res => assets/images}/title/title_bg.png (100%) rename intra/{src/res => assets/images}/title/title_overlay1.png (100%) rename intra/{src/res => assets/images}/title/title_overlay2.png (100%) rename intra/{src/res => assets/images}/title/title_text.png (100%) rename intra/{src/res => assets/images}/title/title_text_white.png (100%) rename intra/{src/res => assets/images}/title/titlepicture.png (100%) rename intra/{src/res => assets/images}/title/titlepicture.xcf (100%) rename {mp3 => intra/assets/music}/OLD/gladys-esque.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/old-bedroom.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/old-boss.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/old-terminal.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/old-white-palace.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/old_happy.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/older-terminal.mp3 (100%) rename {mp3 => intra/assets/music}/OLD/older-white-palace.mp3 (100%) rename {mp3 => intra/assets/music}/anodyne_TRAILER_1.mp3 (100%) rename {mp3 => intra/assets/music}/apartment-boss.mp3 (100%) rename {mp3 => intra/assets/music}/apartment.mp3 (100%) rename {mp3 => intra/assets/music}/beach.mp3 (100%) rename {mp3 => intra/assets/music}/bedroom-boss.mp3 (100%) rename {mp3 => intra/assets/music}/bedroom.mp3 (100%) rename {mp3 => intra/assets/music}/blank.mp3 (100%) rename {mp3 => intra/assets/music}/blue.mp3 (100%) rename {mp3 => intra/assets/music}/boss.mp3 (100%) rename {mp3 => intra/assets/music}/briar-fight.mp3 (100%) rename {mp3 => intra/assets/music}/cell.mp3 (100%) rename {mp3 => intra/assets/music}/circus-boss.mp3 (100%) rename {mp3 => intra/assets/music}/circus.mp3 (100%) rename {mp3 => intra/assets/music}/cliff.mp3 (100%) rename {mp3 => intra/assets/music}/crowd.mp3 (100%) rename {mp3 => intra/assets/music}/crowd_boss.mp3 (100%) rename {mp3 => intra/assets/music}/ending.mp3 (100%) rename {mp3 => intra/assets/music}/fields.mp3 (100%) rename {mp3 => intra/assets/music}/forest.mp3 (100%) rename {mp3 => intra/assets/music}/gameover.mp3 (100%) rename {mp3 => intra/assets/music}/go.mp3 (100%) rename {mp3 => intra/assets/music}/happy-init.mp3 (100%) rename {mp3 => intra/assets/music}/happy.mp3 (100%) rename {mp3 => intra/assets/music}/hotel-boss.mp3 (100%) rename {mp3 => intra/assets/music}/hotel.mp3 (100%) rename {mp3 => intra/assets/music}/mitra.mp3 (100%) rename {mp3 => intra/assets/music}/nexus.mp3 (100%) rename {mp3 => intra/assets/music}/overworld.mp3 (100%) rename {mp3 => intra/assets/music}/pre_terminal.mp3 (100%) rename {mp3 => intra/assets/music}/red_cave.mp3 (100%) rename {mp3 => intra/assets/music}/red_sea.mp3 (100%) rename {mp3 => intra/assets/music}/redcave-boss.mp3 (100%) rename {mp3 => intra/assets/music}/roof.mp3 (100%) rename {mp3 => intra/assets/music}/sacrificial.mp3 (100%) rename {mp3 => intra/assets/music}/sagefight.mp3 (100%) rename {mp3 => intra/assets/music}/soft.mp3 (100%) rename {mp3 => intra/assets/music}/space.mp3 (100%) rename {mp3 => intra/assets/music}/street.mp3 (100%) rename {mp3 => intra/assets/music}/suburb.mp3 (100%) rename {mp3 => intra/assets/music}/terminal.mp3 (100%) rename {mp3 => intra/assets/music}/title.mp3 (100%) rename {mp3 => intra/assets/music}/windmill.mp3 (100%) rename {sfx => intra/assets/sounds}/4sht_pop.mp3 (100%) rename {sfx => intra/assets/sounds}/4sht_shoot.mp3 (100%) rename {sfx => intra/assets/sounds}/big_door_locked.mp3 (100%) rename {sfx => intra/assets/sounds}/big_wave.mp3 (100%) rename {sfx => intra/assets/sounds}/briar_shine.mp3 (100%) rename {sfx => intra/assets/sounds}/broom_hit.mp3 (100%) rename {sfx => intra/assets/sounds}/bubble_1.mp3 (100%) rename {sfx => intra/assets/sounds}/bubble_2.mp3 (100%) rename {sfx => intra/assets/sounds}/bubble_3.mp3 (100%) rename {sfx => intra/assets/sounds}/bubble_loop.mp3 (100%) rename {sfx => intra/assets/sounds}/bubble_triple.mp3 (100%) rename {sfx => intra/assets/sounds}/button_down.mp3 (100%) rename {sfx => intra/assets/sounds}/button_up.mp3 (100%) rename {sfx => intra/assets/sounds}/cicada_chirp.mp3 (100%) rename {sfx => intra/assets/sounds}/cross2.mp3 (100%) rename {sfx => intra/assets/sounds}/cross3.mp3 (100%) rename {sfx => intra/assets/sounds}/cross4.mp3 (100%) rename {sfx => intra/assets/sounds}/dash_pad_1.mp3 (100%) rename {sfx => intra/assets/sounds}/dash_pad_2.mp3 (100%) rename {sfx => intra/assets/sounds}/dialogue_blip.mp3 (100%) rename {sfx => intra/assets/sounds}/dialogue_bloop.mp3 (100%) rename {sfx => intra/assets/sounds}/dog_bark.mp3 (100%) rename {sfx => intra/assets/sounds}/dog_dash.mp3 (100%) rename {sfx => intra/assets/sounds}/dust_explode.mp3 (100%) rename {sfx => intra/assets/sounds}/dustmaid_alert.mp3 (100%) rename {sfx => intra/assets/sounds}/dustpoof.mp3 (100%) rename {sfx => intra/assets/sounds}/elevator_close.mp3 (100%) rename {sfx => intra/assets/sounds}/elevator_open.mp3 (100%) rename {sfx => intra/assets/sounds}/enter_Door.mp3 (100%) rename {sfx => intra/assets/sounds}/fall_1.mp3 (100%) rename {sfx => intra/assets/sounds}/fall_in_hole.mp3 (100%) rename {sfx => intra/assets/sounds}/fireball.mp3 (100%) rename {sfx => intra/assets/sounds}/flame_pillar.mp3 (100%) rename {sfx => intra/assets/sounds}/floor_crack.mp3 (100%) rename {sfx => intra/assets/sounds}/gasguy_move.mp3 (100%) rename {sfx => intra/assets/sounds}/gasguy_shoot.mp3 (100%) rename {sfx => intra/assets/sounds}/get_small_health.mp3 (100%) rename {sfx => intra/assets/sounds}/gettreasure.mp3 (100%) rename {sfx => intra/assets/sounds}/hit_ground_1.mp3 (100%) rename {sfx => intra/assets/sounds}/hit_slime.mp3 (100%) rename {sfx => intra/assets/sounds}/hit_wall.mp3 (100%) rename {sfx => intra/assets/sounds}/keyget.mp3 (100%) rename {sfx => intra/assets/sounds}/ladder_step_1.mp3 (100%) rename {sfx => intra/assets/sounds}/ladder_step_2.mp3 (100%) rename {sfx => intra/assets/sounds}/laser-pew.mp3 (100%) rename {sfx => intra/assets/sounds}/laser_charge.mp3 (100%) rename {sfx => intra/assets/sounds}/laser_fire.mp3 (100%) rename {sfx => intra/assets/sounds}/menu_move.mp3 (100%) rename {sfx => intra/assets/sounds}/menu_select.mp3 (100%) rename {sfx => intra/assets/sounds}/mover_die.mp3 (100%) rename {sfx => intra/assets/sounds}/mover_move.mp3 (100%) rename {sfx => intra/assets/sounds}/noise_step_1.mp3 (100%) rename {sfx => intra/assets/sounds}/on_off_laser_shoot.mp3 (100%) rename {sfx => intra/assets/sounds}/open.mp3 (100%) rename {sfx => intra/assets/sounds}/pause_sound.mp3 (100%) rename {sfx => intra/assets/sounds}/player_hit_1.mp3 (100%) rename {sfx => intra/assets/sounds}/player_jump_down.mp3 (100%) rename {sfx => intra/assets/sounds}/player_jump_up.mp3 (100%) rename {sfx => intra/assets/sounds}/puddle_down.mp3 (100%) rename {sfx => intra/assets/sounds}/puddle_step.mp3 (100%) rename {sfx => intra/assets/sounds}/puddle_up.mp3 (100%) rename {sfx => intra/assets/sounds}/pushblock.mp3 (100%) rename {sfx => intra/assets/sounds}/rain.mp3 (100%) rename {sfx => intra/assets/sounds}/rat_move.mp3 (100%) rename {sfx => intra/assets/sounds}/red_cave_rise.mp3 (100%) rename {sfx => intra/assets/sounds}/redboss_death.mp3 (100%) rename {sfx => intra/assets/sounds}/redboss_moan.mp3 (100%) rename {sfx => intra/assets/sounds}/sb_ball_appear.mp3 (100%) rename {sfx => intra/assets/sounds}/sb_dash.mp3 (100%) rename {sfx => intra/assets/sounds}/sb_hurt.mp3 (100%) rename {sfx => intra/assets/sounds}/sb_split.mp3 (100%) rename {sfx => intra/assets/sounds}/sf_move.mp3 (100%) rename {sfx => intra/assets/sounds}/shieldy-hit.mp3 (100%) rename {sfx => intra/assets/sounds}/shieldy_ineffective.mp3 (100%) rename {sfx => intra/assets/sounds}/slasher_atk.mp3 (100%) rename {sfx => intra/assets/sounds}/slime_shoot.mp3 (100%) rename {sfx => intra/assets/sounds}/slime_splash.mp3 (100%) rename {sfx => intra/assets/sounds}/slime_walk.mp3 (100%) rename {sfx => intra/assets/sounds}/small_wave.mp3 (100%) rename {sfx => intra/assets/sounds}/space.mp3 (100%) rename {sfx => intra/assets/sounds}/sparkle_1.mp3 (100%) rename {sfx => intra/assets/sounds}/sparkle_2.mp3 (100%) rename {sfx => intra/assets/sounds}/sparkle_3.mp3 (100%) rename {sfx => intra/assets/sounds}/spring_bounce.mp3 (100%) rename {sfx => intra/assets/sounds}/stream.mp3 (100%) rename {sfx => intra/assets/sounds}/sun_guy_charge.mp3 (100%) rename {sfx => intra/assets/sounds}/sun_guy_death_long.mp3 (100%) rename {sfx => intra/assets/sounds}/sun_guy_death_short.mp3 (100%) rename {sfx => intra/assets/sounds}/sun_guy_scream.mp3 (100%) rename {sfx => intra/assets/sounds}/sun_guy_scream2.mp3 (100%) rename {sfx => intra/assets/sounds}/swing_broom_1.mp3 (100%) rename {sfx => intra/assets/sounds}/swing_broom_2.mp3 (100%) rename {sfx => intra/assets/sounds}/swing_broom_3.mp3 (100%) rename {sfx => intra/assets/sounds}/talk_1.mp3 (100%) rename {sfx => intra/assets/sounds}/talk_2.mp3 (100%) rename {sfx => intra/assets/sounds}/talk_3.mp3 (100%) rename {sfx => intra/assets/sounds}/talk_death.mp3 (100%) rename {sfx => intra/assets/sounds}/teleguy_down.mp3 (100%) rename {sfx => intra/assets/sounds}/teleguy_up.mp3 (100%) rename {sfx => intra/assets/sounds}/teleport_down.mp3 (100%) rename {sfx => intra/assets/sounds}/teleport_up.mp3 (100%) rename {sfx => intra/assets/sounds}/unlock.mp3 (100%) rename {sfx => intra/assets/sounds}/water_step.mp3 (100%) rename {sfx => intra/assets/sounds}/wavesandwind.mp3 (100%) rename {sfx => intra/assets/sounds}/wb_hit_ground.mp3 (100%) rename {sfx => intra/assets/sounds}/wb_moan.mp3 (100%) rename {sfx => intra/assets/sounds}/wb_moan_2.mp3 (100%) rename {sfx => intra/assets/sounds}/wb_shoot.mp3 (100%) rename {sfx => intra/assets/sounds}/wb_tap_ground.mp3 (100%) rename intra/{bin => }/icons/1024.jpg (100%) rename intra/{bin => }/icons/1024.png (100%) rename intra/{bin => }/icons/114.png (100%) rename intra/{bin => }/icons/144.png (100%) rename intra/{bin => }/icons/22_29.png (100%) rename intra/{bin => }/icons/320.png (100%) rename intra/{bin => }/icons/44_58.png (100%) rename intra/{bin => }/icons/58.png (100%) rename intra/{bin => }/icons/64.png (100%) rename intra/{bin => }/icons/640.png (100%) rename intra/{bin => }/icons/72.png (100%) rename intra/{bin => }/icons/96.png (100%) rename intra/{bin => }/icons/IntraAIR128.png (100%) rename intra/{bin => }/icons/IntraAIR29.png (100%) rename intra/{bin => }/icons/IntraAIR32.png (100%) rename intra/{bin => }/icons/IntraAIR48.png (100%) rename intra/{bin => }/icons/IntraAIR512.png (100%) rename intra/{bin => }/icons/IntraAIR57.png (100%) rename intra/{bin => }/icons/ouya_icon.png (100%) create mode 100644 intra/source/Intra.hx create mode 100644 intra/source/Main.hx create mode 100644 intra/source/Preloader.hx create mode 100644 intra/source/Save.hx create mode 100644 intra/source/awerwer/com.zip create mode 100644 intra/source/awerwer/com/FRESteamWorksLibLinux.swc create mode 100644 intra/source/awerwer/com/FRESteamWorksTest.hx create mode 100644 intra/source/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx create mode 100644 intra/source/awerwer/com/amanitadesign/steam/Assets/descriptor.xml create mode 100644 intra/source/awerwer/com/amanitadesign/steam/FRESteamWorks.hx create mode 100644 intra/source/awerwer/com/amanitadesign/steam/SteamConstants.hx create mode 100644 intra/source/awerwer/com/amanitadesign/steam/SteamEvent.hx create mode 100644 intra/source/buildmap.py create mode 100644 intra/source/ca/wegetsignal/nativeextensions/MacJoystick.hx create mode 100644 intra/source/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx create mode 100644 intra/source/ca/wegetsignal/nativeextensions/MacJoystickManager.hx create mode 100644 intra/source/com/FRESteamWorksLibLinux.swc create mode 100644 intra/source/com/FRESteamWorksTest.hx create mode 100644 intra/source/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx create mode 100644 intra/source/com/amanitadesign/steam/Assets/descriptor.xml create mode 100644 intra/source/com/amanitadesign/steam/FRESteamWorks.hx create mode 100644 intra/source/com/amanitadesign/steam/SteamConstants.hx create mode 100644 intra/source/com/amanitadesign/steam/SteamEvent.hx create mode 100644 intra/source/com/amanitadesign/steam/old/FRESteamWorks.hx create mode 100644 intra/source/com/amanitadesign/steam/old/SteamConstants.hx create mode 100644 intra/source/com/amanitadesign/steam/old/SteamEvent.hx create mode 100644 intra/source/csv/APARTMENT_BG.csv create mode 100644 intra/source/csv/APARTMENT_BG2.csv create mode 100644 intra/source/csv/APARTMENT_FG.csv create mode 100644 intra/source/csv/BEACH_BG.csv create mode 100644 intra/source/csv/BEACH_BG2.csv create mode 100644 intra/source/csv/BEACH_FG.csv create mode 100644 intra/source/csv/BEDROOM_BG.csv create mode 100644 intra/source/csv/BEDROOM_BG2.csv create mode 100644 intra/source/csv/BEDROOM_FG.csv create mode 100644 intra/source/csv/BLANK_BG.csv create mode 100644 intra/source/csv/BLUE_BG.csv create mode 100644 intra/source/csv/BLUE_BG2.csv create mode 100644 intra/source/csv/BLUE_FG.csv create mode 100644 intra/source/csv/CIRCUS_BG.csv create mode 100644 intra/source/csv/CIRCUS_BG2.csv create mode 100644 intra/source/csv/CIRCUS_FG.csv create mode 100644 intra/source/csv/CLIFF_BG.csv create mode 100644 intra/source/csv/CLIFF_BG2.csv create mode 100644 intra/source/csv/CROWD_BG.csv create mode 100644 intra/source/csv/CROWD_BG2.csv create mode 100644 intra/source/csv/CROWD_FG.csv create mode 100644 intra/source/csv/DEBUG_BG.csv create mode 100644 intra/source/csv/DEBUG_BG2.csv create mode 100644 intra/source/csv/DEBUG_FG.csv create mode 100644 intra/source/csv/DRAWER_BG.csv create mode 100644 intra/source/csv/DRAWER_BG2.csv create mode 100644 intra/source/csv/DRAWER_FG.csv create mode 100644 intra/source/csv/FIELDS_BG.csv create mode 100644 intra/source/csv/FIELDS_BG2.csv create mode 100644 intra/source/csv/FIELDS_FG.csv create mode 100644 intra/source/csv/FOREST_BG.csv create mode 100644 intra/source/csv/FOREST_BG2.csv create mode 100644 intra/source/csv/FOREST_FG.csv create mode 100644 intra/source/csv/GO_BG.csv create mode 100644 intra/source/csv/GO_BG2.csv create mode 100644 intra/source/csv/GO_BG2_old.csv create mode 100644 intra/source/csv/GO_FG.csv create mode 100644 intra/source/csv/HAPPY_BG.csv create mode 100644 intra/source/csv/HAPPY_BG2.csv create mode 100644 intra/source/csv/HAPPY_FG.csv create mode 100644 intra/source/csv/HOTEL_BG.csv create mode 100644 intra/source/csv/HOTEL_BG2.csv create mode 100644 intra/source/csv/HOTEL_FG.csv create mode 100644 intra/source/csv/Minimap_Apartment.csv create mode 100644 intra/source/csv/Minimap_Beach.csv create mode 100644 intra/source/csv/Minimap_Bedroom.csv create mode 100644 intra/source/csv/Minimap_Cell.csv create mode 100644 intra/source/csv/Minimap_Circus.csv create mode 100644 intra/source/csv/Minimap_Cliff.csv create mode 100644 intra/source/csv/Minimap_Crowd.csv create mode 100644 intra/source/csv/Minimap_Fields.csv create mode 100644 intra/source/csv/Minimap_Forest.csv create mode 100644 intra/source/csv/Minimap_Hotel.csv create mode 100644 intra/source/csv/Minimap_Overworld.csv create mode 100644 intra/source/csv/Minimap_Redcave.csv create mode 100644 intra/source/csv/Minimap_Redsea.csv create mode 100644 intra/source/csv/Minimap_Space.csv create mode 100644 intra/source/csv/Minimap_Street.csv create mode 100644 intra/source/csv/Minimap_Suburb.csv create mode 100644 intra/source/csv/Minimap_Terminal.csv create mode 100644 intra/source/csv/NEXUS_BG.csv create mode 100644 intra/source/csv/NEXUS_BG2.csv create mode 100644 intra/source/csv/NEXUS_FG.csv create mode 100644 intra/source/csv/OVERWORLD_BG.csv create mode 100644 intra/source/csv/OVERWORLD_BG2.csv create mode 100644 intra/source/csv/OVERWORLD_FG.csv create mode 100644 intra/source/csv/REDCAVE_BG.csv create mode 100644 intra/source/csv/REDCAVE_BG2.csv create mode 100644 intra/source/csv/REDCAVE_FG.csv create mode 100644 intra/source/csv/REDSEA_BG.csv create mode 100644 intra/source/csv/REDSEA_BG2.csv create mode 100644 intra/source/csv/REDSEA_FG.csv create mode 100644 intra/source/csv/SPACE_BG.csv create mode 100644 intra/source/csv/SPACE_BG2.csv create mode 100644 intra/source/csv/SPACE_FG.csv create mode 100644 intra/source/csv/STREET_BG.csv create mode 100644 intra/source/csv/STREET_BG2.csv create mode 100644 intra/source/csv/STREET_FG.csv create mode 100644 intra/source/csv/SUBURB_BG.csv create mode 100644 intra/source/csv/SUBURB_BG2.csv create mode 100644 intra/source/csv/SUBURB_FG.csv create mode 100644 intra/source/csv/TERMINAL_BG.csv create mode 100644 intra/source/csv/TERMINAL_BG2.csv create mode 100644 intra/source/csv/TERMINAL_FG.csv create mode 100644 intra/source/csv/TRAIN_BG.csv create mode 100644 intra/source/csv/TRAIN_BG2.csv create mode 100644 intra/source/csv/TRAIN_FG.csv create mode 100644 intra/source/csv/WINDMILL_BG.csv create mode 100644 intra/source/csv/WINDMILL_BG2.csv create mode 100644 intra/source/csv/WINDMILL_FG.csv create mode 100644 intra/source/data/CLASS_ID.hx create mode 100644 intra/source/data/CSV_Data.hx create mode 100644 intra/source/data/Common_Sprites.hx create mode 100644 intra/source/data/NPC_Data_EN.hx create mode 100644 intra/source/data/NPC_Data_ES.hx create mode 100644 intra/source/data/NPC_Data_IT.hx create mode 100644 intra/source/data/NPC_Data_JP.hx create mode 100644 intra/source/data/NPC_Data_KR.hx create mode 100644 intra/source/data/NPC_Data_PT.hx create mode 100644 intra/source/data/NPC_Data_ZHS.hx create mode 100644 intra/source/data/SoundData.hx create mode 100644 intra/source/data/TileData.hx create mode 100644 intra/source/data/dialogue_EN.txt create mode 100644 intra/source/data/dialogue_ES.txt create mode 100644 intra/source/data/dialogue_IT.txt create mode 100644 intra/source/data/dialogue_ZHS.txt create mode 100644 intra/source/data/dialogue_jp.txt create mode 100644 intra/source/data/dialogue_pt-br.txt create mode 100644 intra/source/data/gen_npc.py create mode 100644 intra/source/data/kr/dialogue_kr.py create mode 100644 intra/source/data/kr/make_kr_npc_data.bat create mode 100644 intra/source/data/make_npc_data.bat create mode 100644 intra/source/entity/decoration/Eye_Light.hx create mode 100644 intra/source/entity/decoration/Light.hx create mode 100644 intra/source/entity/decoration/Map_Preview.hx create mode 100644 intra/source/entity/decoration/Nonsolid.hx create mode 100644 intra/source/entity/decoration/RetroEffect.hx create mode 100644 intra/source/entity/decoration/Solid_Sprite.hx create mode 100644 intra/source/entity/decoration/Water_Anim.hx create mode 100644 intra/source/entity/enemy/apartment/Dash_Trap.hx create mode 100644 intra/source/entity/enemy/apartment/Gasguy.hx create mode 100644 intra/source/entity/enemy/apartment/Rat.hx create mode 100644 intra/source/entity/enemy/apartment/Silverfish.hx create mode 100644 intra/source/entity/enemy/apartment/Splitboss.hx create mode 100644 intra/source/entity/enemy/apartment/Teleguy.hx create mode 100644 intra/source/entity/enemy/bedroom/Annoyer.hx create mode 100644 intra/source/entity/enemy/bedroom/Pew_Laser.hx create mode 100644 intra/source/entity/enemy/bedroom/Shieldy.hx create mode 100644 intra/source/entity/enemy/bedroom/Slime.hx create mode 100644 intra/source/entity/enemy/bedroom/Sun_Guy.hx create mode 100644 intra/source/entity/enemy/circus/Circus_Folks.hx create mode 100644 intra/source/entity/enemy/circus/Contort.hx create mode 100644 intra/source/entity/enemy/circus/Fire_Pillar.hx create mode 100644 intra/source/entity/enemy/circus/Lion.hx create mode 100644 intra/source/entity/enemy/crowd/Dog.hx create mode 100644 intra/source/entity/enemy/crowd/Frog.hx create mode 100644 intra/source/entity/enemy/crowd/Person.hx create mode 100644 intra/source/entity/enemy/crowd/Rotator.hx create mode 100644 intra/source/entity/enemy/crowd/Spike_Roller.hx create mode 100644 intra/source/entity/enemy/crowd/WallBoss.hx create mode 100644 intra/source/entity/enemy/etc/Briar_Boss.hx create mode 100644 intra/source/entity/enemy/etc/Chaser.hx create mode 100644 intra/source/entity/enemy/etc/ControlsDeity.hx create mode 100644 intra/source/entity/enemy/etc/Follower_Bro.hx create mode 100644 intra/source/entity/enemy/etc/Red_Walker.hx create mode 100644 intra/source/entity/enemy/etc/Sadbro.hx create mode 100644 intra/source/entity/enemy/etc/Sage_Boss.hx create mode 100644 intra/source/entity/enemy/etc/Space_Face.hx create mode 100644 intra/source/entity/enemy/etc/Wall_Laser.hx create mode 100644 intra/source/entity/enemy/hotel/Burst_Plant.hx create mode 100644 intra/source/entity/enemy/hotel/Dustmaid.hx create mode 100644 intra/source/entity/enemy/hotel/Eye_Boss.hx create mode 100644 intra/source/entity/enemy/hotel/Steam_Pipe.hx create mode 100644 intra/source/entity/enemy/redcave/Four_Shooter.hx create mode 100644 intra/source/entity/enemy/redcave/Mover.hx create mode 100644 intra/source/entity/enemy/redcave/On_Off_Laser.hx create mode 100644 intra/source/entity/enemy/redcave/Red_Boss.hx create mode 100644 intra/source/entity/enemy/redcave/Slasher.hx create mode 100644 intra/source/entity/enemy/suburb/Suburb_Killer.hx create mode 100644 intra/source/entity/enemy/suburb/Suburb_Walker.hx create mode 100644 intra/source/entity/gadget/Big_Door.hx create mode 100644 intra/source/entity/gadget/Button.hx create mode 100644 intra/source/entity/gadget/Challenge_Gate.hx create mode 100644 intra/source/entity/gadget/Checkpoint.hx create mode 100644 intra/source/entity/gadget/Console.hx create mode 100644 intra/source/entity/gadget/CrackedTile.hx create mode 100644 intra/source/entity/gadget/Dash_Pad.hx create mode 100644 intra/source/entity/gadget/Door.hx create mode 100644 intra/source/entity/gadget/Dust.hx create mode 100644 intra/source/entity/gadget/Gate.hx create mode 100644 intra/source/entity/gadget/Go_Detector.hx create mode 100644 intra/source/entity/gadget/Growth_Gate.hx create mode 100644 intra/source/entity/gadget/Hole.hx create mode 100644 intra/source/entity/gadget/Jump_Trigger.hx create mode 100644 intra/source/entity/gadget/Key.hx create mode 100644 intra/source/entity/gadget/KeyBlock.hx create mode 100644 intra/source/entity/gadget/Pillar_Switch.hx create mode 100644 intra/source/entity/gadget/Propelled.hx create mode 100644 intra/source/entity/gadget/SinglePushBlock.hx create mode 100644 intra/source/entity/gadget/Stop_Marker.hx create mode 100644 intra/source/entity/gadget/Switch_Pillar.hx create mode 100644 intra/source/entity/gadget/Treasure.hx create mode 100644 intra/source/entity/interactive/Black_Thing.hx create mode 100644 intra/source/entity/interactive/Dungeon_Statue.hx create mode 100644 intra/source/entity/interactive/Elevator.hx create mode 100644 intra/source/entity/interactive/Fisherman.hx create mode 100644 intra/source/entity/interactive/Health_Cicada.hx create mode 100644 intra/source/entity/interactive/NPC.hx create mode 100644 intra/source/entity/interactive/Red_Pillar.hx create mode 100644 intra/source/entity/interactive/Terminal_Gate.hx create mode 100644 intra/source/entity/interactive/npc/Forest_NPC.hx create mode 100644 intra/source/entity/interactive/npc/Happy_NPC.hx create mode 100644 intra/source/entity/interactive/npc/Huge_Fucking_Stag.hx create mode 100644 intra/source/entity/interactive/npc/Mitra.hx create mode 100644 intra/source/entity/interactive/npc/Redsea_NPC.hx create mode 100644 intra/source/entity/interactive/npc/Sage.hx create mode 100644 intra/source/entity/interactive/npc/Shadow_Briar.hx create mode 100644 intra/source/entity/interactive/npc/Space_NPC.hx create mode 100644 intra/source/entity/interactive/npc/Trade_NPC.hx create mode 100644 intra/source/entity/player/Broom.hx create mode 100644 intra/source/entity/player/Foot_Overlay.hx create mode 100644 intra/source/entity/player/HealthBar.hx create mode 100644 intra/source/entity/player/HealthPickup.hx create mode 100644 intra/source/entity/player/Miniminimap.hx create mode 100644 intra/source/entity/player/Player.hx create mode 100644 intra/source/entity/player/Transformer.hx create mode 100644 intra/source/extension/JoyQuery/Joystick.hx create mode 100644 intra/source/global/Keys.hx create mode 100644 intra/source/global/Registry.hx create mode 100644 intra/source/helper/ANEFix.hx create mode 100644 intra/source/helper/Achievements.hx create mode 100644 intra/source/helper/Cutscene.hx create mode 100644 intra/source/helper/DH.hx create mode 100644 intra/source/helper/EventScripts.hx create mode 100644 intra/source/helper/Joypad_Config_Group.hx create mode 100644 intra/source/helper/Parabola_Thing.hx create mode 100644 intra/source/helper/S_NPC.hx create mode 100644 intra/source/helper/ScreenFade.hx create mode 100644 intra/source/helper/SpriteFactory.hx create mode 100644 intra/source/helper/SteamThing.hx create mode 100644 intra/source/helper/UI_Offsets.hx create mode 100644 intra/source/helper/invertRGB.pbj create mode 100644 intra/source/helper/static.pbj create mode 100644 intra/source/lua/Intra.lua create mode 100644 intra/source/lua/Intra_settings.lua create mode 100644 intra/source/lua/csvTilemap.lua create mode 100644 intra/source/lua/csvTilemap_settings.lua create mode 100644 intra/source/noairSave.hx create mode 100644 intra/source/org/flixel/AnoSprite.hx create mode 100644 intra/source/org/flixel/FlxBasic.hx create mode 100644 intra/source/org/flixel/FlxButton.hx create mode 100644 intra/source/org/flixel/FlxCamera.hx create mode 100644 intra/source/org/flixel/FlxEmitter.hx create mode 100644 intra/source/org/flixel/FlxG.hx create mode 100644 intra/source/org/flixel/FlxGame.hx create mode 100644 intra/source/org/flixel/FlxGroup.hx create mode 100644 intra/source/org/flixel/FlxObject.hx create mode 100644 intra/source/org/flixel/FlxParticle.hx create mode 100644 intra/source/org/flixel/FlxPath.hx create mode 100644 intra/source/org/flixel/FlxPoint.hx create mode 100644 intra/source/org/flixel/FlxRect.hx create mode 100644 intra/source/org/flixel/FlxSave.hx create mode 100644 intra/source/org/flixel/FlxSound.hx create mode 100644 intra/source/org/flixel/FlxSprite.hx create mode 100644 intra/source/org/flixel/FlxState.hx create mode 100644 intra/source/org/flixel/FlxText.hx create mode 100644 intra/source/org/flixel/FlxTileblock.hx create mode 100644 intra/source/org/flixel/FlxTilemap.hx create mode 100644 intra/source/org/flixel/FlxTimer.hx create mode 100644 intra/source/org/flixel/FlxU.hx create mode 100644 intra/source/org/flixel/data/autotiles.png create mode 100644 intra/source/org/flixel/data/autotiles_alt.png create mode 100644 intra/source/org/flixel/data/beep.mp3 create mode 100644 intra/source/org/flixel/data/button.png create mode 100644 intra/source/org/flixel/data/cursor.png create mode 100644 intra/source/org/flixel/data/default.png create mode 100644 intra/source/org/flixel/data/handle.png create mode 100644 intra/source/org/flixel/data/logo.png create mode 100644 intra/source/org/flixel/data/logo_corners.png create mode 100644 intra/source/org/flixel/data/logo_light.png create mode 100644 intra/source/org/flixel/data/nokiafc22.ttf create mode 100644 intra/source/org/flixel/data/vcr/flixel.png create mode 100644 intra/source/org/flixel/data/vcr/open.png create mode 100644 intra/source/org/flixel/data/vcr/pause.png create mode 100644 intra/source/org/flixel/data/vcr/play.png create mode 100644 intra/source/org/flixel/data/vcr/record_off.png create mode 100644 intra/source/org/flixel/data/vcr/record_on.png create mode 100644 intra/source/org/flixel/data/vcr/restart.png create mode 100644 intra/source/org/flixel/data/vcr/step.png create mode 100644 intra/source/org/flixel/data/vcr/stop.png create mode 100644 intra/source/org/flixel/data/vis/bounds.png create mode 100644 intra/source/org/flixel/plugin/DebugPathDisplay.hx create mode 100644 intra/source/org/flixel/plugin/TimerManager.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/API/FlxKongregate.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/BaseFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/BlurFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/GlitchFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/RevealFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxBar.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxBitmapFont.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxButtonPlus.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxCollision.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxColor.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxControl.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxControlHandler.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxCoreUtils.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxDelay.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxDisplay.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxExplode.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxFlectrum.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxFlod.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxGradient.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxGridOverlay.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxMath.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxMouseControl.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxPowerTools.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxScreenGrab.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxScrollZone.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxScrollingText.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxSpecialFX.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxVelocity.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/FlxWeapon.hx create mode 100644 intra/source/org/flixel/plugin/photonstorm/PNGEncoder.hx create mode 100644 intra/source/org/flixel/system/FlxAnim.hx create mode 100644 intra/source/org/flixel/system/FlxDebugger.hx create mode 100644 intra/source/org/flixel/system/FlxList.hx create mode 100644 intra/source/org/flixel/system/FlxPreloader.hx create mode 100644 intra/source/org/flixel/system/FlxQuadTree.hx create mode 100644 intra/source/org/flixel/system/FlxReplay.hx create mode 100644 intra/source/org/flixel/system/FlxTile.hx create mode 100644 intra/source/org/flixel/system/FlxTilemapBuffer.hx create mode 100644 intra/source/org/flixel/system/FlxWindow.hx create mode 100644 intra/source/org/flixel/system/ObjectPool.hx create mode 100644 intra/source/org/flixel/system/debug/Log.hx create mode 100644 intra/source/org/flixel/system/debug/Perf.hx create mode 100644 intra/source/org/flixel/system/debug/VCR.hx create mode 100644 intra/source/org/flixel/system/debug/Vis.hx create mode 100644 intra/source/org/flixel/system/debug/Watch.hx create mode 100644 intra/source/org/flixel/system/debug/WatchEntry.hx create mode 100644 intra/source/org/flixel/system/input/Input.hx create mode 100644 intra/source/org/flixel/system/input/Keyboard.hx create mode 100644 intra/source/org/flixel/system/input/Mouse.hx create mode 100644 intra/source/org/flixel/system/replay/FrameRecord.hx create mode 100644 intra/source/org/flixel/system/replay/MouseRecord.hx create mode 100644 intra/source/states/ControlsState.hx create mode 100644 intra/source/states/DialogueState.hx create mode 100644 intra/source/states/EndingState.hx create mode 100644 intra/source/states/IntroScene.hx create mode 100644 intra/source/states/MinimapState.hx create mode 100644 intra/source/states/MobileConfig.hx create mode 100644 intra/source/states/PauseState.hx create mode 100644 intra/source/states/PlayState.hx create mode 100644 intra/source/states/PushableFlxState.hx create mode 100644 intra/source/states/RoamState.hx create mode 100644 intra/source/states/TitleState.hx create mode 100644 intra/source/states/noairPauseState.hx create mode 100644 intra/source/xml/Intra.xml diff --git a/.gitignore b/.gitignore index 84ae0c3..e13fcba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ installation files intra/air intra/dist +intra/export intra/Anodyne_standalone intra/bin/Anodyne.swf intra/mobile_PAX_Intra.dam @@ -17,4 +18,4 @@ intra/Anodyne_Only_Joy_1_506.exe intra/commits.txt intra/_weirdbinthings intra/Anodyne_store_new.ipa -intra/Anodyne_Windows_1_511.zip \ No newline at end of file +intra/Anodyne_Windows_1_511.zip diff --git a/CODEGUIDE.md b/AIR/CODEGUIDE.md similarity index 100% rename from CODEGUIDE.md rename to AIR/CODEGUIDE.md diff --git a/FAQ.md b/AIR/FAQ.md similarity index 100% rename from FAQ.md rename to AIR/FAQ.md diff --git a/Installation.md b/AIR/Installation.md similarity index 100% rename from Installation.md rename to AIR/Installation.md diff --git a/LICENSE.md b/AIR/LICENSE.md similarity index 100% rename from LICENSE.md rename to AIR/LICENSE.md diff --git a/README.md b/AIR/README.md similarity index 100% rename from README.md rename to AIR/README.md diff --git a/USING LEVEL EDITOR.md b/AIR/USING LEVEL EDITOR.md similarity index 100% rename from USING LEVEL EDITOR.md rename to AIR/USING LEVEL EDITOR.md diff --git a/intra/Intra-AIR.as3proj b/AIR/intra/Intra-AIR.as3proj similarity index 100% rename from intra/Intra-AIR.as3proj rename to AIR/intra/Intra-AIR.as3proj diff --git a/intra/Intra.dam b/AIR/intra/Intra.dam similarity index 100% rename from intra/Intra.dam rename to AIR/intra/Intra.dam diff --git a/intra/Minimaps.dam b/AIR/intra/Minimaps.dam similarity index 100% rename from intra/Minimaps.dam rename to AIR/intra/Minimaps.dam diff --git a/intra/PackageApp.bat b/AIR/intra/PackageApp.bat similarity index 100% rename from intra/PackageApp.bat rename to AIR/intra/PackageApp.bat diff --git a/intra/Run.bat b/AIR/intra/Run.bat similarity index 100% rename from intra/Run.bat rename to AIR/intra/Run.bat diff --git a/intra/RunMobile.bat b/AIR/intra/RunMobile.bat similarity index 100% rename from intra/RunMobile.bat rename to AIR/intra/RunMobile.bat diff --git a/intra/Z_HELP.txt b/AIR/intra/Z_HELP.txt similarity index 100% rename from intra/Z_HELP.txt rename to AIR/intra/Z_HELP.txt diff --git a/intra/bat/CreateCertificate.bat b/AIR/intra/bat/CreateCertificate.bat similarity index 100% rename from intra/bat/CreateCertificate.bat rename to AIR/intra/bat/CreateCertificate.bat diff --git a/intra/bat/InstallAirRuntime.bat b/AIR/intra/bat/InstallAirRuntime.bat similarity index 100% rename from intra/bat/InstallAirRuntime.bat rename to AIR/intra/bat/InstallAirRuntime.bat diff --git a/intra/bat/InstallGame.bat b/AIR/intra/bat/InstallGame.bat similarity index 100% rename from intra/bat/InstallGame.bat rename to AIR/intra/bat/InstallGame.bat diff --git a/intra/bat/PackagerExe.bat b/AIR/intra/bat/PackagerExe.bat similarity index 100% rename from intra/bat/PackagerExe.bat rename to AIR/intra/bat/PackagerExe.bat diff --git a/intra/bat/SetupApplication.bat b/AIR/intra/bat/SetupApplication.bat similarity index 100% rename from intra/bat/SetupApplication.bat rename to AIR/intra/bat/SetupApplication.bat diff --git a/intra/bat/SetupApplication_Mac.bat b/AIR/intra/bat/SetupApplication_Mac.bat similarity index 100% rename from intra/bat/SetupApplication_Mac.bat rename to AIR/intra/bat/SetupApplication_Mac.bat diff --git a/intra/bat/SetupSDK.bat b/AIR/intra/bat/SetupSDK.bat similarity index 100% rename from intra/bat/SetupSDK.bat rename to AIR/intra/bat/SetupSDK.bat diff --git a/intra/bat/SetupSDK_Mac.bat b/AIR/intra/bat/SetupSDK_Mac.bat similarity index 100% rename from intra/bat/SetupSDK_Mac.bat rename to AIR/intra/bat/SetupSDK_Mac.bat diff --git a/intra/bat/mCreateCertificate.bat b/AIR/intra/bat/mCreateCertificate.bat similarity index 100% rename from intra/bat/mCreateCertificate.bat rename to AIR/intra/bat/mCreateCertificate.bat diff --git a/intra/bat/mPackager.bat b/AIR/intra/bat/mPackager.bat similarity index 100% rename from intra/bat/mPackager.bat rename to AIR/intra/bat/mPackager.bat diff --git a/intra/bat/mRun.bat b/AIR/intra/bat/mRun.bat similarity index 100% rename from intra/bat/mRun.bat rename to AIR/intra/bat/mRun.bat diff --git a/intra/bat/mSetupApplication.bat b/AIR/intra/bat/mSetupApplication.bat similarity index 100% rename from intra/bat/mSetupApplication.bat rename to AIR/intra/bat/mSetupApplication.bat diff --git a/intra/bat/mSetupSDK.bat b/AIR/intra/bat/mSetupSDK.bat similarity index 100% rename from intra/bat/mSetupSDK.bat rename to AIR/intra/bat/mSetupSDK.bat diff --git a/intra/bin/Default-568h@2x.png b/AIR/intra/bin/Default-568h@2x.png similarity index 100% rename from intra/bin/Default-568h@2x.png rename to AIR/intra/bin/Default-568h@2x.png diff --git a/intra/bin/Default.png b/AIR/intra/bin/Default.png similarity index 100% rename from intra/bin/Default.png rename to AIR/intra/bin/Default.png diff --git a/intra/bin/joyquery.exe b/AIR/intra/bin/joyquery.exe similarity index 100% rename from intra/bin/joyquery.exe rename to AIR/intra/bin/joyquery.exe diff --git a/intra/bin/js/swfobject.js b/AIR/intra/bin/js/swfobject.js similarity index 100% rename from intra/bin/js/swfobject.js rename to AIR/intra/bin/js/swfobject.js diff --git a/AIR/intra/hsrc/awerwer/com/FRESteamWorksTest.hx b/AIR/intra/hsrc/awerwer/com/FRESteamWorksTest.hx new file mode 100644 index 0000000..ee5248f --- /dev/null +++ b/AIR/intra/hsrc/awerwer/com/FRESteamWorksTest.hx @@ -0,0 +1,115 @@ +package; + +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; + +import flash.display.SimpleButton; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.text.TextField; +import flash.utils.ByteArray; + +class FRESteamWorksTest extends Sprite +{ + public var Steamworks:FRESteamWorks=new FRESteamWorks(); + public var tf:TextField; + public function new() + { + tf=new TextField(); + tf.width=stage.stageWidth; + tf.height=stage.stageHeight; + addChild(tf); + + tf.addEventListener(MouseEvent.MOUSE_DOWN, onClick); + + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + + if(Steamworks.init()){ + log("STEAMWORKS API is available\n"); + + //comment.. current stats and achievement ids are from steam example app which is provided with their SDK + log("isAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.isAchievement("ACH_WIN_ONE_GAME")); + log("isAchievement('ACH_TRAVEL_FAR_SINGLE')=="+Steamworks.isAchievement("ACH_TRAVEL_FAR_SINGLE")); + log("setStatFloat('FeetTraveled')=="+Steamworks.setStatFloat('FeetTraveled', 21.3)); + log("setStatInt('NumGames', 2)=="+Steamworks.setStatInt('NumGames', 2)); + Steamworks.storeStats(); + log("getStatInt('NumGames')=="+Steamworks.getStatInt('NumGames')); + log("getStatFloat('FeetTraveled')=="+Steamworks.getStatFloat('FeetTraveled')); + + log("setCloudEnabledForApp(false)=="+Steamworks.setCloudEnabledForApp(false)); + log("setCloudEnabledForApp(true)=="+Steamworks.setCloudEnabledForApp(true)); + log("isCloudEnabledForApp()=="+Steamworks.isCloudEnabledForApp()); + log("getFileCount()=="+Steamworks.getFileCount()); + log("fileExists('test.txt')=="+Steamworks.fileExists('test.txt')); + + //comment.. writing to app with id 480 is somehow not working, but works with our real appId + log("writeFileToCloud('test.txt','hello steam')=="+writeFileToCloud('test.txt','hello steam')); + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + //----------- + + //Steamworks.requestStats(); + Steamworks.resetAllStats(true); + }else { + tf.appendText("STEAMWORKS API is NOT available\n"); + } + + } + private function log(value:String):Void{ + tf.appendText(value+"\n"); + tf.scrollV=tf.maxScrollV; + } + public function writeFileToCloud(fileName:String, data:String):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeUTFBytes(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public function readFileFromCloud(fileName:String):String { + var dataIn:ByteArray=new ByteArray(); + var result:String; + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + result=dataIn.readUTFBytes(dataIn.length); + } + return result; + } + + public function onClick(e:MouseEvent):Void{ + log("--click--"); + if(Steamworks.isReady){ + if(!Steamworks.isAchievement("ACH_WIN_ONE_GAME")){ + log("setAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.setAchievement("ACH_WIN_ONE_GAME")); + } else { + log("clearAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.clearAchievement("ACH_WIN_ONE_GAME")); + } + if(Steamworks.fileExists('test.txt')){ + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + log("Steamworks.fileDelete('test.txt')=="+Steamworks.fileDelete('test.txt')); + } else { + log("writeFileToCloud('test.txt','click')=="+writeFileToCloud('test.txt','click')); + } + //Steamworks.storeStats(); + } else { + log("not able to set achievement\n"); + } + } + + public function onSteamResponse(e:SteamEvent):Void{ + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + log("RESPONSE_OnUserStatsStored:"+e.response); + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + log("RESPONSE_OnUserStatsReceived:"+e.response); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + log("RESPONSE_OnAchievementStored:"+e.response); + break; + default: + log("STEAMresponse type:"+e.req_type+" response:"+e.response); + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx new file mode 100644 index 0000000..5e3cafe --- /dev/null +++ b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx @@ -0,0 +1,170 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function getUserID():String + { + return _ExtensionContext.call("AIRSteam_GetUserID")as String; + } + + public function getPersonaName():String + { + return _ExtensionContext.call("AIRSteam_GetPersonaName")as String; + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool + { + return _ExtensionContext.call("AIRSteam_UseCrashHandler", appID, version, date, time)as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/FRESteamWorks.hx b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/FRESteamWorks.hx new file mode 100644 index 0000000..1f3571c --- /dev/null +++ b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/FRESteamWorks.hx @@ -0,0 +1,333 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by Ventero + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam { +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.IOErrorEvent; +import flash.events.ProgressEvent; +import flash.events.StatusEvent; +import flash.filesystem.File; +import flash.utils.ByteArray; +import flash.utils.IDataInput; +import flash.utils.IDataOutput; +import flash.utils.clearInterval; +import flash.utils.setInterval; +import helper.Achievements; + +class FRESteamWorks extends EventDispatcher { + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private static inline var PATH:String=".local/share/Steam/SteamApps/common/Anodyne/share/APIWrapper"; + + private var _file:File; + private var _process:NativeProcess; + private var _tm:Int; + private var _error:Bool=false; + + public var isReady:Bool=false; + + private static inline var AIRSteam_Init:Int=0; + private static inline var AIRSteam_RunCallbacks:Int=1; + private static inline var AIRSteam_RequestStats:Int=2; + private static inline var AIRSteam_SetAchievement:Int=3; + private static inline var AIRSteam_ClearAchievement:Int=4; + private static inline var AIRSteam_IsAchievement:Int=5; + private static inline var AIRSteam_GetStatInt:Int=6; + private static inline var AIRSteam_GetStatFloat:Int=7; + private static inline var AIRSteam_SetStatInt:Int=8; + private static inline var AIRSteam_SetStatFloat:Int=9; + private static inline var AIRSteam_StoreStats:Int=10; + private static inline var AIRSteam_ResetAllStats:Int=11; + private static inline var AIRSteam_GetFileCount:Int=12; + private static inline var AIRSteam_GetFileSize:Int=13; + private static inline var AIRSteam_FileExists:Int=14; + private static inline var AIRSteam_FileWrite:Int=15; + private static inline var AIRSteam_FileRead:Int=16; + private static inline var AIRSteam_FileDelete:Int=17; + private static inline var AIRSteam_IsCloudEnabledForApp:Int=18; + private static inline var AIRSteam_SetCloudEnabledForApp:Int=19; + private static inline var AIRSteam_GetUserID:Int=20; + private static inline var AIRSteam_GetPersonaName:Int=21; + private static inline var AIRSteam_UseCrashHandler:Int=22; + + public function new(target:IEventDispatcher=null){ + Achievements.DEBUG_TEXT +="making FRESteamworks\n"; + try { + _file=File.userDirectory.resolvePath(PATH); + Achievements.DEBUG_TEXT +="Found file at\n" + _file.nativePath +"\n"; + Achievements.DEBUG_TEXT +=_file.size.toString()+ " bytes\n"; + } catch(e:Dynamic){ + Achievements.DEBUG_TEXT +="COULDN'T FIND FILE"; + } + _process=new NativeProcess(); + _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, eventDispatched); + _process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, errorCallback); + super(target); + } + + public function dispose():Void { + if(_process.running){ + _process.closeInput(); + _process.exit(); + } + clearInterval(_tm); + isReady=false; + } + + private function startProcess():Void { + var startupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + startupInfo.executable=_file; + + _process.start(startupInfo); + } + + public function init():Bool { + Achievements.DEBUG_TEXT +="Sanity check...\n"; + if(_file==null || !_file.exists)return false; + Achievements.DEBUG_TEXT +="got file\n"; + startProcess(); + if(!_process.running){ + Achievements.DEBUG_TEXT +="Process not running\n"; + return false; + } + + if(!callWrapper(AIRSteam_Init))return false; + isReady=readBoolResponse(); + if(isReady)_tm=setInterval(runCallbacks, 100); + Achievements.DEBUG_TEXT +="ready? " + isReady.toString()+ "\n"; + return isReady; + } + + private function errorCallback(e:IOErrorEvent):Void { + _error=true; + // the process doesn't accept our input anymore, so just stop it + clearInterval(_tm); + + if(_process.running){ + try { + _process.closeInput(); + } catch(e:Dynamic){ + // no-op + } + + _process.exit(); + } + } + + private function callWrapper(funcName:Int, params:Array=null):Bool { + _error=false; + + if(!_process.running){ + Achievements.DEBUG_TEXT +="wrapper call fail\n"; + + return false; + } + + var stdin:IDataOutput=_process.standardInput; + stdin.writeUTFBytes(funcName + "\n"); + + if(params){ + for(i in 0...params.lengthi){ + if(params[i] is ByteArray){ + var length:Int=params[i].length; + // length + 1 for the added newline + stdin.writeUTFBytes(String(length + 1)+ "\n"); + stdin.writeBytes(params[i]); + stdin.writeUTFBytes("\n"); + } else { + stdin.writeUTFBytes(String(params[i])+ "\n"); + } + } + } + + return !_error; + } + + private function waitForData(output:IDataInput):Int { + while(!output.bytesAvailable){ + // wait + if(!_process.running)return 0; + } + + return output.bytesAvailable; + } + + private function readBoolResponse():Bool { + if(!_process.running)return false; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(1); + Achievements.DEBUG_TEXT +="bool resp:" + response.toString()+ "\n"; + return(response=="t"); + } + + private function readIntResponse():Int { + if(!_process.running)return 0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail); + return parseInt(response, 10); + } + + private function readFloatResponse():Float { + if(!_process.running)return 0.0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return parseFloat(response); + } + + private function readStringResponse():String { + if(!_process.running)return ""; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return response; + } + + private function eventDispatched(e:ProgressEvent):Void { + var stderr:IDataInput=_process.standardError; + var avail:Int=stderr.bytesAvailable; + var data:String=stderr.readUTFBytes(avail); + + var pattern:RegExp=/__event__<(\d+),(\d+)>/g; + var result:Dynamic; + while((result=pattern.exec(data))){ + var req_type:Int=new Std.int(result[1]); + var response:Int=new Std.int(result[2]); + var steamEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + dispatchEvent(steamEvent); + } + } + + public function requestStats():Bool { + if(!callWrapper(AIRSteam_RequestStats))return false; + return readBoolResponse(); + } + + public function runCallbacks():Bool { + if(!callWrapper(AIRSteam_RunCallbacks))return false; + return true; + } + + public function getUserID():String { + if(!callWrapper(AIRSteam_GetUserID))return ""; + return readStringResponse(); + } + + public function getPersonaName():String { + if(!callWrapper(AIRSteam_GetPersonaName))return ""; + return readStringResponse(); + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool { + if(!callWrapper(AIRSteam_UseCrashHandler, [appID, version, date, time]))return false; + return readBoolResponse(); + } + + public function setAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_SetAchievement, [id]))return false; + return readBoolResponse(); + } + + public function clearAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_ClearAchievement, [id]))return false; + return readBoolResponse(); + } + + public function isAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_IsAchievement, [id]))return false; + return readBoolResponse(); + } + + public function getStatInt(id:String):Int { + if(!callWrapper(AIRSteam_GetStatInt, [id]))return 0; + return readIntResponse(); + } + + public function getStatFloat(id:String):Float { + if(!callWrapper(AIRSteam_GetStatFloat, [id]))return 0.0; + return readFloatResponse(); + } + + public function setStatInt(id:String, value:Int):Bool { + if(!callWrapper(AIRSteam_SetStatInt, [id, value]))return false; + return readBoolResponse(); + } + + public function setStatFloat(id:String, value:Float):Bool { + if(!callWrapper(AIRSteam_SetStatFloat, [id, value]))return false; + return readBoolResponse(); + } + + public function storeStats():Bool { + if(!callWrapper(AIRSteam_StoreStats))return false; + return readBoolResponse(); + } + + public function resetAllStats(bAchievementsToo:Bool):Bool { + if(!callWrapper(AIRSteam_ResetAllStats, [bAchievementsToo]))return false; + return readBoolResponse(); + } + + public function getFileCount():Int { + if(!callWrapper(AIRSteam_GetFileCount))return 0; + return readIntResponse(); + } + + public function getFileSize(fileName:String):Int { + if(!callWrapper(AIRSteam_GetFileSize, [fileName]))return 0; + return readIntResponse(); + } + + public function fileExists(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileExists, [fileName]))return false; + return readBoolResponse(); + } + + public function fileWrite(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileWrite, [fileName, data]))return false; + return readBoolResponse(); + } + + public function fileRead(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileRead, [fileName]))return false; + + var success:Bool=readBoolResponse(); + if(success){ + var content:String=readStringResponse(); + data.writeUTFBytes(content); + data.position=0; + } + + return success; + } + + public function fileDelete(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileDelete, [fileName]))return false; + return readBoolResponse(); + } + + public function isCloudEnabledForApp():Bool { + if(!callWrapper(AIRSteam_IsCloudEnabledForApp))return false; + return readBoolResponse(); + } + + public function setCloudEnabledForApp(enabled:Bool):Bool { + if(!callWrapper(AIRSteam_SetCloudEnabledForApp, [enabled]))return false; + return readBoolResponse(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamConstants.hx b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamConstants.hx new file mode 100644 index 0000000..f61bdea --- /dev/null +++ b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamConstants.hx @@ -0,0 +1,21 @@ +/* + * SteamConstants.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=0; + public static inline var RESPONSE_FAILED:Int=1; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; + public static inline var RESPONSE_OnGameOverlayActivated:Int=3; +} \ No newline at end of file diff --git a/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamEvent.hx b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamEvent.hx new file mode 100644 index 0000000..279106f --- /dev/null +++ b/AIR/intra/hsrc/awerwer/com/amanitadesign/steam/SteamEvent.hx @@ -0,0 +1,55 @@ +/* + * SteamEvent.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystick.hx b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystick.hx new file mode 100644 index 0000000..05a565c --- /dev/null +++ b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystick.hx @@ -0,0 +1,42 @@ +package ca.wegetsignal.nativeextensions; + +class MacJoystick +{ + public var id:Int=-1; + + public var axes:Array; + public var buttons:Array; + + public function new(id:Int,numAxes:Int,numButtons:Int) + { + this.id=id; + this.axes=new Array(numAxes); + this.buttons=new Array(numButtons); + } + + /** Returns the value for axis at index between -1 and 1 + * Returns 0 for invalid axis index queries */ + public function getAxis(index:Int=0):Float { + if(index<0 || index>=axes.length) + return 0; + return axes[index]; + } + + /** Returns true if the button is on, false if released. + * Returns false if button index is out of valid range */ + public function getButton(index:Int=0):Bool { + if(index<0 || index>=buttons.length) + return false; + return buttons[index]; + } + + private function updateAxes(params:Array):Void { + // first param is this joystick id.. or should be.. + if(params[0] !=id) + throw new Dynamic("Invalid joystick ID for Axes update"); + + for(i in 1...params.lengthi){ + axes[i-1]=Std.parseFloat(params[i]); + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx new file mode 100644 index 0000000..478f32b --- /dev/null +++ b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx @@ -0,0 +1,26 @@ +package ca.wegetsignal.nativeextensions; + +import flash.events.Event; + +/** joystick property is the affected MacJoystick object + * elementIndex means the button index that was updated + * axes updates include all axes as a limitation of the IOKit HID Manager */ +class MacJoystickEvent extends Event +{ + public static const JOYSTICK_ADDED:String="JOYSTICK_ADDED", + JOYSTICK_REMOVED:String="JOYSTICK_REMOVED", + JOYSTICK_BUTTON_PUSHED:String="JOYSTICK_BUTTON_PUSHED", + JOYSTICK_BUTTON_RELEASED:String="JOYSTICK_BUTTON_RELEASED", + JOYSTICK_AXES_UPDATED:String="JOYSTICK_AXES_UPDATED"; + + public var joystick:MacJoystick; + public var elementIndex:Int; + + public function new(type:String,joystick:MacJoystick,elementIndex:Int=-1) + { + super(type); + + this.joystick=joystick; + this.elementIndex=elementIndex; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickManager.hx b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickManager.hx new file mode 100644 index 0000000..51c8094 --- /dev/null +++ b/AIR/intra/hsrc/ca/wegetsignal/nativeextensions/MacJoystickManager.hx @@ -0,0 +1,76 @@ +package ca.wegetsignal.nativeextensions; + +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import global.Keys; + +class MacJoystickManager extends EventDispatcher +{ + private static inline var EXTENSION_ID:String="ca.wegetsignal.nativeextensions.MacJoyANE"; + + private var context:ExtensionContext; + private var numJoysticks:Int=0; + + public var joysticks:Array=[]; + + private static const JOYSTICK_ADDED:String="JOYSTICK_ADDED", + JOYSTICK_REMOVED:String="JOYSTICK_REMOVED", + JOYSTICK_BUTTON_PUSHED:String="JOYSTICK_BUTTON_PUSHED", + JOYSTICK_BUTTON_RELEASED:String="JOYSTICK_BUTTON_RELEASED", + JOYSTICK_AXES_UPDATED:String="JOYSTICK_AXES_UPDATED"; + + public function new() + { + super(); + + context=ExtensionContext.createExtensionContext(EXTENSION_ID,null); + context.addEventListener(StatusEvent.STATUS,onStatus); + context.call("initializeGamepads",null); + } + + public function numberOfJoysticks():Int { + return numJoysticks; + } + + private function onStatus(event:StatusEvent):Void + { + var params:Array=event.level.split(','); + var affectedJoystick:MacJoystick; + var elementIndex:Int=-1; + + switch(event.code){ + case JOYSTICK_ADDED: + // level is joystickID,numAxes,numButtons + affectedJoystick=new MacJoystick(int(params[0]),int(params[1]),int(params[2])); + joysticks[int(params[0])]=affectedJoystick; + numJoysticks++; + break; + case JOYSTICK_REMOVED: + affectedJoystick=joysticks[int(params[0])]; + joysticks[int(params[0])]=null; + numJoysticks--; + break; + case JOYSTICK_BUTTON_PUSHED: + // level is joystickID,buttonIndex + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.buttons[int(params[1])]=true; + elementIndex=Std.int(params[1]); + break; + case JOYSTICK_BUTTON_RELEASED: + // level is joystickID,buttonIndex + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.buttons[int(params[1])]=false; + elementIndex=Std.int(params[1]); + break; + case JOYSTICK_AXES_UPDATED: + // level is joystickID,[axes] + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.updateAxes(params); + break; + } + + dispatchEvent(new MacJoystickEvent(event.code,affectedJoystick,elementIndex)); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/FRESteamWorksTest.hx b/AIR/intra/hsrc/com/FRESteamWorksTest.hx new file mode 100644 index 0000000..ee5248f --- /dev/null +++ b/AIR/intra/hsrc/com/FRESteamWorksTest.hx @@ -0,0 +1,115 @@ +package; + +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; + +import flash.display.SimpleButton; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.text.TextField; +import flash.utils.ByteArray; + +class FRESteamWorksTest extends Sprite +{ + public var Steamworks:FRESteamWorks=new FRESteamWorks(); + public var tf:TextField; + public function new() + { + tf=new TextField(); + tf.width=stage.stageWidth; + tf.height=stage.stageHeight; + addChild(tf); + + tf.addEventListener(MouseEvent.MOUSE_DOWN, onClick); + + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + + if(Steamworks.init()){ + log("STEAMWORKS API is available\n"); + + //comment.. current stats and achievement ids are from steam example app which is provided with their SDK + log("isAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.isAchievement("ACH_WIN_ONE_GAME")); + log("isAchievement('ACH_TRAVEL_FAR_SINGLE')=="+Steamworks.isAchievement("ACH_TRAVEL_FAR_SINGLE")); + log("setStatFloat('FeetTraveled')=="+Steamworks.setStatFloat('FeetTraveled', 21.3)); + log("setStatInt('NumGames', 2)=="+Steamworks.setStatInt('NumGames', 2)); + Steamworks.storeStats(); + log("getStatInt('NumGames')=="+Steamworks.getStatInt('NumGames')); + log("getStatFloat('FeetTraveled')=="+Steamworks.getStatFloat('FeetTraveled')); + + log("setCloudEnabledForApp(false)=="+Steamworks.setCloudEnabledForApp(false)); + log("setCloudEnabledForApp(true)=="+Steamworks.setCloudEnabledForApp(true)); + log("isCloudEnabledForApp()=="+Steamworks.isCloudEnabledForApp()); + log("getFileCount()=="+Steamworks.getFileCount()); + log("fileExists('test.txt')=="+Steamworks.fileExists('test.txt')); + + //comment.. writing to app with id 480 is somehow not working, but works with our real appId + log("writeFileToCloud('test.txt','hello steam')=="+writeFileToCloud('test.txt','hello steam')); + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + //----------- + + //Steamworks.requestStats(); + Steamworks.resetAllStats(true); + }else { + tf.appendText("STEAMWORKS API is NOT available\n"); + } + + } + private function log(value:String):Void{ + tf.appendText(value+"\n"); + tf.scrollV=tf.maxScrollV; + } + public function writeFileToCloud(fileName:String, data:String):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeUTFBytes(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public function readFileFromCloud(fileName:String):String { + var dataIn:ByteArray=new ByteArray(); + var result:String; + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + result=dataIn.readUTFBytes(dataIn.length); + } + return result; + } + + public function onClick(e:MouseEvent):Void{ + log("--click--"); + if(Steamworks.isReady){ + if(!Steamworks.isAchievement("ACH_WIN_ONE_GAME")){ + log("setAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.setAchievement("ACH_WIN_ONE_GAME")); + } else { + log("clearAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.clearAchievement("ACH_WIN_ONE_GAME")); + } + if(Steamworks.fileExists('test.txt')){ + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + log("Steamworks.fileDelete('test.txt')=="+Steamworks.fileDelete('test.txt')); + } else { + log("writeFileToCloud('test.txt','click')=="+writeFileToCloud('test.txt','click')); + } + //Steamworks.storeStats(); + } else { + log("not able to set achievement\n"); + } + } + + public function onSteamResponse(e:SteamEvent):Void{ + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + log("RESPONSE_OnUserStatsStored:"+e.response); + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + log("RESPONSE_OnUserStatsReceived:"+e.response); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + log("RESPONSE_OnAchievementStored:"+e.response); + break; + default: + log("STEAMresponse type:"+e.req_type+" response:"+e.response); + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx b/AIR/intra/hsrc/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx new file mode 100644 index 0000000..5e3cafe --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx @@ -0,0 +1,170 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function getUserID():String + { + return _ExtensionContext.call("AIRSteam_GetUserID")as String; + } + + public function getPersonaName():String + { + return _ExtensionContext.call("AIRSteam_GetPersonaName")as String; + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool + { + return _ExtensionContext.call("AIRSteam_UseCrashHandler", appID, version, date, time)as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/FRESteamWorks.hx b/AIR/intra/hsrc/com/amanitadesign/steam/FRESteamWorks.hx new file mode 100644 index 0000000..8dc8147 --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/FRESteamWorks.hx @@ -0,0 +1,335 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by Ventero + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam { +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.IOErrorEvent; +import flash.events.ProgressEvent; +import flash.events.StatusEvent; +import flash.filesystem.File; +import flash.utils.ByteArray; +import flash.utils.IDataInput; +import flash.utils.IDataOutput; +import flash.utils.clearInterval; +import flash.utils.setInterval; +import helper.Achievements; + +class FRESteamWorks extends EventDispatcher { + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private static inline var PATH:String=".local/share/Steam/SteamApps/common/Anodyne/share/APIWrapper"; + + private var _file:File; + private var _process:NativeProcess; + private var _tm:Int; + private var _error:Bool=false; + + public var isReady:Bool=false; + + private static inline var AIRSteam_Init:Int=0; + private static inline var AIRSteam_RunCallbacks:Int=1; + private static inline var AIRSteam_RequestStats:Int=2; + private static inline var AIRSteam_SetAchievement:Int=3; + private static inline var AIRSteam_ClearAchievement:Int=4; + private static inline var AIRSteam_IsAchievement:Int=5; + private static inline var AIRSteam_GetStatInt:Int=6; + private static inline var AIRSteam_GetStatFloat:Int=7; + private static inline var AIRSteam_SetStatInt:Int=8; + private static inline var AIRSteam_SetStatFloat:Int=9; + private static inline var AIRSteam_StoreStats:Int=10; + private static inline var AIRSteam_ResetAllStats:Int=11; + private static inline var AIRSteam_GetFileCount:Int=12; + private static inline var AIRSteam_GetFileSize:Int=13; + private static inline var AIRSteam_FileExists:Int=14; + private static inline var AIRSteam_FileWrite:Int=15; + private static inline var AIRSteam_FileRead:Int=16; + private static inline var AIRSteam_FileDelete:Int=17; + private static inline var AIRSteam_IsCloudEnabledForApp:Int=18; + private static inline var AIRSteam_SetCloudEnabledForApp:Int=19; + private static inline var AIRSteam_GetUserID:Int=20; + private static inline var AIRSteam_GetPersonaName:Int=21; + private static inline var AIRSteam_UseCrashHandler:Int=22; + + public function new(target:IEventDispatcher=null){ + try { + _file=File.userDirectory.resolvePath(PATH); + Achievements.DEBUG_TEXT +="Found file at\n" + _file.nativePath +"\n"; + Achievements.DEBUG_TEXT +=_file.size.toString()+ " bytes\n"; + } catch(e:Dynamic){ + Achievements.DEBUG_TEXT +="COULDN'T FIND FILE"; + } + _process=new NativeProcess(); + _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, eventDispatched); + _process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, errorCallback); + super(target); + } + + public function dispose():Void { + if(_process.running){ + _process.closeInput(); + _process.exit(); + } + clearInterval(_tm); + isReady=false; + } + + private function startProcess():Void { + var startupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + startupInfo.executable=_file; + + _process.start(startupInfo); + } + + public function init():Bool { + trace("hi") + trace(Achievements.DEBUG_TEXT); + Achievements.DEBUG_TEXT +="Sanity check..."; + trace(Achievements.DEBUG_TEXT); + if(_file==null || !_file.exists)return false; + Achievements.DEBUG_TEXT +="got file\n"; + startProcess(); + if(!_process.running){ + Achievements.DEBUG_TEXT +="Process not running\n"; + return false; + } + + if(!callWrapper(AIRSteam_Init))return false; + isReady=readBoolResponse(); + if(isReady)_tm=setInterval(runCallbacks, 100); + Achievements.DEBUG_TEXT +="ready? " + isReady.toString()+ "\n"; + return isReady; + } + + private function errorCallback(e:IOErrorEvent):Void { + _error=true; + // the process doesn't accept our input anymore, so just stop it + clearInterval(_tm); + + if(_process.running){ + try { + _process.closeInput(); + } catch(e:Dynamic){ + // no-op + } + + _process.exit(); + } + } + + private function callWrapper(funcName:Int, params:Array=null):Bool { + _error=false; + + if(!_process.running){ + Achievements.DEBUG_TEXT +="wrapper call fail\n"; + + return false; + } + + var stdin:IDataOutput=_process.standardInput; + stdin.writeUTFBytes(funcName + "\n"); + + if(params){ + for(i in 0...params.lengthi){ + if(params[i] is ByteArray){ + var length:Int=params[i].length; + // length + 1 for the added newline + stdin.writeUTFBytes(String(length + 1)+ "\n"); + stdin.writeBytes(params[i]); + stdin.writeUTFBytes("\n"); + } else { + stdin.writeUTFBytes(String(params[i])+ "\n"); + } + } + } + + return !_error; + } + + private function waitForData(output:IDataInput):Int { + while(!output.bytesAvailable){ + // wait + if(!_process.running)return 0; + } + + return output.bytesAvailable; + } + + private function readBoolResponse():Bool { + if(!_process.running)return false; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(1); + Achievements.DEBUG_TEXT +="bool resp:" + response.toString()+ "\n"; + return(response=="t"); + } + + private function readIntResponse():Int { + if(!_process.running)return 0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail); + return parseInt(response, 10); + } + + private function readFloatResponse():Float { + if(!_process.running)return 0.0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return parseFloat(response); + } + + private function readStringResponse():String { + if(!_process.running)return ""; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return response; + } + + private function eventDispatched(e:ProgressEvent):Void { + var stderr:IDataInput=_process.standardError; + var avail:Int=stderr.bytesAvailable; + var data:String=stderr.readUTFBytes(avail); + + var pattern:RegExp=/__event__<(\d+),(\d+)>/g; + var result:Dynamic; + while((result=pattern.exec(data))){ + var req_type:Int=new Std.int(result[1]); + var response:Int=new Std.int(result[2]); + var steamEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + dispatchEvent(steamEvent); + } + } + + public function requestStats():Bool { + if(!callWrapper(AIRSteam_RequestStats))return false; + return readBoolResponse(); + } + + public function runCallbacks():Bool { + if(!callWrapper(AIRSteam_RunCallbacks))return false; + return true; + } + + public function getUserID():String { + if(!callWrapper(AIRSteam_GetUserID))return ""; + return readStringResponse(); + } + + public function getPersonaName():String { + if(!callWrapper(AIRSteam_GetPersonaName))return ""; + return readStringResponse(); + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool { + if(!callWrapper(AIRSteam_UseCrashHandler, [appID, version, date, time]))return false; + return readBoolResponse(); + } + + public function setAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_SetAchievement, [id]))return false; + return readBoolResponse(); + } + + public function clearAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_ClearAchievement, [id]))return false; + return readBoolResponse(); + } + + public function isAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_IsAchievement, [id]))return false; + return readBoolResponse(); + } + + public function getStatInt(id:String):Int { + if(!callWrapper(AIRSteam_GetStatInt, [id]))return 0; + return readIntResponse(); + } + + public function getStatFloat(id:String):Float { + if(!callWrapper(AIRSteam_GetStatFloat, [id]))return 0.0; + return readFloatResponse(); + } + + public function setStatInt(id:String, value:Int):Bool { + if(!callWrapper(AIRSteam_SetStatInt, [id, value]))return false; + return readBoolResponse(); + } + + public function setStatFloat(id:String, value:Float):Bool { + if(!callWrapper(AIRSteam_SetStatFloat, [id, value]))return false; + return readBoolResponse(); + } + + public function storeStats():Bool { + if(!callWrapper(AIRSteam_StoreStats))return false; + return readBoolResponse(); + } + + public function resetAllStats(bAchievementsToo:Bool):Bool { + if(!callWrapper(AIRSteam_ResetAllStats, [bAchievementsToo]))return false; + return readBoolResponse(); + } + + public function getFileCount():Int { + if(!callWrapper(AIRSteam_GetFileCount))return 0; + return readIntResponse(); + } + + public function getFileSize(fileName:String):Int { + if(!callWrapper(AIRSteam_GetFileSize, [fileName]))return 0; + return readIntResponse(); + } + + public function fileExists(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileExists, [fileName]))return false; + return readBoolResponse(); + } + + public function fileWrite(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileWrite, [fileName, data]))return false; + return readBoolResponse(); + } + + public function fileRead(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileRead, [fileName]))return false; + + var success:Bool=readBoolResponse(); + if(success){ + var content:String=readStringResponse(); + data.writeUTFBytes(content); + data.position=0; + } + + return success; + } + + public function fileDelete(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileDelete, [fileName]))return false; + return readBoolResponse(); + } + + public function isCloudEnabledForApp():Bool { + if(!callWrapper(AIRSteam_IsCloudEnabledForApp))return false; + return readBoolResponse(); + } + + public function setCloudEnabledForApp(enabled:Bool):Bool { + if(!callWrapper(AIRSteam_SetCloudEnabledForApp, [enabled]))return false; + return readBoolResponse(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/SteamConstants.hx b/AIR/intra/hsrc/com/amanitadesign/steam/SteamConstants.hx new file mode 100644 index 0000000..f61bdea --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/SteamConstants.hx @@ -0,0 +1,21 @@ +/* + * SteamConstants.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=0; + public static inline var RESPONSE_FAILED:Int=1; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; + public static inline var RESPONSE_OnGameOverlayActivated:Int=3; +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/SteamEvent.hx b/AIR/intra/hsrc/com/amanitadesign/steam/SteamEvent.hx new file mode 100644 index 0000000..279106f --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/SteamEvent.hx @@ -0,0 +1,55 @@ +/* + * SteamEvent.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/old/FRESteamWorks.hx b/AIR/intra/hsrc/com/amanitadesign/steam/old/FRESteamWorks.hx new file mode 100644 index 0000000..89d1dc8 --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/old/FRESteamWorks.hx @@ -0,0 +1,154 @@ +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + switch(req_type) + { + case SteamConstants.RESPONSE_OnUserStatsReceived: + trace("RESPONSE_OnUserStatsReceived"); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + trace("RESPONSE_OnAchievementStored"); + break; + } + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamConstants.hx b/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamConstants.hx new file mode 100644 index 0000000..4e7c7cc --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamConstants.hx @@ -0,0 +1,10 @@ +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=1; + public static inline var RESPONSE_FAILED:Int=2; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; +} \ No newline at end of file diff --git a/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamEvent.hx b/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamEvent.hx new file mode 100644 index 0000000..95c8e82 --- /dev/null +++ b/AIR/intra/hsrc/com/amanitadesign/steam/old/SteamEvent.hx @@ -0,0 +1,45 @@ +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/CLASS_ID.hx b/AIR/intra/hsrc/data/CLASS_ID.hx new file mode 100644 index 0000000..51becb4 --- /dev/null +++ b/AIR/intra/hsrc/data/CLASS_ID.hx @@ -0,0 +1,81 @@ +package data +{ +/** + * BECAUSE STRING COMPARISONS ARE SLOW AS FUCK + * IN THE COLLISION LOGIC + * + *(I still do comparisons on names in SpriteFactory, though - not + * really an issue there) + * + *(IDs for any object that is compared with its xml name...) + * @author Seagaia + */ +class CLASS_ID +{ + + /* ENEMIES */ + public static var SLIME:Int=0; + public static var MOVER:Int=1; + public static var PEW_LASER:Int=2; + public static var SHIELDY:Int=3; + public static var SUN_GUY:Int=4; + public static var WALL_LASER:Int=5; + public static var ANNOYER:Int=6; + public static var RED_WALKER:Int=7; + public static var FOUR_SHOOTER:Int=8; + public static var SLASHER:Int=9; + public static var ON_OFF_LASER:Int=10; + public static var RED_BOSS:Int=11; + public static var ROTATOR:Int=12; + public static var PERSON:Int=13; + public static var FROG:Int=14; + public static var DOG:Int=15; + public static var SPIKE_ROLLER:Int=16; + public static var WALLBOSS:Int=17; + public static var RAT:Int=18; + public static var SILVERFISH:Int=19; + public static var GASGUY:Int=20; + public static var TELEGUY:Int=21; + public static var DASHTRAP:Int=22; + public static var DUSTMAID:Int=23; + public static var BURSTPLANT:Int=24; + + + /* DECORATIONS */ + public static var EYE_LIGHT:Int=100; + public static var SOLID_SPRITE:Int=101; + + /* GADGETS */ + public static var BUTTON:Int=200; + public static var CRACKEDTILE:Int=201; + public static var DOOR:Int=202; + public static var DUST:Int=203; + public static var GATE:Int=204; + public static var HOLE:Int=205; + public static var KEY:Int=206; + public static var KEYBLOCK:Int=207; + public static var SINGLEPUSHBLOCK:Int=208; + public static var TREASURE:Int=209; + public static var CONSOLE:Int=210; + public static var GROWTH_GATE:Int=211; + public static var CHALLENGE_GATE:Int=212; + public static var BIG_DOOR:Int=213; + public static var JUMP_TRIGGER:Int=214; + public static var PROPELLED:Int=215; + public static var STOP_MARKER:Int=216; + public static var PILLAR_SWITCH:Int=217; + + /* OTHER */ + public static var PLAYER:Int=300; + public static var HEALTHPICKUP:Int=301; + public static var BROOM:Int=302; + public static var EVENT_SCRIPT:Int=303; + public static var CONTROLSDEITY:Int=304; + public static var FOLLOWER_BRO:Int=305; + public static var RED_PILLAR:Int=306; + public static var FISHERMAN:Int=307; + public static var NPC_:Int=308; + public static var TRADE_NPC:Int=309; + public static var MITRA:Int=310; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/CSV_Data.hx b/AIR/intra/hsrc/data/CSV_Data.hx new file mode 100644 index 0000000..1c26570 --- /dev/null +++ b/AIR/intra/hsrc/data/CSV_Data.hx @@ -0,0 +1,319 @@ +package data +{ +import org.flixel.plugin.photonstorm.FlxGridOverlay; + +class CSV_Data +{ + + //[Embed(source="../csv/DEBUG_BG.csv", mimeType="application/octet-stream")] public static var DEBUG_BG:Class; + //[Embed(source="../csv/DEBUG_BG2.csv", mimeType="application/octet-stream")] public static var DEBUG_BG2:Class; + //[Embed(source="../csv/DEBUG_FG.csv", mimeType="application/octet-stream")] public static var DEBUG_FG:Class; + + //[Embed(source="../csv/Bedroom_BG.csv", mimeType="application/octet-stream")] public static var BEDROOM_BG:Class; + ////[Embed(source="../csv/Bedroom_BG2.csv", mimeType="application/octet-stream")] public static var BEDROOM_BG2:Class; + ////[Embed(source="../csv/Bedroom_FG.csv", mimeType="application/octet-stream")] public static var BEDROOM_FG:Class; + + + //[Embed(source="../csv/FOREST_BG.csv", mimeType="application/octet-stream")] public static var FOREST_BG:Class; + //[Embed(source="../csv/FOREST_BG2.csv", mimeType="application/octet-stream")] public static var FOREST_BG2:Class; + //[Embed(source="../csv/FOREST_FG.csv", mimeType="application/octet-stream")] public static var FOREST_FG:Class; + + //[Embed(source="../csv/FIELDS_BG.csv", mimeType="application/octet-stream")] public static var FIELDS_BG:Class; + ////[Embed(source="../csv/FIELDS_BG2.csv", mimeType="application/octet-stream")] public static var FIELDS_BG2:Class; + //[Embed(source="../csv/FIELDS_FG.csv", mimeType="application/octet-stream")] public static var FIELDS_FG:Class; + + //[Embed(source="../csv/STREET_BG.csv", mimeType="application/octet-stream")] public static var STREET_BG:Class; + //[Embed(source="../csv/STREET_BG2.csv", mimeType="application/octet-stream")] public static var STREET_BG2:Class; + //[Embed(source="../csv/STREET_FG.csv", mimeType="application/octet-stream")] public static var STREET_FG:Class; + + //[Embed(source="../csv/OVERWORLD_BG.csv", mimeType="application/octet-stream")] public static var OVERWORLD_BG:Class; + //[Embed(source="../csv/OVERWORLD_BG2.csv", mimeType="application/octet-stream")] public static var OVERWORLD_BG2:Class; + ////[Embed(source="../csv/OVERWORLD_FG.csv", mimeType="application/octet-stream")] public static var OVERWORLD_FG:Class; + + //[Embed(source="../csv/BEACH_BG.csv", mimeType="application/octet-stream")] public static var BEACH_BG:Class; + ////[Embed(source="../csv/BEACH_BG2.csv", mimeType="application/octet-stream")] public static var BEACH_BG2:Class; + ////[Embed(source="../csv/BEACH_FG.csv", mimeType="application/octet-stream")] public static var BEACH_FG:Class; + + //[Embed(source="../csv/BLANK_BG.csv", mimeType="application/octet-stream")] public static var BLANK_BG:Class; + ////[Embed(source="../csv/BLANK_BG2.csv", mimeType="application/octet-stream")] public static var BLANK_BG2:Class; + ////[Embed(source="../csv/BLANK_FG.csv", mimeType="application/octet-stream")] public static var BLANK_FG:Class; + + //[Embed(source="../csv/REDSEA_BG.csv", mimeType="application/octet-stream")] public static var REDSEA_BG:Class; + ////[Embed(source="../csv/REDSEA_BG2.csv", mimeType="application/octet-stream")] public static var REDSEA_BG2:Class; + //[Embed(source="../csv/REDSEA_FG.csv", mimeType="application/octet-stream")] public static var REDSEA_FG:Class; + + //[Embed(source="../csv/REDCAVE_BG.csv", mimeType="application/octet-stream")] public static var REDCAVE_BG:Class; + //[Embed(source="../csv/REDCAVE_BG2.csv", mimeType="application/octet-stream")] public static var REDCAVE_BG2:Class; + ////[Embed(source="../csv/REDCAVE_FG.csv", mimeType="application/octet-stream")] public static var REDCAVE_FG:Class; + + //[Embed(source="../csv/NEXUS_BG.csv", mimeType="application/octet-stream")] public static var NEXUS_BG:Class; + ////[Embed(source="../csv/NEXUS_BG2.csv", mimeType="application/octet-stream")] public static var NEXUS_BG2:Class; + //[Embed(source="../csv/NEXUS_FG.csv", mimeType="application/octet-stream")] public static var NEXUS_FG:Class; + + //[Embed(source="../csv/CROWD_BG.csv", mimeType="application/octet-stream")] public static var CROWD_BG:Class; + //[Embed(source="../csv/CROWD_BG2.csv", mimeType="application/octet-stream")] public static var CROWD_BG2:Class; + ////[Embed(source="../csv/CROWD_FG.csv", mimeType="application/octet-stream")] public static var CROWD_FG:Class; + + //[Embed(source="../csv/APARTMENT_BG.csv", mimeType="application/octet-stream")] public static var APARTMENT_BG:Class; + //[Embed(source="../csv/APARTMENT_BG2.csv", mimeType="application/octet-stream")] public static var APARTMENT_BG2:Class; + //[Embed(source="../csv/APARTMENT_FG.csv", mimeType="application/octet-stream")] public static var APARTMENT_FG:Class; + + //[Embed(source="../csv/TERMINAL_BG.csv", mimeType="application/octet-stream")] public static var TERMINAL_BG:Class; + //[Embed(source="../csv/TERMINAL_BG2.csv", mimeType="application/octet-stream")] public static var TERMINAL_BG2:Class; + ////[Embed(source="../csv/TERMINAL_FG.csv", mimeType="application/octet-stream")] public static var TERMINAL_FG:Class; + + + //[Embed(source="../csv/HOTEL_BG.csv", mimeType="application/octet-stream")] public static var HOTEL_BG:Class; + //[Embed(source="../csv/HOTEL_BG2.csv", mimeType="application/octet-stream")] public static var HOTEL_BG2:Class; + //[Embed(source="../csv/HOTEL_FG.csv", mimeType="application/octet-stream")] public static var HOTEL_FG:Class; + + + /* NOTE!!!! CELL is called TRAIN in DAME because I'm an idiot. That's why. */ + //[Embed(source="../csv/TRAIN_BG.csv", mimeType="application/octet-stream")] public static var CELL_BG:Class; +// //[Embed(source="../csv/TRAIN_BG2.csv", mimeType="application/octet-stream")] public static var CELL_BG2:Class; + ////[Embed(source="../csv/TRAIN_FG.csv", mimeType="application/octet-stream")] public static var CELL_FG:Class; + + + //[Embed(source="../csv/CIRCUS_BG.csv", mimeType="application/octet-stream")] public static var CIRCUS_BG:Class; + ////[Embed(source="../csv/CIRCUS_BG2.csv", mimeType="application/octet-stream")] public static var CIRCUS_BG2:Class; + //[Embed(source="../csv/CIRCUS_FG.csv", mimeType="application/octet-stream")] public static var CIRCUS_FG:Class; + + + //[Embed(source="../csv/WINDMILL_BG.csv", mimeType="application/octet-stream")] public static var WINDMILL_BG:Class; + //[Embed(source="../csv/WINDMILL_BG2.csv", mimeType="application/octet-stream")] public static var WINDMILL_BG2:Class; + ////[Embed(source="../csv/WINDMILL_FG.csv", mimeType="application/octet-stream")] public static var WINDMILL_FG:Class; + + + //[Embed(source="../csv/GO_BG.csv", mimeType="application/octet-stream")] public static var GO_BG:Class; + //[Embed(source="../csv/GO_BG2.csv", mimeType="application/octet-stream")] public static var GO_BG2:Class; + ////[Embed(source="../csv/GO_FG.csv", mimeType="application/octet-stream")] public static var GO_FG:Class; + + + //[Embed(source="../csv/HAPPY_BG.csv", mimeType="application/octet-stream")] public static var HAPPY_BG:Class; + //[Embed(source="../csv/HAPPY_BG2.csv", mimeType="application/octet-stream")] public static var HAPPY_BG2:Class; + ////[Embed(source="../csv/HAPPY_FG.csv", mimeType="application/octet-stream")] public static var HAPPY_FG:Class; + + + //[Embed(source="../csv/BLUE_BG.csv", mimeType="application/octet-stream")] public static var BLUE_BG:Class; + //[Embed(source="../csv/BLUE_BG2.csv", mimeType="application/octet-stream")] public static var BLUE_BG2:Class; + ////[Embed(source="../csv/BLUE_FG.csv", mimeType="application/octet-stream")] public static var BLUE_FG:Class; + + //[Embed(source="../csv/SUBURB_BG.csv", mimeType="application/octet-stream")] public static var SUBURB_BG:Class; + ////[Embed(source="../csv/SUBURB_BG2.csv", mimeType="application/octet-stream")] public static var SUBURB_BG2:Class; + ////[Embed(source="../csv/SUBURB_FG.csv", mimeType="application/octet-stream")] public static var SUBURB_FG:Class; + + //[Embed(source="../csv/SPACE_BG.csv", mimeType="application/octet-stream")] public static var SPACE_BG:Class; + //[Embed(source="../csv/SPACE_BG2.csv", mimeType="application/octet-stream")] public static var SPACE_BG2:Class; + //[Embed(source="../csv/SPACE_FG.csv", mimeType="application/octet-stream")] public static var SPACE_FG:Class; + + //[Embed(source="../csv/CLIFF_BG.csv", mimeType="application/octet-stream")] public static var CLIFF_BG:Class; + //[Embed(source="../csv/CLIFF_BG2.csv", mimeType="application/octet-stream")] public static var CLIFF_BG2:Class; + ////[Embed(source="../csv/CLIFF_FG.csv", mimeType="application/octet-stream")] public static var CLIFF_FG:Class; + + + //[Embed(source="../csv/DRAWER_BG.csv", mimeType="application/octet-stream")] public static var DRAWER_BG:Class; + + + /* Minimaps */ + //[Embed(source="../csv/Minimap_Street.csv", mimeType="application/octet-stream")] public static var MM_Street:Class; + //[Embed(source="../csv/Minimap_Bedroom.csv", mimeType="application/octet-stream")] public static var MM_Bedroom:Class; + //[Embed(source="../csv/Minimap_Redcave.csv", mimeType="application/octet-stream")] public static var MM_Redcave:Class; + //[Embed(source="../csv/Minimap_Crowd.csv", mimeType="application/octet-stream")] public static var MM_Crowd:Class; + //[Embed(source="../csv/Minimap_Apartment.csv", mimeType="application/octet-stream")] public static var MM_Apartment:Class; + //[Embed(source="../csv/Minimap_Hotel.csv", mimeType="application/octet-stream")] public static var MM_Hotel:Class; + //[Embed(source="../csv/Minimap_Circus.csv", mimeType="application/octet-stream")] public static var MM_Circus:Class; + //[Embed(source="../csv/Minimap_Fields.csv", mimeType="application/octet-stream")] public static var MM_Fields:Class; + //[Embed(source="../csv/Minimap_Beach.csv", mimeType="application/octet-stream")] public static var MM_Beach:Class; + //[Embed(source="../csv/Minimap_Cliff.csv", mimeType="application/octet-stream")] public static var MM_Cliff:Class; + //[Embed(source="../csv/Minimap_Forest.csv", mimeType="application/octet-stream")] public static var MM_Forest:Class; + //[Embed(source="../csv/Minimap_Overworld.csv", mimeType="application/octet-stream")] public static var MM_Overworld:Class; + //[Embed(source="../csv/Minimap_Redsea.csv", mimeType="application/octet-stream")] public static var MM_Redsea:Class; + + //[Embed(source="../csv/Minimap_Suburb.csv", mimeType="application/octet-stream")] public static var MM_Suburb:Class; + //[Embed(source="../csv/Minimap_Space.csv", mimeType="application/octet-stream")] public static var MM_Space:Class; + //[Embed(source="../csv/Minimap_Cell.csv", mimeType="application/octet-stream")] public static var MM_Train:Class; + //[Embed(source="../csv/Minimap_Terminal.csv", mimeType="application/octet-stream")] public static var MM_Terminal:Class; + + public static var minimap_csv:Dynamic={ STREET:MM_Street, BEDROOM:MM_Bedroom , REDCAVE:MM_Redcave, APARTMENT:MM_Apartment, HOTEL:MM_Hotel, CIRCUS:MM_Circus , CROWD:MM_Crowd, FIELDS:MM_Fields, BEACH:MM_Beach, CLIFF:MM_Cliff, FOREST:MM_Forest, OVERWORLD:MM_Overworld, REDSEA:MM_Redsea, SUBURB:MM_Suburb, SPACE:MM_Space, TRAIN:MM_Train, TERMINAL:MM_Terminal}; + + public static var maps_with_fg:Array=new Array("DEBUG", "SPACE","STREET", "APARTMENT", "HOTEL", "NEXUS","CIRCUS","FOREST", "REDSEA", "FIELDS"); + public static var maps_with_bg2:Array=new Array("TERMINAL", "SPACE","DEBUG", "OVERWORLD","HAPPY", "BLUE", "REDCAVE","STREET", "APARTMENT", "HOTEL", "CROWD", "WINDMILL","CLIFF","FOREST","GO"); + + // it looks like you're adding a new CSV. + // did you make sure to add in the new tiles in TileData? + // How to add in a layer once it's been exported from DAME: + // 1.Make sure the file is included above("Embed ...")- just follow the pattern + // 2. Depending on what you're adding, add that map's name to the arrays maps_with_fg or maps_with_bg2. + // 3. In the big if-statement head, find and insert the necessary code(use the "DEBUG" block as an example) + // 4. you should then be good to go. + /* Layers:0,1,2:BG. 1 is collidable, others are decoration. 3:FG */ + /** + * + * @param mapName + * @param layer 0,1,2 Bg layers, 3 fg + * @return "0", otherwise the CSV as a string. + */ + public static function getMap(mapName:String,layer:Int=1):String { + var CSV:String="0,0"; + if(layer==3){ + if(maps_with_fg.indexOf(mapName)==-1){ + return CSV; + } + //else go down there and define the behavior + } + + if(layer==2){ + if(maps_with_bg2.indexOf(mapName)==-1){ + return CSV; + } + } + + if(mapName=="DEBUG"){ + if(layer==2){ + CSV=new DEBUG_BG2(); + } else if(layer==3){ + CSV=new DEBUG_FG(); + } else { + CSV=new DEBUG_BG(); + } + } else if(mapName=="BEDROOM"){ + CSV=new BEDROOM_BG(); + } else if(mapName=="STREET"){ + if(layer==2){ + return new STREET_BG2(); + } else if(layer==3){ + CSV=new STREET_FG(); + } else { + CSV=new STREET_BG(); + } + } else if(mapName=="FIELDS"){ + if(layer==3){ + CSV=new FIELDS_FG(); + } else { + CSV=new FIELDS_BG(); + } + } else if(mapName=="OVERWORLD"){ + if(layer==2){ + CSV=new OVERWORLD_BG2(); + } else { + CSV=new OVERWORLD_BG(); + } + } else if(mapName=="BEACH"){ + CSV=new BEACH_BG(); + } else if(mapName=="BLANK"){ + CSV=new BLANK_BG(); + } else if(mapName=="REDSEA"){ + if(layer==3){ + CSV=new REDSEA_FG(); + } else { + CSV=new REDSEA_BG(); + } + } else if(mapName=="REDCAVE"){ + if(layer==2){ + CSV=new REDCAVE_BG2(); + } else if(layer==3){ + //CSV=new REDCAVE_FG(); + } else { + CSV=new REDCAVE_BG(); + } + } else if(mapName=="NEXUS"){ + if(layer==2){ + //CSV=new NEXUS_BG2(); + } else if(layer==3){ + CSV=new NEXUS_FG(); + } else { + CSV=new NEXUS_BG(); + } + } else if(mapName=="CROWD"){ + if(layer==2){ + CSV=new CROWD_BG2(); + } else { + CSV=new CROWD_BG(); + } + } else if(mapName=="APARTMENT"){ + if(layer==2){ + CSV=new APARTMENT_BG2(); + } else if(layer==3){ + CSV=new APARTMENT_FG(); + } else { + CSV=new APARTMENT_BG(); + } + } else if(mapName=="HOTEL"){ + if(layer==2){ + CSV=new HOTEL_BG2(); + } else if(layer==3){ + CSV=new HOTEL_FG(); + } else { + CSV=new HOTEL_BG(); + } + } else if(mapName=="CIRCUS"){ + if(layer==3){ + CSV=new CIRCUS_FG(); + } else { + CSV=new CIRCUS_BG(); + } + } else if(mapName=="WINDMILL"){ + if(layer==2){ + CSV=new WINDMILL_BG2(); + } else { + CSV=new WINDMILL_BG(); + } + } else if(mapName=="TRAIN"){ //CELL!! + CSV=new CELL_BG(); + } else if(mapName=="FOREST"){ + if(layer==3){ + CSV=new FOREST_FG(); + } else if(layer==2){ + CSV=new FOREST_BG2(); + } else { + CSV=new FOREST_BG(); + } + } else if(mapName=="BLUE"){ + if(layer==2){ + CSV=new BLUE_BG2(); + } else { + CSV=new BLUE_BG(); + } + } else if(mapName=="HAPPY"){ + if(layer==2){ + CSV=new HAPPY_BG2(); + } else { + CSV=new HAPPY_BG(); + } + } else if(mapName=="TERMINAL"){ + if(layer==2){ + CSV=new TERMINAL_BG2(); + } else { + CSV=new TERMINAL_BG(); + } + } else if(mapName=="GO"){ + if(layer==2){ + CSV=new GO_BG2(); + } else { + CSV=new GO_BG(); + } + } else if(mapName=="SUBURB"){ + CSV=new SUBURB_BG(); + } else if(mapName=="CLIFF"){ + if(layer==2){ + CSV=new CLIFF_BG2(); + } else { + CSV=new CLIFF_BG(); + } + } else if(mapName=="DRAWER"){ + CSV=new DRAWER_BG(); + } else if(mapName=="SPACE"){ + if(layer==2){ + CSV=new SPACE_BG2(); + } else if(layer==3){ + CSV=new SPACE_FG(); + } else { + CSV=new SPACE_BG(); + } + + } + + return CSV; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/Common_Sprites.hx b/AIR/intra/hsrc/data/Common_Sprites.hx new file mode 100644 index 0000000..4357cb2 --- /dev/null +++ b/AIR/intra/hsrc/data/Common_Sprites.hx @@ -0,0 +1,66 @@ +package data +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +/* Embedded sprites common to multiple entities, e.g., shadows */ +public class Common_Sprites +{ + /* Normal shadow that is used by bullets and has two animations */ + //[Embed(source="../res/sprites/decoration/shadows/8x8_shadow.png")] public static var shadow_sprite_8_8:Class; + //[Embed(source="../res/sprites/decoration/SPACE_BG.png")] public static var space_bg:Class; + //[Embed(source="../res/sprites/decoration/briar_BG.png")] public static var briar_Bg:Class; + //[Embed(source="../res/sprites/decoration/nexus_bg.png")] public static var nexus_bg:Class; + + /* This shadow has 5 frames, and its frame is determined by the fist's y-offset + *(or height)used by Wallboss fists, and Eyeboss Land form */ + //[Embed(source="../res/sprites/decoration/shadows/28x10_shadow.png")] public static var shadow_sprite_28_10:Class; + + + //[Embed(source="../helper/static.pbj", mimeType="application/octet-stream")] public static inline var static_shader:Class; + + // OVERLAYS + + // 160x160 image, tiled 2x2. No anims. + //[Embed(source="../res/sprites/decoration/overlays/debug_overlay.png")] public static var debug_overlay:Class; + //[Embed(source="../res/sprites/decoration/overlays/windmill_overlay.png")] public static var windmill_overlay:Class; + //[Embed(source="../res/sprites/decoration/overlays/happy_overlay.png")] public static inline var happy_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/redsea_overlay.png")] public static inline var redsea_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/ending_overlay.png")] public static inline var ending_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/forest_overlay.png")] public static inline var forest_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/cliff_overlay.png")] public static inline var cliff_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/apartment_overlay.png")] public static inline var apartment_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/beach_overlay.png")] public static inline var beach_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/space_overlay.png")] public static inline var space_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/hotel_overlay.png")] public static inline var hotel_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/hotel_roof_overlay.png")] public static inline var roof_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/suburbs_overlay.png")] public static inline var suburbs_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/bedroom_overlay.png")] public static inline var bedroom_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/blue_overlay.png")] public static inline var blue_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/circus_overlay.png")] public static inline var circus_blend:Class; + + //[Embed(source="../res/sprites/decoration/overlays/windmill_overlay2.png")] public static inline var windmill2_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/terminal_overlay.png")] public static inline var terminal_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/street_overlay.png")] public static inline var street_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/nexus_overlay.png")] public static inline var nexus_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/crowd_overlay.png")] public static inline var crowd_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/go_overlay.png")] public static inline var go_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/redcave_overlay .png")] public static inline var redcave_blend:Class; + + public static var static_map:Bitmap; + + public static function init():Void { + static_map=new Bitmap(new BitmapData(320, 320,true,0x00000000)); + var alpha:Int; + var gray:Int; + var maxalpha:Int=80; + var maxgray:Int=80; + + for(i in 0...320){ + for(j in 0...320){ + alpha=maxalpha * Math.random(); + gray=maxgray * Math.random(); + static_map.bitmapData.setPixel32(j, i,(alpha<<24)|(gray)|(gray<<8)|(gray<<16)); + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_EN.hx b/AIR/intra/hsrc/data/NPC_Data_EN.hx new file mode 100644 index 0000000..a9ee349 --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_EN.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_EN { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Like music? Talk to that terminal!", + "Like pain? Head on down south!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "That acrobat is losing balance! Where is the safety net?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "The lions are closing in on that juggler!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again.", + "Briar:...", + "Briar:It’s not going to change, Young. This is all we’ll ever be.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Goodbye, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Dude, Young.", + "Briar:Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me!", + "Briar:Well, come on, let’s go get a sandwich or something.", + "Sage:You... you did adequately. Until we meet again.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Mysterious voice:Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around.", + "You will press the \'", + "\' key to Interact with objects and people around you.", + "And you will press the \'", + "\' key to access the menu, which will provide you with information about yourself and your surroundings.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... I just wanted to fix everything for you.", + "I hope... I hope you can do better than me.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Good luck, Young.", + "Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality.", + "I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young.", + "You are fighting, Young. You are trying to understand. I hope you can work things out.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... this is my final warning... wait, who is that?", + "Mitra:My name is Mitra, and this is my bike, Wares!", + "Sage:I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you.", + "Mitra:I’m here to help my friend, Young..", + "Sage:Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world!", + "Mitra:What do you mean? Wares and I--", + "Sage:SHUT UP ABOUT YOUR STUPID BICYCLE!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone?", + "Sage:You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young.", + "Sage:Go talk to your \"friend\".", + "Mitra:We're just doing the best we can...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Cloaked Man:Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar.", + "Enter the active portal on your left to begin your quest.", + "*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need!", + "Just go in the damn door!") + } +, + after_ent_str:{ + dialogue:new Array( + "Why are you still here?") + } +, + after_bed:{ + dialogue:new Array( + "Continue on, Young. That key you have found, there may be others like it - seek them out.", + "Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness.") + } +, + before_windmill:{ + dialogue:new Array( + "Take those three keys, Young, and unlock the way to the deeper realms of The Land.") + } +, + after_windmill:{ + dialogue:new Array( + "You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and Intellect. And I assume that by this point you have found a weapon?", + "Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend...", + "*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for?", + "Keep your wits about you, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest.", + "That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest.", + "Travel East and South through the temple grounds... you will find a use for that key.", + "What, do you want a piggy back ride to the gate or something??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:Why won’t you listen to me?! If you rush Into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar.", + "Sage:You’re not ready Young, first you must face more trials in The Land.", + "Sage:You have made progress, Young, but you must collect at least 36 cards to pass this gate.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36!", + "Sage:Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!!", + "Sage:Of course, you still have a long way to go. Have you been exploring The Land?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Well done, Young. However, there are still trials to face. Do not let your guard down.", + "Sage:Have you found all of the keys yet, Young? If not, go to the beach.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "I'm not like the others! *woof* I won't harm you...", + "It is a quiet existence up here.", + "You smell like swiss chard.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful!", + "So beautiful...") + } +, + dump:{ + dialogue:new Array( + "Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha!", + "Hahaha. Hahahahaha. HAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Hey sexy, I’ll buy you a drink!", + "Have another drink, you little shit! Hahaha!") + } +, + hot:{ + dialogue:new Array( + "Fuck, it’s hot here... I’m so hot... and sweatyyy...", + "Damn, working out makes me horny!") + } +, + gold:{ + dialogue:new Array( + "Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha!", + "Seriously, why are you just standing there? Help me jack this brick!") + } +, + briar:{ + dialogue:new Array( + "???:Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "HEADS UP!", + "Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess!", + "I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle!", + "Well, maybe we’ll run Into each other again sometime. I’ll let you know if I hear anything about that Briar.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "HEADS UP! All right Wares, let’s do this!", + "Annnd presto!", + "Keep going, Young, we’ve got your back!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Remember me? I forgot to Introduce myself the last time, I only Introduced my bicycle, Wares. My name is Mitra.", + "Remember me? I forgot to Introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares.", + "Mitra:So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie.", + "Mitra:See you around, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry.") + } +, + game_hints:{ + dialogue:new Array( + "Nothing.", + "Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more?", + "Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others?", + "Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there?", + "Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land?", + "Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those!", + "What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land", + "How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team!", + "Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple?", + "Mitra:Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple.", + "Mitra:Hey Young, looking for a card?\nYou might find something near the Seeing One's lair.", + "Mitra:Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right?", + "Mitra:Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple?", + "Mitra:Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair.", + "Mitra:Hey Young, looking for a card?\nMaybe your neighbor knows something about it.", + "Mitra:Hey Young, looking for a card?\nI know the guy in your apartment was hiding something...", + "Mitra:Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there!", + "Mitra:Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment?", + "Mitra:Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out.", + "Mitra:Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around!", + "Mitra:Hey Young, looking for a card?\nI know someone left a card near the windmill.", + "Mitra:Hey Young, looking for a card?\nLook around the rivers in the forest...", + "Mitra:Hey Young, looking for a card?\nTry poking around the base of the mountains.", + "Mitra:Hey Young, looking for a card?\nTry going to the summit of the mountains.", + "Mitra:Hey Young, looking for a card?\nThe far end of the beach may hold something.", + "Mitra:Hey Young, looking for a card?\nTake a walk in the crimson woods.", + "Mitra:Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right?", + "Mitra:Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end!", + "Mitra:Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river!", + "Mitra:Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth?", + "Mitra:Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it!", + "Mitra:Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere?", + "Mitra:Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit?", + "Mitra:Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something.", + "Mitra:Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves!", + "Mitra:Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave?", + "Mitra:Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave?", + "Mitra:Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something!", + "Mitra:Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something.", + "Mitra:Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something!", + "Mitra:Hey Young, looking for a card?\nDid you walk Into all of the rooms on the 3rd floor of the hotel?", + "Mitra:Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel.", + "Mitra:Hey Young, looking for a card?\nThe owner of the hotel might have left something for you!", + "Mitra:Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there!", + "...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know?") + } +, + general_banter:{ + dialogue:new Array( + "Did you find that guy who was looking for something in the mountains?", + "Do you know what my bike’s surname is? …Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames.", + "Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days...", + "So what is The Briar? Some sort of ancient artifact from a lost culture?", + "I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles.", + "Hey Young, I just wanted to tell you... your hair is awesome.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Statue:The Village Elder in name only, for he is neither.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Statue:I’ve seen a broom in a legend... it was on the map of a janitor closet.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Statue:Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Statue:Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap Into the cracks, thinking I might short-circuit the wires. Of course, I never found anything.", + "Edward:This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in “The Land”, and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust!") + } +, + after_fight:{ + dialogue:new Array( + "I will be with you, Young, whenever you are alone. And remember my advice on your little “adventure”.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Rock:Peripheral vision is the hive of demons.") + } +, + two:{ + dialogue:new Array( + "Rock:To-do:Construct method of transportation to Nexus. Progress:Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal.") + } +, + three:{ + dialogue:new Array( + "Rock:I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "This wheel is used to lift the dam.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "June 24th, 1957:Trapeze swing breaks. Alice Rutgers is flung Into the ground, resulting in two fractured shins.") + } +, + two:{ + dialogue:new Array( + "July 17th, 1957:Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs.") + } +, + three:{ + dialogue:new Array( + "July 21st, 1957:Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection.") + } +, + four:{ + dialogue:new Array( + "August 5th, 1957:In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain.") + } +, + five:{ + dialogue:new Array( + "August 7th, 1957:How many of us will suffer before we accept the truth of the Seeing One?") + } +, + six:{ + dialogue:new Array( + "August 8th, 1957:I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Indecipherable markings)") + } +, + two:{ + dialogue:new Array( + "December 7th, 2010.(name unreadable). There's nothing up here, except this stupid rock!") + } +, + three:{ + dialogue:new Array( + "Danger! This cave is unexplored.") + } +, + four:{ + dialogue:new Array( + "These cliffs extend far and upwards, though I've never gone high enough to find out where they lead.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Rock:How?") + } +, + two:{ + dialogue:new Array( + "Rock:Warning! Vertical drop, jump at your own risk.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations!", + "I forget why we ended up scrapping it. Perhaps too dramatic.") + } +, + two:{ + dialogue:new Array( + "Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides(i.e., walls)working very well so I just ended up scrapping the idea entirely...or something.", + "There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game.") + } +, + three:{ + dialogue:new Array( + "Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing.", + "Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt.", + "We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard!") + } +, + four:{ + dialogue:new Array( + "PRISON!!!", + "Save us!!!", + "Please!") + } +, + five:{ + dialogue:new Array( + "Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world(90 PER-CENT)\"Non-canon\". Anyways.", + "Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with her tilesets.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVES-", + "PROCEED WITH CAUTION") + } +, + four:{ + dialogue:new Array( + "West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing.") + } +, + three:{ + dialogue:new Array( + "The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home.") + } +, + two:{ + dialogue:new Array( + "COLD STORAGE\n\n^ -- THE MGMT") + } +, + one:{ + dialogue:new Array( + "CONTINUE") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "West:Beach\n\nEast:Forest\n\nSoutheast:\n Rainy Area\n\nNorth:\nTemple Grounds\n\nNorthwest:Chasm") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "West:Land Lake\nSouth, then east:Cliffs") + } +, + two:{ + dialogue:new Array( + "Relaxation pond. Stay a while, we know you have the time.") + } +, + three:{ + dialogue:new Array( + "I'm afraid I may be stuck on this tiny corner forever.") + } +, + four:{ + dialogue:new Array( + "East:Cliffs") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below.") + } +, + two:{ + dialogue:new Array( + "When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone.") + } +, + three:{ + dialogue:new Array( + "The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die.") + } +, + four:{ + dialogue:new Array( + "The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Rock:This is unclaimed territory - not yet a part of The Land.") + } +, + two:{ + dialogue:new Array( + "Rock:These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Rock:Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here!") + } +, + four:{ + dialogue:new Array( + "Rock:Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really.") + } +, + five:{ + dialogue:new Array( + "Rock:My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "Sometimes if you talk to people multiple times, they have new things to say.", + "But not rocks. Rocks don’t do that.") + } +, + two:{ + dialogue:new Array( + "Rock:So close! If only...") + } +, + three:{ + dialogue:new Array( + "Rock:Curiosity is a great thing.") + } +, + four:{ + dialogue:new Array( + "Rock:Oh!...?") + } +, + five:{ + dialogue:new Array( + "The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads:\"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Rock:I’ll bet you’re reading a rock because you don’t have any friends.") + } +, + two:{ + dialogue:new Array( + "Rock:Welcome to Overworld Station. We hope you enjoyed your time in The Land.") + } +, + three:{ + dialogue:new Array( + "Rock:An explorer is you!", + "Rock:Please don't go south. It's under construction.") + } +, + four:{ + dialogue:new Array( + "Rock:Treasure in 5,3!") + } +, + five:{ + dialogue:new Array( + "Rock:Haha, gotcha!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY.") + } +, + two:{ + dialogue:new Array( + "ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG.") + } +, + three:{ + dialogue:new Array( + "WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Rock:Signs indicate the trees have not been active for an extended period of time.") + } +, + two:{ + dialogue:new Array( + "Rock:South:???^ North:???") + } +, + three:{ + dialogue:new Array( + "Rock:The uneven terrain is said to have been formed by the ancestors of the area's inhabitants.") + } +, + four:{ + dialogue:new Array( + "Rock:They appear to be a peaceful species.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Scribbled in what appears to be permanent marker:Greetings, fellow traveler of SPACE and TIME. You have stepped Into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT", + "(Below the message, an engraving:)Here lies ____(unreadable). He got lost in the woods.", + "(Even further below the message:)(just don't go too far south.)") + } +, + two:{ + dialogue:new Array( + "Here lies ____(unreadable. Who wrote this?). He was impaled by rainbows!", + "Would've been better with achievements.") + } +, + three:{ + dialogue:new Array( + "Here lies Burd. The cliffs weren't feeling too friendly.") + } +, + four:{ + dialogue:new Array( + "Here lies bag. It never had a chance.", + "Pretentious!") + } +, + five:{ + dialogue:new Array( + "Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead.") + } +, + six:{ + dialogue:new Array( + "Here lies Dave. He wasn't very inspirational.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay.") + } +, + two:{ + dialogue:new Array( + "To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware.") + } +, + three:{ + dialogue:new Array( + "On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits.") + } +, + four:{ + dialogue:new Array( + "I remember the long sentences I used to write. Ha! Fragmented.") + } +, + five:{ + dialogue:new Array( + "A DANGEROUS SITUATION") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches.") + } +, + two:{ + dialogue:new Array( + "Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze.") + } +, + three:{ + dialogue:new Array( + "Move along.") + } +, + four:{ + dialogue:new Array( + "Do not anger the Chasers with violence.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "SCENIC LANDMARK:Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching Into the sky. Due to safety concerns, the path to the tower has been cut off until further notice.") + } +, + two:{ + dialogue:new Array( + "PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "The statue does not look like it will be moving anytime soon.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "It looks like this statue is firmly in place.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "This statue does not seem to be movable.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars.") + } +, + after_fight:{ + dialogue:new Array( + "Okay, so stars aren't really made of fire. ^Who gives a shit anyway?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "How are you today? I'm the ruler of this partition and Interpretation of space.", + "You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while.", + "Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here.", + "Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me!", + "The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign.", + "Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others...", + "...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation.", + "Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends.", + "I like to think that whenever we're under the Interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next Interpretation. You know, encouragement and the like, their physical presence, those are comforting.", + "I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done.", + "I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different.", + "It was nice to meet you.", + "Oh, you want to hear my story again?", + "Okay, sit tight.") + } +, + gray:{ + dialogue:new Array( + "Hello there. I'm the ruler of this part of space.", + "What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why!", + "Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining!", + "Well, even though I'm the ruler of this part of space, I am not really ruling over anyone.", + "Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist.", + "My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar Interests and desires, and the like. We like to talk a lot about how to rule, and so forth.", + "But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form.", + "So you're not actually talking to their physical forms, but a representation of them in some holographic form.", + "I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much.", + "There's just a small thing lacking when you can't have a one-on-one physical conversation all the time.", + "But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible.", + "It was nice talking at you, good luck with whatever you're up to.", + "You're still here? I can tell you everything again, if you'd like.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Hey ya big bully! I’m not afraid of you!", + "Crickson:Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one!", + "Crickson:Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself!") + } +, + thorax:{ + dialogue:new Array( + "Thorax:I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight!", + "Thorax:Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change!", + "Thorax:Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Buy my stuff") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "What are you doing here, punk? Get lost! I caught it fair and square!", + "I won’t let it go! Not in a million years!") + } +, + inside:{ + dialogue:new Array( + "Oh, did you come here to terrorize me some more?", + "You’re just siding with the cats because they are cute and furry.") + } +, + etc:{ + dialogue:new Array( + "What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!!", + "You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession!", + "Young opens and takes the box. Something is inside it!", + "Icky:Oh. Hey Miao.^\n\nMiao:I’m so glad you’re safe!^\n\nIcky:Uh... thanks for the hand, Young.", + "Icky:To be honest, I kind of like sitting in boxes.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training!", + "Could I follow you around for a bit to watch a Chosen One in action?", + "Hello again, Young! Can I shadow you today?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Hey, Young… have you ever stolen anything?", + "Miao:I like Mitra... and isn’t Wares a handsome bike?", + "Miao:What’s that cool stone thing, Young? Does it make you go back in time?!", + "Miao:I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east.", + "Miao:Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young.", + "Miao:Have you ever sat in a bunch of grocery bags?", + "Miao:Hey Young, do you think it’s wrong to do catnip?", + "Miao:I bet it must have taken a lot of work to become The Chosen One, huh, Young?") + } +, + philosophy:{ + dialogue:new Array( + "That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life?", + "Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy?", + "And then what is our reward for completing our journey? Do we just fade away?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Hi, Young.", + "My name’s not really Icky. It’s Ichabod.", + "I hope Miao Xiao Tuan Er hasn’t been too much trouble.", + "See you later, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside.", + "You can blame me for all of those awful rooms! I made them with the DAME map editor.", + "I made this game with FlashDevelop IDE and the Flixel AS3 framework!", + "Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity.", + "I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate?", + "Hi mom! ^And dad!", + "Want to know how to finish the game in 20 minutes?", + "Ha! Like I'd tell you!", + "(...maybe if you ask me nicely...)") + } +, + marina:{ + dialogue:new Array( + "Woah hey!", + "I wrote a ton of dialogue for this game!^(...but not this dialogue. Melos is doing this.)", + "I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "The humidity here is good for your skin, but bad for your hair.", + "I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones.", + "It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes Into her late 20s. Now she’s got hairline cracks all over her molars.") + } +, + second:{ + dialogue:new Array( + "Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria.", + "Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer.") + } +, + bomb:{ + dialogue:new Array( + "Get away from me.", + "I’m serious... leave me alone now.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "I don’t need your pity, Young.", + "Right, just go on living in your happy little world, “Chosen One”...", + "You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone.", + "Hah, I knew you hated me, Young.", + "I’m doing fine.", + "Of course you don’t care, no one does.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights.", + "It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity.", + "Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal.", + "I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight...", + "I’m sorry, I’m babbling. Thanks for listening.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Heeyyyy, mannn...take a load off, stay a whilleee, eh?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! You found me!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you.", + "Golem:My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked.") + } +, + second:{ + dialogue:new Array( + "Golem:When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men.", + "Golem:At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on.", + "Golem:Actually, I don’t miss watching people much, it’s a bore.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "I’m not a lobster, I’m a langostino. The name’s Hews.", + "Hews:You know what the best part of the ocean is? Being able to see the horizon.", + "Hews:The ocean is like a salty taste of infinity.", + "Hews:A crowded beach is robbed of its grace.") + } +, + second:{ + dialogue:new Array( + "Hews:Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors?", + "Hews:Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Berries are a good kind of food. I like berries.", + "James:Please make sure not to defecate on the berries.", + "James:So far I have had sexual Intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries.", + "James:Do you have any berries for James?") + } +, + second:{ + dialogue:new Array( + "James:I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very!", + "James:Do you like blueberries or raspberries more?", + "James:Do you have any berries for James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Someone came by. They did not want berries. Went to southeast part of lake to the west.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olive:Hi, I'm Olive the rabbit.", + "Olive:I have so much cereal left to eat! I love cereal.", + "Olive:The box is so big. It never ends!", + "Olive:Neverending cereal!", + "Olive:Hmmm...maybe that's not such a bad thing.") + } +, + bush:{ + dialogue:new Array( + "Rank:Eheheh, silly Young! A broom’s no tool for cutting bushes!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh!", + "Rank:The economy has been really struggling under this bush...", + "Rank:Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Oh hey, how are you feeling?", + "Marvin:Where is Justin?", + "Marvin:There's no bottle rockets around...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:Bob the Hamster likes to refer to himself in the third person.", + "Bob:Apostrophes are the root of all e'vil.", + "Bob:quiet! I am busy exuding an aura of hamstery ambiance.", + "Bob:... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong?", + "Bob:A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries.", + "Bob:This game was created by an infinite number of monkeys working on an infinite number of typewriters.", + "Bob:I miss James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Curry is yellow and spicy!", + "Kuribu:For the clever opponent, injure increase!", + "Kuribu:You got the experience of 2!", + "Kuribu:I tell you my phone number! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you.", + "It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes?", + "It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect.") + } +, + quest_event:{ + dialogue:new Array( + "Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Hello.", + "Are you looking for something?", + "What are you looking at?", + "No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't Interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange.") + } +, + quest_event:{ + dialogue:new Array( + "Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "WHOA WHOA WHOA - - - WHO ARE YOU ? ? ?", + "I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B .", + "WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "You actually were...uh, ah. Well done.", + "The shiny rock reflects only a bit of the light from the room. There is writing etched Into it:\"Quickly, before I have to leave again(Std.is(It, getting) very light in here, this always happens)- the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\"") + } +, + quest_event:{ + dialogue:new Array( + "The shiny rock reflects only a bit of the light from the room. There is writing etched Into it:\"Quickly, before I have to leave again(Std.is(It, getting) very light in here, this always happens)- the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "HELLO. HAVE YOU MET cube YET?", + "cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL.") + } +, + gray2:{ + dialogue:new Array( + "WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO?", + "AN INTERSECTION OF WORLDS!") + } +, + gray3:{ + dialogue:new Array( + "NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE.", + "WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...IS THE HOLOGRAM DEVICE WORKING CORRECTLY?", + "NO?^...^DAMN!") + } +, + color1:{ + dialogue:new Array( + "Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot!") + } +, + color2:{ + dialogue:new Array( + "CUBE does a lot of Interesting work!", + "Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe.") + } +, + color3:{ + dialogue:new Array( + "I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE!", + "Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell.") + } +, + colordead:{ + dialogue:new Array( + "(...is it taking a nap?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE.") + } +, + after_fight:{ + dialogue:new Array( + "IS THIS YOUR PUNISHMENT FOR OUR REBELLION?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation?") + } +, + after_fight:{ + dialogue:new Array( + "...We have failed to make you pay for your Interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "So good to see you, Yang. Been too long. Still playing those nentendos, I see?") + } +, + after_fight:{ + dialogue:new Array( + "Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "We have all the finest amenities here. How do you like the Pool?") + } +, + middle_fight:{ + dialogue:new Array( + "How about our state-of-the-art fitness center?") + } +, + after_fight:{ + dialogue:new Array( + "We hope you enjoyed your stay!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Today is a nice day.", + "Thanks for scratching that itch on my neck - I can't seem to reach it.", + "I've heard the eggs at the local diner are quite good. I have a coupon for them, too.", + "Did you see the car accident today? So horrible! He was texting. Such a shame, so young!", + "My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career.", + "Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains.", + "Ah, I think I might be late for work.", + "I am in a bit of a rush to get home, I need to tidy up before the in-laws come over.", + "We're having a garage sale!", + "Welcome!") + } +, + words_teen:{ + dialogue:new Array( + "I didn't see the latest movie.") + } +, + words_kid:{ + dialogue:new Array( + "I never gotta see the new cartoon!") + } +, + family:{ + dialogue:new Array( + "Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors.", + "Do you like Davement? My brother Dave showed me this really cool song by them!") + } +, + older_kid:{ + dialogue:new Array( + "My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes..", + "I guess I'll just go write in my blog.", + "You sure look like you're in a daze.", + "I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it.") + } +, + hanged:{ + dialogue:new Array( + "A note on the corpse:\"Placing myself in danger no more.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, is there something going on outside? A festival? A parade?", + "There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be.") + } +, + paranoid:{ + dialogue:new Array( + "My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me.", + "Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave.", + "Please get out.") + } +, + dead:{ + dialogue:new Array( + "The body of this woman has been beaten to death by a blunt weapon.", + "The man, to put it bluntly, well...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit.", + "According to this pamphlet...you only need to kill a few more people! Keep it up.", + "We only need one more body, and then we can keep going.", + "Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "I don't mind being watched by the trees.", + "Where is she?!", + "I will be with you Young, whenever you are alone.", + "Are you an Ookchot? My mom always warned me about the Dangerous Ookchot.", + "Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea!", + "Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows...", + "Limited time offer! Buy one, get one free - only today!", + "Remember the time that you lit a candle when the power was out?", + "Mmmm, your pillow was cozy last night.", + "This'll teach 'em for calling me the fumi-GAY-tion guy.", + "Wares and I make a good team.", + "I'm the Chosen One-in-training!!!", + "Do you ever feel like, no matter what you do, you can't stop the world from dying?", + "Beware the forest mushrooms...", + "I am sorry. It is my nature.", + "What do you mean, 'Only a rock'?? Rocks can be on cards too, you know!", + "Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy.", + "Sometimes the answer is taking a walk.", + "Why do bats suddenly fly down, every time you're around?", + "NO, *YOU* NEED BRACES!", + "ARE YOU HAPPY NOW?", + "Don't get violent around me.", + "I've always wanted to be on Iron Chef.", + "My mom always told me, 'If you do that arch long enough, your spine will stay that way!'", + "Are you amused yet, human?", + "...", + "Scientifically speaking, toads are a subset of frogs.", + "HAHAHAHA! Yeah! I know!", + "Oh, you collect cards, too? Real classy, Ying.", + "They always said, \"Get off the computer! Or you'll never make friends!\"", + "I'm only the ruler for the extent of a conversation.", + "I'll bet you think you're 'making my job Interesting'!", + "I hate diagonals.", + "Don't even try that claritin clear shit with me.", + "Swipe this card to unlock the door to your room!", + "I'm doing a great job.", + ".......??", + "Who carved all of us anyways?", + "I hope you enjoyed your stay.", + "Seening as you've gotten to this point, you must be quite Intrasting.", + "I'm just here to lead you astray.", + "You like like a pyramid to us, too!", + "It's the same damn play, night after night, and the pay sucks.", + "Leave me alone! My last name isn't Sachs!", + "At least I'm not a stick.", + "What do you mean money doesn't grow on trees? Eheheheh!", + "I'm nothing but an illusion.", + "I'LL TAKE IT OUT ON YOU.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Press", + "to set controls.", + "to cancel.", + "Up", + "Down", + "Left", + "Right", + "Jump", + "Attack", + "Menu", + "Press", + "to exit", + "to set controls.") + } +, + title:{ + dialogue:new Array( + "Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress", + "when done.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Press", + "to start", + "Version", + "Continue", + "New Game", + "Are you sure?\nNo\nYes", + "Really?\nNah\nYeah", + "No going back!\nForget it\nI know", + "deaths", + "cards", + "Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n", + "NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device.", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "Saving...") + } +, + map:{ + dialogue:new Array( + "Map", + "Current Room", + "Door/Exit", + "No Map", + "Return to\nNexus", + "Return to\nentrance") + } +, + items:{ + dialogue:new Array( + "Items", + "Normal", + "Swap", + "Extend", + "Widen", + "A pair of spring-loaded shoes - press", + "to jump!", + "A pair of shoes for biking.", + "An empty cardboard box.", + "A key found in the Temple of the Seeing One.", + "A key found in a red, underground cave.", + "A key found in a mountain cave.") + } +, + cards:{ + dialogue:new Array( + "Cards", + "cards") + } +, + save:{ + dialogue:new Array( + "Save", + "Saved!", + "ERROR", + "Save and go\nto title", + "Go to title", + "Save and quit", + "Quit game", + "Deaths:") + } +, + config:{ + dialogue:new Array( + "Config", + "Set keybinds", + "Set volume", + "Autosave at\ncheckpoints:", + "On", + "Off", + "Change\nResolution:", + "Config UI", + "Touch+D-Pad", + "D-Pad Only", + "Touch Only", + "Move Input:", + "Resolution:", + "Windowed", + "Int. Scaled", + "Stretch", + "Scaling:", + "Language:", + "ja", + "en", + "Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n", + "Resize Window", + "Config Joypad") + } +, + secrets:{ + dialogue:new Array( + "You\'re rolling in it!", + "Once the property of a famous Bubble Mage.", + "If your graphics become scrambled, look at the pakidex entry of an official Pakimon.", + "This heart has no name.", + "Please visit the electric monsters\' world.", + "A kitty statue. Cute, but useless.", + "Oh my!!!!", + "Oh no!!!!", + "It\'s black.", + "It\'s red.", + "It\'s green.", + "It\'s blue.", + "It\'s white.", + ":Select", + ":Back") + } +, + swap:{ + dialogue:new Array( + "Sorry!", + "The swap won't work here.", + "Young could not muster the strength to use the swap here.") + } +, + keyblock:{ + dialogue:new Array( + "This door is locked.") + } +, + treasure:{ + dialogue:new Array( + "Some strange force stops this treasure box from being opened.", + "An engraving on the broom handle reads:Press", + "to sweep.", + "This key may be used a single time to open up a locked barrier.", + "A mysterious pair of boots has nothing but the branding on it, which says \"Press", + "\".", + "A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\"", + "A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\"", + "A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\"", + "YOU FOUND A HEART!!! Maximum Health increased by...zero.", + "Goldman:What? It's not there? That shopkeeper must have stolen it!") + } +, + dust:{ + dialogue:new Array( + "Your broom is now full of dust! Attack again to place it.") + } +, + checkpoint:{ + dialogue:new Array( + "Save game?\n Yes\n No", + "While standing on a checkpoint, press", + "to save your progress and set it as your respawn point if you die.") + } +, + rock:{ + dialogue:new Array( + "There is writing scrawled on this rock:") + } +, + door:{ + dialogue:new Array( + "The portal does not appear to be active.") + } +, + keyblockgate:{ + dialogue:new Array( + "The gate stares, petrified. It won't open until it senses four cards...", + "Sensing four cards, the gate decides to open.", + "The gate stubbornly remains in place.", + "The gate senses all of the cards, and decides to open.", + "The gate senses enough cards, and decides to open.", + "It opens!", + "It remains closed.") + } +, + solidsprite:{ + dialogue:new Array( + "The sign points to the east but the words on it are faded.", + "The sign points to the west but the words on it are faded.", + "The words on the sign are faded.") + } +, + mitra:{ + dialogue:new Array( + "Hey, Young!", + "Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press", + "to jump with them on!", + "Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip Into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press", + "to jump with them on!", + "Alright, take care!", + "Go on, try them out! ...They're not THAT smelly.", + "Cool, huh?", + "Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press", + "to jump\". I've never understood that, though, because there's no \"", + "\" anywhere on the shoes...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye!", + "Finty:I still appreciate that box!", + "Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning!", + "Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead!", + "As a token of my gratitude, take these stylish biking shoes!", + "Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around.", + "Too bad, looks like you can't afford this item! Come back later, when you have the cash!", + "Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99!", + "Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99!", + "Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99!", + "Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99!", + "As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nA game created by\n\nMelos Han-Tani\n\nand\n\nMarina Kittaka\n\n-------------", + "Created from\n\nMarch, 2012\n\nto\n\nJanuary, 2013", + "DESIGN\n------\nBoth", + "PROGRAMMING\n-----------\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\nART\n---\nMarina\n", + "MUSIC/SFX\n---------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\nDIALOGUE\n--------------\nMostly Marina\n", + "STORY\n-----\nBoth\nJapanese Localization:\nKakehashi Games", + "Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game.", + "Olivia - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport.(Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina.", + "Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up.", + "Mo, for believing\n in me.\n\nTina, for Introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it.", + "CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "And we'd like to\nthank YOU!\nFor playing our game!\n\n\nWe hope you\nenjoyed it.", + "\n\n\n\n\n\n\n\n", + "Now you have\nthe ability\nto explore Young's\nworld with(almost)no\nlimitations, via \nthe swap.\n") + } +, + elevator:{ + dialogue:new Array( + "Floor?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancel") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_ES.hx b/AIR/intra/hsrc/data/NPC_Data_ES.hx new file mode 100644 index 0000000..e98bb86 --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_ES.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_ES { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "¿Te gusta la música? ¡Habla con ese terminal!", + "¿Te gusta el dolor? ¡Ve hacia el sur!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "¡Ese acróbata está perdiendo el equilibrio! ¿Dónde está la red de seguridad?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "¡Los leones están acorralando a ese malabarista!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Estoy cansado, Young. Estoy cansado de todas estas vueltas. Me siento como si estuviera viviendo el mismo sueño, la misma pesadilla una y otra vez.", + "Briar:...", + "Briar:No va a cambiar, Young. Esto es lo que seremos por siempre.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Adiós, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Young, colega.", + "Briar:Patalea. Mueve los brazos. Dios, ¡no aguantarías ni un minuto sin mí!", + "Briar:Bien, venga, vamos a por un sandwich o algo.", + "Sage:Lo... lo hiciste adecuadamente. Hasta que nos volvamos a encontrar.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voz misteriosa:¿Hola? ¿...Young? ^EY! ... oh, ¿puedes oírme? Bien, ahora escucha. Estás a punto de despertar. Usarás las teclas de dirección para desplazarte.", + "Pulsarás la tecla \'", + "\' para Interactuar con objetos y la gente a tu alrededor.", + "Y pulsarás la tecla \'", + "\' para acceder al menú, el cual te proporcionará información sobre ti mismo y tus alrededores.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Yo sólo quería arregarlo todo para ti.", + "Espero... Espero que puedas hacerlo mejor que yo.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Buena suerte, Young.", + "Sage tiene razón, en parte. Quiero que todo sea agradable y que funcione a la perfección, y algunas veces eso me hace ignorar la realidad.", + "No sé qué necesitas hacer para ayudar a Briar. No entiendo cómo funciona este mundo o por qué todo parece tan extraño. Pero quiero ser tu amiga, en serio, Young.", + "Estás luchando, Young. Estás Intentando entender. Espero que puedas aclarar las cosas.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... esta es mi advertencia final... espera, ¿quién es?", + "Mitra:¡Mi nombre es Mitra, y esta es mi bici, Wares!", + "Sage:No pregunté por el nombre de tu bicicleta, ¿qué estás haciendo aquí? No te recuerdo.", + "Mitra:Estoy aquí para ayudar a mi amigo, Young...", + "Sage:Young no tiene amigos. Ni siquiera tiene a Briar. Y si tú estás animándolo, ¡entonces te quiero fuera de mi mundo!", + "Mitra:¿Qué quieres decir? Wares y yo--", + "Sage:¡¡¡DEJA DE HABLAR DE TU ESTÚPIDA BICICLETA!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:¡Young! ¿Estás bien? Lo que acabas de hacer ha sido realmente admirable... ¡Continúa y acaba esta estúpida área! ¡Sabemos que puedes lograrlo!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Mira, misterioso personaje encapuchado, no sé quién te crees que eres, ¿pero por qué no nos dejas a solas y punto?", + "Sage:Te crees amiga de Young porque le mentirás y le dirás que en el fondo él es simplemente perfecto y que todo saldrá bien. Bien, si eso es lo que quieres, VALE. Apártate de mi vista, Young.", + "Sage:Ve a hablar con tu \"amiga\".", + "Mitra:Estamos haciéndolo lo mejor que podemos...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Hombre encapuchado:Bueno, ya va siendo hora. Eh...^Quiero decir...^ Saludos, Young(Joven)! Yo soy Sage(Sabio), el Anciano del Pueblo. Has sido convocado aquí porque La Oscuridad se ha extendido a lo largo de la Región. La Oscuridad anda tras el Legendario Briar(Espino), para usar su poder con fines malvados. Debes encontrarlo antes. Debes proteger el Briar.", + "Entra por el portal activo a tu izquierda para empezar tu búsqueda.", + "*Suspiro* No es de buen agüero que aún estés rondando por aquí. Entra por el portal para empezar tu búsqueda. ¡El Briar y, por extensión, el mundo están en extrema necesidad!", + "¡Entra por la maldita puerta ya!") + } +, + after_ent_str:{ + dialogue:new Array( + "¿Aún estás aquí?") + } +, + after_bed:{ + dialogue:new Array( + "Prosigue, Young. Esa llave que has encontrado, puede que haya otras como esa - encuéntralas.", + "Viaja hasta los límites de La Región, Young. Es la única manera de parar La Oscuridad.") + } +, + before_windmill:{ + dialogue:new Array( + "Coge esas tres llaves, Young, y abre el camino a las áreas más recónditas de La Región.") + } +, + after_windmill:{ + dialogue:new Array( + "Has hecho lo que te había pedido, Young, aunque aún queda mucho por hacer. Quizás si exploras los terrenos más recónditos de La Región llegarás a conseguir mayores logros... quizás así le sirvas a Briar para algo.") + } +, + all_card_first:{ + dialogue:new Array( + "Buen trabajo, Young. Has encontrado todas las cartas de un área de La Región, y como resultado, una gema ha aparecido en lo alto del portal de ese área.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Pronto tus habilidades serán puestas a prueba, Young. Para lograr atravesar este templo con vida, necesitarás fuerza y no menos Intelecto. Y llegados a este punto doy por supuesto que has encontrado un arma, ¿no es así?", + "¿¿Pero qu-?? ... Qu-Quiero decir... Sí, por supuesto... ¡una escoba! Esto... justo como fue presagiado en La Leyenda...", + "*gruñidos* ... de todos los incompetent--¡Eh! ¿A qué estás esperando aquí parado?", + "Ándate con mucho ojo, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:Por el momento aún eres débil. Si esperas proteger al Briar de La Oscuridad, debes enfrentarte a tus miedos. La carta que encontrarás en este baúl, y en otros como éste, son símbolos de tu desarrollo, luego adquirirlos es absolutamente vital para tu búsqueda.", + "Esa llave jugará también un papel importante en tu búsqueda. Además debes buscar concienzudamente otras llaves. Selecciona el mapa en la pantalla de menú para teletransportarte de vuelta a la entrada del templo, y continúa tu heroica búsqueda.", + "Viaja al Este y al Sur a través de los terrenos del templo... encontrarás un uso para esa llave.", + "¿Qué quieres? ¿Que te lleve a caballito hasta la puerta o qué?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:¡¿Por qué no me escuchas?! ¡Si te precipitas en esto como un idiota, solamente conseguirás poner en peligro al Briar, a La Región, y a todo por lo que he trabajado! Lo siento, Young, pero si no quieres escucharme tendré que convencerte de otra forma...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... Así no es como yo quería que sucedieran las cosas... Yo pretendía que te convirtieras en mejor persona. Pretendía que fueras capaz de ayudar al Briar. Pero todo esto es solo un absurdo juego... No puedo evitar que llegues hasta El Briar. Tan solo recuerda lo que dije cuando todo se vaya al infierno.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Hola, Young. Cuando te conviertas en alguien más fuerte y más sabio, este camino te llevará al Briar.", + "Sage:No estás preparado, Young, primero debes afrontar más pruebas en La Región.", + "Sage:Has hecho progresos, Young, pero debes poseer al menos 36 cartas para pasar a través de esta verja.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... eh... ¿tienes al menos 36 cartas? Pero no estoy seguro de que estés preparado para la verdadera prueba. De hecho, mira, estábamos leyendo mal esta verja, en realidad necesitas...\n...\n........\n¡92 cartas para atravesarla, no 36!", + "Sage:Young, no vayas ahí, ¡aún no estás preparado! ¡Piensa en El Briar! ¡La Región! ¡Todo esto no habrá valido para nada si no estás preparado!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Un trabajo excelente, Young. Tenías que conquistar no sólo este monstruo, ¡¡¡sino también tus propios miedos para prevalecer!!!", + "Sage:Por supuesto, aún te queda un largo camino por recorrer. ¿Has estado explorando La Región?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Bien hecho, Young. Sin embargo, aún quedan pruebas por afrontar. No bajes la guardia.", + "Sage:¿Has escontrado ya todas las llaves, Young? Si no es así, ve a la playa.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "¡No soy como los otros! *ladrido* No te haré daño...", + "Aquí se vive muy tranquilamente.", + "Hueles como a acelga.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "¡Lo hiciste, Young! ¡Derrotaste a La Oscuridad! ¡Mira este sitio! ¡Es precioso!", + "Tan precioso...") + } +, + dump:{ + dialogue:new Array( + "¡Oh, gracias a Dios que estás aquí! Estaba preocupado por si te habías quedado atrapado en ese vertedero todo nevado... ¡Ahí todo es jodidamente deprimente! ¡Ja!", + "Jajaja. Jajajajaja. ¡JAJAJAJAJAJAJA!") + } +, + drink:{ + dialogue:new Array( + "Oye encanto, ¡te invito a un trago!", + "¡Toma otro trago, mierdecilla! ¡Jajaja!") + } +, + hot:{ + dialogue:new Array( + "Joder, qué calor hace aquí... Estoy tan caliente... y sudaaado...", + "¡Maldita sea! ¡Entrenar me pone cachondo!") + } +, + gold:{ + dialogue:new Array( + "¿Sabías que este lugar está hecho de oro? ¡Oro de verdad! ¡Podríamos escapar juntos y vivir de este ladrillo de aquí! ¡Jajajajaja!", + "En serio, ¿qué estás haciendo ahí parado? ¡Ayúdame a levantar este ladrillo!") + } +, + briar:{ + dialogue:new Array( + "???:Young... !Al final lO hiCisTE¡ !ME AHs SalvaDO¡ !!!!!AgoRA ToDo IRa BEIN de NUeVO¡¡¡¡¡") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "¡CUIDADO!", + "Siento eso... Iba demasiado deprisa. Oh, ¡no te había visto nunca antes! ¿Tú también eres un viajero como yo? ... ¿Eh? ¿Que quieres proteger al Briar de La Malvada Oscuridad? ... ^Bien... No tengo ni idea de lo que me hablas, ¡pero suena guay, supongo!", + "Voy de acá para allá, llevando mi género... ¿Qué? No, no soy una vendedora ambulante. ¡Wares(Género)es el nombre de mi bicicleta!", + "Bueno, puede que nos encontremos en otra ocasión. Si oigo lo que sea acerca de ese Briar, te lo haré saber.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "¡CUIDADO! Bien, Wares, ¡vamos allá!", + "Yyyy ¡presto!", + "No pares, Young, ¡nosotros te cubrimos!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "¿Te acuerdas de mí? Olvidé presentarme la última vez, solo te presenté a mi bicicleta, Wares. Mi nombre es Mitra.", + "¿Te acuerdas de mí? Olvidé presentarme la última vez, soy Mitra, y esta joven bicicleta tan bonita se llama Wares.", + "Mitra:¿Y cómo te ha ido, Young? ¿...qué? ¿Que cómo sé tu nombre? Te parece extraño, ¿verdad? Bueno, lo vi en la parte trasera de tu sudadera.", + "Mitra:¡Nos vemos, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Eh, acabo de recordar - alguien dijo que estaban Intentando encontrar algo antes. No estaba segura de a qué se referían, así que dijeron que irían hacia las montañas - salieron corriendo.") + } +, + game_hints:{ + dialogue:new Array( + "Nada.", + "Oh, ¿estás perdido? ¿Te has pasado por la playa? Quizás alguien de por allí pueda ayudarte. Parece que esa llave tuya forme parte de un manojo. ¿Tendrás que encontrar más?", + "Oh, ¿estás perdido? ¿Has mirado en el bosque, hacia el Este? Esa llave que tienes - parece que forma parte de un manojo. ¿Tendrás que encontrar otras?", + "¡Mira todas esas llaves! Creo que vi algunas puertas hacia el Sudeste. ¿Tendrás que usarlas allí?", + "¡Eh, vi que encendiste el molino de viento! ¿Sabes si ha tenido algún efecto en La Región?", + "Eh, Young. ¡Guau! ¡Has estado en verdad reuniendo todas esas cartas! ¿Has descubierto ya para qué sirven? ¡Podrías ganar un pastón vendiéndolas!", + "¿Qué es ese nuevo accesorio que tienes en la escoba? ¿Te permite alterar la estructura del mundo...? La verdad, eso da mucho miedo, Young. Me alegro de que no parezca funcionar en cualquier sitio, quizás solo en los más profundos, extraños recovecos de La Región.", + "¿Qué tal funcionan mis zapatos saltarines? ¿De maravilla, eh? Me están gustando mis nuevos zapatos para ir en bici. ¡Hacen de Wares y de mí un equipo incluso mejor!", + "¡Qué guay, Young, encontraste otra llave! ¡A Wares le gusta el color! ¿Has encontrado ya un lugar donde usarlas?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has buscado bien por el área del templo de El-Que-Todo-Lo-Ve?", + "Mitra:Eh, Young, ¿buscando una carta?\nHe oído que hay un laberinto por la salida trasera del templo de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nQuizás encuentres algo cerca de la guarida de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nHabía una sala repleta de enemigos en el templo de El-Que-Todo-Lo-Ve, ¿me equivoco?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has mirado bien dentro del templo de El-Que-Todo-Lo-Ve?", + "Mitra:Eh, Young, ¿buscando una carta?\nIntenta buscar en el área vestigial cerca de la salida trasera de la guarida de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nPuede que tu vecino sepa algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nEse tipo de tu cuarto estaba escondiendo algo...", + "Mitra:Eh, Young, ¿buscando una carta?\nEn algún lugar cerca de la entrada de tu cuarto...¡mira por allí!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has buscado *por todos lados* en tu cuarto?", + "Mitra:Eh, Young, ¿buscando una carta?\n¡Justo al Sur de aquí hay una isla! No he ido allí, pero deberías inspeccionar el sitio.", + "Mitra:Eh, Young, ¿buscando una carta?\nHay un montón de cosas por descubrir si sigues los ríos. ¡Mira bien!", + "Mitra:Eh, Young, ¿buscando una carta?\nSé que alguien dejó una cerca del molino de viento.", + "Mitra:Eh, Young, ¿buscando una carta?\nMira cerca de los ríos del bosque...", + "Mitra:Eh, Young, ¿buscando una carta?\nFisgonea alrededor de la base de las montañas.", + "Mitra:Eh, Young, ¿buscando una carta?\nIntenta llegas hasta la cumbre de las montañas.", + "Mitra:Eh, Young, ¿buscando una carta?\nEl extremo alejado de la playa puede que guarde algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nDate una vuelta por el bosque carmesí.", + "Mitra:Eh, Young, ¿buscando una carta?\nHabía muchas puertas cerradas con llave en una de esas cuevas rojizas, ¿verdad?", + "Mitra:Eh, Young, ¿buscando una carta?\nVe a la cueva rojiza situada más al norte, ¡comprueba el nacimiento del río!", + "Mitra:Eh, Young, ¿buscando una carta?\nMmm...¿miraste bien por todo ese laberinto oscuro?", + "Mitra:Eh, Young, ¿buscando una carta?\nRecuerdo que había un camino bastante lúgubre de lanzallamas en algún lugar. ¡Algo debe de haber al final del mismo!", + "Mitra:Eh, Young, ¿buscando una carta?\nEsa gente del circo tiene que estar ocultando algo. ¿Miraste por todos lados?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has echado un vistado por el perímetro del gran foso de esa pareja?", + "Mitra:Eh, Young, ¿buscando una carta?\nEsa pareja que gusta tanto de estar por un foso. Deben estar escondiendo algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nAlgunas veces hay cosas escondidas al otro lado de los abismos - ¡especialmente en cuevas montañosas!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has registrado las partes más altas de la cueva montañosa?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Habrá algo en las profundidades de esa cueva montañosa?", + "Mitra:Eh, Young, ¿buscando una carta?\nEse cubo lleno de colorido que está en ese lugar tan raro - ¡probablemente tenga algo!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has hablado con el cubo gris de esa zona que parece tan salvaje? Puede que sepa algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nEl último piso de ese hotel está un poco desmoronado, ¡pero seguro que allí hay algo!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Entraste a todas las habitaciones de la 3ª planta del hotel?", + "Mitra:Eh, Young, ¿buscando una carta?\nApuesto a que alguien dejó algo por ahí tirado en la 2ª planta del hotel.", + "Mitra:Eh, Young, ¿buscando una carta?\n¡El propietario del hotel podría haber dejado algo para ti!", + "Mitra:Eh, Young, ¿buscando una carta?\nEsos puentes rotos allá por el Noroeste...¡mira por allí!", + "¿...Qué? ¿Que no has encontrado *ninguna* carta? Pero hombre, Young, ¿qué locura es esta? Algunas veces en la vida es necesario ser Intrépido, abrir alguna que otra caja, ¿sabes?") + } +, + general_banter:{ + dialogue:new Array( + "¿Encontraste a ese tipo que estaba buscando algo en las montañas?", + "¿Sabes cuál es el apellido de mi bici? ...¡So! ¿Lo pillas? ¡Género So! ...Es broma, las bicicletas no tienen apellidos.", + "¿Crees que debería comprarme un candado? No me gustaría tener que atar a Género así, pero se oye tanto hablar sobre bicicletas robadas estos días...", + "Así que... ¿qué es El Briar? ¿Algún tipo de artefacto antiguo de una cultura perdida?", + "Me pregunto por qué no habré oído nada acerca de la llegada de La Oscuridad. Supongo que mucha gente de la región está concentrada en sus propias luchas diarias.", + "Eh, Young, solo quería decirte que... tu pelo mola un montón.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Estatua:El Anciano del Pueblo sólo en nombre, pues no es ninguno.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Estatua:He visto una escoba en una leyenda... que estaba en el plano del armario de un conserje.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Estatua:Adquirir tarjetas es vital para tu búsqueda. Adquirir tarjetas también es vital para otros fines, como obtener crédito o comprar bebidas alcohólicas.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Estatua:Un trabajo excelente, Sage. ¡¡¡Has tenido que conquistar no sólo tu temperamento sino también tu amor propio para decir algo tan cutre!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Cuando te hayas convertido en un individuo más estresado y apático, este sendero te llevará a los Breyers. ¡Reconfórtate bebiendo, perdedor!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Una vez un hombre vino e instaló un espejo en nuestro cuarto de baño. Yo tenía miedo de que hubiera una cámara oculta dentro de él. Registré cada pulgada del marco de madera, echando Don Limpio en las grietas, creyendo que eso cortocircuitaría los cables. Por supuesto, nunca encontré nada.", + "Edward:Este templo está dedicado a El-Que-Todo-Lo-Ve. No sé por qué he venido aquí, pero tengo demasiado miedo para entrar dentro.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:¿Problemas? Bueno, me imagino. Todo lo que tienes es una escoba, y todo lo que las escobas pueden hacer es mover mugre.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:¿Dices que has vencido a El-Que-Todo-Lo-Ve? Ja. ¿No entiendes que esto no funciona así? Lo único que estás haciendo es echar detergente en las grietas.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, ¿no es una monada? Nuestro querido y joven Young, jugando a ser el héroe. Pero he estado observando cada paso que has dado en \"La Región\", y déjame decirte, Young, que no todo el mundo de por aquí es tan honesto como yo. ¡Ten cuidado en quien confías!") + } +, + after_fight:{ + dialogue:new Array( + "Estaré contigo, Young, siempre que estés solo. Y recuerda mi consejo en tu pequeña \"aventura\".") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Roca:La visión periférica es la colmena de los demonios.") + } +, + two:{ + dialogue:new Array( + "Roca:Por-hacer:Construir un método de teletransporte hasta Nexus. Progreso:Detenido - El-Que-Todo-Lo-Ve no quiere proporcionar los fondos necesarios para hacer posible la empresa. Tendremos que volver al método original del inexplicable portal.") + } +, + three:{ + dialogue:new Array( + "Roca:Estoy atrapado aquí a solas. El trabajo no cesa en este túnel, y al menos puedo ver un poco de progreso cada día.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Este torno se usa para levantar el dique.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 de junio de 1957:Las cuerdas del trapecio se rompen. Alice Rutgers se precipita violentamente al suelo, acabando con dos espinillas rotas.") + } +, + two:{ + dialogue:new Array( + "17 de julio de 1957:Siete payasos se retiran con problemas casi fatales de pulmón. Se sospecha de la marca de cosméticos LANDBLEND, pero ninguna investigación oficial se lleva a cabo.") + } +, + three:{ + dialogue:new Array( + "21 de julio de 1957:Debido a un fallo de la jaula, mi cara y mi costado quedan severamente destrozados por un león indomado. Sobrevivo, pero ahora estremezco al mirar mi propio reflejo.") + } +, + four:{ + dialogue:new Array( + "5 de agosto de 1957:En mi sueño, vi una cara hecha de piedra con fieros, brillantes ojos. Hablaba de la verdad de nuestra existencia y fue el primero en ofrecer la liberación del dolor.") + } +, + five:{ + dialogue:new Array( + "7 de agosto de 1957:¿Cuántos de nosotros sufrirán antes de que aceptemos la verdad de El-Que-Todo-Lo-Ve?") + } +, + six:{ + dialogue:new Array( + "8 de agosto de 1957:He tomado una decisión. Algunos de los otros han dicho que me seguirán. Esta será mi actuación final. Que El-Que-Todo-Lo-Ve tenga consideración por todos nosotros.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Marcas indescifrables)") + } +, + two:{ + dialogue:new Array( + "7 de diciembre de 2010.(nombre ilegible). ¡No hay nada aquí arriba, excepto esta estúpida roca!") + } +, + three:{ + dialogue:new Array( + "¡Peligro! Esta cueva está inexplorada.") + } +, + four:{ + dialogue:new Array( + "Estos precipicios se extienden lejos hacia arriba, aunque nunca he subido lo suficiente como para saber a dónde llevan.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Roca:¿Cómo?") + } +, + two:{ + dialogue:new Array( + "Roca:¡Advertencia! Caída en picado, salte bajo su propio riesgo.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Esta solía ser una animación comodín para las verjas que se abren con cartas. ¡Acércate dos veces para ver las animaciones de cierre y apertura!", + "He olvidado por qué acabamos desechándola. Quizás por demasiado dramática.") + } +, + two:{ + dialogue:new Array( + "¡Aquí hay tests para varias capas de suelos y colisiones! No pude lograr que funcionaran bien los suelos de dirección única desde cada lado(p.ej., muros), así que acabé desechando la idea por completo... creo.", + "Había alguna razón por la que no las usamos. Simplificar diseño, lo cual era importante para nosotros para acabar el juego.") + } +, + three:{ + dialogue:new Array( + "Los enemigos solían ser capaces de soltar llaves. Deseché esta idea pese a que tenía algo de encanto.", + "Otra idea que tanteamos fue la de tener puertas de desafío, las cuales se encontraban tras filas de enemigos, y solo se abrían cuando las alcanzabas sin que te hirieran.", + "Queríamos diseñar todas las mazmorras de esta forma y desechar los puntos de vida por completo, ¡pero resultó ser demasiado difícil!") + } +, + four:{ + dialogue:new Array( + "¡¡¡PRISIÓN!!!", + "¡¡¡Sálvanos!!!", + "¡Por favor!") + } +, + five:{ + dialogue:new Array( + "¡Te damos la bienvenida al MUNDO DEBUG! Has salido fuera de \"La Región\", así que considera este mundo(90 POR-CIENTO)\"No canónico\". En fin.", + "Antes de que hubieran sets de suelos para muchas de las áreas, usaba suelos como estos para marcar dónde iban las puertas. De hecho, cada mazmorra fue modelada con el set de suelos de este área, y luego Marina fue sustituyendo estos suelos por las suyas.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVOS-", + "PROCEDA CON PRECAUCIÓN") + } +, + four:{ + dialogue:new Array( + "Oeste. Fisura. ¡Realidad! Valores de condición bajos y reales, huracán, viejo, acabado. Relajante.") + } +, + three:{ + dialogue:new Array( + "El-Que-Todo-Lo-Ve, por lo que puedo recor- rcrr,,,,,,un Buen Rato En Casa.") + } +, + two:{ + dialogue:new Array( + "LUGAR DE ALMACENAMIENTO EN FRÍO\n\n^ -- LA DIRECCIÓN") + } +, + one:{ + dialogue:new Array( + "CONTINÚA") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Oeste:Playa\n\nEste:Bosque\n\nSudeste:\n Área lluviosa\n\nNorte:\nJardines del templo\n\nNoroeste:Abismo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Oeste:Lago\nSur, luego Este:Precipicios") + } +, + two:{ + dialogue:new Array( + "Estanque de la relajación. Quédate un rato, sabemos que tienes tiempo de sobra.") + } +, + three:{ + dialogue:new Array( + "Me temo que me quedaré atrapado en esta diminuta esquina para siempre.") + } +, + four:{ + dialogue:new Array( + "Este:Precipicios") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "El sendero se abrirá cuando las baldosas de los guardianes oscuros sean reemplazadas por sus respectivos colores espirituales en el tablero de abajo.") + } +, + two:{ + dialogue:new Array( + "Cuando la estatua de piedra azulada se apartó\nUn nuevo sendero fue revelado\nMás allá de los precipicios, atravesando extrañas dimensiones\nSe halla un hotel de viajeros\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién gobierna este abarrotado lugar de negocios?\"\nA pesar de las muchas almas humanas\nAún me siento solo.") + } +, + three:{ + dialogue:new Array( + "La roja y oxidada estatua se movió\nY abrió el camino hacia más profundas fosas\nUna mazmorra laberíntica a continuación\nY después una gran carpa de circo\n\n\n\"¿Quiénes son los guardianes?\" Pregunto,\n\"¿Quiénes renunciaron a la vida para huir de este lugar?\"\nTemo al dolor, al igual que ellos\nPero temo a la muerte más aún.") + } +, + four:{ + dialogue:new Array( + "La verde, metálica estatua se apartó\nAbriendo un sendero más profundo\nHogares suburbanos y aceras forman\nUn camino hacia un apartamento.\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién busca consuelo en las estrellas?\"\nSolo, me siento como si estuviera siendo observado\nY no por la amigable luz de las estrellas.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Roca:Esto es territorio de nadie - ni siquiera de La Región.") + } +, + two:{ + dialogue:new Array( + "Roca:Estos -^ yo y mis^ - círculos son^ - promesas...^ - círculos^ - Intentaré acabarlo todo...^ - concéntricos. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Roca:Ten cuidado^ -...pero yo siempre^ - por dónde pisas^ - ¿consigo reaparecer, no?^ - ¡cuando estés aquí!") + } +, + four:{ + dialogue:new Array( + "Roca:Mirando hacia abajo^ - Y me di cuenta:^ - desde aquí, tú- ^ Lo amo.^ - puedes ver...nada, realmente.") + } +, + five:{ + dialogue:new Array( + "Roca:Mis disculpas -^ Pos claro, -^ por este desorden -^ mantengámonos en contacto-^ pero ese portal debería^ - e Intentaré darte mis opiniones - ^ devolverte a La Región.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "A veces si hablas con la gente varias veces tiene nuevas cosas que decir.", + "Pero no las rocas. Las rocas no hacen eso.") + } +, + two:{ + dialogue:new Array( + "Roca:¡Muy cerca! Si tan solo...") + } +, + three:{ + dialogue:new Array( + "Roca:La curiosidad es algo grande.") + } +, + four:{ + dialogue:new Array( + "Roca:¡Oh!¿..?") + } +, + five:{ + dialogue:new Array( + "El ordenador tiene un e-mail abierto. Partes de la pantalla están rotas, por eso solo algunas partes del mensaje son visibles entre manchas negras. El e-mail pone:\"¡Hola, Young!\" Parece que [...] quincuagésima carta [...] quizá no deberías... [...] la pena pensárselo! ¿Crees que estás listo? Despierta...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Roca:Apuesto a que estás leyendo una roca porque no tienes amigos.") + } +, + two:{ + dialogue:new Array( + "Roca:Bienvenido a la estación del Mundo. Esperamos que haya disfrutado de su estancia en La Región.") + } +, + three:{ + dialogue:new Array( + "Roca:¡Eres todo un explorador!", + "Roca:Por favor, no vayas al Sur. Está en construcción.") + } +, + four:{ + dialogue:new Array( + "Roca:¡Tesoro en 5,3!") + } +, + five:{ + dialogue:new Array( + "Roca:Jaja, ¡te pillé!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NACEMOS ENTRE LA DESCOMPOSICIÓN DEL CUERPO DE NUESTRA MADRE") + } +, + two:{ + dialogue:new Array( + "UN DÍA NUESTRA MADRE DEJÓ A SU MADRE Y SE AVENTURÓ EN LA NIEBLA VENENOSA.") + } +, + three:{ + dialogue:new Array( + "NUNCA PEDIMOS ESTO. NO HABRÍAMOS COMPRADO NUESTRAS VIDAS CON SU SUFRIMIENTO.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Roca:Las señales indican que los árboles no han estado activos por un largo periodo de tiempo.") + } +, + two:{ + dialogue:new Array( + "Roca:Sur:???^ Norte:???") + } +, + three:{ + dialogue:new Array( + "Roca:Se dice que el terreno irregular ha sido formado por los ancestros de los habiantes del área.") + } +, + four:{ + dialogue:new Array( + "Roca:Parecen una especie apacible.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Garabateado con lo que parece un rotulador permanente:Saludos, compañero viajero del ESPACIO y TIEMPO. Te has adentrado en una grieta muy lejos del área yuxtapuesta de YOUNG. Digamos que has cruzado como un OCÉANO o dos. No te preocupes por el CONTRASTE, podrás volver a tu aventura normal en breve. No TEMAS este lugar, aunque parezca FATÍDICO y PELIGROSO descubrirás que sus habitantes son bastante SIMPÁTICOS.\n -- La Dirección", + "(Bajo el mensaje, un grabado:)Aquí yace ____(ilegible). Se extravió en los bosques.", + "(Aún más abajo del mensaje:)(no vayas muy al Sur.)") + } +, + two:{ + dialogue:new Array( + "Aquí yace ____(ilegible. ¿Quién ha escrito esto?). ¡Fue empalado por arcoíris!", + "Habría sido mejor con logros.") + } +, + three:{ + dialogue:new Array( + "Aquí yace Burd. Los precipicios no fueron muy agradables que digamos.") + } +, + four:{ + dialogue:new Array( + "Aquí yace bolsa. Nunca tuvo oportunidad.", + "¡Pretencioso!") + } +, + five:{ + dialogue:new Array( + "Aquí yace Savitch. Intentó arreglar mi ordenador en el garaje una vez, y no cogió mucho espacio mientras. Tres años después, aún no había terminado. Entonces, cayó muerto.") + } +, + six:{ + dialogue:new Array( + "Aquí yace Dave. No era muy inspirador.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---YOUNG TOWN(CIUDAD JOVEN)---^\nBienvenido a Young Town. Por favor, tenga cuidado con algunos de los ciudadanos. No son muy sociables...camine con precaución. Young Town fue fundada en los 90 por el alcalde Ying como parte de una serie de continuos proyectos de ingeniería civil, cuyo nombre fue elegido como muestra del rechazo de Ying de poseer el nombre Ying, y el beneplácito de poseer el nombre Young. Esperamos que disfrute de su estancia.") + } +, + two:{ + dialogue:new Array( + "Al Oeste se encuentran los legendarios templos de El-Que-Todo-Lo-Ve. Al Este se encuentra la vivienda de nuestro maravilloso alcalde Ying, que permanece cerrada al público - quedan advertidos.") + } +, + three:{ + dialogue:new Array( + "En su quinta visita, el alcalde Ying se frustró por la falta de aparcamientos. Este aparcamiento refleja la frustración de Ying por la falta de aparcamientos. Ying aparcaría ocasionalmente en este aparcamiento en subsiguientes visitas.") + } +, + four:{ + dialogue:new Array( + "Recuerdo las largas frases que solía escribir. ¡Ja! Fragmentado.") + } +, + five:{ + dialogue:new Array( + "UNA SITUACIÓN PELIGROSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "El-Que-Todo-Lo-Ve lo sabe todo y llevará a uno a la iluminación. El camino a la iluminación no está iluminado por ninguna antorcha.") + } +, + two:{ + dialogue:new Array( + "No te apartes del camino de El-Que-Todo-Lo-Ve, ni siquiera por los tesoros que aguardan en las esquinas lejanas del laberinto.") + } +, + three:{ + dialogue:new Array( + "Muévete.") + } +, + four:{ + dialogue:new Array( + "No hagas enfadar a los Acosadores con violencia.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "LUGAR CONOCIDO:La Pareja de Torres. Construidas hace algún tiempo, la Pareja de Torres tiene vistas a las montañas lejanas. La primera torre fue dañada hace poco y desde entonces le ha sido asignada otro uso. La segunda está plantada al Este, rozando el cielo. Debido a asuntos de seguridad, el sendero hacia la torre ha sido vedado hasta nuevo aviso.") + } +, + two:{ + dialogue:new Array( + "AVISO DE SEGURIDAD PÚBLICA:^\nEsta torre, cuando no estaba dañada, decíase poseer una brecha dimensional en lo alto de la misma. Proceda con precaución y una mente abierta.^\n -- La Dirección") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "No parece que la estatua vaya a moverse en breve.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Parece que esta estatua permanece firme en su lugar.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Esta estatua no parece que sea movible.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Qué bonito es el fuego, ¿verdad? Qué lástima que la deslumbrante luz de las farolas eclipse el fuego de las estrellas.") + } +, + after_fight:{ + dialogue:new Array( + "Vale, pues las estrellas no están hechas de fuego. ^De todas formas, ¿a quién coño le importa?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "¿Qué tal estás hoy? Soy el soberano de esta partición e Interpretación del espacio.", + "¿Quieres saber por qué soy el soberano de este lugar? Te lo diré, pero va a llevarnos un rato. Un buen rato. Un aborrecible y largo rato.", + "En serio, bastante rato. No, de verdad, ¡te estoy advirtiendo! Tiendo a divagar. Quizá sería mejor que te pusieras a vaciar el contenido de ese baúl de ahí. O que te dirigieras al hotel de más allá. No sé cómo llegó hasta ahí, he oído que tienen precios relativamente bajos. No es que el dinero importe aquí.", + "¿Que por qué soy el soberano?^...No estoy seguro del porqué, pero mis amigos de por aquí vieron apropiado asignarme este cargo, debido al estado apremiante de este espacio. Quizá esta sea la causa de que los cubos sean los mejores en permanecer quietos en superficies planas. En cuanto a por qué alguien necesita estar sentado aquí arriba - ¡eso es algo que me supera!", + "Los otros - mis amigos de por ahí - tienen sus propios méritos. No es que no puedan sentarse aquí arriba en un futuro, solo que no pueden hacerlo ahora. A veces nos turnamos para ocupar el puesto de gobernante, ¡pero cada vez tenemos que reinterpretar esta región del espacio! Puede ocurrir que el Sr. o la Sra. Pirámide vengan aquí arriba porque hayamos decidido darle al trono una forma tal que se adecúe mejor a ellos, reimaginando este mundo, por decirlo de alguna forma. ¿Parece estúpido? Podría ser. Pero así es como es. Sucede bastante rápido. Minutos, horas - no necesariamente un largo reinado.", + "Aunque, cuando soy el gobernante, me siento un tanto extraño...Me siento aislado de alguna forma, evitando relacionarme con los demás...", + "...pero aislamiento no es la palabra correcta, aunque abarca parte de la sensación. No estoy aislado, y no me disgustan los demás. Todos nos consideramos amigos, pero ya sabes, nadie sube aquí arriba excepto para decir unas palabras. ¡Así que tengo que pensar sobre cosas o puedo volverme loco! Tal vez eso sea parte del aislamiento.", + "Fuera de esas preguntas sin sentido sobre *por qué* estamos aquí ocupando este espacio, siento curiosidad por saber por qué somos amigos siquiera.", + "Me gusta pensar que siempre que estamos bajo las Interpretaciones para las cuales soy el mejor para gobernar, me alientan a ser capaz de mantener esta posición tanto como se tarde en alcanzar la siguiente Interpretación. Ya sabes, ánimos y tal, su presencia física, ese tipo de cosas son reconfortantes.", + "Supongo que eso es suficiente para satisfacerme, aunque sería genial que uno o dos probaran y entendieran cómo me siento sobre ser un gobernante. ¡No es que me esté quejando sobre los ánimos! Pero quizá entonces podríamos tener varios gobernantes...¡qué desvarío! Tal vez eso implique que cuando no sea gobernante deba actuar de la misma forma en la que a veces deseo que ellos actuaran...quién sabe si eso se puede hacer.", + "Ya he divagado demasiado. Si te diriges hacia allá, hay otra región del espacio similar, aunque creo que huele un poco distinto.", + "Un placer haberte conocido.", + "Oh, ¿quieres escuchar mi historia de nuevo?", + "Muy bien, ponte cómodo.") + } +, + gray:{ + dialogue:new Array( + "Qué tal. Soy el soberano de esta parte del espacio.", + "¿Cómo está la cosa? ¿Que quieres saber por qué estoy aquí? ¿Estás seguro? ¡Me llevará bastante explicar por qué!", + "Bien, si insistes. Aunque quizá sería mejor que te dirigieras a ese hotel de ahí. No sé por qué siguieron adelante con su construcción. ¡Si tuviera que pagar impuestos, seguro que me quejaría!", + "Bueno, aunque sea el gobernante de esta parte del espacio, realmente no estoy gobernando sobre nadie.", + "Mis amigos - todos son gobernantes de sus propias partes del espacio. No gobiernan sobre nadie tampoco - estamos solos en ese aspecto. Pero no estamos solos en tanto que hablamos entre nosotros, ni tampoco estamos solos en otros aspectos. Este es solo un lugar en el que existo.", + "Mis amigos y yo - nuestras partes del espacio tienen mucho en común con las suyas en tanto a por qué existen y cómo están organizadas. Intereses y deseos similares, y ese tipo de cosas. Nos encanta hablar sobre cómo gobernar y demás.", + "Pero lo triste es que raramente, si alguna vez se da el caso siquiera, alcanzamos a encontrarnos en persona.", + "Así que en realidad no hablas con sus formas físicas, sino con un tipo de representación holográfica suya.", + "Lo sé, es una lástima. Es una lástima porque tenemos tanto en común, pero tan solo podemos ayudarnos como amigos.", + "Es una pequeña cosa que echas en falta cuando no puedes tener una conversación cara a cara todo el tiempo.", + "Pero no me estoy quejando. ¡Eso es mejor que nada en absoluto! No puedo ni imaginar cómo seria de otra forma. Algo terrible.", + "Ha estado bien hablar contigo, buena suerte con lo que sea que estés haciendo.", + "¿Aún estás aquí? Puedo contártelo todo de nuevo, si quieres.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:¡Hey, tú, abusón! ¡No te tengo miedo!", + "Crickson:¡Cabeza hueca! ¡No voy a salir corriendo! ¡Ni siquiera si Intentas darme una buena!", + "Crickson:Tan solo eres un idiota de mierda, ¡eso es lo que eres! ¡Deberías avergonzarte de ti mismo!") + } +, + thorax:{ + dialogue:new Array( + "Tórax:Soy el tórax, y hablo en nombre de las abejas.\n^¡Su destino es incierto, ciertamente!\n^¡En algunas colonias todas las obreras se han ido!\n^Estas colonias morirán, ¡y no es que eso sea algo agradable de ver!", + "Tórax:Quizá sea un virus o un nuevo pesticida,\n^¡quizá sean las larvas de esos asquerosos fóridos!\n^Está haciendo que todas las abejas actúen de un modo muy extraño.\n^¡Sea lo que sea, es preciso que cambie!", + "Tórax:Vale, no sé qué está pasando realmente\n^Me preocupa que mis esfuerzos sean nada más que cháchara.\n^¿Pero cómo voy a quedarme de brazos cruzados?\n^¡Voy a escribirlo en Facebook, Twitter y Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Cómprame algo") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente!", + "¡No voy a soltarla! ¡Ni en un millón de años!") + } +, + inside:{ + dialogue:new Array( + "Oh, ¿viniste aquí para aterrorizarme más aún?", + "Estás de parte de los gatos solo porque son monos y peludos.") + } +, + etc:{ + dialogue:new Array( + "¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente!^ ¡Hostia!^ ¿Eso es--?^ ¿¿¿OTRO GATO???^ ¡¡¡LA MADRE QUE...!!!", + "Has... has limpiado mi casa... ¡Eso me ha llegado al alma! ¡Toma, quiero darte mi más preciada pertenencia!", + "Young toma y abre la caja. ¡Hay algo dentro de ella!", + "Icky:Oh. Hey Miao.^\n\nMiao:¡Me alegro tanto de que estés bien!^\n\nIcky:Uh... gracias por la ayuda, Young.", + "Icky:Si te soy sincero, meterme en cajas es algo que me gusta.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "¡¡Oh!! ¡¡¡Tú eres Young, El Elegido!!! Odiosmio, ¡qué gran honor! Mi nombre es Miao Xiao Tuan Er, aspirante a Elegido!", + "¿Puedo seguirte un ratillo para ver a un Elegido en acción?", + "¡Hola de nuevo, Young! ¿Puedo seguirte hoy?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Eh, Young... ¿alguna vez has robado algo?", + "Miao:Me gusta Mitra... ¿y no te parece que Género es una bicicleta muy bonita?", + "Miao:¿Qué es esa cosa de piedra tan chula, Young? ¡¿Hace que puedas volver atrás en el tiempo?!", + "Miao:Me estoy empezando a preocupar por Icky... Young, ¿has visto un gato grande merodeando por ahí recientemente? Lo último que Icky dijo fue que iba a dar una vuelta cerca del pequeño bosque que está yendo hacia el Este.", + "Miao:Icky dijo que no debería ir donde no es seguro. Te veo luego, Young.", + "Miao:¿Alguna vez te has sentado encima de un montón de bolsas de la compra?", + "Miao:Eh Young, ¿crees que sería buena idea plantar menta de gato?", + "Miao:Apuesto a que te ha llevado mucho trabajo convertirte en El Elegido, ¿eh, Young?") + } +, + philosophy:{ + dialogue:new Array( + "Esa espantosa situación con Icky me ha hecho pensar... ¿Qué crees que ocurre después de que muramos? ¿Cómo podríamos cualquiera de nosotros cumplir nuestro propósito en lo que abarca una vida?", + "Puede que nos reencarnemos una y otra vez hasta que cumplamos nuestro destino. ¿O eso sería poner las cosas demasiado fáciles?", + "¿Y cuál es nuestra recompensa por completar nuestro trayecto? ¿Simplemente desaparecemos?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Hola, Young.", + "Mi nombre no es Icky en realidad. Es Ichabod.", + "Espero que Miao Xiao Tuan Er no te haya causado muchos problemas.", + "Te veo luego, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Hola, ¿qué tal? ¡Me has encontrado! Voy a quedarme aquí, fuera hace frío.", + "¡Yo soy el culpable de todas esas terribles salas! Las hice con el editor de mapas DAME.", + "¡He hecho este juego con FlashDevelop IDE y el framework Flixel AS3!", + "Ah sí, e hice la música usando REAPER DAW. Y algunas veces Audacity.", + "En realidad me nutro de la radiación de todos estos ordenadores... ^¿qué quieres decir con que eso no es biologicamente acertado?", + "¡Hola mamá! ^¡y papá!", + "¿Queréis saber cómo pasaros el juego en 20 minutos?", + "¡Ja! ¡Como si os lo fuera a decir!", + "(...quizá si me lo pedís amablemente...)") + } +, + marina:{ + dialogue:new Array( + "¡Eh wow!", + "¡He escrito un montón de diálogos para este juego!^(...pero no este diálogo. Melos lo está haciendo.)", + "¡He usado Adobe Photoshop CS5, Graphics Gale Free Edition y la Herramienta de Recorte de Windows 7 para hacer el arte!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "Esta humedad es buena para tu piel, pero mala para tu pelo.", + "Me gusta quedarme aquí. Ahora la gente pasa el verano entero yendo de acá para allá cambiando entre un calor sofocante y un aire acondicionado glacial. Esos cambios tan rápidos de temperatura debilitan los huesos.", + "Es como esa manía tan fea de masticar los cubitos de hielo. Mi madre lo hacía cuando iba hacia los 30. Ahora tiene pequeñas grietas por todos los molares.") + } +, + second:{ + dialogue:new Array( + "Asegúrate de cambiarte las zapatillas y envolverlas en hojas de periódico para secarlas bien. No vaya a ser que se conviertan en un nido de bacterias.", + "¿Por qué en todos los buffets hay solamente gelatina ROJA? Es como si quisieran que desarrolláramos cáncer.") + } +, + bomb:{ + dialogue:new Array( + "Apártate de mí.", + "Te lo digo en serio... déjame a solas ya.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "No necesito tu compasión, Young.", + "Venga, continúa viviendo en tu feliz mundillo, \"Elegido\"...", + "Sabes, Young, la amistad es simplemente una mentira que la gente se cree. Todos somos unos gilipollas, y al final, todos estamos solos.", + "Ja, sabía que me odiarías, Young.", + "Estoy bien.", + "Por supuesto que no te importa, a nadie le importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "Sé que las ciudades son sucias, están llenas de gente y todo eso, pero me gusta salir aquí fuera y observar todas estas luces.", + "Es bonito a su manera. No es tan infinito como las estrellas, pero hay algo sobre su humanidad que añade una capa de complejidad maravillosa.", + "Detrás de cada luz hay una persona con esperanzas y miedos y secretos... observar es tan espantosamente solitario como tremendamente personal.", + "Creo que amo cada persona tras cada ventana. Os amo, gente, por ser mis estrellas. Os amo sin importar cómo de jodida sea vuestra vida ni cuán hondo creáis haber caído. Esta noche sois encantadores...", + "Lo siento, estoy diciendo tonterías. Gracias por escuchar.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eeehh, tíiioo...descansa, quédate un raaato, ¿sí?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "¡Ah! ¡Me encontraste!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:¿Te golpeó alguna roca mientras subías? Algunas veces lanzo rocas cuando estoy furioso. Lo siento si te di.", + "Golem:Mi madre siempre decía que si seguía haciéndolo, no quedaría montaña que lanzar. Antes de eso ya chocheaba.") + } +, + second:{ + dialogue:new Array( + "Golem:Cuando eres una roca, ves muchas generaciones de gente ir y venir. Te vuelves más anciano y sabio que el más sabio entre los hombres.", + "Golem:Al menos, esa es la idea. Rompí mis prismáticos hace poco, así que no sabría decirte qué ha ocurrido desde entonces.", + "Golem:En realidad, no echo mucho de menos observar a la gente, es un aburrimiento.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh, sí, me encontré con alguien que parecía algo perdido...me dijeron que partían hacia la playa a echar un vistazo.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "No soy una langosta, soy un langostino. De nombre Hews.", + "Hews:¿Sabes qué es lo mejor del océano? Que puedes ver el horizonte.", + "Hews:El océano es como una probadita salada de infinito.", + "Hews:Una playa abarrotada pierde su encanto.") + } +, + second:{ + dialogue:new Array( + "Hews:¿Has oído hablar de la langosta mantis? Tiene 16 fotoreceptores que le permiten percibir luz ultravioleta. ¿Te imaginas ver un rango de colores más ancho?", + "Hews:Eso estaría muy bien. Pero vaya, ya hemos encontrado muchísimas formas de odiarnos por los colores que tenemos.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Así que estás buscando a alguien, ¿eh? Recuerdo que yo estaba sentado aquí cuando unas pocas nubes taparon el Sol. Entonces, alguien se me acercó y me preguntó dónde estaba algo. No recuerdo qué era, pero la persona salió corriendo, diciendo que se dirigían hacia el bosque.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Las bayas son un buen tipo de comida. Me gustan las bayas.", + "James:Por favor, ten cuidado de no defecar en las bayas.", + "James:Hasta ahora he tenido relaciones sexuales 18 veces durante esta estación. Y me he comido 389 zarpadas de bayas.", + "James:¿Tienes algo de bayas para James?") + } +, + second:{ + dialogue:new Array( + "James:He escrito un poema:\n^Me gusta comer bayas\n^Me ponen de muy buen humor\n^¿Que cuánto me gustan las bayas?\n^¡Me las como por puro amor!", + "James:¿Cuáles te gustan más? ¿Los arándanos o las frambuesas?", + "James:¿Tienes algo de bayas para James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Alguien vino. No querían bayas. Fueron a la zona Sudeste del lago que está yendo hacia al Oeste.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olive:Hola, soy Olive la coneja.", + "Olive:¡Me quedan muchos cereales por comer! Adoro los cereales.", + "Olive:La caja es tan grande. ¡Nunca se acaba!", + "Olive:¡Los cereales del nunca acabar!", + "Olive:Hmmm...quizá eso no sea tan malo.") + } +, + bush:{ + dialogue:new Array( + "Rank:Ejejej, ¡qué tonto este Young! ¡Una escoba no es para cortar arbustos!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:Me gano la vida podando arbustos. ¡A veces encuentro oro! ¡Ejejej!", + "Rank:La economía ha pegado muy duramente bajo este arbusto...", + "Rank:A veces es duro mantener a la mujer y a los niños cortando arbustos--no siempre tenemos suficiente comida...¡pero siempre hemos tenido un buen fuego! ¡Ejejej!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:¿Qué? ¡Sí! Alguien vino. Dijeron que se dirigían a un laberinto subterráneo...Apuesto a que allí hay muchos arbustos, ¿eh Young?") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Oh, hola, ¿qué tal te encuentras?", + "Marvin:¿Dónde está Justin?", + "Marvin:Por aquí no hay ninguna oreja de ese tal Van Gogh") + } +, + chikapu:{ + dialogue:new Array( + "¡Chika Chi!", + "¡¡Chika Chika!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:A Bob el hámster le gusta referirse a sí mismo en tercera persona.", + "Bob:Los apóstrofos son la raíz de todo ma'l.", + "Bob:¡Quieto! Estoy ocupado rezumando un aura de ambiente hamsteril.", + "Bob:... Supongo que mejoras en algo si lo haces repetidas veces... Pero... si haces algo mal, ¿lo que harás no será mejorar en hacer algo mal?", + "Bob:Un hombre de verdad nunca llora... bueno, quizá se le escapa una lagrimilla por el rabillo del ojo, deslizándose por su cara acostumbrada al Sol, mientras monta su mala malota Harley a través del venteado desierto de Mojave no llevando ni casco ni gafas protectoras. Pero él nunca llora.", + "Bob:Este juego fue creado por un infinito número de monos trabajando en un infinito número de máquinas de escribir.", + "Bob:Echo de menos a James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:¡El curry es amarillo y picante!", + "Kuribu:¡Para el oponente Inteligente, incremento de daño!", + "Kuribu:¡Conseguiste la experiencia de 2!", + "Kuribu:¡Te digo mi número de teléfono! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "¿Que qué ESTOY haciendo aquí? ¡Buena pregunta! Acabo de dar con este sitio. Estoy escondiéndome. Este lugar es seguro, si no te aventuras muy lejos y dejas que esos tipos te cojan.", + "Parece que soy relativamente afortunado. Todos esos muertos desparramados a lo largo y ancho del lugar - ¿cómo murieron? Es un tanto fascinante, divagar sobre cómo ocurrió. ¿Fueron atacados por los monstruos? ¿Tropezaron y cayeron en los pinchos?", + "Es un poco macabro. Espero que no me pase a mi. El dolor físico es una perspectiva terrible.") + } +, + quest_event:{ + dialogue:new Array( + "Ah...ahora que lo pienso, una persona pasó por aquí hace un rato. Dijeron que estaban buscando algo... ¡incluso se parecían un poco a ti! No recuerdo cuando, lo siento. Es difícil adivinar la hora aquí. Pero dijeron que tenían pensado ir a una ciudad de por aquí cerca.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Hola.", + "¿Estás buscando algo?", + "¿Qué estás mirando?", + "No, no soy un ciudadano de esta ciudad. Lo que es extraño es que puedes verme y hablar conmigo, pero no puedo Interactuar con ninguno de ellos. Todos esos asesinos andan por ahí sueltos, y nadie parece darse cuenta. Es extraño.") + } +, + quest_event:{ + dialogue:new Array( + "Sí. Vi una persona acercarse. Estaban buscando algo. No sé dónde podría estar ese 'algo' que buscaban. La persona salió disparada. Dijo que necesitaban ir a un area alternativa del espacio. Suena Interesante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "SOOOO SOOOO - - - ¿ ¿ ¿ QUIÉN ERES TÚ ? ? ?", + "SOY UN VAGABUNDO . . . ESTA ES UNA DE LAS ÁREAS DE DESCANSO MÁS POPULARES ENTRE EL TRAYECTO DESDE A HASTA B.", + "¿ ¿ ¿ QUE QUÉ ES 'A' ? ? ? ES MI CIUDAD NATAL . . . VOY A VISITAR A UN VIEJO AMIGO EN B . . . ES UN LARGO RECORRIDO . . . PERO YO HAGO SACRIFICIOS . . . ¿ ¿ ¿ TÚ NO ? ? ? ¡ ¡ ¡ HACE QUE LA VIDA SEA MÁS EXCITANTE ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - BUSCANDO A OTRO HUMANO - - - YA VEO . ^ DEJA QUE ACCEDA A MI MEMORIA . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n AJÁ . . . \N LA PERSONA TUVO UNA REVELACIÓN Y DIJO QUE SE DIRIGÍAN HACIA UN COBERTIZO EN ALGÚN CAMPO BIEN CUIDADO. \n AHORA QUE LO PIENSO . . . ¡ ¡ ¡ TE PARECES MUCHO A ELLOS ! ! ! ¿ ¿ ESTÁS SEGURO DE QUE NO ERAS TÚ ? ? ¿EH? ¿ MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "En realidad estabas...uh, ah. Bien hecho.", + "La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella:\"Rápido, antes de que me tenga que ir de nuevo(Esto se está iluminando cada vez más por momentos, siempre sucede)- la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera Intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\"") + } +, + quest_event:{ + dialogue:new Array( + "La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella:\"Rápido, antes de que me tenga que ir de nuevo(Esto se está iluminando cada vez más por momentos, siempre sucede)- la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera Intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "HOLA. ¿HAS CONOCIDO A cubo YA?", + "cubo ES UN MUY BUEN GOBERNANTE DE ESTA PORCIÓN DEL ESPACIO. LOS OTROS GOBERNANTES LO HACEMOS LO MEJOR QUE PODEMOS EN NUESTROS ESPACIOS TAMBIÉN.") + } +, + gray2:{ + dialogue:new Array( + "¿QUÉ OPINAS DE ESTE TROZO DE ESPACIO? ¿ES UN BUEN PUNTO EN EL CAMINO, NO?", + "¡UNA INTERSECCIÓN DE MUNDOS!") + } +, + gray3:{ + dialogue:new Array( + "NINGUNA DE LAS PIRÁMIDES GRISES ESTAMOS REALMENTE AQUÍ. USAMOS DISPOSITIVOS ESPECIALES QUE NOS PERMITEN PROYECTARNOS AQUÍ.", + "¿QUE POR QUÉ HACEMOS ESO? PORQUE QUEREMOS HABLAR CON NUESTRO AMIGO cubo Y HACERLE COMPAÑÍA.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...¿EL DISPOSITIVO HOLOGRÁFICO ESTÁ FUNCIONANDO CORRECTAMENTE?", + "¿NO?^...^¡MALDITA SEA!") + } +, + color1:{ + dialogue:new Array( + "¿Has conocido a CUBO? ¡Hace cosas muy molonas! He oído que una vez se apoyó sobre un borde durante casi doce segundos. ¡Guau tío! ¿Sabes lo que eso significa para la Liga de los Apoyadores Sobre Bordes? ¿No? ¡Bueno, pues mucho!") + } +, + color2:{ + dialogue:new Array( + "¡CUBO hace un trabajo muy Interesantes!", + "¿Te has enterado? ¡Parece ser que pronto llegará mi turno para gobernar! En tan solo unos minutos, creo.") + } +, + color3:{ + dialogue:new Array( + "Soy de Barra de Azúcar, de camino a Taipei. ¿Que por qué estoy aquí? ¡Oh, he parado para decir hola a CUBO!", + "¡No mires tanto abajo! Este lugar es simplemente una rara representación para no conmocionar a todos los visitantes. Es mayormente inofensiva, por lo que sabemos.") + } +, + colordead:{ + dialogue:new Array( + "(¿...está echándose una siesta?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "CADA GENERACIÓN NACE DEL DOLOR PARA MORIR EN DOLOR. NO SUFRIREMOS PARA REPRODUCIR EL CICLO. NO SALDREMOS FUERA.") + } +, + after_fight:{ + dialogue:new Array( + "¿ES ESTE TU CASTIGO POR NUESTRA REBELIÓN?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "¿Por qué privas a El-Que-Todo-Lo-Ve de sus sacrificios? ¿Por qué nos has arrebatado nuestra salvación?") + } +, + after_fight:{ + dialogue:new Array( + "...Hemos fallado en hacerte pagar por tu Intromisión. Y aun así... nos has devuelto nuestra oportunidad para ser libres. Gracias, Young. Que El-Que-Todo-Lo-Ve tenga consideración por ti una vez más.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Qué bueno verte, Yang. Ha pasado mucho tiempo. Veo que aún sigues jugando a esas nentendos, ¿eh?") + } +, + after_fight:{ + dialogue:new Array( + "Por el amor de Dios, Yon, ¿cúando vas a madurar? ¿Sabes? Vas a tener que aprender a tratar con gente tarde o temprano.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Aquí disponemos de los mejores servicios. ¿Cómo le gustaría la Piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "¿Le apetece una sesión en nuestro gimnasio de última generación?") + } +, + after_fight:{ + dialogue:new Array( + "¡Esperamos que haya disfrutado de su estancia!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Hoy es un buen día.", + "Gracias por rascarme ese picor en la nuca - No lograba alcanzarlo.", + "He oído que los huevos del restaurante de la zona están bastante buenos. Además tengo un cupón para ellos.", + "¿Viste el accidente de automóvil de hoy? ¡Qué horror! Estaba chateando. ¡Qué lástima, tan joven!", + "Mi hijo no ha conseguido entrar al equipo juvenil de la universidad. Qué decepción. Invertimos mucho en su carrera deportiva.", + "Hoy es el día de acción de gracias. Estoy agradecido por muchas cosas. No veo el momento de que llegue mañana para ir a las rebajas matutinas. Voy a pillar gangas a cascoporro.", + "Ah, quizás llegue tarde al trabajo.", + "Tengo un poco de prisa por llegar a casa, necesito limpiarlo todo antes de que vengan los suegros.", + "¡Estamos vendiendo objetos usados en el garaje!", + "¡Bienvenido!") + } +, + words_teen:{ + dialogue:new Array( + "No vi la última película.") + } +, + words_kid:{ + dialogue:new Array( + "¡Nunca debo ver los nuevos dibujos animados!") + } +, + family:{ + dialogue:new Array( + "¡Bienvenido a nuestra casa, forastero! Tu cara me suena. Este es un pueblo tranquilo. Bastante tranquilo, sin muchos visitantes.", + "¿Te gusta Davement? ¡Mi hermano Dave me ha enseñado esta canción tan molona suya!") + } +, + older_kid:{ + dialogue:new Array( + "A mis amigos les gusta escuchar esa canción de 'Rayhead' llamada 'None Surprises' y quejarse de este lugar. A ver, sí, es un poco aburrido, ¡pero joder, al menos muestra un poco de gratitud! ¡O haz algo para cambiarlo! Son todos unos...oh, perdona. Tiendo a hacer eso a veces...", + "Creo que iré a escribir en mi blog y ya.", + "Parece que estás atontado, en serio.", + "Me cuesta oír mis pensamientos cuando dan deportes y tal en la tele, pero a mis padres les gusta.") + } +, + hanged:{ + dialogue:new Array( + "Una nota sobre el cadáver:\"No me pondré otra vez en peligro.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, ¿están haciendo algo ahí fuera? ¿Un festival? ¿Un desfile?", + "¡Parece que hay bastante alboroto ahí fuera! ¿Has mirado por la ventana? Me pregunto qué será.") + } +, + paranoid:{ + dialogue:new Array( + "Mi casa tiene muchas ventanas. No me gustan las ventanas. Es como si alguien estuviera siempre mirando dentro. Y sabes que algo DEBE estar pasando ahí fuera. No puede ser que esté todo tan quieto siempre, tan callado y tranquilo - eso me inquieta.", + "¿Asesinos? ¿Qué? ¿En la calle? ¿De qué estás hablando? ¿Estás tomándome el pelo? Nunca antes ha habido ningún asesinato en este pueblo, pero aun así...estás haciendo que empiece a preocuparme...quizá sea mejor que te vayas.", + "Por favor, vete.") + } +, + dead:{ + dialogue:new Array( + "El cuerpo de esta mujer ha sido golpeado hasta la muerte por un arma contundente.", + "El hombre, francamente, pues...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "¡Oh, eres tú! Tu cara me suena...No puedo moverme hasta que sigas matando a más de estos ciudadanos, ¿recuerdas? Vuelve en un rato.", + "Según este panfleto...¡solo necesitas matar unas cuantas personas más! Sigue así.", + "Solo necesitamos otro cuerpo más, y ya podremos continuar.", + "Bien hecho. Entra si quieres. No tengo ni idea de lo que habrá. Te veré de nuevo mañana a la misma hora, ¿vale? ¿O la noche siguiente?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "No me importa ser observado por los árboles.", + "¡¿Dónde está ella?!", + "Estaré contigo, Young, siempre que estés solo.", + "¿Eres un Ookchot? Mi mamá siempre me advirtió sobre el Peligroso Ookchot.", + "¡Gominhola, Young! ¡Entartado de haberte conocido flanmente! Pareces abatido, ¿por qué no te quesadas un rato? ¡No tartaré en servir el té!", + "Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Presbiterio, Púlpito, Altar, Vidrieras de colores...", + "¡Oferta por tiempo limitado! Compra una, y llévate otra gratis - ¡solo hoy!", + "¿Te acuerdas de esa vez que encendiste una vela cuando se fue la luz?", + "Mmmm, se estaba bien en tu almohada esta pasada noche.", + "Esto les enseñará a no llamarme más el fumi-GAY-dor.", + "Género y yo hacemos un buen equipo.", + "¡¡¡Soy el aspirante a Elegido!!!", + "¿A veces no te sientes como si, hagas lo que hagas, no pudieras evitar que el mundo se fuera muriendo?", + "Ten cuidado con las setas del bosque...", + "Lo siento. Es mi naturaleza.", + "¿¿Qué quieres decir con 'Solo una roca'?? ¡¿Las rocas también podemos aparecer en cartas, sabes?!", + "Dale a un hombre un pez y comerá por un día. Enseña a un hombre a pescar, y pasará ratos felices con su hijo Jimmy.", + "A veces la respuesta es dar un paseo.", + "¿Por qué los murciélagos pasan volando siempre que estás cerca?", + "¡NO, *TÚ* NECESITAS APARATO!", + "¿YA ESTÁS CONTENTO?", + "No te me pongas violento.", + "Siempre he querido estar en Iron Chef.", + "Mi mamá siempre me decía, '¡Si te doblas mucho, tu espalda se quedará así para siempre!'", + "¿Te has divertido, humano?", + "...", + "Científicamente hablando, los sapos son una subespecie de las ranas.", + "¡JAJAJAJA! ¡Seh! ¡Lo sé!", + "¿Oh, coleccionas cartas también? Cuánta elegancia, Ying.", + "Siempre me decían, \"¡Quítate del ordenador! ¡O nunca harás amigos!\"", + "Soy el gobernador tan sólo el tiempo que dure una conversación.", + "¡Apostaría a que estás pensando que estás 'haciendo mi trabajo Interesante'!", + "Odio las diagonales.", + "Ningún brebaje para la alergia te salvará de mis esporas.", + "¡Pasa esta carta por un lector de tarjetas para desbloquear la puerta de tu habitación!", + "Estoy haciendo un gran trabajo.", + "¿¿.......??", + "Por cierto, ¿quién ha sido el que ha grabado encima de nosotras?", + "Espero que haya disfrutado de su estancia.", + "Biendo cómo has llegado a este punto, debes de ser bastante Interasante.", + "Estoy aquí para dirigirte hacia el extravío.", + "¡Tú eres como una pirámide para nosotras también!", + "Joder, es siempre lo mismo, noche tras noche, y encima no gano una mierda.", + "¡Déjame en paz! ¡Mi apellido no es Sachs!", + "Al menos no soy un simple palo.", + "¿Qué quieres decir con que el dinero no crece en los árboles? ¡Ejejejej!", + "No soy nada más que una ilusión.", + "ME VOY A DESQUITAR CONTIGO.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Pulsa", + "para definir\nlos controles.", + "para cancelar.", + "Arriba", + "Abajo", + "Izquierda", + "Derecha", + "Saltar", + "Atacar", + "Menú", + "Pulsa", + "para salir", + "para definir los controles.") + } +, + title:{ + dialogue:new Array( + "Por favor, usa las\nteclas de dirección para redimensionar\nla ventana hasta que\nno puedas ver\nnada negro alrededor\nde los bordes.\n\nPulsa", + "cuando acabes.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "cualquier tecla", + "Pulsa", + "para empezar", + "Versión", + "Continuar", + "Nueva partida", + "¿Estás seguro?\nNo\nSí", + "¿De verdad?\nNah\nSeh", + "¡No hay vuelta atrás!\nOlvídalo\nLo sé", + "muertes", + "cartas", + "Anodyne soporta\nla mayoría de los mandos.\n\n¿Vas a usar uno?\n\nSí No\n\nSi es así, conéctalo ahora.\n\nMuévete con las teclas de dirección\n\nSelecciona usando\nC, ESPACIO, o INTRO\n\nSe aplicará 'Sí' por defecto en\n", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", + "NOTA\n\nSi sufres de lag al pulsar las teclas\ndurante la partida,\nsal al escritorio y\nvuelve a abrir Anodyne.\n\nPULSA C PARA CONTINUAR\n\n¿La Interfaz gráfica no aparece como debería?\nPulsa el botón de abajo\ny luego reorienta el dispositivo.") + } +, + gui:{ + dialogue:new Array( + "menú=intro", + "Guardando...") + } +, + map:{ + dialogue:new Array( + "Mapa", + "Sala actual", + "Puerta/Salida", + "Sin mapa", + "Volver a\nNexus", + "Volver a\nla entrada") + } +, + items:{ + dialogue:new Array( + "Objetos", + "Normal", + "Swap", + "Alargar", + "Ensanchar", + "Un par de zapatillas con resortes - ¡pulsa", + "para saltar!", + "Un par de zapatillas para ir en bicicleta.", + "Una caja de cartón vacía.", + "Una llave encontrada en el Templo de El-Que-Todo-Lo-Ve.", + "Una llave encontrada en una roja y subterránea cueva.", + "Una llave encontrada en una cueva en las montañas.") + } +, + cards:{ + dialogue:new Array( + "Cartas", + "cartas") + } +, + save:{ + dialogue:new Array( + "Guardar", + "¡Guardado!", + "ERROR", + "Guardar, volver\nal título", + "Volver al título", + "Guardar y salir", + "Salir del juego", + "Muertes:") + } +, + config:{ + dialogue:new Array( + "Config", + "Asignar teclas", + "Ajustar volumen", + "Autoguardado en\ncheckpoints:", + "Activado", + "Desactivado", + "Cambiar resolución:", + "Configurar Interfaz", + "Táctil+Cruceta", + "Solo cruceta", + "Solo táctil", + "Entrada para movimiento:", + "Resolución:", + "Modo ventana", + "Escalado Int.", + "Estirar", + "Escalado:", + "Idioma:", + "ja", + "en", + "ko", + "Arrastra los\nbotones\nhasta que estés\nsatisfecho.\n\nLuego, toca\nel menú\npara continuar.\n\n", + "Redimensionar\nventana", + "Configurar mando") + } +, + secrets:{ + dialogue:new Array( + "¡Estás forrado!", + "Una vez fue propiedad de un famoso Mago Burbuja.", + "Si tus gráficos se entremezclan, mira la entrada de un Pakimon oficial en la pakidex.", + "Este corazón no tiene nombre.", + "Por favor, visita el mundo de los monstruos eléctricos.", + "Una estatua de un gatito. Mona, pero inútil.", + "¡¡¡¡Oh Dios!!!!", + "¡¡¡¡Oh no!!!!", + "Es negro", + "Es rojo.", + "Es verde.", + "Es azul.", + "Es blanco.", + ":Seleccionar", + ":Volver") + } +, + swap:{ + dialogue:new Array( + "¡Lo sentimos!", + "El swap no va a funcionar aquí.", + "Young no logra reunir la suficiente fuerza para poder usar el swap aquí.") + } +, + keyblock:{ + dialogue:new Array( + "Esta puerta está cerrada.") + } +, + treasure:{ + dialogue:new Array( + "Alguna extraña fuerza impide que este cofre del tesoro pueda abrirse.", + "Un grabado en el palo de la escoba pone:Pulsa", + "para barrer.", + "Esta llave podrá ser usada solamente una vez para abrir un obstáculo que te bloquee el camino.", + "Un misterioso par de botas que no tiene nada más que la marca en ellas, que dice \"Pulsa", + "\".", + "Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ENSANCHAR en el menú para hacer que la escoba suelte polvo dañino hacia los lados.\"", + "Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ALARGAR en el menú para hacer que la escoba suelte polvo dañino más allá de su alcance normal.\"", + "Una nota fijada en el accesorio para la escoba:\"Hola, Young. Usa esta mejora SWAP en dos suelos para Intercambiarlos de lugar. Aun falta un poco antes de que puedas usarla en cualquier lado, pero te servirá por ahora.\"", + "¡¡¡ENCONTRASTE UN CORAZÓN!!! Vida Máxima incrementada en...cero.", + "Goldman:¿Qué? ¿No está ahí? ¡Ese tendero debe haberlo robado!") + } +, + dust:{ + dialogue:new Array( + "¡Tu escoba está ahora cargada de polvo! Ataca de nuevo para colocarlo.") + } +, + checkpoint:{ + dialogue:new Array( + "¿Guardar partida?\n Sí\n No", + "Mientras estés sobre un punto de control, pulsa", + "para guardar tu progreso y hacer que éste sea tu punto de reaparición por si mueres.") + } +, + rock:{ + dialogue:new Array( + "Hay algo garabateado en esta roca:", + "TU NO TIENES AMIJOS") + } +, + door:{ + dialogue:new Array( + "El portal no parece estar activo.") + } +, + keyblockgate:{ + dialogue:new Array( + "La verja está quieta, petrificada. No se abrirá hasta que sienta la presencia de cuatro cartas...", + "Sientiendo la cercanía de cuatro cartas, la verja decide abrirse.", + "La verja permanece obstinadamente en su lugar.", + "La verja siente la totalidad de las cartas y decide abrirse.", + "La verja siente las suficientes cartas y decide abrirse.", + "¡Se abre!", + "Permanece cerrada.") + } +, + solidsprite:{ + dialogue:new Array( + "La señal apunta hacia el Este pero las palabras en ella están borrosas.", + "La señal apunta hacia el Oeste pero las palabras en ella están borrosas.", + "Las palabras en la señal están borrosas.") + } +, + mitra:{ + dialogue:new Array( + "¡Eh, Young!", + "¿Esas zapatillas de bicicleta son para mí? ¡Guau! ¡Gracias, Young! Había estado pensando en conseguir unas, puesto que Género tiene esos pedales donde puedes enganchar ese tipo de zapatillas. Toma, Young, ¡coge mis botas a cambio! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa", + "para saltar con ellas puestas!", + "¡Hola, Young! ¿Me notas algo nuevo? ^... ^... Oh, bueno, pues me he comprado estas zapatillas nuevas para ir en bici, ¡mira! Se enganchan en los pedales de Género. Puesto que no voy a necesitar más mis viejas botas, ¡quiero que tú las tengas, Young! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa", + "para saltar con ellas puestas!", + "¡Venga, cuídate!", + "¡Vamos, pruébatelas! ...No huelen TAN mal.", + "Molan, ¿eh?", + "Guau, ¿no son esas las zapatillas para bici de la tienda de Finty? ¿Que me las regalas? ¡Gracias, Young, te lo aprecio de verdad! Toma, quédate con mis viejas zapatillas a cambio--¡estoy segura de que las encontrarás verdaderamente útiles! Hay algo bordado en las zapatillas que dice \"Pulsa", + "para saltar\" Nunca entendí eso, la verdad, porque no hay ninguna \"", + "\" en las zapatillas...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:¡Bienvenido, bienvenido, Young, amigo mío! ¡Mi nombre es Prasandhoff--Finty Prasandhoff! ¡Echa un vistazo a lo que tengo y hazme saber si algo te Interesa!", + "Finty:¡Te sigo estando agradecido por esa caja!", + "Finty:¡Ah, una caja! ¡Muchísimas gracias! ¡Ahora podré llevar todo mi inventario de vuelta a casa por la noche y otra vez aquí por la mañana!", + "Espera un momento...¡no está aquí! ¿Qué le habrá pasado? Bueno, mira, ¡deja que alivie tus heridas entonces!", + "¡Como muestra de mi gratitud, toma estas elegantes zapatillas para ir en bici!", + "Hace una mañana espléndida, ¿no es así, amigo mío? ¡Una buena mañana para ir de compras! Ojalá tuviera una caja para poder transportar mi inventario.", + "¡Qué mal, parece que no te puedes permitir este objeto! ¡Vuelve más tarde, cuando tengas el dinero!", + "Finty:¡Ah, tienes muy buen ojo! Necesitas un arma mejor, ¿no es así? ¡Vuélales la cabeza a tus enemigos por tan solo $499.99!", + "Finty:¡Ese saco de monedas te permitirá acumular dinero que encuentres en La Región! ¡Es tuyo por tan solo unos míseros $869.99!", + "Finty:Oh jo jo, este objeto es una especialidad, sí que lo es:¡unas prácticas zapatillas de ciclista para que puedas ir rápido A LA VEZ QUE elegante! ¡Oferta de hoy, tan solo $299.99!", + "Finty:¿Cansado de remover el polvo con esa ridícula y raquítica escoba? ¡Erradica esas dañinas partículas de polvo con esta aspiradora de ultimísima generación! ¡Por tan solo $749.99, o en cuatro fáciles pagos mensuales de $199.99!", + "Como muestra de mi gratitud, toma esta fea--digo, ¡bella carta de edición coleccionista!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nUn juego creado por\n\nMelos Han-Tani\n\ny\n\nMarina Kittaka\n\n-------------", + "Creado entre\n\nmarzo de 2012\n\ny\n\nenero de 2013", + "DISEÑO\n------\nAmbos", + "PROGRAMACIÓN\n-----------\nMelos, usando la\nlibrería Flixel\npara Actionscript 3\n\n\n\nARTE\n---\nMarina\n", + "MÚSICA/SFX\n---------\nMelos, usando REAPER\ny sonidos de\nlibre uso.\n\n\n\nDIÁLOGO\n--------------\nMayormente Marina\n", + "TRAMA\n-----\nAmbos\nLocalización\nal japonés:\nKakehashi Games\nTraducción al\nespañol:\nDiego Fenollar", + "Gracias inmensas a\nnuestros testers,\nque han sufrido\n¡para que vosotros\nno tengáis que\nhacerlo!\n--------------\n\nMarina, por tener que\nsufrir muchos de\nlos bugs iniciales.\n\nEtan,por el apoyo\nconstante desde el\nprincipio, con\nmuchos bugs\nencontrados, y el\ntercer humano en\njugar a casi todo\nel juego entero.", + "Olivia - ¡gracias,\nhermanita!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Agradecimientos de\nMelos a:\n\nMamá y Papá, por su\napoyo constante\nen esta empresa.\n\nS\n\nVarios TIGSourcers\n¡y otros\ndesarrolladores que\nhe conocido por el\ncamino!\n\nMarina, por hacer este\njuego posible, y\nmejorarlo en\nincontables\nmaneras.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nY mis otros amigos\nque me han\ndemostrado su apoyo\n(¡Gracias!)\n\nY por último, pero\nno por eso menos\nimportante,\nTina Chen,\namiga desde hace\nmucho, por el apoyo\nasí como también\npor presentarme\na Marina.", + "Agradecimientos de\nMarina a...\n\nColin Meloy, por\nexpandir mi\nvocabulario\n\nTsugumo, por\n\"¿Así que quieres\nser un\nPixel Artist?\"\n\nMi familia,\npor el apoyo\ny la comida.\n\nDaniel, por ser un\n\"desarrollador de\njuegos indie\"\ncreciendo juntos.", + "Mo, por creer\n en mí.\n\nTina, por\npresentarme\na Melos.\n\nMelos, por hacer\nun juego y confiar\nen mí para que\nformara una parte\nimportante de él.", + "REPARTO\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "\n\n\n\n\n\n\n\n", + "¡Y nos gustaría\nagradecerte A TI\npor jugar a\nnuestro juego!\n\n\nEsperamos que lo\nhayas disfrutado.", + "Ahora tienes la\ncapacidad de\nexplorar el mundo\nde Young con(casi)\nninguna limitación,\nvia el swap(mover\ncosas de lugar).\n") + } +, + elevator:{ + dialogue:new Array( + "¿Planta?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancelar") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_IT.hx b/AIR/intra/hsrc/data/NPC_Data_IT.hx new file mode 100644 index 0000000..0bbf75c --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_IT.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_IT { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Ti piace la musica? Parla con questo terminal!", + "Ti piace il dolore? Vai a sud!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Quell'acrobata sta perdendo l'equilibrio! Dov'è la rete di sicurezza?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "I leoni si stanno avvicinando a quel giocoliere!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Sono stanco, Young. Sono stanco di tutti questi cicli. Mi sembra di rivivere lo stesso sogno, lo stesso incubo ancora e ancora, all'infinito.", + "Briar:...", + "Briar:Non cambierà, Young. Rimarremo così per sempre.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Addio, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Young, amico.", + "Briar:Scalcia. Muovi le braccia. Diamine, non sai fare niente senza di me!", + "Briar:Beh, andiamo a farci un paino.", + "Sage:Sei stato... bravino. Forse ci rivedremo, un giorno. Addio.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voce Misteriosa:Ehi... ... Young? EHI! ... oh, riesci a sentirmi? Bene, allora ascolta. Stai per svegliarti. Usa le frecce direzionali per muoverti.", + "Premi \'", + "\' per Interagire con gli oggetti e le persone accanto a te.", + "Premi \'", + "\' per accedere al menù, che ti darà informazioni su te stesso e su ciò che ti circonda.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Volevo solo che tutto tornasse com'era.", + "Spero... Spero che tu saprai fare meglio di me.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Buona fortuna, Young.", + "Sage non ha tutti i torti. Voglio che tutto sia perfetto, e a volte questo mi fa ignorare la realtà.", + "Non so di cosa hai bisogno per aiutare Briar. Non capisco come funziona questo mondo, o perché tutto sembra così strano. Ma so che voglio essere tua amica, Young.", + "Tu stai lottando, Young. Stai cercando di capire. Spero che riesca a sistemare le cose.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... questo è il mio ultimo avvertimento... aspetta, chi è quella?", + "Mitra:Io sono Mitra, e questa è la mia bici, Manu!", + "Sage:Non ho chiesto il nome della tua bici, che ci fai qui? Non mi ricordo di te.", + "Mitra:Sono qui per aiutare il mio amico, Young...", + "Sage:Young non ha amici. Young non ha nemmeno Briar. E se tu gli stai dando corda, ti voglio fuori dal mio mondo!", + "Mitra:Che vuoi dire? Manu e io...", + "Sage:NON MI INTERESSA DELLA TUA STUPIDA BICICLETTA!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:Young! Va tutto bene? Hai fatto una cosa meravigliosa... Vai avanti e falla finita con questa stupida area! Sappiamo che ce la puoi fare!", + "Mitra:Manu!!!", + "Mitra:Manu...", + "Mitra:Senti, signor personaggio misterioso incappucciato, non so chi tu creda di essere, ma perché non ci lasci in pace?", + "Sage:Dici di essere amica di Young, ma gli mentirai, gli dirai che in fondo lui è perfetto così e tutto si sistemerà. Beh, se è questo quello che vuoi, BENE. Sparisci dalla mia vista, Young.", + "Sage:Va' a parlare con la tua \"amica\".", + "Mitra:Stiamo solo facendo del nostro meglio...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Uomo incappucciato:Ah, era ora. Ehm... ^Volevo dire...^ Benvenuto, Young! Io sono Sage, il saggio del villaggio. Sei stato convocato perché l'Oscurità si è diffusa per tutta la Landa. L'Oscurità cerca il leggendario Briar. Vuole usarne i poteri per scopi malvagi. Devi raggiungerlo per primo. Devi proteggere Briar.", + "Entra nel portale attivo alla tua sinistra per iniziare la tua avventura.", + "*Sospira* non va bene che tu stia ancora qui a ciondolare. Entra nel portale per iniziare la tua avventura. Briar e, per estensione, il mondo Intero è in pericolo!", + "Entra in quel maledetto portale!") + } +, + after_ent_str:{ + dialogue:new Array( + "Sei ancora qui?") + } +, + after_bed:{ + dialogue:new Array( + "Continua, Young. Potrebbero esserci altre chiavi come quella che hai trovato. Trovale.", + "Viaggia fino ai confini più remoti della Landa, Young. È l'unico modo di fermare l'Oscurità.") + } +, + before_windmill:{ + dialogue:new Array( + "Prendi quelle tre chiavi, Young, e apri la strada che porta alle zone più recondite della Landa.") + } +, + after_windmill:{ + dialogue:new Array( + "Hai fatto quello che ho chiesto, Young, ma c'è ancora molto altro da fare. Forse esplorando le zone più remote della Landa diventerai qualcuno... forse addirittura qualcuno degno della considerazione di Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Ottimo lavoro, Young. Hai trovato tutte le carte in un'area della Landa, e una gemma è apparsa sulla cima del portale dell'area.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Presto le tue abilità saranno messe alla prova, Young. Per uscire vivo da questo tempio ti serviranno forza e Intelletto. Immagino che tu abbia già trovato un'arma, no?", + "Cos...? ... Volevo dire... Ma sì, certo... una scopa! Proprio come predetto nella Leggenda...", + "*sgrunt* di tutti gli incompeten... Ehi! Che stai facendo lì impalato?", + "Tieni gli occhi aperti, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:Per il momento sei ancora debole. Se speri di proteggere Briar dall'Oscurità, devi affrontare le tue paure. La carta che troverai in questo forziere, e le altre come questa, sono simboli della tua crescita. Ottenerle tutte è di vitale importanza per la tua missione.", + "Anche quella chiave è fondamentale per la tua missione. Devi trovare anche le altre chiavi. Seleziona la mappa sul menu per teletrasportarti all'entrata del tempio, e continua la tua eroica impresa.", + "Viaggia a est e sud attraversando la zona del tempio... La chiave ti servirà.", + "Che c'è? Vuoi che ti porti in spalla fino al cancello?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:Perché non mi ascolti?! Se fai le cose di fretta come un idiota, metterai in pericolo Briar, la Landa e tutto quello per cui ho lavorato!", + "Mi dispiace, Young, ma se non Intendi ascoltarmi, dovrò convincerti in altri modi...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... Non volevo che finisse così... Volevo solo che tu diventassi una persona migliore. Volevo che tu diventassi in grado di aiutare Briar. Ma questo è solo uno stupido gioco... Non posso impedirti di raggiungerlo. Ricordati le mie parole quando andrà tutto a puttane.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Ciao, Young. Quando diventerai una persona più forte e più saggia, questo sentiero ti condurrà da Briar.", + "Sage:Non sei pronto, Young. Prima devi affrontare altre prove nella Landa.", + "Sage:Hai fatto progressi, Young, ma devi possedere almeno 36 carte per attraversare questo cancello.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... Uh... hai già almeno 36 carte? Ma io non sono sicuro che tu sia pronto per la vera prova. Infatti guarda, stavamo leggendo male questo cancello, in realtà ti servono...\n...\n........\n92 carte per passare, non 36!", + "Sage:Young, non andare, non sei ancora pronto! Pensa a Briar! Alla Landa! Tutto questo non sarà servito a nulla se non sarai pronto!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Ottimo lavoro, Young. Non solo hai sconfitto questo mostro, ma anche la tua paura di prevalere!!!", + "Sage:Ovviamente, hai ancora molta strada da fare. Stai esplorando la Landa?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Ben fatto, Young. Tuttavia, ci sono altre prove che dovrai affrontare. Non abbassare la guardia.", + "Sage:Hai già trovato tutte le chiavi, Young? Se non le hai trovate, vai alla spiaggia.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "Non sono come gli altri! *Bau* non ti farò niente...", + "C'è molta pace quassù.", + "Sai di bietole.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "Ce l'hai fatta, Young! Hai sconfitto l'Oscurità! Guarda questo posto! È bellissimo!", + "Così bello...") + } +, + dump:{ + dialogue:new Array( + "Oh, meno male che sei qui! Temevo rimanessi bloccato in quella discarica di neve... cazzo se è deprimente lì! Ha!", + "Ahahahah. Ahahahahahahah. AHAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Ehi splendore, ti offro da bere!", + "Bevi ancora, merdaccia! Ahahah!") + } +, + hot:{ + dialogue:new Array( + "Cazzo fa caldo qui... il calore... il sudore...", + "Maledizione! Allenarmi qui mi eccita così tanto!") + } +, + gold:{ + dialogue:new Array( + "Sai che questo posto è fatto d'oro? Oro vero! Potremmo scappare insieme e vivere di questo mattone! Ahahahahah!", + "Sul serio, che fai lì impalato? Aiutami a staccare questo mattone!") + } +, + briar:{ + dialogue:new Array( + "???:Young... Ce l'hAi FatTa! mI hAi salVaTo! Oora TutTo tOrnErà ComE pRimA!!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "OCCHIO!", + "Scusami... Andavo troppo veloce. Ehi, non ti ho mai visto prima! Sei un viaggiatore come me? ... Eh? Vuoi salvare Briar dalla Malefica Oscurità? ... ^Ehm... Non ci ho capito niente, ma ok, figo!", + "Ero qui, assieme a Manu... Cosa? Certo che non sono da sola, Manu è qui con me. Non hai capito, Manu è il nome della mia bici!", + "Beh, forse ci incontreremo di nuovo. Ti farò sapere se scoprirò qualcosa di questo Briar.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "OCCHIO! Forza Manu, andiamo!", + "Eeeee via!", + "Continua Young, siamo con te!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Ti ricordi di me? L'altra volta ti ho presentato solo Manu, la mia bici. Il mio nome è Mitra.", + "Ti ricordi di me? L'ultima volta ho dimenticato di presentarmi. Sono Mitra, e questa bella bici qui si chiama Manu.", + "Mitra:Come va, Young? ... Cosa? Come so il tuo nome? Pensi che sia strano, eh? Beh, l'ho letto sul retro della tua felpa.", + "Mitra:Ci vediamo, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Ah, mi sono appena ricordata. Prima qualcuno ha detto che stava cercando di trovare qualcosa. Non sono sicura di che stesse parlando, ma è andato in tutta fretta verso le montagne.") + } +, + game_hints:{ + dialogue:new Array( + "Niente.", + "Oh, non sai che fare? Hai cercato in giro per la spiaggia? Forse lì qualcuno può aiutarti. Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre?", + "Oh, non sai che fare? Hai cercato nella foresta a est? Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre?", + "Guarda tutte quelle chiavi! Penso di aver visto dei cancelli a sudest. Forse puoi usarle lì?", + "Ehi, ho visto che hai azionato la turbina! Sai se ha avuto effetti sulla Landa?", + "Ehi, Young. Wow! Stai accumulando un sacco di carte! Hai già capito a che servono? Potresti farci un sacco di soldi!", + "Cos'è quel nuovo accessorio attaccato alla scopa? Ti permette di alterare la... struttura del mondo? Young, sinceramente mi sembra pericoloso. Per fortuna sembra non funzionare da nessuna parte, forse solo nei più strani e reconditi recessi della Landa.", + "Ti piacciono le mie scarpe da salto? Ingegnose eh? Io adoro le mie nuove scarpe da bici. Con queste io e Manu siamo un team ancora migliore!", + "Ottimo Young, hai trovato un'altra chiave! A Manu piace il colore! Hai già trovato un posto dove usarla?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Ehi young, stai cercando una carta?\nHai cercato nell'area attorno al tempio di Colui Che Vede?", + "Mitra:Ehi young, stai cercando una carta?\nHo sentito che c'è un labirinto vicino all'uscita sul retro del tempio di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nPotresti trovare qualcosa vicino all'antro di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nC'era una stanza piena di nemici nel tempio di Colui Che Vede, no?", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato bene in tutto il tempio di Colui Che Vede?", + "Mitra:Ehi young, stai cercando una carta?\nProva a cercare nell'area vestigiale vicino all'uscita sul retro dell'antro di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nForse il tuo vicino ne sa qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nSo che il tipo nel tuo appartamento stava nascondendo qualcosa...", + "Mitra:Ehi young, stai cercando una carta?\nProva a cercare vicino all'entrata del tuo appartamento!", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato *ovunque* nel tuo appartamento?", + "Mitra:Ehi young, stai cercando una carta?\nProprio a sud di qui c'è un'isola! Non ci sono stata, ma dovresti cercare lì.", + "Mitra:Ehi young, stai cercando una carta?\nSeguendo i fiumi si trova un sacco di roba. Guarda bene!", + "Mitra:Ehi young, stai cercando una carta?\nSo che qualcuno ha lasciato una carta vicino alla pala eolica.", + "Mitra:Ehi young, stai cercando una carta?\nCerca vicino ai fiumi nella foresta...", + "Mitra:Ehi young, stai cercando una carta?\nProva a curiosare vicino alla base delle montagne.", + "Mitra:Ehi young, stai cercando una carta?\nProva a raggiungere la cima delle montagne.", + "Mitra:Ehi young, stai cercando una carta?\nForse qualcosa è nascosto all'estremità della spiaggia.", + "Mitra:Ehi young, stai cercando una carta?\nFai una passeggiata nei boschi cremisi.", + "Mitra:Ehi young, stai cercando una carta?\nC'erano molte porte chiuse in una di quelle caverne rosse, giusto?", + "Mitra:Ehi young, stai cercando una carta?\nVai alla caverna rossa a nord, controlla la fonte del fiume!", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato bene in quel labirinto oscuro?", + "Mitra:Ehi young, stai cercando una carta?\nRicordo che da qualche parte c'era un poco rassicurante sentiero di lanciafiamme. Alla fine deve esserci qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nQuei tizi del circo devono star nascondendo qualcosa. Hai cercato ovunque?", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato attorno al perimetro del fosso di quella coppia?", + "Mitra:Ehi young, stai cercando una carta?\nC'è questa coppia che ama stare vicino a un fosso. Devono nascondere qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nA volte ci sono cose nascoste fra le voragini, soprattutto nelle caverne di montagna!", + "Mitra:Ehi young, stai cercando una carta?\nHai setacciato le one più alte della caverna di montagna?", + "Mitra:Ehi young, stai cercando una carta?\nC'è qualcosa nelle profondità della caverna di montagna?", + "Mitra:Ehi young, stai cercando una carta?\nQuel cubo colorato in quel posto strano... Forse ha qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nHai parlato con il cubo grigio in quel posto strambo? Forse sa qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nL'ultimo piano dell'hotel è un po' dimesso, ma deve esserci qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nSei entrato in tutte le stanze del terzo piano dell'hotel?", + "Mitra:Ehi young, stai cercando una carta?\nScommetto che qualcuno ha lasciato qualcosa al secondo piano dell'hotel.", + "Mitra:Ehi young, stai cercando una carta?\Il proprietario dell'hotel potrebbe averti lasciato qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nQuei ponti distrutti a nordovest... guarda lì!", + "... Cosa? Non hai trovato *nessuna* carta? Young, amico, ma sei fuori? A volte nella vita bisogna essere avventurosi, aprire qualche scatola, sai?") + } +, + general_banter:{ + dialogue:new Array( + "Hai incontrato quel tipo che stava cercando qualcosa nelle montagne?", + "Sai qual è il cognome della mia bici? ... Brio! L'hai capita? Manu Brio! ... Scherzo, le biciclette non hanno cognomi.", + "Pensi che debba comprare una catena? Non mi piacerebbe tenere legata Manu ma sai, se ne sentono tante di bici rubate al giorno d'oggi...", + "Allora, cos'è Briar? Una specie di artefatto antico di una cultura perduta?", + "Mi chiedo perché non ho sentito niente dell'arrivo dell'Oscurità. Immagino che molta gente nella Landa sia impegnata nelle sue battaglie quotidiane.", + "Ehi Young, volevo solo dirti che... hai dei bellissimi capelli.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Statua:Anziano del villaggio solo di nome, di fatto non è né saggio né anziano.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Statua:Ho visto una scopa in una leggenda... era sulla mappa nell'armadietto di un inserviente.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Statua:Le carte sono vitali per la tua missione. Le carte, soprattutto quelle di credito, sono vitali anche per altre missioni, come l'acquisto di bevande alcoliche.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Statua:Ottimo lavoro, Sage. Hai dovuto superare ogni limite del tuo carattere e ogni forma di amor proprio per dire una cosa così imbarazzante!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Se continui così, quando sarai diventato un individuo più stressato e apatico finirai per sfogarti sul gelato. Trova conforto nella bottiglia, perdente!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Una volta un uomo venne a installare uno specchio nel nostro bagno. Avevo paura che ci avesse nascosto una telecamera. Ho controllato ogni centimetro della cornice di legno, ho versato del Mastro Ligno in ogni fessura sperando di mandarla in cortocircuito. Ovviamente non ho mai trovato nulla.", + "Edward:Questo tempio è dedicato a Colui Che Vede. Non so perché sono venuto qui, e ho troppa paura di entrare.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:Ci sono problemi? Immagino di sì. Tutto quello che hai è una scopa, e tutto quello che le scope fanno è spostare la polvere.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:hai detto di aver sconfitto Colui Che Vede? Ha. Non hai capito che non funziona così? Stai solo versando Mastro Ligno nelle fessure.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, sei così dolce. Il piccolo, tenero Young che gioca a fare l'eroe. Ma io ho visto ogni passo che hai mosso nella Landa, e lascia che te lo dica Young, non tutti qui sono onesti come lo sono io. Stai attento a coloro di cui ti fidi!") + } +, + after_fight:{ + dialogue:new Array( + "Sarò con te, Young, ogni volta che sarai solo. E ricorda il mio consiglio sulla tua piccola \"avventura\".") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Roccia:La visione periferica è il covo dei demoni.") + } +, + two:{ + dialogue:new Array( + "Roccia:Da fare - Costruire un sistema di teletrasporto al Nexus. Progresso - in stato di fermo. Colui Che Vede non Intende fornire i fondi per rendere il progetto possibile. Dovremo tornare a usare il metodo originale, l'inspiegabile portale dimensionale.") + } +, + three:{ + dialogue:new Array( + "Roccia:Sono Intrappolata qui, tutta sola. Il lavoro procede a buon ritmo in questo tunnel, almeno posso vedere ogni giorno piccoli progressi.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Questa ruota serve a sollevare la diga.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 giugno, 1957:Si sono rotte le corde del trapezio. Alice Rutgers è precipitata al suolo e si è fratturata gli stinchi.") + } +, + two:{ + dialogue:new Array( + "17 luglio, 1957:sette clown si sono ritirati per problemi quasi fatali ai polmoni. Si sospettano responsabilità della linea di makeup Landan Look, ma non è in corso nessuna investigazione.") + } +, + three:{ + dialogue:new Array( + "21 luglio, 1957:A seguito del malfunzionamento di una gabbia, la mia faccia e il mio fianco sono stati gravemente mutilati da un leone non ancora domato. Sono sopravvissuto, ma rabbrividisco guardandomi allo specchio.") + } +, + four:{ + dialogue:new Array( + "5 agosto, 1957:In sogno, ho visto un volto di pietra con occhi feroci e luccicanti. Parlava della verità sulla nostra esistenza, ed è stato il primo a offrire libertà dal dolore.") + } +, + five:{ + dialogue:new Array( + "7 agosto, 1957:Quanti altri di noi dovranno soffrire prima che tutti accettino la verità di Colui Che Vede?") + } +, + six:{ + dialogue:new Array( + "8 agosto, 1957:Ho preso una decisione. Degli altri, qualcuno ha detto che mi seguirà. Questa sarà la mia ultima annotazione. Possa Colui Che Vede vegliare su tutti noi.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Segni indecifrabili)") + } +, + two:{ + dialogue:new Array( + "7 dicembre, 2010.(nome illeggibile). Non c'è niente quassù a parte questa stupida roccia!") + } +, + three:{ + dialogue:new Array( + "Pericolo! Questa caverna è inesplorata.") + } +, + four:{ + dialogue:new Array( + "Questo dirupo va verso l'alto a perdita d'occhio, ma nessuno è mai arrivato abbastanza in alto per capire fin dove arriva.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Roccia:Come?") + } +, + two:{ + dialogue:new Array( + "Roccia:Attenzione! Caduta verticale, saltate a vostro rischio e pericolo.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Questo serviva come segnaposto per l'animazione dei cancelli delle carte. Avvicinati due volte per vedere le animazioni di apertura e chiusura!", + "Ho dimenticato perché non l'abbiamo più usata. Forse era un po' troppo.") + } +, + two:{ + dialogue:new Array( + "Qui ci sono dei test per vari tipi di terreno e collisioni! Non riuscivo a far funzionare i terreni a direzione unica da ogni lato(tipo i muri), quindi ho lasciato perdere... credo.", + "Abbiamo lasciato perdere per vari motivi. Semplificare il design era importante per riuscire a finire il gioco.") + } +, + three:{ + dialogue:new Array( + "All'inizio i nemici potevano droppare chiavi. Poi ho scartato l'idea, anche se poteva essere divertente.", + "Abbiamo anche considerato di creare dei cancelli sfida alla fine di alcuni percorsi, che si aprivano solo se li raggiungevi senza subire danni.", + "Volevamo basare tutti i dungeon su questo sistema e lasciar perdere completamente i punti vita, ma a quanto pare il gioco era troppo difficile!") + } +, + four:{ + dialogue:new Array( + "PRIGIONE!!!", + "Liberaci!!!", + "Per favore!") + } +, + five:{ + dialogue:new Array( + "Benvenuto nel MONDO DI DEBUG! Sei uscito dai confini de \"La Landa\", quindi considera questo mondo(al 90 percento)\"non canonico\". Ad ogni modo.", + "Prima che ci fossero set di tile per molte delle aree, usavo tile stupide tipo queste per segnare dove andavano le porte. Infatti, ogni dungeon è stato arrangiato con i set di quest'area, e poi Marina li ha aggiustati con i suoi set di tile.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVI-", + "PROCEDERE CON CAUTELA") + } +, + four:{ + dialogue:new Array( + "Ovest. Fessura. Realtà! Basso valore immobiliare, uragano, vecchio, fatiscente. Rilassante.") + } +, + three:{ + dialogue:new Array( + "Colui Che Vede, da quel che ric- crr,,,,, Bei Momenti in Casa.") + } +, + two:{ + dialogue:new Array( + "CELLA FRIGORIFERA\n\n^ -- LA DIREZIONE") + } +, + one:{ + dialogue:new Array( + "CONTINUA") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Ovest:Spiaggia\n\nEst:Foresta\n\nSudest:\n Area Piovosa\n\nNord:\nZona del tempio\n\nNordovest:Dirupo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Ovest:Lago\nSud, poi est:Dirupo") + } +, + two:{ + dialogue:new Array( + "Laghetto della quiete. Resta un po', sappiamo che hai tempo.") + } +, + three:{ + dialogue:new Array( + "Temo di dover rimanere in questo angolino per sempre.") + } +, + four:{ + dialogue:new Array( + "Est:Dirupo") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "Il sentiero si aprirà quando le tessere guardiane nere saranno sostituite con le pietre del loro colore spirituale nella griglia sottostante.") + } +, + two:{ + dialogue:new Array( + "Quando la statua di pietra blu si è spostata,\nsi è aperto un nuovo sentiero.\nDopo il dirupo, attraverso strane dimensioni,\nc'è un hotel per viandanti.\n\n\n\"Chi è il guardiano?\" Chiedo,\n\"Chi governa questo affollato luogo d'affari?\"\nMolte anime sono qui riunite,\nma io mi sento comunque solo.") + } +, + three:{ + dialogue:new Array( + "La statua rossa e rugginosa si è mossa,\ne ha svelato la via per abissi più profondi.\nNe segue un sotterraneo labirintico\ne un grosso tendone da circo.\n\n\n\"Chi sono i guardiani?\" Chiedo, \n\"Chi ha rinunciato alla vita per fuggire in questo posto?\"\nIo, come loro, temo il dolore.\nMa temo di più la morte.") + } +, + four:{ + dialogue:new Array( + "La statua metallica verde si è spostata,\naprendo un sentiero più profondo.\nQuartieri residenziali e marciapiedi formano\nil sentiero per un appartamento.\n\n\n\"Chi è il guardiano?\" Chiedo, \n\"Chi cerca conforto nelle stelle?\"\nSolo, sento che qualcosa mi osserva.\nE non è l'amichevole luce stellare.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Roccia:Questa è terra di nessuno - non ancora parte della Landa.") + } +, + two:{ + dialogue:new Array( + "Roccia:Questi - ^ io e i miei cerchi siamo^ - promesse... Io^ - cerchi^ - cercherò di portare tutto a termine...^ - concentrici. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Roccia:Stai attento ^ -...ma riesco sempre^ - a dove metti i piedi^ - a riapparire ,no?^ - in questo posto!") + } +, + four:{ + dialogue:new Array( + "Roccia:Guardando in basso ^ - E ho capito:^ - da qui, - ^ Di amarlo.^ - non si vede... niente, a dire il vero.") + } +, + five:{ + dialogue:new Array( + "Roccia:Mi scuso -^ Sì ma, -^ per questa confusione -^ dobbiamo rimanere in contatto -^ ma quel portale dovrebbe ^- e cercherò di darti le mie opinioni - ^ riportarti nella Landa.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "A volte, se parli più volte con le persone, ti diranno cose diverse.", + "Le rocce no. Le rocce non lo fanno.") + } +, + two:{ + dialogue:new Array( + "Roccia:Così vicino! Se solo...") + } +, + three:{ + dialogue:new Array( + "Roccia:La curiosità è una gran cosa.") + } +, + four:{ + dialogue:new Array( + "Roccia:Oh!...?") + } +, + five:{ + dialogue:new Array( + "C'è una mail aperta sul computer. Alcune parti dello schermo sono rotte, e il messaggio è solo parzialmente visibile fra le chiazze nere. La mail dice:\"Ciao Young!\" Sembra che [...] cinquantesima carta [...] forse non dovresti... [...] vale la pena pensarci! Pensi di essere pronto? Svegliati...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Roccia:Scommetto che stai leggendo una roccia perché non hai amici.") + } +, + two:{ + dialogue:new Array( + "Roccia:Benvenuto alla Stazione Oltremondo. Speriamo che ti sia goduto la tua permanenza nella Landa.") + } +, + three:{ + dialogue:new Array( + "Roccia:Em… You are normále? Capeesh?", + "Roccia:Per favore, non andare a sud. Ci sono lavori in corso.") + } +, + four:{ + dialogue:new Array( + "Roccia:Tesoro in 5, 3!") + } +, + five:{ + dialogue:new Array( + "Roccia:Ahah, fregato!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NASCIAMO NELLA PUTREFAZIONE DEL CORPO DI NOSTRA MADRE.") + } +, + two:{ + dialogue:new Array( + "UN GIORNO NOSTRA MADRE HA LASCIATO SUA MADRE E SI È AVVENTURATA NELLA NEBBIA VENEFICA.") + } +, + three:{ + dialogue:new Array( + "NON LO ABBIAMO VOLUTO NOI. NON AVREMMO COMPRATO LE NOSTRE VITE A COSTO DELLA SUA SOFFERENZA.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Roccia:I segni indicano che gli alberi non sono stati attivi per un lungo periodo di tempo.") + } +, + two:{ + dialogue:new Array( + "Roccia:Sud:???^ Nord:???") + } +, + three:{ + dialogue:new Array( + "Roccia:Si dice che il terreno irregolare sia opera dei progenitori degli abitanti di questa zona.") + } +, + four:{ + dialogue:new Array( + "Roccia:Sembrano essere una specie pacifica.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Scarabocchiato in quello che sembra essere pennarello indelebile:Salve, compagno viaggiatore dello SPAZIO e del TEMPO. Ti sei avventurato in uno squarcio lontano dall'aera giustapposta di YOUNG. Hai attraversato un OCEANO o due, per così dire. Non preoccuparti per il CONTRASTO, potrai presto tornare alla tua consueta avventura. non TEMERE questo luogo, anche se può sembrare TENEBROSO e PERICOLOSO i suoi abitanti sono molto AMICHEVOLI \n -- La Direzione", + "(Sotto il messaggio, una incisione:)Qui giace ___(illeggibile). Si è perso nei boschi.", + "(Ancora più sotto il messaggio:)(non andare troppo a sud.)") + } +, + two:{ + dialogue:new Array( + "Qui giace ____(illeggibile. Chi l'ha scritto?)È stato impalato da arcobaleni!", + "Sarebbe stato meglio con i trofei.") + } +, + three:{ + dialogue:new Array( + "Qui giace Burd. I precipizi non gli furono troppo amici.") + } +, + four:{ + dialogue:new Array( + "Qui giace borsa. Non ha mai avuto alcuna possibilità.", + "Arrogante!") + } +, + five:{ + dialogue:new Array( + "Qui giace Savitch. Una volta ha provato ad aggiustarmi il computer in garage, e non occupava molto spazio mentre lo faceva. Dopo tre anni, non aveva ancora finito. Poi, è morto.") + } +, + six:{ + dialogue:new Array( + "Qui giace Dave. Non era molto d'ispirazione.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "--- YOUNG TOWN --- ^\nBenvenuto a Young Town. Per piacere, stai attento ad alcuni dei cittadini. Non sono molto amichevoli. Procedi con cautela. Young Town è stata fondata negli anni '90 dal sindaco Ying come parte di un progetto di edilizia urbana. Il nome è stato scelto in base al rifuto di Ying di chiamarsi Ying, e in base al suo affermare di chiamarsi Young. Ti auguriamo un piacevole soggiorno.") + } +, + two:{ + dialogue:new Array( + "A ovest ci sono i leggendari templi di Colui Che Vede. A est c'è l'appartamento del nostro fantastico sindaco Ying, che è chiuso al pubblico - i trasgressori sono avvisati.") + } +, + three:{ + dialogue:new Array( + "Durante la sua quinta visita, Ying mostrò frustrazione per la mancanza di parcheggi. Questo parcheggio riflette la frustrazione di Ying per la mancanza di parcheggi. Ying ha occasionalmente parcheggiato in questo parcheggio nelle sue visite seguenti.") + } +, + four:{ + dialogue:new Array( + "Ricordo le lunghe frasi che scrivevo. Ha! Frammentato.") + } +, + five:{ + dialogue:new Array( + "UNA SITUAZIONE PERICOLOSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "Colui Che Vede sa tutto, e conduce all'illuminazione. Il cammino per l'illuminazione non è illuminato da alcuna torcia.") + } +, + two:{ + dialogue:new Array( + "Non allontanarti dal cammino di Colui Che Vede, neanche per i tesori che si trovano agli angoli remoti del labirinto.") + } +, + three:{ + dialogue:new Array( + "Cammina.") + } +, + four:{ + dialogue:new Array( + "Non far adirare gli inseguitori con la violenza.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "PUNTO PANORAMICO:Torri sorelle. Costruite tempo fa, le torri sorelle svettano sulle montagne in lontananza. La prima torre è stata precedentemente danneggiata, e da allora è stata destinata ad altri usi. La seconda si erge a est, toccando il cielo. Per ragioni di sicurezza, il sentiero per la torre è stato chiuso fino a nuovo avviso.") + } +, + two:{ + dialogue:new Array( + "AVVISO PER LA PUBBLICA SICUREZZA:^\nSebbene non danneggiata, pare che in cima a questa torre ci sia uno squarcio dimensionale. Procedete con cautela e con una mente aperta.^\n -- La Direzione") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Sembra che questa statua non abbia Intenzione di spostarsi.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sembra che questa statua sia saldamente a posto.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "La statua non sembra essere spostabile.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Il fuoco è affascinante, non è vero? È un vero peccato che il bagliore dei lampioni nasconda il fuoco delle stelle.") + } +, + after_fight:{ + dialogue:new Array( + "Ok, le stelle non sono davvero fatte di fuoco. ^Ma tanto non fotte nulla a nessuno.") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "Come va? Sono il sovrano di questa partizione e Interpretazione di spazio.", + "Vuoi sapere perché sono il sovrano di questo posto? Te lo dirò, ma ci vorrà un po'. Un bel po'. Tipo un sacco di tempo.", + "Sul serio, ci metterò molto. Davvero eh, ti sto avvisando! Ho la tendenza a divagare. Forse faresti meglio a prendere il contenuto di quel forziere laggiù. O ad andare verso quell'hotel in lontananza. Non so come ci è finito lì, ma ho sentito che fanno dei prezzi abbastanza buoni. Non che il denaro abbia importanza qui.", + "Perché sono il sovrano?^... Non ne sono sicuro, ma i miei amici hanno deciso che fosse appropriato mettermi qui, date le condizioni attuali di questo spazio. Forse è perché i cubi sono i migliori nel restare seduti sulle superfici piatte. Sul perché è necessario che qualcuno sia seduto qui - ah, non ne ho idea!", + "Gli altri - i miei amici laggiù - hanno ognuno i propri meriti. Non è impossibile che in futuro siano loro a sedersi qui, è che non possono farlo ora. A volte cambiamo chi fa il sovrano, ma ogni volta dobbiamo reinterpretare questa porzione di spazio! Può succedere che il Signor o la Signora Piramide vengano qui perché decidiamo di dare al trono una forma che si confà meglio alla loro forma, reimmaginando questo mondo, per così dire. Ti sembra stupido? Può essere. Però qui funziona così. Succede abbastanza in fretta. Minuti, ore - i regni non sono necessariamente lunghi.", + "Però, quando sono il sovrano, mi sento strano... come se fossi isolato, come se volessi evitare gli altri...", + "... ma isolamento non è la parola giusta, anche se descrive in parte la sensazione. Non sono isolato, e non odio gli altri. Ci consideriamo tutti amici, ma sai, nessuno viene effettivamente qui se non per scambiare qualche parola. Quindi devo mettermi a pensare, o rischio di impazzire! Forse è parte dell'isolamento.", + "A parte domande folli sul *perché* siamo qui a occupare questo spazio, sarei anche curioso di capire perché siamo amici.", + "Mi piace pensare che quando siamo sotto l'interpretazione che sia io la migliore scelta come sovrano, loro mi danno conforto permettendomi di mantenere la mia posizione per tutto il tempo che serve a raggiungere l'interpretazione successiva. Sai, i loro incoraggiamenti, la loro presenza fisica, quelle cose mi danno conforto.", + "Immagino che siano abbastanza per soddisfarmi, anche se sarebbe bello che qualcuno provasse a capire come mi sento a essere sovrano. Non che mi stia lamentando degli incoraggiamenti! Però forse potremmo avere più sovrani... che idea! Il che forse implica che quando non sono sovrano devo agire come ogni tanto vorrei che loro facessero... chissà se si può fare.", + "Mi sono dilungato troppo. Se vai nella direzione opposta, c'è una regione di spazio simile a questa, anche se penso abbia un odore diverso.", + "È stato un piacere incontrarti.", + "Oh, vuoi ascoltare di nuovo la mia storia?", + "Bene, mettiti comodo.") + } +, + gray:{ + dialogue:new Array( + "Ciao. Sono il sovrano di questa parte di spazio.", + "Cosa? Vuoi sapere perché sono qui? Sei sicuro? Ci vorrà un po' per spiegarti perché!", + "Beh, se insisti. Anche se faresti meglio ad andare verso quell'hotel in lontananza. Non so perché abbiano deciso di costruirlo. Se dovessi pagarci delle tasse, sicuramente protesterei!", + "Allora, anche se sono il sovrano di questa parte di spazio, non sto effetivamente regnando su nessuno.", + "I miei amici sono tutti sovrani delle loro parti di spazio. Neanche loro regnano su qualcuno - in un certo senso siamo tutti soli. Ma non nel senso che non possiamo parlare fra noi. In quel senso, non siamo soli. Questo è solo un posto in cui io esisto.", + "La mia parte di spazio e quelle dei miei amici sono molto simili nel modo in cui esistono e per come sono organizzate. Abbiamo Interessi e desideri simili. Ci piace parlare molto su come regnare e così via.", + "Ma è triste che non riusciamo quasi mai a incontrarci di persona.", + "In realtà non stai parlando con loro nella loro forma fisica, ma con una loro rappresentazione olografica.", + "Lo so, è un peccato. È un peccato perché abbiamo così tanto in comune, ma possiamo aiutarci a vicenda così poco.", + "Quando non puoi parlare sempre faccia a faccia con qualcuno sembra come se manchi qualcosa.", + "Ma non mi sto lamentando. È meglio del nulla assoluto! Non riesco a immaginare come sarebbe diversamente. Sarebbe terribile.", + "È stato bello parlare con te, buona fortuna per qualunque cosa tu stia facendo.", + "Sei ancora qui? Posso dirti tutto di nuovo, se vuoi.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Ehi tu, brutto bullo! Non ho paura di te!", + "Crickson:Zucca vuota! Non scapperò! Neanche se me le darai di santa ragione!", + "Crickson:Sei solo un grosso bruto con una scopa, ecco cosa sei! Dovresti vergognarti di te stesso!") + } +, + thorax:{ + dialogue:new Array( + "Thorax:Io sono il Thorax, e lasciamelo dire\n^Le api stan male, non fan che patire!\n^Alcune operaie son volate via\n^E nelle loro colonie ora c'è una moria!", + "Thorax:Forse è un virus, o forse un veleno\n^Che qualcuno ha gettato nel loro terreno!\n^Qualche grossa azienda, per fare più soldi\n^Sporchi assassini, ladri, manigoldi!", + "Thorax:Ok, non ho idea di che stia succedendo\n^Ma le api davvero stanno morendo.\n^Che posso fare, agire a casaccio?\n^... Trovato! Lo posto su Facebook, oh se lo faccio!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Comprami qualcosa") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "Che ci fai qui, delinquente? Vai via! È mia di diritto!", + "Non mollo mica! Mai, nemmeno fra un milione di anni!") + } +, + inside:{ + dialogue:new Array( + "Oh, sei tornato qui per terrorizzarmi ancora?", + "Sei dalla parte dei gatti solo perché sono tutti carini e pelosi.") + } +, + etc:{ + dialogue:new Array( + "Che ci fai qui, delinquente? Vai via! È mio di diritto!^ Coooos?^ È un...?^ ALTRO GATTO???^ AAAAAHHHHHH!!!", + "Tu hai... pulito casa mia... sono commosso! Prendi, voglio donarti la cosa più bella che ho!", + "Young prende e apre la scatola. C'è qualcosa dentro!", + "Icky:Oh. Ehi Miao.^\n\nMiao:Sono così felice che tu sia salvo!^\n\nIcky:Ehm... grazie per l'aiuto, Young.", + "Icky:A essere sincero, mi piace sedere nelle scatole.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Oh!! Tu sei Young, Il Prescelto!!!! Ommioddio, che onore! Io sono Miao Xiao Tuan Er, aspirante Prescelto!", + "Posso seguirti un po' per vedere un Prescelto in azione?", + "Ciao di nuovo, Young! Posso seguirti?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Ehi, Young... hai mai rubato qualcosa?", + "Miao:Mi piace Mitra... e Manu è una bicicletta bellissima, non è vero?", + "Miao:Cos'è quella specie di pietra fighissima, Young? Ti fa tornare indietro nel tempo?!", + "Miao:Sto iniziando a preoccuparmi per Icky... Young, hai visto un gatto più grande di recente? L'ultima volta Icky ha detto che sarebbe andato a fare una passeggiata nella piccola foresta a est.", + "Miao:Icky ha detto che non dovrei andare in posti pericolosi. Ci vediamo, Young.", + "Miao:Ti sei mai seduto in un mucchio di buste della spesa?", + "Miao:Ehi Young, secondo te è sbagliato farsi di erba gatta?", + "Miao:Scommetto che ci è voluto un sacco di lavoro per diventare il Prescelto, eh Young?") + } +, + philosophy:{ + dialogue:new Array( + "Quella situazione spaventosa con Icky mi ha dato da pensare... Secondo te che succede dopo che muoriamo? Come è possibile riuscire a portare a compimento il nostro scopo nel corso di una sola vita?", + "È possibile che ci reincarniamo fino a compiere il nostro destino. O renderebbe le cose troppo facili?", + "E qual è la nostra ricompensa per aver portato a termine il percorso? O semplicemente svaniamo nel nulla?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Ciao, Young.", + "Il mio nome in realtà non è Icky. È Ichabod.", + "Spero che Miao Xiao Tuan Er non ti abbia dato troppo fastidio.", + "Ci vediamo, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Ehi ciao, come va? Mi hai trovato! Io rimango qui, fuori fa troppo freddo.", + "Puoi dare la colpa a me per tutte quelle stanze orribili! Le ho create con il DAME map editor.", + "Ho creato questo gioco con L'IDE FlashDevelop e il framework Flixel AS3!", + "Ah sì, e ho creato la musica con REAPER DAW E a volte Audacity.", + "In realtà prendo il mio nutrimento dal calore di tutti questi computer... ^Che vuol dire \"non è biologicamente possibile\"?", + "Ciao mamma! ^e papà!", + "Vuoi sapere come finire il gioco in 20 minuti?", + "Ha! E pensi che te lo dica?", + "(...forse se me lo chiedi cortesemente...)") + } +, + marina:{ + dialogue:new Array( + "Ehi woah!", + "Ho scritto un sacco di dialoghi per questo gioco!^(...non questo dialogo però. Di questo se ne è occupato Melos.)", + "Per la parte artistica ho usato Adobe Photoshop CS5 , Graphics Gale Free Edition e lo Snipping Tool di Windows 7!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "L'umidità qui è ottima per la pelle, ma pessima per i capelli.", + "Mi piace stare qui. Al giorno d'oggi, la gente passa l'intera estate correndo avanti e indietro fra il sole cocente e l'aria condizionata glaciale. Quei cambi di temperatura repentini indeboliscono le ossa.", + "È come quella maledetta mania di masticare i cubetti di ghiaccio. Mia madre masticava i cubetti di ghiaccio quando aveva quasi 30 anni. Ora i suoi molari sono pieni di microfratture.") + } +, + second:{ + dialogue:new Array( + "Mi raccomando a cambiarti le scarpe e a riempirle con carta di giornale per farle asciugare. Non vorrai creare un nido di batteri.", + "Perché nei buffet servono solo gelatina ROSSA? È come se volessero farci venire il cancro.") + } +, + bomb:{ + dialogue:new Array( + "Allontanati da me.", + "Dico davvero... lasciami in pace.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Non mi serve la tua pietà, Young.", + "Certo, continua a vivere nel tuo piccolo mondo felice, \"Prescelto\"...", + "Sai Young, l'amicizia è solo un modo che la gente usa per ingannarsi. La verità è che siamo dei pezzi di merda, e alla fine siamo tutti soli.", + "Hah, sapevo che mi odiavi, Young.", + "Sto bene.", + "Chiaramente non ti importa, a nessuno importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "So che le città sono sporche e caotiche, ma a me piace venire qui e guardare tutte queste luci.", + "È bello, a modo suo. Non è una bellezza infinita come quella delle stelle, ma nella loro umanità queste luci hanno un fascino più profondo, più complesso.", + "Dietro ogni luce c'è una persona, ci sono speranze, paure e segreti... Guardare mi fa sentire terribilmente solo, ma in profonda Intimità.", + "Credo di amare ogni persona dietro ogni finestra. Io vi amo, perché siete le mie stelle. Vi amo, e non importa quanto di merda sia la vostra vita, o quanto in basso pensate di essere caduti. Stanotte siete stupendi...", + "Scusami, sto blaterando. Grazie per avermi ascoltato.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eeeehiiii... rilassati e rimani un pooooo', eh?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! Mi hai trovato!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Ti ho colpito con un masso mentre salivi? A volte lancio massi quando sono arrabbiato. Scusami se ti ho colpito.", + "Golem:Mia madre diceva sempre che se avessi continuato a farlo, avrei finito la montagna. Prima che la trivellassero.") + } +, + second:{ + dialogue:new Array( + "Golem:Se sei una roccia, vedi molte generazioni andare e venire. Diventi antico, e più saggio del più saggio fra gli uomini.", + "Golem:O almeno, quella è l'idea. Ho rotto in mio binocolo un po' di tempo fa e da allora non riesco a capire che sta succedendo.", + "Golem:In realtà non mi manca molto guardare la gente. È una noia.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh sì, ho incontrato qualcuno che si era un po' perso... mi ha detto che sarebbe andato a dare un'occhiata alla spiaggia.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "Non sono un'aragosta, sono un gambero. Mi chiamo Hews.", + "Hews:Sai qual è la cosa migliore dell'oceano? Poter guardare l'orizzonte.", + "Hews:L'oceano è come un piccolo assaggio salato di infinito.", + "Hews:Una spiaggia affollata perde la sua magia.") + } +, + second:{ + dialogue:new Array( + "Hews:Hai mai sentito parlare degli stomatopodi? Hanno 16 fotorecettori che permettono loro di vedere la luce ultravioletta. Riesci a immaginare di poter vedere altri colori?", + "Hews:Penso che sarebbe bellissimo. O forse no, abbiamo già abbastanza modi di odiarci l'un l'altro con i colori che abbiamo.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Stai cercando qualcuno? Ero seduto qui quando alcune nuvole sono passate davanti al sole. Mentre il sole era coperto, qualcuno è venuto vicino a me e mi ha chiesto dove fosse qualcosa. Non ricordo cosa fosse, ma la persona è corsa via dicendo di andare verso la foresta.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:I frutti di bosco sono un buon cibo. Mi piacciono i frutti di bosco.", + "James:Per piacere, stai attento a non defecare sui frutti di bosco.", + "James:Finora, in questa stagione ho avuto rapporti sessuali 18 volte. E ho mangiato 389 zampate di frutti di bosco.", + "James:Hai dei frutti di bosco per James?") + } +, + second:{ + dialogue:new Array( + "James:Ho scritto una poesia:\n^Quanto amo i frutti bosco\n^Quando son triste mi mettono a posto\n^Le farei a pezzettini e ne mangerei un pozzo\n^Di crostate ai frutti di... bosco!", + "James:Cosa preferisci? Mirtilli o lamponi?", + "James:Hai dei frutti di bosco per James?") + } +, + quest_event:{ + dialogue:new Array( + "James:È venuto qualcuno. Non voleva i frutti di bosco. È andato nella zona sudest del lago a ovest.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olivia:Ciao, sono Olivia la coniglietta.", + "Olivia:Mi sono rimasti così tanti cereali da mangiare! Amo i cereali.", + "Olivia:La scatola è così grande. Non finisce mai!", + "Olivia:Cereali infiniti!", + "Olivia:Mhhhh... forse non è così male.") + } +, + bush:{ + dialogue:new Array( + "Lonk:Eheheh, che scemo che sei, Young! Una scopa non è fatta per tagliare i cespugli!") + } +, + quest_normal:{ + dialogue:new Array( + "Lonk:Mi guadagno da vivere tagliando cespugli. A volte trovi oro nei cespugli tagliati! Eheheh!", + "Lonk:L'economia sta andando davvero male sotto questo cespuglio...", + "Lonk:A volte è difficile mantenere moglie e figli tagliando i cespugli... non sempre abbiamo da mangiare... ma il nostro focolare è sempre acceso! Eheheh!") + } +, + quest_event:{ + dialogue:new Array( + "Lonk:Come? Sì! È venuto qualcuno. Ha detto che stava andando in un labirinto sotterraneo... scommetto che ci sono molti cespugli lì, eh Young? Eheheh!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Ehi ciao, come va?", + "Marvin:Dov'è Justin?", + "Marvin:Non c'è nessuno qui attorno...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:A Bob il criceto piace parlare di sé in terza persona.", + "Bob:Gli apostrofi sono la radice di tutti i ma'li.", + "Bob:Silenzio! Sono impegnato a emanare un'aura cricetosa.", + "Bob:... Immagino che il modo migliore per imparare qualcosa è farla... Però... se facciamo qualcosa male, non stiamo solo migliorando nel farla male?", + "Bob:Un vero uomo non piange mai... beh, al massimo lascia scorrere una singola lacrima dall'angolo del suo occhio lungo la sua faccia inaridita dal sole, mentre guida la sua Harley nel deserto senza usare casco né occhialoni. Ma non piange mai.", + "Bob:Questo gioco è stato creato da un infinito numero di scimmie che hanno lavorato su un infinito numero di macchine da scrivere.", + "Bob:Mi manca James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Il curry è giallo e piccante!", + "Kuribu:Per l'avversario Intelligente, danni aumentati!", + "Kuribu:Hai guadagnato un'esperienza di 2!", + "Kuribu:Ti dico il mio numero di telefono! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "Che STO FACENDO qui? Bella domanda! Sono capitato qui per caso. Mi sto nascondendo. Questo posto è sicuro, se non ti avventuri troppo lontano e lasci che quei tizi ti prendano.", + "Sembra che io sia relativamente fortunato. Tutti questi morti appesi alle pareti - come sono morti? È un po' affascinante pensare a come sia successo. Sono stati attaccati dai mostri? Sono inciampati e caduti sugli spuntoni?", + "È un po' macabro. Spero che non mi succeda. Il dolore fisico è una terribile prospettiva.") + } +, + quest_event:{ + dialogue:new Array( + "Ah... ora che ci penso, una persona è passata di qui un po' di tempo fa. Ha detto che stava cercando qualcosa... e ti somigliava anche! Non ricordo quando, scusami. Qui si perde la cognizione del tempo. Però ha detto di essere diretto verso una città vicina.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Ciao.", + "Stai cercando qualcosa?", + "Che stai guardando?", + "No, non sono di qui. La cosa strana è che tu puoi vedermi e parlarmi, ma io non posso Interagire con nessuno di loro. Ci sono tutti quegli assassini in giro, e nessuno sembra accorgersene. È strano.") + } +, + quest_event:{ + dialogue:new Array( + "Sì. Ho visto una persona passare. Stava cercando qualcosa. Non so cosa fosse questo \"qualcosa\". Il tipo è andato via di fretta. Ha detto di dover andare in un'area di spazio alternativa. Sembra Interessante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "EHI EHI EHIIIII - - - CHI SEI TU? ? ?", + "IO SONO UN VIANDANTE. . . QUESTO È UNO DEI PUNTI DI SOSTA PIÙ POPOLARI LUNGO IL TRAGITTO DA A VERSO B.", + "COSA È \"A\"? ? ? È LA MIA CITTÀ NATALE. . . VADO A VISITARE UN VECCHIO AMICO A B. . . È UN LUNGO VIAGGIO. . . MA FACCIO SACRIFICI. . . TU NO? ? ? RENDONO LA VITA PIÙ INTERESSANTE! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - CERCHI UN ALTRO UMANO - - - CAPISCO. ^ LASCIA CHE ACCEDA ALLA MIA MEMORIA. . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA. . . \n QUEL TIPO HA AVUTO UN LAMPO DI GENIO E HA DETTO CHE SAREBBE ANDATO VERSO UNA CASETTA IN UN GIARDINO BEN CURATO. \n ORA CHE CI PENSO. . . TU GLI SOMIGLI MOLTO! ! ! SEI SICURO CHE LUI NON FOSSE TE? ? EH? MMH?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "In realtà stavi... ehm, ah. Ben fatto.", + "La roccia riflette parzialmente la luce accecante della stanza. C'è inciso qualcosa:\"Presto, prima di dovermene andare di nuovo(si sta illuminando sempre di più, succede ogni volta)- la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\"") + } +, + quest_event:{ + dialogue:new Array( + "La roccia lucente riflette solo parzialmente la luce della stanza. C'è inciso qualcosa:\"Presto, prima di dovermene andare di nuovo(si sta illuminando sempre di più, succede ogni volta)- la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "CIAO. HAI GIÀ INCONTRATO cubo?", + "cubo È UN OTTIMO SOVRANO DI QUESTA PORZIONE DI SPAZIO. ANCHE NOI ALTRI SOVRANI FACCIAMO DEL NOSTRO MEGLIO NEI NOSTRI SPAZI.") + } +, + gray2:{ + dialogue:new Array( + "CHE NE PENSI DI QUESTA PARTE DI SPAZIO? È UN BUON PUNTO DI INCONTRO, NO?", + "UNA INTERSEZIONE DI MONDI!") + } +, + gray3:{ + dialogue:new Array( + "NESSUNA DI NOI PIRAMIDI GRIGIE È DAVVERO QUI. USIAMO DEI CONGEGNI SPECIALI CHE CI PERMETTONO DI PROIETTARCI QUI.", + "PERCHÉ LO FACCIAMO? PERCHÉ VOGLIAMO PARLARE CON IL NOSTRO AMICO cubo E TENERE COMPAGNIA A cubo.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "... IL DISPOSITIVO OLOGRAFICO STA FUNZIONANDO CORRETTAMENTE?", + "NO?^...^MALEDIZIONE!") + } +, + color1:{ + dialogue:new Array( + "Hai conosciuto CUBO? Fa delle cose fantastiche! Ho sentito che una volta è rimasto appoggiato su uno spigolo per circa dodici secondi. Oh cielo! Sai che significa per la Lega degli Appoggiatori sugli Spigoli? No? Beh, molto!") + } +, + color2:{ + dialogue:new Array( + "CUBO fa un sacco di lavoro Interessante!", + "Hai sentito? Pare che fra poco toccherà a me fare il sovrano! Fra qualche minuto, credo.") + } +, + color3:{ + dialogue:new Array( + "Vengo da Pan di Zucchero, vado verso Taipei. Perché sono qui? Oh, sono passato a salutare CUBO!", + "Non essere così abbattuto! Questo posto è solo una strana rappresentazione per non shockare tutti i visitatori. Per quanto ne sappiamo, è per la maggior parte innocuo.") + } +, + colordead:{ + dialogue:new Array( + "(... sta facendo un pisolino?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "OGNI GENERAZIONE NASCE NEL DOLORE PER MORIRE NEL DOLORE. NON SOFFRIREMO PER CONTINUARE IL CICLO. NON ANDREMO ALL'ESTERNO.") + } +, + after_fight:{ + dialogue:new Array( + "È QUESTO IL TUO CASTIGO PER LA NOSTRA RIBELLIONE?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Perché privi Colui Che Vede dei suoi sacrifici? Perché ci hai rubato la nostra salvezza?") + } +, + after_fight:{ + dialogue:new Array( + "... Abbiamo fallito nel fartela pagare per la tua Interferenza. Eppure... ci hai ridato la possibilità di essere liberi. Grazie, Young. Possa Colui Che Vede concederti nuovamente il suo favore.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Che bello vederti, Yang. Ne è passato di tempo. Stai ancora giocando a quei nintendo, eh?") + } +, + after_fight:{ + dialogue:new Array( + "Per amor del cielo, Yon, quando ti deciderai a crescere? Sai, dovrai imparare ad avere a che fare con la gente prima o poi.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Qui disponiamo di tutti i comfort. Ti piace la nostra piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "Che ne pensi del nostro centro fitness di ultima generazione?") + } +, + after_fight:{ + dialogue:new Array( + "Speriamo che ti sia goduto il soggiorno!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Oggi è una bella giornata.", + "Grazie per avermi grattato la parte che mi prudeva sul collo - non riuscivo a raggiungerla.", + "Ho sentito che il ristorante qui in zona fa delle ottime uova. Ho anche un coupon per prenderle.", + "Hai visto l'incidente d'auto di oggi? È stato orribile! Lui era al cellulare. Che peccato, così giovane!", + "Mio figlio non è riuscito a entrare nella squadra giovanile dell'università. Che delusione. Abbiamo investito così tanto nella sua carriera sportiva.", + "Oggi è il giorno del ringraziamento. Sono grato per molte cose. Non vedo l'ora che arrivi domani mattina per i saldi. Farò un sacco di affari.", + "Ah, penso che potrei far tardi a lavoro.", + "Vado un po' di fretta, devo tornare a casa per mettere in ordine prima che arrivino i miei suoceri.", + "Stiamo facendo un mercatino dell'usato in garage!", + "Benvenuto!") + } +, + words_teen:{ + dialogue:new Array( + "Non ho visto l'ultimo film.") + } +, + words_kid:{ + dialogue:new Array( + "Non devo mai vedere l'ultimo cartone!") + } +, + family:{ + dialogue:new Array( + "Benvenuto nella nostra casa, straniero! Mi sembri familiare. Questa è una cittadina pacifica. Abbastanza tranquilla, senza molti visitatori.", + "Ti piacciono i Davement? Mio fratello Dave mi ha fatto sentire una loro canzone molto bella!") + } +, + older_kid:{ + dialogue:new Array( + "I miei amici amano ascoltare \"Nessuna sopresa\" delle \"Teste di radio\" e lamentarsi di questo posto. Non sarà fantastico, ma che diamine, almeno mostra un po' di gratitudine! O fa' qualcosa per cambiarlo! Sono tutti dei... Oh, scusa. A volte tendo a fare così...", + "Andrò a scrivere sul mio blog.", + "Certo che sembri Intontito.", + "Ho difficoltà a sentire i miei stessi pensieri con gli sport a tutto volume alla TV, ma ai miei genitori piace.") + } +, + hanged:{ + dialogue:new Array( + "Un biglietto sul cadavere:\"Così non sarò più in pericolo.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, che succede fuori? Un festival? Una parata?", + "Sembra che ci sia una bella confusione lì fuori! Hai guardato fuori dalla finestra di recente? Mi chiedo cosa possa essere.") + } +, + paranoid:{ + dialogue:new Array( + "In casa mia ci sono molte finestre. Non mi piacciono le finestre. È come se qualcuno stesse sempre guardando dentro. E tu sai che CI DEVE essere qualcosa là fuori. Non può essere sempre così silenzioso, così silenzioso e tranquillo - mi inquieta.", + "Assassini? Cosa? Fuori? Di che stai parlando? Mi stai prendendo in giro? Non ci sono mai stati assassinii in questa città prima d'ora, ma... stai iniziando a farmi preoccupare... penso che forse dovresti andartene.", + "Per piacere, vai via.") + } +, + dead:{ + dialogue:new Array( + "Questa donna è stata colpita a morte con un corpo contundente.", + "È stato davvero un duro colpo...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Oh, sei tu! Mi sembri familiare... non posso muovermi finché non uccidi abbastanza cittadini, ricordi? Torna fra un po'.", + "Secondo questo volantino... devi uccidere ancora qualche persona! Continua così.", + "Ci serve solo un altro corpo, poi potremo continuare.", + "Ben fatto. Sentiti libero di entrare. Non ho idea di cosa ci sia lì dentro. Ci vediamo domani a quest'ora, giusto? O la notte successiva?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "Non mi importa se gli alberi mi guardano.", + "Dov'è lei?!", + "Sarò con te, Young, ogni volta che sarai solo.", + "Sei un Ookchot? Mia madre mi ha sempre messo in guardia contro il Pericoloso Ookchot.", + "È da un gel po' che non ci vediamo, Young! Blobabilmente non dovrei pensarci ma... Mi trovi flaccido? Mi hanno dato del Buddhino!", + "Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Meno, Per, Diviso, Fratto...", + "Offerta limitata! Compra uno, prendi uno gratis - solo per oggi!", + "Ricordi quella volta che hai acceso una candela perché era andata via la luce?", + "Mmmm, si stava comodi sul tuo cuscino ieri notte.", + "Questo gli insegnerà a non chiamarmi fumi-GAY-tore.", + "Manu e io facciamo una bella squadra.", + "Sono l'Aspirante Prescelto!!!", + "A volte non ti sembra che, qualunque cosa tu faccia, non puoi impedire la fine del mondo?", + "Attento ai funghi della foresta...", + "Mi dispiace. È la mia natura.", + "In che senso, SOLO una roccia?? Anche le rocce possono stare sulle carte, sai?!", + "Dai un pesce a un uomo, e lui mangerà per un giorno. Insegna a pescare a un uomo, e gli darai dei momenti in cui legare con suo figlio Jimmy.", + "A volte la risposta è fare una passeggiata.", + "Perché i pipistrelli volano basso ogni volta che ti avvicini?", + "NO, *TU* HAI BISOGNO DELL'APPARECCHIO!", + "SEI FELICE ORA?", + "Non usare la violenza vicino a me.", + "Ho sempre voluto partecipare a Master Chef.", + "La mamma diceva sempre, 'se inarchi così la schiena finirai per rimanere così!'", + "Ti stai divertendo, umano?", + "...", + "Scientificamente parlando, i rospi sono un sottoinsieme delle rane.", + "AHAHAHAH! Sì! LO SO!", + "Oh, anche tu collezioni carte? È molto di classe, Ying.", + "Mi dicevano sempre, \"Smettila di stare al computer! O non avrai nessun amico!\"", + "Sono il sovrano solo per la durata di una conversazione.", + "Scommetto che pensi di 'star rendendo il mio lavoro Interessante'!", + "Odio le diagonali.", + "Non pensare che uno stupido antistaminico funzioni con me.", + "Usa questa carta per sbloccare la porta della tua stanza!", + "Sto facendo un ottimo lavoro.", + "........??", + "Chi diavolo ci ha scolpiti?", + "Spero che tu abbia trascorso un piacevole soggiorno.", + "Visto che sei arvrivato fin qui, devi essere un tipo Interassante.", + "Sono qui solo per portarti fuori strada.", + "Tu ci sembri una piramide!", + "È sempre lo stesso maledetto spettacolo, notte dopo notte, e la paga fa schifo.", + "Lasciami in pace! Il mio cognome non è Sachs!", + "Almeno non sono solo una mazza.", + "Il denaro non cresce sugli alberi? Che vuoi dire? Eheheheh!", + "Non sono altro che un'illusione.", + "MI SFOGHERO' CON TE.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Premi", + "Per selez. comandi.", + "Per cancellare.", + "Su", + "Giù", + "Sinistra", + "Destra", + "Salta", + "Attacca", + "Menù", + "Premi", + "per uscire", + "per impostare i comandi.") + } +, + title:{ + dialogue:new Array( + "Premi le\nfrecce direzionali per ridimensionare\nla finestra finché\nnon riesci a vedere\nzone nere sui\nbordi.\n\nPremi", + "Quando hai terminato.", + "ANODYNE", + "Melos Han-Tani\Marina Kittaka", + "Qualunque tasto", + "Premi", + "Per iniziare", + "Versione", + "Continua", + "Nuovo gioco", + "Sei sicuro?\nNo\nSì", + "Davvero?\nNah\nDai, sì", + "Davvero davvero??\nScherzavo\nCerto", + "morti", + "carte", + "Anodyne supporta\nla maggior parte dei controller.\n\nNe userai uno?\n\nSì No\n\nSe sì, connettilo adesso.\n\nMuoviti con le frecce direzionali\n\nSeleziona usando\nC, SPAZIO, o ENTER\n\nSi applicherà sì di default in\n", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", + "NOTA\n\nSe ci sono lag di movimento\ndurante la partita,\nritorna alla schermata inziale e\nrientra in Anodyne.\n\nPREMI C PER CONTINUARE\n\nL'interfaccia grafica non appare come dovrebbe?\nPremi il tasto qui sotto\n\ne orienta di nuovo il dispositivo.") + } +, + gui:{ + dialogue:new Array( + "menù=enter", + "Salvataggio...") + } +, + map:{ + dialogue:new Array( + "Mappa", + "Stanza attuale", + "Porta/Uscita", + "Ness. mappa", + "Ritorna al\nNexus", + "Ritorna\nall' entrata") + } +, + items:{ + dialogue:new Array( + "Oggetti", + "Normale", + "Scambia", + "Estendi", + "Amplia", + "Un paio di scarpe a molla - premi", + "per saltare!", + "Un paio di scarpe da ciclismo.", + "Una scatola di cartone vuota.", + "Una chiave trovata nel tempio di Colui Che Vede.", + "Una chiave trovata in una caverna sotterranea rossa.", + "Una chiave trovata in una caverna di montagna.") + } +, + cards:{ + dialogue:new Array( + "Carte", + "carte") + } +, + save:{ + dialogue:new Array( + "Salva", + "Salvato!", + "ERRORE", + "Salva e torna\nalla schermata iniziale", + "Vai alla schermata iniziale", + "Salva ed esci", + "Esci dal gioco", + "Morti:") + } +, + config:{ + dialogue:new Array( + "Config", + "Imposta comandi", + "Imposta volume", + "Autosalvataggio nei\ncheckpoint:", + "Attivato", + "Disattivato", + "Cambia\nRisoluzione:", + "Config. Interfaccia", + "Touch + Frecce", + "Solo frecce", + "Solo touch", + "Impostazioni movimento:", + "Risoluzione:", + "Mod. finestra", + "Regola Int.", + "Estendi", + "risoluz.:", + "Lingua:", + "ja", + "en", + "Trascina i\npulsanti\nfino a raggiungere\n una posizione ideale.\n\nPoi, tocca il\nmenù\nper continuare.\n\n", + "Dimensione\nfinestra", + "Config. joypad") + } +, + secrets:{ + dialogue:new Array( + "Ci sei dentro fino al collo!", + "Un tempo di proprietà di un famoso Mago delle Bolle.", + "Se la grafica sembra criptata, cerca la definizione del pokedex di un pokemon ufficiale.", + "Questo cuore non ha nome.", + "Prego, fai visita al mondo dei mostri elettrici.", + "La statua di un gattino. Carina, ma inutile.", + "Oh cielo!!!!", + "Oh no!!!!", + "È nero.", + "È rosso.", + "È verde.", + "È blu.", + "È bianco.", + ":Seleziona", + ":Indietro") + } +, + swap:{ + dialogue:new Array( + "Scusa!", + "Lo swap non funzionerà qui.", + "Young non è riuscito a raccogliere forze a sufficienza per usare lo swap qui.") + } +, + keyblock:{ + dialogue:new Array( + "Questa porta è chiusa.") + } +, + treasure:{ + dialogue:new Array( + "Una forza misteriosa ti impedisce di aprire questo forziere.", + "L'incisione sul manico della scopa recita:Premi", + "per spazzare.", + "Questa chiave può essere usata una sola volta per aprire un ostacolo che blocca il tuo percorso.", + "Un misterioso paio di scarpe di marca con su scritto\"Premi", + "\".", + "Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria AMPLIA dal menù per permettere alla scopa di rilasciare polvere nociva a destra e sinistra.\"", + "Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria ESTENDI dal menù per permettere alla scopa di rilasciare polvere nociva in avanti, oltre il suo normale raggio.\"", + "Una nota accanto alla miglioria della scopa:\"Ciao, Young. Usa questa miglioria SWAP per scambiare di posto due pezzi di terreno. Potrebbe volerci un po' affinché tu possa usarla ovunque, ma dovrebbe esserti utile per ora.\"", + "HAI TROVATO UN CUORE!!!! Vita massima aumentata di... zero.", + "Goldman:Cosa? Non è qui? Quel negoziante deve averlo rubato!") + } +, + dust:{ + dialogue:new Array( + "La tua scopa ora è piena di polvere! Attacca di nuovo per farla posare.") + } +, + checkpoint:{ + dialogue:new Array( + "Vuoi salvare?\n Sì\n No", + "Mentre sei su un checkpoint, premi", + "Per salvare i tuoi progressi e ripartire da qui se dovessi morire.") + } +, + rock:{ + dialogue:new Array( + "C'è qualcosa scarabocchiato su questa roccia:") + } +, + door:{ + dialogue:new Array( + "Il portale non sembra essere attivo.") + } +, + keyblockgate:{ + dialogue:new Array( + "Il cancello non si muove. Non si aprirà finché non percepirà la presenza di quattro carte...", + "Avendo percepito la presenza di quattro carte, il cancello decide di aprirsi.", + "Il cancello rimane ostinatamente chiuso.", + "Il cancello percepisce tutte le carte e decide di aprirsi.", + "Il cancello percepisce abbastanza carte e decide di aprirsi.", + "Si apre!", + "Rimane chiuso.") + } +, + solidsprite:{ + dialogue:new Array( + "Il cartello indica a est ma le parole sono sbiadite.", + "Il cartello indica a ovest ma le parole sono sbiadite.", + "Le parole sul cartello sono sbiadite.") + } +, + mitra:{ + dialogue:new Array( + "Ehi Young!", + "Queste scarpe da ciclismo sono per me? Wow! Grazie, Young! Stavo proprio pensando di prenderne un paio, visto che Manu ha dei pedali ai quali puoi attaccare questo tipo di scarpe. Tieni Young, prendi le mie scarpe in cambio! Hanno queste molle fighissime che ti fanno saltare molto in alto! Premi", + "per saltare mentre le indossi!", + "Ciao, Young! Noti niente di nuovo? ^... ^... Oh beh, vedi, ho comprato questo nuovo paio di scarpe da ciclismo! Si attaccano ai pedali di Manu. Visto che non mi serviranno più le mie vecchie scarpe, voglio che le abbia tu, Young! Hanno queste molle fighissime che ti fanno saltare molto in alto!", + "per saltare mentre le indossi!", + "Beh, ciao!", + "Forza, provale! ... Non puzzano COSì tanto.", + "Belle, eh?", + "Ehi, quelle sono le scarpe da ciclismo del negozio di Flinty? Le stai dando a me? Grazie Young, lo apprezzo moltissimo! Tieni, in cambio prova queste scarpe -- Sono sicura che le troverai molto utili! Sulle scarpe c'è scritto \"Premi", + "per saltare\" Non è molto chiaro però, non c'è nessun \"", + "\" sulle scarpe...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Benvenuto, benvenuto Young, amico mio! Io sono Prasandhoff--Finty Prasandhoff! Dai un'occhiata e fammi sapere se ti Interessa qualcosa!", + "Finty:Ti sono ancora grato per quella scatola!", + "Finty:Ah, una scatola! Grazie mille! Ora posso portare la mia merce a casa di notte e di nuovo qui al mattino!", + "Aspetta un momento... non è qui! Che è successo? Aspetta, lasciami tamponare le tue ferite!", + "Come segno della mia gratitudine, prendi queste eleganti scarpe da ciclismo!", + "Buongiorno, amico mio! Una splendida mattinata, non trovi? Un'ottima giornata per fare compere! Vorrei solo avere una scatola per poter trasportare la mia merce.", + "Peccato, pare che non ti possa permettere questo oggetto! Torna più tardi, quando avrai il denaro!", + "Finty:Ah, hai buon occhio! Hai bisogno di un'arma migliore, non è così? Fai saltare in aria i tuoi nemici per soli $499.99!", + "Finty:Quel sacco per le monete ti permetterà di accumulare il denaro che trovi nella Landa! È tuo per soli $869.99!", + "Finty:Oh ho ho, questo è un oggetto assolutamente speciale:scarpe da ciclismo che si attaccano ai pedali, per essere veloci ED eleganti! È in offerta a soli $299.99!", + "Finty:Stanco di spostare la polvere con la tua misera, piccola scopa? Oblitera le particelle di polvere nociva con questo aspirapolvere all'avanguardia! A soli $749.99, o in quattro piccole, comode rate mensili da $199.99!", + "Come segno della mia gratitudine, ti dono questa orribile--volevo dire, stupenda carta da collezione!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nUn gioco creato da\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n-------------", + "Creato fra\n\nmarzo 2012\n\ne\n\ngennaio 2013", + "DESIGN\n------\nEntrambi", + "PROGRAMMAZIONE\n-----------\nMelos, con la\nlibreria di Flixel\nper Actionscript 3\n\n\n\nART\n---\nMarina\n", + "MUSICA/SFX\n---------\nMelos, con REAPER\ne soundfonts\ngratuiti.\n\n\n\nDIALOGHI\n--------------\nPrincipalmente Marina\n", + "TRAMA\n-----\nEntrambi\nLocalizzazione\ngiapponese:\nKakehashi Games\nLocalizzazione\nspagnola:\nDiego Fenollar\nLocalizzazione\nitaliana:\nFrancesco D'Aucelli", + "Un immenso grazie ai\nnostri testers,\nche hanno sofferto\naffinché voi\nnon doveste\nfarlo!\n--------------\n\nMarina, che ha\nsofferto molto\nper i bug iniziali.\n\nEtan, per il sostegno\ncostante, fin dal\nprincipio, con\nmolti bug \ntrovati, e il\nterzo umano a\ngiocare a quasi tutto\nil gioco.", + "Olivia - grazie,\nsorellina!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos vorrebbe\nringraziare:\n\nMamma e Papà, per il\nloro sostegno costante\nin questa impresa.\n\nS\n\nMolti TIGSourcers\ne altri\ndevs incontrati!\n\nMarina, per aver reso\nquesto gioco possibile,\ne per averlo\nmigliorato in\nmille aspetti.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE i mei altri amici\nche mi hanno\nmostrato sostegno\n(Grazie!)\n\nInfine, ma non \n per importanza,\nTina Chen.\nVecchia amica,\ngraze per il sostegno\ne anche per\navermi presentato\na Marina.", + "I ringraziamenti\n di Marina vanno a...\n\nColin Meloy, per\naver ampliato\nil mio vocabolario\n\nTsugumo, per\n\"E così vuoi fare il\nPixel Artist?\"\n\nAlla mia famiglia,\nper il sostegno\ne il cibo.\n\nA Daniel, per essere un\n\"Indie games dev\"\ncrescendo insieme.", + "Mo, per aver creduto\n in me.\n\nTina, per\navermi presentato\na Melos.\n\nMelos, per aver creato\nun gioco e per esserti\nfidato così\ntanto\ndi me.", + "CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "\n\n\n\n\n\n\n\n", + "Vorremmo infine\nringraziare TE!\nPer aver giocato!\n\n\nSperiamo che\nti sia piaciuto.", + "Ora sei in grado\n di esplorare il mondo\ndi Young senza\n(quasi)alcuna\nlimitazione, spostando\nil terreno con\nlo swap.\n") + } +, + elevator:{ + dialogue:new Array( + "Piano?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancella") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_JP.hx b/AIR/intra/hsrc/data/NPC_Data_JP.hx new file mode 100644 index 0000000..3314848 --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_JP.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_JP { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "音楽好きなら,ターミナルに話しかけてみよう!", + "イタイの好きなら,南へ行ってみよう!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "サーカスの団員が落ちそうだ! 安全ネットはどこに?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "ウワーー") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "ライオンたちがジャグラーに近づいてる!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "ブライア:ボクはねヤング つかれたんだ 同じ事のくり返し 同じ夢のくり返し... 終わらない悪夢だ", + "ブライア:...", + "ブライア:永遠に変わらないんだよ ヤング ずっとこのままなんだ") + } +, + after_fight:{ + dialogue:new Array( + "ブライア:さよならだ ヤング") + } +, + final:{ + dialogue:new Array( + "ブライア:おいおい ヤング", + "ブライア:ほら足動かして 手もだ オレがいないと何にもできないのかよ!", + "ブライア:ほら 行こうぜ サンドイッチかなんか食おう", + "賢者:まあ... 及第点だよ... 次に会うまではな") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "なぞの声:こほん... ヤングよ... 私の声が聞こえるかね? ^もしもーし! お 聞こえるようだね... いいかい 間もなくキミは目をさます そうしたら 矢印キーで歩き回れるはずだ", + "人と話したりモノを使ったりするには \'", + "\' キーを押すように", + "それからメニューを開くには \'", + "\' キーだ ここでは自分や世界についての情報が見られる") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "ヤング... 私はただキミのためにすべてを正したかったのだ", + "キミは... もっとうまくやってくれることをねがうよ") + } +, + posthappy_mitra:{ + dialogue:new Array( + "ヤング... がんばってね", + "賢者の言ったこと それなりに合ってる わたしはすべてがステキで完ぺきであってほしくて そのせいで ときには現実だって無視してた", + "ブライアを助けるために何するべきかなんて わからない 世界のしくみも...ここが色々おかしく見える原因だって...でもねヤング わたしはキミの友だちになりたいよ", + "キミはたたかってる 分かろうとしてるじゃない 早くカイケツできるといいね") + } +, + one:{ + dialogue:new Array( + "賢者:ヤングよ... 私からのさいごのけいこくだ... ん?なんだ だれだ?", + "ミトラ:わたしはミトラっていうの こちらはわたしの自転車でウェアズ!", + "賢者:自転車の名前など聞いておらんよ 知らないかおだな ここで何をしている?", + "ミトラ:友だちのヤングを助けにきたのよ", + "賢者:ヤングに友だちなどおらんよ ブライアもおらんというのに ヤングにいらぬことを吹きこむのなら私の世界から出て行ってもらおう!", + "ミトラ:どういうイミ? わたしとウェアズは --", + "賢者:アホみたいな自転車のことは 聞いておらんと言っている!!!") + } +, + hit:{ + dialogue:new Array( + "賢者:...", + "ミトラ:ヤング! 大丈夫?! ウェアズのために...ありがとう... さあ このろくでもない場所を おわらせちゃって! キミならできるよ!", + "ミトラ:ウェアズ!!!!", + "ミトラ:ウェアズ......", + "ミトラ:ちょっとフードのヒト! アナタがなにさまか知らないけど わたしたちのことはほっといてよ!", + "賢者:きさまがヤングの友だちだと? ヤングは本当は完ぺきで 最後には何もかもうまくいくとウソをつくことが友だちだとでも? そうか いいだろう それがお前の望みだというのなら 勝手にすればいい さっさと失せるがいい", + "賢者:\"友だち\"と話せばよかろう", + "ミトラ:わたしたちはただベストを尽くしてるだけなのに...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "フードをかぶった男:さてと そろそろ時間かな ええと...^その...^ やあヤング! 私は賢者 まあ村の長老だ 君に来てもらったのは他でもない 実はセカイに広まった\"クラヤミ\"が 伝説のブライアをさがしているのだ その力を邪悪なことに使うためにね キミにはクラヤミよりも先にブライアを見つけて 守ってほしい", + "さあ 左に使えるようになったポータルがある そこから冒険に出かけなさい", + "ハァ... 何だってまだ うろついてるんだね 早くポータルから出かけてくれ ブライアの ひいては世界の ききだというのに!", + "さあ さっさと行かんか!") + } +, + after_ent_str:{ + dialogue:new Array( + "どうしたのだ?早く進みたまえ") + } +, + after_bed:{ + dialogue:new Array( + "いいぞ ヤング そのようなカギは 他にもあるはず すべてさがし出すんだ", + "さあヤング この世界を歩きつくすのだ \"クラヤミ\"を止めるにはそれしかないのだから") + } +, + before_windmill:{ + dialogue:new Array( + "その3つのカギがあれば \"ザ ランド\"のさらに おくまで 歩みを進められるだろう") + } +, + after_windmill:{ + dialogue:new Array( + "たのんだ通りにやってくれたようだね ヤング だがまだザ ランドでやるべき事は残ってる ザ ランドをくまなく冒険し より多くを成しとげれば... ブライアにまた近づくことになるかもしれん") + } +, + all_card_first:{ + dialogue:new Array( + "フム エリアにあるカードをすべて集めたようだね ポータルの上にある宝石が赤くかがやくのは カードを集めた あかし なのだ") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "賢者:間もなくキミは 力をためされることになるだろう この寺院を生き抜くには 力と知性の両方が求められる さて もう武器は手に入れたかね?", + "ハァ?... ちがっ いや もちろんホウキだとも! えーっと... まさに言い伝えの通りだ", + "... 何でよりによってゴニョゴニョ... おい! 何を突っ立っているだね!", + "気を引き締めてな ヤング") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "賢者:キミはまだ とてもよわい クラヤミからブライアを守るには 己の恐怖を克服しなければならん そこのハコに入っているようなカードは キミの成長のあかしだ たびの間は できるだけ集めるようにしなさい", + "それからカギ これも大事だ カギは他にもあるから よくさがしなさい ああ それからメニューの\"マップ\"からは寺院の入り口までテレポートできる さあ先をいそぎなさい", + "寺院庭園の東と南にすすめば カギがやくだつ 場所があるだろう", + "何だ? 私にくっついて ゲートにもぐりこもうとでも?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "なぜ言うことを聞かない! バカみたいに突っ込めば ブライアとザ ランドを危険にさらすだけなのだぞ! これまでの じゅんびもオシャカだ! すまんがヤング キミが話を聞かぬなら 別の方法で聞かせるしかないようだ") + } +, + after_fight:{ + dialogue:new Array( + "賢者:ヤング... こんなハズではなかったのだ... 私はただ キミにより良い人間になって欲しかった ブライアを助けられるようになって欲しかった しかしすべては くだらぬゲームにすぎない... もう私には キミがブライアのもとへ行くのを止められぬ すべてが じごくになったとき 私が今言ったことを思い出すといい") + } +, + entrance:{ + dialogue:new Array( + "賢者:やあ ヤングよ キミがよりつよく よりかしこくなったとき ブライアへとつづくこの道は開かれるだろう", + "賢者:だが今はまだ早い まずは\"ザ ランド\"にのこる試練を のりこえねばな", + "賢者:ずいぶん成長したな ヤングよ しかしこの門をくぐるには カードが36枚はひつようだぞ") + } +, + etc:{ + dialogue:new Array( + "賢者:ううむ...フム... 36枚以上カードを集めてきたと? しかし本当の試練に立ち向かうには まだ早い気がせんでもない... そうだ... 門に書いてある数字も...36じゃないし...\n...\n......\nほら門には92枚ひつようって書いてあるな!", + "賢者:ヤング 行ってはならん まだ早いのだ! ブライアも ザ ランドも 早まってしまっては ぜんぶ おわってしまう!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "賢者:見事だったぞ ヤング モンスターを倒すだけでなく 己の恐怖にも 打ち勝ったのだから!", + "賢者:もちろん道のりはまだ長い ザ ランドのぼうけんは進んでいるかね?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "賢者:見事だったよ ヤング しかし しれんはまだまだ続く 気をぬかんようにな", + "賢者:ところでカギはぜんぶ集まったかね? まだならビーチに行ってみなさい") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "ぼくはほかの犬とはちがうよ! ワフワフ おそったりしないから...", + "ぼくは ちょうわとしずけさを好むからね", + "きみの匂い スイスチャードのはっぱ みたいだね", + "わんわん!") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "やったわね ヤング! ついに\"クラヤミ\"をたおしたのね! ほら見てこの場所 本当にうつくしいわ!", + "本当に美しいわ...") + } +, + dump:{ + dialogue:new Array( + "ああ良かった! 無事だったか! あの雪だったから うもれちまったのかと思ったよ... それにしてもココは気が めいるよなあ! まいるぜ!", + "アハハハ ウハハハハハ アヒャヒャヒャヒャヒャヒャ!") + } +, + drink:{ + dialogue:new Array( + "キミかわいいねー 一杯おごっちゃうよ!", + "もう一杯どうだい このクソヤロー! ハハハハハ!") + } +, + hot:{ + dialogue:new Array( + "ここ クッソあつい... ホット!ホット! 汗ダラダラ...", + "あー チキショー ワークアウトするとムラムラしてくる!") + } +, + gold:{ + dialogue:new Array( + "この世界って金で できてるって知ってた? かね じゃなくて きん で! そこのレンガひとつ もらって かけおちしましょ 一生あそんでくらせるわよ! アハーハハハー!", + "マジで つったってないで このレンガ外すの手伝ってよ!") + } +, + briar:{ + dialogue:new Array( + "???:ヤング... ついやにったな! よやうく たかすった! もにうどと もにとは もらどんぞ!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "どーいてー!", + "ごめんね... ちょっととばしすぎてたわ... あれ 見ないカオね! キミも旅行中? へ? くらやみからブライアを守る...?^えーっと 何の話かサッパリだけど なんかカッコイイんじゃない!", + "わたしはこのへんをウェアズで走ってたの え...? ちがうよ服のハナシじゃなくて わたしの自転車の名前!", + "きっとまた どこかで会うわよね ブライアのハナシを聞いたらちゃんとおぼえとくね") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "よっし! ウェアズ! いっくよーーー!", + "ドォーーン!", + "ヤング がんばって! わたしたちも ついてるよ!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "わたしのコト 覚えてる? この前は自己紹介してなかったね 自転車のウェアズだけ紹介して... わたしはミトラっていうの", + "わたしのコト 覚えてる? この前は自己紹介してなかったね わたしはミトラ それからこのハンサムでカッコイイ自転車はウェアズっていうの", + "ミトラ:で ヤングは元気だった? へ? なんで名前を知ってるかって? フシギ? えっと その服 背中に名前が書いてあったから", + "ミトラ:それじゃ またね!ヤング") + } +, + quest_event:{ + dialogue:new Array( + "ミトラ:あ 今思い出した... 誰かがね 何かを先に見つけないととか言ってたの 何のハナシかは分からなかったんだけど とにかく山に行くって言ってた すごく急いでたよ") + } +, + game_hints:{ + dialogue:new Array( + "んー 何でもない", + "ん? まよったの? ビーチのほうは もう行ってみた? だれか助けてくれるかもよ カギの使える場所もありそうだけど ほかのカギがいるかもね", + "ん? まよったの? 東にある森はもう行ってみた? あそこ カギの使える場所もありそうだけど ほかのカギがいるかもね", + "わぁ カギそろったのね! そういえば南東に カギがかかった門がいくつかあったような... そのカギで開けられるんじゃない?", + "ふうりょくタービンを動かしたの見たよー! すごいね! あれだけ強いカゼだとさ 自然への影響とかもありそうじゃない?", + "やっほ ヤング! わわ カードいっぱい集めたねえ! ところでこれって何につかえるのかな? 売ったらいいおかねになりそうだよね", + "わー そのホウキの新しいアタッチメント 何? え? 世界のありかたを...変える? ヤング それなんかコワイよ でも何でもってわけじゃ ないみたいで良かった きっと ザ ランドでもホントにおくでしか使えないんじゃないかな", + "ジャンプシューズのちょうしは どう? ケッコウ良いでしょ? わたしも新しいクツ気に入ってるよ ウェアズとの一体感もさらにアップしたし!", + "わあヤング またカギ見つけたの? ウェアズもその色好きだって言ってる! それで カギが使えるトビラとかは見つかった?") + } +, + card_hints:{ + dialogue:new Array( + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院のあたりはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえば見通せし者の寺院のうらぐちに迷路があるって聞いたなあ", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかの近くで何か見つかるかもよ", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院にさ てきが一杯の部屋 なかった?", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院はくまなく さがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかにウラぐちあったでしょ?あの近くにある はいきょ はさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのご近所さんが 何か知ってるかもよ?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパートに住んでるヒト,何か かくしてるみたいだけど...", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパートの入口近く...よーくさがしてみたら!?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパート ホントにすみずみまで さがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nここから南に行くと 島があるみたいなの わたしは行ったことないけど 行ってみたらどう?", + "ミトラ:あ ヤング カードさがしてるの?\n川ぞいには 色んなものが あるみたいよ よーくさがしてみたらどうかな!", + "ミトラ:あ ヤング カードさがしてるの?\nふうしゃの近くに 誰かがカードを置いていったって聞いたけどなあ", + "ミトラ:あ ヤング カードさがしてるの?\n森の中にある川のあたり さがしてみるといいよ...", + "ミトラ:あ ヤング カードさがしてるの?\n山のふもとあたりは もう回ってみた?", + "ミトラ:あ ヤング カードさがしてるの?\n山の頂上って 何かありそうよね", + "ミトラ:あ ヤング カードさがしてるの?\nビーチのはしっこって 何かありそうよね", + "ミトラ:あ ヤング カードさがしてるの?\n赤い森をさんぽしてみるってのはどうかな?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 赤のどうくつのひとつに カギのかかったトビラがいっぱいあるトコロあったよねえ", + "ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつはもうチェックした? 川に沿って進んでみるといいよ!", + "ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつから 川の源泉までさかのぼってみたら?", + "ミトラ:あ ヤング カードさがしてるの?\nえっと... やみの迷宮は すみずみまで回ったのよね?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 火がわんさか吹き出してる道あったじゃない? あのおくとか ゼッタイ何かありそうだよね!", + "ミトラ:あ ヤング カードさがしてるの?\nサーカスの団員たち 何かかくしているみたいだったけど あのへんはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n男女の二人組が落っこちた大きな穴あったじゃない?あの近くはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n穴の近くでグルグルしてたあのカップル ゼッタイ何かかくしてるよ", + "ミトラ:あ ヤング カードさがしてるの?\n深い谷とか いかにも何かありそうよね とくに山にあるどうくつとか!", + "ミトラ:あ ヤング カードさがしてるの?\n山にあるどうくつの いちばん高いところとか もう行ってみた?", + "ミトラ:あ ヤング カードさがしてるの?\n山にあるあのどうくつ... あのおくって何があるのかな?", + "ミトラ:あ ヤング カードさがしてるの?\nあの変な空間にいるカラフルなキューブとか ゼッタイ何かかくしてるよ!", + "ミトラ:あ ヤング カードさがしてるの?\nあのナゾ空間にいるモノクロのキューブとはもう話した? あのキューブなら何か知ってるんじゃないかな", + "ミトラ:あ ヤング カードさがしてるの?\nあのホテルのいちばん上のフロアさ 高級感はなかったけど 何か かくされてるかもよ!", + "ミトラ:あ ヤング カードさがしてるの?\nホテル3かいの部屋はくまなくさがした?", + "ミトラ:あ ヤング カードさがしてるの?\nホテルの2かいフロアには誰か何か置いてきてると思うんだけどなあ", + "ミトラ:あ ヤング カードさがしてるの?\nホテルのオーナーさん,キミに何か置いていってくれたかもよ!", + "ミトラ:あ ヤング カードさがしてるの?\n北西のこわれたハシのとこ あのへんてアヤシイよね!", + "...えー!? い ち ま い も カード見つけてないの? ヤング そんなの絶対 おかしいよ!人生たまには冒険しなきゃ!ハコをあけてみるとかさ!") + } +, + general_banter:{ + dialogue:new Array( + "そういえば 山で何かさがしてたヒトには会えたの?", + "ウェアズのみょうじってねー...ウォーリーっていうの ウェアーズ・ウォーリー なんちゃって!ハハン 自転車に みょうじはないから!", + "ねねヤング U字ロック売ってるとこ知らない? ウェアズをしばりつけたくは ないけど 自転車のとうなん 最近多いらしいから...", + "ところでブライアって何なの? 古代文明の失われた いさんとか そういうの?", + "クラヤミが迫ってるとかって話 全然聞かないのよね みんな自分のコトで忙しいってコトなのかな", + "ヤング 今度会ったら言おうと思ってたんだけど キミのヘアスタイルって ステキよ") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "石像:村の長老というのは名前だけ 村などないし 長老でもない") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "石像:ホウキについての言い伝え 用具入れロッカーに入っているとか") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "石像:冒険においてカード集めはとても大事 カードはいろいろ役に立つ クレジットとか みぶんしょうめいとか") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "石像:見事だったぞ 賢者 かんしゃくを起こさず 自己陶酔もしないで ちゃんと定型文みたいなセリフを言ったのだから!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "キミが より冷たく けれども より甘くなったとき キミはアイスクリームかもしれんだろう") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "エドワード:トイレにかがみを取り付けてもらったときにさ 中にかくしカメラがついてるんじゃないかって不安で 不安で とにかくしらべまくって すきまというすきまに オイルソープをすり込んだんだ 回路をショートさせようと思って でも 当然というか カメラなんて入ってなかったんだけど", + "エドワード:ここは見通せし者をまつる寺院なんだ なんでここに来たのかよく 覚えてないけど とにかく こわくて 中には入れないんだ") + } +, + bedroom_not_done:{ + dialogue:new Array( + "エドワード:お困りかい? たぶんそうだよね キミはホウキしか もってなくて ホウキはほこりを移動させる道具だ だよね?") + } +, + bedroom_done:{ + dialogue:new Array( + "エドワード:見通せし者をたおしたって? ハハッ ちがうよ キミはいわば すきまにオイルソープすり込んだ だけなんだ") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "おお ヤング なんとかわいらしい えいゆうごっこかね だがね 私はキミが\"ザ ランド\"に来てからの行ないをすべて知っている それから...この世界で私以上に正直なものはいない だれを信頼するのか よく考えることだね") + } +, + after_fight:{ + dialogue:new Array( + "ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる この先の冒険...私からのアドバイスを よくかみしめることだね") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "岩:周辺視野はアクマの巣") + } +, + two:{ + dialogue:new Array( + "岩:次の仕事:ネクサスへの移動手段を建設する 現在の状況:中断 - 見通せし者から予算を得られず続行不可 今後もあの 謎のポータルを使用し続けるしか方法なし") + } +, + three:{ + dialogue:new Array( + "岩:一人だけ残されてしまった トンネルの作業はじゅんちょうだ 少なくとも 毎日少しずつはすすんでいる") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "ダムを開けるハンドル") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957年6月24日:空中ブランコこわれる アリス・ラトガーズが地面に落ちる 両足のスネを骨折") + } +, + two:{ + dialogue:new Array( + "1957年7月17日:道化師7人が引退 深刻な呼吸器の病 ランドブレンド社のメイク道具が原因と思われるが 公式なそうさは行なわれず") + } +, + three:{ + dialogue:new Array( + "1957年7月21日:オリの誤作動あり 調教前のライオンにおそわれ顔と体に深いキズを負った 生きてはいるがカガミを見るのが こわい") + } +, + four:{ + dialogue:new Array( + "1957年8月5日:夢の中で 顔だけの石像と話す 目を光らせたそれは 私たちの存在理由を話すと 次にいたみから解き放つと言った") + } +, + five:{ + dialogue:new Array( + "1957年8月7日:見通せし者が明かしてくださった真実 それを受け入れるまで どれだけの者が苦しむことになるのか") + } +, + six:{ + dialogue:new Array( + "1957年8月8日:ついに決めた ついてくると言ってくれる者も何人かいる この日記もこれで最後だろう 見通せし者のご加護があらんことを") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(知らない文字で何かが書いてある)") + } +, + two:{ + dialogue:new Array( + "2010年12月7日(名前はよめない):何もない場所じゃないか!このろくでもない岩しかない!") + } +, + three:{ + dialogue:new Array( + "キケン! このどうくつは せいびされていません") + } +, + four:{ + dialogue:new Array( + "このガケははるか上まで伸びているが その先がどうなっているかを見たことはないなあ") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "岩:どうやって?") + } +, + two:{ + dialogue:new Array( + "岩:キケン! ガケあり 飛び込みは自己責任で") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "これはカードゲートの仮アニメーションとして つかってたものなんだ 近づいたりはなれたりすると ゲートが開いたり閉じたりするよ", + "なんでコレ使わなかったのかは忘れちゃったな... ドラマチックすぎたとかかな") + } +, + two:{ + dialogue:new Array( + "これは色んなタイルのレイヤーとかコリジョンをためしたところ! 一方通行タイルを両サイドに置いたりしていじってたんだけど 上手くいかなかったから ボツにした... とかだった気がする", + "これをつかわなかったのは デザインをシンプルにしたからなんだ ゲームを完成させるには大事なことだったんだよ") + } +, + three:{ + dialogue:new Array( + "さいしょはてきを倒すとカギを手に入れられたんだけど けっきょくボツにしたんだ それなりに気に入っていたんだけど", + "他にもチャレンジゲートっていうアイデアもあったんだ これはダメージを食らわずに試練をクリアできた ときだけ開くってやつだったっけ", + "いちじは 全部のダンジョンにつけて HPをなくしちゃおうかみたいな話もあったんだけど けっきょく なんいどが高すぎてダメだったんだ!") + } +, + four:{ + dialogue:new Array( + "ろうやです!", + "助けて!", + "おねがい!") + } +, + five:{ + dialogue:new Array( + "デバッグワールドへようこそ!ここはザ ランドではないので ゲームのストーリーとは(9割がた)関係ないけれど ゆっくりしていってね", + "マップのタイルセットが完成するまでは こういう仮タイルでマップを仮組みしていたんだ このゲームのダンジョンは 実はぜんぶそうやって仮組みして それからジョンが本番用タイルで置きかえていったんだよ") + } +, + six:{ + dialogue:new Array( + "若い女性") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "- 記録保存庫 -", + "注意してお進みください") + } +, + four:{ + dialogue:new Array( + "西:裂け目->現実へ! 不動産価値ひくめ ハリケーンあり 年代物 荒れほうだい リラックス効果") + } +, + three:{ + dialogue:new Array( + "見通せし者は おぼえているかぎりでばばばば......ヤー ヤッパリ ウチハ オチツクネー") + } +, + two:{ + dialogue:new Array( + "れいぞうしつ\n\n^ -- MGMT") + } +, + one:{ + dialogue:new Array( + "つづきから") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "西:ビーチ\n\n東:森\n\n南東:\n 熱帯雨林\n\n北:\n寺院庭園\n\n北の果て:ふかい谷") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "西:ランド湖\n南のち東:がけ") + } +, + two:{ + dialogue:new Array( + "森の小さなくつろぎの池 ちょっとひといき いかがです?") + } +, + three:{ + dialogue:new Array( + "おそらく私は このへんぴな場所にずっと いるんだろう") + } +, + four:{ + dialogue:new Array( + "東:がけ") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "灰色のガーディアンタイルを そのスピリットカラーに対応する色の石で置きかえれば 道は開けるだろう") + } +, + two:{ + dialogue:new Array( + "青い石像が動く時\n新たな道が開ける\nガケを抜けてきみょうな次元へ\nその先にはホテルがある\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所を取り仕切っているのは?\"\nこれほど人の魂に囲まれているのに\nぼくはこどくを感じる") + } +, + three:{ + dialogue:new Array( + "赤くさびた像が動いた\nおくへと つづく道が開く\nその先には迷路のようなダンジョンがある\nそしてサーカスへ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所から逃げるために 命をすてたのは誰だ?\"\nぼくはいたみを恐れる 他の人と同じように\nでも それよりも 死が怖い") + } +, + four:{ + dialogue:new Array( + "にぶいかがやきを放つ緑色の像が動いた\nさらにおくへと進む\nこぢんまりとした町を抜けて\nとある住宅へ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"星になぐさめを求めるのは誰だ?\"\n誰かに見られている気がする\nそしてそれは やさしい星々のそれではない") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "岩:ここは未開の地 ザ ランドの外側") + } +, + two:{ + dialogue:new Array( + "岩:これら^円と私は^やくそく^同心円に^全力でおわらせて...^...円が^ ビビービー...") + } +, + three:{ + dialogue:new Array( + "岩:見ててくれ^ -...でも僕はいつも^ - キミの歩みを^ - 再びキミがここに ^ - 現れてくれたらと") + } +, + four:{ + dialogue:new Array( + "岩:ここから見下ろして^ - 私は気がついた^ - ここから見るあなたは^私は彼を愛している^ - 実は何も見えない") + } +, + five:{ + dialogue:new Array( + "岩:申し訳ない - ^でもそうだね 僕らは -^このちらかった -^連絡は取ろうね -^でもポータルは^ - そしたら僕もいけんを -^君をザ ランドに帰すよ") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "人によっては 何度も話すと ちがうことを言ってくれる ことがある", + "岩はちがうけど 岩は いつも 同じ") + } +, + two:{ + dialogue:new Array( + "岩:本当に惜しかったんだ ああ もしも...") + } +, + three:{ + dialogue:new Array( + "岩:好奇心てのはすばらしいね") + } +, + four:{ + dialogue:new Array( + "岩:おおっ...!?") + } +, + five:{ + dialogue:new Array( + "コンピューターたんまつには メールが開かれている 画面が一部こわれているので一部のテキストは よめない メールの中身は...\" やあ ヤング!どうやら [...] 15番目のカード [...] から さけたほうが [...] 考えてみてほしい さて じゅんびはいいかい? 起きてくれ\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "岩:岩に書かれた文字を よんでるなんて 友だち いないの") + } +, + two:{ + dialogue:new Array( + "岩:オーバーロードステーションへようこそ ザ ランドはお楽しみいただけましたか?") + } +, + three:{ + dialogue:new Array( + "岩:たんけんー はっけんー ぼくのせかーい!", + "岩:南には行かないでください 建設中です") + } +, + four:{ + dialogue:new Array( + "岩:5,3にお宝!") + } +, + five:{ + dialogue:new Array( + "岩:おお!見つけたねえ!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "くずれゆく母の体内に 生まれ落ちた わたしたち") + } +, + two:{ + dialogue:new Array( + "私たちの母はある時 自らの母をすてて どくのキリの中へと歩み入った") + } +, + three:{ + dialogue:new Array( + "こんなこと 私たちは のぞんでなかった 母の苦しみの中に 産みおとされることなんて") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "岩:状況から考えるに これらの植物はかなり長いあいだ かつどうをていし しているようだ") + } +, + two:{ + dialogue:new Array( + "岩:南:???^ 北:???") + } +, + three:{ + dialogue:new Array( + "岩:このちいきのいびつな地形は 先住者の祖先が形作ったものだと言われている") + } +, + four:{ + dialogue:new Array( + "岩:かれらは平和的な生物のようだ") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "油性マジックらしきもので書いてある:\"空間\"と\"時間\"の旅人よ かんげいします あなたが足を踏み入れたのは次元の裂け目 りんせつする\"ヤング\"の世界からはるか はなれた場所 いわばあなたは\"海\"をひとつふたつ こえてきたわけです この場所はいろいろ\"ちがい\"ますが恐れないでください あなたはすぐに元の世界にもどるのですから \"不吉\"あるいは\"危険\"に見えるかもしれませんが恐れないでください ここの住民はみなとても\"フレンドリー\"ですので\n -- MGMT", + "(メッセージの下には文字が刻まれている)森で迷った ____(よめない)ここに眠る", + "(その下にまだメッセージがある)(とにかく南には行きすぎるな)") + } +, + two:{ + dialogue:new Array( + "虹に刺された____(よめない)ここに眠る", + "ここに書けるようなじっせきがあれば 良かったんだけど") + } +, + three:{ + dialogue:new Array( + "ガケに八つ当たりされちゃったバードここに眠る") + } +, + four:{ + dialogue:new Array( + "一回も使われなかったバッグ ここに眠る", + "大事にされすぎたね!") + } +, + five:{ + dialogue:new Array( + "サヴィッチここに眠る - ぼくのPCを修理してくれると言ってガレージに来て きゅうくつそうに座り込んで作業しだした 3年後 修理はまだ終わっていなかった そしてかれはコロリと死んでしまった") + } +, + six:{ + dialogue:new Array( + "とりたてて書くことのない男 デイブ ここに眠る") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---ヤング タウン---^\nヤングタウンへようこそ 他人とうまくやれない者もいますので\n 移動のさいはご注意ください... ヤングタウンは市長のイン氏による\n 宅地開発政策の一環として90年代に開発された町です 町の名前は市長の\n イン(陰)氏が自らの名前を拒絶し 自ら選んだヤング(陽)と名乗ったことに由来します\n ごゆっくりお過ごしください") + } +, + two:{ + dialogue:new Array( + "西には伝説の見通せし者の寺院があり 東には我らがイン市長のアパートがあります なお市長のアパートは一般開放されていません 訪れるさいはご注意ください") + } +, + three:{ + dialogue:new Array( + "5回めの訪問時 イン市長は駐車場の少なさに強い不満をおぼえました この駐車場は市長が感じた駐車場の少なさを表しています イン市長はそれ以来 来訪時にはこの駐車場を使うことがあります") + } +, + four:{ + dialogue:new Array( + "昔は長い文章書いてたの思い出すなあ 全然まとまりなかったけど!") + } +, + five:{ + dialogue:new Array( + "A DANGEROUS SITUATION") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "見通せし者はすべてを知り なんじを悟りへとみちびく者 悟りへの道のりを照らす明かりはない") + } +, + two:{ + dialogue:new Array( + "見通せし者の示す道から それてはならない たとえ迷路のかたすみに 宝箱があっても") + } +, + three:{ + dialogue:new Array( + "立ち止まるな") + } +, + four:{ + dialogue:new Array( + "チェイサーは らんぼうすると おこり出す") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "かんこうスポット:\"双子の塔\"しばらく前にけんせつされたこの塔からは 遠くの山々まで見渡すことができます 第一の塔は はそんして以来 別の目的に使われるようになりました 第二の塔は いまだ東にあり 天高くそびえています なお東の塔へ続く道は 安全上の理由から 現在ふうさされています") + } +, + two:{ + dialogue:new Array( + "安全上のお知らせ:^\nこの塔は はそんしていませんが 最上部に次元の裂け目が生じています ちゅういして 広い心をもって すすんでください^\n -- MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "この像は動かせそうにないし 動いてもくれなそうだ") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "この像はしっかり固定されているようだ") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "この像は 動かせそうにない") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "火は美しい そう思わんかね? だが町のあかりは 星のはなつ火のかがやきを かくしてしまう なげかわしいことだ") + } +, + after_fight:{ + dialogue:new Array( + "そうかね 星は火のかたまりじゃ ないのかね^キミは細かいな...") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "やあ 調子どう? 僕はこのパーティションの支配者であり この空間の成り立ちそのものだよ", + "なんで僕がこの場所の支配者か知りたい? いいけど長い話になるよ てか 超長いよ? じんじょうじゃないくらい長いよ", + "マジで 相当かかるけど いやマジで 忠告はしたからね! 僕すぐ話をだっせんさせちゃうしさあ 多分そこにある宝箱の中身さらってサッサと先進んだほうがいいよ それかチョイ遠いけどあっちのホテルに向かうとか なんでココにつながってるのかは分かんないけど 値段はけっこう安いみたいよ まあココではお金とか意味ないんだけど", + "なんで僕が支配者なのかって?^...じつは僕もよく分かんないんだよね ここらの友だちが この空間の現状を考えるとオマエがピッタリだよって言うからやってるんだけど アレかな? ココの支配者ってずっとここに座ってなきゃいけないんだけど キューブって平らな面に置くと安定するじゃない? そういうこと? 分かんないけど", + "あっちの友だちにも やっぱり長所はあるワケ その友だちもいつか支配者になる可能性はあるし 今はできないってだけなのね 僕らってときどき支配者交代するからさ まあそのときは空間のなりたちを変えるわけだけど! たとえば次に定める世界の形によっては ピラミッドさんだか ピラミッドくんが次の支配者になることもあるんよ 彼らが世界にハマる形さえしてればね なりたちを変えるってのはそういう意味なのね アホっぽく聞こえる? まあそうなのかもね でもまあ そういうもんだからしゃあない 世界のなりたちなんて数分とか数時間で変わるしね 長い時間がかかるわけじゃないのよ", + "ともあれ支配者ってのは やっぱ変な気分になるよ 何というか孤立してる感じとか 他人をさけたくなる というかさ", + "...ああ 孤立ってのはちょっと ちがうかな 部分的には合ってるんだけどね じっさい孤立はしてないし 他人も苦手なわけじゃないんだ 僕らはみんな友だちだと思ってるし でもさー みんなココに来ないし 来ても二言三言しか話さないし そういう点では孤立してるなあって思うよね", + "まあ そういう\"どうしてこの空間に僕らが存在してるか\"みたいな話よりさ どうして僕らが友だちなのかのほうが気になるよ", + "まあ今の空間のなりたちでは 僕が支配者やるのがベストってことで なりたちが新しく変わるまでは みんな僕が支配者でいられるように気をつかってくれるし... 物理的にそこに存在してくれる事とかね そういうのは はげみになるよね", + "僕としては それで十分みたいだ まあ一人か二人くらい 支配者の気持ちを理解してくれる友だちがいたらベターだけど でも別に文句言ってるわけじゃないよ! でももしそんな友だちがいたら 支配者が一人じゃない空間とかもありじゃないかって... うわ これすごいアイデアじゃない?! まあ僕が支配者じゃなくなったら 今言ったみたいに ふるまうつもりだよ... できるのかどうかは分かんないけど", + "でも支配者も これ以上はいいかなあ あ そうだ あっちの方向に進むと また似たような空間があるよ まあ匂いはちょっと ちがうだろうけど", + "いやあ でも会えてよかったよ", + "ん? また僕の話ききたいの?", + "オッケー んじゃ ココにすわっとく") + } +, + gray:{ + dialogue:new Array( + "やあ ボクはこの空間の支配者なんだー", + "ん? 何? なんでボクがここにいるか知りたいって? マジで言ってる? 説明し始めたら ちょう長いよ?", + "うーん どうしてもって言うならね... ただ それよりホテルに向かったほうがいいとは思うけどね どうしてホテルを建設することにしたのかはサッパリ分かんないけどさ もし税金かかるとか言われたら ぜったい文句言わないと!", + "やあ ボクはこの空間の支配者やってるんだ でも空間だけで人を支配してるわけじゃないよ", + "友だちもみんな それぞれの空間で支配者やってるけどさ あいつらも人を支配してはいないんだ そういうイミではみんな孤立してんのよね もちろんお互い話したりはするのよ? だからそういうイミでは全然孤立してないんだけど まあここは ボクが存在する空間のひとつってこと", + "ボクと友だちが支配してる空間には 共通点がたくさんあるんだ 存在する理由とか こうぞう あるいはきょうみ よくぼう そういうものがね よく支配のしかたについても話し合うんだよ", + "ひとつ切ないのは 物理的に会うきかいが ほぼ ないってことかな", + "だから話しあうっていっても 物理的に会ってるわけじゃなくて ホログラムに話しかけるカンジなんだ", + "そうなんだよ 切ないでしょ? こんなに共通のわだいがあって 助け合いもするのに 会えないんだからさ", + "面と向かって話さないと伝わらない部分て どうしてもあるじゃない? そういうのがねえ...", + "あ 文句言ってるわけじゃないんよ? 話せるだけでもすごくウレシイし! 話せもしなかったら...それこそサイテーじゃん?", + "いやあ 話せてよかったよ キミのほうもうまくいくといいね", + "あれ まだいるの? もう一回話を聞きたいとか そういう系?") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "クリックソン:来たなイジワル野郎! オメなんか怖くねえぞ!", + "クリックソン:バーカバーカ!オラは逃げたりしねっぞ! さあなぐるなら なぐれー!", + "クリックソン:アホー!とんまー! やーいやーい! こンの恥知らず!") + } +, + thorax:{ + dialogue:new Array( + "ソラックス:オレはソラックス ハチたちの代弁者\n^ハチのうんめい いつも こんめい\n^はたらきバチが逃げ出したよ コロニー\n^そしてほろびたよ 切ないね 心に!", + "ソラックス:新種のウイルスか あるいはのうやくか\n^はたまた タイコバエの幼虫のしわざか!\n^ミツバチみんな うごき オカシイな\n^こんな状況 変えなきゃ オワリだ!", + "ソラックス:オゥケィ オレも原因サッパリ分からねえ\n^じゃあ このMCもたぶんムダじゃねえ?\n^だからってココに 座ってたら 結果はそう ゼツボウです!\n^ならTwitterで!Facebookで!さけぶぜオレらのSOS!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "お買いものは こちらで") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ!", + "ぜったい 逃がさないぞ! 何百年たっても ぜったい!") + } +, + inside:{ + dialogue:new Array( + "何だよう またおどかすつもりかよう?", + "どうせオメーだって ネコがモフモフでかわいいから 味方してるんだろう") + } +, + etc:{ + dialogue:new Array( + "何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ!^ えっ ウワッ!^ それって...?^ ネコがもういっぴき!???^ ウワアアアアアアアアア!!!!", + "オメ... ウチをキレーにしてくれたのか...? うおおん オラ カンドーした! お礼にオラのたからもの あげるよ!", + "ヤングはハコをあけた 中には何か入っている!", + "イッキィ:あらま ミャオか^\n\nミャオ:無事でよかったよう!^\n\nイッキィ:えっと... ヤング 助けてくれてありがとうね", + "イッキィ:正直言えば ハコの中も悪くなかったんだけどね") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "うわ...! 選ばれし者 ヤングさん!? ウワオ!光栄です!ボクはミャオ・シャオ・テュアン・アイ 選ばれし者見習いです!", + "ぜひ少し お供させてください 選ばれし者のカツヤクを生で見たいです!", + "ヤングさん! どうもです 今日もお供していいですか?") + } +, + randoms:{ + dialogue:new Array( + "ミャオ:ドモーっす! そうだヤングさん 何か ぬすんだことって あります?", + "ミャオ:ボク ミトラさん好きっス... ウェアズもハンサムな自転車ですよねぇ", + "ミャオ:ヤングさん そのカッコイイ石なんスカ? タイムスリップとかできるヤツッスか?", + "ミャオ:だんだんイッキィのこと心配になってきたッス... ヤングさん このへんで大きなネコ見ませんでした?イッキィは 東の森をサンポしてくるって言ってたッスが...", + "ミャオ:イッキィから 危ないところには行っちゃダメって言われてるンス... ボクはここで帰るッス!", + "ミャオ:ヤングさんは ダンボールの中に入ったことあります?", + "ミャオ:ヤングさん マタタビってやっぱ やっちゃだめスかね?", + "ミャオ:やっぱ選ばれし者になるには イッパイしゅぎょうしたんスカ...?") + } +, + philosophy:{ + dialogue:new Array( + "イッキィが怖い目にあって 考えたんスけど ボクらは死んだらどこへ行くんスかね? そんで 人生の目標をやりとげることなんて可能なンスかね?", + "それともボクらは 運命をまっとうするまで 生まれ変わり続けるんスかね? あ... それじゃ簡単すぎッスか?", + "そしてその旅路の果てには何があるんでしょう? ただ時間に流されて 消え去るんスかね?", + "フムー...") + } +, + icky:{ + dialogue:new Array( + "やあ ヤング", + "実はボク ホントの名前はイッキィじゃなくて イカボッドなんだ", + "ミャオ・シャオ・テュアン・アイは迷惑かけてない?", + "それじゃあね ヤング") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "やあやあ 見つかっちゃったねえ! まあボクはここに残るよ 外はさむいしね", + "部屋がキタナいのはカンベンしてね このへんはボクが DAME マップエディタで作ったんだ", + "あと このゲームはFlashDevelop IDEとFlixel AS3フレームワークを使って作ったよ!", + "ああ あと音楽は主にREAPER DAWで ときどきAudacityを使って作ったかな", + "ボクはまわりのコンピューターから出る放射線から栄養をとってるんだ^ん? それは生物学的に正しくない?...ってどういうこと?", + "やあ母さん^それから父さんも!", + "このゲーム20分でクリアする方法知りたい?", + "そりゃー教えらんないなー!", + "(丁寧にきかれたら別かもだけど...)") + } +, + marina:{ + dialogue:new Array( + "うおー! やあやあ!", + "このゲームのセリフはだいたいボクがガリガリ書きまくったんだよ^(このセリフはショーンが書いてるけど)", + "このゲームのアートはAdobe Photoshop CS5とGraphics Gale Free Edition,それからWindows 7 Snipping Toolを使って作ったんだ") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "ここはシットリしててお肌にはいいんだけど 髪の毛にはサイテーよね...", + "こうして立ってるのが好きなの 夏になるとさ みんな うだるように暑い外とエアコンの効きすぎた部屋を 行ったり来たり きゅうげきな温度変化は骨に良くないよ", + "氷をかむクセと同じよ わるいクセ うちのママとか 大人になっても氷をかんでたんだけど おかげで今じゃ おくば ヒビだらけなんだよ") + } +, + second:{ + dialogue:new Array( + "クツは脱いだらちゃんと新聞紙つめて かわかしてね ジメジメのままだとバクテリアがはんしょくしちゃうからね", + "なんで食べほうだいのデザートって赤いゼリーばっかりなのかな? お客さんをガンにしたいとしか思えないよ") + } +, + bomb:{ + dialogue:new Array( + "ボクに関わるな", + "マジで... ほっといて") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "同情はいらねえよ ヤング", + "そうかい そうやって幸せな世界の中で生きてりゃいいよ\"選ばれし者\"さんよ...", + "なあ ヤング 友情なんてさ みんなが自分をだましてるから成立するんだぜ オレたちはみんなクソヤローだし 最後にはみんな一人なんだ", + "ハッ! お前がオレをキラいなのは知ってたよ", + "オレは調子よくやってるよ", + "もちろんお前は気にしないよな 誰も気にしやしない") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "街は汚れて人だらけ それは分かってるんだけどさ それでもときどき ここに来て街の明かりを見るのが好きなんだ", + "街には街の美しさがあるだろう? 星のかがやきみたいに永遠じゃないけれど 人間くささっていうのかな それが美しさに深みを持たせてると思うんだ", + "明かり一つひとつのかたわらには だれかがいて 期待や恐れ 秘密なんかをかかえてて だから街の明かりは怖いほどこどくで だけどくっきりと人らしい", + "ここから見えるまどのおくにいる すべての人を 僕は愛してる 一人ひとりが僕の星だからね きみの人生がどれほど ろくでもなくても どこまで落ちていったと思ってても 僕はきみを愛してるんだよ 夜はかがやきにみちてるんだ", + "くだらない おしゃべりを聞かせちゃったね 聞いてくれてありがとう") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "ヘーーーーイ! まあゆっくりして行きなよ!な!?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "わっ! 見つかっちゃったか!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "ゴーレム:来るとちゅう でっかい岩が降ってきたりしなかった? イライラするとどうしても岩投げちゃうんだよねえ 当たったらゴメンね", + "ゴーレム:よく母さんに\"そんな事してたら そのうち山がなくなっちまうよ\"って言われたよ まさかポッキリいっちまうなんてなあ") + } +, + second:{ + dialogue:new Array( + "ゴーレム:岩って長生きだから 何世代にもわたって人間を見ることになるんだ そうして年を重ねて どんな人よりもかしこくなる", + "ゴーレム:...というのがリクツなんだけど ずいぶん前に双眼鏡こわしちゃってさ じつは人の営みもそんなに見てないんだ", + "ゴーレム:じっさい 見ててもタイクツだから 別にいいんだけどね") + } +, + quest_event:{ + dialogue:new Array( + "ゴーレム:ああ うん たしかに人が来たよ 困ってたみたいだった たしか ビーチに向かうって言ってたかな") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "ロブスター? ちがうよ オレはランゴスティーノさ 名前はヒュウズってんだ", + "ヒュウズ:海はいい... 何がいいって 水平線が見えるだろう", + "ヒュウズ:海ってのはいわば 塩味のついた無限の可能性なんだよ", + "ヒュウズ:混んでるビーチなんてのは くもった宝石みたいなもんさ") + } +, + second:{ + dialogue:new Array( + "ヒュウズ:シャコって知ってるかい? シャコには\"じゅようたい\"が16コもあって しがいせんも見えるらしいんだ たくさん色が見えるってどんなだろうね?", + "ヒュウズ:きっと美しいんだろうな でも色がちがうだけで憎しみ合う今の世界を考えれば そうシンプルなハナシでもないのかね") + } +, + quest_event:{ + dialogue:new Array( + "ヒュウズ:だれか 探してるのかい? そういえばオレがここで空を見てたとき あれはちょうど太陽が雲にかくれちまった時だったか 誰かが来て 何か探してるんだがって聞いてきたな 何だったか覚えてないが... そいつは森へ行かねばって言って走り去っちまったよ") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "ジェームズ:木イチゴはいいよね 好物なんだ", + "ジェームズ:木イチゴにオシッコかけないようにね", + "ジェームズ:今年は今のところ18回交尾したかな それから木イチゴは389回食べたかな", + "ジェームズ:ジェームズに木イチゴのおみやげは ない?") + } +, + second:{ + dialogue:new Array( + "ジェームズ:ポエムを かいたよ\n^食べたよ 木イチゴ\n^ハッピーな キモチよ\n^笑顔こぼれて みのり たわわに\n^冬が来るから さらに おかわり", + "ジェームズ:ブルーベリーとラズベリーだと どっちが好き?", + "ジェームズ:ジェームズに木イチゴのおみやげは ない?") + } +, + quest_event:{ + dialogue:new Array( + "ジェームズ:誰か来たよ 木イチゴいらないって言ってた 湖の南まで行って 西に行ったよ") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "オリーヴ:やほ アタシはウサギのオリーヴっていうの", + "オリーヴ:アタシ すっごくたくさん シリアル持ってるんだ シリアルって大好き", + "オリーヴ:アタシのもってるシリアルのハコ すっごく大きいの もうネバーエンディングなのよ!", + "オリーヴ:ネバエンディン シーリアール!", + "オリーヴ:...うーん これじゃ ちっとも悪いことに聞こえないわね") + } +, + bush:{ + dialogue:new Array( + "ランク:ウハハ ヤング おめえバカだなー ホウキじゃ草は刈れねえって!") + } +, + quest_normal:{ + dialogue:new Array( + "ランク:オラはここで 低木を切って くらしてる 低木を刈ってると ゴールドが見つかる時があるんだぜ ウハハハ!", + "ランク:このあたりの低木も さいきんは景気が低迷しててな...", + "ランク:低木を切って ヨメと子供を食わせるのは 楽じゃねえよ ただ暖炉のマキだけは いつでもたっぷりあるがな ウハハハ!") + } +, + quest_event:{ + dialogue:new Array( + "ランク:ん? ああ そういやあ 誰か来たなァ 地下の迷宮に行くとかなんとか きっとそこには 刈り切れないほど草木があるんだろうなあ ウハハ!") + } +, + marvin:{ + dialogue:new Array( + "マーヴィン:おっ やあやあ!", + "マーヴィン:ジャスティンどこだろ...?", + "マーヴィン:このへんにはボトルロケットはないみたいだね...") + } +, + chikapu:{ + dialogue:new Array( + "チカチィー!", + "チカ チカ!", + "チーー^\nカーー^\nプゥウーーー!!!") + } +, + hamster:{ + dialogue:new Array( + "ボブ:ハムスターのボブは 自分のことを三人称で呼ぶんだ", + "しかし句点ってむず,かしいよね", + "ボブ:しずかに! 私は今 ハムスター的オーラをかもしだすべく 集中しているんだ", + "ボブ:...ものごとは実際にやらないと じょうたつしないらしいけれどさ... もしまちがった場合はやっぱり まちがえかたが上手になるのかな?", + "ボブ:本物の男は泣かない... ああ 本物のハーレーに乗り かぜの強いモハーヴェさばくを走り抜ける男が たとえばヘルメットもゴーグルもかけてなかったら 日に焼けた顔についたその目から 涙がひとしずく スッとほほを流れたりするかもしれないけど うん 男は泣かないよね", + "ボブ:このゲームはぼうだいな数のサルが 同じくぼうだいな数のタイプライターを使って作ったものなんだ", + "ボブ:ジェームズが恋しいなあ...") + } +, + electric:{ + dialogue:new Array( + "クリブー:ざんぎゃくこうい手当 ほしいなあ!", + "クリブー:コイン いっこ いれて!", + "クリブー:こだま分隊 に入りたい!", + "クリブー:じゅーびょー!") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "ここで何してるのかって? いい質問ですね! たまたまココに来ちゃって この場所にかくれているんだ ここは安全だし あの変なのに つかまりたくないからね", + "どうも私は ひかく的 うんがいいようだ あのゾンビみたいなのはそこら中ウロウロしてるし... しかし彼らはどうして どうやって死んだのか気になるねえ モンスターにやられた? ラリってトゲにやられた? フムー", + "何にしても 楽しくはなさそうだ 僕はごめんこうむりたいね 物理的にイタいのはいやだもの") + } +, + quest_event:{ + dialogue:new Array( + "ああ そういえば思い出した... たしかにしばらく前 だれか来ましたね 何かをさがしてると言ってたような... キミに似ていた気がするよ ん? いつだったかは思い出せないなあ ここにいると じかんってよくわからなくなるから... あ でも たしか ちかくの町に行くと 言っていたよ") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "やあ", + "何かさがしているの?", + "何見てるの?", + "いや ちがうよ ボクはココの住人じゃない しかし何でかな キミはボクが見えるし話せるのに 他の人はムリなんだ... さつじん者がウロウロしているっていうのに だれも気づかないし... 変だよ...") + } +, + quest_event:{ + dialogue:new Array( + "うん 通りかかった人は いたよ 何かさがしてるって言ってた 何をかは分からなかったけど いそいでた ようすだったなあ 別の空間に行くとか言ってたけど... なんかヘンな言い方だよね") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "ちょっと え? え? キミ誰?", + "ぼくは たんなる旅人だよ ここはAからBへ行く途中にある けっこう人気のあるきゅうけいスポットなんだ", + "Aって何かって? ? ? ぼくの地元だよ . . . 古い友だちに会いに行く途中なんだ . . . 長い旅だけど . . . ぎせいも払うさ . . . キミもだろ? ? ? そのほうが人生しげき的だしね! ! !") + } +, + quest_event:{ + dialogue:new Array( + "ナルホド - - - ホカノ ニンゲン サガシテルノ^チョット メモリ ケンサク シテミマショ - READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \nフムフム. . . \nソノ ニンゲンハ トツゼン ナニカ ヒラメイタ ヨウスデ ナニヤラ テイレノ イキトドイタ タテモノニ ムカウト イッテマシタ\nイワレテミレバ アナタ ソックリ デシタヨ!! ホントニ アナタジャ ナカッタ? ホントニ? アレレ") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "あれ 今...あれ? うん まあ おみごと...!", + "つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\"") + } +, + quest_event:{ + dialogue:new Array( + "つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "やあー! キューブにはもう会った?", + "キューブはこのあたりの空間を支配してる すごくいい支配者なんだ ボクや他の支配者も自分の空間ではけっこう うまくやってるけどね") + } +, + gray2:{ + dialogue:new Array( + "このあたりの空間どう思う? 旅の途中に 立ちよるには けっこういいよね?", + "世界と世界の中間地点!") + } +, + gray3:{ + dialogue:new Array( + "ボクら灰色のピラミッドは ホントはここにはいないんだ 特別なマシンでホログラムを うつしてるってワケ", + "どうしてそんな事するかって? 友だちのキューブと話したり アイツを一人にしたくないからさ") + } +, + graydead:{ + dialogue:new Array( + "zzz... ムニャ...") + } +, + grayspin:{ + dialogue:new Array( + "...ホログラムマシン ちゃんと動作してる?", + "してない?^...^あーもう!!") + } +, + color1:{ + dialogue:new Array( + "キューブにはもう会った? すごくクールなんだよ! 聞いた話じゃあ\n ガケぎりぎりの場所に12びょう近く立っていられるとか!ハンパないよね!\n\"ガケぎり立ちリーグ\"のメンバーならそのスゴさが分かると思うけど! え?\n 分かんない? うーん スゲエってことさ!") + } +, + color2:{ + dialogue:new Array( + "キューブはいろいろ 面白いことしてるんだよ!", + "聞いた? どうやら次の支配者 ボクみたいなんだよね! たぶんあと何分かしたらじゃないかなあ!") + } +, + color3:{ + dialogue:new Array( + "僕はシュガーローフから来たんだ タイペイへ行く途中なんだ ここにいる理由? キューブにあいさつしていこうと思ってね!", + "そんなに落ち込んだカオしないで! ここを訪れる人をおどろかさないように変なすがたしてるだけで キホン的には むがいだからさ") + } +, + colordead:{ + dialogue:new Array( + "(...寝てるのかな...?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "くつうのうちに生まれ くつうのうちに死ぬ そのくり返し 私たちは その苦しみを たち切る 私たちは 二度と外には出ない") + } +, + after_fight:{ + dialogue:new Array( + "これが 私たちの反逆にたいする ばつなのか...") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "どうして見通せし者の いけにえに なるのを拒む!? どうして私たちのきゅうさいを うばう!?") + } +, + after_fight:{ + dialogue:new Array( + "...われらは しかるべき むくいを与えられなかった だが...きみは私たちをふたたび自由をくれた ありがとう ヤング 見通せし者のおみちびきが キミに再びあらんことを") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "しばらくぶりだねえ ヤン 本当に久しぶりだ まだあのファミコンで遊んでるようだねえ?") + } +, + after_fight:{ + dialogue:new Array( + "ええい! いいかげん大人になれ ヤン! どうせさいごには 他人と付き合わなきゃ ならないというのに") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "私どもではさいこうのアメニティをご用意 しています プールはいかがでした?") + } +, + middle_fight:{ + dialogue:new Array( + "私どもの さいしんフィットネスセンターは いかがだったでしょうか?") + } +, + after_fight:{ + dialogue:new Array( + "おくつろぎ いただけましたでしょうか!!!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "やあ 今日もいい日だね", + "背中をかいてくれてありがとう どうも届かなくてね", + "地元のダイナーで出してるタマゴが美味しいって聞いたんだ クーポンも持ってる", + "今日の交通事故見たかい? ヒドい話だよ! メールしてたらしい...当てられたのは小さな男の子だったとか 気の毒に", + "ウチの息子 ジュニア代表チームに入れなかったんだ ガッカリだよ あれだけ 力を入れてきたのに", + "今日は感謝祭だから 色んなものに感謝しないとなあ 明日は早朝セールがあるから たくさん買い物するぞー", + "ああー 仕事に遅刻しちゃう", + "早く家に帰らないと 義理の母さんが来るから そうじしないと!!", + "ガレージセールやってまーす!", + "ようこそ!") + } +, + words_teen:{ + dialogue:new Array( + "最新の映画まだ見てないのに") + } +, + words_kid:{ + dialogue:new Array( + "もう アニメのつづき 見られないよ!") + } +, + family:{ + dialogue:new Array( + "見ず知らずの方 我が家へようこそ! 見たことのあるカオね... ここは平和で しずかな町だから 外から来る人はほとんど いないのよ", + "ねーねー デイブメントは好き? デイブ兄ちゃんが デイブメントのカッコイイ曲をきかせてくれたんだー!") + } +, + older_kid:{ + dialogue:new Array( + "友だちはみんなレイヘッドの\"ノー・サプライズ\"って曲が好きなんだ この町の文句を言ってる歌なんだけど そりゃあ ここは天国じゃないけどさ 感謝くらいすべきだよ! それか自分で変えようとしなきゃ! みんなときたら... あ スミマセン ついアツくなっちゃいました", + "これは自分のブログに書くことにします", + "なんかフラフラしてません?", + "スポーツとかテレビ番組について話すの どうもニガテなんだけど 父さんも母さんも大好きなんだよね...") + } +, + hanged:{ + dialogue:new Array( + "死体の上にメモがある\"これで危険から はなれられる\"") + } +, + festive:{ + dialogue:new Array( + "ねえ 外は何かやってるの? お祭りとかパレードとか?", + "何だか外がおおさわぎだけど 最近マドの外のぞいたことある? 何がどうなってるのか...") + } +, + paranoid:{ + dialogue:new Array( + "ウチにはマドがたくさんあるんだ マドは好きじゃない ずっと誰かにのぞかれてるみたいじゃないか 外で何かが起きてるのは間違いない あまりに長い間しずかすぎるよ こんなにしずかじゃ 気がちって しょうがない", + "さつじん? はあ? 外で? 何を言ってるんだ? からかってるのか? この町でさつじんなんか起きたことがないよ いや...君を見ているとなんだか不安になるよ 早く町を出たほうがいい", + "早く出て行ってくれ") + } +, + dead:{ + dialogue:new Array( + "女性の死体だ 鈍器で殴られたのが死因のようだ", + "男性の死体だ") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "ああ キミか! 見覚えのあるカオだね... いやー ここはまだ通せないよ キミがもっと町の人を ころしまくらないと そういう話だったろう? じゃあ また後でな", + "このパンフレットによれば あと何人か ころせばOKだ さあその調子で行った行った", + "いいぞ あと1人だ さあチャッチャとやって先へ進もう", + "いいぞ! さあ中へどうぞ 中に何があるのかは知らんけれど それじゃあまた明日 同じ時間に あ 明後日だったかな?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "もりの木々がボクを見てる でも ボクは気にしない", + "ジョーカーを止めなければ...", + "ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる", + "キミってオークチョット? ママからオークチョットはあぶないって言われてるんだ", + "ぷるぷる ヤングさん お会いできてこうえいです あ そうだ ゼリーたべます?", + "ピーピーピーピーピーピーピーピーピーピーピーピー ...別にヒワイなことは言ってないです", + "本日限り!なんト!ひとつぶんのお値段デ!ふたつ!ごていきょウ!", + "停電の夜に ロウソクを灯したあの頃を 覚えているかね?", + "カサカサカサッ", + "もやせ もやせ いーろいろ もやーせーええー", + "ウェアズとわたしはいつでも一緒!", + "選ばれし者見習いです!", + "たまにさ 自分が何をしたところで 世界が死にゆくのは止められない なんて感じないかい?", + "森のキノコに ご用心...", + "本当にすみません 本能なんです", + "\"ただの岩じゃん\"ってどういうこと!? 岩だってカードになるよ!いいじゃん!", + "男に魚を一匹やれば一日食いつなぐが,魚の取り方を教えてやれば息子の\n ジミーとの父子のじかんプライスレス", + "歩こう 歩こう こたえは 歩いた先にあるよ", + "なんでコウモリって いつも飛びかかってくるのかな?", + "歯ならびの話はやめろ!!", + "幸せって何だったのかな?", + "私のー 見ている前で 叩かないでくださいー", + "リョーリの鉄人に出るのが夢だったんだよねえ", + "母さんにはよく\"背中曲げてると ずっとその形になっちゃうよ!\"って言われてたなあ", + "お楽しみいただけましたでしょうか", + "...", + "げんみつに言えば ヒキガエルはカエル目にぞくする科のひとつなんだ", + "アハハハハ!!! うん! 知ってた!", + "カードとか集めてるのかい? いいシュミだね インくん", + "たまにはコンピューターやめなさい! 友だちできないよ!ってよく言われたなあ", + "今んとこ支配者やってます", + "アンタ アタシの仕事を面白くしてるとか思ってるでしょ!", + "ななめとか やめろよ", + "オレの花粉だぜ? ヒスタミンなんか効かねえよ", + "お部屋のカギは こちらのカードになっております", + "私に任せておきたまえ", + ".......??", + "ところで私たちに 文字を刻んだのは 誰なのだろう?", + "おくつろぎ いただけましたか?", + "ここまでの道のり見てたよ キミ面白いね", + "迷わせるために 存在してます", + "ボクらにとってはキミもピラミッドなんだけどね!", + "毎夜 毎夜 同じことのくり返し おまけに給料も安いと きたもんだ", + "ほっといて! あと名字はサックスじゃないから!", + "ただのぼう じゃないだけ いいか", + "お金のなる木なんかない? オメ何言ってんだ! ウハハハ!", + "私はまぼろしに すぎない", + "八つ当たりするよ") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "操作設定をするには", + "を,キャンセルするには", + "を押してください", + "上", + "下", + "左", + "右", + "ジャンプ", + "こうげき", + "メニュー", + "しゅうりょうするには", + "を,操作設定をするには", + "を押してください") + } +, + title:{ + dialogue:new Array( + "黒いエリアが見えなくなるまで\n矢印キーをつかって\nウィンドウの大きさを調節してください\nおわったら", + "を押してください", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Press", + "to start", + "バージョン", + "つづきから", + "はじめから", + "よろしいですか?\nいいえ\nはい", + "ホントに?\nやっぱダメ\nホントに", + "取り消せませんからね?!\nやっぱやめる\nわかってるって", + "回死亡しました", + "枚カードを集めました", + "Anodyneは\nコントローラー\nに対応しています\n\n使用しますか?はい いいえ\n\n使用する場合は\n接続してください\n\n矢印キーで移動\nC / スペース / Enterで決定\n\n自動で\"はい\"に設定:", + "注意\n\n入力にラグが\nある場合は\n一度ホームに\n戻ってください\n\nCで次に進みます", + "戻るをもう一度\n押すと終了します\n保存されてないデータは\n失われます") + } +, + elevator:{ + dialogue:new Array( + "何階へ行きますか?", + "1\n", + "2\n", + "3\n", + "4\n", + "キャンセル") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "セーブ中...") + } +, + map:{ + dialogue:new Array( + "マップ", + "げんざいち", + "ドア/でぐち", + "マップなし", + "ネクサスにもどる", + "いりぐちにもどる") + } +, + items:{ + dialogue:new Array( + "アイテム", + "ふつうのホウキ", + "いれかえ", + "えんちょう", + "はばひろ", + "バネが仕込まれたクツ。", + "を押すとジャンプ!", + "じてんしゃ用シューズ", + "カラのダンボールばこ", + "見通せし者の寺院で見つけたカギ", + "地下にある赤い海で見つけたカギ", + "山にあるどうくつで見つけたカギ") + } +, + cards:{ + dialogue:new Array( + "カード", + "xカード") + } +, + save:{ + dialogue:new Array( + "セーブ", + "セーブかんりょう!", + "エラー", + "セーブして\nタイトルへ", + "タイトル画面へ", + "セーブして終了", + "ゲームを終了", + "死亡回数:") + } +, + config:{ + dialogue:new Array( + "設定", + "キー割り当て", + "音の大きさ", + "チェックポイントで\n自動セーブ:", + "オン", + "オフ", + "解像度\n変更", + "UI 設定", + "タッチ+方向キー", + "方向キーのみ", + "タッチのみ", + "いどうそうさのタイプ", + "解像度:", + "ウィンドウ", + "倍率", + "拡大", + "スケーリング:", + "言語:", + "ja", + "en", + "ボタンを\nドラッグ\nしおわったら\nメニューを\n\nタップして\nください\n\n", + "ウィンドウサイズ変更", + "コントローラー設定") + } +, + secrets:{ + dialogue:new Array( + "まいて まいてー!", + "しおづけのおにくのかんづめ すききらいがわかれる", + "グラフィックがおかしいときは パキモンずかんでチェックしてみよう!", + "このハートには特に名前はない", + "きみもデラモンワールドにおいでよ!", + "こねこの像 かわいいけど役には立たない", + "ウワーーー! 見つかった!", + "ヤベー! 見つかった!", + "黒色だ", + "赤色だ", + "緑色だ", + "青色だ", + "白色だ", + ":決定", + ":戻る") + } +, + swap:{ + dialogue:new Array( + "ゴメンなさい!", + "ここでは いれかえ できません", + "ここをスワップするには力が足りない") + } +, + keyblock:{ + dialogue:new Array( + "とびらはカギがかかっている") + } +, + treasure:{ + dialogue:new Array( + "なぞの力により 宝箱はふういんされている", + "ホウキの取っ手に文字がきざまれている\"", + "を押すとホウキを 振るいます\"", + "このカギは一回使うとこわれてしまうようだ", + "ナゾのブーツ。ブランド名は\"", + "ヲ オスト ジャンプ\"", + "ホウキのアタッチメントに何か書いてある\"メニューで\"はばひろ\"をえらぶと ホウキの左右にほこりが広がり こうげきはんいが広くなる\"", + "ホウキのアタッチメントに何か書いてある\"メニューで\"えんちょう\"をえらぶと ホウキの前方にほこりが広がり こうげきはんいが広くなる\"", + "ホウキのアタッチメントに何か書いてある\"やあ ヤング \"いれかえ\"アタッチメントは2つのものを入れ替えられる どこでも使えるわけじゃないけど とりあえずは 役に立つはず\"", + "ハートを見つけた!最大体力がゼロぞうかした!", + "ゴールドマン:ええ? ない?! きっとあの商人がぬすんだんだ!") + } +, + dust:{ + dialogue:new Array( + "ホウキはほこりまみれになった!もう一度ふれば ほこりを置けそうだ") + } +, + checkpoint:{ + dialogue:new Array( + "セーブする?\n はい\n いいえ", + "チェックポイントの上で", + "を押すとセーブされ そこが復活ポイントに設定されます") + } +, + rock:{ + dialogue:new Array( + "岩には何かがなぐり書きされている:") + } +, + door:{ + dialogue:new Array( + "このポータルは作動していないようだ") + } +, + keyblockgate:{ + dialogue:new Array( + "門の一部が石化している これを開くにはカードが4まい必要そうだ...", + "4まいのカードを感知した門が 開きはじめる...", + "門はズッシリとたたずんでいる", + "すべてのカードを感知した門が 開きはじめる...", + "カードを感知した門が 開きはじめる...", + "開いた!", + "トビラはまだ とじている") + } +, + solidsprite:{ + dialogue:new Array( + "東を指すひょうしきだ 文字は消えてしまっている", + "西を指すひょうしきだ 文字は消えてしまっている", + "ひょうしきの文字は消えてしまっている") + } +, + mitra:{ + dialogue:new Array( + "あっ ヤング!", + "え この自転車用シューズ わたしに? スゴい!ありがとうヤング!ウェアズのペダルには固定金具がついてるから ちょうどソレに合うクツを買おうかなって思ってたの じゃあ代わりに このクツあげるよ!バネがついててね すごく高くジャンプできるんだよ", + "を押せばジャンプできるよ!", + "やっほ ヤング!何か気づくコトない...?^... ^...正解は じゃーん! クツが新しくなってる でしたー! 見て見て ウェアズのペダルにカチッとはまるの! それでね 前のクツはいらなくなっちゃったから キミにあげるよ! バネがついててね すごく高くジャンプできるんだよ", + "を押せばジャンプできるよ!", + "オッケ!そんじゃね!", + "ホラホラ はいてみて! ...そんなにクサくないはずだし!", + "ね? よくない?", + "わわっ! それってフィンティのお店にあった自転車シューズじゃない? えっ!? わたしに? ヤング ありがとうー! すごくうれしい! そうだ お礼にわたしのクツあげるよ すごく便利なんだよ えーっとねブランドは...\"", + "ヲ オスト ジャンプ\"だって。イミわかんないよね クツのどこにも", + "ボタンなんか ついてないし!") + } +, + tradenpc:{ + dialogue:new Array( + "フィンティ:あの箱 ホントに助かってるヨ!", + "フィンティ:ヤヤ!この箱は!アリガト アリガト! これで在庫をもちはこべるヨ お礼にこのキモい... じゃないステキなカードをあげマス!", + "ってアレ? ないデス! 一体ドコに... まあいいデス 代わりにキズを手当てしまスヨ", + "ソレでは感謝のシルシに このカッコイイ 自転車用シューズを差し上げマス!", + "イヤア いい日でス 買い物にはもってこいでス! あとは商品を持ち運ぶ箱があったらサイコウなんですガ...", + "ざんねんネ! お客さん お金 たりない! お金をためて また来てクダサイ", + "フィンティ:おお お客さん お目がたかい! いい武器は旅に欠かせナイ! 敵も一発で肉片に!この品がナント! オドロキの! 499ドルよ!", + "フィンティ:このマネーバッグがあれば ザ ランドで集めたお金をもっとたくさん持ち歩けマス! それがたったの869.99ドル!", + "フィンティ:ホッホッホ! とくべつ品が見つかっちゃいマシタ クリップイン式自転車シューズでス もっとはやく カッコよくデスよ 今ならセールで299.99ドル!", + "フィンティ:ホウキにまとわりつく ほこり お手入れタイヘンでショウ? イヤなほこりは最新掃除機でイチモーダジン! 今なら749.99ドル! 月々199.99ドルの4回払いもお選びいただけマス!", + "アリガト!") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nせいさくしゃ:\n\nMelos Han-Tani\n\n\n\nMarina Kittaka\n\n-------------", + "せいさくきかん:\n\n2012 年 3 月\n\nから\n\n2013 年 1 月", + "ゲームデザイン\n------\nふたりとも", + "プログラミング\n-----------\nMelos:Actionscript 3\nと Flixel ライブラリ\nを使用\n\n\n\nアート\n---\nMarina\n", + "おんがく/SFX\n---------\nMelos:REAPER と\n無料のサウンドフォント\nを使用\n\n\n\n会話文\n--------------\nだいたい Marina\n", + "ストーリー\n-----\nふたりとも\n日本語ローカライズ:\nKakehashi Games", + "テスターのみんなに\nありがとう\nちょうタイヘン\nだったよね!\n--------------\n\nMarina,初期のバグ\n対応 すごくタイヘン\nだったよね\n\nEtan,さいしょから\nずっと支えてくれて\nバグもたくさん\n見つけてくれて\nさいごまで手伝って\nくれて ありがとう\n", + "それから妹の Olivia も!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos からの謝辞:\n\n父と母へ - ずっと\n支えてくれてありがとう\n\nS\n\nTIGSource のみんな\n開発者の仲間たちに\nありがとう\n\nそして Marina キミが\nいなければ完成\nしなかったよ", + "Adobe,Adam Saltsman氏\nFlashDevelop の人たち\nREAPER の人たち\nDAME 開発者さん\nDesura,Gamersgate,\nIndieDB,TIGSource\n\n\nそれから友だちみんな\n支えてくれて ホントに\nありがとう\n\nさいごに... 親友の\nTina Chen へ\n\nいつも 支えてくれて\nそして Marina を紹介して\nくれて ありがとう", + "Marina からの謝辞:\n\nColin Meloy へ\n僕の表現力を高めて\nくれて ありがとう\n\nTsugumo へ\n\"え,オマエ ドット絵\nアーティストやるの?\"\n\n家族のみんな\n支えてくれて \nご飯食わせてくれて\nありがとうでした\n\nDaniel へ\n小さな頃から\n僕と一緒に\n\"インディー開発者\"\nでいてくれてありがとう", + "Mo へ\n信じてくれてありがとう\n\nTina へ\nMelos を紹介してくれて\n本当にありがとう\n\nMelos へ\n一緒にゲームを作って\nくれて そして僕を\nしんらい してくれて\nありがとう", + "出演\n----\n\n\nスライム\n\n\nじゃまなアレ\n\n\nポウポウ\n\n\nシールディ\n\n\n見通せし者", + "押してくるアレ\n\n\nオン オフ\n\n\nフォーシューター\n\n\nスラッシャー\n\n\nローグ\n", + "イヌ\n\n\nカエル\n\n\n回るヤツ\n\n\nヒト\n\n\nカベ\n\n", + "ネズミ\n\n\nガス男\n\n\nカサカサ虫\n\n\nダッシュマシン\n\n\nローラー\n\nウォッチャー\n\n\n", + "ダストメイド\n\n\nはきだし草\n\n\n支配人\n\n\n", + "ライオン\n\n\n曲芸の人たち\n\n\n燃える柱\n\n\nしもべ\nアーサー\nハビエラ", + "ついてくる人\n\n\nエドワード\n\n\n釣り師\n\n\nレッドウォーカー\n\nヒュウズ", + "ウサギ\n\n\nイッキィ\n\n\n商人\n\nミャオ・シャオ・テュアン・アイ\n\nランク\n\nゴールドマン", + "ソラックス\n\nジェームズ\n\nキノコ\n\nクリックソン\n\nゴーレム\n\n住民", + "チェイサー\n\n\nホログラムのアレ\n\n\nあの空間の住人\n\nキューブキングたち", + "ヤング\n\n\nミトラ\n\n\n賢者\n\n\nブライア", + "そして...\nあそんでくれた\nあなたに... ありがとう!\n\n\n楽しんでもらえたなら\nウレシイです", + "\n\n\n\n\n\n\n\n", + "スワップを活用して ヤングの世界を\n(ほとんど)制限なくぼうけん\nできるようになった!") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_KR.hx b/AIR/intra/hsrc/data/NPC_Data_KR.hx new file mode 100644 index 0000000..d89b32c --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_KR.hx @@ -0,0 +1,3947 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_KR { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "음악을 좋아한다고? 터미널이랑 대화해봐!", + "고통을 좋아한다고? 남쪽으로 가봐") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "저 곡예사는 균형을 잃고 있어! 안전망은 어디있는 거지?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "우와!") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "사자가 곡예사랑 가까워지고 있어!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "브라이어:피곤하군, 영. 난 이럴 때가 피곤해. 마치 같은 악몽속에 다시, 또 다시 살고 있는 것 같아,", + "브라이어:...", + "브라이어:아무리 해도 바뀌지 않을거야, 영. 계속 그대로일 거라고.") + } +, + after_fight:{ + dialogue:new Array( + "브라이어:작별이네, 영.") + } +, + final:{ + dialogue:new Array( + "브라이어:이봐, 영.", + "브라이어:천천히 다리랑 손을 움직여봐. 이런, 나 없인 움직일 수도 없는 거야?!", + "브라이어:좋아, 가자, 샌드위치인지 뭔지를 먹으로 가자고.", + "현자:자네... 그 사이에 잘 해낸 것 같아 보이는군.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "의문의 목소리:이봐? ...영? ^이봐!!! ... 오, 내 말이 들리나? 좋아, 내 말 잘 듣게. 우선 움직이는 법을 알려주겠네. 방향키를 사용해서 움직일 수 있네.", + "아마 \'", + "\' 버튼을 눌러서 앞에 있는 사물이나 사람들이랑 상호 작용을 할 수 있을 걸세.", + "그리고 \'", + "\' 버튼을 눌러서 메뉴로 갈 수 있네, 메뉴에서 자네에 대한 정보와 환경을 볼 수 있을걸세.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "영... 난 그냥 자넬 위해 모든 것을 되돌리고 싶네.", + "부디... 자네가 나보다 더 나을 거라고 믿네.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "행운을 빌어. 영.", + "현자의 말이 어느 정도는 맞아. 난 모든 것이 깔끔하고 완벽하게 해결됐으면 좋겠어, 그리고 난 나의 이러한 점 때문에 현실을 무시하게 되버리기도 해.", + "난 네가 브라이어를 돕기 위해 무엇을 할지 몰라. 난 어떻게 이 세상이 계속 앞을 향해서 나아 가는지, 아니면 왜 모든 것이 신비스럽고 이상한지 이해할 수 없어. 하지만 난 너의 친구가 되고 싶어, 영.", + "넌 싸우고 있어, 영. 넌 이해하려고 노력하고 있어. 난 네가 해낼 수 있기를 희망해.") + } +, + one:{ + dialogue:new Array( + "현자:영... 이건 내 마지막 경고네... 기다려, 저 자는 누구지?", + "미트라:내 이름은 미트라다. 그리고 이건 내 자전거, 이름은 상품이지!", + "현자:난 네녀석의 자전거 이름을 묻지 않았다. 여기서 뭐 하는 건가? 처음보는 것 같은데.", + "미트라:난 내 친구 영을 도우러 이곳에 왔지..", + "현자:영은 친구를 사귄 적이 없네. 브라이어랑 친구를 한 적은 더더욱 없네. 그리고 만약 자네가 영을 부추긴다면, 자넬 내 세계에서 내쫓겠네!", + "미트라:뭐라고 지껄이는 거야? 상품이랑 나는--", + "현자:너의 좇같은 자전거에 관한 이야기는 그만 짓껄여!!") + } +, + hit:{ + dialogue:new Array( + "현자:...", + "미트라:영! 괜찮아? 고맙다, 상품아... 자, 가서 이 빌어먹을 곳을 끝내버리자고! 넌 할 수 있어!", + "미트라:상품!!!", + "미트라:상품...", + "미트라:이봐, 정체불명의 후드모자 양반, 당신이 누군진 모르겠지만, 왜 우리를 내버려두지 않는거야?", + "현자:자넨 영에게 뭐든지 완벽하고 잘 한다고 거짓말 한 주제에 자신이 영의 친구라고 생각하고 있나보군. 뭐, 그것이 자네가 원하는 거라면, 좋네. 내 눈앞에서 사라지게, 영.", + "현자:네 \"친구\" 하고 떠들어 봐.", + "미트라:우린 그냥 우리가 할 수 있는 최선의 방법을 선택한 거야...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "망토른 두른 남자:좋아, 인사할 시간이군. 음...^내 말은...^ 반갑네, 영! 나는 현자라고 하네. 마을의 장로지. 어둠이 대륙으로 손을 뻗어가고 있어서 자넬 이곳으로 소환했네. 어둠이 전설의 브라이어를 찾고 있네. 브라이어들의 힘을 악에게 쓰기 위해서지. 자넨 반드시 어둠보다 먼저 브라이어들에게로 가야하네.", + "자네의 임무를 시작하기 위해 왼쪽에 있는 차원문으로 들어가게.", + "*한숨* 아직도 꾸물거리는 건가? 차원문으로 들어가서 임무를 시작하게. 브라이어와, 더 나아가 세계는 매우 도움이 필요하네!", + "그냥 빨리 저 망할 문에 가라고!") + } +, + after_ent_str:{ + dialogue:new Array( + "아직도 여기서 뭐하는 건가?") + } +, + after_bed:{ + dialogue:new Array( + "계속 앞으로 나아가게나, 영. 자네가 찾은 열쇠, 그것과 비슷한 게 다른 장소에 있을 수도 있네.", + "이 대륙의 머나먼 곳까지 여행하게, 영. 어둠을 멈추려면 이 방법만이 유일한 길이니까.") + } +, + before_windmill:{ + dialogue:new Array( + "이 세개의 열쇠를 가지고 가게, 영, 그리고 대륙의 깊은 영역으로 가는 길을 열게.") + } +, + after_windmill:{ + dialogue:new Array( + "부탁한 일을 잘 마무리했군, 영, 아직 대륙의 깊은 영역에서 할 일들이 남아 있지만. 자넨 아마 대륙의 깊은 영역을 탐험하면서 큰 깨달음을 얻을 걸세... 어쩌면 자네가 브라이어에게 가치가 있게 될 수도 있지.") + } +, + all_card_first:{ + dialogue:new Array( + "잘했네, 영. 이곳의 모든 카드를 찾아냈군, 그 증거로, 보석이 이 지역의 차원문 위에 나타났네.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "현자:곧 자네의 능력을 시험해 봐야 할 거네. 영. 이 사원에서 살아남기 위해서는 힘과 지성이 모두 필요하네. 혹시 쓸만한 무기를 찾았나?", + "뭐-?? ... 내-내 말은... 그래 물론이지... 빗자루! 어... 전설에 예언된 그대로...", + "*툴툴거리며* ... 이 무능한--자네! 왜 아직도 거기에 서 있는 건가?", + "정신 바짝 차리게, 영") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "현자:아직도 자넨 여전히 약하군. 자네가 어둠한테서 브라이어를 보호하고 싶다면, 자넨 자네의 두려움을 극복해야만 하네. 저기 있는 상자에서 카드를 발견할 수 있을걸세, 카드는 자네의 성장을 상징하지, 그러니 카드를 모으는 것은 임무를 수행하는 데 매우 중요하네.", + "열쇠 역시 자네의 임무에 중요한 역할을 하지. 자넨 반드시 문을 열기 위한 여러 열쇠를 찾아야만 하네. 메뉴화면으로 간 다음 맵을 선택해서 사원의 입구로 돌아가기 위해 텔레포트하게나, 그리고 자네의 영웅적인 임무를 계속하게나.", + "사원의 정원을 통해 남쪽 또는 북쪽으로 여행을 할 수 있네... 열쇠는 어딘가에서 찾을 수 있을걸세.", + "뭔가, 내가 자네를 목마 태워 관문까지 데려다 주길 바라는 건가??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "현자:왜 말을 듣지 않는 건가?! 멍청이처럼 돌진했다간 브라이어와 대륙을 위험에 빠뜨리게 될걸세. 이때까지 했던 일들이 헛수고가 되어버리는...! 미안하네, 영. 하지만 자네가 내 말을 듣지 않는다면, 다른 방법으로 내말을 듣게 하는 수밖에 없네..") + } +, + after_fight:{ + dialogue:new Array( + "현자:영... 이럴려던 게 아니었네... 단지 자네가 브라이어들을 도울 수 있을 정도까지 자넬 성장시키기 위해서였지. 하지만 이건 멍청한 놀이에 불가했어... 난 자네가 브라이어에게 가는 걸 막을 수 없네. 그냥 모두가 지옥에 갈 때 내가 했던 말을 기억하게나.") + } +, + entrance:{ + dialogue:new Array( + "현자:반갑네, 영. 자네가 더욱 강해지고 현명해질 때, 이 길은 자넬 브라이어에게로 인도할 걸세.", + "현자:하지만 영, 자넨 아직 준비되지 않았어. 우선 이 대륙에서 더 많은 시련을 극복해야만 하네.", + "현자:많이 성장했군, 영, 하지만 이 관문을 통과하기 위해서는 반드시 36장의 카드를 모아야만 하네.") + } +, + etc:{ + dialogue:new Array( + "현자:오... 음... 36장의 카드를 가지고 온건가? 하지만 아직 난 자네가 진정한 시련과 맞설 때가 되지 않았다고 생각하네. 사실, 이걸 보게, 우리가 잘못 읽고 있었네, 진짜로 필요한 카드의 양은...\n...\n........\n36장이 아닌 92장이라고 써져있네!", + "현자:영, 자넨 아직 준비되지 않았네! 이 대륙과 브라이어를 생각해보게! 만약 자네가 준비되지 않았다면 이 모든 것들은 물거품이 되어버릴걸세!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "현자:훌륭하군, 영. 자넨 괴물들 뿐만 아니라 자신의 두려움도 이겨냈군!!!", + "현자:물론, 아직 가야할 길이 머네. 대륙을 전부 탐험해봤나?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "현자:훌륭하군, 영. 하지만, 아직도 시련이 보이는군. 긴장을 풀지 말게나.", + "현자:아직도 모든 열쇠를 찾지 못한 건가, 영? 아직 다 모으지 못했다면, 바닷가로 가보게나.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "나는 다른 놈들과는 달라! *멍멍* 당신을 해치지 않을게...", + "난 조용함과 평화로운 걸 좋아한다고.", + "당신의 냄새가 근대같은데.", + "*멍멍*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "해냈군, 영! 마침내 어둠을 막아냈어! 여길 봐! 정말로 아름다워!", + "너무나 아름다워...") + } +, + dump:{ + dialogue:new Array( + "오 다행이야! 무사했구나! 그 눈더미에 덮혀서 꼼짝못하고 있을거라고 생각했어... 만약 그랬다면 존나 우울했겠지! 하!", + "하하하. 하하하하하. 하하하하하하하!") + } +, + drink:{ + dialogue:new Array( + "이봐 거기, 귀여운데? 한잔 할래? 내가 쏠게!", + "한잔 더 할래? 거지같은 새끼야! 하하하!") + } +, + hot:{ + dialogue:new Array( + "씨발, 여기 존나 뜨겁군... 나도 뜨겁고... 땀범벅이 되버렸네...", + "젠장, 운동은 날 불끈불끈하게 하지!!") + } +, + gold:{ + dialogue:new Array( + "이 세계가 금으로 만들어진 곳이라는 걸 알아? 진짜 금 말이야! 둘이서 도망쳐도 이 벽돌로 평생을 놀고먹고 할 수 있는 거지! 와하하하하!", + "나 진지하다고, 왜 아직도 거기 서있어? 어서 벽돌 나르는 것을 도와줘!") + } +, + briar:{ + dialogue:new Array( + "???:영... 드디어 해냈구우나! 가너 나를 구줬해어! 이제 든모 일이 시다 잘 풀거릴야!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "조심해!", + "아 미안해... 너무 흥분했었나 봐. 오, 처음 보는 얼굴인데! 넌 여행자야? ... 뭐? 악한 어둠에게 브라이어를 지키겠다고? ... ^음... 네가 무슨 말을 하는지 잘 모르겠지만, 왠지 멋진데!", + "방금 막 나와서, 상품을 좀 타려고 했는데.... 뭐? 아니, 난 잡상인이 아니라고. 상품은 내 자전거 이름이야!", + "분명히 다시 만나게 될 거야, 혹시 내가 브라이어에 관한 정보를 듣게 되면 너한테 알려줄게.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "꼼작 마! 좋아 상품아, 시작하자!", + "쨔자안!", + "계속 가라고, 영. 우린 네 뒤에 있을게!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "날 기억해? 저번에 자기소개하는 걸 까먹었었지, 내 자전거 상품만 소개 했었어. 그래, 내 이름은 미트라야.", + "날 기억해? 저번에 자기소개하는 걸 까먹었었지, 나는 미트라야, 그리고 이 크고 아름다운 자전거 이름은 상품이고!", + "미트라:그래서, 어떻게 지냈어 영? ...잠시만? 내가 어떻게 네 이름을 알지? 이상하다고 생각하지 않아, 응? 뭐, 사실 네 옷 뒤에 적힌 걸 봤었어.", + "미트라:다음에 또 봐, 영!") + } +, + quest_event:{ + dialogue:new Array( + "미트라:이봐, 기억났어 - 누군가 무엇을 빨리 찾는 중이라고 했어. 그 사람들이 무엇에 대해 말 했는지 확신하진 못 하겠지만, 그사람들이 산으로 간다는 말을 하고 - 서둘러 도망치듯 가던데.") + } +, + game_hints:{ + dialogue:new Array( + "아무것도 아니다.", + "오, 포기하려는 거야? 바닷가는 둘러봤어? 혹시 그곳에 있는 누군가가 널 도와줄 수도 있지 않을까? 어쩌면 열쇠를 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까?", + "오, 포기하려는 거야? 동쪽의 숲은 둘러봤어? 어쩌면 열쇠를 - 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까?", + "열쇠를 찾았네! 아까 남동쪽으로 가는 잠겨진 관문을 본 것 같아. 그 열쇠로 열 수 있지 않을까?", + "이봐, 풍력 터빈이 켜져 있는 걸 봤는데, 바람이 엄청 세던데! 이 대륙에 어떤 영향이 있지 않을까?", + "이봐 영, 오! 카드를 잔뜩 모았네! 근데 이건 뭐에 쓰는 걸까? 팔면 꽤 돈이 될 것 같은데.", + "빗자루에 붙어있는 게 뭐야? 그걸로 네가 세계의 구조를 변경할 수 있어...? 솔직히, 그건 정말 무서워 영. 그 이상한 게 아무 데서나 작동하지 않는다는 게 정말 다행이네, 근데 깊은 영역 말고도 딴데서도 쓸 수 있지 않을까?", + "새 점프신발은 어때? 꽤 멋지지 않아, 응? 난 내 새 자전거용 신발이 마음에 들어. 이 신발을 만든 회사가 내 상품을 만들었고 나랑 상품은 더 찰떡궁합이 될 거야!", + "멋진데, 영, 또 열쇠를 찾아냈구나! 상품도 그 색이 좋다고 하네! 근데 아직 그 열쇠에 맞는 입구는 찾지 못한거야?") + } +, + card_hints:{ + dialogue:new Array( + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원 근처는 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그러고보니, 관측자의 사원의 뒤쪽 출구에 미로가 있다고 들은 적이 있어.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처에서 뭔가를 찾을 수 있을지도 몰라.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원에 있는 적들이 가득 찬 방이 있었는데, 그곳에 있지 않을까?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원은 전부 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처의 아직 가보지 못한 구역들을 뒤져봐.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n너의 이웃이 알고 있을지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n네 아파트에 살고 있는 사람이 뭔가를 숨기는 것 같던데...", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n네 아파트 입구 주변... 거기에 있을 지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n정말 네 아파트에 있는 *모든 곳*을 다 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n여기에서 바로 남쪽으로 가면 섬이 있어! 난 가본적 없지만, 한 번 가서 찾아보는 게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n강가에는 여러 물건들이 있어. 잘 찾아보는게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n누가 풍차 근처에 카드를 두고 간 것 같은데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n숲에 있는 강 주변을 둘러봐...", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산기슭 주변을 둘러보지그래?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산의 정상에 뭔가 있을 것 같지 않아?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n바닷가의 끝에 무언가 있을지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n진홍의 숲을 산책해 보는 건 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n붉은 동굴 중 하나가 잠겨진 문들이 많았었어, 가보는 게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴은 확인해 봤어? 강을 따라가면서 찾아봐!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴로 가서, 강의 원류로 거슬러 올라가 봐!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n흠...어두운 미로는 다 뒤져봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그러고 보니 불이 뿜어져 나오던 길 있었잖아? 그 안쪽이나 주변에 뭔가 있을 것 같지 않아?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n서커스 단원들이 뭔가를 숨기는 것 같아 보이던데, 그 주변은 찾아 봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n한 커플이 떨어진 구멍 기억나? 그 근처는 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n구멍 근처에서 뭔가를 하던 커플이 무언가를 숨기고 있는 것 같던데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n깊은 계곡이라던지 어딘가에 뭔가 있을 것 같지않아? - 특히 산의 동굴에 뭔가 있을 것 같아!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산에 있는 동굴의 꼭대기는 가봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 산에 있던 동굴 안쪽에는 가봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n아마 그곳에 무언가가 있을거야! - 그 이상한 곳에 있던 컬러풀한 큐브라던가,", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 수수께기 공간에 있는 검은 큐브랑을 대화해봤어? 그 큐브라면 뭔가를 알지 않을까?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 호텔의 가장 위층은 고급스러워 보이진 않았어, 하지만 거긴 무언가가 있을거야!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔 3층에 있는 방은 다 찾아봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔 2층에 누군가가 두고간 게 있던데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔의 오너가 널 위해 뭔가를 두고 갔을 거야!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북동쪽에 있는 부서진 다리... 거기가 수상하지 않아?", + "...뭐? *한 장도* 찾지 못했어? 이봐, 영, 그건 미친 짓이라고! 가끔은 살면서 모험가가 될 필요도 있다고, 지나가다가 보이는 상자들을 열어봐, 알겠어?") + } +, + general_banter:{ + dialogue:new Array( + "산에서 뭔가를 찾고 있는 것같아 보이던 남자는 만나봤어?", + "내 자전거의 성이 뭔지 알아? ...왈도! 힘세고 강한 성이지? 상품 왈도! ...농담이야, 자전거는 성을 가질 수 없어.", + "혹시 자전거 자물쇠를 파는 곳을 알아? 상품을 묶는 건 싫지만 요즘 자전거 도난이 늘고 있다고 해서 말이야...", + "그래서 브라이어는 뭐야? 잃어버린 문명속의 고대유물 같은 거야?", + "난 왜 내가 어둠이 다가오고 있다는 사실을 전혀 몰랐는지 궁금해. 아마도 대륙에 사는 대부분의 사람들이 자신들의 일상과의 투쟁에 사로잡혀 있어서가 아닐까?", + "이봐 영, 이 말을 하고 싶었는데... 너 머리스타일 개쩐다.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "동상:마을의 장로라는건 이름뿐이고, 마을따윈 없고 장로도 아니다.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "동상:전설의 빗자루가 있는 위치... 그건 지도에 표시된 청소부의 옷장에 있다.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "동상:카드를 획득하는 것은 임무를 진행하는 데 아주 중요하다. 물론 다른 임무를 할 때도 중요하고, 예를 들자면 돈을 벌거나 술을 사는 것?") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "동상:현자는 훌륭한 자이다. 짜증내지 않고 자기 도취도 하지 않고 제대로 상용구 같은 말을 하니까!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "네가 더 스트레스를 받고 냉담해 졌을 때, 이 길은 널 브라이어들에게로 이끌거야. 위로의 메세지를 파인트가, 이 패배자야!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "에드워드:저번에 화장실에 거울을 설치하려고 사람을 부른 적이 있었어. 거기에 카메라를 숨겨놔서 들킬까봐 무서웠지. 난 모든 나무틀 사이 사이에 마피 오일 비누칠을 해서 틈새를 막고, 전선을 합선시킬까 생각도 했었지. 하지만 결국, 아무것도 발견되지 못했어.", + "에드워드:이 사원은 관측자를 모시는 사원이야. 내가 여기에 왜 온 건지 모르겠지만, 안에 들어가는 게 무서워.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "에드워드:문제라도 있어? 그런 것 같아 보이는데, 네가 가지고 있는 빗자루, 그리고 전 세계에 있는 모든 빗자루는 먼지를 쓸 수 있어. 알겠어?") + } +, + bedroom_done:{ + dialogue:new Array( + "에드워드:관측자를 막아냈다고? 하. 헛소리하지 마, 넌 그냥 틈새에 오일 비누칠을 하고 있을 뿐이잖아.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "오,영. 사랑스럽고 귀여운 영웅놀이를 하고 있네. 하지만 난 네가 \"대륙\"에서 한 모든 짓을 목격했지, 말해볼까? 영,여기있는 모든 사람이 나처럼 정직하지 않다고. 부디 너가 신뢰하고 있는 사람을 조심해!") + } +, + after_fight:{ + dialogue:new Array( + "네가 혼자일 때마다 난 네 옆에 있을 거야, 영. 그리고 반드시 내 충고를 너의 작은 \"모험\"을 하면서 잊지 마.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "바위:이곳에서 시력이 감소된 이유는 악마의 저주 때문입니다.") + } +, + two:{ + dialogue:new Array( + "바위:해야 할 일:연결체에 이동 수단을 만들어야 함. 지금 상태:중단 - 관측자에게 예산을 얻지 못 할 것 같음. 그 수수께끼의 차원문을 사용해야 함.") + } +, + three:{ + dialogue:new Array( + "바위:실수로 이곳에 갇혀버렸습니다. 이 굴에서 항상 무슨 일들이 일어나고 있고, 약간의 변화들을 매일 조금씩 볼 수 있어요.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "댐을 여는 손잡이다.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957년 6월 24일:공중 그네가 부서졌다. 앨리스 러트거스는 두 정강이가 골절되고 땅으로 떨어졌다.") + } +, + two:{ + dialogue:new Array( + "1957년 7월 17일:일곱명의 광대가 폐가 안 좋아져서 은퇴했다. 랜드블랜드 브랜드의 메이크업이 의심되지만, 형식적인 조사조차 수행되지 않았다.") + } +, + three:{ + dialogue:new Array( + "1957년 7월 21일:동물 우리가 망가지는 바람에, 야생 사자에게 얼굴과 옆구리를 심하게 당했다. 다행히 나는 살아남았다, 하지만 언제나 거울에 비친 내 모습을 보면 그때가 생각나서 공포에 몸이 떨린다.") + } +, + four:{ + dialogue:new Array( + "1957년 8월 5일:꿈에서, 난 사나운 얼굴과 반짝이는 눈을 가진 돌을 보았다. 돌은 나에게 우리의 존재에 대한 진리를 말하며 나를 고통에서 해방시켜주며 자유를 선사하였다.") + } +, + five:{ + dialogue:new Array( + "1957년 8월 7일:얼마나 많은 사람들이 관측자를 따르기 전까지 고통받으면서 살아왔을까?") + } +, + six:{ + dialogue:new Array( + "1957년 8월 8일:결정할 때가 왔다. 몇명은 나를 따르겠다고 했다. 오늘로 이 일기도 마지막 장이다. 관측가의 가호가 있기를.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(처음 보는 문자로 뭔가가 써져 있다)") + } +, + two:{ + dialogue:new Array( + "2010년 12월 7일(이름은 흐릿해서 보이지 않는다)이 거지같은 바위를 빼면 이곳엔 아무것도 없다!") + } +, + three:{ + dialogue:new Array( + "위험하다! 이 동굴은 누군가 들어온 흔적도 없다!") + } +, + four:{ + dialogue:new Array( + "이 절벽은 위쪽으로 길게 뻗어있다. 끝이 보이지도 않아서 위가 어떤지도 모르겠군.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "바위:어떻게?") + } +, + two:{ + dialogue:new Array( + "바위:조심하세요! 떨어지면 그 누구의 탓도 아닙니다.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "가까이 가거나 멀리 떨어지면 문이 열렸다 닫혔다 할거야!", + "난 왜 이걸 쓰지 않았는지 까먹었어. 너무 드라마틱해서인가?") + } +, + two:{ + dialogue:new Array( + "이곳은 다양한 타일과 레이어와 충돌을 테스트했어! 일방통행 타일을 양쪽(i.e., walls)에 두거나 했지만 잘 되지 않아서 뺐다... 랄까.", + "이곳에는 왜 우리가 이것들을 쓰지 않은지 이유가 있어. 설계를 단순하게 하는 것. 이것이 게임을 완성하는 데 중요했기 때문이지.") + } +, + three:{ + dialogue:new Array( + "처음에는 적을 쓰러트리고 열쇠를 얻을 수 있게 하려고 했는데, 이 아이디어는 안 쓰기로 했어. 꽤 마음에 들었었는데.", + "다른 아이디어는 도전 관문을 게임에 넣으려고 한 건데, 이건 대미지를 입지 않고 시련을 클리어 할 때에만 열리는 관문이었지.", + "예전에 모든 던전에서 체력을 없애면 어떨까 하고 생각했는데, 너무 어렵다고 해서 못했어!") + } +, + four:{ + dialogue:new Array( + "감옥이야!!!", + "도와줘!!!", + "부탁해!") + } +, + five:{ + dialogue:new Array( + "디버그 세상에 오신 것을 환영합니다! 이곳은 \"대륙\"이 아니라서, 게임의 진행과는(90%)\"무관합니다\". 잘 쉬다가세요.", + "맵의 타일 세트가 완성 될 때까지 이런 임시 타일 맵을 써. 게임의 던전은 사실 전부 그렇게 만들어서, 마무리로 존이 타일 세트를 넣지.") + } +, + six:{ + dialogue:new Array( + "젊은 여자") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-기록보관소-", + "신중하게 진행하자.") + } +, + four:{ + dialogue:new Array( + "서쪽. 땅에 균열이 생김. 실제 상황! 부동산은 떨어지고, 허리케인이 일어나고, 부식되고, 무너지고. 하... 진정하자.") + } +, + three:{ + dialogue:new Array( + "내가 뭘 할 수 있을지 찾아봐야 게엤- 어으,,,,,,그냥 집에서 행복한 시간이나 보내야 겠군.") + } +, + two:{ + dialogue:new Array( + "냉장실\n\n^ -- 관리") + } +, + one:{ + dialogue:new Array( + "계속") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "서쪽:바닷가\n\n동쪽:숲\n\n동남쪽:\n 비내리는 지역\n\n남쪽:\n사원 안\n\n북서쪽:깊은 틈") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "서쪽:대륙의 호수\n남쪽으로 가서 동쪽으로:낭떠러지") + } +, + two:{ + dialogue:new Array( + "휴식 연못. 잠시 쉬어가세요, 잠시 쉴 시간정돈 있잖아요?") + } +, + three:{ + dialogue:new Array( + "난 내가 영원히 이 작은 모퉁이에 남아있을까 봐 두려워.") + } +, + four:{ + dialogue:new Array( + "동쪽:낭떠러지") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "어두운 수호자 타일을 정사각형의 격자무늬 아래에 있는 영혼의 색을 띤 돌로 바꾼다면, 길이 열릴 것이다.") + } +, + two:{ + dialogue:new Array( + "파란 석상이 움직일 때\n새로운 길이 열렸다.\n절벽을 지나 이상한 차원으로 가니\n여행자의 호텔이 있었다.\n\n\n\"관리인은 누구지?\" 그곳에게 물었다,\n\"파수꾼은 누구지?\"\n많은 사람의 영혼이 있음에도 불구하고\n나는 여전히 외로움을 느낀다.") + } +, + three:{ + dialogue:new Array( + "붉게 녹슨 동상이 움직였다.\n그리고 안으로 통하는 길이 열렸다.\n미로 던전을 따라가니\n커다란 서커스 텐트가 보였다.\n\n\n\"파수꾼은 누구지?\" 물었다,\n\"누가 이곳에서 도망치기 위해 목숨을 버렸지?\"\n내가 고통을 두려워하듯이 그들도 두려워했고\n고통보다 죽음을 더 무서워했다.") + } +, + four:{ + dialogue:new Array( + "녹색 금속 동상이 움직였다.\n난 안쪽으로 들어갔다.\n교외 주택 및 보도 형태\n아파트로 가는 길로.\n\n\n\"파수꾼은 누구지?\" 그곳에게 물었다,\n\"누가 별에서의 편안함을 찾는가?\"\n홀로, 나는 감시당하고 있다는 느낌이 들었다.\n그건은 항상 친근했던 별빛과는 다른 것이었다.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "바위:아직 이곳은 주인없는 대륙의 일부분중 하나인 - 영토입니다.") + } +, + two:{ + dialogue:new Array( + "바위:이 -^ 내것과 나^ - 원은^ - 약속이다....나는^ - 동심원의^ - 정말로 모든 것을 끝내려고...^ - 원. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "바위:보고 있어^ -...하지만 나는 항상^ - 너의 행보를^ - 네가 다시 이곳에^ - 나타나 줬으면!") + } +, + four:{ + dialogue:new Array( + "바위:내려다 봐^ - 그리고 난 깨달았지:^ - 이곳에서, 너- ^ 나는 그를 사랑해.^ - 사실... 볼 수 없었어, 정말로.") + } +, + five:{ + dialogue:new Array( + "바위:미안해 -^ 그렇지만 우린 -^ 이곳의 엉망 -^ 계속 연락하기로 -^ 하지만 저 관문은^ - 그리고 내 의견을 제시하고 싶어 - ^ 대륙으로 돌아와 줘.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "가끔 사람들에게 여러번 대화를 하면, 그들은 새로운 주제를 가지고 대화를 할 수도 있습니다.", + "하지만 바위는 아니죠. 바위는 그럴 수 없어요.") + } +, + two:{ + dialogue:new Array( + "돌:정말 아쉬웠어! 만약에...") + } +, + three:{ + dialogue:new Array( + "돌:호기심은 좋다고.") + } +, + four:{ + dialogue:new Array( + "돌:오!...?") + } +, + five:{ + dialogue:new Array( + "컴퓨터 터미널에 이메일이 띄워져 있다. 화면 일부분은 박살 나 있다. 그래서 오로지 검은 얼룩들 사이의 몇 부분들만 볼 수 있다. 이메일 내용:\"안녕, 영! 보이네[...] 50번째 카드 [...] 아마도 넌 [...] 의 가치에 대해서 생각해봐! 네가 준비됐다고 생각해? 일어나...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "바위:넌 친구가 한 명도 없어서 이 바위에 적힌 글자를 읽고 있다는 데 내 손모가지를 걸지.") + } +, + two:{ + dialogue:new Array( + "바위:오버월드 정거장에 온 것을 환영합니다. 대륙에서 즐거운 시간을 보내셨길 바랍니다.") + } +, + three:{ + dialogue:new Array( + "바위:탐험가는 당신입니다!", + "바위:남쪽으로 가지 마십시오. 그 곳은 공사중입니다.") + } +, + four:{ + dialogue:new Array( + "바위:5,3에 보물이 있다!") + } +, + five:{ + dialogue:new Array( + "바위:하하, 잡았다!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "우리는 어머니의 부해한 몸에서 태어났다.") + } +, + two:{ + dialogue:new Array( + "어느 날, 우리의 어머니는 그녀의 어머니를 떠났다. 그리고 독 안개속으로 모험을 떠났다.") + } +, + three:{ + dialogue:new Array( + "우리는 물어볼 수 없었지. 우린 그녀의 고통과 우리의 삶을 만들고 싶지 않아.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "바위:표지판은 오랜 시간동안 죽어있던 나무를 나타낸다.") + } +, + two:{ + dialogue:new Array( + "바위:북쪽:???^ 남쪽:???") + } +, + three:{ + dialogue:new Array( + "바위:이 지역의 일그러진 지형은 선주자의 조상이 이룬 것이라고 알려져있다.") + } +, + four:{ + dialogue:new Array( + "바위:그들은 평화로운 생물이다.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "유성 매직 같은 걸로 써져 있다:\"공간\"과 \"시간\"의 여행자여, 환영합니다. 당신이 발을 디딘 곳은 \"영\"의 차원 균열과 인접합니다. 당신은 \"바다\"를 하나둘 넘어왔습니다, 그래서 말하는데. 부디 평소랑 다른 \"차이\"를 두려워하지 마세요, 당신은 곧 다시 당신의 평범한 모험으로 돌아가겠죠. 이 장소는 \"불길\"하고 \"위험\"해 보일 수도 있지만 부디 \"두려워\"하지 마세요, 이곳의 주민들은 모두 매우 \"친절\"합니다.\n -- MGMT", + "(메시지 아래에 문자가 새겨져있다)숲에서 길을 잃은 ____(읽을 수 없다), 이곳에 잠들다.", + "(그 밑에 아직도 메시지가있다)(남쪽으로 너무 멀리 가지 마라.)") + } +, + two:{ + dialogue:new Array( + "무지개에 찔려죽은 ____(읽을 수 없군. 누가 쓴거야?), 이곳에 잠들다.") + } +, + three:{ + dialogue:new Array( + "절벽과 친해지지 못했던 버드, 이곳에 잠들다.") + } +, + four:{ + dialogue:new Array( + "한 번도 쓰인적이 없는 가방이 있다.", + "안쓰럽네!") + } +, + five:{ + dialogue:new Array( + "차고에 있는 컴퓨터를 수리하려고 자리잡고 앉아서 작업했지만 3년이 지나도 수리해지 못하고 어디선가 떨어져 죽은 세비치 이곳에 잠들다.") + } +, + six:{ + dialogue:new Array( + "내세울게 하나도 없던 데이브, 이곳에 잠들다.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---영 타운---^\n영 타운에 오신 것을 환영합니다. 몇몇 시민들은 다른 사람과 잘 어울리지 못하니... 주의해주세요. 영 타운은 시장 잉 씨의 택지 개발 정책의 일환으로 90년대에 개발 된 마을입니다, 마을의 이름은 시장의 이름인 잉(그늘)씨가 자신의 이름을 거절하고 스스로 선택한 영(양지)라고 정한 것에 유래됐습니다. 편히 지내시기 바랍니다.") + } +, + two:{ + dialogue:new Array( + "서쪽에는 전설의 관측자 사원이 있습니다. 동쪽에는 우리의 훌륭하신 시장님 잉씨의 아파트 입니다. 지금 아파트는 개방되지 않고 있습니다. - 방문시 주의해 주세요.") + } +, + three:{ + dialogue:new Array( + "5번째 방문 때, 잉시장은 주차장이 적음에 강한 불만을 느꼈습니다. 이 주차장은 잉시장이 느낀 주차장이 적음을 반영한 것입니다. 이후 잉시장은 방문할 때마다 이 주차장을 이용합니다.") + } +, + four:{ + dialogue:new Array( + "예전에 긴문장을 썼던게 기억나네. 하! 집어쳐!") + } +, + five:{ + dialogue:new Array( + "위험한 상황") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "관측자는 모든것을 알고있고, 깨달음으로 이끈다. 깨달음으로 가는 길을 비추는 빛은 없다.") + } +, + two:{ + dialogue:new Array( + "관측자의 길에서 이탈하면 안 된다. 비록 미로의 구석에 보물상자가 있더라도.") + } +, + three:{ + dialogue:new Array( + "홀로 이동했다.") + } +, + four:{ + dialogue:new Array( + "체이서를 화나게 하지 마세요.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "관광 명소:\"쌍둥이 탑\". 최근에 건설된 이 탑은, 멀리 있는 산까지 볼 수 있습니다. 첫 번째 탑은 망가진 이후로 다른 용도로 사용되고 있습니다. 두 번째 탑은 여전히 동쪽에 위치하며, 하늘까지 뻗어 있습니다. 안전상의 문제로 이 탑으로 가는 길은 추후 공지가 있을 때까지 봉쇄되어 있습니다.") + } +, + two:{ + dialogue:new Array( + "안전에 관한 안내문:^\n이 탑은 손상되지 않았지만 꼭대기에 차원의 균열이 생기고 있습니다. 주의해주세요.^\n -- MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "맨날 움직일 것 같게 생기지는 않은 동상이군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "이 동상은 움직이지 않고 계속 여기에 서 있을 것 같군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "움직일 것같이 생긴 동상은 아니군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "불은 아름다워, 그렇지 않아? 하지만 마을의 불빛들이 별의 빛을 가려 버리는 건 수치스러운 일이야.") + } +, + after_fight:{ + dialogue:new Array( + "그렇구나, 별은 불덩어리가 아니지. ^넌 자세히 알고 있구나...") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "잘 지냈나? 난 이 구역의 통치자이고 이 공간의 성립되는 모든 것 그 자체이네.", + "내가 어떻게 이곳의 통치자가 됐는지 이유를 알고 싶나? 알려주지, 하지만 시간이 필요해. 아마, 긴 시간 말이야. 역겨울 정도로 오랜 시간이.", + "그래, 꽤 오랫동안. 아니, 정말로, 경고하는데! 아, 내가 좀 횡설수설한 경향이 있어. 어쩌면 그냥 바로 저기에 있는 상자 안을 보는 게 더 나을지도 모르겠네. 아니면 멀리 있는 호텔로 향하거나. 그게 거기 있는지는 모르지만, 거기는 상대적으로 저렴한 가격이라고 들었어. 돈 따위 의미 없지만.", + "왜 내가 통치자가 됐나고?^...왜냐고 물으니 확신하기 어렵군, 하지만 주변에 있던 내 친구들이 날 보고 이 적합한 위치에 넣어준거지, 이 공간의 상태에 즉각적인 이유지. 어쩌면 경우일지도 몰라. 왜냐하면 큐브는 평면에 서있기 최적의 형태를 가지고 있지. 왜 누군가가 여기에 앉고 싶어한다고 묻는다면 이렇게 대답하지. - 그건 나랑 상관없는 일이네!", + "그리고 또 - 내 친구들도 - 역시 장점은 있어. 그 친구도 언젠가 통치자가 될 가능성이 있고 지금은 할 수 없어서 내가 하는 것이지. 가끔은, 통치자를 누가 할 것인가 정하기도 해. 하지만 대부분, 우린 공간의 영역을 재해석해야 하네! 다시 말하자면, 신사 또는 숙녀 피라미드는 여기에 온다는 거지. 왜냐하면 우린 왕좌 모양을 가장 잘 맞는 방법으로 만들기로 결심했기 때문이지. 이 세상을 다시 상상함으로 인해서 말이야. 말하자면, 바보같은 소리라고? 그럴지도 모르지. 하지만 그렇지만 이건 방법이야. 그 상황은 매우 빠르게 초, 분, 시로 발생하지. - 필요치 않은 긴 통치. 왕좌 모양.", + "하지만, 내가 통치자가 됐을 때, 약간 이상한 느낌이 들었지...뭔가 고립된 느낌, 다른 사람을 피하고 싶었지...", + "...하지만 고립은 옳지 않아, 그래도 이건 느낌의 일부분을 다루고 있지만. 나는 고독하지 않네. 그리고 다른 사람을 싫어하지도 않지. 우린 모든 친구를 고려해야 하고, 하지만 말일세, 몇 단어를 제외하고 대부분의 사람들이 여기에 오지 않는다네. 그래서 나는 그런 것들에 대해 생각하거나 미쳐가고 있을 걸세! 어쩌면 이것도 고립의 한 부분일지도 모르지.", + "그 이외에 *왜*냐는 어리석은 질문에 대한 답인데, 우린 여기에 이 공간을 점령한채로 있네. 아, 왜 우리가 친구인지 계속 신경쓰이는 거야.", + "나는 우린 항상 내가 통치자에 최고로 적합하다는 해석 아래에 있다고 생각하고 싶네. 그들은 나에게 존재 할 수 있는 곳에서 이 위치를 유지하기 위해 편안함을 제공했지. 다음 차례의 해석을 할때 까지 말일세, 자네도 알다시피, 격려 같은거 말일세, 물리적 존재는 그 위안이 된다네.", + "그것들이 날 만족시키기에 충분하다고 가정한다면, 그래도 멋진 것, 아니 멋진 것들일거야. 내가 왜 통치자가 됐는지 이해되는군. 나는 격려에 대해 불평하고 있지 않네! 하지만 어쩌면 그 다음, 우린 여러명의 통치자가 있을 수...내가 무슨 생각을! 그러니까 내가 통치자가 아닐 때, 같은 방식으로 행동해야 하네, 나는 가끔 그들...그럴 수 있을지 누가 알겠어?", + "난 너무 멀리 가버렸네. 자네가 만약 다른 방향으로 간다면, 거긴 여기랑 다르지만 비슷한 공간의 영역이 있겠지. 그래도 냄새는 약간 다를거라고 생각한다네.", + "만나서 반가웠네.", + "오, 내 이야기를 다시 한 번 듣고 싶나?", + "좋아, 제대로 앉아.") + } +, + gray:{ + dialogue:new Array( + "오, 안녕하신가. 난 이 공간의 통치자이네.", + "뭐? 내가 왜 이곳에 있는지 알고 싶다고? 진심인가? 설명하려면 매우 많은 단어들이 필요할 거야!", + "흠, 내가 이 공간의 통치자긴 하지만 다른 이들에게 그렇게 간섭을 한 적은 없네만.", + "내 친구들 - 그러니까 다 각자 구역을 갖고 있는 친구들도 그렇게 참견은 하지 않아. 그렇게 보자면 우리를 각자 하나의 객체라고 봐도 무방하네만, 우리가 서로 대화 하는 방식이나, 그 외 여러가지를 보자면 하나가 아니기도 하지. 이곳은 단지 내가 있는 장소들 중 하나에 불과하다네.", + "내 친구들과 나 - 그러니까 우리 공간들은 왜 존재하고 어떻게 조직되어있는가에 대한 지대한 공통점이 있다네. 유사한 취향과 욕구, 그리고 취미들같은 것 말일세. 우리는 우리의 지배방식과 같은 여타의 안건에 대해 심도있는 토의를 하는것을 즐겨하지.", + "하지만 슬픈 사실은 우리가 물리적 형태를 취한 상태로는 거의 만나지 못한다는 점일세.", + "그렇지. 자네는 그들의 물리적 신체와 대화 한 것이 아닐세. 그건 그저 어떤 홀로그래픽으로 구현된 대체제였을 뿐이지.", + "이것이 어떤 하나의 불행이라는 것은 나도 잘 알고 있네. 우리가 이렇게 많은 공통점을 가지고 많은것을 공유함에도 불구하고 각자를 하나의 친구로써만 도울 수 있다는 점은 그야말로 큰 불행 아닌가.", + "물리적인 일 대 일 대화를 못하는 것에서 촉발되는 소소한 단점들이지.", + "하지만 나는 불만없네. 아무도 없는 것 보다는 낫지 않은가! 만약 그랬다면 어땠을까 하는 상상은 할 수 조차 없다네. 아마도 끔찍하겠지.", + "대화 즐거웠네. 자네가 하는 일, 모두 잘 풀리길 바라겠네.", + "계속 여기 있겠나? 했던 말을 몇 번이고 계속해줄 수 있네, 만약 자네가 마음에 든다면 말이지.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "크릭슨:야! 크기만 한 깡패 녀석! 너따위 두렵지 않아!", + "크릭슨:야! 크기만 한 바보 녀석! 난 도망치지 않아! 네가 날 한 대 치더라도 절대 도망가지 않아!", + "크릭슨:야! 크기만 한 멍청한 녀석! 그래 이 멍청한 녀석아! 부끄러운줄 알라고!") + } +, + thorax:{ + dialogue:new Array( + "토렉스:나는 토렉스야, 꿀벌의 대변자야.\n^꿀벌들의 운명은 불확실하지, 이건 좋은 일이 아니라고!\n^어떤 곳에 있는 식민지의 노동자들은 투쟁을 했데!\n^결국 그 식민지는 멸망했다고 하고, 투쟁후의 그곳의 모습은 더 좋은 관경을 찾기 힘들정도로 멋질거야!", + "토렉스:아마 이건 바이러스이거나 새로운 농약이야,\n^아니면 파리 애벌래의 짓인가!\n^모든 것들이 꿀벌을 이상하게 만들고 있어.\n^그게 뭐든간에, 반드시 바꿔야만 해!", + "토렉스:좋아, 그래서 난 뭐가 더 좋은지 알고 싶지 않아\n^내가 노력했던 게 헛수고로 돌아가는 게 싫거든.\n^하지만 어떻게 앉아서 가만히 보고만 있겠어?\n^그러니 난 페이스북이랑 트위터에 포스트하고 외칠거야!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "쇼핑은 이곳에서~") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "여기서 뭐 하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고!", + "절대 놓치지 않을거야! 만 년이 지나더라도!") + } +, + inside:{ + dialogue:new Array( + "오, 날 또 공포에 떨게 만드려고 오셨나?", + "넌 그 고양이들 편이지. 왜냐하면 고양이들은 귀엽고 털로 덮혔으니까.") + } +, + etc:{ + dialogue:new Array( + "여기서 뭐하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고!^ 어라아!^ 이건--?^ 또 다른 고양이???^ 이러어어언!!!", + "너... 내 집을 청소했군... 감동했다! 여기, 내가 가지고 있던 것 중 가장 아름다운 녀석을 주지!", + "영은 상자를 열어보았다. 무언가 안에 들어 있다!", + "이키:오. 안녕 미아오.^\n\n미아오:너가 안전한 걸 보니 너무 기뻐!^\n\n이키:음... 도와줘서 고마워, 영.", + "이키:솔직히 말해서, 난 상자위에 앉아 있는 걸 좋아해.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "오!! 당신이 선택받은 사람이라고 하던 영이군요!!! 이런 맙소사, 만나서 영광입니다! 제 이름은 미아오 샤오 투안 어, 선택된 훈련자죠!", + "제가 조금만 당신은 따라다니면서 선택받은 사람의 기술을 볼 수 있을까요?", + "다시 만나서 반가워요, 영! 오늘 당신을 따라다녀도 될까요?") + } +, + randoms:{ + dialogue:new Array( + "미아오:저기요, 영... 당신은 태어나서 한 번도 도둑질을 해본 적이 없나요?", + "미아오:난 미트라가 마음에 드는데요... 잘생긴 자전거 상품 말고요.", + "미아오:저 돌은 뭐죠, 영? 이 돌이 시간을 거슬러 갈 수 있게 해주는 건가요?!", + "미아오:좀 이키에 대한 걱정이 드네요... 영, 최근에 커다란 고양이를 본 적이 있어요? 저번에 이키가 저한테 동쪽에 있는 작은 숲으로 산책하러 간다고 말했거든요.", + "미아오:이키가 위험한 데는 가지 말라고 했어요. 나중에 봐요, 영.", + "미아오:지금 쇼핑백 더미위에 앉아있는 거에요?", + "미아오:이봐요 영, 이게 고양이가 좋아할 캣닙이 맞을까요?", + "미아오:선택받은 사람이 되기 위해서 많은 일을 해야 할거야, 어, 영?") + } +, + philosophy:{ + dialogue:new Array( + "이키가 나를 생각했다는 건 매우 무서운 상황이에요... 우리가 죽은 후 무슨 일이 일어날 거라고 생각해요? 어떻게 단 한 번뿐인 삶에서 모든 목적을 달성할 수 있을까요?", + "어쩌면 우린 운명을 다할 때까지 계속 다시 태어나지 않을까요? 그러면 너무 쉬운걸까요?", + "그리고 그 여정의 끝에는 무엇이 있는 걸까요? 단지 시간에 휩쓸려서 사라지는 것 뿐일까요?", + "흠...") + } +, + icky:{ + dialogue:new Array( + "오, 안녕, 영.", + "사실 내 이름은 이키가 아니야. 그건 남자 이름이지.", + "미아오 샤오 투안 어가 문제를 일으키진 않아?", + "다음에 봐, 영.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "이런, 들켜버렸네, 안녕! 난 여기 남아있을래. 밖은 너무 추워.", + "끔찍한 방들은 마음껏 나를 욕해! 그 방들은 내가 DAME map editor로 만든 거야.", + "난 이 게임을 FlashDevelop IDE 와 Flixel AS3 framework로 만들었어!", + "오 예, 그리고 음악은 REAPER DAW로 만들었어. 가끔은 Audacity도 쓰면서 말이야.", + "사실 모든 컴퓨터들이 내 몸에 방사능을 뿌려서 영향을... ^생물학적으로 정확하지 않다는 건 무슨 소리야?", + "안녕 엄마! ^그리고 아빠도!", + "이 게임을 20분안에 클리어 하는 법을 알아?", + "하! 안 알려 줄건데-에!", + "(...정중하게 물어보면 알려줄지도...)") + } +, + marina:{ + dialogue:new Array( + "우후, 이봐!", + "내가 이 게임의 대사를 대부분 썼어!^(...이 대사는 숀이 쓰고 있지만.)", + "난 Adobe Photoshop CS5, Graphics Gale Free Edition, 그리고 Windows 7 캡쳐 도구를 이용해서 그림을 그려!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "여긴 수분이 많아서 피부에 좋지만, 머리카락에 안 좋네.", + "난 여기 서있는 걸 좋아해. 요즘, 사람들은 여름에 밖에 나갔다가 에어컨 바람을 쬐러 안으로 왔다갔다 한다고. 급격한 온도 변화는 뼈에 좋지 않아.", + "얼음 조각을 씹는 나쁜 버릇처럼. 우리 엄마는 20대 후반에 얼음 조각을 씹어먹었지. 지금 우리 엄마는 어금니에 금이 가있어.") + } +, + second:{ + dialogue:new Array( + "신발을 벋으면 제대로 신문지에 넣어 말려줘. 눅눅한 상태로 두면 박태리아가 번식해 버린다고.", + "왜 뷔페에서 마음대로 가져갈 수 있는건 빨간 젤리 큐브지? 이건 손님을 암에 걸리게 하고 싶다는 것 같아.") + } +, + bomb:{ + dialogue:new Array( + "내게서 떨어져.", + "심각하다고... 지금은 날 내버려둬.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "네 동정따윈 필요없어, 영.", + "좋아, \"관측자\"의 행복한 세상속에서 살아가라고...", + "이봐, 영. 우정 따윈 서로 속이면서 성립되는 거라고. 우린 전부 병신들이고,\n마지막 순간에는 항상 홀로있지.", + "영, 네가 날 싫어하고 있다는 걸 모를 것 같아?", + "난 잘하고 있다고.", + "물론 넌 신경쓰고 있지 않겠지만, 아무도 신경 쓰지 않지.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "거리는 지저분하고 주변은 사람들로 가득하지. 알고 있는데도 가끔은 이곳의 불빛을 보는 걸 좋아해.", + "도시는 도시만의 아름다움이 있는 걸까? 별의 반짝임처럼 영원하진 않지만 인간성이라는 게 아름다움에 깊이를 더하는 것 같아.", + "각각의 불빛들 옆에 기대와 우려, 비밀 같은 걸 안고 있는 사람들이 있어. 그래서 도시의 불빛은 무서운 정도로 고독하지만 사람 다운게 있어.", + "난 창문 뒤에 있는 모든 사람을 사랑하는 것 같아. 모두! 내 별이 돼줘서 사랑해요! 인생이 좇같아지고 바닥까지 떨어졌다고 해도 난 너를 사랑할 거야. 오늘밤은 빛으로 가득 찼어...", + "미안해. 좀 떠들었지? 들어줘서 고마워.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "이봐아아아, 천천히 가라고! 응?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "아! 들켜버렸네!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "골렘:오면서 큰 바위가 떨어지지 않았어? 내가 가끔 화나면 바위를 집어던지거든. 혹시 맞았으면 미안해.", + "골렘:엄만 항상 내게 \"그렇게 계속 바위를 던진다면 널 산에서 던져버리겠어!\"라고 했지. 정말로 그랬을까?") + } +, + second:{ + dialogue:new Array( + "골렘:네가 바위가 된다면, 바위는 수명이 길어서 정말로 오랫동안 수많은 세대의 사람들이 오고 가는 걸 볼 수 있어. 그렇게 나이를 계속 먹다 보면 그 누구보다 현명해지지.", + "골렘:...이라고 말하긴 하지만, 사실 오래전에 쌍안경 부숴버려서 무슨 일이 일어나고 있는지 잘 몰라.", + "골렘:사실, 많은 사람을 보는 것은 지루해.") + } +, + quest_event:{ + dialogue:new Array( + "골렘:오, 맞아, 저번에 뭔가를 잃어버린 사람을 만난 적이 있어... 바닷가로 간다고 했던 것 같은데.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "나는 랍스터가 아니야. 난 랜고스티노. 이름은 휴즈라고.", + "휴즈:바다의 가장 중요한 것이 뭔지 알아? 수평선을 볼 수 있다는 거지.", + "휴즈:바다는 짠맛이 끝없이 느껴지는 곳이야.", + "휴즈:붐비는 바닷가는 흐린 보석과도 같은 거야.") + } +, + second:{ + dialogue:new Array( + "휴즈:갯가재 소리를 들어본 적 있어? 갯가재는 자외선을 감지할 수 있도록 16개의 광수용체가 있다고 해. 무수히 많은 색이 떠오르지 않아?", + "휴즈:분명 매우 아름답겠지. 하지만, 우린 단순히 서로가 가진 색으로 서로 놀리면서 차별하고 있어.") + } +, + quest_event:{ + dialogue:new Array( + "휴즈:누굴 찾고 있다고? 응? 예전에 약간의 구름이 태양을 지날 때 이곳에 앉아 있었던 기억이 나. 태양이 가려진 동안, 누군가 내게 걸어왔고 뭔가가 어디에 있느냐고 물어봤었어. 그게 뭔진 기억나지 않네. 하지만 그 사람이 숲으로 도망치고 있었던 건 확실히 기억나.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "제임스:나무열매들은 좋은 과일이지. 난 나무열매들을 좋아해.", + "제임스:조심해, 소중한 열매들 위에 똥 누지 말라고.", + "제임스:올해엔 짝짓기를 18번 했어. 또, 389개의 나무열매들을 먹었고.", + "제임스:혹시 이 제임스를 위한 열매가 있니?") + } +, + second:{ + dialogue:new Array( + "제임스:내가 시를 한편 써봤어. 들어봐:\n^나는 열매가 좋아\n^열매는 나에게 열정을 주지\n^:얼마나 열렬히 좋아하냐고?\n^ 하루라도 안 먹으면 열받을 만큼!", + "제임스:넌 블루베리를 좋아하니? 아니면 산딸기를 좋아해?", + "제임스:혹시 이 제임스를 위한 딸기가 있니?") + } +, + quest_event:{ + dialogue:new Array( + "제임스:누군가 왔다 갔는데 딸기를 원하지 않었어. 서쪽 호수의 남동쪽으로 가던데.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "올리브:안녕, 난 토끼 올리브야.", + "올리브:난 시리얼이 정말 많이 있어! 나는 시리얼을 사랑해!", + "올리브:시리얼 박스가 너무 커. 시리얼이 절대 떨어지지 않을거야!", + "올리브:끝없는 시리얼이지!", + "올리브:흐으으음...그렇게 나쁜 일이 아니라고.") + } +, + bush:{ + dialogue:new Array( + "랭크:에헤헤, 멍청이 영! 빗자루는 관목을 자를 수 없다고!") + } +, + quest_normal:{ + dialogue:new Array( + "랭크:난 살아가기 위해서 관목을 잘라. 관목을 자르면 가끔 금을 발견할 수 있을거야! 으하하!", + "랭크:부시 이후로 경제는 정말 어려움을 겪고 있어...", + "랭크:관목을 자른다고 해서 항상 아내와 아이들을 먹여 살릴 수 있는 건--아니야. 하지만 난로는 항상 따뜻하지! 으하하!") + } +, + quest_event:{ + dialogue:new Array( + "랭크:어? 맞아! 어떤 사람이 이곳에 들렀다가 갔었어. 아마 지하 미로에 간다고 말했던 것 같은데...거긴 계속 베어도 끝없을 만큼의 관목이 있는 걸까? 으하하!") + } +, + marvin:{ + dialogue:new Array( + "마빈:오, 반가워!", + "마빈:저스틴은 어디갔을까?", + "마빈:주위에 로켓 병은 없는 것 같아...") + } +, + chikapu:{ + dialogue:new Array( + "치카 치!", + "치카 치카!", + "치이이이^\n카아아아^\n푸우우우우우우!!!!") + } +, + hamster:{ + dialogue:new Array( + "밥:햄스터 밥은 자신을 3인칭으로 지칭하는 것을 좋아한다.", + "밥:", + "밥:조용해! 난 햄스터틱한 분위기에 스며드느라 바쁘다고.", + "밥:... 너가 뭔가를 해서 더 나아진다고 가정해보자고... 하지만... 만약 잘못된 일이라도 더 나아질 수 있다면 계속 할 거야?", + "밥:진정한 남자는 절대 울지 않아... 뭐, 할리를 타고 모래사막을 가로지르는 사람이 헬멧도 고글도 없다면 햇볕에 탄 얼굴의 눈에서 한 방울의 눈물이 잠깐 뺨을 타고 흘러내릴 순 있지만. 그래도 남자는 울지 않아.", + "밥:이 게임은 수많은 원숭이가 수많은 타자기를 이용해서 만들었어.", + "밥:제임스가 그리워...") + } +, + electric:{ + dialogue:new Array( + "쿠리부:카레는 노랗고 매워!", + "쿠리부:동전을 넣어!", + "쿠리부:넌 2에서 경험을 얻었어!", + "쿠리부:내 전화번호를 알려주지! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "내가 여기서 뭐하고 있었냐고? 좋은 질문이야! 난 우연히 이곳에 오게 됐고, 숨어있었지. 여기는 안전하고 그 이상한 거에 잡히고 싶지 않거든.", + "난 비교적 다행인 것 같네. 이곳은 사방에 죽은 사람들 천지야 - 그러고 보니 이 사람들은 어떻게 죽은 걸까? 조금 흥미로운데, 왜 이 일이 일어났는가 생각해보자고. 괴물의 공격을 받은 걸까? 함정에 걸려 못으로 가득한 곳에 떨어진 건가?", + "슬픈 일이야. 나한테 이런 일이 일어나지 않았으면 좋겠어. 육체적인 고통은 정말로 끔직할거야.") + } +, + quest_event:{ + dialogue:new Array( + "오...지금은 그것에 대해서 생각하자고, 한 사람이 얼마 전에 이곳에 왔다 갔지. 그들이 뭔가를 찾고 있다고 했는데...그리고 조금 너랑 닮을 것 같네! 언제인진 기억나지 않아, 미안. 시간도 잘 기억나지 않네. 하지만 주변에 있는 마을이랑 떨어진 곳에 간다고 했던 것 같아.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "안녕.", + "무언가 찾고 있는 건가?", + "무엇을 보고 있는거지?", + "아니, 난 이 도시의 시민이 아니야. 그러니 마을에서 이상한 걸 보면 나랑 이야기 할 수 있을거야, 하지만 난 마을 사람들과는 대화할 수 없어. 하지만 주변에는 살인자가 돌아다니고, 마을 사람들은 아무도 그 사실을 몰라. 뭔가 이상하지 않아?") + } +, + quest_event:{ + dialogue:new Array( + "응. 지나간 사람이 있었어. 뭔가를 찾고 있다고 말한 것 같은데, 그 '뭔가'가 어디에 있는 지는 모르겠네. 그 사람은 서둘러 가더라. 다른 공간에 간다는 말은 한 것 같은데, 무슨 말인지 몰라도 뭔가 멋진데.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "너어 너어 너어 - - - 너는 누구야 ? ? ?", + "나는 평범한 나그네 . . . 이곳은 A에서 B로 가는 꽤 인기있는 휴식 장소야.", + "'A'가 뭐냐고 ? ? ? 내 고향이야 . . . 오랜 친구를 만나러 가는 길이야 . . . 오랜 여행이였지만 . . . 그건 약간의 희생이지 . . . 너도 그렇게 생각하지 ? ? ? 인생을 더 자극적이게 살아보자고 ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "그런건가 - - - 다른 사람을 찾고 있는 건가 - - - 알겠어 . ^ 내 메모리에 액세스 할게 . . . 읽는중(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n 그 래 . . . \n 그 사람은 갑자기 번쩍 떠올린듯이 어딘가에 있는 오두막으로 간다고 했어. \n 그 사람은 . . . 넌 그사람과 매우 닮았어 ! ! ! 정말로 그 사람이 아닌거야 ? ? 응 ? 음음 ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "너는 정말로... 음, 어. 좋다고.", + "한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다:\'빠르게, 다시 떠나야 하기 전에(점점 밝아지고 있어, 항상 일어나는 일이지)- 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\"") + } +, + quest_event:{ + dialogue:new Array( + "한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다:\'빠르게, 다시 떠나야 하기 전에(점점 밝아지고 있어, 항상 일어나는 일이지)- 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "안녕하신가. 큐브는 만나본건가?", + "큐브는 주변 공간을 통치하는 매우 좋은 통치자이지. 나나 다른 통치자들도 자신의 구역에서 통치를 잘 하고 있지만.") + } +, + gray2:{ + dialogue:new Array( + "이 공간에 대해서 어떻게 생각해? 여긴 멋진 중간 지점이야? 아니면 별로야?", + "세계의 교차로지!") + } +, + gray3:{ + dialogue:new Array( + "회색 피라미드는 사실 여기가 아니야. 특별한 시스템에서 홀로그램으로 비추고 있는 것이지.", + "왜 그런일을 하냐고? 왜냐하면 우리의 친구 큐브와 대화하고 싶거든, 그리고 큐브의 회사를 유지하기 위해서지.") + } +, + graydead:{ + dialogue:new Array( + "*잠자는 소리*") + } +, + grayspin:{ + dialogue:new Array( + "...홀로그램 장치는 제대로 작동중이야?", + "아니야?^...^제기랄!") + } +, + color1:{ + dialogue:new Array( + "큐브를 만나봤어? 그는 정말 멋진 일을 하고 있지! 듣기로 그는 절벽 끝에서 십이 초 동안 서 있을 수 있다던데. 대단하지 않아? '절벽 끝에서 서 있는 자들의 리그' 회원이라면 그 대단함을 이해할 수 있을 거야! 뭐? 모른다고? 아무튼, 대단하다고!") + } +, + color2:{ + dialogue:new Array( + "큐브는 재미있는 일을 많이 해!", + "들려? 분명히, 곧 내가 통치하게 될 차례가 올 거야! 단 몇 분 정도, 그렇게 믿고 있어.") + } +, + color3:{ + dialogue:new Array( + "나는 타이베이에서 운송된, 설탕 덩어리에서 왔어. 내가 왜 여기에 있는 거지? 이런, 큐브에게 인사하려고 들린 거였지!", + "너무 우올해 하지 마! 이곳을 찾는 사람들이 놀라지 않게 하려고 이상한 모습을 하고 있는 거야. 아무런 피해 없다고.") + } +, + colordead:{ + dialogue:new Array( + "(...낮잠 자고 있는 건가?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "모든 세대는 고통 속에서 태어나 고통 속에서 죽는 것을 반복하지. 우린 밖에 나가지 않음으로써 고통받지 않고 살고 있어.") + } +, + after_fight:{ + dialogue:new Array( + "이것이 우리에게 반란을 일으킨 너의 형벌인가?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "당신은 왜 관측자의 희생을 빼앗아 간 거지? 당신은 왜 우리의 구원을 훔쳐간 거지?") + } +, + after_fight:{ + dialogue:new Array( + "...우린 너에게 합당한 보상을 주지 못한 것 같아. 너는 우리에게 자유를 돌려주었어. 정말 고마워. 영. 관측자가 너에게 한 번 더 호의를 베풀며 바라볼 거야.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "다시 봐서 반갑다, 양. 오랜만이야. 아직도 노텐도 가지고 노니?") + } +, + after_fight:{ + dialogue:new Array( + "맙소사, 연, 아직도 어린애니? 알겠지만, 어차피 결국 다른 사람과 사귀게 된다고.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "저희 호텔은 뭐든지 최고의 시설을 갖추었습니다. 수영장은 어떠십니까?") + } +, + middle_fight:{ + dialogue:new Array( + "최첨단 피트니서 센터는 어떠십니까?") + } +, + after_fight:{ + dialogue:new Array( + "즐거운 시간 보내셨길 바랍니다.") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "오늘은 매우 멋진 날이지.", + "목을 긁어줘서 고마워 - 거기에 손이 닿질 않았거든.", + "로컬 디너에서 파는 계란이 맛있다고 들었어. 쿠폰도 가지고 있다고.", + "오늘 자동차 사고를 본 적 있어? 정말 끔찍했지! 운전사가 문자를 쓰다가 순간 훅 갔어. 아직 젊은 남자였는데!", + "내 아들은 주니어 대표팀에 못 들어가서 실망했어. 그토록 스포츠에 투자를 많이 해줬는데...", + "오늘은 추수감사절이라 여러 가지에 감사하고 있어. 내일 새벽에 있을 장사가 너무 기대돼! 화끈한 거래를 많이 하겠지?", + "아, 아마 좀 늦을 것 같아.", + "빨리 집에 가야 해, 친척들이 오기 전에 청소를 마쳐야 하는데...", + "차고에서 물건을 팔아-요!", + "환영해!") + } +, + words_teen:{ + dialogue:new Array( + "최신 영화를 안 봤어.") + } +, + words_kid:{ + dialogue:new Array( + "더이상 만화를 볼 수 없어!") + } +, + family:{ + dialogue:new Array( + "저희 집에 오신 것을 환영합니다. 낮선이여! 어디선가 본적이 있는 것 같은데... 이 마을은 평화로운 마을입니다. 꽤 조용하고, 방문자가 많이 없거든요.", + "혹시 데이브먼트 좋아해요? 데이브 형이 저에게 끝내주는 이 노래를 저에게 알려줬어요!") + } +, + older_kid:{ + dialogue:new Array( + "내 친구들은 'Rayhead'의 'None Surprises'라는 노래를 듣는 걸 좋아해. 이 마을을 불평하는 노래인데, 여기가 지옥이 아니라는 걸 감사해야 한다고! 스스로 바꾸려고 하지 않으면 ...아, 미안. 너무 떠들었네..", + "난 그냥 블로그에 글이나 쓸래.", + "너 좀 피곤해 보이는데.", + "난 TV랑 스포츠에 관련된 이야기를 잘 못하지만, 부모님이 좋아하셔...") + } +, + hanged:{ + dialogue:new Array( + "시체위에 있는 쪽지:\"이제 위험으로부터 해방이다\"") + } +, + festive:{ + dialogue:new Array( + "오, 누가 밖으로 나가나? 축제인가? 아니면 퍼레이드?", + "밖이 너무 조용한 것 같은데? 창밖을 봤어? 무슨 일인지 궁금한데...") + } +, + paranoid:{ + dialogue:new Array( + "제 집은 창문이 많아요. 하지만 전 창문을 좋아하지 않죠. 계속 감시당하는 느낌이 들거든요. 근데 밖에서 무슨 일이 일어나고 있는 것 같은데, 항상 시끄러워서 저한테 방해가 됐었거든요. - 왜 이렇게 조용한거지?", + "살인자? 뭐라고? 밖에서? 대체 무슨 말을 하는 거죠? 장난치는 거예요? 이 마을에는 살인자가 나타난 적이 없어요, 하지만 당신이...계속 조심하라고 경고하니...당신은 당장 이 마을을 떠나야 될 것 같네요.", + "죄송하지만 나가주세요.") + } +, + dead:{ + dialogue:new Array( + "둔기로 얻어맞은 것 같은 여자의 시체이다.", + "남자의 시체이다.") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "오, 너구나! 왠지 익숙한 얼굴인데...난 너가 마을 사람들을 더 죽일 때까진 움직일 수 없어, 기억나지? 조금있다가 봐.", + "이 책자에 따르면... 넌 몇 명만 더 죽이면 돼! 계속 하라고.", + "한 명만 더 죽이면 돼, 그러고 나면 계속 나아갈 수 있다고.", + "잘 했어. 자유로움을 느끼며 안으로 들어가. 안에 무엇이 있는지 모르지만, 아무튼 다시 만나. 내일 같은 시간에 말이야. 알겠지? 아니면 그 다음날 저녁에 볼까?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "나무한테 감시당한다고 해도 상관없어.", + "그년 어딨어?!", + "너가 혼자일 때마다 내가 함께할 것이다, 영.", + "너가 오크샤였어? 엄만 항상 오크샤가 위험하다고 경고했었어.", + "반가워어, 영! 이렇게 만나서 반가워어! 왜 날 올리지 않는 거야? 난 그냥 차 위에 얹어서 먹는 푸딩이라고!", + "퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 성단소, 설교단, 제단, 스테인드글라스 창문...", + "한정 판매중! 오늘만 특별히 하나를 사면 - 하나가 공짜!", + "전기가 나갔을 때 촛불을 밝혔던 때가 기억나나요?", + "으으으음, 어젯밤에 네 베개는 편안했어.", + "날더러 게이새끼라고? 이걸로 맛 좀 보여주지 이새끼들.", + "상품과 나는 좋은 팀이야.", + "난 선택받은 사람 견습생이야!!!", + "가끔, 자신이 무슨 짓을 했는데 세상이 죽어가는 것을 막을 수 없게 된 느낌을 알아?", + "숲의 버섯을 조심해...", + "정말 미안해. 본능적으로...", + "'그냥 바위야'라니?? 바위도 카드가 될 수 있다고!", + "한명의 남자에게 물고기 한 마리를 준다면 하루 만에 다 먹겠지. 하지만 물고기 잡는 법을 알려준다면 아들 지미와 부자 관계가 더욱 돈독해지겠지?", + "때로는 걸으면서 대화하면 답이 생기기도 해.", + "박지는 왜 갑자기 날아올라서, 너의 주변을 돌아야 해?", + "꽃구경 이야기는 이제 그만해!", + "행복해?", + "내 주변엔 폭력이 없어.", + "난 항상 철 요리사가 되고 싶었어.", + "엄만 항상 내게 '허리를 계속 굽히고 있으면 그대로 허리가 굳어버린단다!'라고 말했었지.", + "아직 즐겁지 않은건가, 인간?", + "...", + "과학적으로 말해서, 두꺼비는 개구리의 부분 집합이야.", + "하하하하! 그래! 알고 있어!", + "오, 당신도 카드를 모으는 건가요? 정말 고급스러우시네요, 잉.", + "그들은 항상 내게 \"컴퓨터 끄거라! 아니면 평생 친구를 사귀지 마렴!\"이라고 말했었지.", + "지금 나는 오로지 대화의 범위안을 통치한다.", + "당신은 '내가 일을 즐겁게 하고 있다'라고 생각하는 것 같아요!", + "난 대각선이 싫어.", + "나의 꽃가루? 히스타민따위 듣지 않는다고.", + "당신의 방문 잠금을 풀기 위해서 카드를 스와이프하세요!", + "나만 믿게나.", + ".......??", + "누가 우리를 조각한거지?", + "즐겁게 머물다 가셨길 바랍니다.", + "이때까지 있었던 너의 행적을 봤어. 너 재미있는데,", + "네가 길을 잃게 하도록 여기 있는 거야.", + "우리에겐 너도 피라미드지만 말이야!", + "매일 밤마다 계속대는 지랄맞는 놀이, 월급도 개같지.", + "날 내버려둬! 내 성은 삭스가 아니란 말이야!", + "적어도 나는 막대기 아니에요.", + "돈은 나무에서 나오지 오지 않는다니 무슨 소리야? 으하하!", + "나는 아무것도 아니다. 환각일 뿐이다.", + "그냥 화풀이 하는 거야.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "-", + "을(를)눌러 조작설정", + "을(를)눌러 취소", + "상", + "하", + "좌", + "우", + "점프", + "공격", + "메뉴", + "버튼", + "을(를)눌러 나가기", + "을(를)눌러 조작설정") + } +, + title:{ + dialogue:new Array( + "방향키를 움직여\n화면에 검은 부분이\n안 보이도록\n맞춰 주세요.\n\n", + "을(를)눌러 진행합니다.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "아무버튼이나 누르세요", + "버튼", + "으(로)시작합니다", + "버전", + "계속하기", + "새로시작", + "계속하시겠습니까?\n아니오\n네", + "정말로요?\n아니\n그래", + "다신 되돌릴 수 없습니다!\n지워버려!\n알겠어", + "죽은횟수", + "카드", + "Anodyne은(는)대부분의 컨트롤러를\n지원합니다.\n\n지금 연결된 컨트롤러를 사용하시겠습니까?\n\n네 아니오\n\n만약 사용하신다면.\n\n방향키로 조작이 가능하고\n\nC, SPACE, 또는 ENTER\n로 선택이 가능합니다.\n\n예로 기본설정\n", + "안내문\n\n만약 연결된 장치가 있으시면\n게임플레이중 지연이 있을 수 있습니다,\n게임을 종료한 후\nAnodyne을(를)재실행\n해주세요.\n\nC로 계속 진행\n\nGUI가 올바르지 않게 표시됩니까?\n아래 버튼을 누르면\n장치의 방향을 변경합니다.", + "BACK을(를)다시 눌러\n게임을 종료해주세요.\n저장되지 않은 진행은\n잃게됩니다.") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "저장중...") + } +, + map:{ + dialogue:new Array( + "지도", + "현재 위치", + "문/출구", + "지도 없음", + "연결체로\n돌아가기", + "입구로\n돌아가기") + } +, + items:{ + dialogue:new Array( + "아이템", + "평범한 빗자루", + "변동기", + "확대기", + "확장기", + "스프링이 장착된 신발 한 켤레 -", + "을(를)눌러 점프하세요!", + "자전거용 시발 한 켤레.", + "비어있는 골판지 상자.", + "사원에서 발견한 열쇠.", + "붉은곳의 지하 동굴에서 발견한 열쇠.", + "산의 동굴에서 발견한 열쇠.") + } +, + cards:{ + dialogue:new Array( + "카드", + "카드") + } +, + save:{ + dialogue:new Array( + "저장", + "저장됨!", + "오류", + "저장후 타이틀로\n", + "타이틀로", + "저장하고 종료", + "게임 종료", + "죽은 횟수:") + } +, + config:{ + dialogue:new Array( + "설정", + "조작 설정", + "불륨 설정", + "체크 포인트에서\n자동 저장:", + "켜기", + "끄기", + "보기\n설정:", + "UI 설정", + "화면터치+D-Pad", + "D-Pad 만", + "화면 터치만", + "조작 설정:", + "해상도:", + "창모드", + "전체화면", + "늘리기", + "크기:", + "언어:", + "일본어", + "영어", + "만족하실\n때까지\n버튼으로\n조작해주세요.\n\n그다음,\n메뉴를 탭하여\n계속 진행하세요.\n\n", + "원도우크기 재설정", + "조이패드 설정") + } +, + secrets:{ + dialogue:new Array( + "너 엄청 부자구나!", + "한때 유명한 거품 마법사의 소유물이었지.", + "만약 그래픽이 깨지면", + "이 심장은 이름이 없어.", + "부디 전기 몬스터 세상에도 방문해줘.", + "키티 동상. 귀엽지만 쓸모 없다.", + "오오! 들켜버렸다!!!", + "이런! 들켜버렸다!!!", + "검은색이군.", + "빨간색이군.", + "초록색이군.", + "파란색이군.", + "하얀색이군.", + ":선택", + ":뒤로") + } +, + swap:{ + dialogue:new Array( + "미안해!", + "여긴 변동기를 사용할 수 없다.", + "여기서 변동기를 사용하기엔 힘이 부족하다.") + } +, + keyblock:{ + dialogue:new Array( + "이 문은 잠겨있어.") + } +, + treasure:{ + dialogue:new Array( + "이상한 힘이 보물 상자가 열리는 것을 막고 있다.", + "빗자루의 손잡이에 문자가 새겨져 있다:", + "을(를)누르세요.", + "이 열쇠는 아마도 한 번정도 장벽을 여는 데 사용할 수 있을 것 같아.", + "수수께끼의 신발. 브랜드 이름이 쓰여있다:", + "을(를)눌러 강한 점프\".", + "빗자루에 무언가 써져 있다:\"메뉴에서 확장기를 장비하시면 빗자루의 나쁜 먼지가 좌우로 약간씩 증가합니다.\"", + "빗자루에 무언가 써져 있다:\"메뉴에서 확대기을 장비하시면 빗자루의 나쁜 먼지의 범위가 증가합니다.\"", + "빗자루에 무언가 써져 있는 문장의 다음 부분:\"안녕하세요, 영. 변동기를 사용하면 타일 두 개의 위치를 바꿀 수 있습니다. 어디에서나 사용하려면 아직 시간이 필요하지만, 당분간은 변동기를 유용하게 쓸 수 있을겁니다.\"", + "하트를 발견했다!!! 최대 체력이 0증가했다! ...?", + "골드만:뭐? 거기 없다고? 분명히 그 가게 주인이 훔쳤다고!") + } +, + dust:{ + dialogue:new Array( + "이제 빗자루가 먼지로 뒤덮혔습니다! 먼지를 바닥에 두려면 다시 공격하세요.") + } +, + checkpoint:{ + dialogue:new Array( + "저장하시겠습니까?\n 네\n 아니오", + "체크포인트 위에 서 있을 때,", + "을(를)눌러 진행을 저장하고, 동시에 그곳이 부활 장소로 설정됩니다.") + } +, + rock:{ + dialogue:new Array( + "낙서가 적혀있는 돌:") + } +, + door:{ + dialogue:new Array( + "차원문이 작동하지 않을 것 같다.") + } +, + keyblockgate:{ + dialogue:new Array( + "관문을 겁에 질릴 정도로 빤히 쳐다봤지만 열리지 않았다, 네 장의 카드를 가지고 있기 전까지는 열리지 않을 것 같다...", + "관문이 네 장의 카드를 감지하고, 열리기 시작한다.", + "관문은 고집스러울 만큼 그대로 있다.", + "관문이 모든 카드를 감지하고, 열리기 시작한다.", + "관문이 충분한 카드를 감지하고, 열리기 시작한다.", + "열렸어!", + "닫혔군.") + } +, + solidsprite:{ + dialogue:new Array( + "표지판이 동쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다.", + "표지판이 서쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다.", + "글자들이 바래서 내용을 알 수 없다.") + } +, + mitra:{ + dialogue:new Array( + "이봐, 영!", + "선물로 주는 자전거 신발이라고? 와우! 고마워, 영! 어떻게 신발을 손에 넣을까 생각하고 있었는데, 상품한테 그 자전거 신발에 맞는 클립이 패달에 달려 있거든. 여기, 영. 그냥 받기는 뭐하니까 내 신발이랑 교환하자! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐!", + "을(를)눌러 신발과 점프할 수 있어!", + "안녕 영! 새로운 소식이라도 있어? ^... ^...오, 알았어, 내가 새로운 자전거 신발을 얻었다고, 나도 알아! 이 신발은 상품의 패달에 딱 들어맞지. 이제 더이상 예전에 쓰던 신발이 필요 없어, 그래서 네게 준거지, 영! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐!", + "을(를)눌러 신발과 점프할 수 있어!", + "좋아, 조심해!", + "가라고, 놈들을 무찔러버려! ...하지만 냄새나는 놈들은 아니네.", + "멋지군, 그렇지 않아?", + "와우, 그 자전거 신발은 핀티씨네 가게에서 산거야? 혹시 그 신발을 내게 선물로 주지 않겠니? 고마워, 영, 정말로 고마워! 여기, 보답으로 내가 쓰던 신발을 줄게--정말로 고마워! 잘 쓸게! 아마 신발에 적혀 있을거야. 어디보자, \"", + "을(를)눌러서 파워 점프\". 의미를 모르겠네. 신발 어디에도 \"", + "\"버튼 같은 건 보이지 않아!") + } +, + tradenpc:{ + dialogue:new Array( + "핀티:반가워, 반가워, 내 호갱... 아니 친구 영! 내 이름은 프라산도프--핀티 프라산도프야! 혹시 마음에 드는 게 있어? 사양말고 마음껏 둘러보라고!", + "핀티:그 상자를 줘서 정말 고마워!", + "핀티:아, 상자! 정말 고마워! 이제 퇴근할 때 집으로 남은 재고들을 가져갔다가 아침에 다시 들고올 수 있겠다!", + "잠시만 기다려봐...어? 없잖아! 어디간거지? 음, 여기, 그 물건이 지금 안보여서 대신에 너의 상처라도 완화시켜줄게!", + "감사의 표시로, 이 간지나는 자전거 신발을 가져가!", + "좋은 아침이야. 안 그래, 친구? 장사하기 위한 좋은 아침이지! 이제 내 재고들 들고 다닐 수 있는 상자 하나만 있으면 좋을텐데...", + "저런, 넌 아직 이걸 살 형편이 안돼 보이네! 돈이 생겼을 때, 다시 오도록 해!", + "핀티:오오, 무기를 보는 그 눈빛! 좋아! 넌 더 좋은 무기가 필요해, 내 말 맞지? 단돈 $499.99에 적들을 녹여버려!", + "핀티:그 돈자루는 네가 대륙에서 발견하는 돈을 담아 자기한테 저금하는 걸 허락하겠다고 말하고 있어! 단돈 $869.99만 낸다면 바로 네 거라고!", + "핀티:오 호 호, 여기 특수 품목인 간지나고 초고속으로 달릴 수 있게 해주는 클릿이 달린 자전거 신발! 지금만 특별히 단돈 $299.99에 모십니다아-!", + "핀티:그 빗자루 주변의 먼지때문에 피곤한가? 이 최첨단-진공-청소기와 함께라면 유해한 먼지들의 입자마저 근절시켜 버린다고! 단돈 $749.99에 모십니다~! 아니면 4개월 할부로 달마다 $199.99는 어때?", + "감사의 표시로, 이 못생긴--아니 그러니까 아름다운 이걸 가져가! 바로 콜렉터즈 에디션 카드!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\n게임 제작\n\nMelos Han-Tani\n\n그리고\n\nMarina Kittaka\n\n-------------", + "개발 기간\n\n2012년 4월 부터\n\n\n\n2013년 1월 까지", + "디자인\n---\n둘이서 함께", + "프로그래밍\n-----\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\n미술\n--\nMarina\n", + "음악/효과음\n------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\n대사\n--\nMostly Marina\n", + "스토리\n---\n둘이서 함께\n\n현지화\n---\n일본어 현지화\nKakehashi Games\n한국어 현지화\nMiRiKan", + "Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game.", + "O - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport.(Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina.", + "Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up.", + "Mo, for believing\n in me.\n\nTina, for Introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it.", + "캐스트\n---\n\n\n슬라임\n\n\n짜증나는 놈\n\n\n퓨 퓨\n\n\n방패지기\n\n\n탐구자", + "움직이는 자\n\n\n온 오프\n\n\n사면 발사대\n\n\n슬래셔\n\n\n악당\n", + "개\n\n\n개구리\n\n\n회전자\n\n\n사람\n\n\n벽\n\n", + "쥐\n\n\n가스맨\n\n\n좀벌래\n\n\n돌진기\n\n\n롤러\n\n관측자\n\n\n", + "먼지광\n\n\n폭발 식물\n\n\n매니저\n\n\n", + "사자\n\n\n뒤틀린 자\n\n\n불꽃 기둥\n\n\n두 광대들\n아서\n자비에라", + "추종자\n\n\n에드워드\n\n\n낚시꾼\n\n\n붉은 워커\n\n절단자", + "토끼\n\n\n이키\n\n\n가게 주인\n\n미아오 샤오 투안 어\n\n랭크\n\n골드맨", + "토렉스\n\n제임스\n\n버섯\n\n클릭손\n\n골렘\n\n교외 거주자", + "체이서\n\n\n엔티티\n\n\n공간의 얼굴들\n\n\큐브 왕", + "영\n\n\n미트라\n\n\n현자\n\n\n브라이어", + "그리고 게임을 플레이한\n당신께 감사드립니다!\n끝까지 즐겨주셔서 감사합니다!\n\n\n즐거우셨길\n바랍니다.", + "\n\n\n\n\n\n\n\n", + "이제 당신은\n변동기를 통해\n영의 세상을\n(거의)제한 없이\n탐험하실 수 있는\n능력을 얻었습니다.\n") + } +, + elevator:{ + dialogue:new Array( + "몇층으로 가시겠습니까?", + "1\n", + "2\n", + "3\n", + "4\n", + "취소") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_PT.hx b/AIR/intra/hsrc/data/NPC_Data_PT.hx new file mode 100644 index 0000000..ce7b0dd --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_PT.hx @@ -0,0 +1,3952 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_PT { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Gosta de música? Examine aquele terminal!", + "Gosta de sofrer? Dirija-se ao sul!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Aquela acrobata está perdendo o equilíbrio! Onde está a rede de segurança?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "UOAAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Os leões estão encurralando aquela malabarista!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Estou cansado, Young. Estou cansado de todos esses ciclos. Eu me sinto como se estivesse vivendo o mesmo sonho, o mesmo pesadelo, de novo e de novo.", + "Briar:...", + "Briar:Isso não mudará, Young. Isso é tudo que sempre seremos.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Adeus, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Cara, Young.", + "Briar:Bata seus pés, mova seus braços. Caramba, você não aguentaria um minuto sem mim!", + "Briar:Bem, vem comigo, vamos comer um sanduíche ou algo assim.", + "Sábio:Você... você agiu adequadamente. Até o nosso próximo encontro.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voz Misteriosa:Olá? ...Young? ^EI! ... ah, você pode me ouvir? Bom, agora escute. Você está prestes a acordar. Você usará as setas para se mover.", + "Você usará a tecla \'", + "\' para Interagir com objetos e pessoas ao seu redor.", + "E você usará a tecla \'", + "\' para acessar o menu, que fornecerá informações sobre você e os seus arredores.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Eu só queria consertar tudo para você.", + "Eu espero... Eu espero que você se saia melhor que eu.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Boa sorte, Young.", + "O Sábio está certo, de certo modo. Eu quero que tudo seja perfeito, e algumas vezes isso me faz ignorar a realidade.", + "Eu não sei o que você precisa fazer para ajudar O Briar. Eu não entendo como esse mundo funciona ou porque tudo aparenta ser tão estranho. ^Mas eu quero ser sua amiga, Young.", + "Você está lutando, Young. Você está tentando entender. Eu espero que você consiga se resolver.") + } +, + one:{ + dialogue:new Array( + "Sábio:Young... esse é meu último aviso... espere, quem é ela?", + "Mitra:Meu nome é Mitra, e esta é minha bicicleta, Wares!", + "Sábio:Eu não perguntei o nome de sua bicicleta, o que você está fazendo aqui? Não me lembro de você.", + "Mitra:Estou aqui para ajudar meu amigo, Young.", + "Sábio:Young não tem amigos. Young sequer tem O Briar. E se você está provocando ele, quero você fora do meu mundo!", + "Mitra:O que você quer dizer? Wares e Eu--", + "Sábio:PARE DE FALAR SOBRE SUA MALDITA BICICLETA!!!") + } +, + hit:{ + dialogue:new Array( + "Sábio:...", + "Mitra:Young! Você está bem?^ Origada pela ajuda. Agora vá e acabe com essa última área de araque! Nós sabemos que você consegue!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Preste atenção, encapuzado misterioso, eu não sei quem você pensa que é, mas que tal nos deixar em paz?", + "Sábio:Você acha que é amiga de Young só porque você irá mentir e dizer para ele que lá no fundo ele é perfeito e que no fim tudo ficará bem. ^Bem, se é isso que você quer, TUDO BEM. Suma da minha frente, Young.", + "Sábio:Vá falar com sua amiga.", + "Mitra:Nós só estamos fazendo o melhor que podemos...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Homem Encapuzado:Bem, já estava na hora. Er...^Quer dizer...^ Saudações, Young! Eu sou o Sábio, o Ancião do Vilarejo. Você foi invocado aqui pois A Escuridão se espalhou pela Terra. A Escuridão procura O Briar Lendário, para usar seu poder para propósitos malignos. Você deve alcançá-lo primeiro. Você deve proteger O Briar.", + "Entre no portal ativo a sua esquerda para iniciar sua jornada.", + "*suspiro* Não pega bem ficar pasHan-Tanido por aqui. Entre no portal para iniciar sua busca. O Briar, e por extensão, o mundo estão em grande necessidade!", + "Apenas entre no maldito portal!") + } +, + after_ent_str:{ + dialogue:new Array( + "Por que você ainda está aqui?") + } +, + after_bed:{ + dialogue:new Array( + "Siga em frente, Young. Essa chave que encontraste, devem existir outras como ela - vá a procura delas.", + "Vá para os mais longínquos cantos da Terra, Young. Essa é a única maneira de impedir A Escuridão.") + } +, + before_windmill:{ + dialogue:new Array( + "Use essas três chaves, Young, e abra o caminho para os cantos mais profundos da Terra.") + } +, + after_windmill:{ + dialogue:new Array( + "Você fez o que pedi, Young, apesar de ainda existir muito a ser feito. Talvez se você explorar as profundezas da Terra você poderá achar respostas... talvez você será de algum valor para O Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Bom trabalho, Young. Você encontrou todas as cartas de uma área da Terra, e como resultado uma jóia apareceu no topo do portal dessa área.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sábio:Em breve suas habilidades serão postas a prova, Young. Para sobreviver a esse templo, você precisará de ambos força e Intelecto. Suponho que você tenha encontrado uma arma, correto?", + "O qu-?? ... Qu-quer dizer... Sim é claro... uma vassoura! Er... exatamente como foi previsto na Lenda...", + "*resmungos* ... de todos os incopeten--Ei! O que você está fazendo aí parado?", + "Juízo, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sábio:Neste momento, você ainda está fraco. Se você deseja proteger O Briar da Escuridão, você deve enfrentar seus medos. A carta que encontrará neste baú, e outras como ela, são o símbolo do seu crescimento. Adquirir tais cartas é vital para sua jornada.", + "Essa chave também terá um papel importante em sua busca. Você deve procurar outras chaves como ela. Selecione o mapa na tela de menu para se teletransportar de volta para a entrada do templo e dar continuação a sua heróica jornada.", + "Explore o Sudoeste dos terrenos do templo... você encontrará um uso para essa chave.", + "O que, você quer que eu te carregue nas costas para o portão ou algo assim?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sábio:Por que você não me escuta?! Se você se apressar como um idiota, colocará em perigo não só O Briar, mas também A Terra e tudo para o qual trabalhei! Me desculpe Young, mas se você não me escutar, eu terei que convencê-lo de outra forma...") + } +, + after_fight:{ + dialogue:new Array( + "Sábio:Young... Não era para acabar assim... Eu queria que você se tornasse uma pessoa melhor. Eu queria que você ajudasse O Briar. Mas tudo isso é apenas um jogo estúpido... Não posso lhe impedir de chegar ao Briar. Apenas lembre de minhas palavras quando tudo for para o inferno.") + } +, + entrance:{ + dialogue:new Array( + "Sábio:Olá, Young. Quando você se tornar um indivíduo mais forte e sábio, este caminho lhe levará até O Briar.", + "Sábio:Você não está preparado Young, primeiro você ainda precisa enfrentar mais desafios na Terra.", + "Sábio:Você fez algum progresso, Young, mas você deve coletar pelo menos 36 cartas para abrir esse portão.") + } +, + etc:{ + dialogue:new Array( + "Sábio:Ah... umm... você tem pelo menos 36 cartas? Mas eu não acredito de que você esteja pronto para o derradeiro teste. De fato, olhe, nós estávamos lendo este portão errado, você precisa na verdade de\n...\n......\n92 cartas para abrí-lo, e não 36!", + "Sábio:Young, não vá, você não está preparado! Pense no Briar! Na Terra! Tudo será em vão se você não estiver pronto!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sábio:Excelente trabalho, Young. Você teve não só que conquistar esse monstro mas também seus medos para emergir vitorioso!!!", + "Sábio:Mas é claro, você ainda tem um longo caminho pela frente. Você tem explorado A Terra?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sábio:Muito bem, Young. No entanto, ainda existem desafios a serem superados. Não perca seu foco.", + "Sábio:Você encontrou todas as chaves, Young? Se não, vá para a praia.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "Eu não sou como os outros! *auau* Eu não irei machucá-lo...", + "É uma existência pacífica aqui em cima.", + "Você cheira a alcega.", + "*auau*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "Você conseguiu, Young! Você derrotou A Escuridão! Olhe em volta! Que belo!", + "Tão belo...") + } +, + dump:{ + dialogue:new Array( + "Graças a deus você chegou! Estava preocupado pensando que você poderia estar preso naquela birosca congelada... Aquele lugar é depressivo pra caralho!", + "Hahaha. Hahahahaha. HAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Ei bonitão, deixa eu comprar um drink pra você.", + "Tome outro drink, seu merda! Hahaha!") + } +, + hot:{ + dialogue:new Array( + "Porra, está quente aqui... Estou suaaaaando...", + "Droga, malhar me deixa com tesão!") + } +, + gold:{ + dialogue:new Array( + "Você sabia que esse lugar é feito de ouro? Ouro de verdade! Nós poderiamos fugir juntos e viver dos tijolos daqui! Wahahahaha!", + "Sério mesmo, porque você está aí parado? Me ajude a tirar esse tijolo aqui.") + } +, + briar:{ + dialogue:new Array( + "???:Young... Você finalmente conSeguIU! VoÊc ME ssalvOU AgOrE TuDo FICARÁ beN dE nOvO!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "CUIDADO!", + "Desculpe pelo que aconteceu... Eu estava indo muito rápido. Hm, Eu nunca vi você antes! Você é um colega viajante? ... Ahm? Você quer proteger o Briar da maligna Escuridão? ^Bem... Eu não tenho idéia do que você está falando, mas me parece legal!", + "Eu viajo por aí, pedalando Wares. Wares é o nome da minha bicicleta!", + "Eu já vou indo, quem sabe a gente se encontra outra hora. Caso eu ouça algo sobre o Briar eu conto pra você.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "CUIDADO! Muito bem Wares, vamos lá!", + "GERÔNIMO!", + "Vá lá, Young, nós seguramos as pontas aqui!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Lembra de mim? Esqueci de me apresentar da última vez, só apresentei minha bicicleta, Wares. Meu nome é Mitra.", + "Lembra de mim? Eu esqueci de me apresentar da última vez, meu nome é Mitra, e essa jovem bicicleta se chama Wares.", + "Mitra:Com tem ido, Young? ...o que? Como eu sei o seu nome? Você acha estranho? Bem, ele está escrito na parte de trás do seu capuz.", + "Mitra:Nos vemos por aí, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Ei, acabei de lembrar - mais cedo alguém falou que estava procurando algo e que iria para as montanhas. Não entendi do que se tratava.") + } +, + game_hints:{ + dialogue:new Array( + "Nada.", + "Hm, está perdido? Tentou procurar algo na praia? Talvez exista alguém lá que possa te ajudar. ^Parece que essa sua chave é de uma coleção. Talvez você precise achar mais delas?", + "Hm, está perdido? Tentou a floresta? ^Essa sua chave - parece que ela é de uma coleção. Talvez você precise achar as outras?", + "Parece que você achou todas as chaves! ^Eu lembro de ter visto alguns portões no sudeste, talvez você deva usá-las lá?", + "Ei, eu vi que você ligou a turbina eólica! Sabe se isso teve algum efeito na Terra?", + "Nossa Young! Você realmente conseguiu uma porrada de cartas! Já descobriu pra que elas servem? Com essa quantidade você pode conseguir um bocado de coisas!", + "O que é esse novo acessório para vassoura que você tem? Ele permite modificar a estrutura do mundo...? Honestamente, isso é assustador Young. Ainda bem que isso parece não funcionar em qualquer lugar. Talvez só nos lugares mais profundos e estranhos da Terra.", + "Está gostando dos seus sapatos de pulo? Bem maneiros, não é? Eu estou amando meus novos sapatos para pedalar. Eles fazem Wares e Eu um time ainda melhor!", + "Maneiro, Young, você achou outra chave. Wares gosta dessa cor! Já descobriu um lugar para usá-la?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Young, está a procura de cartas?\Procurou ao redor da área do templo do Aquele que Vê?", + "Mitra:Young, está a procura de cartas?\nOuvi dizer que existe um labirinto na saída traseira do templo de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\nVocê deve achar algo perto do lar de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\nTem uma sala cheia de inimigos no templo de Aquele que Vê, não é?", + "Mitra:Young, está a procura de cartas?\nJá procurou por todos os lugares do templo de Aquele que Vê?", + "Mitra:Young, está a procura de cartas?\nTente procurar na área vestigial perto da saída traseira do tempo de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\Talvez seu vizinho saiba de algo.", + "Mitra:Young, está a procura de cartas?\nEu sei que o cara no seu apartamento estava escondendo algo...", + "Mitra:Young, está a procura de cartas?\nEm algum lugar perto da entrada do seu apartamento... procure por lá!", + "Mitra:Young, está a procura de cartas?\nJá procurou em todos os lugares do seu apartamento?", + "Mitra:Young, está a procura de cartas?\nExistem uma ilha ao sul daqui. Eu nunca fui lá, mas acho que vale a pena você dar uma olhada.", + "Mitra:Young, está a procura de cartas?\nMuitas coisas podem ser encontradas se você seguir os rios. Comece por aí!", + "Mitra:Young, está a procura de cartas?\nEu lembro que alguém deixou uma carta perto da turbina eólica.", + "Mitra:Young, está a procura de cartas?\nProcure pelos rios na floresta.", + "Mitra:Young, está a procura de cartas?\nTente procurar na base das montanhas.", + "Mitra:Young, está a procura de cartas?\nJá tentou procurar no cume das montanhas?", + "Mitra:Young, está a procura de cartas?\nNo lugar mais longínquo da praia deve ter algo.", + "Mitra:Young, está a procura de cartas?\nFaça uma caminhada pela floresta vermelha.", + "Mitra:Young, está a procura de cartas?\As cavernas vermelhas estão cheias de portas trancadas, não é?", + "Mitra:Young, está a procura de cartas?\nTente a caverna vermelha do norte - siga o rio até o fim!", + "Mitra:Young, está a procura de cartas?\nNa caverna vermelha ao norte, procure pela nascente do rio!", + "Mitra:Young, está a procura de cartas?\nHmm... já tentou procurar por todos os lugares do labirinto sombrio?", + "Mitra:Young, está a procura de cartas?\nLembro de um caminho cheio de lança-chamas em algum lugar. Deve haver algo no fim dele!", + "Mitra:Young, está a procura de cartas?\nEsse pessoal do circo devem está escondendo alguma coisa. Já olhou por todos os lados?", + "Mitra:Young, está a procura de cartas?\nJá tentou procurar na área ao redor do poço daquele casal?", + "Mitra:Young, está a procura de cartas?\nTem um casal que gosta de se encontrar perto de um poço. Eles devem estar escondendo algo.", + "Mitra:Young, está a procura de cartas?\nAlgumas vezes coisas são escondidas em locais cercados por abismos - especialmente em cavernas nas montanhas!", + "Mitra:Young, está a procura de cartas?\nTente procurar nos pontos mais altos das cavernas nas montanhas.", + "Mitra:Young, está a procura de cartas?\nSerá que há algo nas profundezas daquelas cavernas na montanha?", + "Mitra:Young, está a procura de cartas?\nAquele cubo colorido naquele lugar estranho - provavelmente ele deve ter algo!", + "Mitra:Young, está a procura de cartas?\nJá tentou falar com aquele cubo cinza naquela área maluca? Talvez ele saiba de algo!", + "Mitra:Young, está a procura de cartas?\nO andar de cima daquele hotel está meio caído, mas ele deve ter algo!", + "Mitra:Young, está a procura de cartas?\nVocê já procurou por todos os lugares do terceiro andar do hotel?", + "Mitra:Young, está a procura de cartas?\nAposto que alguém deixou algo no segundo andar do hotel.", + "Mitra:Young, está a procura de cartas?\nO dono do hotel deve ter deixado algo para você!", + "Mitra:Young, está a procura de cartas?\nAquelas pontes quebradas ao noroeste... procure por lá!", + "...Ahm?! Você não achou *nenhuma* carta? Cara, Young, você está louco! Algumas vezes na vida você tem que ser aventureiro. Abra algumas caixas, saca?") + } +, + general_banter:{ + dialogue:new Array( + "Você achou aquele cara que estava procurando por algo nas montanhas?", + "Você sabe qual é o sobrenome da minha bicicleta? Waldo! Manja? Wares Waldo! ... Brincadeira, bicicletas não tem sobrenomes.", + "Acha que eu devo comprar uma trava para bicicletas? Eu odiaria prender Wares assim, mas ouvi dizer que roubos de bicicletas estão em alta.", + "Então, o que é esse tal de Briar? Algum tipo de artefato de uma cultura perdida?", + "Por que será que eu não ouvi nada sobre a chegada da Escuridão? Talvez a maioria das pessoas estão ocupadas demais com seus problemas do dia a dia.", + "Ei Young, eu só queria te dizer que... seu cabelo é irado.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Estátua:O Ancião do Vilarejo é apenas em nome, pois ambos ele não é.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Estátua:Eu vi uma vassoura em uma lenda... estava no mapa de um armário de zelador.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Estátua:Adquirir cartas é vital para sua jornada. Adquirir cartões é vital para outras jornadas, como conseguir crédito.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Estátua:Excelente trabalho, Sábio. Você teve que conquistar não só o seu temperamento mas também a sua dignidade para dizer uma frase tão manjada!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Quando você se tornar um indivíduo mais estressado e apático, esse caminho irá lhe levar ao Vinte Sabores.") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Eduardo:Há um tempo atrás um homem veio e instalou um espelho no nosso banheiro. Eu tinha medo de que uma câmera estivesse dentro dele. Coloquei sabão em cada centímetro da moldura de madeira na esperança de causar um curto-curcuito. Nunca encontrei nada, é claro.", + "Eduardo:Esse templo é dedicado a Aquele que Vê. Eu não sei porque vim aqui, estou assustado demais para entrar.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Eduardo:Está com problemas? Eu já imaginava. Tudo que você tem é uma vassoura, e tudo que uma vassora pode fazer é mover sujeira.") + } +, + bedroom_done:{ + dialogue:new Array( + "Eduardo:Quer dizer que você derrotou Aquele que Vê? Você não entende que não é assim que as coisas funcionam? Você só está colocando sabão no espelho.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Ah, que adorável. Pequenino Young, brincando de ser herói. Testemunhei todos seus passos na Terra, e tenho que dizer, Young, nem todo mundo aqui é tão honesto quanto eu. Tenha cuidado com quem você confia.") + } +, + after_fight:{ + dialogue:new Array( + "Eu estarei com você, Young, onde quer que você esteja. Lembre-se do meu conselho durante sua pequena aventura.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Pedra:Visão periférica é o lar do satanás.") + } +, + two:{ + dialogue:new Array( + "Pedra:Lista de Tarefas:Construir um método de transporte para o Nexus. ^Progresso:Aquele que Vê não dará os fundos necessários para realizar esse empreendimento. Teremos que reverter para o método original dos inexplicáveis portais.") + } +, + three:{ + dialogue:new Array( + "Pedra:Estou aprisionado aqui sozinho. O trabalho nesse túnel é constante, e a cada dia consigo ver um pouco de progresso.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Esta é a roda que usamos para construir a barragem.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 de Junho de 1957:Trapézio quebra. Alice Rutgers voa em direção ao chão, resultando em duas canelas fraturadas.") + } +, + two:{ + dialogue:new Array( + "17 de Julho de 1957:Sete palhaços se aposentam com problemas pulmonares quase fatais. Especialistas suspeitam da marca de maquiagens TERRAMAIS, mas nenhuma investigação formal está em andamento.") + } +, + three:{ + dialogue:new Array( + "21 de Julho de 1957:Seguinte ao mau funcionamento de uma jaula, meu rosto e laterais foram severamente desfigurados por um leão não treinado. Eu sobrevivi, mas agora temo o meu próprio reflexo.") + } +, + four:{ + dialogue:new Array( + "5 de Agosto de 1957:No meu sonho, vi um rosto de pedra com fortes, olhos brilhantes. Ele revelava a verdade da nossa existência e foi o primeiro a oferecer a liberdade da dor.") + } +, + five:{ + dialogue:new Array( + "7 de Agosto de 1957:Quantos de nós sofrerão antes de aceitarmos a verdade do Aquele que Vê?") + } +, + six:{ + dialogue:new Array( + "8 de Agosto de 1957:Cheguei a uma decisão. Alguns disseram que iriam me seguir. Essa é minha última anotação. Que o Aquele que Vê olhe favoravelmente para nós.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Rabiscos indecifráveis)") + } +, + two:{ + dialogue:new Array( + "7 de Dezembro de 2010.(Nome Ilegível). Não há nada aqui em cima, exceto essa pedra estúpida!") + } +, + three:{ + dialogue:new Array( + "Perigo! Essa caverna ainda não foi explorada.") + } +, + four:{ + dialogue:new Array( + "Esses penhascos se extendem para o alto e avante, se bem que eu nunca fui alto o suficiente para saber onde é que vai dar.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Pedra:Como?") + } +, + two:{ + dialogue:new Array( + "Pedra:Perigo! Queda vertical, pule por sua conta e risco.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Essa costumava ser a animação para o portão das cartas. Se aproxime dele mais de uma vez para ver as animações de abrir e fechar!", + "Eu esqueci porque ela foi removida. Talvez por ser dramática demais.") + } +, + two:{ + dialogue:new Array( + "Aqui estão testes para várias camadas de ladrilhos e colisões! Eu não consegui fazer ladrilhos de mão única para os dois lados(como paredes)", + "funcionarem bem e acabei removendo esse conceito do jogo... ou algo assim.", + "Há uma razão para não usá-los. Simplificar o design, o que foi muito importante para nós terminarmos o jogo.") + } +, + three:{ + dialogue:new Array( + "Inimigos costumavam deixar cair chaves. Essa idéia foi removida mesmo sendo bem divertida.", + "Outra ideia que tivemos foi a de existir portões de desafio, que", + "ficariam no final de uma arena e só abririam se você os alcançasse sem se ferir.", + "Queríamos modelar todos os calabouços a partir disso e remover o sistema de vida completamente, mas isso se provou muito difícil!") + } +, + four:{ + dialogue:new Array( + "PRISÃO!!!", + "NOS SALVE!!!", + "Por favor!") + } +, + five:{ + dialogue:new Array( + "Bem-vindo ao MUNDO DE TESTES! Você não está mais na Terra, então considere esse mundo(90 POR-CENTO)não canônico.", + "Antes de muitos conjuntos de ladrinhos estarem completos eu usei ladrilhos bobos como esses para marcar onde as portas deveriam ficar. De fato, todos os calabouços foram projetados com os ladrilhos desta área, e então Marina substituiu pelos seus.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "- ARQUIVOS -", + "PROSSIGA COM CAUTELA") + } +, + four:{ + dialogue:new Array( + "Oeste. Fenda. Realidade! Baixos valores imobiliários, velho, acabado. Relaxante.") + } +, + three:{ + dialogue:new Array( + "Aquele que Vê pelo que me lem- brbrr,,,,,Momentos Relaxantes em Casa.") + } +, + two:{ + dialogue:new Array( + "CONGELADOR\n\n^ -- A GERÊNCIA") + } +, + one:{ + dialogue:new Array( + "CONTINUE") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Oeste:Praia\n\nLeste:Floresta\n\nSudeste:\n Área Chuvosa\n\nNorte:\nÁrea do Templo\n\nNordeste:Abismo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Oeste:Lago\nSul, em seguida leste:Penhascos") + } +, + two:{ + dialogue:new Array( + "Lagoa do Relaxamento. Fique um pouco, sabemos que você tem tempo.") + } +, + three:{ + dialogue:new Array( + "Eu temo estar preso neste lugar para todo o sempre.") + } +, + four:{ + dialogue:new Array( + "Leste:Penhascos") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "O caminho se abrirá quando as peças dos guardiões sombrios forem substituídas pela sua cor espiritual na formação abaixo.") + } +, + two:{ + dialogue:new Array( + "Quando a pedra azul se locomoveu\nLá um novo caminho se revelou\nPassando dos penhascos, através de dimensões\nExiste um hotel para viajantes\n\n\n\"Quem é o guardião?\"Eu pergunto,\n\"Quem comanda esse abarrotado local de negócios ?\"\nApesar de todas as almas humanas\nEu ainda me sinto só.") + } +, + three:{ + dialogue:new Array( + "A vermelha e enferrujada estátua se moveu\nE abriu caminho para poços profundos\nUm labiríntico calabouço seguiu\nLogo após, uma grande tenda de circo\n\n\n\"Quem são os guardiões?\"Eu pergunto\n\"Quem deu a vida para salvar este local?\"\nEu temo a dor, assim como eles\nMas o que realmente temo, é a morte.") + } +, + four:{ + dialogue:new Array( + "A verde, metálica estátua se deslocou\nDando caminho a uma trilha profunda\nCasas suburbanas e calçadas se formam\nO caminho para um apartamento\n\n\n\"Quem é o guardião?\"Eu pergunto\n\"Quem procura conforto nas estrelas?\"\nSozinho, eu me sinto vigiado.\nNão pela amigável luz das estrelas.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Pedra:Este território não foi anexado, portanto ainda não é parte da Terra.") + } +, + two:{ + dialogue:new Array( + "Pedra:Esses -^ círculos são^ promessas... Eu irei^ concêntricos^ tentar completar tudo...^ Brrur, Brur...") + } +, + three:{ + dialogue:new Array( + "Pedra:Veja^ -...mas eu sempre^ - seus passos^ - acabam reaparecendo, não? ^ - quando aqui!") + } +, + four:{ + dialogue:new Array( + "Pedra:Olhando para baixo^ - E eu percebi^ - daqui, você- ^ Eu o amo.^ - consigo ver... nada.") + } +, + five:{ + dialogue:new Array( + "Pedra:Minhas desculpas - ^Sim, nós -^ nessa bagunça aqui -^ devemos manter contato -^ mas aquele portal deve ^ - e eu tentarei dar minhas opiniões para você -^ retornar você para A Terra.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "Algumas pessoas terão coisas novas a dizer se você falar com elas várias vezes.", + "O mesmo não se aplica para pedras, pedras não curtem esse tipo de coisa.") + } +, + two:{ + dialogue:new Array( + "Pedra:Quase!") + } +, + three:{ + dialogue:new Array( + "Pedra:Curiosidade é algo ótimo.") + } +, + four:{ + dialogue:new Array( + "Pedra:Ah!...?") + } +, + five:{ + dialogue:new Array( + "O terminal do computador tem um e-mail aberto. Partes da tela estão quebradas, assim apenas partes da mensagem estão visíveis entre as manchas pretas\" Olá, Young! Parece que [...] quinquagésima carta [...] talvez você não deva [...] vale a pena considerar! Acha que está pronto? Acorde...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Pedra:Aposto que você está lendo uma pedra porque você não tem amigos.") + } +, + two:{ + dialogue:new Array( + "Pedra:Bem vindo a Estação do Sobresolo. Esperamos que tenha desfrutado do seu tempo na Terra.") + } +, + three:{ + dialogue:new Array( + "Pedra:Um explorador você é!", + "Pedra:Por favor não vá em direção ao sul. Está sob construção.") + } +, + four:{ + dialogue:new Array( + "Pedra:Tesouro em 5,3!") + } +, + five:{ + dialogue:new Array( + "Pedra:Haha, bobo!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NÓS NASCEMOS DENTRO DAS RUÍNAS DO CORPO DE NOSSA MÃE.") + } +, + two:{ + dialogue:new Array( + "UM DIA NOSSA MÃE DEIXOU A MÃE DELA E SE AVENTUROU NO NEVOEIRO VENENOSO.") + } +, + three:{ + dialogue:new Array( + "NÓS NÃO QUERIAMOS ISSO. NÃO TERIAMOS COMPRADO NOSSAS VIDAS AS CUSTAS DO SOFRIMENTO DELA.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Pedra:Sinais indicam que as árvores não foram ativadas por um longo período de tempo.") + } +, + two:{ + dialogue:new Array( + "Pedra:Sul:???^ Norte:???") + } +, + three:{ + dialogue:new Array( + "Pedra:Dizem que o terreno irregular foi formado pelos ancestrais dos habitantes desta área.") + } +, + four:{ + dialogue:new Array( + "Pedra:Eles aparentam ser uma espécie pacífica.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Escrito em o que aparenta ser um marcador permanente:Saudações, colega viajante do ESPAÇO e TEMPO.^ Você se encontra em uma fenda distante da área justaposta de YOUNG.^ Você atravessou um OCEANO ou dois, por assim dizer.^ Não se preocupe com o CONTRASTE, você pode retornar a sua aventura rapidamente.^ Não TEMA esse local, apesar dele parecer AMEAÇADOR e PERIGOSO você irá ver que seus habitantes são bastante AMIGÁVEIS. \n -- A GERÊNCIA", + "(Abaixo da mensagem, uma escritura:)Aqui jaz(ilegível). Ele se perdeu na floresta.", + "(Ainda mais abaixo da mensagem:)(apenas não vá para tão longe ao sul)") + } +, + two:{ + dialogue:new Array( + "Aqui jaz(ilegível. Quem escreveu isso?). Ele foi impalado por um arco-íris!", + "Seria melhor com conquistas.") + } +, + three:{ + dialogue:new Array( + "Aqui jaz Burd. Os penhascos não estavam se sentindo muito amigáveis.") + } +, + four:{ + dialogue:new Array( + "Aqui jaz mochila. Nunca teve uma chance.", + "Pretensioso!") + } +, + five:{ + dialogue:new Array( + "Aqui jaz Savitch. Ele tentou consertar meu computador na garagem uma vez, e não tomou muito espaço enquanto o fazia. Três anos depois, ele ainda não tinha acabado. Então, ele caiu morto.") + } +, + six:{ + dialogue:new Array( + "Aqui jaz Dave. Ele não era muito inspirador.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---MUNICÍPIO DE YOUNG---^\nBem vindo ao Município de Young. Por favor tome cuidado com alguns dos cidadãos.^ Eles não sabem brincar... tome cuidado. O Município de Young foi fundado nos anos 90 pelo prefeito Ying como parte de uma série de projetos habitacionais ainda em andamento, o nome foi escolhido levando em conta o fato de que Ying nega possuir o nome de Ying e que afirma possuir o nome Young.^ Esperamos que tenha uma ótima estadia.") + } +, + two:{ + dialogue:new Array( + "Ao Oeste se localizam os lendários templos do Aquele que Vê.^ No leste está a maravilhosa moradia do Prefeito Ying, que está fechada para visitas do público - invasores cuidado.") + } +, + three:{ + dialogue:new Array( + "Em sua quinta visita, Prefeito Ying se frustrou com a falta de estacionamentos. Esse estacionamento reflete a frustração do Prefeito Ying com a falta de estacionamentos. Ying ocasionalmente estacionava nesse estacionamento em suas visitas subsequentes.") + } +, + four:{ + dialogue:new Array( + "Eu lembro das longas frases que eu costumava escrever. Ha! Fragmentadas!") + } +, + five:{ + dialogue:new Array( + "UMA SITUAÇÃO PERIGOSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "Aquele que Vê sabe de tudo e conduzirá um para a iluminação. O caminho para a iluminação não é iluminado por tochas.") + } +, + two:{ + dialogue:new Array( + "Não se distancie do caminho do Aquele que Vê, nem mesmo pelos tesouros nos mais distantes cantos do labirinto.") + } +, + three:{ + dialogue:new Array( + "Mova-se.") + } +, + four:{ + dialogue:new Array( + "Não irrite os Procuradores com violência.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "MARCO CÊNICO:Torres Parceiras. Construídas há algum tempo, as Torres Parceiras negligenciavam as montanhas distantes. A primeira torre foi danificada previamente e desde então foi reaproveitada. A segunda ainda está de pé ao leste, alcançando o céu. Devido a motivos de segurança, o caminho para a torre foi desativado até aviso prévio.") + } +, + two:{ + dialogue:new Array( + "AVISO DE SEGURANÇA PÚBLICA:^\nDizem que esta torre, enquanto não danificada, tem uma fenda dimensional no seu topo. Prossiga com cuidado e mente aberta.^\n -- A GERÊNCIA") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "A estátua não está com cara de que irá mover.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Parece que a estátua está firme.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Esta estátua não parece ser móvel.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Fogo é algo belo, não é? Que pena que o brilho dos postes de rua escondam o fogo das estrelas.") + } +, + after_fight:{ + dialogue:new Array( + "Certo, as estrelas não são feitas de fogo. ^Quem se importa?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "Como vai você? Sou o governante dessa partição e Interpretação do espaço.", + "Você quer saber por que eu sou o governante deste local? Eu lhe direi, mas essa é uma longa história. Digo, realmente longa. Ofensivamente longa.", + "Vai demorar mesmo. Não estou brincando! Tenho tendência a tagarelar. Talvez seja melhor você ir atrás daquele baú alí. Ou ir em direção ao hotel lá longe. Não sei como ele chegou aqui, mas sei que eles cobram barato. Não que o dinheiro tenha algum valor aqui.", + "Por que eu sou o governante?^... Eu não tenho certeza, meus amigos que me colocaram nessa posição, devido ao estado imediato deste espaço. Talvez seja isso pois cubos são os melhores quando se trata de ficar parado em superfícies planas. Quanto ao porquê de alguém precisar ficar aqui - eu não faço ideia!", + "Os outros - meus amigos ali - tem seus próprios méritos.^ Não é como se eles não tivessem a capacidade de sentar aqui no futuro, eles apenas são incapazes no momento.^ De vez em quando, nós trocamos de governante, mas todas as vezes, temos de reinterpretar essa região do espaço! Talvez o Sr. ou a Sra. Pirâmide venham até aqui porque decidimos transformar o trono em um formato para melhor encaixá-los, re-imaginando esse mundo, por assim dizer.^ Isso soa meio estranho? Talvez. Mas é assim que as coisas são. Tudo acontece muito rápido. Minutos, horas - náo é necessariamente um longo reinado.", + "Apesar de que, quando eu sou o governante, eu me sinto estranho...^ De alguma forma me sinto isolado, querendo se afastar dos outros...", + "...isolado não é palavra que quero, mas ela cobra parte do sentimento. Eu não estou isolado, e eu não desgosto dos outros. Nós nos consideramos amigos, mas você sabe, ninguém passa por aqui a não ser para falar algumas palavras. Assim eu tenho que pensar sobre alguma coisa ou enlouqueço! Talvez seja por causa do isolamento.", + "Fora as questões fúteis do porque estamos ocupando esse espaço, estou curioso com o porquê de sermos amigos.", + "Eu gosto de pensar que sempre que estamos de acordo com as Interpretações de que sou o melhor para governar, eles me dão conforto em ter a capacidade de manter essa posição pelo tempo que for necessário para atingir a próxima Interpretação. Sabe, encorajamento e coisas do tipo, a presença física deles, essas coisas me confortam.", + "Suponho que isso é o suficiente para me satisfazer, apesar de que seria legal se um ou dois deles entendessem como me sinto como governante. Não que eu esteja reclamando sobre o encorajamento! Talvez um dia, nós possamos ter vários governantes...quem dera! Talvez isso implique que quando eu não sou o governante, devo agir da mesma maneira que às vezes gostaria que agissem...quem sabe se isso pode ser feito.", + "Já falei demais. Se você for na outra direção, encontrará outra região similar do espaço, apesar de eu achar que ela cheire um pouco diferente.", + "Foi um prazer lhe conhecer.", + "Ah, quer ouvir minha história mais uma vez?", + "Tudo bem, vamos lá.") + } +, + gray:{ + dialogue:new Array( + "Olá. Eu sou o governante dessa parte do espaço.", + "O que? Quer saber por que eu estou aqui? Tem certeza? Vou precisar de muitas palavras para explicar!", + "Bem, se você insiste. Embora você se sairia melhor indo para aquele hotel lá longe. Não sei por que o construíram. Se eu tivesse algum dinheiro para ser taxado, certamente reclamaria!", + "Bem, mesmo eu sendo o governante dessa parte do espaço, eu não governo ninguém.", + "Esses meus amigos - todos são governantes de suas próprias partes do espaço. Ninguém governa ninguém, estamos todos sós nesse aspecto. Mas não estamos sós quando se trata de falar uns com os outros, e em outras formas também não estamos sozinhos. Esse é apenas um lugar em que eu existo.", + "Meus amigos e eu - nossas partes do espaço tem muito em comum quando se trata da razão delas existirem e como estão organizadas. Interesses e desejos similares. Nós gostamos de conversar sobre como governar, e coisas do gênero.", + "Mas o trágico é que raramente nós encontramos em forma física.", + "Você não está falando com suas formas físicas, mas com suas representações em forma holográfica.", + "Eu sei, é lamentável. É lamentável porque nós temos tanto em comum, mas estamos limitados em como podemos nos ajudar como amigos.", + "Algo bem pequeno falta quando você não tem conversas físicas frente a frente o tempo todo.", + "Mas eu não estou reclamando. É melhor do que nada! Não consigo imaginar como seria sem isso. Algo terrível.", + "Foi agradável falar com você, boa sorte com o que você estiver fazendo.", + "Você ainda está aqui? Eu posso te contar tudo outra vez, se você quiser.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Ei valentão! Não tenho medo de você!", + "Crickson:Ei cabeção! Não vou fugir! Nem mesmo se você tentar me bater!", + "Crickson:Você é só um vassoureiro, é isso que você é! Você devia ter vergonha nessa cara!") + } +, + thorax:{ + dialogue:new Array( + "Tórax:Eu sou o tórax, eu falo em nome das abelhas.\n^Seu destino é incerto, não faz parte do conhecimento delas.\n^Trabalhadores de certas colônias decolaram!\n^Com isso tais colônias estão morrendo, não é bonito de se ver!", + "Tórax:Talvez seja um vírus ou um novo pesticida,\n^talvez sejam as larvas das malditas moscas Phoridae!\n^As abelhas estão agindo de forma estranha.\n^O que quer que seja, tem que mudar!", + "Tórax:Certo, eu não sei o que está acontecendo\n^Temo que meus esforços sirvam para nada além de tagarelar.\n^Mas como eu posso ficar aqui sentado e não fazer nada para ajudar?\n^Já sei - irei postar no Facebook, Twitter e Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Compre meus produtos!") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade!", + "Não irei largar! Nem em um milhão de anos!") + } +, + inside:{ + dialogue:new Array( + "Ah, veio aqui pra me aterrorizar mais um pouco?", + "Você está se aliando aos gatos só porque eles são macios e fofinhos.") + } +, + etc:{ + dialogue:new Array( + "O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade!^ AAAAAA!^ Isso aí--^ OUTRO GATO?!?!^ AAAAAAAAHH!!!", + "Você... você limpou minha casa... Estou emocionado! Aqui, quero lhe dar a minha mais bela posse!", + "Young abre o baú. Algo se encontra dentro dele!", + "Icky:Ah, Ei Miao.^\n\nMiao:Ainda bem que você está a salvo!^\n\nIcky:Ah... obrigado pela ajuda, Young.", + "Icky:Pra ser honesto, eu meio que gosto de sentar em caixas.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Ah!! Você é Young, O Escolhido!! Aimeudeus, que honra! Meu nome é Miao Xiao Tuan Er, Escolhido-em-treinamento!", + "Posso acompanhá-lo por um tempo para observar O Escolhido em ação?", + "Olá mais uma vez, Young! Posso ser sua sombra hoje?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Ei, Young... você já roubou algo?", + "Miao:Eu gosto da Mitra... e Wares não é uma bicicleta elegante?", + "Miao:O que é essa coisa feita de pedra, Young? Ela faz você voltar no tempo?", + "Miao:Estou começando a ficar preocupado com Icky... Young, você viu um gato bem grande recentemente? Icky disse que ia fazer uma caminhada pela pequena floresta ao leste.", + "Miao:Icky disse que eu não deveria ir para lugares perigosos. Vejo você depois, Young.", + "Miao:Você já sentou em uma pilha de sacolas de supermercados?", + "Miao:Ei Young, você acha que é errado usar erva-de-gato?", + "Miao:Aposto que deve ter dado muito trabalho se tornar O Escolhido, né, Young?") + } +, + philosophy:{ + dialogue:new Array( + "Aquela situação perigosa com o Icky me fez pensar... O que você acha que acontece depois que morremos? Como alguém consegue atingir um propósito em apenas uma vida?", + "Talvez reencarnemos várias vezes até completar nosso destino. Ou isso deixaria tudo fácil demais?", + "E qual é a recompensa por completar nossa jornada? Nós apenas se dissolvemos no nada?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Ah. Oi, Young.", + "Meu nome real não é Icky. É Ichabod.", + "Espero que Miao Xiao Tuan Er não tenha se metido em muitos problemas.", + "Até logo, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "E aí firmeza, como vai você? Você me achou! Eu vou continuar aqui, de qualquer forma. Está frio lá fora.", + "Você pode me culpar por todas essas terríveis salas! Eu as fiz com o editor de mapas DAME.", + "Eu criei esse jogo com a IDE FlashDevelop e com o framework Flixel AS3!", + "Ah, é, e eu fiz a trilha sonora com o REAPER. E algumas vezes Audacity.", + "Eu consigo meus nutrientes através da radiação de todos esses computadores... ^Como assim isso não é biologicamente correto?", + "Oi mãe! ^E pai!", + "Quer saber como finalizar o jogo em 20 minutos?", + "Ha! Como se eu fosse contar pra você!", + "(...talvez se você pedir gentilmente...)") + } +, + marina:{ + dialogue:new Array( + "Uau ei!", + "Eu escrevi um monte de diálogos para esse jogo!^(...mas não esse. Melos está fazendo isso.)", + "Eu usei Adobe Photoshop CS5, Graphics Gale Free Edition e a Ferramenta de Captura do Windows 7 para fazer os gráficos!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "A umidade aqui é boa para sua pele, mas ruim para seu cabelo.", + "Eu gosto daqui. Ultimamente, as pessoas passam todo o verão indo do calor infernal para o frio do ar condicionado. Essas mudanças rápidas de temperatura enfranquecem seus ossos.", + "É como aquele maldito hábito de mastigar cubos de gelo. Minha mãe fazia isso lá pros 25 anos. Agora ela tem fissuras por todos os seus molares.") + } +, + second:{ + dialogue:new Array( + "Lembre de trocar de sapatos e enchê-los de jornais para os deixar secos. Você não quer criar um terreno fértil pra bactérias, não é?", + "Por que buffets só servem gelatina vermelha? É como se eles quisessem nos dar câncer.") + } +, + bomb:{ + dialogue:new Array( + "Sai de perto.", + "Falo sério... me deixe em paz.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Não preciso da sua piedade, Young.", + "Certo, vá viver no seu mundinho feliz, \"Escolhido\"...", + "Young, amizade é só um truque que as pessoas aplicam em si. Somos todos babacas, e no fim, estamos todos sós.", + "Hah, eu sabia que você me odiava, Young.", + "Eu estou bem.", + "É claro que você não se importa. Ninguém se importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "Eu sei que cidades podem ser sujas, lotadas e tudo mais, mas eu gosto de vir aqui e olhar todas as luzes.", + "É belo de uma forma única. Não é infinito como as estrelas, mas existe algo sobre sua humanidade que adiciona uma camada maravilhosa de complexidade.", + "Atrás de cada luz se encontra uma pessoa com esperanças, medos e segredos... olhando dessa forma é terrivelmente solitário e ferozmente pessoal.", + "Eu acho que amo todas as pessoas por atrás de cada janela. Eu amo vocês, pessoas, por serem minhas estrelas. Eu amo vocês não importando o quão fudida sua vida é ou o quanto vocês acham que caíram. Vocês são amáveis nesta noite...", + "Desculpe, falei demais. Obrigado por escutar.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eiiiii, parceiiiirooo...descanse um pouco, fique por um tempo, que tal?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! Você me achou!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Você foi atingido por um pedregulho na subida? As vezes eu arremesso pedregulhos quando estou com raiva. Me desculpe se foi atacado por algum.", + "Golem:Minha mãe sempre dizia que se eu continuar com isso, um dia eu não teria mais montanhas para arremessar.") + } +, + second:{ + dialogue:new Array( + "Golem:Quando você é uma pedra, você presencia geraçôes de pessoas indo e vindo. Você se torna mais ancião e sábio que o mais sagaz dos humanos.", + "Golem:Pelo menos, essa é a ideia. Eu quebrei meus binóculos um tempo atrás e assim eu não sei mais dizer o que tem ocorrido.", + "Golem:De fato, eu não sinto falta de assistir as pessoas, é muito entediante.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Ah, sim, eu conheci alguém que estava meio perdido...ele me contou que estava indo para a praia.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "Não sou uma lagosta, sou um langostino. Meu nome é Hews.", + "Hews:Sabe qual é a melhor parte do oceano? O horizonte.", + "Hews:O oceano é como um pedaço salgado do universo.", + "Hews:Um praia lotada é desprovida de sua graça.") + } +, + second:{ + dialogue:new Array( + "Hews:Já ouviu falar do Estomatópode? Ele possuí 16 fotorreceptores que o permite perceber luz ultravioleta. Você consegue imaginar ver uma grande variedade de cores?", + "Hews:Talvez seja belo. Enfim, nós já achamos razões demais para nos odiar com as cores que temos.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Está procurando por alguém, é? Lembro que estava sentado aqui quando algumas nuvens taparam o sol. Nesse momento, alguém veio me perguntar sobre algo. não lembro o que era, mas foi embora dizendo que iria em direção a floresta.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Frutas são um bom tipo de comida. Eu gosto de frutas.", + "James:Por favor, certifique-se de não defecar nas frutas.", + "James:Até agora nessa estação do ano eu tive relações sexuais 18 vezes. E também, eu comi 389 porções de frutas.", + "James:Você tem alguma fruta para James?") + } +, + second:{ + dialogue:new Array( + "James:Eu escrevi um poesia:\n^Eu gosto de comer frutas\n^Elas me deixam batuta\n^Eu gosto muito de frutas\n^Até mais do que trutas!", + "James:Você prefere framboesas ou mirtilos?", + "James:Você tem alguma fruta para James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Uma pessoa passou por aqui. Não queria frutas. Ela foi em direção a parte sudeste do lago a oeste.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olivia:Olá, eu sou Olívia a coelha.", + "Olivia:Eu tenho um monte de cereal para comer ainda! Eu amo cereal.", + "Olivia:Essa caixa é tão grande. Ela nunca acaba!", + "Olivia:Cereal infinito!", + "Olivia:Hmmm...talvez isso não seja algo ruim.") + } +, + bush:{ + dialogue:new Array( + "Rank:Hahaha, Young seu bobo. Uma vassoura não serve para cortar arbustos!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:Eu corto arbustos para me manter. As vezes quando você corta um arbusto e encontra ouro! Ahaha!", + "Rank:A economia não vai muito bem debaixo deste arbusto aqui.", + "Rank:As vezes é díficil manter minha mulher e filhos apenas cortando arbustos--nem sempre temos o suficiente para comer... mas sempre temos uma lareira acesa! Ahaha!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:Ah? Sim! Uma pessoa passou por aqui. Disse que estava indo para o labirinto subterrâneo...Aposto que lá tem uma vários arbustos, né, Young? Ahaha!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Ah ei, como está se sentindo?", + "Marvin:Onde está Justin?", + "Marvin:Não tem nenhum foguete de garrafa por aqui...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:Bob o Hamster gosta de falar de si mesmo na terceira pessoa.", + "Bob:Apóstrofos são artimanhas do s'atanás.", + "Bob:Quieto! Estou ocupado exalando uma aura de ambiência hamstérica.", + "Bob:... Supunho que você só melhora fazendo... Mas... se você faz algo errado, você se torna melhor a fazer esse erro?", + "Bob:Um homem de verdade nunca chora... bem, talvez ele deixe uma única lágrima cair do canto de seus olhos através da sua face enrijecida pelo sol enquanto ele dirige sua estilosa Harley através do deserto de Mohave sem usar capacete ou óculos protetor. Mas ele nunca chora.", + "Bob:Esse jogo foi criado por um número infinito de macacos trabalhando em um número infinito de máquinas de escrever.", + "Bob:Sinto falta do James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Curry é amarelo e apimentado!", + "Kuribu:Para o oponente sagaz, ferimento aumenta!", + "Kuribu:Você recebeu a experiência de 2!", + "Kuribu:Tome meu número de telefone! 0800 meiamolemeiadura") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "O QUE eu estou fazendo aqui? Boa pergunta! Encontrei esse lugar por acaso. Estou me escondendo. Aqui é seguro, se você não se aventurar tão longe e deixar esses caras te encontrarem.", + "Parece que sou relativamente afortunado. Todos esses mortos espalhados pelo chão - como eles morreram? É um pouco fascinante, tentar imaginar como tudo ocorreu. Foram atacados por monstros? Tropeçaram e caíram nos espinhos?", + "É um pouco medonho. Espero que isso não aconteça comigo. Dor física é algo térrível para se ter.") + } +, + quest_event:{ + dialogue:new Array( + "Ah... pensando nisso, uma pessoa passou por aqui um tempo atrás. Disse que estava procurando por algo...até parecia um pouco com você! Não lembro quando, desculpe. É díficil manter noção do tempo aqui. Mas lembro que ela estava indo para uma cidade próxima.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Olá.", + "Está procurando por algo?", + "O que é que você está olhando?", + "Não, não sou dessa cidade. Estranho, você pode me ver e falar comigo, mas eu não consigo Interagir com nenhum deles. Tem um monte de assassinos por aí, e ninguém parece notar. Isso é estranho.") + } +, + quest_event:{ + dialogue:new Array( + "Sim. Eu vi uma pessoa passar por aqui. Ela estava a procura de algo. Não sei o que esse 'algo' possa ser. Foi embora depressa. Disse que estava indo em direção a uma área alternativa do espaço. Me soou extravagante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "EI EI EI - - - QUEM É VOCÊ ? ? ?", + "EU SOU UM VAGANTE . . . ESSA É UMA DAS PARADAS MAIS POPULARES NA JORNADA ENTRE B E A .", + "O QUE É 'A' ? ? ? É MINHA CIDADE NATAL . . . ESTOU VISITANDO UM VELHO AMIGO EM B . . . É UM LONGO CAMINHO . . . MAS EU FAÇO SACRIFÍCIOS . . . VOCÊ NÃO ? ? ? DEIXA A VIDA MAIS ANIMADA ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "AHH - - - PROCURANDO POR OUTRO HUMANO - - - ENTENDO . ^ DEIXE-ME ACESSAR MINHA MEMÓRIA . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA . . . \n A PESSOA TEVE UMA IDÉIA SUBITA E DISSE QUE IRIA PARA UMA CABANA EM UM CAMPO BEM CUIDADO. \n PENSANDO NISSO . . . VOCÊ É IDÊNTICO A ESSA PESSOA ! ! ! TEM CERTEZA QUE NÃO ERA VOCÊ ? ? AHN ? MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "Você estava... ah, um. Bom trabalho.", + "A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha que sair de novo(Estava ficando muito claro aqui, isso sempre acontece)- a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\"") + } +, + quest_event:{ + dialogue:new Array( + "A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha de sair de novo(Estava ficando muito claro aqui, isso sempre acontece)- a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "OLÁ. JÁ ENCONTROU O cubo?", + "cubo É UM ÓTIMO GOVERNANTE DESSA PORÇÃO DO ESPAÇO. NÓS OUTROS GOVERNANTES DAMOS NOSSO MELHOR EM NOSSO ESPAÇO TAMBÉM.") + } +, + gray2:{ + dialogue:new Array( + "O QUE VOCÊ ACHA DESSE PEDAÇO DE ESPAÇO? É UM ÓTIMO LUGAR, NÃO É?", + "UMA INTERCESSÃO DE MUNDOS!") + } +, + gray3:{ + dialogue:new Array( + "NENHUM DE NÓS PIRÂMIDES CINZAS ESTAMOS DE FATO AQUI. USAMOS APARELHOS ESPECIAIS QUE NOS PERMITEM NOS PROJETAR AQUI.", + "POR QUE FAZEMOS ISSO? PORQUE QUEREMOS FALAR COM NOSSO AMIGO cubo E FAZÊ-LO COMPANIA.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...O APARELHO DE HOLOGRAMA ESTÁ FUNCIONANDO CORRETAMENTE?", + "NÃO?^...^DROGA!") + } +, + color1:{ + dialogue:new Array( + "Já conheceu o CUBO? Ele faz muitas coisas maneiras! Ouvi dizer que uma vez ele ficou na beirada por quase doze segundos! Sabe o que isso significa para a Liga da Beirada? Não? Muito!") + } +, + color2:{ + dialogue:new Array( + "Cubo faz coisas Interessantes!", + "Você sabia? Aparentemente, minha vez de governar está próxima! Faltam apenas alguns minutos, acredito.") + } +, + color3:{ + dialogue:new Array( + "Eu venho do Pão de Açúcar, em direção a Taipei. Por que estou aqui? Eu parei para cumprimentar o CUBO!", + "Não fique triste! Esse lugar é uma representação estranha apenas para não amedrontar os visitantes. É praticamente inofensivo, até onde sabemos.") + } +, + colordead:{ + dialogue:new Array( + "(...está tirando um cochilo?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "CADA GERAÇÃO NASCE DA DOR PARA MORRER EM DOR. NÃO IREMOS SOFRER PARA REPRODUZIR O CICLO. NÓS NÃO IREMOS PARA FORA.") + } +, + after_fight:{ + dialogue:new Array( + "ESTE É O SEU CASTIGO POR NOSSA REBELIÃO?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Porque você priva o Aquele que Vê de seus sacrifícios? Por que você roubou de nós nossa salvação?") + } +, + after_fight:{ + dialogue:new Array( + "...Nós falhamos em fazer você pagar por sua Interferência. E ainda assim... você nos devolveu a chance de ser livres. Obrigado, Young. Que o Aquele que Vê olhe positivamente para você mais uma vez.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Muito bom te ver, Yang. Faz tanto tempo. Ainda jogando esses nantendo, não é?") + } +, + after_fight:{ + dialogue:new Array( + "Meu Deus, Yon, quando é que você vai crescer? Você sabe que terá que aprender a lidar com pessoas mais cedo ou mais tarde.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Nós temos as melhores amenidades aqui. O que acha da nossa piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "O que me diz do nosso centro de fitness com tecnologia de ponta?") + } +, + after_fight:{ + dialogue:new Array( + "Esperamos que tenha desfrutado de sua estadia!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Hoje é um bom dia.", + "Obrigado por coçar meu pescoço - Eu não estava conseguindo alcançar.", + "Ouvi dizer que os ovos do restaurante local são muito bons. E ainda por cima tenho cupons para eles.", + "Viu o acidente de carro de hoje? Horrível! Ele estava usando celular. Que pena, era tão jovem!", + "Meu filho não conseguiu entrar para o time júnior do colégo. Decepcionante. Nós investimos tanto em sua carreira esportiva.", + "Hoje é o dia de ação de graças. Sou grato por muitas coisas. Mal posso esperar para as promoções de amanhã cedo. Vou conseguir um monte de barganhas.", + "Ah, acho que chegarei atrasado no trabalho.", + "Estou apressado para chegar em casa, preciso arrumar tudo antes dos sogros chegarem.", + "Estamos tendo uma venda de garagem!", + "Bem vindo!") + } +, + words_teen:{ + dialogue:new Array( + "Eu não vi o filme mais recente.") + } +, + words_kid:{ + dialogue:new Array( + "Nunca terei a chance de ver o novo desenho animado!") + } +, + family:{ + dialogue:new Array( + "Bem vindo a nossa casa, estranho! Você me parece familiar. Esta é uma cidade pacata. Bem quieta, sem muitos visitantes.", + "Você curte Davement? Meu irmão Dave me mostrou uma música deles muito maneira!") + } +, + older_kid:{ + dialogue:new Array( + "Meus amigos gostam de ouvir 'None Surprises' daquela banda chamada 'Rayhead' e reclamar sobre este local. Tudo bem, é uma espécie de bolha, mas pelo menos mostrem alguém respeito!", + "Acho que vou escrever para meu blog.", + "Você parece estar confuso.", + "Eu tenho problemas para ouvir meus pensamentos quando esportes e coisas do tipo estão passando na TV, mas meus pais gostam disso.") + } +, + hanged:{ + dialogue:new Array( + "Uma anotação no corpo:\"Colocando-me em perigo não mais.\"") + } +, + festive:{ + dialogue:new Array( + "Ah, tem algo acontecendo lá fora? Um festival? Um desfile?", + "Parece que há uma baita comoção lá fora! Já olhou na janela recentemente? O que será que é?") + } +, + paranoid:{ + dialogue:new Array( + "Minha casa tem muitas janelas. Eu não gosto de janelas. É como se alguém estivesse olhando para dentro. E no fundo você sabe que TEM algo acontecendo lá fora. não pode ser apenas silêncio o tempo todo. É pertubador.", + "Assassinos? O que? Lá fora? Você tá de brincadeira?", + "Por favor saia daqui.") + } +, + dead:{ + dialogue:new Array( + "O corpo desta mulher foi atacado por uma arma de ponta cega.", + "O homem, cegamente, bem...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Ah, é você! Você me parece familiar...Eu não posso me mover até você matar mais desses habitantes da cidade, lembra? Volte aqui mais tarde.", + "De acordo com esse panfleto...você só tem que matar mais um pouco de pessoas! Continue assim!", + "Só precisamos de mais um corpo, e depois continuamos.", + "Muito bem. Sinta-se livre para entrar. Não faço idéia do que tem lá dentro. Nos vemos depois, mesma hora amanhã, certo? Ou na noite seguinte?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "Não me importo em ser observado pelas árvores.", + "Cadê ela?!", + "Eu estarei com você Young, sempre que estiver sozinho.", + "Você é um Ookchot? Mamãe sempre me avisou para ter cuidado com os perigosos Ookchot.", + "Jello falando, Young! Muito bom finalmente poder lhe conhecer! Por que não fica aqui uns minutos? Eu estou acabando de preparar chá.", + "Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Coro, Púlpito, Altar, Janelas de Vidro Tingido...", + "Oferta por tempo limitado! Compre um, leve dois - apenas hoje!", + "Lembra daquela vez que você acendeu uma vela quando a energia estava falhando?", + "Hmmmm, seu travesseiro estava confortável noite passada.", + "Isso vai lhes mostrar que não devem me chamar do cara da fumi-GAY-ção.", + "Wares e Eu fazemos uma boa equipe.", + "Eu sou o Escolhido-em-treinamento!", + "Você já teve a sensação, de que não importa o que você faça, você não consegue impedir o mundo de morrer?", + "Cuidado com os cogumelos florestais...", + "Me desculpe. Essa é minha natureza.", + "O que você quer dizer com \"só uma pedra\"?? Pedras podem ser cartas também!", + "Dê um peixe para um homem e ele terá comida por um dia. Ensine um homem a pescar, e ele terá bons momentos com seu filho, Jimmy.", + "As vezes a resposta é fazer uma caminhada.", + "Porque morcegos aparecem do nada, sempre quando você chega?", + "NÃO, *VOCÊ* QUE PRECISA DE APARELHO!", + "ESTÁ SATISFEITO?", + "Não venha com violência pra cima de mim.", + "Sempre quis participar do Iron Chef.", + "Minha mãe vivia dizendo, 'Se você fizer esse arco por tempo suficiente, sua coluna ficará assim!'", + "Está entretido, humano?", + "...", + "Existem cerca de 4.800 espécies de sapos.", + "HAHAHAHA! É! Eu sei!", + "Ah, você coleciona cartas também? Que crescido, Ying.", + "Todos vivem dizendo, \"Saia do computador! Ou você nunca vai fazer amigos!\"", + "Eu sou o governante apenas pela duração dessa conversa.", + "Aposto que você acha que está 'tornando meu trabalho mais Interessante'!", + "Odeio diagonais.", + "Nem pensei usar essa droga de claritin perto de mim.", + "Raspe essa carta para destravar a porta para seu quarto!", + "Estou fazendo um ótimo trbalho.", + ".......??", + "Quem foi que nos esculpiu mesmo?", + "Espero que tenha desfrutado de sua estadia.", + "Para você chegar a esse ponto, você deve ser muito Interessante.", + "Só estou aqui para lhe tirar do caminho.", + "Você é como uma pirâmide para nós, também!", + "É a mesma maldita peça, noite após noite, e o salário é uma droga.", + "Me deixe em paz! Meu nome não é Sachs!", + "Pelo menos eu não sou um bastão.", + "Como assim dinheiro não nasce em árvores? Ahahahah!", + "Eu não passo de uma ilusão.", + "EU VOU DESCONTAR TUDO EM VOCÊ.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Pressione", + "para configurar\nos controles.", + "para cancelar.", + "Cima", + "Baixo", + "Esquerda", + "Direita", + "Pulo", + "Ataque", + "Menu", + "Pressione", + "para sair", + "para configurar os controles.") + } +, + title:{ + dialogue:new Array( + "Por favor use as setas\npara redimensionar a\njanela até que não\nseja possível visualizar\náreas pretas ao redor\ndas bordas. Pressione\n", + "para finalizar.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Pressione", + "para iniciar", + "Versão", + "Continuar", + "Novo Jogo", + "Tem certeza?\nNão\nSim", + "Mesmo?\nNão\nSim", + "Não vai ter volta!\nEsqueça\nEu sei", + "mortes", + "cartas", + "Anodyne suporta\na maioria dos controles.\n\nDeseja usar um?\n\nSim Não\n\nSe sim, conecte-o agora.\n\nMova com as setas\n\nEscolha com\nC, ESPAÇO, ou ENTER\n\nEscolhendo \"sim\" em\n", + "AVISO\n\nSe estiver sofrendo atraso dos comandos durante o jogo,\nfeche e\nabra Anodyne novamente.\n\nPRESSIONE C PARA CONTINUAR", + "Pressione VOLTAR para sair.") + } +, + elevator:{ + dialogue:new Array( + "Andar?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancelar") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "Salvando...") + } +, + map:{ + dialogue:new Array( + "Mapa", + "Sala Atual", + "Entrada/Saída", + "Sem Mapa", + "Voltar para\no Nexus", + "Voltar para\na entrada") + } +, + items:{ + dialogue:new Array( + "Itens", + "Normal", + "Troca", + "Extensão", + "Ampliação", + "Um par de sapatos com mola - pressione", + "para pular!", + "Um par de sapatos de ciclismo.", + "Uma caixa de papelão vazia.", + "Uma chave encontrada no Templo do Aquele que Vê.", + "Uma chave encontrada numa caverna subterrânea vermelha.", + "Uma chave encontrada numa caverna nas montanhas.") + } +, + cards:{ + dialogue:new Array( + "Cartas", + "cartas") + } +, + save:{ + dialogue:new Array( + "Salvar", + "Salvo!", + "ERRO", + "Salvar e ir\npara a título", + "Ir para título", + "Salvar e sair", + "Sair do jogo", + "Mortes:") + } +, + config:{ + dialogue:new Array( + "Config", + "Definir control", + "Definir volume", + "Salvar em\ncheckpoints:", + "Ligado", + "Desligado", + "Mudar Resolução:", + "Configurar UI", + "Touch + D-Pad", + "Somente D-Pad", + "Apenas Touch", + "Tipo de Movimento", + "Resolução:", + "Janela", + "Multiplicado", + "Esticado", + "Escala:", + "Idioma:", + "ja", + "en", + "ko", + "arraste os\nbotões\naté estar\n satisfeito.\n\nDepois, toque\no menu\npara continuar.\n\n", + "Redimensionar\nJanela", + "Configurar controle") + } +, + secrets:{ + dialogue:new Array( + "Você está mandando brasa!", + "Antiga propriedade do Mago das Bolhas.", + "Se os gráficos ficarem estranhos, procure pela descrição oficial do Pakidex sobre algum Pakimon.", + "esse coração não tem nome", + "Por favor visite o mundo dos monstros eletrônicos.", + "Uma estátua de um gato. Fofo, mas inútil.", + "Aí meu deus!!!!", + "Ah não!!!", + "É preto.", + "É vermelho.", + "É verde.", + "É azul.", + "É branco.", + ":Selecionar", + ":Voltar") + } +, + swap:{ + dialogue:new Array( + "Desculpe!", + "A troca não funciona aqui.", + "Young não tem forças para usar a troca aqui.") + } +, + keyblock:{ + dialogue:new Array( + "Esta porta está trancada.") + } +, + treasure:{ + dialogue:new Array( + "Alguma força estranha impede que este baú se abra.", + "No cabo da vassoura está escrito:Pressione\"", + "para varrer.\"", + "Essa chave pode ser usada uma única vez para abrir uma barreira trancada.", + "Um misterioso par de sapatos, nele está escrito uma única coisa\"Pressione", + "\".", + "As poucas palavras gravadas nesse artefato dizem:\"Equipe o acessório de AMPLIAÇÃO para fazer com que a vassoura solte poeira nociva para a esquerda e direita.\"", + "As poucas palavras gravadas nesse artefato dizem:\"Equipe o acessório de EXTENÇÃO para fazer com que a vassoura solte poeira nociva para frente.\"", + "As poucas palavras gravadas nesse artefato dizem:\"Olá, Young. Use esse aparelho de TROCA em dois objetos para trocá-los de posição. Ainda está longe do seu alcance poder usar isto em qualquer lugar, mas por hora irá lhe servir bem.\"", + "VOCÊ ACHOU UM CORAÇÃO!!! Saúde aumentou em...zero.", + "Ourudo:O que? Não está aqui? Aquele vendedor deve ter roubado!") + } +, + dust:{ + dialogue:new Array( + "Sua vassoura está cheia de poeira! Ataque novamente para colocá-la.") + } +, + checkpoint:{ + dialogue:new Array( + "Salvar jogo?\n Sim\n Não", + "Quando estiver em um checkpoint, pressione", + "para salvar e marcá-lo como ponto para continuar caso você morra.") + } +, + rock:{ + dialogue:new Array( + "Há algo escrito nesta pedra:", + "CÊ NÃO TEM AMIGOS") + } +, + door:{ + dialogue:new Array( + "O portal não parece estar ativo.") + } +, + keyblockgate:{ + dialogue:new Array( + "O portão permanece, imóvel. Ele não irá abrir até sentir quatro cartas...", + "Sentindo a presença de quatro cartas, o portão decide abrir...", + "O portão permanece teimosamente no lugar.", + "O portão sente a presença de todas as cartas, e decide abrir.", + "O portão sente a presença de um número suficiente de cartas, e decide abrir.", + "Abriu!", + "Permanece fechado.") + } +, + solidsprite:{ + dialogue:new Array( + "A placa aponta para o leste mas as palavras estão muito desbotadas.", + "A placa aponta para o oeste mas as palavras estão muito desbotadas.", + "A as palavras desta placa estão muito desbotadas.") + } +, + mitra:{ + dialogue:new Array( + "Ei, young!", + "Esses sapatos de ciclismo são para mim? Poxa! Obrigado, Young! Eu estava querendo um desses para usar com o Wares. Aqui, Young, tome meus sapatos em troca. Eles tem molas que permitem você pular bem alto! Você pressiona", + "para pular com eles!", + "Oi Young! Notou algo de diferente? ^... ^... Ah, bem, eu comprei um novo par de sapatos de ciclismo! Eles encaixam perfeitamente nos pedáis do Wares. Já que não vou mais precisar dos meus sapatos antigos, quero que você os tenha, Young! Eles tem molas que permitem você pular bem alto! Você pressiona", + "para pular com eles!", + "Enfim, tome cuidado!", + "Vá em frente, experimente-os! ...Eles não fedem TANTO assim.", + "Maneiros, né?", + "Uau, esses são os sapatos de ciclismo da loja do Finty? Você está dando eles para mim? Obrigada, Young, de verdade! Aqui, tome meus sapatos antigos--Acho que eles serão bem úteis para você. Há uma inscrição neles que diz:\"Pressione", + "para pular\". Nunca entendi o significado, porque não há um\"", + "\" em lugar nenhum neles...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Bem vindo, bem vindo, meu amigo Young! Meu nome é Prasandhoff--Finty Prasandhoff! Dê uma olhada pela minha loja e veja se algo lhe Interessa.", + "Finty:Eu ainda aprecio essa caixa!", + "Finty:Ah, uma caixa! Muito obrigado! Agora eu posso carregar todo meu inventário para casa a noite e de volta para cá pela manhã! Como símbolo da minha gratidão, tome essa feiosa--Digo, bela edição de colecionador dessa carta^", + "Espere...não está aqui! O que será que aconteceu? Bem, aqui, deixe-me aliviar seus ferimentos.", + "Como símbolo da minha gratidão, tome esses estilosos sapatos de ciclismo!", + "Bela manhã, não é, meu amigo? Uma bela manhã para compras! Como eu gostaria de ter uma caixa para carregar meu inventário comigo.", + "Que pena, parece que você não condições de comprar esse item! Volte mais tarde, quando tiver mais grana!", + "Finty:Ah, você é perspicaz! Você precisa de uma arma nova, não é? Mande seus inimigos para longe por apenas R$1113.73!", + "Finty:Esse saco de dinheiro permitirá que você acumule mais dinheiro que você acha pela Terra. Ele será seu por meros R$1937.90!", + "Finty>Ah ha ha, este sim é um item especial:sapatos de ciclismo para você ser veloz E estiloso! A venda por apenas R$668.23!", + "Finty:Cansado de perder tempo varrendo seu quarto com uma simples vassoura? Erradique toda as partículas de poeira com este aspirador de pó com tecnologia de ponta! Por apenas RS$1670.60 ou por, fáceis, parcelas mensais de R$445.48!", + "Obrigado!") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nCriado por\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n-------------", + "Criado de\n\nMarço, 2012\n\naté\n\nJaneiro, 2013", + "DESIGN\n------\nAmbos", + "PROGRAMAÇÃO\n-----------\nMelos, usando\nFlixel para\nActionscript 3.\n\n\n\nARTE\n---\nMarina\n", + "MÚSICA/EFEITOS\n---------\nMelos, usando REAPER\ne algumas\nsoundfonts livres.\n\n\n\nDIÁLOGO\n--------------\nPrincipalmente Marina\n", + "HISTÓRIA\n-----\nAmbos\nLocalização\nJaponesa:\nKakehashi Games", + "Um grande obrigado\npara nossos testers\nque sofreram\npor você!\n--------------\n\nMarina, por sobreviver\natravés dos bugs\niniciais.\n\nEtan, pelo\nconstante suporte\ndesde o início, pelos\nmuitos bugs,\ndescobertos e por\nser o terceiro\na jogar a maioria/n do jogo.", + "Olivia - valeu,\nmana!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos gostaria de\nagradecer a:\n\nMãe e Pai, pelo\nsuporte contínuo\nnessa empreitada.\n\nS\n\nMuitos TIGSourcers\ne outros devs\nconhecidos pelo\ncaminho!\n\nMarina, por tornar\nesse jogo possível,\ne por melhora-lo\nde formas incontáveis.", + "Adobe, Adam Saltsman,\ndevs do FlashDevelop,\ndevs do REAPER,\ncriador do DAME,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE meus outros\namigos\nque mostraram\nseu apoio.\n(Obrigado!)\n\nE por último, mas\nnão menos\nimportante,\nTina Chen,\namiga de longa\ndata, pelo suporte\ne por me apresentar\nao Marina.", + "Marina gostaria de\nagradecer...\n\nColin Meloy, por\nexpandir\nmeu vocabulário\n\nTsugumo, por\n\"So You Want to\nBe a Pixel Artist?\"\n\nMinha família,\npelo apoio e comida.\n\nDaniel, por ser um\n\"indie game dev\"\ncomigo no passado.", + "Mo, por acreditar\n em mim.\n\nTina, por me\napresentar ao Melos.\n\nMelos, por fazer\num jogo\ne confiar em mim\ncomo grande parte\ndo processo.", + "ELENCO\n----\n\n\nGosma\n\n\nChato\n\n\nPei Pei\n\n\nEscudito\n\n\nVisionário", + "Movedor\n\n\nLiga Desliga\n\n\nQuatro Tiros\n\n\nCortador\n\n\nRogue\n", + "Cachorro\n\n\nSapo\n\n\nRodador\n\n\nPessoa\n\n\nParede\n\n", + "Rato\n\n\nCara do Gás\n\n\nPeixinho-de-Prata\n\n\nCorrredor\n\n\nRolador\n\nVigia\n\n\n", + "Empregada\n\n\nPlanta Explosiva\n\n\nGerente\n\n\n", + "Leão\n\n\nContorcionista\n\n\nPilar de Fogo\n\n\nServos\nArthur\nJaviera", + "Seguidor\n\n\nEduardo\n\n\nPescador\n\n\nCaminhante Vermelho\n\nHews", + "Coelha\n\n\nIcky\n\n\nVendedor\n\nMiao Xiao Tuan Er\n\nRank\n\nOurudo", + "Tórax\n\nJames\n\nCogumelo\n\nCrickson\n\nGolem\n\nSuburbanos", + "Perseguidor\n\n\nEntidades\n\n\nCaras Espaciais\n\n\Reis Cubo", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "E nós gostaríamos\nde agradecer a\nVOCÊ!\nPor jogar\nnosso jogo.\nEsperamos que\ntenha gostado.", + "\n\n\n\n\n\n\n\n", + "Agora você tem o\npoder de explorar\no mundo de young\nsem(quase)alguma\nlimitação, através\nda troca.") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/NPC_Data_ZHS.hx b/AIR/intra/hsrc/data/NPC_Data_ZHS.hx new file mode 100644 index 0000000..31f6e75 --- /dev/null +++ b/AIR/intra/hsrc/data/NPC_Data_ZHS.hx @@ -0,0 +1,3949 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_ZHS { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "喜欢音乐吗? 那就和那个终端机对话吧!", + "喜欢疼痛吗? 那就一路向南行吧!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "那名杂技演员快要失去平衡了! 安全网在哪里?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "狮子们正在包围那名杂耍人!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "荆棘:我累了,扬。 我已经厌倦了这样的循环。 我感觉自己活在同一个美梦中、同一个噩梦里,不断地循环。", + "荆棘:…", + "荆棘:事情是不会发生改变的,扬。 我们永远都无能为力。") + } +, + after_fight:{ + dialogue:new Array( + "荆棘:再见了,扬。") + } +, + final:{ + dialogue:new Array( + "荆棘:老兄啊,扬呀。", + "荆棘:抬起脚步,挥动手臂吧。 呀,如果没有了我,你一分钟也活不下去!", + "荆棘:好吧,走,我们去弄个三明治或者别的什么好了。", + "贤者:你…你已经做了很多了。") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "神秘的声音:喂?…扬? ^嘿!…噢,你能听到我的声音吗? 太好了,听着,你马上就要醒过来了。 你可以使用方向键四周围移动。", + "你需要按下\'", + "\'键来与周围的物体和他人互动。", + "同时,你需要按下\'", + "\'键调出菜单,那里将会提供有关你自身以及周围环境的相关信息。") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "扬…我只是想帮你处理好一切。", + "我希望…我希望你可以做得比我好。") + } +, + posthappy_mitra:{ + dialogue:new Array( + "祝你好运,扬。", + "贤者在某种程度上来说是对的。 我总希望一切既美好又完美,可是有时我却会忽略掉现实。", + "我不知道你应该怎样去帮助荆棘。 我也不知道这个世界究竟是怎样运转,更不知道为什么所有事情都那么奇怪。 可是我真的很想成为你的朋友,扬。", + "你一直在努力,扬。 你在努力去明白这一切。 我希望你能弄清楚这一切。") + } +, + one:{ + dialogue:new Array( + "贤者:扬… 这是我的最后告诫… 等等,是谁?", + "麦卓:我叫麦卓,这是我的自行车,东西!", + "贤者:我没在问你自行车的名字,我是说你在这里干嘛? 我并不记得你。", + "麦卓:我是来这里帮助朋友的啊,扬…", + "贤者:扬可没朋友。 扬也没有“荆棘”。 如果你胆敢怂恿他,我会让你永远滚出我的世界!", + "麦卓:你说这话是什么意思? 东西和我——", + "贤者:闭嘴! 别再和我提你那愚蠢的自行车了!!!") + } +, + hit:{ + dialogue:new Array( + "贤者:…", + "麦卓:扬! 你还好吗? 你干得真是太漂亮了… 你坚持把这个糟糕的地方搞定了! 我们知道你能办到的!", + "麦卓:东西!!!", + "麦卓:东西…", + "麦卓:瞧瞧,神秘的蒙面人,你觉得自己是何等角色? 你就不能让我们静静待一会吗?", + "贤者:你之所以觉得自己是扬的朋友,那是因为你会对他撒谎。 你会对他说,他是完美的。 一切都会得到解决。 好吧,如果你是这样想的话,算了。 从我面前消失吧,扬。", + "贤者:去和你的\"amiga\"说话。", + "麦卓:我们只是在尽力而为…") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "戴斗篷的男人:好了,是时候了。 呃…^我是说…^你好啊,扬! 我是贤者,村里的长者。 因为这片“大地”被邪恶力量所笼罩,所以你被召唤来此。 邪恶力量正在寻找传说荆棘,企图利用荆棘之力达成他们邪恶的目的。 所以你必须抢先一步找到荆棘,并且保护它。", + "走进你左边那个已经激活的传送门开始任务吧。", + "*叹息* 你还在这里逗留可不是个好兆头啊。 进入传送门然后开始你的任务去呀。 荆棘乃至整个世界都需要你去拯救!", + "你只要走进那扇该死的门就好了!") + } +, + after_ent_str:{ + dialogue:new Array( + "你怎么还在这儿?") + } +, + after_bed:{ + dialogue:new Array( + "继续,扬。 你刚刚找到钥匙也许只是九牛一毛罢了——把它们全都找出来吧。", + "远方就是“大地”了,扬。 这是阻止邪恶力量的唯一途径。") + } +, + before_windmill:{ + dialogue:new Array( + "拿着这三把钥匙,扬。 你可以利用它们前往“大地”更深处。") + } +, + after_windmill:{ + dialogue:new Array( + "你已经达成了我所要求的事情,扬。 尽管你需要做的事情还有太多太多。 也许探索“大地”更深处能帮助你更好地理解… 也许你会懂得你为荆棘做的一切都是值得的。") + } +, + all_card_first:{ + dialogue:new Array( + "好样的,扬。 你已经找齐了“大地”其中一个区域的所有卡片。 这样一来,在该区域的传送门顶部就会出现一颗宝石。") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "贤者:你的技能很快就可以在测试中展现了,扬。 这座神殿是为了考验你而存在。 你需要集力量与智慧才能通过考验。 我想你应该已经找到一件武器了吧?", + "什么玩——?? …我、我是说… 当然了… 你找到了一根扫帚! 呃… 正如同传说所言…", + "*抱怨声* … 简直就是没用的东西——嘿! 你还傻站在这儿干嘛?", + "时刻保持头脑清醒,扬。") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "贤者:现在的你还是很弱小。 如果你希望保护荆棘不受邪恶力量的伤害,你必须面对自己的恐惧。 你在这个箱子里找到的卡片,以及别的类似卡片,都是你成长的象征。 所以找到它们对你完成任务至关重要。", + "那个钥匙对你的任务而言也很重要。 你必须找到其它钥匙。 在菜单界面选择地图可以传送回神殿的入口然后继续你的英雄任务。", + "往东南方向穿过神殿… 你会找到一处使用那把钥匙的地方。", + "什么? 你想要回大门那儿去吗??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "贤者:你怎么不听我的话呢?! 如果你像个傻子一样的冲进这里,你只会危及荆棘,“大地”,还有我一直以来在保护的一切! 抱歉,扬。 如果你不听我的话,那我只能用另一种方式来劝你…") + } +, + after_fight:{ + dialogue:new Array( + "贤者:扬… 我并不希望事情变成这样… 我希望你能成为更好的人。 我希望你能帮助荆棘。 但是所有这一切不过是一场愚蠢的游戏… 我没办法阻止你找到荆棘。 只不过当事情变得很糟糕的时候,别忘了我对你说过的话。") + } +, + entrance:{ + dialogue:new Array( + "贤者:你好,扬。 当你变得更加强大而聪慧的时候,这条路便会引导你找到荆棘。", + "贤者:你还没准备好呢,扬。 首先,你需要这片“大地”上接受更多的考验。", + "贤者:你已经有所进展了,扬。 但是你必须收集齐全部36张卡片才能通过这扇大门。") + } +, + etc:{ + dialogue:new Array( + "贤者:哦… 呃… 你已经找齐36张卡片了吗? 但是我还不确定你是否能接受真正的考验。 其实,瞧啊,我们理解错了这扇门的意思,你其实需要…\n…\n…………\n92张卡片才能通过这扇门,而非36张!", + "贤者:扬,别进去,你还没准备好! 为荆棘考虑一下吧! 还有“大地”! 如果你还没准备好,那一切都毫无意义了!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "贤者:干得漂亮,扬。 你需要战胜的不止是这只怪兽,还有你自己的恐惧!!!", + "贤者:当然了,你还有漫漫长路要走呢。 你已经探索过“大地”了吗?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "贤者:干得好,扬。 可是还有许多试炼等待着你。 千万别放松警惕。", + "贤者:你已经找齐了所有钥匙吗,扬? 如果没有的话,那就去海滩上看看。") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "我和别人不一样! *低鸣* 我不会伤害你的…", + "这是一个安静的存在。", + "你闻起来就是一股甜菜味儿。", + "*低鸣*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "你做到了,扬! 你打败了邪恶力量! 看看这个地方! 多么美丽!", + "实在是太美丽了…") + } +, + dump:{ + dialogue:new Array( + "呀,你在这里真是太好了! 我还担心你被困在雪里了呢… 在那里的时候感觉真是很绝望吧! 哈!", + "哈哈哈。 哈哈哈哈哈。 哈哈哈哈哈哈!") + } +, + drink:{ + dialogue:new Array( + "嘿,小可人儿,我请你喝一杯吧!", + "再和一杯吧,小混球! 哈哈哈!") + } +, + hot:{ + dialogue:new Array( + "我靠,这里好热… 太热了… 我流了好多汗…", + "该死的,我越想弄明白怎么回事却更加饥渴难耐!") + } +, + gold:{ + dialogue:new Array( + "你知道这个地方是用金子做的吗? 跟真金一模一样!我们可以带着那块砖跑掉,然后不愁吃穿一辈子! 哇哈哈哈哈!", + "说真的,你为什么一直站在那儿? 赶快过来帮我撬砖啊!") + } +, + briar:{ + dialogue:new Array( + "???:扬… 你终于做到了! 你救了我! 现在一切都恢复如初了!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "当心!", + "抱歉… 我走路太急了。 嘿,我从来没见过你呢! 你也是旅行者吗? …哈? 你想保护荆棘不受邪恶力量的伤害? … ^好吧… 虽然我不明白你在说些什么,但是听起来蛮酷的呢!", + "我只不过带着我的东西四处走走罢了… 什么? 不不,我可不是商人。 东西是我自行车的名字!", + "也许我们还会再见的。 如果我听说有关荆棘的事情我会告诉你的。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "当心! 好了东西,来吧!", + "赶快!", + "继续前进吧,扬,我们会一直支持你!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "你还记得我吗? 上次我只顾着介绍我的自行车--东西而忘记介绍我自己了。 我叫麦卓。", + "你还记得我吗?上次我忘记介绍我自己了,我叫麦卓,这是我优秀的自行车,它叫东西。", + "麦卓:你最近过得如何,扬? …什么? 我怎么知道你的名字? 你觉得很奇怪吧? 嗯,其实你衣服背后写着的呢。", + "麦卓:回见,扬!") + } +, + quest_event:{ + dialogue:new Array( + "麦卓:嘿,我只记得--有人说他们在找一些过去的东西。 我不太理解他们在说什么,但是他们急匆匆地往山上去了。") + } +, + game_hints:{ + dialogue:new Array( + "什么也没有。", + "噢,你迷路了吗? 你去过海滩了吗? 也许那儿有东西能帮到你。 看上去你的那些钥匙是有一整组的。 你可能需要找到更多钥匙?", + "噢,你迷路了吗? 你去过东边的森林了吗? 你找到的那把钥匙--看起来应该是有一整组的。 你可能需要找到更多钥匙?", + "看看那些钥匙啊! 我记得我在东南方向看过有许多大门。 也许你可以去那边试试?", + "嘿,我看到你把风力涡轮机开启了! 你知道这会对“大地”产生什么样的影响吗?", + "嘿,扬。 哇! 你已经找到那么多卡片了! 你现在弄明白它们用来干嘛的吗? 看起来你可以用它们来兑换东西呢!", + "那个新的扫帚附件是什么? 它可以让你改变这个世界的结构吗…? 说实话,那可真可怕啊扬。 真庆幸它不是在任何地方都能起作用,也许只能在“大地”最深处发挥效用。", + "我的跳跳鞋你用得怎样了? 一定很棒吧? 我好喜欢我的新自行车鞋。 它们让我和东西成为了更棒的组合!", + "真棒,扬,你又找到一把钥匙! 东西很喜欢这个颜色呢! 你找到用钥匙的地方了吗?") + } +, + card_hints:{ + dialogue:new Array( + "麦卓:嘿,扬,你在找卡片吗?\n你去“观察者”的神殿找过吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我听说“观察者”的神殿的后门有一个迷宫。", + "麦卓:嘿,扬,你在找卡片吗?\n你可以在“观察者”的藏匿之所找到一些东西。", + "麦卓:嘿,扬,你在找卡片吗?\n“观察者”的神殿里有一个满是敌人的房间,对吧?", + "麦卓:嘿,扬,你在找卡片吗?\n你有没有仔细查看一下“观察者”的神殿呢?", + "麦卓:嘿,扬,你在找卡片吗?\n去试试“观察者”的神殿后门附近的那片荒废的区域吧。", + "麦卓:嘿,扬,你在找卡片吗?\n也许你的邻居知道些什么呢。", + "麦卓:嘿,扬,你在找卡片吗?\n我知道在你公寓的那个家伙在隐藏着什么…", + "麦卓:嘿,扬,你在找卡片吗?\n在你公寓入口附近…去那儿看看!", + "麦卓:嘿,扬,你在找卡片吗?\n你有没有检查过你公寓的*里里外外*呢?", + "麦卓:嘿,扬,你在找卡片吗?\n这里以南就是一个岛屿! 我没去过那儿,但是你可以去看看。", + "麦卓:嘿,扬,你在找卡片吗?\n如果你一直沿着河流走,应该能找到好些东西。四周围看看吧!", + "麦卓:嘿,扬,你在找卡片吗?\n我知道有人在风车那儿留了一张卡片。", + "麦卓:嘿,扬,你在找卡片吗?\n去森林里的河流附近找找看吧…", + "麦卓:嘿,扬,你在找卡片吗?\n去山底下找找看吧。", + "麦卓:嘿,扬,你在找卡片吗?\n去山顶找找看吧。", + "麦卓:嘿,扬,你在找卡片吗?\n在海滩的远处也许可以找到点什么。", + "麦卓:嘿,扬,你在找卡片吗?\n去深红色树林里逛逛吧。", + "麦卓:嘿,扬,你在找卡片吗?\n在那些红色洞穴里面有许多上锁的门,对吧?", + "麦卓:嘿,扬,你在找卡片吗?\n去北边的红色洞穴,寻找河流的源头!", + "麦卓:嘿,扬,你在找卡片吗?\n唔…你在黑暗迷宫里仔细找过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我记得某个地方有一条很可怕的、会喷火的路。 在路的尽头应该有些什么!", + "麦卓:嘿,扬,你在找卡片吗?\n那些马戏团的人一定在隐藏着什么。 你有没有仔细找过呢?", + "麦卓:嘿,扬,你在找卡片吗?\n你在那对夫妇的大坑边缘仔细找过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n这对夫妇在大坑附近游走。 他们肯定在隐藏着什么。", + "麦卓:嘿,扬,你在找卡片吗?\n有些时候裂缝中可能会隐藏着些什么--特别是山洞里!", + "麦卓:嘿,扬,你在找卡片吗?\n你有探索过最高处的山洞吗?", + "麦卓:嘿,扬,你在找卡片吗?\n你在山洞深处找到什么东西了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n那个在诡异之处的彩色方块--应该有东西在那儿!", + "麦卓:嘿,扬,你在找卡片吗?\n你和那个在看上去很荒凉的区域里的灰度方块对话了吗? 也许它知道些什么。", + "麦卓:嘿,扬,你在找卡片吗?\n酒店的顶层虽然有些破败,但是应该藏着些什么!", + "麦卓:嘿,扬,你在找卡片吗?\n你去酒店第三层的所有房间看过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我敢打赌,有人肯定在酒店第二层留下了什么东西。", + "麦卓:嘿,扬,你在找卡片吗?\n酒店的主人肯定留了些东西给你!", + "麦卓:嘿,扬,你在找卡片吗?\n那些西北方向的断桥…去那儿看看吧!", + "…什么? 你一张卡片都没找到? 拜托,扬,这实在是太扯了吧! 人活一辈子总该有些冒险精神吧,比如开几个箱子什么的,你懂我的意思吧?") + } +, + general_banter:{ + dialogue:new Array( + "你遇见那个在山里寻找东西的家伙了吗?", + "你知道我的自行车姓什么吗? …操纵者! 你知道吗? 东西·操纵者!! …我开玩笑的,自行车怎么会有姓氏呢。", + "你觉得我应该弄一把U型锁吗? 可是我不喜欢把东西锁成那样,可是最近又听说了很多偷自行车的案例…", + "所以荆棘到底是什么? 是从失落文明中遗留下来的古代手工艺品吗?", + "我想知道为什么我从来没听说过什么邪恶力量入侵的事情。 我猜这儿大部分人都只在烦恼各自的琐碎事。", + "嘿,扬,我想告诉你… 你头发真好看。") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "雕像:那个村庄长者只不过是名义上的角色罢了。") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "雕像:我见过一把传说的扫帚… 它在看门人衣橱里的地图上。") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "雕像:获得卡片对你而言至关重要。 当然,它们在其它方面也很重要。 比如获取分数或是购买酒精饮料什么的。") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "雕像:做得好,贤者。 你需要克服的除了你的坏脾气之外,还有你的自尊心! 这样你才能好好讲出你那俗套的对白!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "当你成为一个更加有压力和冷漠的角色之后,这条路会带你去找布雷耶。 放松一下吧,失败者!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "爱德华:有一个男人走进来,在我们的浴室里安了一面镜子。 所以我担心里面会有隐藏摄像头。 我把镜子的木框仔细翻找了一下,我喷了一些梅非的油皂在木框的裂口处,我觉得这样应该可以让里面的电路短路。 当然了,虽然我什么也没找到。", + "爱德华:这座神殿是献给“观察者”的。 我不知道我为什么会来这里,我很害怕走进去。") + } +, + bedroom_not_done:{ + dialogue:new Array( + "爱德华:遇到麻烦了吗? 好吧,我能想象到。 你只有一把扫帚而已。 而一把扫帚只能用来扫扫灰尘。") + } +, + bedroom_done:{ + dialogue:new Array( + "爱德华:你说你打败了“观察者”? 哈哈。 你没发觉事情不应该如此吗? 你只不过是把油皂喷在了裂缝上。") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "噢,这难道不可爱吗? 弱小的扬,在扮演着英雄的角色。 但是我见证着你在这片“大地”上所做的每一分努力。 让我来告诉你吧,扬。 这里不是所有人都会诚实对待你。 当心你信任的人!") + } +, + after_fight:{ + dialogue:new Array( + "当你孤单之时,我会与你同在,扬。 别忘了我对你小小“冒险之旅”的建议。") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "石头:周围的幻觉便是恶魔的巢穴。") + } +, + two:{ + dialogue:new Array( + "石头:待办事项:构建运输到节点的方法。 进程:停顿--“观察者”拒绝提供项目运作资金。 我们将不得不使用原始的传送门方法。") + } +, + three:{ + dialogue:new Array( + "石头:我被孤独地困在这里。 这个隧道里的工作很稳定,至少每天都能看到有进展。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "这个轮子曾经被用来升起大坝的。") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957年6月24日:秋千坏掉了。 爱丽丝·罗格斯摔到地里去了。 2根胫骨骨折。") + } +, + two:{ + dialogue:new Array( + "1957年7月17日:七名小丑因为严重的肺部问题而退休。 兰德布兰德牌化妆品非常可疑,可是却没有对其进行任何正式调查。") + } +, + three:{ + dialogue:new Array( + "1957年7月21日:由于有个兽笼出现问题,我的脸和侧身都被一只尚未驯服的狮子所咬伤。 我活了下来,但现在我只要看见自己的模样就会瑟瑟发抖。") + } +, + four:{ + dialogue:new Array( + "1957年8月5日:在我的梦里,我看见了有一双凶猛却闪闪发光的眼睛的石头脸。 他道出了我们存在的真实情况,是第一个在痛苦中给予自由的人。") + } +, + five:{ + dialogue:new Array( + "1957年8月7日:在我们接受“观察者”的真相之前,还有多少人要受苦?") + } +, + six:{ + dialogue:new Array( + "1957年8月8日:我已经做出了决定。 有些人说会追随我。 这是我的最后一搏。 愿“观察者”保佑我们诸事顺利。") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(难以辨认的记号)") + } +, + two:{ + dialogue:new Array( + "2010年12月7日。(姓名无法知晓)。 这里除了愚蠢的石头已经没有别的东西了!") + } +, + three:{ + dialogue:new Array( + "危险! 这个洞窟未经勘查。") + } +, + four:{ + dialogue:new Array( + "这些峭壁E向远处延伸,然而我从没有爬到高处去看它们通向哪里。") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "石头:怎样?") + } +, + two:{ + dialogue:new Array( + "石头:当心!垂直降落你需要自行承担风险。") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "这个曾经是卡片大门的占位符动画。 碰触两次可以查看锁住或开启的动画!", + "我已经忘记为什么我们将它弃之不用了。也许是因为它太引人注目了。") + } +, + two:{ + dialogue:new Array( + "这里是许多材质图层与碰撞的测试点!我没办法一个素材用到底(比如墙的两面)。所以我完全放弃了这个主意…", + "我们不用它们是有原因的。最主要的原因是为了简化设计,让我们更好地完成游戏制作。") + } +, + three:{ + dialogue:new Array( + "敌人被击败时有几率掉落钥匙。虽然这个主意很有趣,但是我还是放弃了。", + "我们还有一个点子,就是设计一些挑战大门,把它们放在考验的最后。你只有无伤过关后才能开启这些大门。", + "我们想把所有的地牢都放在这周围,然后掉血之后无法恢复。不过这样实在是太难了!") + } +, + four:{ + dialogue:new Array( + "监狱!!!", + "救救我们!!!", + "拜托了!") + } +, + five:{ + dialogue:new Array( + "欢迎来到“调试世界”!现在,你已经走出了\"大地\",所以这个世界可以说(至少有90%)都是\"非正式\"内容。", + "在使用大量地图素材之前,我用了一些很傻的素材来标记出大门的位置。实际上每个地牢都是用这里的地图素材勾勒出大概的。然后Marina再用他的素材去精细构建。") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-档案-", + "谨慎行事") + } +, + four:{ + dialogue:new Array( + "西部。裂缝。真实!房产价值低、飓风、老旧、缩减。放松。") + } +, + three:{ + dialogue:new Array( + "“观察者”让我记、记起…………在家的美好时光。") + } +, + two:{ + dialogue:new Array( + "冷藏\n\n^ --管理员") + } +, + one:{ + dialogue:new Array( + "继续") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "西部:海滩\n\n东部:森林\n\n东南部:\n 多雨地区\n\n北部:\n神殿遗迹\n\n西北部:峡谷") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "西部:湖泊\n南部以东:峭壁") + } +, + two:{ + dialogue:new Array( + "放松池塘。停下来歇息一会吧,我们知道你有时间的。") + } +, + three:{ + dialogue:new Array( + "我担心自己可能永远被困在这个小角落里了。") + } +, + four:{ + dialogue:new Array( + "东部:峭壁") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "当黑暗守卫素材被底下色的方格网替换时,路径才会打开。") + } +, + two:{ + dialogue:new Array( + "当蓝色石像移动\n新的路径将会出现\n翻过峭壁,穿过奇怪的区域\n你将会看到一间旅行者旅店\n\n\n\"谁是守卫?\" 我问道,\n\"谁掌管这个繁忙的地方?\"\n尽管这里有许多人类的灵魂\n我依旧感到很孤单。") + } +, + three:{ + dialogue:new Array( + "锈蚀的红色雕像移动了\n这是在为更深处铺路\n伴随而来的是迷宫般的地牢\n然后是马戏团的大帐篷\n\n\n\"谁是守卫?\"我问道,\n\"谁放弃了生命,逃到这样一个地方来?\"\n我如他们一样害怕痛苦\n但更害怕死亡。") + } +, + four:{ + dialogue:new Array( + "绿色的金属雕像移动了\n更深的道路开启了\n郊外的房屋和道路慢慢形成\n那是通往公寓的道路。\n\n\n\"谁是守卫?\"我问道,\n\"谁在星辰之中找寻慰藉?\"\n虽然孤身一人,但却感觉被人注视\n注视我的定然不是那友好的星光。") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "石头:这是一片无人认领的领土--它尚未成为“大地”的一部分。") + } +, + two:{ + dialogue:new Array( + "石头:这些==^ 我和我的^ --圆圈是^ --约定…我会^ --围绕中心^ --努力完成所有使命…^ --圆圈。吱吱、吱吱。") + } +, + three:{ + dialogue:new Array( + "石头:看呀^ --…可我依然^ --你的脚步^ --是否将重新出现?^ --当在这里之时!") + } +, + four:{ + dialogue:new Array( + "石头:往下看^ --我发现:^ --从此开始,你--^ 我爱上了他。^ --于是什么也…看不清。") + } +, + five:{ + dialogue:new Array( + "石头:我很抱歉--^ 但是,嗯,我们--^ 在这里混乱不清--^ 应该保持联系--^ 但是那扇传送门应该^ --我会努力让你知道我的想法--^ 将你带回“大地”。") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "有时如果你和人们对话多次之后,他们可能会和你聊点新话题。", + "但是石头不会这样。 石头才不做那样的事情。") + } +, + two:{ + dialogue:new Array( + "石头:很接近了!只要…") + } +, + three:{ + dialogue:new Array( + "石头:好奇心是个好东西。") + } +, + four:{ + dialogue:new Array( + "石头:噢!…?") + } +, + five:{ + dialogue:new Array( + "电脑终端打开了一封电子邮件。由于部分显示屏已经坏掉,所以只能看见信息的一部分。电子邮件写到:\"你好,扬!似乎[...]第五十张卡片[...]也许你不该…[...]值得思考!你觉得自己已经准备好了吗?醒醒吧…\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "石头:我打赌你肯定是因为没朋友所以才会度一块石头上的内容。") + } +, + two:{ + dialogue:new Array( + "石头:欢迎来到主世界的站点。希望你很享受在“大地”的时光。") + } +, + three:{ + dialogue:new Array( + "石头:你就是探索者!", + "石头:请不要去南部。因为那里正在施工中。") + } +, + four:{ + dialogue:new Array( + "石头:财宝在5、3!") + } +, + five:{ + dialogue:new Array( + "石头:哈哈,明白了!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "我们出生于正在衰老的母亲的身体中。") + } +, + two:{ + dialogue:new Array( + "有一天,我们的母亲离开了她的母亲,独自去寻找有毒的青蛙。") + } +, + three:{ + dialogue:new Array( + "我们从没问起过此事。 我们不能让她遭受痛苦。") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "石头:标志上说到,树木们已经有很长一段时间处于沉睡状态了。") + } +, + two:{ + dialogue:new Array( + "石头:南部:???^ 北部:???") + } +, + three:{ + dialogue:new Array( + "石头:这并不平坦的地面据说是由曾经居住在这片土地上的祖先们构成的。") + } +, + four:{ + dialogue:new Array( + "石头:他们似乎是非常热爱和平的物种。") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "某人用永不褪色记号笔字迹潦草地写道:你好,时空旅行者同僚。你已经踏入了远离扬所在的平行区域的裂缝中。你大概已经穿越了一片或者两片海洋。别担心有什么差别,你很快会重新回到你正常的冒险中去。别害怕这个地方,尽管这里到处都是禁忌和危险,这儿的人还是相当友善的。\n --管理员", + "(在这条消息下面,刻着这样一段话:)____(看不清)长眠于此。他在森林里迷了路。", + "(消息最下面还写到:)(别往太南边走就好。)") + } +, + two:{ + dialogue:new Array( + "____长眠于此(看不清,究竟是谁写的这个?)他被彩虹刺穿了!", + "原本应有更好的成就。") + } +, + three:{ + dialogue:new Array( + "伯德长眠于此。只因峭壁对其不太友好。") + } +, + four:{ + dialogue:new Array( + "袋子长眠于此。它从没有被人使用的机会。", + "做作!") + } +, + five:{ + dialogue:new Array( + "萨维奇长眠于此。他曾经试着在仓库里帮我修电脑。由于他拥有的空间实在太小,三年之后他还是没有修好。所以,他该死。") + } +, + six:{ + dialogue:new Array( + "戴夫长眠于此。他是一个缺乏灵感的人。") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---扬市---^\n请多加注意部分市民。他们不太擅长和人打交道…他们行事特别小心。扬市建立于90年代,市长英为了要开展一系列的住房计划而打造了这个城市。英拒绝使用“英”来命名此城市,而坚持要使用“扬”这个字。希望你在这儿玩儿得愉快。") + } +, + two:{ + dialogue:new Array( + "往西走是“观察者”的传说神殿。往东走是我们伟大的市长英的公寓,这里是不对外公开的--擅闯者自重。") + } +, + three:{ + dialogue:new Array( + "在他的第五次造访时,市长英因为找不到停车位而感到不快。后来他再次来访时,他会偶尔把车停在这个停车位。") + } +, + four:{ + dialogue:new Array( + "我记得我曾经写下的长句子。哈!断断续续的。") + } +, + five:{ + dialogue:new Array( + "危险的处境") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "“观察者”知道一切,并会启迪我们。启迪之路是无法用任何火把点燃的。") + } +, + two:{ + dialogue:new Array( + "不要偏离“观察者”之路,就算为了在遥远的迷宫角落里的财宝也不要。") + } +, + three:{ + dialogue:new Array( + "继续前进。") + } +, + four:{ + dialogue:new Array( + "别激怒暴力的追踪者。") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "景观地标:情人塔。情人塔修建于很早之前。站在塔上可以眺望远山。第一座塔在不久前损坏了,然后被重新改造。第二座塔还在东边屹立不倒、直插云间。出于安全考虑,通往塔的道路被封锁了。什么时候重新开启还需要另行通知。") + } +, + two:{ + dialogue:new Array( + "公共安全须知:^\n这座塔,尽管完好无损,但是据说塔顶有空间裂缝。请对此保持谨慎与宽松的心态。^\n --管理员") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "这座雕像看起来似乎马上就会移动似的。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "看上去这座雕像非常坚固。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "看上去这座雕像不可移动。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "火焰很漂亮,是不是?路灯的光芒把星星的火焰盖过了,实在是太可惜。") + } +, + after_fight:{ + dialogue:new Array( + "好吧,星星其实不是真的由火焰形成的。 ^谁会关心这个啊?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "你今天怎么样呀?我是这个空间的统治者。", + "你想知道我为什么是这儿的统治者吗?我会让你知道的,不过这还需要一点时间。需要很长一段时间。需要很漫长的一段时间。", + "反正就是挺长的啦。我可先给你提个醒啊!我打算去散散步。你呢,可以去看看那边的箱子里都有些什么。或者去远处的酒店瞧瞧。我不知道那儿有什么,不过我听说那儿的东西还挺便宜的。在那儿不会有什么钱财的问题。", + "我为什么是这儿的统治者?^…我也不知道原因,但是我在这儿的朋友都觉得,基于这里的状态,由我来担任这个职位非常合适。这可能是因为方块比较适合一直坐在平台的表面上把。除了我之外,没人需要一直坐在这儿了!", + "那些人--在那边的我的朋友们--都有各自的优点。他们说不定以后也有机会坐在这儿,只不过现在做不到而已。有时候,我们也会互相交换一下身份,但是每一次,我们都还是需要有人来诠释这个空间啊!也许金字塔先生或者夫人可以坐在我的位置上,因为我们打算为他们打造适合他们形状的王座。这听起来很傻吗?也许吧。但是事情就是如此。一切都发生得那样迅速。几分钟、几小时--统治永远都不是长久的。", + "尽管如此,当我作为统治者的时候,感觉还是有点怪怪的…我有种与世隔绝的感觉,觉得和别人都格格不入…", + "…但是与世隔绝也不能正确去形容我的感受。这只能算是部分感受吧。我没有被孤立,我也不是不喜欢别人。我们都把彼此当朋友,但是你懂的,没人会专门跑来就为了和你随便聊几句。所以我不得不思考事情,否则我会发疯的!也许那也是与世隔离之感的一部分吧。", + "除了那些愚蠢的、关于*为什么*我们会在这儿占据这个空间的问题,我更好奇为什么我们是朋友。", + "我喜欢思考的是,不管是什么时候,大家都认为我是最好的统治者。而他们让我有充分的时间去适应这个角色。你知道的,这就是一种鼓励。这样的存在让我很是宽慰。", + "我觉得仅仅是这样就已经很让我满足了。虽然如果他们能有一两个人明白我作为一个统治者的感受会更好。我不是在抱怨这样的鼓励!但是也许我们会有不同的统治者呀…是吧!也许有一天我不是统治者了,那么我会去做我希望他们现在做到的事情…尽管我也不知道他们是不是会如我所愿。", + "我已经走了很久了。如果你去另外一个方向,那边也有一个和这里类似的区域。不过那儿和这儿的感觉还是有些不同的。", + "见到你我很高兴。", + "噢,你还想再听一遍我的故事吗?", + "好,请好好坐着。") + } +, + gray:{ + dialogue:new Array( + "你好呀,我是这里的统治者。", + "什么?你想知道我为什么会在这儿?你确定吗?我会长话短说给你解释的!", + "既然你这样坚持,那好吧。虽然你最好是先去那个远处的酒店。我都不知道他们为什么要把它修出来。如果任何人要让我交税,那我肯定怨声不断!", + "好吧,虽然我是这儿的统治者,但是没有任何人让我统治。", + "我的那些朋友们--他们都是各自区域的统治者。虽然也都没有实际统治着谁--我们都是孤独的。但是只要我们互相聊天,就不会感到孤独了。毕竟这是我唯一存在过的地方啊。", + "我的朋友和我--我们所在的区域在某些方面都有共通点,比如它们为什么会存在、它们是怎样被安排的。我们在利益和欲望上都是相同的。所以我们喜欢谈论如何去统治。", + "但是,其实我们根本没有从物质形态上见过彼此。", + "所以你也不是在和他们的意识形态对话,而是以全息的形态。", + "我知道,这样有些不幸。不幸的是,我们有太多的共同点。可是这样的我们只能彼此成为朋友呀。", + "当你不能够一对一的实际交谈时,其实也只是欠缺了一小部分真实罢了。", + "我不是在抱怨什么。可是这样聊胜于无啊!要是连一个说话的人都没有,我简直不敢想象那种情况。一定非常糟糕吧。", + "能和你说这些真是太好了,祝你一切都顺利吧。", + "你还在这儿吗?如果你愿意,我可以从头到尾再和你说一遍。") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "克里克森:嘿呀,大恶霸! 我可不怕你!", + "克里克森:你个大傻瓜! 我才不会逃跑呢! 就算你要揍我也不会!", + "克里克森:你只不过是个穿着喇叭裤的大傻个!你应该以你自己为耻!") + } +, + thorax:{ + dialogue:new Array( + "胸腔:我是胸腔,我要为蜜蜂们发声。\n^它们的命运充满了不确定性,这不是它们想要的!\n^那些工蜂们不得不到处飞!\n^然后它们就这样白白死掉…这样的场景实在是太残酷了!", + "胸腔:也许这是病毒或是新型杀虫剂造成的,\n^也许这是那些臭苍蝇的幼虫造成的!\n^反正这个原因让这些蜜蜂的行为都变得很古怪。\n^不管原因是什么,这个状况必须被改变!", + "胸腔:好吧,其实我也不清楚事情是如何\n^我也担心我所做的努力都是徒劳。\n^可是试问我怎么能冷眼旁观呢?\n^所以我一定会把这件事放到Facebook、Twitter还有Yelp上去!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "买我的东西吧") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的!", + "我不会就这么罢休的! 永远都不会!") + } +, + inside:{ + dialogue:new Array( + "哦,你来这里是为了再一次恐吓我吗?", + "你支持那些猫咪只是因为它们可爱又毛绒绒。") + } +, + etc:{ + dialogue:new Array( + "你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的!^ 嗷呜!^ 是不是这样--?^ 再来一只猫???^ 嗷呜呜!!!", + "你…你把我的房子打扫了… 我被感动了! 来,我要把我最美丽的东西送给你!", + "扬拿起了盒子。这里面有东西!", + "黏黏:噢。嘿,苗。^\n\n苗:真高兴你安然无恙!^\n\n黏黏:啊…谢谢你的帮忙,扬。", + "黏黏:说实话,我还蛮喜欢坐在盒子里的。") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "噢!! 你是扬,那个天选之人啊!!! 天啦噜,真是荣幸啊! 我叫苗小团儿,正在接受培训的天选之人!", + "我能跟着你一小会,看看天选之人是怎样做事的吗?", + "你好啊,扬! 我今天可以跟着你吗?") + } +, + randoms:{ + dialogue:new Array( + "苗:嘿,扬… 你偷过东西吗?", + "苗:我喜欢麦卓… 东西是一辆很帅的自行车吧?", + "苗:那块酷酷的石头是什么,扬? 它可以让你及时回去吗?!", + "苗:我有点担心黏黏…扬,你最近在这周围见到过一只大猫咪吗?黏黏最后一次见我的时候告诉我说他要去东边的森林转转。", + "苗:黏黏说我不应该去危险的地方。所以回见啦,扬。", + "苗:你曾经在购物袋里待过吗?", + "苗:嘿,扬。你觉得用猫薄荷是种错误的行为吗?", + "苗:我敢打赌,要成为天选之人一定要花很多功夫的对吧,扬?") + } +, + philosophy:{ + dialogue:new Array( + "我不禁在想黏黏会遇到怎样可怕的情况… 你觉得我们死后会发生什么事? 你觉得我们如何能在短短一生之内完成所有想做的事情?", + "也许我们会不断重生,直至我们完成所有目标。 这样会不会更容易一些?", + "可是当我们走完旅程之后,有什么样的奖励等着我们呢? 难道我们只是消失无踪吗?", + "唔…") + } +, + icky:{ + dialogue:new Array( + "噢,你好啊,扬。", + "其实我并不叫黏黏。 我叫伊卡博德。", + "我希望苗小团儿没给你造成太多麻烦。", + "回见,扬。") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "你好,一切都还好吗?你找到我了!虽然我准备就待在这儿的。外面实在太冷了。", + "你可以因为这些可怕的房间而责怪我!我是用DAME地图编辑器把它们做出来的。", + "这游戏是我用FlashDevelop IDE和Flixel AS3做出来的!", + "噢,对了,游戏的音乐是我用REAPER DAW做的。有时候我还用Audacity。", + "我是从所有的电脑辐射中获取营养的…^你说的这不符合生物学准确性是什么意思?", + "嗨老妈!^还有老爸!", + "你想知道如何在20分钟之内通关这个游戏吗?", + "哈!你以为我会告诉你吗!", + "(…不过如果你能温柔一点问我的话…)") + } +, + marina:{ + dialogue:new Array( + "哇喔!嘿!", + "这个游戏里好多好多对话都是我写的!^ (…不过这句对话不是。现在是Melos在写哦。)", + "我用了Adobe Photoshop CS5、Graphics Gale Free Edition以及Windows 7的截图工具来制作画面!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "这里的湿度对你的皮肤很有好处,不过却不利于你的头发。", + "我喜欢站在这儿。 这些日子以来,人们在酷热和极寒之间反复折腾。 气温的急剧变化对你的骨骼可不太好。", + "这就像是咀嚼冰块的坏习惯一样。 我的母亲咀嚼冰块直至她二十多岁。 现在她的发际线已经突破天际。") + } +, + second:{ + dialogue:new Array( + "你得确保换掉蝎子,然后把它们用报纸包住弄干。 你也不想制造出一个细菌滋生地吧。", + "为什么要弄出一个只有红色果冻块儿的自助餐呢? 仿佛他们想让我们得癌症一样。") + } +, + bomb:{ + dialogue:new Array( + "离我远点儿。", + "我认真的… 别靠近我。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "我不需要你的同情,扬。", + "嗯,你就这样在你的快乐小世界中一直生活下去吧,\"天选之人\"…", + "你知道的,扬,友情只是人们相互之间的小把戏罢了。 我们都是混蛋,人生之路走到最后,我们都只是孤身一人。", + "哈,我知道你讨厌我,扬。", + "我做得很好。", + "你当然不关心,也没人关心。") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "我知道城市可以很脏乱差,但是我喜欢看看外面的万家灯火。", + "它以自己独特的方式美丽着。 虽然不像星星那样无穷无尽,但是却又在人情味上增添了一些美妙的复杂性。", + "每盏灯后,都有一个怀揣着希望、恐惧和秘密的人… 往外看是一种充满恐惧和孤独的个人行为。", + "我觉得自己是爱着每一个窗户后面的人的。 我爱你、爱着人们,你们都是我的星星。 不管你的人生轨迹是怎样,不管你认为自己有多么堕落,我都爱着你。 今夜你最可爱…", + "抱歉,我又在胡说八道了。 不过谢谢你的聆听。") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "嘿——,伙计…卸下行囊,待一小会儿可好?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "啊!你找到我了!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "石人:你来的路上有没有被一块大石头击中? 有时当我生气了,我就会扔石头。 如果你被击中了,那么我得和你道歉。", + "石人:我母亲总说,如果我再这样继续下去,我最好离开山里再丢。 只要在她粉碎之前回来就好。") + } +, + second:{ + dialogue:new Array( + "石人:当你是一块石头,你可以目睹人类很多代的更迭。 你可以比最聪明的人类更加智慧。", + "石人:至少那确实是个办法。 我前不久把我的望远镜弄坏了,所以我没办法给你说到底发生了什么事。", + "石人:其实观察人类一点也不好玩,我觉得很无聊。") + } +, + quest_event:{ + dialogue:new Array( + "石人:噢,是的,我遇见过似乎迷路的人…他们告诉我,他们想去看看海滩。") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "我不是一只龙虾,我是海螯虾。 我的名字是砍砍。", + "砍砍:你知道海洋最棒的地方在哪里吗? 是可以看到地平线。", + "砍砍:海洋就像是充满咸味的无穷大符号。", + "砍砍:可是拥挤的沙滩却剥夺了它的优雅。") + } +, + second:{ + dialogue:new Array( + "砍砍:你听说过虾蛄吗? 它有16个光感受器可以用来感知紫外线。 你能想象看到更加广泛的色彩是什么样的感受吗?", + "砍砍:也许会很漂亮。 然后,我们就会因为各自看到的颜色而用各种理由讨厌起他人来。") + } +, + quest_event:{ + dialogue:new Array( + "砍砍:你在找人对吗?我记得当云朵飘过太阳的时候我就坐在这儿了。当太阳被遮挡住,有人向我走来,向我询问某件东西在哪里。我不记得他们问的是什么了,但是他们离开了,说准备前往森林。") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "詹姆斯:浆果是很棒的一类食物。 我喜欢浆果。", + "詹姆斯:请一定不要在浆果上便便。", + "詹姆斯:这个季节里我已经啪啪啪过18次了。 而且,我已经吃了389串浆果了。", + "詹姆斯:你给詹姆斯带浆果了吗?") + } +, + second:{ + dialogue:new Array( + "詹姆斯:我写了一首诗:\n^我喜欢吃浆果\n^它们让我快乐\n^你要问我喜欢有多深?\n^月亮代表我的心!", + "詹姆斯:你喜欢蓝莓多一点还是树莓多一点?", + "詹姆斯:你给詹姆斯带浆果了吗?") + } +, + quest_event:{ + dialogue:new Array( + "詹姆斯:有人来过。他们不是为了浆果来的。他们去了西边湖泊的东南方向。") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "奥利弗:嗨,我是兔子奥利弗。", + "奥利弗:我还有好多谷物没吃呢!我超爱谷物的。", + "奥利弗:这个盒子太大了。感觉永远没有尽头!", + "奥利弗:永远吃不完的谷物!", + "奥利弗:唔…也许这样也不错。") + } +, + bush:{ + dialogue:new Array( + "兰克:哦呵呵,愚蠢的扬!扫帚可不是用来砍灌木的工具!") + } +, + quest_normal:{ + dialogue:new Array( + "兰克:我砍掉这些灌木是为了生存。 有时候砍灌木的时候你能找到金子! 哦呵呵!", + "兰克:这里的经济状况不太好…", + "兰克:有时候光靠砍掉灌木真的很难养活妻子和孩子——我们很多时候连足够的食物都没有…不过我们倒是从来不缺可以点火的地方! 哦呵呵呵!") + } +, + quest_event:{ + dialogue:new Array( + "兰克:呃?对!有人来过。他们说要去什么地底迷宫…我敢打赌,他们在那儿能遇到好多灌木,你说是吧,扬?哦呵呵呵!") + } +, + marvin:{ + dialogue:new Array( + "马文:哦,嘿,感觉怎样?", + "马文:贾斯汀在哪儿?", + "马文:这附近并没有六月天乐队啊…") + } +, + chikapu:{ + dialogue:new Array( + "奇卡奇!", + "奇卡 奇卡!", + "奇——^\n卡——^\n噗————————!!!") + } +, + hamster:{ + dialogue:new Array( + "鲍勃:仓鼠鲍勃喜欢以第三人称来形容自己。", + "鲍勃:省略符号是一切不好事情的根源。", + "鲍勃:安静!我忙着散发仓鼠光环呢!", + "鲍勃:……我想你最好是这么做…但是… 如果你做错了,你会因为做错而把事情变得更好吗?", + "鲍勃:真男人从不哭泣…好吧,也许他只是让一滴眼泪在眼眶里来回打转。哈利穿过了刮着大风的莫哈维沙漠,而且没戴头盔和护目镜。可是他从来没流过泪。", + "鲍勃:这个游戏是由为无数多的打字员工作的无数多的猴子们设计的。", + "鲍勃:我想念詹姆斯…") + } +, + electric:{ + dialogue:new Array( + "基路伯:咖喱又黄又辣!", + "基路伯:对聪明的对手使用,伤害将增加!", + "基路伯:你获得2点经验!", + "基路伯:听着,我的电话号码是0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "我在这儿干嘛?问得好!我只是偶然在这儿的。我正在忙着躲藏呢,这儿很安全,只要你不要离开太远,让那些家伙找到你。", + "似乎我还是比较幸运的。这些死去之人的躯体遍布此地——他们是怎么死的?实在让人太想弄明白这件事是怎样发生的。他们是被什么怪兽攻击了吗?所以被推倒,跌落在那些尖刺上?", + "这样真是有些糟糕。我希望这种事情不要发生在我身上。身体上的疼痛实在是太可怕了。") + } +, + quest_event:{ + dialogue:new Array( + "噢…现在我在想啊,方才有人从这儿路过,说他们在寻找什么东西…他们看起来和你有点像呢!抱歉,我不记得是什么时候的事儿了。在这里真的很难有时间概念。但是他们说准备去附近的小镇上。") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "你好。", + "你在找东西吗?", + "你在看什么?", + "不,我不是这镇上的居民。你能看见我并且和我说话可真是件诡异的事情啊,因为我完全无法和其他人互动。这样的杀手在这儿还有很多,似乎都没被人察觉呢。真是奇怪。") + } +, + quest_event:{ + dialogue:new Array( + "是的,我看到有人路过。他们在找什么东西。我不知道那件“东西”在哪儿能找到。而他们匆匆离开了,说是要去太空的交替区,这听起来好棒啊。") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "哇啊 哇啊 哇啊————你、是、谁???", + "我是一名流浪者…这是从A地到B地的著名的旅途休息站之一。", + "什么是“A”???这是我的故乡…而我要去B看望一位老朋友…旅途很是漫长…但是我已经做好牺牲的准备了…你呢???让生活充满挑战与刺激吧!!!") + } +, + quest_event:{ + dialogue:new Array( + "噢——在找另一个人类——我知道了。^让我读取一下内存…读取(0X0C00400 , STDOUT , 100);\n………………\n………………\n啊、哈…\n 那个人有闪电般敏锐的洞察力,他们说要去一个维护得很好的旷野里的小屋。\n现在我在想啊…你长得真像他们呢!!!你真的不是他们本人吗??哈?嗯?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "你真的是…啊,呃。很棒。", + "发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\"") + } +, + quest_event:{ + dialogue:new Array( + "发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "你好呀,你见过方块了吗?", + "方块是空间里很棒的统治者。当然,这儿的其他统治者也都在尽力做到最好。") + } +, + gray2:{ + dialogue:new Array( + "你觉得这块空间如何?还算漂亮吧,不是吗?", + "世界的交汇点!") + } +, + gray3:{ + dialogue:new Array( + "我们这里没有灰色金字塔。我们使用了特殊的设备让我们能投射到这儿。", + "我们为什么要那么做?因为我们想要和方块朋友们说话,让所有方块联合起来。") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "…这个全息投影设备运作正常吗?", + "不正常?^…^靠!") + } +, + color1:{ + dialogue:new Array( + "你见过方块了吗?它做的事情都好酷哦!我听说有一次它站在一个悬崖边上将近12秒这么多。天呐!你知道那对于悬崖挺立者联盟来说意味着什么吗?你不知道?好吧,意味可大了!") + } +, + color2:{ + dialogue:new Array( + "方块做了许多有趣的事情!", + "你听到了吗?很明显,马上就轮到我来统治了!我想,再过几分钟就好。") + } +, + color3:{ + dialogue:new Array( + "我来自塔糖,要被运送到台北。你问我为什么会在这儿?噢,我只是想和方块打声招呼!", + "别这么沮丧啊!这个地方是有点奇怪,所以才没能打动所有的访客吧。可是我们只能给你说,这个地方是全无恶意的。") + } +, + colordead:{ + dialogue:new Array( + "(…它在小憩吗?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "我们都是从痛苦中出生,又在痛苦中死去。 我们经历着如此的循环。 永远无法逃离。") + } +, + after_fight:{ + dialogue:new Array( + "这就是你对于反抗者的惩罚吗?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "你为什么不让“观察者”牺牲? 你为什么不让我们得到救赎?") + } +, + after_fight:{ + dialogue:new Array( + "…我们没能让你为你对我们造成的干扰而付出代价。 然而…你却回报给我们以自由。 谢谢你,扬。 愿“观察者”永远庇佑你。") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "见到你正好啊,扬。 好久没见了。 你现在还在玩任地狱的游戏吗?") + } +, + after_fight:{ + dialogue:new Array( + "天啊,扬,你什么时候长大的? 你知道的,你迟早得学会如何他人相处。") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "我们这儿有所有最好的便利设施。 你觉得这个水池怎么样?") + } +, + middle_fight:{ + dialogue:new Array( + "我们最先进的健身中心你觉得如何?") + } +, + after_fight:{ + dialogue:new Array( + "希望你在这儿度过开心的时光!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "今天是美好的一天。", + "谢谢你帮我挠背上的痒痒——我根本碰不到那儿。", + "我听说当地餐馆做的蛋挺好吃的。我有优惠券哦。", + "你目睹了今天的车祸没?太可怕了!那人正发着信息呢。太可怜了,他还那么年轻!", + "我儿子没能成功加入初中校队里。实在是太可惜了。我们为他的运动生涯已经投入了太多心血。", + "今天是感恩节。我要感谢的事情有许多。我已经等不及要参加明天早上的甩卖了。我要交易好多东西。", + "啊,我觉得我上班要迟到了。", + "我急着回家呢,在亲家上门之前我得赶紧收拾收拾。", + "走过路过不要错过我们的大甩卖!", + "欢迎大家来看看!") + } +, + words_teen:{ + dialogue:new Array( + "我没有去看最新的电影。") + } +, + words_kid:{ + dialogue:new Array( + "我绝对不会去看新的卡通片!") + } +, + family:{ + dialogue:new Array( + "欢迎来到我们的家,陌生人!你看起来很眼熟啊。这是个和平的小镇。非常宁静,很少有访客到来。", + "你喜欢戴夫状态吗?我的兄弟戴夫给我听了这首他写的超酷的曲子!") + } +, + older_kid:{ + dialogue:new Array( + "我的朋友喜欢听“雷黑德”写的“毫无惊喜”的曲子,然后抱怨着这个地方。是啊,这里是有些缺点,可是,至少你得心存感激啊!或者至少为这个地方做点什么吧!那些人简直是…噢,抱歉。有时候我就想做点什么…", + "我觉得我得去我的博客上写点什么。", + "你看起来很茫然。", + "我在电视上播放的体育新闻里根本听不到和我观点相同的看法,不过我的爸妈就是很喜欢看。") + } +, + hanged:{ + dialogue:new Array( + "尸体上有行字:\"将自己置身危险之中。\"") + } +, + festive:{ + dialogue:new Array( + "噢,外面发生什么事了吗?在庆祝节日还是举办庆典?", + "外面好像有骚动!你最近往窗外看了吗?我好想知道到底是什么情况。") + } +, + paranoid:{ + dialogue:new Array( + "我的房子有许多窗户。我不喜欢窗户。因为总感觉有人在往里看。而且你知道的,外面总是在不停发生着各种事情。我无法总是那么安静——因为外面对我有干扰。", + "杀人犯?什么?外面?你在说什么啊?你在开玩笑吧?这个镇上从来就没出现过谋杀案,但是…你这样一说还真把我吓到了…也许你该离开了。", + "请出去。") + } +, + dead:{ + dialogue:new Array( + "从尸体上看来,这名女性是被人用钝器殴打致死的。", + "伙计,坦白讲,好吧…") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "噢,是你!你看起来好眼熟…在你杀死更多居民之前我是不能动的,你记得吗?过来一点。", + "根据这本小册子所说…你只需要再杀几个人就可以了!继续吧。", + "我们还需要一具尸体就够了,继续吧。", + "做得好。你可以随意进去。我也不知道里面有什么。明天同一时间再见吧,好吗?或者晚上?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "我不介意被树木盯着。", + "她在哪里?!", + "当你孤单之时,我会与你同在,扬。", + "你是奥柯乔特吗? 我妈妈总是给我说要当心危险的奥柯乔特。", + "泥猴啊,扬! 在介里见到你真高兴! 泥要不要在这儿坐一会儿? 偶正在泡茶哦!", + "呼、呼、呼、呼、呼、呼、呼、呼、呼、圣坛、讲道坛、祭坛、彩色玻璃窗…", + "限时优惠!买一送一——仅此一天!", + "还记得停电那天你点亮蜡烛的时候吗?", + "唔,昨晚你的枕头真舒适。", + "这样他们就会记得称我为“画着烟熏妆”的家伙。", + "东西和我是超棒的组合。", + "我是正在接受培训的天选之人!!!", + "你会否觉得,不管你做什么,你都无法阻止这个世界消亡?", + "当心森林蘑菇…", + "抱歉。 这是我性格使然。", + "你说“只是一块石头”是什么意思?? 你知道不,石头也有资格上卡牌!", + "授人以鱼不如授人以渔。这样他就可以和他儿子吉米有时间好好相处了。", + "有时候解决问题只需要去散散步。", + "为什么每次你四处走动的时候,蝙蝠就会突然飞下来?", + "不,是*你*需要背带!", + "你现在高兴了吗?", + "别在我周围制造暴力。", + "我一直都想成为料理铁人。", + "我妈妈总是给我说,“如果你弯腰太久,你的脊椎就回不了原样了!”", + "你觉得开心吗,人类?", + "...", + "从科学的角度来讲,蟾蜍是青蛙的一种。", + "哈哈哈! 耶! 我知道!", + "哦,你也在收集卡牌吗? 真棒啊,英。", + "他们总是说:\"离开你的电脑!否则你永远交不到朋友!\"", + "我只是名义上的统治者罢了。", + "我敢打赌,你觉得你“让我的工作变得有趣”了!", + "我讨厌斜线。", + "别给我用抗过敏药物。", + "刷这张卡就可以解锁你房间里的门!", + "我做得很棒。", + "……………??", + "谁雕刻出我们的?", + "希望你在这儿度过开心的时光!", + "既然你能走到这里,证明你还是有点本事的。", + "我来这儿是为了将你带入歧途。", + "你也喜欢金字塔吗!", + "这是个相同的该死游戏,日复一日进行着,而报酬却少得可怜。", + "让我静静!我的姓氏才不是什么萨克斯!", + "至少我不是根棍子。", + "你说钱不会对树造成任何影响是什么意思?哦呵呵呵呵!", + "我只是一个幻觉罢了。", + "我要把气出在你身上。") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "按下", + "以设置控制选项。", + "以取消。", + "上", + "下", + "左", + "右", + "跳跃", + "攻击", + "菜单", + "按下", + "以退出", + "以设置控制选项。") + } +, + title:{ + dialogue:new Array( + "请使用\n方向键来调整\n窗口大小\n直至你无法看见\n黑框\n\n按下", + "当完成之后。", + "ANODYNE 镇痛", + "Melos Han-Tani\nMarina Kittaka", + "任意键", + "按下", + "以开始", + "版本", + "继续游戏", + "新的游戏", + "你确定吗?\n否\n是", + "真的吗?\n不是\n是呀", + "不能后悔哦!\n算了吧\n我知道", + "死亡数", + "卡牌数", + "《镇痛》支持\n多种手柄。\n\n你打算用手柄玩儿吗?\n\n是 否\n\n如果是的话,请现在连接。\n\n使用方向键移动\n\n使用C键、空格键或回车键\n进行选择\n\n选“是”使用系统默认设置\n", + "注意事项\n\n如果你在游戏中遇到输入延迟\n你需要返回主界面\n重新进入《镇痛》\n\n按下C键以继续\n\n图形用户界面显示错误?\n按下下列键可重调设备。", + "再次按下返回键可退出。\n未保存的进度将丢失。") + } +, + gui:{ + dialogue:new Array( + "菜单=进入", + "保存中…") + } +, + map:{ + dialogue:new Array( + "地图", + "当前房间", + "门/退出", + "无地图", + "返回\n连结处", + "返回\n入口处") + } +, + items:{ + dialogue:new Array( + "物品", + "正常", + "调换", + "延伸", + "宽度", + "一双弹力鞋——按下", + "以跳跃!", + "一双自行车鞋。", + "一个空纸箱。", + "一把在“观察者”的神殿找到的钥匙。", + "一把在红色地底洞穴找到的钥匙。", + "一把在山洞中找到的钥匙。") + } +, + cards:{ + dialogue:new Array( + "卡牌", + "卡牌") + } +, + save:{ + dialogue:new Array( + "保存", + "已保存!", + "错误", + "保存并返回\n标题界面", + "返回标题界面", + "保存并退出", + "退出游戏", + "死亡数:") + } +, + config:{ + dialogue:new Array( + "配置", + "设置键位", + "设置音量", + "在保存点可\n自动保存:", + "开启", + "关闭", + "更改分辨率:", + "UI配置", + "触摸+方向键", + "仅启用方向键", + "仅启用触摸", + "移动输入:", + "分辨率:", + "窗口模式", + "按比例缩小", + "伸展", + "缩放:", + "语言:", + "ja", + "en", + "ko", + "拉拽按钮直至满意为止。\n\n点击菜单以继续。\n\n", + "调整窗口大小", + "配置手柄") + } +, + secrets:{ + dialogue:new Array( + "你正在前往中!", + "曾经是一位著名的泡泡魔法师的财物。", + "如果你的图像受到了干扰", + "这颗心没有名字。", + "请参观电子怪兽的世界。", + "一座猫咪雕像。可爱而无用。", + "噢天啊!!!!", + "噢不!!!!", + "这是黑色的。", + "这是红色的。", + "这是绿色的。", + "这是蓝色的。", + "这是白色的。", + ":选择", + ":返回") + } +, + swap:{ + dialogue:new Array( + "抱歉!", + "在这里无法进行调换。", + "扬无法在此使用力量进行调换。") + } +, + keyblock:{ + dialogue:new Array( + "这扇门上了锁。") + } +, + treasure:{ + dialogue:new Array( + "某种神秘力量阻止了这个宝箱被人打开。", + "扫帚的把手上雕刻着:按下", + "来扫动。", + "这把一次性使用的钥匙可以开启一个锁住的障碍物。", + "一双神秘的靴子,没什么特别的,不过上面写着\"按下", + "\"。", + "扫帚的延伸处上写着\"装备菜单里的宽度升级可以使扫帚朝左右方向释放有害灰尘。\"", + "扫帚的延伸处上写着\"装备菜单里的延伸升级可以使扫帚朝前方释放有害灰尘。\"", + "扫帚的延伸出上写着:\"你好,扬。使用调换升级可以改变两块砖的位置。你可能还需要好一阵才能到处使用此功能,但是它会对你大有帮助。\"", + "你找到了一颗心!!!最大生命值增长了…零。", + "戈德曼:什么?不在这儿?那个店主肯定把它偷了!") + } +, + dust:{ + dialogue:new Array( + "现在你的扫帚已经充满了灰尘!再次攻击可以释放灰尘。") + } +, + checkpoint:{ + dialogue:new Array( + "保存游戏?\n 是\n 否", + "站在检查点上,按下", + "以储存你的游戏进度。如若死亡,此处将为你的重生点。") + } +, + rock:{ + dialogue:new Array( + "石头上潦草地写着:", + "你没朋友") + } +, + door:{ + dialogue:new Array( + "此传送门似乎没有被激活。") + } +, + keyblockgate:{ + dialogue:new Array( + "大门稳稳地立在那里。如果它没有感知到有四张卡牌的存在,它是不会打开的…", + "感知到四张卡牌的存在,大门决定打开。", + "大门倔强地紧闭着。", + "大门感知到了全部卡牌的存在,它决定打开。", + "大门感知到了足够卡牌的存在,它决定打开。", + "大门打开了!", + "大门还是紧闭着。") + } +, + solidsprite:{ + dialogue:new Array( + "路牌指向东方,但是路牌上的文字已经看不太清。", + "路牌指向西方,但是路牌上的文字已经看不太清。", + "路牌上的文字已经看不太清。") + } +, + mitra:{ + dialogue:new Array( + "嘿,扬!", + "这双自行车鞋是给我的吗? 哇哦! 谢谢你,扬! 我一直想要这个呢,这样踩在东西的踏板上就更搭配啦。 这儿,扬,我用我的鞋子和你交换! 它们可以让你跳得很高!只要你按下", + "就可以使用它们跳起来了!", + "你好,扬! 你注意到我有什么不同了吗?^… ^… 哦,好吧,我有一双新的自行车鞋了,你看! 它们可以卡入东西的踏板里面。因为我已经不需要旧的鞋子了,我想把它们送给你!它们可以让你跳得很高!只要你按下", + "就可以使用它们跳起来了!", + "好了,保重吧!", + "来吧,试试它们! …它们没什么味儿的。", + "很酷吧?", + "哇哦,这双自行车鞋是从芬缇的店里买来的吗? 你准备把它们送给我? 谢谢你,扬,太感谢你了! 这儿,我把我的旧鞋子给你作为回报吧——我想它们会对你很有帮助的! 鞋子上面写着\"按下", + "以跳跃\"。 我完全不明白这是什么意思,因为鞋子上面根本没有\"", + "\"键啊…") + } +, + tradenpc:{ + dialogue:new Array( + "芬缇:欢迎欢迎,我亲爱的朋友,扬! 我的名字是帕拉珊德和夫——芬缇帕拉珊德和夫! 在我店里随便看看吧,也许你会发现什么想要的东西!", + "芬缇:感谢给我盒子!", + "芬缇:啊,一个盒子!太谢谢你了!这样我就可以在晚上把我的存货带回家,早上再运过来了!", + "等等…不在这儿!它到哪儿去了?好吧,是这儿,让我来抚平你的伤口!", + "为了表示感谢,你把这双时尚的自行车鞋拿去吧!", + "多么晴朗的造成啊,是吧,我的朋友? 一个适合购物的早晨!我希望能有一个盒子,这样我就可以装着我的货物到处走。", + "太糟糕了,看起来你的钱不够啊! 等你有足够的钱之后再回来吧!", + "芬缇:啊,你眼光真不错!你需要一件更好的武器对吧?只需要$499.99!你就可以将敌人杀个片甲不留!", + "芬缇:那个钱袋可以存放你在“大地”中找到的钱币!仅需$869.99你就可以拥有它!", + "芬缇:哦吼吼,这儿有一件特殊的物品:夹入式自行车鞋,穿上它你就是时尚时尚最时尚的人!现在特价,只要$299.99!", + "芬缇:用你的小扫帚扫开灰尘实在是太累了对吗? 要想根除有害灰尘的烦恼,就使用这款最先进的吸尘器吧!仅需$749.99或者你也可以选择分期付款,每月只要$199.99!", + "为了表示感谢,这个丑陋的——我是说,漂亮的,收藏版的卡牌你就拿去吧^") + } +, + ending:{ + dialogue:new Array( + "Anodyne 镇痛\n-------\n\n\n\n游戏由\n\nMelos Han-Tani\n\n和\n\nMarina Kittaka\n\n为您呈献\n\n-------------", + "游戏于\n\n2012年三月\n\n至\n\n2013年一月间制作", + "游戏设计\n------\n两人协同", + "程序\n-----------\nMelos,使用\nFlixel库来制作\n动作脚本 3.\n\n\n\n美术\n---\nMarina\n", + "音乐和音效\n---------\nMelos,使用REAPER\n和一系列免费音色库。\n\n\n\n对话\n--------------\n大部分由Marina制作\n", + "故事\n-----\n两人协同\n中文本地化:\n一只小雨", + "特别感谢\n我们辛勤工作的测试员!\n--------------\n\nMarina,辛勤地为游戏排错。\n\nEtan,一直以来给予的支持,\n并且帮忙找到许多错漏。", + "Olivia——\n谢谢你,姐姐!\n\nRunnan、Nick\nReineke、\nEmmett、Poe、\nAD1337、\n Dennis、Andrew、\nAndrew MM\n Carl、Max、Amidos、\nLyndsey、Nathan\n", + "Melos想感谢:\n\n母亲和父亲的长期支持。\n\nS\n\n许多TIGSourcers以及\n其他与我们交流过的开发者!\n\nMarina,\n为整个游戏的开发作出了\n不可估量的付出。", + "Adobe、Adam\nSaltsman、\nFlashDevelop开发者、\nREAPER开发者、\nDAME制作者\nDesura、\nGamersgate\nIndieDB、\nTIGSource\n\n\n以及其他支持我的朋友们\n感谢你们!!\n\n最后,我想感谢\nTina Chen\n我一直以来的朋友\n她不仅给予我长期支持\n还介绍我与Marina相识。", + "Marina想感谢\n\nColin Meloy,\n扩展了我的词汇量\n\nTsugumo,问我\n“你想要成为一位像素艺术家吗”?\n\n我的家人,\n给予我支持与食物。\n\nDaniel,作为一名\n\"独立游戏开发者\"\n,一直伴随着我成长。", + "Mo,给予我充分的信任。\n\nTina,\n介绍我与Melos认识。\n\nMelos,和我一同制作游戏\n并且给予我信任。", + "演员表\n----\n\n\n史莱姆\n\n\n烦恼之物\n\n\n呼呼\n\n\n谢尔迪\n\n\n希尔", + "搬运者\n\n\n开开关关\n\n\n四射\n\n\砍伐者\n\n\n流氓\n", + "狗\n\n\n青蛙\n\n\n旋转体\n\n\n人\n\n\n墙\n\n", + "老鼠\n\n\n气态人\n\n\n银鱼\n\n\n冲撞者\n\n\n翻滚者\n\n\n看守人\n\n", + "清洁女工\n\n\n爆炸植物\n\n\n管理者\n\n\n", + "狮子\n\n\n扭曲\n\n\n火焰柱\n\n\n仆人\n亚瑟\n哈韦拉", + "追随者\n\n\n爱德华\n\n\n渔夫\n\n\n红沃克\n\n休斯", + "兔子\n\n\n黏黏\n\n\n店主\n\n苗小团儿\n\n兰克\n\n戈德曼", + "胸腔\n\n詹姆斯\n\n蘑菇\n\n克里克森\n\n石人\n\n居民", + "追踪者\n\n\n实体\n\n\n空间面\n\n\方块王", + "扬\n\n\n麦卓\n\n\n贤者\n\n\n荆棘", + "我们要感谢的还有\n亲爱的你!\n谢谢你玩我们的游戏!\n\n\n希望你喜欢它。", + "\n\n\n\n\n\n\n\n", + "现在,你可以使用调换功能\n无拘无束地探索\n扬的世界。\n") + } +, + elevator:{ + dialogue:new Array( + "要去几楼呢?", + "1\n", + "2\n", + "3\n", + "4\n", + "取消") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/data/SoundData.hx b/AIR/intra/hsrc/data/SoundData.hx new file mode 100644 index 0000000..0f840de --- /dev/null +++ b/AIR/intra/hsrc/data/SoundData.hx @@ -0,0 +1,849 @@ +package data +{ +import helper.Cutscene; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSave; +import org.flixel.FlxSprite; +import org.flixel.FlxBasic; +import global.Registry; +import org.flixel.FlxSound; +class SoundData +{ + + + //[Embed(source="../../../mp3/title.mp3")] public static var Title_Song:Class; + public var TITLE:FlxSound=new FlxSound(); + private var Title_Samples:Int=2491776;//checked 9-15-12 + + //[Embed(source="../../../mp3/gameover.mp3")] public static var GameOver_Song:Class; + public var GameOver:FlxSound=new FlxSound(); + private var GameOver_Samples:Int=1397376;//checked 9-15-12 + + //[Embed(source="../../../mp3/blank.mp3")] public static var Blank_Song:Class; + public var BLANK:FlxSound=new FlxSound(); + private var Blank_Samples:Int=1568576;//checked 9-15-12 + + //[Embed(source="../../../mp3/nexus.mp3")] public static var Nexus_Song:Class; + public var NEXUS:FlxSound=new FlxSound(); + private var NEXUSSAMPLES:Int=2983680;//checked 9-15-12 + + //[Embed(source="../../../mp3/street.mp3")] public static var Street_Song:Class;//street + public var STREET:FlxSound=new FlxSound(); + private var Street_Samples:Int=2118528;//checked 9-15-12 + + //[Embed(source="../../../mp3/overworld.mp3")] public static var Overworld_Song:Class;//OVERWORLD + public var OVERWORLD:FlxSound=new FlxSound(); + private var Overworld_Samples:Int=3646080;//checked 9-15-12 + + //[Embed(source="../../../mp3/mitra.mp3")] public static var Mitra_Song:Class; + public var MITRA:FlxSound=new FlxSound(); + private var MITRASAMPLES:Int=2290176;//checked 9-15-12 + + //[Embed(source="../../../mp3/bedroom.mp3")] public static var Bedroom_Song:Class;//Bedroom + public var BEDROOM:FlxSound=new FlxSound(); + private var Bedroom_Samples:Int=5293440;//checked 9-15-12 + + + public var BOSS:FlxSound=new FlxSound(); + + //[Embed(source="../../../mp3/bedroom-boss.mp3")] public static var BedroomBoss_Song:Class; + public var BEDROOMBOSS:FlxSound=new FlxSound(); + private var BEDROOMBOSSSAMPLES:Int=1580491; + + + //[Embed(source="../../../mp3/fields.mp3")] public static var Fields_Song:Class; + public var FIELDS:FlxSound=new FlxSound(); + private var FIELDSSAMPLES:Int=6298125;//checked 9-15-12 + + ///* + //[Embed(source="../../../mp3/beach.mp3")] public static var Beach_Song:Class; + public var BEACH:FlxSound=new FlxSound(); + private var Beach_Samples:Int=3479040; + + + + //[Embed(source="../../../mp3/red_cave.mp3")] public static var Red_Cave_Song:Class; + public var REDCAVE:FlxSound=new FlxSound();//checked 10-7-12 + private var Red_Cave_Samples:Int=4021920; + + + + //[Embed(source="../../../mp3/red_sea.mp3")] public static var Red_Sea_Song:Class; + public var REDSEA:FlxSound=new FlxSound(); + private var Red_Sea_Samples:Int=2723328; + + //[Embed(source="../../../mp3/redcave-boss.mp3")] public static var RedcaveBoss_Song:Class; + public var REDCAVEBOSS:FlxSound=new FlxSound(); + private var REDCAVEBOSSSAMPLES:Int=1881600; + + //[Embed(source="../../../mp3/windmill.mp3")] public static var Windmill_Song:Class; + public var WINDMILL:FlxSound=new FlxSound(); + private var WINDMILLSAMPLES:Int=5019267;// checked 10-20-12 + + // END EXTENDED DEMO + + //[Embed(source="../../../mp3/apartment.mp3")] public static var Apartment_Song:Class; + public var APARTMENT:FlxSound=new FlxSound(); + private var APARTMENTSAMPLES:Int=8192009; + + + //[Embed(source="../../../mp3/forest.mp3")] public static var Forest_Song:Class; + public var FOREST:FlxSound=new FlxSound(); + private var FORESTSAMPLES:Int=6542962;// 10-26 + //[Embed(source="../../../mp3/cliff.mp3")] public static var Cliff_Song:Class; + public var CLIFF:FlxSound=new FlxSound(); + private var CLIFFSAMPLES:Int=5840402;// 10-26 + //[Embed(source="../../../mp3/crowd.mp3")] public static var Crowd_Song:Class; + public var CROWD:FlxSound=new FlxSound();//checked 10-7-12 + private var CROWDSAMPLES:Int=6919426; + //[Embed(source="../../../mp3/space.mp3")] public static var Space_Song:Class; + public var SPACE:FlxSound=new FlxSound();//1-8-12 + private var SPACESAMPLES:Int=4907395; + //[Embed(source="../../../mp3/terminal.mp3")] public static var Terminal_Song:Class; + public var TERMINAL:FlxSound=new FlxSound(); + private var TERMINALSAMPLES:Int=7560503;// 1-8-12 + //[Embed(source="../../../mp3/cell.mp3")] public static var Cell_Song:Class; + public var CELL:FlxSound=new FlxSound(); + private var CELLSAMPLES:Int=5409600;//11-3-12 + + //[Embed(source="../../../mp3/suburb.mp3")] public static var Suburb_Song:Class; + public var SUBURB:FlxSound=new FlxSound(); + private var SUBURBSAMPLES:Int=3182553; + + + //[Embed(source="../../../mp3/roof.mp3")] public static var Roof_Song:Class; + public var ROOF:FlxSound=new FlxSound(); + private var ROOFSAMPLES:Int=7112084; + + + //[Embed(source="../../../mp3/circus.mp3")] public static var Circus_Song:Class; + public var CIRCUS:FlxSound=new FlxSound(); + private var CIRCUSSAMPLES:Int=7566553; + + //[Embed(source="../../../mp3/hotel.mp3")] public static var Hotel_Song:Class; + public var HOTEL:FlxSound=new FlxSound();// 12-2-12 + private var HOTELSAMPLES:Int=9328688; + + //[Embed(source="../../../mp3/happy.mp3")] public static var Happy_Song:Class; + public var HAPPY:FlxSound=new FlxSound(); + private var HAPPYSAMPLES:Int=4456421;//checked 11-3-12 + + + + + //[Embed(source="../../../mp3/blue.mp3")] public static var Blue_Song:Class; + public var BLUE:FlxSound=new FlxSound(); + private var BLUESAMPLES:Int=6755745;//12-8-12 + + + + //[Embed(source="../../../mp3/go.mp3")] public static var Go_Song:Class; + public var GO:FlxSound=new FlxSound(); + private var GOSAMPLES:Int=8090854; + + + //[Embed(source="../../../mp3/sagefight.mp3")] public static var Sagefight_Song:Class; + public var SAGEFIGHT:FlxSound=new FlxSound();// checked 10-20-12 + private var SAGEFIGHTSAMPLES:Int=7467224; + private var SAGEFIGHTLOOP:Int=2061770; + + + + //[Embed(source="../../../mp3/happy-init.mp3")] public static var Happyinit_song:Class; + public var HAPPYINIT:FlxSound=new FlxSound(); + private var HAPPYINITSAMPLES:Int=1128960; + + //[Embed(source="../../../mp3/ending.mp3")] public static var Ending_Song:Class; + public var ENDING:FlxSound=new FlxSound(); + private var ENDINGSAMPLES:Int=15323054; + + //[Embed(source="../../../mp3/briar-fight.mp3")] public static var BriarFight_Song:Class; + public var BRIARFIGHT:FlxSound=new FlxSound(); + private var BRIARFIGHTSAMPLES:Int=5171605;// 11-25-12 + + + //[Embed(source="../../../mp3/pre_terminal.mp3")] public static var PreTerminal_Song:Class; + public var PRETERMINAL:FlxSound=new FlxSound(); + private var PRETERMSAMPLES:Int=1226195; + + + + //[Embed(source="../../../mp3/soft.mp3")] public static var Soft_Song:Class; + public var SOFT:FlxSound=new FlxSound(); + private var SOFTSAMPLES:Int=5007429; + + //[Embed(source="../../../mp3/crowd_boss.mp3")] public static var CrowdBoss_Song:Class; + public var CROWDBOSS:FlxSound=new FlxSound(); + private var CROWDBOSSSAMPLES:Int=1128960; + + //[Embed(source="../../../mp3/apartment-boss.mp3")] public static var ApartmentBoss_Song:Class; + public var APARTMENTBOSS:FlxSound=new FlxSound(); + private var APARTMENTBOSSSAMPLES:Int=1411199; + + //[Embed(source="../../../mp3/hotel-boss.mp3")] public static var HotelBoss_Song:Class; + public var HOTELBOSS:FlxSound=new FlxSound(); + private var HOTELBOSSSAMPLES:Int=1394129; + + //[Embed(source="../../../mp3/circus-boss.mp3")] public static var CircusBoss_Song:Class; + public var CIRCUSBOSS:FlxSound=new FlxSound(); + private var CIRCUSBOSSSAMPLES:Int=1299789; + + //*/ + + + /* Gadgets */ + //[Embed(source="../../../sfx/unlock.mp3")] private var S_UNLOCK:Class;// Open locked door + //[Embed(source="../../../sfx/open.mp3")] private var S_OPEN:Class;// Gate open jingle + //[Embed(source="../../../sfx/pushblock.mp3")] private var S_PUSH_BLOCK:Class; + //[Embed(source="../../../sfx/gettreasure.mp3")] private var S_GET_TREASURE:Class; + //[Embed(source="../../../sfx/keyget.mp3")] private var S_GET_KEY:Class;// + //[Embed(source="../../../sfx/button_up.mp3")] public static var S_BUTTON_UP:Class; + //[Embed(source="../../../sfx/button_down.mp3")] public static var S_BUTTON_DOWN:Class; + //[Embed(source="../../../sfx/floor_crack.mp3")] public static var S_FLOOR_CRACK:Class; + //[Embed(source="../../../sfx/big_door_locked.mp3")] public static var S_Big_Door_Locked:Class; + //[Embed(source="../../../sfx/fall_1.mp3")] public static var sfall1:Class;//Falling - spike roller + //[Embed(source="../../../sfx/hit_ground_1.mp3")] public static var shitground1:Class;//Spike roller hits walls + //[Embed(source="../../../sfx/sparkle_1.mp3")] public static var sparkle_1_c:Class; + //[Embed(source="../../../sfx/sparkle_2.mp3")] public static var sparkle_2_c:Class; + //[Embed(source="../../../sfx/sparkle_3.mp3")] public static var sparkle_3_c:Class; + //[Embed(source="../../../sfx/dash_pad_1.mp3")] public static var embed_dash_pad_1:Class;// + //[Embed(source="../../../sfx/dash_pad_2.mp3")] public static var embed_dash_pad_2:Class; + //[Embed(source="../../../sfx/spring_bounce.mp3")] public static var embed_spring_bounce:Class; + + + + /* Other things */ + //[Embed(source="../../../sfx/cicada_chirp.mp3")] public static var cicada_chirp_c:Class; + //[Embed(source="../../../sfx/cross2.mp3")] public static var embed_cross2:Class; + //[Embed(source="../../../sfx/cross3.mp3")] public static var embed_cross3:Class; + //[Embed(source="../../../sfx/cross4.mp3")] public static var embed_cross4:Class; + + + + + /* Bedroom */ + //[Embed(source="../../../sfx/laser-pew.mp3")] public static var S_LASER_PEW:Class; + //[Embed(source="../../../sfx/shieldy-hit.mp3")] public static var S_SHIELDY_HIT:Class; + //[Embed(source="../../../sfx/shieldy_ineffective.mp3")] public static var shieldy_ineffective_embed:Class; + //[Embed(source="../../../sfx/slime_walk.mp3")] public static var slime_walk_embed:Class; + //[Embed(source="../../../sfx/slime_splash.mp3")] public static var slime_splash_embed:Class; + //[Embed(source="../../../sfx/slime_shoot.mp3")] public static var slime_shoot_embed:Class; + + /* Sun boss */ + //[Embed(source="../../../sfx/sun_guy_scream2.mp3")] public static var S_SUN_GUY_SCREAM:Class;//softer + //[Embed(source="../../../sfx/sun_guy_charge.mp3")] public static var S_SUN_GUY_CHARGE:Class;// + + /* Redcave */ + //[Embed(source="../../../sfx/slasher_atk.mp3")] public static var slasher_atk_embed:Class;// + //[Embed(source="../../../sfx/on_off_laser_shoot.mp3")] public static var on_off_laser_shoot_embed:Class; + //[Embed(source="../../../sfx/4sht_shoot.mp3")] public static var four_shooter_shoot:Class; + //[Embed(source="../../../sfx/4sht_pop.mp3")] public static var four_shooter_pop:Class; + //[Embed(source="../../../sfx/mover_die.mp3")] public static var mover_die:Class; + //[Embed(source="../../../sfx/mover_move.mp3")] public static var mover_move:Class; + //[Embed(source="../../../sfx/red_cave_rise.mp3")] public static var embed_red_cave_rise:Class; + + /* Red boss */ + //[Embed(source="../../../sfx/bubble_loop.mp3")] public static var embed_bubble_loop:Class; + //[Embed(source="../../../sfx/bubble_1.mp3")] public static var embed_bubble_1:Class; + //[Embed(source="../../../sfx/bubble_2.mp3")] public static var embed_bubble_2:Class; + //[Embed(source="../../../sfx/bubble_3.mp3")] public static var embed_bubble_3:Class; + //[Embed(source="../../../sfx/bubble_triple.mp3")] public static var embed_bubble_triple:Class; + //[Embed(source="../../../sfx/redboss_moan.mp3")] public static var embed_redboss_moan:Class; + //[Embed(source="../../../sfx/small_wave.mp3")] public static var embed_small_wave:Class; + //[Embed(source="../../../sfx/big_wave.mp3")] public static var embed_big_wave:Class; + //[Embed(source="../../../sfx/redboss_death.mp3")] public static var embed_redboss_death:Class; + + + /* Crowd */ + //[Embed(source="../../../sfx/dog_bark.mp3")] public static var embed_dog_bark:Class;// + //[Embed(source="../../../sfx/dog_dash.mp3")] public static var embed_dog_dash:Class; + //[Embed(source="../../../sfx/talk_1.mp3")] public static var embed_talk_1:Class; + //[Embed(source="../../../sfx/talk_2.mp3")] public static var embed_talk_2:Class; + //[Embed(source="../../../sfx/talk_3.mp3")] public static var embed_talk_3:Class; + + //wallboss + //[Embed(source="../../../sfx/wb_hit_ground.mp3")] public static var embed_wb_hit_ground:Class; + //[Embed(source="../../../sfx/wb_tap_ground.mp3")] public static var embed_wb_tap_ground:Class; + //[Embed(source="../../../sfx/wb_shoot.mp3")] public static var embed_wb_shoot:Class; + //[Embed(source="../../../sfx/wb_moan.mp3")] public static var embed_wb_moan:Class; + //[Embed(source="../../../sfx/wb_moan_2.mp3")] public static var embed_wb_moan_2:Class; + //[Embed(source="../../../sfx/talk_death.mp3")] public static var embed_talk_death:Class; + + + //apt + + //[Embed(source="../../../sfx/teleguy_up.mp3")] public static var embed_teleguy_up:Class; + //[Embed(source="../../../sfx/teleguy_down.mp3")] public static var embed_teleguy_down:Class; + //[Embed(source="../../../sfx/gasguy_shoot.mp3")] public static var embed_gasguy_shoot:Class; + //[Embed(source="../../../sfx/gasguy_move.mp3")] public static var embed_gasguy_move:Class; + //[Embed(source="../../../sfx/sf_move.mp3")] public static var embed_sf_move:Class; + //[Embed(source="../../../sfx/rat_move.mp3")] public static var embed_rat_move:Class; + + //splitboss + + //[Embed(source="../../../sfx/sb_split.mp3")] public static var embed_sb_split:Class; + //[Embed(source="../../../sfx/sb_ball_appear.mp3")] public static var embed_sb_ball_appear:Class; + //[Embed(source="../../../sfx/sb_hurt.mp3")] public static var embed_sb_hurt:Class; + //[Embed(source="../../../sfx/sb_dash.mp3")] public static var embed_sb_dash:Class; + /* hotel */ + + //[Embed(source="../../../sfx/dustmaid_alert.mp3")] public static var embed_dustmaid_alert:Class; + //[Embed(source="../../../sfx/elevator_open.mp3")] public static var embed_elevator_open:Class; + //[Embed(source="../../../sfx/elevator_close.mp3")] public static var embed_elevator_close:Class; + + + /* Circus */ + + //[Embed(source="../../../sfx/flame_pillar.mp3")] public static var embed_flame_pillar:Class; + //[Embed(source="../../../sfx/fireball.mp3")] public static var embed_fireball:Class; + + /* etc */ + //[Embed(source="../../../sfx/briar_shine.mp3")] public static var embed_briar_shine:Class;// + //[Embed(source="../../../sfx/stream.mp3")] public static var embed_stream:Class; + //[Embed(source="../../../sfx/dust_explode.mp3")] public static var embed_dust_explode:Class; + + + /* Explosions/rumbles */ + //[Embed(source="../../../sfx/hit_wall.mp3")] public static var S_HIT_WALL:Class;//Bat die, sun guy hit wall + //[Embed(source="../../../sfx/sun_guy_death_long.mp3")] public static var S_SUN_GUY_DEATH_L:Class; + //[Embed(source="../../../sfx/sun_guy_death_short.mp3")] public static var S_SUN_GUY_DEATH_S:Class; + //[Embed(source="../../../sfx/broom_hit.mp3")] public static var embed_broom_hit:Class; + + + /* Player */ + //[Embed(source="../../../sfx/player_hit_1.mp3")] public static var S_PLAYER_HIT_1:Class;//Hitting an enemy + //[Embed(source="../../../sfx/noise_step_1.mp3")] public static var S_NOISE_STEP_1:Class; + //[Embed(source="../../../sfx/water_step.mp3")] public static var water_step:Class; + //[Embed(source="../../../sfx/enter_door.mp3")] public static var embed_enter_door:Class; + + //[Embed(source="../../../sfx/fall_in_hole.mp3")] private var S_FALL_IN_HOLE:Class;// + //[Embed(source="../../../sfx/get_small_health.mp3")] public static var S_GET_SMALL_HEALTH:Class; + //[Embed(source="../../../sfx/swing_broom_1.mp3")] public static var swing_broom_1:Class; + //[Embed(source="../../../sfx/swing_broom_2.mp3")] public static var swing_broom_2:Class; + //[Embed(source="../../../sfx/swing_broom_3.mp3")] public static var swing_broom_3:Class; + + //[Embed(source="../../../sfx/player_jump_up.mp3")] private static var player_jump_up_sound:Class; + //[Embed(source="../../../sfx/player_jump_down.mp3")] private static var player_jump_down_sound:Class; + //[Embed(source="../../../sfx/puddle_up.mp3")] private static var embed_puddle_up:Class; + //[Embed(source="../../../sfx/puddle_down.mp3")] private static var embed_puddle_down:Class; + //[Embed(source="../../../sfx/puddle_step.mp3")] private static var embed_puddle_step:Class; + //[Embed(source="../../../sfx/ladder_step_2.mp3")] private static var embed_ladder_step_2:Class; + //[Embed(source="../../../sfx/ladder_step_1.mp3")] private static var embed_ladder_step_1:Class; + + + //[Embed(source="../../../sfx/teleport_up.mp3")] public static var S_TELEPORT_UP:Class;// + //[Embed(source="../../../sfx/teleport_down.mp3")] public static var S_TELEPORT_DOWN:Class; + + /* Ambient */ + //[Embed(source="../../../sfx/wavesandwind.mp3")] private var S_BEACH_WAVES:Class; + //[Embed(source="../../../sfx/rain.mp3")] private var embed_rain:Class; + + /* Menu */ + //[Embed(source="../../../sfx/menu_move.mp3")] public static var S_MENU_MOVE:Class; + //[Embed(source="../../../sfx/menu_select.mp3")] public static var S_MENU_SELECT:Class; + //[Embed(source="../../../sfx/pause_sound.mp3")] public static var S_PAUSE_SOUND:Class; + //[Embed(source="../../../sfx/dialogue_bloop.mp3")] public static var dialogue_bloop_embed:Class; + //[Embed(source="../../../sfx/dialogue_blip.mp3")] public static var dialogue_blip_embed:Class; + + public var unlock:FlxSound=new FlxSound(); + public var open:FlxSound=new FlxSound(); + public var fall_in_hole:FlxSound=new FlxSound(); + public var push_block:FlxSound=new FlxSound(); + public var button_up:FlxSound=new FlxSound(); + public var button_down:FlxSound=new FlxSound(); + public var floor_crack:FlxSound=new FlxSound(); + public var get_treasure:FlxSound=new FlxSound(); + public var get_key:FlxSound=new FlxSound(); + public var dash_pad_1:FlxSound=new FlxSound(); + public var dash_pad_2:FlxSound=new FlxSound(); + public var spring_bounce:FlxSound=new FlxSound(); + public var waves:FlxSound=new FlxSound(); + public var waves_samples:Int=1322496;//why is this here + public var rain:FlxSound=new FlxSound(); + public var puddle_up:FlxSound=new FlxSound(); + public var puddle_down:FlxSound=new FlxSound(); + public var puddle_step:FlxGroup=new FlxGroup(2); + public var rain_samples:Int=236955; + public var ladder_step:FlxGroup=new FlxGroup(2); + + public var sun_guy_death_l:FlxSound=new FlxSound(); + public var sun_guy_death_s:FlxSound=new FlxSound(); + public var sun_guy_scream:FlxSound=new FlxSound(); + public var sun_guy_charge:FlxSound=new FlxSound(); + + public var player_jump_down:FlxSound=new FlxSound(); + public var player_jump_up:FlxSound=new FlxSound(); + public var enter_door:FlxSound=new FlxSound(); + public var player_hit_1:FlxSound=new FlxSound(); + public var broom_hit:FlxSound=new FlxSound(); + + public var teleport_up:FlxSound=new FlxSound(); + public var teleport_down:FlxSound=new FlxSound(); + + public var shieldy_hit:FlxSound=new FlxSound(); + public var shieldy_ineffective:FlxGroup=new FlxGroup(4); + + //redcave + + public var red_cave_rise:FlxSound=new FlxSound(); + + public var bubble_loop:FlxSound=new FlxSound(); + public var redboss_moan:FlxSound=new FlxSound(); + public var small_wave:FlxSound=new FlxSound(); + public var big_wave:FlxSound=new FlxSound(); + public var redboss_death:FlxSound=new FlxSound(); + + //crod + public var dog_dash:FlxGroup=new FlxGroup(3); + + public var talk_group:FlxGroup=new FlxGroup(5); + + public var wb_tap_ground:FlxSound=new FlxSound(); + public var wb_hit_ground:FlxSound=new FlxSound(); + public var wb_shoot:FlxSound=new FlxSound(); + public var wb_moan:FlxSound=new FlxSound(); + public var wb_moan_2:FlxSound=new FlxSound(); + + public var talk_death:FlxSound=new FlxSound(); + + //apt + public var teleguy_up:FlxSound=new FlxSound(); + + public var teleguy_down:FlxSound=new FlxSound(); + public var gasguy_shoot:FlxSound=new FlxSound(); + public var gasguy_move:FlxGroup=new FlxGroup(2); + public var rat_move:FlxGroup=new FlxGroup(2); + + public var sb_split:FlxSound=new FlxSound(); + public var sb_hurt:FlxSound=new FlxSound(); + public var sb_dash:FlxSound=new FlxSound(); + public var sb_ball_appear:FlxGroup=new FlxGroup(5); + + public var sf_move:FlxGroup=new FlxGroup(3); + //hotel + + public var dustmaid_alert:FlxSound=new FlxSound(); + public var elevator_open:FlxSound=new FlxSound(); + public var elevator_close:FlxSound=new FlxSound(); + + //circus + public var flame_pillar_group:FlxGroup=new FlxGroup(2); + public var fireball_group:FlxGroup=new FlxGroup(4); + + public var get_small_health:FlxSound=new FlxSound(); + public var big_door_locked:FlxSound=new FlxSound(); + public var hitground1:FlxSound=new FlxSound(); + public var fall1:FlxSound=new FlxSound(); + public var slasher_atk:FlxSound=new FlxSound(); + public var on_off_laser_shoot:FlxSound=new FlxSound(); + public var dialogue_bloop:FlxSound=new FlxSound(); + public var cicada_chirp:FlxSound=new FlxSound(); + + // Etc + + public var briar_shine_group:FlxGroup=new FlxGroup(8); + public var stream_sound:FlxSound=new FlxSound(); + public var dust_explode_group:FlxGroup=new FlxGroup(3); + public var mushroom_sound_group:FlxGroup=new FlxGroup(3); + + /* Groups of sounds! */ + public var slime_walk_group:FlxGroup=new FlxGroup(5); + public var slime_splash_group:FlxGroup=new FlxGroup(8); + public var slime_shoot_group:FlxGroup=new FlxGroup(2); + + public var four_shooter_shoot_group:FlxGroup=new FlxGroup(2); + public var four_shooter_pop_group:FlxGroup=new FlxGroup(3); + public var mover_move_group:FlxGroup=new FlxGroup(2); + public var mover_die_group:FlxGroup=new FlxGroup(2); + + public var bubble_group:FlxGroup=new FlxGroup(4); + public var bubble_triple_group:FlxGroup=new FlxGroup(4); + + public var laser_pew_group:FlxGroup=new FlxGroup(2); + public var menu_move_group:FlxGroup=new FlxGroup(3); + public var menu_select_group:FlxGroup=new FlxGroup(2); + public var pause_sound_group:FlxGroup=new FlxGroup(2); + public var enemy_explode_1_group:FlxGroup=new FlxGroup(5); + public var swing_broom_group:FlxGroup=new FlxGroup(3); + public var water_step_group:FlxGroup=new FlxGroup(3); + public var dialogue_blip_group:FlxGroup=new FlxGroup(5); + public var sparkle_group:FlxGroup=new FlxGroup(5); + + public var dog_bark_group:FlxGroup=new FlxGroup(2); + + public var current_song_name:String="BEDROOM"; + public var current_song:FlxSound=new FlxSound(); + + public function new(){ + /* Init usually-one-off-noises. */ + unlock.loadEmbedded(S_UNLOCK, false); + open.loadEmbedded(S_OPEN, false); + push_block.loadEmbedded(S_PUSH_BLOCK, false); + get_treasure.loadEmbedded(S_GET_TREASURE, false); + get_key.loadEmbedded(S_GET_KEY, false); + waves.loadEmbedded(S_BEACH_WAVES, true, waves_samples); + rain.loadEmbedded(embed_rain, true, rain_samples); + fall_in_hole.loadEmbedded(S_FALL_IN_HOLE, false); + button_down.loadEmbedded(S_BUTTON_DOWN); + button_up.loadEmbedded(S_BUTTON_UP); + floor_crack.loadEmbedded(S_FLOOR_CRACK); + big_door_locked.loadEmbedded(S_Big_Door_Locked); + hitground1.loadEmbedded(shitground1); + fall1.loadEmbedded(sfall1); + dash_pad_1.loadEmbedded(embed_dash_pad_1); + dash_pad_2.loadEmbedded(embed_dash_pad_2); + spring_bounce.loadEmbedded(embed_spring_bounce); + puddle_up.loadEmbedded(embed_puddle_up, false); + puddle_down.loadEmbedded(embed_puddle_down, false); + init_sound_group(puddle_step, embed_puddle_step); + init_multi_sound_group(ladder_step, new Array(embed_ladder_step_1, embed_ladder_step_2), false); + + slasher_atk.loadEmbedded(slasher_atk_embed, false); + on_off_laser_shoot.loadEmbedded(on_off_laser_shoot_embed, false); + + sun_guy_death_l.loadEmbedded(S_SUN_GUY_DEATH_L); + sun_guy_death_s.loadEmbedded(S_SUN_GUY_DEATH_S); + sun_guy_scream.loadEmbedded(S_SUN_GUY_SCREAM); + sun_guy_charge.loadEmbedded(S_SUN_GUY_CHARGE); + + //redcave + + red_cave_rise.loadEmbedded(embed_red_cave_rise); + bubble_loop.loadEmbedded(embed_bubble_loop, true, 89508); + redboss_moan.loadEmbedded(embed_redboss_moan); + big_wave.loadEmbedded(embed_big_wave, false); + small_wave.loadEmbedded(embed_small_wave, false); + redboss_death.loadEmbedded(embed_redboss_death); + + //crowd + init_sound_group(dog_dash, embed_dog_dash); + + init_multi_sound_group(talk_group, new Array(embed_talk_1, embed_talk_1, embed_talk_2, embed_talk_3, embed_talk_3)); + wb_hit_ground.loadEmbedded(embed_wb_hit_ground); + wb_tap_ground.loadEmbedded(embed_wb_tap_ground); + wb_shoot.loadEmbedded(embed_wb_shoot); + wb_moan.loadEmbedded(embed_wb_moan); + wb_moan_2.loadEmbedded(embed_wb_moan_2); + talk_death.loadEmbedded(embed_talk_death); + + //apt + teleguy_down.loadEmbedded(embed_teleguy_down); + teleguy_up.loadEmbedded(embed_teleguy_up); + gasguy_shoot.loadEmbedded(embed_gasguy_shoot); + init_sound_group(gasguy_move, embed_gasguy_move) + init_sound_group(rat_move, embed_rat_move); + + sb_split.loadEmbedded(embed_sb_split); + init_sound_group(sb_ball_appear, embed_sb_ball_appear); + sb_dash.loadEmbedded(embed_sb_dash); + sb_hurt.loadEmbedded(embed_sb_hurt); + + init_sound_group(sf_move, embed_sf_move); + + + //hotel + dustmaid_alert.loadEmbedded(embed_dustmaid_alert); + elevator_close.loadEmbedded(embed_elevator_close); + elevator_open.loadEmbedded(embed_elevator_open); + //circus + init_sound_group(flame_pillar_group, embed_flame_pillar); + init_sound_group(fireball_group, embed_fireball); + + player_hit_1.loadEmbedded(S_PLAYER_HIT_1); + enter_door.loadEmbedded(embed_enter_door); + player_jump_down.loadEmbedded(player_jump_down_sound); + player_jump_up.loadEmbedded(player_jump_up_sound); + broom_hit.loadEmbedded(embed_broom_hit); + + teleport_down.loadEmbedded(S_TELEPORT_DOWN); + teleport_up.loadEmbedded(S_TELEPORT_UP); + shieldy_hit.loadEmbedded(S_SHIELDY_HIT, false); + init_sound_group(shieldy_ineffective, shieldy_ineffective_embed); + get_small_health.loadEmbedded(S_GET_SMALL_HEALTH, false); + dialogue_bloop.loadEmbedded(dialogue_bloop_embed); + cicada_chirp.loadEmbedded(cicada_chirp_c); + + GameOver.loadEmbedded(GameOver_Song); + + stream_sound.loadEmbedded(embed_stream); + init_sound_group(dust_explode_group, embed_dust_explode); + + /* Init repeated noises */ + init_sound_group(laser_pew_group, S_LASER_PEW,false,0.1); + init_sound_group(slime_walk_group, slime_walk_embed); + init_sound_group(slime_shoot_group, slime_shoot_embed); + init_sound_group(slime_splash_group, slime_splash_embed); + init_sound_group(briar_shine_group, embed_briar_shine); + + init_sound_group(four_shooter_pop_group, four_shooter_pop); + init_sound_group(four_shooter_shoot_group, four_shooter_shoot); + init_sound_group(mover_move_group, mover_move); + init_sound_group(mover_die_group, mover_die); + + init_multi_sound_group(bubble_group, new Array(embed_bubble_1, embed_bubble_1, embed_bubble_2, embed_bubble_3)); + init_sound_group(bubble_triple_group, embed_bubble_triple); + + init_sound_group(dog_bark_group, embed_dog_bark); + + init_multi_sound_group(mushroom_sound_group, new Array(embed_cross2, embed_cross3, embed_cross4), false, 1); + init_sound_group(menu_move_group, S_MENU_MOVE); + init_sound_group(menu_select_group, S_MENU_SELECT); + init_sound_group(dialogue_blip_group, dialogue_blip_embed); + init_sound_group(pause_sound_group, S_PAUSE_SOUND); + init_sound_group(enemy_explode_1_group, S_HIT_WALL, false, 0.3); + init_sound_group(water_step_group, water_step, false, 1); + init_multi_sound_group(swing_broom_group, new Array(swing_broom_1, swing_broom_2, swing_broom_3), false, 1); + init_multi_sound_group(sparkle_group, new Array(sparkle_1_c, sparkle_1_c, sparkle_2_c, sparkle_2_c,sparkle_3_c), false, 1); + + } + + public function init_sound_group(g:FlxGroup, embed_sound:Class, looped:Bool=false,volume:Float=1):Void { + for(i in 0...g.maxSize){ + var s:FlxSound=new FlxSound(); + s.loadEmbedded(embed_sound, looped); + s.volume=volume; + g.add(s); + } + } + + public function init_multi_sound_group(g:FlxGroup, sounds:Array, looped:Bool=false, volume:Float=1):Void { + for(var sound:Class in sounds){ + var s:FlxSound=new FlxSound; + s.loadEmbedded(sound, looped, volume); + g.add(s); + } + } + + /** + * Given a sound object to reference what to play and + * the title of the song, play it. + * + * @param song + * @param title + */ + public var trigger_soft:Bool=false; + public function start_song_from_title(title:String):Void { + if(current_song==null)current_song=new FlxSound(); + if(current_song.playing)current_song.stop(); + + if(!Registry.sound_data.hasOwnProperty(title)){ + if(title=="TRAIN"){ + title="CELL";//<_< + } else if(title=="DRAWER"){ + // No music in post-death area + if(true==Registry.GAMESTATE.in_death_room){ + return; + } + title="SUBURB"; + } else { + title="BEDROOM"; + } + } + if(Registry.E_PLAY_ROOF){ + if(Registry.CURRENT_MAP_NAME=="REDCAVE" || Registry.CURRENT_MAP_NAME=="REDSEA"){ + title="REDCAVE"; + } else { + title="ROOF"; + } + Registry.E_PLAY_ROOF=false; + } + + if(title=="HAPPY"){ + if(!Registry.GE_States[Registry.GE_Happy_Started]){ + title="HAPPYINIT"; + } + } + + + if(title=="TERMINAL"){ + if(false==Registry.GE_States[Registry.GE_Sage_Dead_Idx]){ + title="PRETERMINAL"; + } + } + + if(title=="SUBURB"){ + if(trigger_soft){ + trigger_soft=false; + title="SOFT"; + } + } + + if(title=="BOSS"){ + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + title="BEDROOMBOSS"; + break; + case "REDCAVE": + title="REDCAVEBOSS"; + break; + case "CROWD": + title="CROWDBOSS"; + break; + case "APARTMENT": + title="APARTMENTBOSS"; + break; + case "HOTEL": + title="HOTELBOSS"; + break; + case "CIRCUS": + title="CIRCUSBOSS"; + break; + default: + title="BEDROOMBOSS"; + break; + + } + } + + //title="TITLE";// remove + Registry.sound_data[title]=null; + Registry.sound_data[title]=new FlxSound(); + //Registry.sound_data[title].loadEmbedded(Title_Song, true, Title_Samples);// remove + ///* + if(title=="BEDROOM"){ + Registry.sound_data.BEDROOM.loadEmbedded(Bedroom_Song, true, Bedroom_Samples); + } else if(title=="OVERWORLD"){ + Registry.sound_data.OVERWORLD.loadEmbedded(Overworld_Song, true, Overworld_Samples); + } else if(title=="STREET"){ + Registry.sound_data.STREET.loadEmbedded(Street_Song, true, Street_Samples); + } else if(title=="BLANK"){ + Registry.sound_data.BLANK.loadEmbedded(Blank_Song, true, Blank_Samples); + } else if(title=="TITLE"){ + Registry.sound_data.TITLE.loadEmbedded(Title_Song, true, Title_Samples); + }else if(title=="MITRA"){ + Registry.sound_data.MITRA.loadEmbedded(Mitra_Song, true, MITRASAMPLES); + } else if(title=="FIELDS"){ + Registry.sound_data.FIELDS.loadEmbedded(Fields_Song, true, FIELDSSAMPLES); + }else if(title=="NEXUS"){ + Registry.sound_data.NEXUS.loadEmbedded(Nexus_Song, true, NEXUSSAMPLES); + } else if(title=="BEDROOMBOSS"){ + Registry.sound_data.BEDROOMBOSS.loadEmbedded(BedroomBoss_Song, true, BEDROOMBOSSSAMPLES); + } + ///* + else if(title==="BEACH"){ + Registry.sound_data.BEACH.loadEmbedded(Beach_Song, true, Beach_Samples); + } else if(title=="REDSEA"){ + Registry.sound_data.REDSEA.loadEmbedded(Red_Sea_Song, true, Red_Sea_Samples); + } else if(title=="REDCAVE"){ + Registry.sound_data.REDCAVE.loadEmbedded(Red_Cave_Song, true, Red_Cave_Samples); + } else if(title=="REDCAVEBOSS"){ + Registry.sound_data.REDCAVEBOSS.loadEmbedded(RedcaveBoss_Song, true, REDCAVEBOSSSAMPLES); + } else if(title=="WINDMILL"){ + Registry.sound_data.WINDMILL.loadEmbedded(Windmill_Song, true, WINDMILLSAMPLES); + }else if(title=="APARTMENT"){ + Registry.sound_data.APARTMENT.loadEmbedded(Apartment_Song, true, APARTMENTSAMPLES); + }else if(title=="FOREST"){ + Registry.sound_data.FOREST.loadEmbedded(Forest_Song, true, FORESTSAMPLES); + } else if(title=="SPACE"){ + Registry.sound_data.SPACE.loadEmbedded(Space_Song, true, SPACESAMPLES); + } else if(title=="CLIFF"){ + Registry.sound_data.CLIFF.loadEmbedded(Cliff_Song, true, CLIFFSAMPLES); + } else if(title=="TERMINAL"){ + Registry.sound_data.TERMINAL.loadEmbedded(Terminal_Song, true, TERMINALSAMPLES); + } else if(title=="CROWD"){ + Registry.sound_data.CROWD.loadEmbedded(Crowd_Song, true, CROWDSAMPLES); + } else if(title=="CELL"){ + Registry.sound_data.CELL.loadEmbedded(Cell_Song, true, CELLSAMPLES); + } else if(title=="SUBURB"){ + Registry.sound_data.SUBURB.loadEmbedded(Suburb_Song, true, SUBURBSAMPLES); + } else if(title=="ROOF"){ + Registry.sound_data.ROOF.loadEmbedded(Roof_Song, true, ROOFSAMPLES); + } else if(title=="CIRCUS"){ + Registry.sound_data.CIRCUS.loadEmbedded(Circus_Song, true, CIRCUSSAMPLES,2009500); + } else if(title=="HOTEL"){ + Registry.sound_data.HOTEL.loadEmbedded(Hotel_Song, true, HOTELSAMPLES); + } else if(title=="GO"){ + Registry.sound_data.GO.loadEmbedded(Go_Song, true, GOSAMPLES); + } else if(title=="HAPPY"){ + Registry.sound_data.HAPPY.loadEmbedded(Happy_Song, true, HAPPYSAMPLES); + } else if(title=="BLUE"){ + Registry.sound_data.BLUE.loadEmbedded(Blue_Song, true, BLUESAMPLES); + } else if(title=="SAGEFIGHT"){ + Registry.sound_data.SAGEFIGHT.loadEmbedded(Sagefight_Song, true, SAGEFIGHTSAMPLES,SAGEFIGHTLOOP); + } else if(title=="HAPPYINIT"){ + Registry.sound_data.HAPPYINIT.loadEmbedded(Happyinit_song, true, HAPPYINITSAMPLES); + } else if(title=="ENDING"){ + Registry.sound_data.ENDING.loadEmbedded(Ending_Song,false, ENDINGSAMPLES); + } else if(title=="BRIARFIGHT"){ + Registry.sound_data.BRIARFIGHT.loadEmbedded(BriarFight_Song, true, BRIARFIGHTSAMPLES); + } else if(title=="PRETERMINAL"){ + Registry.sound_data.PRETERMINAL.loadEmbedded(PreTerminal_Song, true, PRETERMSAMPLES); + } else if(title=="DRAWER"){ + Registry.sound_data.SUBURB.loadEmbedded(Suburb_Song, true, SUBURBSAMPLES); + } else if(title=="SOFT"){ + Registry.sound_data.SOFT.loadEmbedded(Soft_Song, true, SOFTSAMPLES); + } else if(title=="CIRCUSBOSS"){ + Registry.sound_data.CIRCUSBOSS.loadEmbedded(CircusBoss_Song, true, CIRCUSBOSSSAMPLES); + } else if(title=="HOTELBOSS"){ + Registry.sound_data.HOTELBOSS.loadEmbedded(HotelBoss_Song, true, HOTELBOSSSAMPLES); + } else if(title=="APARTMENTBOSS"){ + Registry.sound_data.APARTMENTBOSS.loadEmbedded(ApartmentBoss_Song, true, APARTMENTBOSSSAMPLES); + } else if(title=="CROWDBOSS"){ + Registry.sound_data.CROWDBOSS.loadEmbedded(CrowdBoss_Song, true, CROWDBOSSSAMPLES); + } + + //*/ + + current_song=Registry.sound_data[title]; + current_song_name=title; + if(Registry.GAMESTATE !=null){ + Registry.GAMESTATE.last_song_time=0;// avoid issues with changing song midmap + } + //current_song.volume=FlxG.volume; + current_song.play(); + + if(title=="WINDMILL" && Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + current_song.stop(); + } + } + + /** + * + * @param g Group of the(loaded)flxsoudns ya wanna play + * @return 1 if a sound was played, 0 otherwise(too many playing); + */ + + public function play_sound_group(g:FlxGroup,vol:Float=1):Int { + for(var s:FlxSound in g.members){ + if(!s.playing){ + s.volume=vol; + s.play(); + + return 1; + } + + } + return 0; + } + + public function play_sound_group_randomly(g:FlxGroup):Int { + var a:Array=new Array; + for(i in 0...g.length){ + a.push(i); + } + + for(i=0;i=new Array(); + // it looks like you're adding a new tileset. + // did you make sure to add in the new csv in csvdata?? + /* Making a new tileset work + * 1. Make sure it's included above in the list of Embeds + * 2. Add it to the if statement right after this comment + * 3. Remove that maps name from the "no_tiles_yet" array at the beginning of the + * set_tile_properties array + * 4. Add in an else-if block to deal with setting the walkable/solid properties of the tileset + * 5. if there are more detailed things(holes, conveyers), you can try to figure it out + * or i'll just deal with it. */ + + + public static function setTileset(MapName:String):Void { + if(MapName=="BEDROOM"){ + Tiles=_Bedroom_Tiles; + } else if(MapName=="APARTMENT"){ + Tiles=_Apartment_Tiles; + } else if(MapName=="FIELDS"){ + Tiles=_Fields_Tiles; + } else if(MapName=="STREET"){ + Tiles=_Street_Tiles; + } else if(MapName=="OVERWORLD"){ + Tiles=_Overworld_Tiles; + } else if(MapName=="BEACH"){ + Tiles=_Beach_Tiles; + } else if(MapName=="BLANK"){ + Tiles=Blank_Tiles; + } else if(MapName=="REDSEA"){ + Tiles=Red_Sea_Tiles; + } else if(MapName=="DEBUG"){ + Tiles=Debug_Tiles; + } else if(MapName=="REDCAVE"){ + Tiles=REDCAVE_Tiles; + } else if(MapName=="TERMINAL"){ + Tiles=Terminal_Tiles; + } else if(MapName=="HOTEL"){ + Tiles=_Hotel_Tiles; + } else if(MapName=="NEXUS"){ + Tiles=_Nexus_Tiles; + } else if(MapName=="CROWD"){ + Tiles=_Crowd_Tiles; + } else if(MapName=="CIRCUS"){ + Tiles=_Circus_Tiles; + } else if(MapName=="CLIFF"){ + Tiles=Cliff_Tiles; + } else if(MapName=="WINDMILL"){ + Tiles=_Windmill_Tiles; + } else if(MapName=="FOREST"){ + Tiles=Forest_Tiles; + } else if(MapName=="TRAIN"){ + Tiles=Cell_Tiles; + } else if(MapName=="DRAWER"){ + Tiles=BlackWhite_Tiles; + } else if(MapName=="BLUE"){ + Tiles=Blue_Tiles; + } else if(MapName=="HAPPY"){ + Tiles=Happy_Tiles; + } else if(MapName=="SPACE"){ + Tiles=Space_Tiles; + } else if(MapName=="SUBURB"){ + Tiles=Suburb_Tiles; + } else if(MapName=="GO"){ + Tiles=Go_Tiles; + } else { + Tiles=Debug_Tiles; + } + } + + /* EMBEDS, ARRAYS, FUNCTIONS RELATED TO ANIMATED TILES */ + + // Embedded graphics + //[Embed(source="../res/sprites/animtiles/shoreline.png")] private static var Shoreline_Anims:Class; + //[Embed(source="../res/sprites/animtiles/beach_anims.png")] private static var Beach_Anims:Class; + //[Embed(source="../res/sprites/animtiles/conveyer_anim_tiles.png")] private static var Conveyer_Anims:Class; + //[Embed(source="../res/sprites/animtiles/water_edges.png")] private static var Water_Edge_Anims:Class; + //[Embed(source="../res/sprites/animtiles/torch_pillars.png")] private static var Torch_Pillar_Anims:Class; + //[Embed(source="../res/sprites/animtiles/windmill_drops.png")] private static var Windmill_Drops_Anims:Class; + //[Embed(source="../res/sprites/animtiles/terminal.png")] private static var Terminal_Anims:Class; + //[Embed(source="../res/sprites/animtiles/happy_anims.png")] private static var Happy_Anims:Class; + //[Embed(source="../res/sprites/animtiles/cell_anims.png")] private static var Cell_Anims:Class; + //[Embed(source="../res/sprites/animtiles/suburbs_anims.png")] private static var Suburbs_Anims:Class; + //[Embed(source="../res/sprites/animtiles/forest_anims.png")] private static var Forest_Anims:Class; + //[Embed(source="../res/sprites/animtiles/fields_anims.png")] private static var Fields_Anims:Class; + //[Embed(source="../res/sprites/animtiles/go_anims.png")] private static var Go_Anims:Class; + //[Embed(source="../res/sprites/animtiles/flame_anims.png")] private static var Flame_Anims:Class; + + // Add new tile indice here + public static var animtiles_indices_dict:Dynamic={ + BEACH:new Array(109, 116, 117, 118, 119, 141, 142, 143, 144, 145, 150, 151, 250, 251, 252, 253, 254, 255, 256, 257, 260, 261, 262, 270, 272), + DEBUG:new Array(16, 17, 18, 19, 20), + REDCAVE:new Array(16, 17, 18, 19, 30,32, 70, 71, 72, 73, 74, 75, 76), + WINDMILL:new Array(130,130), // as3 arrays make empty arrays with x elements if only one arg x + CIRCUS:new Array(41, 46, 111, 112, 113, 114), + HOTEL:new Array(180, 181, 182, 183, 190, 191, 192, 193, 194), // Don't forget the comma if adding a new row + TERMINAL:new Array(20, 21, 22, 150, 151, 152, 153), + HAPPY:new Array(20,21,30,31,40,41), + BLUE:new Array(30,31,35), + GO:new Array(50, 130,190,191,192,193,194), + FOREST:new Array(110, 110), + SUBURB:new Array(68, 69, 78, 79), + FIELDS:new Array(246, 250, 270, 271, 272, 273), + TRAIN:new Array(3, 3) + } + + /** + * Produce an animated tile sprite based on the map name, and the index of the tile + *(With respect to the tileset) + * @param x x-coord in WORLD SPACE + * @return 1 if sprite added, 0 if not. + */ + public static function make_anim_tile(anim_tile_group:FlxGroup, MapName:String, tileType:Int, x:Int=0, y:Int=0):Int { + + // Check if this map even has animated tiles + if(animtiles_indices_dict.hasOwnProperty(MapName)){ + // Check whether this tile type doesn't need an animated tile + if(animtiles_indices_dict[MapName].indexOf(tileType)==-1){ + return 0; + } + } else { + return 0; + } + + var anim_tile:FlxSprite=new FlxSprite(x, y);// This will be our animated tile. + if(MapName=="BEACH"){ // If we're in the BEACH + if(tileType==250 || tileType==251 || tileType==252 || tileType>=260){ + anim_tile.loadGraphic(Shoreline_Anims, true, false,16,16); + } + switch(tileType){ + case 251: + anim_tile.addAnimation("a", [ 0, 1, 2, 3, 4, 5], 4, true);break; + case 261: + anim_tile.addAnimation("a", [ 6, 7, 8, 9, 10, 11], 4, true);break; + case 252: + anim_tile.addAnimation("a", [30, 31, 32, 33, 34, 35], 4, true);break; + case 262: + anim_tile.addAnimation("a", [36, 37, 38, 39, 40, 41], 4, true);break; + case 272: + anim_tile.addAnimation("a", [42, 43, 44, 45, 46, 47], 4, true);break; + case 250: + anim_tile.addAnimation("a", [12, 13, 14, 15, 16, 17], 4, true);break; + case 260: + anim_tile.addAnimation("a", [18, 19, 20, 21, 22, 23], 4, true);break; + case 270: + anim_tile.addAnimation("a", [24, 25, 26, 27, 28, 29], 4, true);break; + } + if(tileType<=151 ||(tileType>=253 && tileType<=257)){ + anim_tile.loadGraphic(Beach_Anims, true, false, 16, 16); + } + switch(tileType){ + case 109: + anim_tile.addAnimation("a", [0, 1], 4, true);break; + case 116: + anim_tile.addAnimation("a", [2, 3], 4, true);break; + case 117: + anim_tile.addAnimation("a", [4, 5], 4, true);break; + case 118: + anim_tile.addAnimation("a", [6, 7], 4, true);break; + case 119: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + case 141: + anim_tile.addAnimation("a", [10, 11], 4, true);break; + case 142: + anim_tile.addAnimation("a", [12, 13], 4, true);break; + case 143: + anim_tile.addAnimation("a", [14, 15], 4, true);break; + case 144: + anim_tile.addAnimation("a", [16, 17], 4, true);break; + case 145: + anim_tile.addAnimation("a", [18, 19], 4, true);break; + case 150: + anim_tile.addAnimation("a", [20, 21], 4, true);break; + case 151: + anim_tile.addAnimation("a", [22, 23], 4, true);break; + case 253: + anim_tile.addAnimation("a", [24, 25], 4, true);break; + case 254: + anim_tile.addAnimation("a", [26, 27], 4, true);break; + case 255: + anim_tile.addAnimation("a", [28, 29], 4, true);break; + case 256: + anim_tile.addAnimation("a", [30, 31], 4, true);break; + case 257: + anim_tile.addAnimation("a", [32, 33], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="DEBUG"){ + //R D L U NONE + // CONVEYER TILE TEST. + if(tileType<=20 && tileType>=16){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 16: + anim_tile.addAnimation("a", [0, 4], 4, true);break; + case 17: + anim_tile.addAnimation("a", [1, 5], 4, true);break; + case 18: + anim_tile.addAnimation("a", [2, 6], 4, true);break; + case 19: + anim_tile.addAnimation("a", [3, 7], 4, true);break; + case 20: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="REDCAVE"){ + if(tileType>=16 && tileType<=19){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 16: + anim_tile.addAnimation("a", [16, 17, 18], 4, true);break; + case 17: + anim_tile.addAnimation("a", [20, 21, 22], 4, true);break; + case 18: + anim_tile.addAnimation("a", [24, 25, 26], 4, true);break; + case 19: + anim_tile.addAnimation("a", [28, 29, 30], 4, true);break; + } + if(tileType==30 || tileType==32){ + anim_tile.loadGraphic(Flame_Anims, true, false, 16, 16); + } + switch(tileType){ + case 30: + case 32: + anim_tile.addAnimation("a", [0, 1, 2], 6, true);break; + } + if(tileType>=70 && tileType<=76){ + anim_tile.loadGraphic(Water_Edge_Anims, true, false, 16, 16); + } + switch(tileType){ + case 70: + anim_tile.addAnimation("a", [10, 11], 4, true);break; + case 71: + anim_tile.addAnimation("a", [12, 13], 4, true);break; + case 72: + anim_tile.addAnimation("a", [14, 15], 4, true);break; + case 73: + anim_tile.addAnimation("a", [16, 17], 4, true);break; + case 74: + anim_tile.addAnimation("a", [18, 19], 4, true);break; + case 75: + anim_tile.addAnimation("a", [20, 21], 4, true);break; + case 76: + anim_tile.addAnimation("a", [22, 23], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="WINDMILL"){ + if(tileType==130){ + anim_tile.loadGraphic(Windmill_Drops_Anims, true, false, 16, 16); + } + switch(tileType){ + case 130: + anim_tile.addAnimation("a", [0, 1, 2, 3, 4, 5], 10, true);break; + } + anim_tile.play("a"); + } else if(MapName=="FOREST"){ + if(tileType==110){ + anim_tile.loadGraphic(Forest_Anims, true, false, 16, 16); + } + switch(tileType){ + case 110: + anim_tile.addAnimation("a", [0, 1, 2], 3, true);break; + } + anim_tile.play("a"); + } else if(MapName=="GO"){ + if(tileType==50 || tileType==130 || tileType>=190){ + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + } + switch(tileType){ + case 50: + anim_tile.addAnimation("a", [60, 61], 3, true);break; + case 130: + anim_tile.addAnimation("a", [54, 55, 56], 4, true);break; + case 190:// red right + anim_tile.addAnimation("a", [0,1,2], 4, true);break; + case 191:// red up + anim_tile.addAnimation("a", [18,19,20], 4, true);break; + case 192:// blue left + anim_tile.addAnimation("a", [36,37,38], 4, true);break; + case 193:// blue up + anim_tile.addAnimation("a", [42,43,44], 4, true);break; + case 194:// mix up + anim_tile.addAnimation("a", [48,49,50], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="TRAIN"){ + if(tileType==3){ + anim_tile.loadGraphic(Cell_Anims, true, false, 16, 16); + } + switch(tileType){ + case 3: + anim_tile.addAnimation("a", [0, 1], 3, true);break; + } + anim_tile.play("a"); + } else if(MapName=="FIELDS"){ + if(tileType==250 || tileType==246){ + anim_tile.loadGraphic(Fields_Anims, true, false, 16, 16); + } + switch(tileType){ + case 246: + anim_tile.addAnimation("a", [10, 11], 3, true);break; + case 250: + anim_tile.addAnimation("a", [0, 1, 2], 3, true);break; + } + if(tileType>=270 && tileType<=273){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 270: + anim_tile.addAnimation("a", [48, 49, 50], 4, true);break; + case 271: + anim_tile.addAnimation("a", [52, 53, 54], 4, true);break; + case 272: + anim_tile.addAnimation("a", [56, 57, 58], 4, true);break; + case 273: + anim_tile.addAnimation("a", [60, 61, 62], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="SUBURB"){ + if(tileType==68 || tileType==69 || tileType==78 || tileType==79){ + anim_tile.loadGraphic(Suburbs_Anims, true, false, 16, 16); + } + switch(tileType){ + case 68: + anim_tile.addAnimation("a", [0, 2], 4, true);break; + case 69: + anim_tile.addAnimation("a", [1, 3], 4, true);break; + case 78: + anim_tile.addAnimation("a", [4, 6], 4, true);break; + case 79: + anim_tile.addAnimation("a", [5, 7], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="CIRCUS"){ + if(tileType==41 || tileType==46){ + anim_tile.loadGraphic(Torch_Pillar_Anims, true, false, 16, 16); + } + switch(tileType){ + case 41: + anim_tile.addAnimation("a", [3, 4, 5], 7, true);break; + case 46: + anim_tile.addAnimation("a", [0, 1, 2], 7, true);break; + } + if(tileType>=111 && tileType<=114){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 111: + anim_tile.addAnimation("a", [32, 33, 34], 4, true);break; + case 112: + anim_tile.addAnimation("a", [36, 37, 38], 4, true);break; + case 113: + anim_tile.addAnimation("a", [40, 41, 42], 4, true);break; + case 114: + anim_tile.addAnimation("a", [44, 45, 46], 4, true);break; + } + if(tileType>=111 && tileType<=114){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + /*switch(tileType){ + case 111: + anim_tile.addAnimation("a", [16, 17, 18], 4, true);break; + case 112: + anim_tile.addAnimation("a", [20, 21, 22], 4, true);break; + case 113: + anim_tile.addAnimation("a", [24, 25, 26], 4, true);break; + case 114: + anim_tile.addAnimation("a", [28, 29, 30], 4, true);break; + }*/ + anim_tile.play("a"); + } else if(MapName=="HOTEL"){ + if(tileType>=180 && tileType<=183){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 180: + anim_tile.addAnimation("a", [32, 33, 34], 4, true);break; + case 181: + anim_tile.addAnimation("a", [36, 37, 38], 4, true);break; + case 182: + anim_tile.addAnimation("a", [40, 41, 42], 4, true);break; + case 183: + anim_tile.addAnimation("a", [44, 45, 46], 4, true);break; + } + if(tileType>=190 && tileType<=194){ + anim_tile.loadGraphic(Water_Edge_Anims, true, false, 16, 16); + } + switch(tileType){ + case 190: + anim_tile.addAnimation("a", [0, 1], 4, true);break; + case 191: + anim_tile.addAnimation("a", [2, 3], 4, true);break; + case 192: + anim_tile.addAnimation("a", [4, 5], 4, true);break; + case 193: + anim_tile.addAnimation("a", [6, 7], 4, true);break; + case 194: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="TERMINAL"){ + if((tileType>=20 && tileType<=22)||(tileType>=150 && tileType<=153)){ + anim_tile.loadGraphic(Terminal_Anims, true, false, 16, 16); + } + switch(tileType){ + case 20: + anim_tile.addAnimation("a", [12, 13, 14], 3, true);break; + case 21: + anim_tile.addAnimation("a", [15, 16, 17], 3, true);break; + case 22: + anim_tile.addAnimation("a", [18, 19, 20], 3, true);break; + case 150: + anim_tile.addAnimation("a", [0, 1, 2], 4, true);break; + case 151: + anim_tile.addAnimation("a", [3, 4, 5], 4, true);break; + case 152: + anim_tile.addAnimation("a", [6, 7, 8], 4, true);break; + case 153: + anim_tile.addAnimation("a", [9, 10, 11], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="HAPPY"){ + anim_tile.loadGraphic(Happy_Anims, true, false, 16, 16); + switch(tileType){ + case 21:// burning tree single + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + break; + case 20://normal tree single + case 30:// normal tree multiple + if(Registry.GE_States[Registry.GE_Happy_Started]){ + if(Registry.CURRENT_GRID_X==4 && Registry.CURRENT_GRID_Y==1){ + if(tileType==20){ + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + } else { + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + } + } else if(Registry.CURRENT_GRID_X==1 && Registry.CURRENT_GRID_Y==2){ + if(tileType==20){ + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + } else { + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + } + } else { + anim_tile=null; + } + } else { + anim_tile=null; + } + break; + case 31:// burning tree multiple + + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + break; + case 40:// right + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + anim_tile.addAnimation("a", [0,1], 5); + break; + case 41: + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + anim_tile.addAnimation("a", [6, 7], 5); + break; + } + if(anim_tile !=null)anim_tile.play("a"); + } else if(MapName=="BLUE"){ + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + switch(tileType){ + case 30://left + anim_tile.addAnimation("a", [36,37,38], 6); + break; + case 31://down + anim_tile.addAnimation("a", [30, 31, 32], 6); + break; + } + anim_tile.play("a"); + } else { // Catches errors where we forget to add an else if block for some map + anim_tile=null; + } + + // Make sure the tile is valid before we add it + if(anim_tile !=null && anim_tile._curAnim !=null){ + anim_tile_group.add(anim_tile); + return 1; + } + + return 0; + } + + + public static function set_tile_properties(curMapBuf:FlxTilemap):Void { + CUR_MAP_HAS_CONVEYERS=false; + HOLE_INDICES=new Array(); + var j:Int=0; + var no_tiles_yet:Array=new Array("DEBUG"); + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + for(j=TileData.Overworld_Tilemap_Nonsolid_Row_offset*TileData.Overworld_Tileset_Width;jtx + 16)return; + if(o.y + o.height>ty + 13){ + o.y=ty + 13 - o.height; + o.velocity.y=0; + } + } + + + public static function thin_up(tile:FlxTile, o:FlxObject):Void { + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + if(o.x + o.widthtx + 16)return; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + if(o.yty + 16)return; + if(o.xty + 16)return; + if(o.x + o.width>tx + 13){ + o.x=tx + 13 - o.width; + o.velocity.x=0; + } + + } + + // fine tune hitboxes on these + public static function hole(tile:FlxTile, p:Dynamic):Void { + if(!p.has_tile_callbacks)return; + if(!p.hasOwnProperty("cid"))return; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + tx +=4; + ty +=5; + + if(p.cid==CLASS_ID.PLAYER){ + tx -=4; + if(p.state==p.S_AIR)return; + var t_height:Int=4; + if(p.facing==FlxObject.UP)t_height=1; + if((p.yty)&& + (p.xtx + 5)){ // 6 0 + p.isFalling=true; + p.fall_pt.x=tx + 7; + p.fall_pt.y=ty - 5; + } + } else if(p.cid==CLASS_ID.DUST && p !=Registry.GAMESTATE.player.raft){ + if((p.yty)&& + (p.xtx)){ + if(p.frame==0) + p.fell_in_hole=true; + } + } else if(p.cid==CLASS_ID.DASHTRAP){ + if((p.yty)&& + (p.xtx)){ + p.touching=FlxObject.ANY; + + } + } else if(p.cid==CLASS_ID.SILVERFISH){ + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + } else if(p.cid==CLASS_ID.PERSON){ + + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + + + } else { //probably an enemy, try to make them not walk on the hole + // FUCK IT THEY DDISAPPEAR + p.velocity.x *=0.25; + p.velocity.y *=0.25; + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + } + } + public static function slow(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + if(p.state==p.S_AIR)return; + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if((p.yty)&& + (p.xtx)){ + p.slow_mul=0.5; + } + + } + + public static function spike(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + if(p.state==p.S_AIR)return; + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if((p.yty + 6)&& + (p.xtx + 6)){ + p.touchDamage(1); + } + } + + public static function ladder(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + ty=(int(tile.mapIndex / Registry.GAMESTATE.map_bg_2.widthInTiles))* 16 + 20; + tx=Std.int(tile.mapIndex % Registry.GAMESTATE.map_bg_2.widthInTiles)* 16; + } + if((p.yty)&& + (p.xtx)){ + // Deal with jumping onto ladder + if(p.state==p.S_AIR){ + return; + var diff:Int=p.offset.y - p.DEFAULT_Y_OFFSET; + p.y -=diff; + p.offset.y=p.DEFAULT_Y_OFFSET; + } + p.state=p.S_LADDER; + } + + } + + static private function pt_in_tile(x:Int,y:Int,tile:FlxTile):Bool + { + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + return((y<=ty + 16)&&(y>=ty)&& + (x<=tx + 16)&&(x>=tx)); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Eye_Light.hx b/AIR/intra/hsrc/entity/decoration/Eye_Light.hx new file mode 100644 index 0000000..af0c252 --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Eye_Light.hx @@ -0,0 +1,35 @@ +package entity.decoration +{ +import data.CLASS_ID; +import org.flixel.FlxSprite; +/** + * ... + * @author seaga + */ +class Eye_Light extends FlxSprite +{ + //[Embed(source="../../res/sprites/decoration/eyelight.png")] public var Eye_Light_Sprite:Class; + public var type:String="Eye_Light"; + public var xml:XML; + public var darkness:FlxSprite; + public var light:FlxSprite; + public var cid:Int=CLASS_ID.EYE_LIGHT; + + public function new(x:Int,y:Int,_xml:XML, _darkness:FlxSprite) + { + super(x, y); + xml=_xml; + loadGraphic(Eye_Light_Sprite, true, false, 16, 16); + immovable=true; + addAnimation("glow", [0, 1, 2], 5, true); + play("glow"); + darkness=_darkness; + light=new Light(x - 16, y - 36, darkness, Light.T_FIVE_FRAME_GLOW,false,null); + light.addAnimation("glow", [0, 0, 1, 2, 3, 4, 3, 2, 1, 0, 0, 0], 7, true); + light.play("glow"); + + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Light.hx b/AIR/intra/hsrc/entity/decoration/Light.hx new file mode 100644 index 0000000..a77fea0 --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Light.hx @@ -0,0 +1,201 @@ +package entity.decoration +{ +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import flash.geom.ColorTransform; +/** + * ... + * @author Seagaia + */ +class Light extends FlxSprite +{ + //[Embed(source="../../res/sprites/light/glow-light.png")] public var GLOW_LIGHT:Class; + //[Embed(source="../../res/sprites/light/cone-light.png")] public var CONE_LIGHT:Class; + //[Embed(source="../../res/sprites/light/5-frame-glow.png")] private var FIVE_FRAME_GLOW:Class; + //[Embed(source="../../res/sprites/light/beach-screen-light.png")] private var BEACH_GLOW:Class; + + public static var T_GLOW_LIGHT:Int=0; + public static var T_FIVE_FRAME_GLOW:Int=1; + public static var T_CONE_LIGHT:Int=2; + public static var T_BEACH_GLOW:Int=3; + public static var T_BEDROOM_BOUNCE:Int=4; + private var locked_on:Bool=false; + private var lock_latency:Float=2.0; + private var lock_latency_max:Float=2.0; + private var current_room:Point=new Point(0, 0); + + public static var L_PLAYER:Int=1; + public static var L_SUN_GUY_ORBS:Int=2; + public static var L_BEDROOM_BOUNCE:Int=3; + + public var darkness:FlxSprite; + public var followee:FlxSprite; + public var flicker_rate:Int=0; + public var base_x_scale:Float=3.0; + public var base_y_scale:Float=3.0; + public var flicker_timer:Int=flicker_rate; + public var special_type:Int=0; + + public var xml:XML; + /** + * Creates a light at the given point, to be blended with the darkness reference. Specifying the type will + * determine what to use. Client must specify the animation and offset. + * @param _x + * @param _y + * @param _darkness A reference to the darkness sprite to draw Into + * @param type What type of light sprite to use + * @param follows + * @param _followee The sprite to follow + * @param _flicker_rate + * @param _special_type + */ + public function new(_x:Int, _y:Int, _darkness:FlxSprite, type:Int, follows:Bool=false, _followee:FlxSprite=null,_flicker_rate:Int=0,_special_type:Int=0) + { + super(_x, _y); + xml=; + setlighttype(type); + + flicker_rate=_flicker_rate; + darkness=_darkness; + special_type=_special_type; + blend="screen"; + + followee=_followee; + if(follows){ + x=followee.x -((followee.width - width)/ 2); + y=followee.y -((followee.height - height)/ 2); + } + } + + override public function update():Void { + if(followee !=null){ + if(special_type==L_PLAYER){ + x=followee.x-((width - followee.width)/ 2); + y=followee.y -((height - followee.height)/ 2)- 16; + } else if(special_type==L_SUN_GUY_ORBS){ + x=followee.x +(followee.width / 2)- 26; + y=followee.y +(followee.height / 2)- 45; + } else if(special_type==L_BEDROOM_BOUNCE){ + if(velocity.x>0){ + if(x>Registry.SCREEN_WIDTH_IN_PIXELS){ + velocity.x *=-1; + } + } else { + if(x<0){ + velocity.x *=-1; + } + } + if(velocity.y>0){ + if(y>Registry.SCREEN_HEIGHT_IN_PIXELS){ + velocity.y *=-1; + } + } else { + if(y<0){ + velocity.y *=-1; + } + } + + lock_latency -=FlxG.elapsed; + /* Wait for a bit before locking onto the player */ + if(overlaps(followee, true)&& lock_latency<0){ + locked_on=true; + velocity.x=velocity.y=0; + } + /* If locked on follow the player */ + if(locked_on){ + var _x:Int=(followee.x -((width - followee.width)/ 2))% Registry.SCREEN_WIDTH_IN_PIXELS; + var _y:Int=((followee.y - 20)% Registry.SCREEN_HEIGHT_IN_PIXELS)- 16; + EventScripts.send_property_to(this, "x", _x, 0.5); + EventScripts.send_property_to(this, "y", _y, 0.5); + } else { /* Randomize the velocity a bit */ + velocity.x +=(Math.random()* 2 + -1); + velocity.y +=(Math.random()* 2 + -1); + } + /* Unlock on room transition */ + if(Registry.CURRENT_GRID_X !=current_room.x || Registry.CURRENT_GRID_Y !=current_room.y){ + locked_on=false; + lock_latency=lock_latency_max; + current_room.x=Registry.CURRENT_GRID_X; + current_room.y=Registry.CURRENT_GRID_Y; + randomize_velocity(); + } + + /* Not visible if sun boss defeated. */ + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + visible=false; + } + } + + } + + + + flicker_timer--; + if(flicker_timer<0 && flicker_rate !=0){ + scale.x=base_x_scale + Math.random()* 0.2; + scale.y=base_y_scale + Math.random()* 0.2; + flicker_timer=flicker_rate; + } else { + scale.x=base_x_scale; + scale.y=base_y_scale; + } + + super.update(); + } + override public function draw():Void { + var screenXY:FlxPoint=getScreenXY(); + darkness.stamp(this, screenXY.x, screenXY.y); + } + + private function randomize_velocity():Void + { + var i:Int=Std.int(4 * Math.random()); + var base_speed:Int=30; + switch(i){ + case 0: + velocity.x=velocity.y=base_speed;break; + case 1: + velocity.x=velocity.y=-base_speed;break; + case 2: + velocity.x=base_speed;velocity.y=-base_speed;break; + case 3: + velocity.x=-base_speed;velocity.y=base_speed;break; + } + } + + public function setlighttype(type:Int):Void + { + + if(type==T_GLOW_LIGHT){ + loadGraphic(GLOW_LIGHT, false, false, 64, 64); + framePixels.colorTransform(framePixels.rect, new ColorTransform(0.5, 0.5, 1, 1, 0, 0, -5)); + } else if(type==T_FIVE_FRAME_GLOW){ + loadGraphic(FIVE_FRAME_GLOW, true, false, 48, 48); + } else if(type==T_CONE_LIGHT){ + loadGraphic(CONE_LIGHT, false, false, 32, 32); + base_x_scale=0.2; + base_y_scale=0.2; + } else if(type==T_BEACH_GLOW){ + loadGraphic(BEACH_GLOW, false, false, 160, 160); + base_x_scale=base_y_scale=1; + scrollFactor=new FlxPoint(0, 0); + } else if(type==T_BEDROOM_BOUNCE){ + special_type=L_BEDROOM_BOUNCE; + loadGraphic(GLOW_LIGHT, false, false, 64, 64); + scrollFactor=new FlxPoint(0, 0); + x=160 * Math.random(); + y=160 * Math.random(); + randomize_velocity(); + base_x_scale=base_y_scale=2; + current_room.x=Registry.CURRENT_GRID_X; + current_room.y=Registry.CURRENT_GRID_Y; + //x=followee.x -((followee.width - width)/ 2); + //y=followee.y -((followee.height - height)/ 2); + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Map_Preview.hx b/AIR/intra/hsrc/entity/decoration/Map_Preview.hx new file mode 100644 index 0000000..b6b11ae --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Map_Preview.hx @@ -0,0 +1,39 @@ +package entity.decoration +{ +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.geom.Point; +import org.flixel.FlxSprite; + +/** + * test + * @author Seagaia + */ +class Map_Preview extends FlxSprite +{ + + var erase_mask:FlxSprite=new FlxSprite(); + public function new() + { + makeGraphic(16, 16, 0xffff0000); + erase_mask.makeGraphic(16, 16, 0x00000000); + for(i in 0...256){ + if(i % 2==0){ + erase_mask.framePixels.setPixel32(i % 16, i / 16, 0xff000000); + } else { + erase_mask.framePixels.setPixel32(i % 16, i / 16, 0x00000000); + } + } + erase_mask.blend='erase'; + draw(); + } + + override public function draw():Void + { + pixels.copyChannel(erase_mask.framePixels, erase_mask.framePixels.rect, new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + dirty=true; + super.draw(); + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Nonsolid.hx b/AIR/intra/hsrc/entity/decoration/Nonsolid.hx new file mode 100644 index 0000000..9a51c2f --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Nonsolid.hx @@ -0,0 +1,48 @@ +package entity.decoration +{ +import org.flixel.FlxSprite; + +class Nonsolid extends FlxSprite +{ + + // embed the sprite file Into the code. + //[Embed(source="../../res/sprites/decoration/grass_1.png")] public static var grass_1_sprite:Class; + //[Embed(source="../../res/sprites/decoration/grass_REDSEA.png")] public static var grass_REDSEA_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail.png")] public static var rail_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail_NEXUS.png")] public static var rail_NEXUS_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail_CROWD.png")] public static var rail_CROWD_sprite:Class; + + public function new(_xml:XML) + { + // When adding one of these to DAME, supply it the image file, + // the size of one frame, and add the "type" property to the DAME sprite + // where "type" is some identifier. + // There's a "Grass_1" sprite in there for an example. + + super(parseInt(_xml.@x), parseInt(_xml.@y)); + switch(_xml.@type.toString()){ + // The word after "case" will be whatever you put in for "Type" in the DAME file. + case "Grass_1": + loadGraphic(grass_1_sprite, true, false, 16, 6); + addAnimation("whatever", [0, 1], 10);//Add animations if you need to. + play("whatever"); + break;//Don't forget this so the code exits the switch block. one for every case. + case "Grass_REDSEA": + loadGraphic(grass_REDSEA_sprite, true, false, 16, 16); + play("whatever"); + break; + case "Rail_1": + loadGraphic(rail_sprite, true, false, 16, 16); + break; + case "Rail_NEXUS": + loadGraphic(rail_NEXUS_sprite, true, false, 16, 17); + break; + case "Rail_CROWD": + loadGraphic(rail_CROWD_sprite, true, false, 16, 22); + break; + } + + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/RetroEffect.hx b/AIR/intra/hsrc/entity/decoration/RetroEffect.hx new file mode 100644 index 0000000..99f2eae --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/RetroEffect.hx @@ -0,0 +1,130 @@ +/** + * RetroEffect + * -- Generates a retro CRT distortion effect on the requested camera. + * Inspired from the article http://active.tutsplus.com/tutorials/effects/create-a-retro-crt-distortion-effect-using-rgb-shifting/ + * + * @version 1.0 - 31st January 2012 + * @link http://www.alanzucconi.com + * @author Alan Zucconi +*/ +package entity.decoration; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.display.BlendMode; + +import flash.geom.Matrix; +import flash.geom.Point; + +import org.flixel.FlxCamera; +import org.flixel.FlxSprite; +import org.flixel.FlxG; + +/** Class to generate a retro CRT distortion effect. + * @author Alan Zucconi + */ +class RetroEffect extends FlxSprite +{ + private static var _zeroPoint:Point=new Point(); + + /** The camera where the effect should be applied. */ + private static var _camera:FlxCamera; + /** The buffer where the effect is constructed. */ + private var _buffer:BitmapData; + /** The buffer where the effect is constructed. */ + private var _output:BitmapData; + + private var _bitmap:Bitmap; + + /** The counter for the distortion effect. */ + private var _counter:Float=0; + /** The matrix to distort the image. */ + private var _distortion:Matrix=new Matrix(); + + /** Generates a new istance of the retro CTR distortion effect. + * @param camera The camera where the effect should be applied. + */ + public function new(camera:FlxCamera) + { + _camera=camera; + + _buffer=new BitmapData(_camera.width, _camera.height, true, 0xFF000000); + _output=new BitmapData(_camera.width, _camera.height, true, 0xFF000000); + + _bitmap=new Bitmap(); + _bitmap.bitmapData=_buffer; + } + + /** Updates the counter. */ + override public function update():Void + { + _counter +=FlxG.elapsed; + super.update(); + } + + /** Apply the effect. */ + override public function draw():Void + { + var output:BitmapData=effect(_camera.screen.pixels); + _camera.screen.pixels.draw(output); + } + + public function randRange(min:Float, max:Float):Float { + var randomNum:Float=(Math.random()*(max - min))+ min; + return randomNum; + } + + /** Apply the effect on the image. + * @param source The bitamp to change. + * @return The changed bitmap. + */ + private function effect(source:BitmapData):BitmapData + { + // Red channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.RED, BitmapDataChannel.RED); + _bitmap.alpha=randRange(8, 10)/ 10; + + _distortion.a=sinusoid(_counter + 0 / 5, 1.09, 1.2 , 0.5); + _distortion.d=sinusoid(_counter + 2 / 5, 1, 1.21 , 0.5); + + //_distortion.ty=sinusoid(_counter + 0/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, null, null, true); + + // Green channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); + _bitmap.alpha=randRange(8, 10)/ 10; + + _distortion.a=sinusoid(_counter + 1 / 5, 0.89, 1.00 , 0.5); + _distortion.d=sinusoid(_counter + 1 / 5, 1, 1.01 , 0.5); + //_distortion.ty=sinusoid(_counter + 1/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, BlendMode.SCREEN, null, true); + + // Blue channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); + _bitmap.alpha=randRange(8, 10)/10; + + _distortion.a=sinusoid(_counter + 2 / 5, 0.99, 1.20 , 3.5); + _distortion.d=sinusoid(_counter + 0 / 5, 1, 1.01 , 3.5); + //_distortion.ty=sinusoid(_counter + 2/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, BlendMode.SCREEN, null, true); + + return _output; + } + + /** Generate a custom sinusoid curve. + * @param x The x value. + * @param min The minimun value of this sinusoid. + * @param max The maximum value of this sinusoid. + * @param period The period of this sinusoid. + * @return The y value. + */ + public function sinusoid(x:Float, min:Float, max:Float, periodo:Float):Float { + var escursione:Float=max - min; + var coefficiente:Float=Math.PI * 2 / periodo; + return escursione / 2 *(1 + Math.sin(x * coefficiente))+ min; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Solid_Sprite.hx b/AIR/intra/hsrc/entity/decoration/Solid_Sprite.hx new file mode 100644 index 0000000..5d4a376 --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Solid_Sprite.hx @@ -0,0 +1,179 @@ +package entity.decoration +{ +import data.CLASS_ID; +import entity.interactive.NPC; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Solid_Sprite extends FlxSprite +{ + /* * * * * + * a dame-placed solid sprite. can be animated. + * * * * */ + //[Embed(source="../../res/sprites/decoration/red_cave_left.png")] public static var red_cave_left_sprite:Class; + //[Embed(source="../../res/sprites/decoration/TREE.png")] public static var trees_sprites:Class; + public var xml:XML; + public var type_str:String; + public var cid:Int=CLASS_ID.SOLID_SPRITE; + public var player:Player; + public var dame_frame:Int; + public var active_region:FlxObject; + + + public function new(_xml:XML,is_cutscene:Bool=false,_player:Player=null) + { + x=parseInt(_xml.@x); + y=parseInt(_xml.@y); + xml=_xml; + type_str=_xml.@type; + dame_frame=parseInt(_xml.@frame); + + super(x, y); + player=_player; + if(type_str=="red_cave_l_ss" && Registry.CURRENT_GRID_X !=3 && Registry.CURRENT_GRID_Y>3){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Left]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="red_cave_l_ss"){ // CENTRAL ACTUALLY. + immovable=true; + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + + } else if(type_str=="red_cave_r_ss"){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Right]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="red_cave_n_ss"){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_North]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="blocker"){ + immovable=true; + makeGraphic(64, 4, 0x00000000); + } else if(type_str=="vblock"){ + immovable=true; + makeGraphic(4, 16, 0x00000000); + } else if(type_str=="tree"){ + // Change the w/h of this draw call if you want the max size of a tree(or whatever)to be bigger/smaller + loadGraphic(trees_sprites, true, false, 64,64); + frame=dame_frame; + + immovable=true; + switch(dame_frame){ + case 0: + // Set where the hitbox is and its size + set_props(16, 32, 32, 32); + + break; + default: + break; + } + + } else if(type_str=="sign"){ + loadGraphic(NPC.note_rock, true, false, 16, 16); + frame=parseInt(xml.@frame); + active_region=new FlxObject(x - 2, y + 14, 20, 5); + Registry.subgroup_interactives.push(this); + immovable=true; + } + } + + /** + * Sets this solid sprites properites + * @param ox offset of the hitbox + * @param oy offset of the hitbox(y) + * @param w width of hitbox + * @param h + */ + private function set_props(ox:Int, oy:Int, w:Int, h:Int):Void { + offset.x=ox; + offset.y=oy; + width=w; + height=h; + x +=ox; + y +=oy; + } + override public function update():Void + { + + if(player !=null){ + if(type_str=="blocker"){ + if(player.overlaps(this)&& player.velocity.y>0 && player.yy){ + player.y=y + height; + } + } else if(type_str=="vblock"){ + if(player.overlaps(this)){ + if(player.velocity.x<0){ + player.x=x + width; + } else { + player.x=x - player.width; + } + } + } else if(type_str=="tree"){ + FlxG.collide(player, this); + } else if(type_str=="sign"){ + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y + 14; + if(DH.nc(player, active_region)){ + if(frame==2){ //r + //DH.dialogue_popup("The sign points to the east but the words on it are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 0)); + } else if(frame==3){ //l + //DH.dialogue_popup("The sign points to the west but the words on it are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 1)); + } else if(frame==4){ // u/d + //DH.dialogue_popup("The words on the sign are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 2)); + } + + } + } else { + FlxG.collide(player, this); + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/decoration/Water_Anim.hx b/AIR/intra/hsrc/entity/decoration/Water_Anim.hx new file mode 100644 index 0000000..ead03e3 --- /dev/null +++ b/AIR/intra/hsrc/entity/decoration/Water_Anim.hx @@ -0,0 +1,199 @@ +package entity.decoration +{ +import data.TileData; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxTilemap; +/** + * Given a map buffer will transform a list of tiles at some rate Into water or whatever + */ +class Water_Anim extends AnoSprite +{ + + private var started:Bool=false; + + private var target_tiles:Array;// List of tiles [0,99] that will be transformed in order + private var target_tile_types:Array;// What each tile will change to. + + private var latency:Float=0.3;//Time between tile transforms + private var t:Float=0; + + private var map_ref:FlxTilemap; + private var map_name:String; + + public var anim_tiles:FlxGroup;// Group of animated tiles, added to parent. + + private var anim_idx:Int=0;// Which animated tile in anim_tiles will be visible next. + private var cur_idx:Int=0;// Which tile in target_tiles, w.r.t. the current wscreen, will change next. + + + public static var START_WATER_ANIM:Bool=false; + public function new(args:Array) + { + super(args); + map_name=Registry.CURRENT_MAP_NAME; + START_WATER_ANIM=false;// Reset this every tiemmmm + switch(map_name){ + case "DEBUG": + target_tiles= new Array(10, 11, 12, 13, 14); + target_tile_types=new Array(16,17,18,19,19); + latency=0.3; + break; + case "BLUE": + target_tiles= new Array(3,13,23,33,32,31,30); + target_tile_types=new Array(31,31,31,30,30,30,30); + latency=0.3; + break; + case "HAPPY": + target_tiles= new Array(6,16,26,36,37,38,39); + target_tile_types=new Array(41,41,41,40,40,40,40); + latency=0.3; + break; + case "GO": + var gx:Int=Registry.CURRENT_GRID_X; + var gy:Int=Registry.CURRENT_GRID_Y; + + if(gx==0 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Happy_Done]){ + xml.@alive="true"; + } + target_tiles= new Array(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); + target_tile_types=new Array(190,190,190,190,190,190,190,190,190,190); + + } else if(gx==1 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Happy_Done])xml.@alive="true"; + target_tiles= new Array(30,31,32,33,34,35,36,37,27,17,7); + target_tile_types=new Array(190,190,190,190,190,190,190,191,191,191,191); + } else if(gx==2 && gy==1){ + latency=0.2; + target_tiles= new Array(40, 41, 31, 21, 22, 12, 13, 49, 48, 38, 28, 27, 17, 16, 15, 5, 14, 4); + target_tile_types=new Array(190,191,191,190,191,190,190,192,193,193,192,193,192,192,194,194,194,194); + + } else if(gx==3 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])xml.@alive="true"; + target_tiles= new Array(2,12,22,32,33,34,35,36,37,38,39); + target_tile_types=new Array(193,193,193,193,192,192,192,192,192,192,192); + } else if(gx==4 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])xml.@alive="true"; + target_tiles= new Array(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); + target_tile_types=new Array(192,192,192,192,192,192,192,192,192,192); + } + + break; + default: + exists=false; + break; + } + visible=false; + anim_tiles=new FlxGroup(); + //set up group and indices + //TileData.make_anim_tile(anim_tiles,map_name,., + + for(i in 0...target_tiles.length){ + TileData.make_anim_tile(anim_tiles, map_name, target_tile_types[i], tl.x + 16 *(target_tiles[i] % 10), tl.y + 16 * Std.int(target_tiles[i] / 10)); + } + anim_tiles.setAll("visible", false); + parent.anim_tiles_group.add(anim_tiles); + + // If we activated this event already, the animated tiles should be visible. + if(xml.@alive=="true"){ + anim_tiles.setAll("visible", true); + + while(set_next_tile()){ + + } + } + } + + + private function set_next_tile():Bool { + + if(cur_idxlatency){ + t=0; + if(!set_next_tile()){ // When finished... + started=false; + xml.@alive="true"; + if(Registry.CURRENT_MAP_NAME !="BLUE"){ + + player.state=player.S_GROUND; + } + } + } + } + + super.update(); + } + + + + public function start():Void { + + if(xml.@alive=="true"){ + return; + //Yeah no. + } + started=true; + + + } + + public static function START_WATER_ANIMF():Void { + START_WATER_ANIM=true; + } + + override public function destroy():Void + { + target_tile_types=null; + target_tiles=null; + anim_tiles=null; + map_ref=null; + super.destroy(); + } + + /** + * Takes a single screen's 10x10 tilemap + * @param map + */ + public function set_map(map:FlxTilemap):Void { + map_ref=map; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Dash_Trap.hx b/AIR/intra/hsrc/entity/enemy/apartment/Dash_Trap.hx new file mode 100644 index 0000000..be32726 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Dash_Trap.hx @@ -0,0 +1,286 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Dust; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Dash_Trap extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/apartment/dash_trap.png")] public static var dash_trap_sprite:Class; + private var xml:XML; + private var player:Player; + private var parent:Dynamic; + + public var state:Int=0; + private var s_idle:Int=0; + private var s_moving:Int=1; + private var s_retracting:Int=2; + + private var idle_pt:Point=new Point; + private var dash_vel:Int=80; + private var h_sight:FlxSprite=new FlxSprite(); + private var v_sight:FlxSprite=new FlxSprite(); + + private var retract_vel:Point=new Point(); + + public var cid:Int=CLASS_ID.DASHTRAP; + + private var frame_type:Int=0; + private var t_normal:Int=0; + private var t_bounce_v:Int=2; + private var t_bounce_h:Int=1; + + private var ctr:Int=0; + + private var did_init:Bool=false; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Dash Trap anims */ + makeGraphic(16, 16, 0xff594312); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("idle", [6], 12);//when still + addAnimation("dash", [6], 12, false);//when beginning to move + addAnimation("bounce", [6], 12, false);//when hitting anything + } else { + addAnimation("idle", [4], 12);//when still + addAnimation("dash", [5], 12, false);//when beginning to move + addAnimation("bounce", [4, 5], 12, false);//when hitting anything + } + play("idle"); + loadGraphic(dash_trap_sprite, true, false, 16, 16); + + + h_sight.makeGraphic(320, 10, 0xff114411); + h_sight.x=x - 160; + h_sight.y=y + 3 + Registry.HEADER_HEIGHT; + v_sight.makeGraphic(14, 320, 0xff441144); + v_sight.x=x + 1; + v_sight.y=y - 160 + Registry.HEADER_HEIGHT; + + Registry.subgroup_dash_traps.push(this); + + width=height=14; + centerOffsets(true); + idle_pt.x=x; + idle_pt.y=y + Registry.HEADER_HEIGHT; + + parent.bg_sprites.add(h_sight); + parent.bg_sprites.add(v_sight); + h_sight.visible=v_sight.visible=false; + + add_sfx("dash", Registry.sound_data.slasher_atk); + add_sfx("hit", Registry.sound_data.shieldy_ineffective); + + } + + private var ticker:Int=0; + override public function preUpdate():Void + { + ticker +=1; + if(ticker==3){ + FlxG.collide(this, parent.curMapBuf); + ticker=0; + } + super.preUpdate(); + } + + override public function update():Void + { + + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + if(!did_init){ + did_init=true; + if(parseInt(xml.@frame)>0){ + play("dash"); + frame_type=parseInt(xml.@frame); + switch(frame_type){ + case t_bounce_h: + state=s_moving; + velocity.x=dash_vel; + break; + case t_bounce_v: + state=s_moving; + velocity.y=dash_vel; + break; + case 6: + frame_type=0; + break; + } + } + } + //EventScripts.prevent_leaving_map(parent, this); + } else { + velocity.x=velocity.y=0; + return; + } + } + + if(maybe_bounce())return; + + if(state==s_idle){ + if(player.overlaps(h_sight)){ + if(player.x>=x){ + velocity.x=dash_vel; + retract_vel.x=-dash_vel / 2; + } else { + velocity.x=-dash_vel; + retract_vel.x=dash_vel / 2; + } + play_sfx("dash"); + state=s_moving; + play("dash"); + } else if(player.overlaps(v_sight)){ + if(player.y<=y){ + velocity.y=-dash_vel; + retract_vel.y=dash_vel / 2; + } else { + velocity.y=dash_vel; + retract_vel.y=-dash_vel / 2; + } + state=s_moving; + play_sfx("dash"); + play("dash"); + } + if(player.overlaps(this)){ + player.touchDamage(1); + } + } else if(state==s_moving){ + if(touching !=NONE){ + play_sfx("hit"); + state=s_retracting; + } + + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + state=s_retracting; + play_sfx("hit"); + } + + for(var dashtrap:Dash_Trap in Registry.subgroup_dash_traps){ + if(dashtrap==null)continue; + if(dashtrap !=this && dashtrap.overlaps(this)){ + state=s_retracting; + play_sfx("hit"); + } + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + if(dust.overlaps(this)){ + play_sfx("hit"); + state=s_retracting; + } + } + + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.overlaps(this)&& sp.up_frame==sp.frame){ + play_sfx("hit"); + state=s_retracting; + } + } + + if(y>Registry.CURRENT_GRID_Y * 160 + 16 * 9 + 20){ + play_sfx("hit"); + state=s_retracting; + } + + if(state==s_retracting){ + + play("bounce", true); + velocity.x=retract_vel.x; + velocity.y=retract_vel.y; + } + } else if(state==s_retracting){ + if(Math.abs(x - idle_pt.x)<2 && Math.abs(y - idle_pt.y)<2){ + state=s_idle; + play("idle"); + x=idle_pt.x; + y=idle_pt.y; + retract_vel.x=retract_vel.y=velocity.y=velocity.x=0; + } + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + } + } + super.update(); + } + + /** + * Logic for dash traps that bounce back and forth + * */ + private function maybe_bounce():Bool + { + if(frame_type>0){ + if(!player.invincible && player.overlaps(this)&& player.state !=player.S_AIR){ + player.touchDamage(1); + } + if(Registry.is_playstate){ + if(x + width>parent.rightBorder){ + touching=RIGHT; + } else if(xparent.lowerBorder){ + touching=DOWN; + } + } + if(frame_type==t_bounce_h){ + if(ctr==0){ + if(touching==RIGHT){ + velocity.x=-dash_vel; + ctr=1; + play_sfx("hit"); + play("bounce", true); + } + } else { + if(touching==LEFT){ + velocity.x=dash_vel; + ctr=0; + play_sfx("hit"); + play("bounce", true); + } + } + } else if(frame_type==t_bounce_v){ + if(ctr==0){ + if(touching==DOWN){ + velocity.y=-dash_vel; + ctr=1; + play_sfx("hit"); + play("bounce", true); + } + } else { + if(touching==UP){ + velocity.y=dash_vel; + ctr=0; + play_sfx("hit"); + play("bounce", true); + } + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Gasguy.hx b/AIR/intra/hsrc/entity/enemy/apartment/Gasguy.hx new file mode 100644 index 0000000..b3702f3 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Gasguy.hx @@ -0,0 +1,202 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +class Gasguy extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/apartment/gas_guy.png")] public static var gas_guy_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/apartment/gas_guy_cloud.png")] public static var gas_guy_cloud_sprite:Class; + + public var xml:XML; + private var player:Player; + private var parent:Dynamic; + private var gas_group:FlxGroup=new FlxGroup(3); + + private var state:Int=1; + private var s_normal:Int=0; + + private var s_shoot:Int=1; + private var t:Float=4; + private var tm:Float=5.0; + private var initial_latency:Float=1.5; + private var tm_shoot_latency:Float=1.2; + + private var s_dying:Int=2; + private var s_dead:Int=3; + + private var s_shoot_latency:Int=4; + + private var tm_move_sound:Float; + private var t_move_sound:Float=0; + + + private var just_hit:Bool=false; + + public var cid:Int=CLASS_ID.GASGUY; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* add gas guy anims */ + loadGraphic(gas_guy_sprite, true, false, 16, 24); + addAnimation("float", [0, 1], 2, true); + addAnimation("release_gas", [2], 20, true); + play("float"); + + /* Make gas and add adnimations for gas*/ + for(i in 0...gas_group.maxSize){ + var gas:FlxSprite=new FlxSprite(); + gas.loadGraphic(gas_guy_cloud_sprite, true, false, 24, 24); + gas.addAnimation("gas_move", [0, 1], 3); + gas.width=gas.height=16; + gas.offset.x=4; + gas.offset.y=4; + gas.centerOffsets(true); + gas.play("gas_move"); + gas.flicker(-1); + + gas_group.add(gas); + gas.x=x; + gas.visible=false; + gas.y=y; + Registry.subgroup_gas.push(gas); + } + + parent.fg_sprites.add(gas_group); + + + drag.x=drag.y=30; + has_tile_callbacks=false; + health=3; + state=s_normal; + + add_sfx("move", Registry.sound_data.gasguy_move); + add_sfx("shoot", Registry.sound_data.gasguy_shoot); + + tm_move_sound=1.5 + Math.random(); + } + + private var ticks:Int=0; + override public function update():Void + { + + t_move_sound +=FlxG.elapsed; + if(t_move_sound>tm_move_sound && visible){ + t_move_sound=0; + play_sfx("move"); + } + + if(initial_latency>0){ + initial_latency -=FlxG.elapsed; + return; + } + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + var gas:FlxSprite; + + ticks +=1; + for(gas in gas_group.members){ + + //broom reduces gas lifepan + if(ticks==3){ + if(player.broom.visible && player.broom.overlaps(gas)){ + gas.alpha -=0.025; + } + gas.alpha -=0.003; + } + //use sin table or dont dum + // gas.scale.x=1 + 0.25*Math.sin(12 *(t / tm)); + // gas.scale.y=1 + 0.25*Math.sin(6 *(t / tm)); + if(gas.alpha>0.3 && gas.visible && gas.overlaps(player)){ + player.sig_reverse=true; + } + } + if(ticks==3)ticks=0; + + if(state==s_dead)return; + + EventScripts.send_property_to(this, "x", player.x, 0.2); + EventScripts.send_property_to(this, "y", player.y, 0.2); + + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + health--; + play_sfx(HURT_SOUND_NAME); + flicker(0.5); + if(health<=0)state=s_dying; + var p:Point=new Point(player.x, player.y); + var _p:Point=new Point(x, y); + EventScripts.scale_vector(p, _p, velocity, 100); + } + + if(player.overlaps(this)){ + if(state !=s_dead){ + player.touchDamage(1); + } + } + + + + //wait a bit befoore shooting again + if(state==s_normal){ + t +=FlxG.elapsed; + + if(t>tm){ + state=s_shoot_latency; + play("release_gas"); + t=0; + } + } else if(state==s_shoot){ + var p1:Point=new Point(player.x, player.y); + var _p1:Point=new Point(x, y); + for(gas in gas_group.members){ + EventScripts.scale_vector(_p1, p1, gas.velocity, 30); + gas.visible=true; + gas.x=x; + gas.y=y; + play_sfx("shoot"); + gas.velocity.x +=(-10 + 20 * Math.random()); + gas.velocity.y +=(-10 + 20 * Math.random()); + gas.alpha=0.8; + } + state=s_normal; + play("float"); + + } else if(state==s_shoot_latency){ + t +=FlxG.elapsed; + if(t>tm_shoot_latency){ + t=0; + state=s_shoot; + } + } else if(state==s_dying){ + Registry.GRID_ENEMIES_DEAD++; + + EventScripts.drop_big_health(x, y, 0.6); + EventScripts.make_explosion_and_sound(this); + + xml.@alive="false"; + state=s_dead; + alive=false; + visible=false; + } + + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Rat.hx b/AIR/intra/hsrc/entity/enemy/apartment/Rat.hx new file mode 100644 index 0000000..f0800fa --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Rat.hx @@ -0,0 +1,213 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Dust; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.system.FlxTile; + +/** + * ... + * @author Seagaia + */ +class Rat extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/apartment/rat.png")] public static var rat_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var move_vel:Int=40; + private var lookahead:FlxSprite=new FlxSprite(); + private var pp_off:Point=new Point(0, 0);//pin point for lookahead + + public var cid:Int=CLASS_ID.RAT; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_dying:Int=1; + private var s_dead:Int=2; + + private var do_rotations:Bool=false; + + private var hurt_box:FlxSprite=new FlxSprite; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + solid=false; + + loadGraphic(rat_sprite, true, false, 16, 16); + var o:Int=(Registry.CURRENT_MAP_NAME=="TRAIN")? 6:0; + addAnimation("up", [o+4, o+5], 5); + addAnimation("down", [o+0, o+1], 5); + addAnimation("r", [o+2, o+3], 5);//DEFAULT:RIGHT + addAnimation("l", [o+2, o+3], 5); + /* Flip this boolean if you want rotations instead of separate right/down/up sprites */ + /* If so, rotations assume that the spritesheet is originally facing DOWN */ + do_rotations=false; + + addAnimation("die", [0, 1], 30); + play("down"); + + if(parseInt(xml.@frame)==0){ + play("down"); + facing=DOWN; + velocity.y=move_vel; + + pp_off.x=7; + pp_off.y=18; + y -=20; + } + + width=height=12; + centerOffsets(true); + x +=2; + y +=2; + lookahead.makeGraphic(1, 1, 0x00000000); + lookahead.x=x + pp_off.x; + lookahead.y=y + Registry.HEADER_HEIGHT + pp_off.y; + parent.bg_sprites.add(lookahead); + + hurt_box.makeGraphic(8, 8, 0xff00000); + + add_sfx("move", Registry.sound_data.rat_move); + } + + + /* Rotate, scale the sprite, change the velocity, and set the right anim */ + private function switch_dir(a:FlxTile, b:Dynamic):Void { + if(do_rotations){ + angle=(angle + 90)% 360; + } + play_sfx("move"); + scale.x=1; + switch(facing){ + case DOWN: + play("l"); + + scale.x=-1; + facing=LEFT; + pp_off.x=0; + pp_off.y=8; + velocity.x=-move_vel; + velocity.y=0; + break; + case LEFT: + play("up"); + facing=UP; + pp_off.x=8; + pp_off.y=-2; + velocity.x=0; + velocity.y=-move_vel; + break; + case UP: + play("r"); + facing=RIGHT; + pp_off.x=12; + pp_off.y=8; + velocity.x=move_vel; + velocity.y=0; + break; + case RIGHT: + play("down"); + facing=DOWN; + pp_off.x=8; + pp_off.y=15; + velocity.x=0; + velocity.y=move_vel; + break; + } + } + + override public function preUpdate():Void + { + if(!exists)return; + + if(Registry.is_playstate){ + + /* Check running Into switch pillars */ + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.frame==sp.up_frame && sp.overlaps(lookahead)){ + switch_dir(null, null); + + } + + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + + if(dust.frame !=Dust.EMPTY_FRAME && dust.overlaps(lookahead)){ + switch_dir(null, null); + } + } + + for(var dash_trap:Dash_Trap in Registry.subgroup_dash_traps){ + if(dash_trap==null)continue; + if(dash_trap.overlaps(this)){ + state=s_dying; + } + } + + /* Check for touching a solid tile to turn right */ + var t:FlxTilemap=parent.curMapBuf; + var _x:Int=(lookahead.x % 160)/ 16;//FCK IT + var _y:Int=((lookahead.y - 20)% 160)/ 16; + var tile_idx:Int=t.getTileByIndex(_y * 10 + _x); + var tile:FlxTile=t._tileObjects[tile_idx]; + if(tile.callback !=null || tile.allowCollisions !=NONE){ + switch_dir(null, null); + } + } + super.preUpdate(); + } + + + override public function update():Void + { + lookahead.x=x + pp_off.x; + lookahead.y=y + pp_off.y; + if(state==s_normal){ + if(player.broom.visible && player.broom.overlaps(this)){ + state=s_dying; + } + } else if(state==s_dying){ + //play("die"); + //alpha -=0.025; + alpha=0; + if(alpha==0){ + state=s_dead; + if(parent.state !=parent.S_TRANSITION){ + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + EventScripts.drop_small_health(x, y, 0.5); + } + } + + } + + if(state==s_dead){ + exists=false; + } + + hurt_box.x=x + 4; + hurt_box.y=y + 4; + if(!player.invincible && player.overlaps(hurt_box)&& player.state==player.S_GROUND){ + player.touchDamage(1); + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Silverfish.hx b/AIR/intra/hsrc/entity/enemy/apartment/Silverfish.hx new file mode 100644 index 0000000..54dbf70 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Silverfish.hx @@ -0,0 +1,282 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Gate; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Silverfish extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/apartment/silverfish.png")] public static var silverfish_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_seen:Int=1; + private var s_turning:Int=2; + private var s_dying:Int=3; + private var s_gas:Int=4; + + private var t_turn:Float=0; + private var tm_turn:Float=0.8; + + private var vel:Int=50; + private var death_timer:Float=0.7; + private var seen_distance:Float=30;// + + private var init_latency:Float=1.0; + + public var cid:Int=CLASS_ID.SILVERFISH; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Add silverifsh adnimations*/ + loadGraphic(silverfish_sprite, true, false, 16, 16); + addAnimation("move_l", [6, 7], 7, true); + addAnimation("move_d", [4, 5], 7, true); + addAnimation("move_r", [6, 7], 7, true);// DEFAULT:RIGHT + addAnimation("move_u", [8, 9], 7, true); + addAnimation("idle_d", [4], 12, true); + addAnimation("idle_u", [8], 12, true); + addAnimation("idle_r", [6], 12, true);// DEFAULT:RIGHT + addAnimation("idle_l", [6], 12, true); + + + + + + //addAnimation("die", [4, 5], 30, true); + + // LDRU + switch(parseInt(xml.@frame)){ + case 0: + play("idle_l"); + scale.x=-1; + facing=LEFT;break; + case 1: + play("idle_d"); + facing=DOWN;break; + case 2: + play("idle_r"); + facing=RIGHT;break; + case 3: + play("idle_u"); + facing=UP;break; + } + + add_sfx("move", Registry.sound_data.sf_move); + } + + + override public function preUpdate():Void + { + + if(FlxG.collide(this, parent.curMapBuf)&& state==s_seen){ + state=s_turning; + } + for(var gate:Gate in Registry.subgroup_gates){ + if(gate==null)continue; + if(FlxG.collide(gate, this)&& state==s_seen){ + state=s_turning; + } + } + super.preUpdate(); + } + override public function update():Void + { + + if(y0){ + init_latency -=FlxG.elapsed; + return; + } + // get hurt + if(player.broom.visible && player.broom.overlaps(this)&& state !=s_dying){ + state=s_dying; + } + + //hurt player + if(player.overlaps(this)){ + player.touchDamage(1); + } + + //get gased maybe + if(state !=s_gas){ + for(var gas:FlxSprite in Registry.subgroup_gas){ + if(gas==null || !gas.visible)continue; + if(gas.alpha>0.3 && gas.overlaps(this)){ + state=s_gas; + play_sfx("move"); + drag.x=drag.y=10; + var p:Point=new Point(player.x, player.y); + var _p:Point=new Point(x, y); + EventScripts.scale_vector(_p, p, velocity, 70); + EventScripts.face_and_play(this, player, "move"); + if(facing !=LEFT){ + scale.x=1; + } else { + scale.x=-1; + } + + + } + } + + } + + + + + + if(state==s_normal){ + if(sees(player)||(EventScripts.distance(player,this)tm_turn){ + t_turn=0; + scale.x=1; + if(facing & LEFT){ + facing=UP; + } else if(facing & UP){ + facing=RIGHT; + } else if(facing & RIGHT){ + facing=DOWN; + } else if(facing & DOWN){ + facing=LEFT; + scale.x=-1; + } + } else if(sees(player)||(EventScripts.distance(player, this)0 && sp.x>x){ + yes=true; + } else if(velocity.x<0 && sp.x0 && sp.y>y){ + yes=true; + } else if(velocity.y<0 && sp.yy)&&(o.yx &&(o.y + o.height>y)&&(o.yx))return true; + } else { + if((o.y>y + height)&&(o.xx))return true; + } + return false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Splitboss.hx b/AIR/intra/hsrc/entity/enemy/apartment/Splitboss.hx new file mode 100644 index 0000000..6c83b0d --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Splitboss.hx @@ -0,0 +1,653 @@ +package entity.enemy.apartment +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +class Splitboss extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var added_to_parent:Bool=false; + private var white_overlay:FlxSprite; + + + private var DETHBALLZ:FlxGroup=new FlxGroup(12); + private var copies:FlxGroup=new FlxGroup(2); + private var copy_1:FlxSprite; + private var copy_2:FlxSprite; + + private var is_damaged:Bool=false; + private var t_damaged:Float=0; + private var tm_damaged:Float=0.8; + + + public var state:Int=0; + private var s_dead:Int=-2; + private var s_dying:Int=-1; + private var s_intro:Int=0; + + private var s_dethballz:Int=1; + private var s_dethballz_times_shot:Int=0; + private var h_dethballz_counts:Array=new Array(2, 1, 4); + private var h_dethballz_shots:Array=new Array(4, 10, 7); + private var h_dethballz_timeouts:Array=new Array(0.7, 0.2, 0.8); + private var t_dethballz:Float=0; + private var dethball_queue:Array=new Array(); + + private var s_h_dash:Int=2; + private var Y_OFF_R_DASH:Int=6; + private var h_dash_vel:Array=new Array(80, 100, 120); + private var h_dash_ball_vel:Array=new Array(80, 100, 120); + private var h_dashes_done:Int=0; + private var nr_dashes:Array=new Array(2, 3, 4); + private var h_dash_ball_pos:Array=new Array(1, 4); + private var t_h_dash:Float=0; + private var tm_h_dash:Float=0.5; + private var nr_dropped:Int=0; + private var nr_to_drop:Array=new Array(2, 3, 4); + private var next_drop:Float=0; + + private var s_split:Int=3; + private var t_split:Float=0; + private var split_vels:Array=new Array(40, 50, 60); + + + public var phase:Int=0; + + + private var MAX_HEALTH:Int=12; + private var PHASE_2_HEALTH:Int=8; + private var PHASE_3_HEALTH:Int=4; + private var AREA_TILE_W:Int=6; + private var AREA_TILE_H:Int=5; + + + private var tl:Point=new Point();//top left of movable area(2,2)in this case, relative to rooom + public var ctr:Int=0; + + + //[Embed(source="../../../res/sprites/enemies/apartment/splitboss.png")] public static var splitboss_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/apartment/splitboss_fireball.png")] public static var splitboss_fireball_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + solid=false; + solid=false; + immovable=true; + + tl.x=160 * Registry.CURRENT_GRID_X + 32; + tl.y=160 * Registry.CURRENT_GRID_Y + Registry.HEADER_HEIGHT + 48; + + health=MAX_HEALTH + 1; + + /* Make bullets(shuriken)*/ + for(i in 0...DETHBALLZ.maxSize){ + var DETHBALL:FlxSprite=new FlxSprite; + DETHBALL.loadGraphic(splitboss_fireball_sprite, true, false, 16, 16); + DETHBALL.height=DETHBALL.width=6; + DETHBALL.centerOffsets(true); + DETHBALLZ.add(DETHBALL); + DETHBALL.addAnimation("pulsate", [0, 1, 2, 3], 12);// IDLE + DETHBALL.addAnimation("shoot", [0, 1, 2, 3], 12,true);// MOVING + DETHBALL.addAnimation("fizzle", [4, 5, 6, 7], 12, false);//DISAPEPARING + } + DETHBALLZ.setAll("exists", false); + + /* Make sprite and copies */ + loadGraphic(splitboss_sprite, true, false, 24, 32); + width -=8; + height -=12; + centerOffsets(true); + + addAnimation("float", [0, 1, 2, 1], 5);//facing downwards, idle + addAnimation("idle_r", [4, 5, 6, 5], 5); + addAnimation("dash_r", [10, 11], 8); + addAnimation("dash_d", [8, 9], 8); + addAnimation("die", [0, 3], 14); + play("float"); + + for(i=0;itm_damaged){ + is_damaged=false; + } + } + + /* Determine behavior */ + if(state==s_dethballz){ + do_h_dethballz(); + } else if(state==s_h_dash){ + do_h_dash(); + } else if(state==s_split){ + do_split(); + } else if(state==s_intro){ + do_intro(); + } else if(state==s_dying){ + + if(ctr==0){ + DH.start_dialogue(DH.name_splitboss, DH.scene_splitboss_after_fight, "APARTMENT"); + ctr++; + + } else if(ctr==1){ + if(DH.a_chunk_just_finished()){ + ctr++; + Registry.sound_data.big_door_locked.play(); + } + } else { + Registry.volume_scale -=0.005; + flicker(0.1); + play("die"); + var tm_split:Float=5; + t_split -=FlxG.elapsed; + x=tl.x + 40; + y=tl.y + 40; + var r:Float=-65 *(1 -(t_split /tm_split)); + x +=(r + Math.random()* -2 * r); + y +=(r + Math.random()* -2 * r); + + white_overlay.alpha=(1 -(t_split / tm_split)); + for(var dethball:FlxSprite in DETHBALLZ.members){ + if(dethball==null)continue; + dethball.alpha -=0.05; + } + copy_1.alpha -=0.1; + copy_2.alpha -=0.1; + + if(t_split<0){ + state=s_dead; + Registry.sound_data.stop_current_song(); + Registry.volume_scale=1; + + // + Registry.sound_data.start_song_from_title("APARTMENT"); + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]=true; + visible=false; + xml.@alive="false"; + + } + } + } else if(state==s_dead){ + white_overlay.alpha -=0.05; + if(white_overlay.alpha==0){ + exists=false; + } + } + + super.update(); + } + + private function do_h_dash():Void { + + var DETHBALL:FlxSprite; + if(ctr==0){ + play("idle_r"); + offset.y=Y_OFF_R_DASH; + alpha -=0.1; + if(alpha==0){ + x=tl.x - 32; + y=player.y; + velocity.x=0; + ctr=1; + } + } else if(ctr==1){ + alpha +=0.15; + y=player.y; + if(alpha==1){ + t_h_dash +=FlxG.elapsed;// y-track the player as a warning + if(t_h_dash>tm_h_dash){ + t_h_dash=0; + ctr=2; + play("dash_r"); + play_sfx("dash"); + velocity.x=h_dash_vel[phase]; + next_drop=tl.x + 16 * Math.random(); + } + } + } else if(ctr==2){ + + offset.y=player.offset.y - player.DEFAULT_Y_OFFSET + Y_OFF_R_DASH; + if(nr_droppednext_drop &&(x>tl.x && xtl.x + 16*8){ //when far enough, dash aagain, or state change + alpha -=0.1; + if(alpha==0){ + nr_dropped=0; + h_dashes_done++; + if(h_dashes_done>=nr_dashes[phase]){ + ctr=3; + h_dashes_done=0; + for(DETHBALL in DETHBALLZ.members){ + if(DETHBALL.exists){ + DETHBALL.play("shoot"); + } + } + } else { + ctr=0; + } + } + } + for(DETHBALL in DETHBALLZ.members){ + DETHBALL.flicker(0.05); + } + + } else if(ctr==3){ + t_h_dash +=FlxG.elapsed; + if(t_h_dash0.6){ + state=s_dethballz; + } else if(r>0.3){ + state=s_split; + } else { + state=s_h_dash; + } + ctr=0; + } + } + private function do_h_dethballz():Void { + var iter:Int=0; + var len:Int=0; + var DETHBALL:FlxSprite; + + /***********/ + /*H_DETHBALLZ*/ + /***********/ + if(ctr==0){ + play("float"); + velocity.x=0; + x=tl.x + 40; + y=tl.y - 32; + /* Set number of balls to appear, and their positions.*/ + var tx:Int=Std.int(6 * Math.random()); + play_sfx("shoot"); + for(iter=0;iterh_dethballz_timeouts[phase]){ + //sfx pew pew + len=dethball_queue.length; + for(iter=0;iter=h_dethballz_shots[phase]){ + ctr=2; + s_dethballz_times_shot=0; + } + } + } else if(ctr==2){ + if(DETHBALLZ.countExisting()==0){ + ctr=0; + var r:Float=Math.random(); + if(r>0.63){ + state=s_h_dash; + } else if(r>0.38){ + state=s_dethballz; + } else { + state=s_split; + } + } + } + + /* Boilerplate overlap with player code. */ + if(!player.invincible && player.state !=player.S_AIR){ + for(DETHBALL in DETHBALLZ.members){ + if(DETHBALL !=null && DETHBALL.exists){ + if(DETHBALL._curAnim.name=="fizzle" &&(DETHBALL._curFrame==DETHBALL._curAnim.frames.length - 1)){ + DETHBALL.exists=false; + DETHBALL.velocity.y=0; + } + if(!player.invincible && player.overlaps(DETHBALL)){ + player.touchDamage(1); + //sfx fizzle + DETHBALL.play("fizzle"); + } + if(DETHBALL.y>tl.y + AREA_TILE_H * 16){ + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + DETHBALL.play("fizzle"); + } + } + } + } + } + + private function do_split():Void { + if(ctr==0){ // move to top of playing area and flicker + centerOffsets(true); + play("float"); + x=tl.x + 40; + y=tl.y - 16; + ctr++; + flicker(1.5); + visible=true; + + } else if(ctr==1){ //when hit, split Into three + if(player.broom.visible && player.broom.overlaps(this)){ + play_sfx("split"); + alpha=copy_1.alpha=copy_2.alpha=1; + copy_1.x=copy_2.x=x; + copy_1.y=copy_2.y=y; + velocity.y=-40; + copy_1.visible=copy_2.visible=true; + copy_1.velocity.x=-40;// copy 1 faces left + copy_2.velocity.x=40;// copy 2 faces right + copy_1.play("idle_r");copy_1.scale.x=-1; + copy_2.play("idle_r"); + copy_1.offset.y=copy_2.offset.y=Y_OFF_R_DASH; + ctr++; + } + } else if(ctr==2){ //fade out while moving + alpha -=0.02; + copy_1.alpha=copy_2.alpha=alpha; + if(alpha==0){ + copy_1.velocity.x=copy_2.velocity.x=velocity.x=0; + copy_1.velocity.y=copy_2.velocity.y=velocity.y=0; + ctr++; + alpha=copy_1.alpha=copy_2.alpha=0.7; + t_split=1.0; + } + } else if(ctr==3){ //pin to the player and successively dash + x=player.x;y=player.y - 24; + t_split -=FlxG.elapsed; + if(t_split<0){ //flicker for a bit before dashing + copy_1.flicker(0.2); + copy_2.flicker(0.2); + if(t_split<-0.7){ + ctr++; + copy_1.play("dash_r"); + copy_2.play("dash_r"); + } + } else { + copy_1.x=player.x + 25;copy_1.y=player.y; + copy_2.x=player.x - 25;copy_2.y=player.y; + } + } else if(ctr==4){ //dash the copies horizontally + copy_1.velocity.x=-split_vels[phase]; + copy_2.velocity.x=split_vels[phase]; + play_sfx("dash"); + if(player.overlaps(copy_1)|| player.overlaps(copy_2)){ + player.touchDamage(1); + } + x=player.x;y=player.y - 24; + copy_1.alpha -=0.02; + copy_2.alpha=copy_1.alpha; + if(copy_1.alpha==0){ // give a warning for the boss + ctr++; + copy_1.velocity.x=copy_2.velocity.x=0; + flicker(1); + } + + } else if(ctr==5){ // when warning done, dash + if(!flickering){ + play_sfx("dash"); + play("dash_d"); + velocity.y=split_vels[phase]; + alpha -=0.02; + if(alpha==0){ + alpha=1; + ctr++; + velocity.y=0; + } + } + } else if(ctr==6){ //determine next attack + play("float"); + var r:Float=Math.random(); + ctr=0; + if(phase<=1){ + if(r<=0.3){ + state=s_h_dash; + } else if(r<=0.7){ + state=s_dethballz; + } else { + state=s_split; + } + } else { + if(r<=0.5){ + state=s_h_dash; + } else if(r<=0.75){ + state=s_dethballz; + } else { + state=s_split; + } + } + } + return; + } + + + private function do_intro():Void { + var sub_ctr:Int=0; + if(ctr==0){ + x=tl.x + 48 -(width / 2); + y=tl.y + 32; + Registry.volume_scale -=0.005; + if(player.broom.visible && player.broom.overlaps(this)){ + ctr=1; + DH.start_dialogue(DH.name_splitboss, DH.scene_splitboss_before_fight, "APARTMENT"); + } + } else if(ctr==1){ + + if(DH.a_chunk_just_finished()){ + play_sfx("split"); + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + visible=false; + copy_1.visible=true; + copy_2.visible=true; + copy_1.x=copy_2.x=x; + copy_1.y=copy_2.y=y; + copy_1.velocity.x=-50; + copy_2.velocity.x=50; + ctr=2; + } + } else if(ctr==2){ + copy_1.alpha -=0.01; + copy_2.alpha -=0.01; + if(copy_1.alpha==0 && copy_2.alpha==0){ + ctr=3; + alpha=0; + copy_1.y=y=copy_2.y=tl.y - 32; + copy_1.x=x - 40; + copy_2.x=x + 40; + copy_1.velocity.x=copy_2.velocity.x=0; + visible=true; + } + } else if(ctr==3){ + alpha +=0.01; + copy_1.alpha=copy_2.alpha=alpha; + if(alpha==1){ + ctr=4; + } + } else if(ctr==4){ + copy_1.flicker(0.5);copy_2.flicker(0.5);flicker(0.5); + if(EventScripts.send_property_to(copy_1, "x", x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(copy_2, "x", x, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr=5; + copy_1.visible=copy_2.visible=false; + } + } else { + ctr=0; + visible=true; + state=s_dethballz; + } + } + + override public function destroy():Void + { + DH.dont_need_recently_finished(); + parent.sortables.remove(copies, true); + super.destroy(); + } + + } \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/apartment/Teleguy.hx b/AIR/intra/hsrc/entity/enemy/apartment/Teleguy.hx new file mode 100644 index 0000000..07a6894 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/apartment/Teleguy.hx @@ -0,0 +1,211 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Teleguy extends FlxSprite +{ + + public var xml:XML; + private var player:Player; + private var parent:Dynamic; + + + public var state:Int=0; + private var s_idle:Int=0 + private var s_teleporting:Int=1; + private var ctr:Int=0; + private var t_ctr:Float=0; + + + private var s_attacking:Int=2; + private var atk_pt:Point=new Point; + private var attack_speed:Float=0.9; + + private var s_dying:Int=3; + private var s_dead:Int=4; + + public var cid:Int=CLASS_ID.TELEGUY; + + //[Embed(source="../../../res/sprites/enemies/apartment/teleport_guy.png")] public var teleguy_sprite:Class; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(teleguy_sprite, true, false, 16, 24); + offset.y=6; + height=16; + + /* Add animations */ + addAnimation("idle_d", [0,1], 3); + addAnimation("idle_r", [2,3], 3);//DEFAULT:RIGHT + addAnimation("idle_u", [4,5], 3); + addAnimation("idle_l", [2,3], 3); + addAnimation("poof", [6,7,8,9],12,false); + addAnimation("unpoof", [8,7,6], 12,false); + addAnimation("dying", [0]); + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + state=s_dead; + alive=false; + } + health=1; + //FlxG.watch(this, "state", "teleguy state"); + + add_sfx("up", Registry.sound_data.teleguy_up); + add_sfx("down", Registry.sound_data.teleguy_down); + } + + + override public function update():Void + { + + if(alive && player.overlaps(this)){ + player.touchDamage(1); + } + + //Cleanup before death logic + if(health<=0 && state !=s_dead && state !=s_dying){ + t_ctr=2; + play("dying"); + state=s_dying; + xml.@alive="false"; + alive=false; + } + + // Idle until attacked + if(state==s_idle){ + scale.x=1; + /* Get the direction to the player and face that way*/ + switch(EventScripts.get_entity_to_entity_dir(x + 8, y + 16, player.x + 5, player.y + 7)){ + case UP: + play("idle_u"); + break; + case DOWN: + play("idle_d"); + break; + case RIGHT: + play("idle_r"); + break; + case LEFT: + play("idle_l"); + scale.x=-1; + break; + } + if(player.broom.visible && player.broom.overlaps(this)){ + state=s_teleporting; + } + + } else if(state==s_teleporting){ + if(ctr==0){ + play_sfx("up"); + play("poof");//goesto invisible + t_ctr=0.5; + ctr++; + alive=false; + } else if(ctr==1){ + /* Move behind player, set the point to dash attack to */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + atk_pt.x=x; + atk_pt.y=y; + teleport(); + play_sfx("down"); + play("unpoof");// ends on teleport thing almost done + ctr++; + t_ctr=0.5 + } + } else if(ctr==2){ + /* Face the player before dashing */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + alive=true; + scale.x=1; + if(facing==LEFT){ + play("idle_l"); + scale.x=-1; + } + if(facing==RIGHT)play("idle_r"); + if(facing==DOWN)play("idle_d"); + if(facing==UP)play("idle_u"); + ctr++; + } + } else if(ctr==3){ + ctr=0; + //sfx atack + state=s_attacking; + t_ctr=1.5; + } + } else if(state==s_attacking){ + /* Move to the attack pooint, if attacked, then start teleporting again */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + state=s_idle; + } else { + if(player.broom.visible && player.broom.overlaps(this)){ + if(Math.random()<0.5){ + state=s_teleporting; + } else { + flicker(1); + state=s_idle; + play_sfx(HURT_SOUND_NAME); + health--; + } + } + } + + EventScripts.send_property_to(this, "x", atk_pt.x, attack_speed); + EventScripts.send_property_to(this, "y", atk_pt.y, attack_speed); + } else if(state==s_dying){ + //t_ctr -=FlxG.elapsed; + //flicker(1); + t_ctr=-0.1; + if(t_ctr<0){ + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + } + } else if(state==s_dead){ + exists=false; + } + + super.update(); + } + + private function teleport():Void { + + if(player.facing==LEFT){ + x=player.x + 16; + y=player.y + facing=LEFT; + } else if(player.facing==RIGHT){ + x=player.x - 16; + y=player.y; + facing=RIGHT; + } else if(player.facing==UP){ + x=player.x; + y=player.y + 17; + facing=UP; + } else if(player.facing==DOWN){ + x=player.x; + y=player.y - 16; + facing=DOWN; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/bedroom/Annoyer.hx b/AIR/intra/hsrc/entity/enemy/bedroom/Annoyer.hx new file mode 100644 index 0000000..793bb67 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/bedroom/Annoyer.hx @@ -0,0 +1,324 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.enemy.circus.Lion; +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.SpriteFactory; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Annoyer extends FlxSprite +{ + + public var xml:XML; + //[Embed(source="../../../res/sprites/enemies/annoyer.png")] public static var S_ANNOYER_SPRITE:Class; + public var target:Player; + + private var state:Int=-1; + + private var S_WAIT:Int=-1; + private var S_APPROACH:Int=0; + private var S_CIRCLE:Int=1; + private var S_ATTACK:Int=2; + private var S_DEAD:Int=3; + private var S_HIT:Int=4; + private var hit_timer:Float=0.25; + + private var WAIT_TIMER_MAX:Float=0.25; + private var APPROACH_DISTANCE:Int=64; + private var CIRCLE_DISTANCE:Int=24; + private var wait_timer:Float=0.25; + private var CIRCLE_TIMER_MAX:Float=3.00; + private var circle_timer:Float=3.00; + private var swoop_to_point:Point=new Point(0, 0); + + private var rotate_radius:Float=20; + private var rotate_velocity:Float=0.14; + + private var just_hit_timer:Float=0.4; + private var just_hit:Bool=false; + public var cid:Int=CLASS_ID.ANNOYER; + + public var INCREMENTED_REG:Bool=false; + public var parent:Dynamic; + + + private var frame_type:Int=0; + private var T_NORMAL:Int=0; + private var T_SUPER:Int=2; + + private var fireballs:FlxGroup=new FlxGroup(4); + private var t_fireball:Float=0; + private var tm_fireball:Float=2.3; + private var vel_fireball:Int=30; + + + public function new(x:Int,y:Int,_xml:XML,_player:Player,_parent:Dynamic) + { + super(x, y); + xml=_xml; + target=_player; + loadGraphic(S_ANNOYER_SPRITE, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("flap", [6, 7], 4, true); + } else if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("flap", [8, 9], 8, true); + } else if(parseInt(xml.@frame)==T_SUPER){ + addAnimation("flap", [12,13,14,15,16,17], 8, true); + } else { + addAnimation("flap", [0, 1, 2, 3,4,5], 8, true); + } + play("flap"); + height=7; + width=8; + solid=false; + offset.x=3; + offset.y=2; + health=1; + parent=_parent; + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + + } + + if(parseInt(xml.@frame)==T_SUPER){ + frame_type=T_SUPER; + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + fireball.loadGraphic(Lion.lion_fireball_sprite, true, false, 16, 16); + fireball.width=fireball.height=8; + fireball.centerOffsets(true); + fireballs.add(fireball); + fireball.addAnimation("shoot",[0, 1], 8); + fireball.addAnimation("poof",[2,3,4,5], 8,false); + fireball.play("shoot"); + } + fireballs.setAll("visible", false); + fireballs.setAll("alive", false); + + parent.fg_sprites.add(fireballs); + health=2; + } + } + + + override public function update():Void { + var dx:Float; + var dy:Float; + if(just_hit){ + just_hit_timer -=FlxG.elapsed; + if(just_hit_timer<0 && state !=S_DEAD){ + state=S_WAIT; + velocity.x=velocity.y=0; + just_hit_timer=0.4; + just_hit=false; + } + } + + + + + + if(frame_type==T_SUPER &&(state !=S_DEAD)){ + var fireball:FlxSprite; + t_fireball +=FlxG.elapsed; + if(t_fireball>tm_fireball){ + t_fireball=0; + fireball=fireballs.getFirstDead()as FlxSprite; + if(fireball==null)return; + + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + fireball.x=x;fireball.y=y; + fireball.alpha=1; + EventScripts.scale_vector(new Point(x, y), new Point(target.x, target.y), fireball.velocity, vel_fireball); + fireball.visible=fireball.alive=true; + fireball.play("shoot"); + } + + for(fireball in fireballs.members){ + + if(fireball._curAnim !=null && fireball._curAnim.name !="poof"){ + if(fireball.alpha<0.9 && !target.invincible && fireball.alive && target.overlaps(fireball)){ + target.touchDamage(1); + fireball.play("poof"); + } + fireball.alpha -=0.002; + if(fireball.alpha<=0.6){ + fireball.play("poof"); + } + + if(target.broom.overlaps(fireball)&& target.broom.visible){ + fireball.play("poof"); + Dust.dust_sound.play(); + } + } else { + if(fireball.finished){ + fireball.alive=fireball.visible=false; + } + } + } + + + + } + + + if(overlaps(target)){ + if(xml.@alive !="false"){ + target.touchDamage(1); + } + } + if(target.broom.overlaps(this)&& target.broom.visible){ + hit("broom", target.broom.root.facing); + } + + + if(parent.state==parent.S_TRANSITION){ + state=S_WAIT; + } + + + switch(state){ + case S_WAIT: + wait_timer -=FlxG.elapsed; + if(wait_timer<0){ + wait_timer=WAIT_TIMER_MAX; + dx=x - target.x; + dy=y - target.y; + + if(Math.sqrt(dx * dx + dy * dy)(Registry.CURRENT_GRID_X + 1)* 160 - 16)x=(Registry.CURRENT_GRID_X + 1)* 160 - 16; + if(y<(Registry.CURRENT_GRID_Y * 160)+ 20)y=Registry.CURRENT_GRID_Y * 160 + 20; + if(y>(Registry.CURRENT_GRID_Y + 1)* 160 + 20)y=(Registry.CURRENT_GRID_Y + 1)* 160 + 20; + } + + super.update(); + } + + /** + * Note, requires the rotatee to have a "rotate_angle" property + * that will be updated to reflect its progress around the target + */ + private function rotate_about_center_of_sprite(pivot:FlxSprite,rotatee:Dynamic,radius:Float,velocity:Float):Void { + var pivot_x:Float=pivot.x + pivot.width / 2; + var pivot_y:Float=pivot.y + pivot.height / 2; + rotatee.x=Math.cos(rotatee.rotate_angle)*(radius)+ pivot_x - 8; + rotatee.y=Math.sin(rotatee.rotate_angle)*(radius)+ pivot_y - 5; + rotatee.rotate_angle=(rotatee.rotate_angle + velocity)% 6.28; + } + + public function hit(type:String, hit_dir:Int):Int { + if(!just_hit){ + Registry.sound_data.player_hit_1.play(); + switch(hit_dir){ + case UP: + velocity.y=-150;velocity.x=-30 + 60 * Math.random(); + break; + case DOWN: + velocity.y=150; + break; + case LEFT: + velocity.x=-150; + break; + case RIGHT: + velocity.x=150; + break; + } + just_hit=true; + flicker(0.2); + health--; + state=S_APPROACH; + if(health<=0)state=S_HIT; + } + return Registry.HIT_NORMAL; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/bedroom/Pew_Laser.hx b/AIR/intra/hsrc/entity/enemy/bedroom/Pew_Laser.hx new file mode 100644 index 0000000..c62f953 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/bedroom/Pew_Laser.hx @@ -0,0 +1,188 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.gadget.Dust; +import entity.player.Player; +import global.Registry; +import org.flixel.*; +import states.PlayState; +/** + * ... + * @author Seagaia + */ + +class Pew_Laser extends FlxSprite + +{ + //[embed laser gfx + //[Embed(source="../../../res/sprites/enemies/pew_laser.png")] public static var PEW_LASER:Class; + //[Embed(source="../../../res/sprites/enemies/pew_laser_bullet.png")] public static var PEW_LASER_BULLET:Class; + public var xml:XML; + public var parent:PlayState; + public var bullets:FlxGroup; + public var BULLET_TIMER_MAX:Float=0.5; + public var cur_velocity:Float=0; + public static var BULLET_VELOCITY:Float=40; + public static var BULLET_FAST_VELOCITY:Float=70; + public var bullet_timer:Float=1; + + private var dir_type:Int; + private static var T_DOWN:Int=0; + private static var T_RIGHT:Int=1; + private static var T_UP:Int=2; + private static var T_LEFT:Int=3; + private static var T_FAST_DOWN:Int=4; + private static var T_FAST_RIGHT:Int=5; + private static var T_FAST_UP:Int=6 + private static var T_FAST_LEFT:Int=7; + + private var draw_fix:Bool=false; + private var latency_ticks:Int=3; + + public var cid:Int=CLASS_ID.PEW_LASER; + public function new(X:Float, Y:Float, _xml:XML,_parent:PlayState) + { + super(X, Y); + xml=_xml; + + //determine frame/animations + loadGraphic(PEW_LASER, true, false, 16, 16); + + if(parseInt(xml.@frame)>3){ + cur_velocity=BULLET_FAST_VELOCITY; + } else { + cur_velocity=BULLET_VELOCITY; + } + + dir_type=parseInt(xml.@frame); + immovable=true; + solid=false; + bullets=new FlxGroup(5); + parent=_parent; + for(i in 0...5){ + var bullet:FlxSprite=new FlxSprite(x, y); + bullet.loadGraphic(PEW_LASER_BULLET, true, false, 16, 8); + bullet.exists=false; + bullet.has_tile_callbacks=false; + bullet.width=12; + bullet.height=8; + bullets.add(bullet); + bullet.addAnimation("a", [0, 1], 8, true); + bullet.addAnimation("b", [4, 5, 6, 7], 8, false); + bullet.play("a"); + } + parent.fg_sprites.add(bullets); + + + + + + switch(parseInt(xml.@frame)% 4){ + case 0:frame=0;break; + case 1:frame=1;bullets.setAll("angle", 270);break; + case 2:frame=2;bullets.setAll("angle", 180);break; + case 3:frame=3; + bullets.setAll("angle", 90);bullets.setAll("width", 8); + bullets.setAll("height", 16); bullets.setAll("offset", new FlxPoint(2,-4)); + break; + } + + } + + override public function destroy():Void { + //taken care of in remove_otehrobjects etc + super.destroy(); + } + + public function bullet_on_map(b:FlxSprite, m:FlxTilemap):Void { + + b.play("b"); + } + override public function update():Void { + bullet_timer -=FlxG.elapsed; + + latency_ticks--; + if(latency_ticks>0){ + FlxG.collide(bullets, parent.curMapBuf, bullet_on_map); + } else { + latency_ticks=3; + } + + /*if(!draw_fix){ + draw_fix=true; + var idx1:Int=parent.members.indexOf(bullets.members[0]); + parent.members.splice(parent.members.indexOf(this), 1); + parent.members.splice(idx1, 0, this); + }*/ + + for(j in 0...bullets.members.length){ + var b1:FlxSprite=bullets.members[j]; + if((b1.yparent.lowerBorder)|| + (b1.x + b1.width>parent.rightBorder)||(b1.x0)&& bullets.members[i]._curAnim.name=="a"){ + if(bullets.members[i].overlaps(parent.statefuls[ka])){ + parent.statefuls[ka].hit("Pew_Laser", 0); + bullets.members[i].velocity.x=bullets.members[i].velocity.y=0; + bullets.members[i].play("b"); + bullets.members[i].solid=false; + } + } + } + if(parent.player.overlaps(bullets.members[i])&& bullets.members[i].exists){ + parent.player.touchDamage(1, "zap"); + bullets.members[i].play("b"); + bullets.members[i].velocity.x=bullets.members[i].velocity.y=0; + bullets.members[i].solid=false; + + } + } + if(bullet_timer<0){ + Registry.sound_data.play_sound_group(Registry.sound_data.laser_pew_group); + var b:FlxSprite=bullets.getFirstAvailable()as FlxSprite; + if(b !=null){ + b.exists=true; + b.solid=true; + b.play("a"); + switch(dir_type){ + case T_DOWN:case T_FAST_DOWN:b.height=3;b.velocity.y=cur_velocity;b.y=y + 11;b.offset.y=4;b.x=x + 2;b.offset.x=2;break; + case T_UP:case T_FAST_UP:b.height=3;b.velocity.y=-cur_velocity;b.y=y + 8;b.x=x + 2;b.offset.x=2;b.offset.y=1;break; + case T_LEFT:case T_FAST_LEFT:b.width=3;b.velocity.x=-cur_velocity;b.x=x + 8;b.offset.y=-4;b.offset.x=5;break; + case T_RIGHT:case T_FAST_RIGHT:b.y=y + 2;b.offset.y=-2;b.offset.x=9;b.velocity.x=cur_velocity;b.x=x + 2;b.width=3;b.height=12;break; + } + bullet_timer=BULLET_TIMER_MAX; + } + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/bedroom/Shieldy.hx b/AIR/intra/hsrc/entity/enemy/bedroom/Shieldy.hx new file mode 100644 index 0000000..2f24941 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/bedroom/Shieldy.hx @@ -0,0 +1,216 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import entity.gadget.Switch_Pillar; +import entity.player.HealthBar; +import entity.player.HealthPickup; +import entity.player.Player; +import helper.EventScripts; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import global.Registry; +import states.PlayState; +/** + * ... + * @author Seagaia */ +class Shieldy extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/shieldy.png")] public static var SPRITE_SHIELDY:Class; + public var xml:XML; + public var just_hit:Bool=false; + public var hit_timer_max:Float=0.4; + public var hit_timer:Float=0.4; + public var parent:PlayState; + public static var FLOATING_VELOCITY:Int=30; + public static var T_LEFT:Int=4; + public static var T_UP:Int=5; + public static var T_RIGHT:Int=6; + public static var T_DOWN:Int=7; + public var INCREMENTED_REGISTRY:Bool=false; + + public var state:Int; + public static var S_L:Int=0; + public static var S_R:Int=1; + public static var S_U:Int=2; + public static var S_D:Int=3; + public static var S_NOTHING:Int=4; + public var ul_pt:FlxSprite; + public var dr_pt:FlxSprite; + + public var cid:Int=CLASS_ID.SHIELDY; + public var player:Player; + + + public function new(x:Int,y:Int,_xml:XML,_parent:PlayState) + { + super(x +2, y); + xml=_xml; + parent=_parent; + loadGraphic(SPRITE_SHIELDY, true, false, 16, 16); + addAnimation("float", [1, 2, 1, 0], 5, true); + //addAnimation("unhurt", [4], 7, true); + addAnimation("front_hit", [16, 17, 18, 1], 12, false); + addAnimation("back_hit", [13, 1], 12); + //addAnimation("die", [8, 9, 10, 11,14], 10, false); + play("float"); + immovable=true; + solid=true; + height=10; + width=10; + + offset.x=3; + offset.y=4; + health=2; + + switch(parseInt(xml.@frame)){ + case 0:state=S_NOTHING;break; + case T_LEFT:velocity.x=- FLOATING_VELOCITY;state=S_L;break; + case T_RIGHT:velocity.x=FLOATING_VELOCITY;state=S_R;break; + case T_UP:velocity.y=-FLOATING_VELOCITY;state=S_U;break; + case T_DOWN:velocity.y=FLOATING_VELOCITY;state=S_D;break; + } + + ul_pt=new FlxSprite(x, y); + dr_pt=new FlxSprite(x, y + 10); + ul_pt.makeGraphic(10, 1, 0xffff0000); + + dr_pt.makeGraphic(10, 1, 0xffff0000); + player=_parent.player; + + add_sfx("ineffective", Registry.sound_data.shieldy_ineffective); + } + + override public function update():Void { + + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + /* check for hit*/ + if(solid && player.broom.visible && player.broom.overlaps(this)){ + hit("broom", player.facing); + } + /* hurt player */ + if(FlxG.overlap(this, player)){ + player.touchDamage(1); + } + + /* drop health and animate if die */ + if(health<=0 && solid){ + EventScripts.drop_small_health(x,y,0.5); + if(!INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_ENEMIES_DEAD++; + } + EventScripts.make_explosion_and_sound(this); + visible=false; + velocity.y=velocity.x=0; + Registry.sound_data.shieldy_hit.play(); + exists=false; + solid=false; + } + + + if(just_hit){ + hit_timer -=FlxG.elapsed; + if(hit_timer<0){ + hit_timer=hit_timer_max; + just_hit=false; + } + } else { + if(health>0) + play("float"); + } + + /* collide with map and switch dirs */ + ul_pt.x=x; + ul_pt.y=y; + dr_pt.x=x; + dr_pt.y=y + 10; + switch(state){ + case S_R: + if(touches_something()|| FlxG.collide(dr_pt, parent.curMapBuf)){ + state=S_L; + velocity.x=-FLOATING_VELOCITY; + } + break; + case S_L: + if(touches_something()|| FlxG.collide(ul_pt, parent.curMapBuf)){ + state=S_R; + velocity.x=FLOATING_VELOCITY; + } + break; + case S_U: + if(touches_something()|| FlxG.collide(ul_pt, parent.curMapBuf)){ + state=S_D; + velocity.y=FLOATING_VELOCITY; + } + break; + case S_D: + if(touches_something()|| FlxG.collide(dr_pt, parent.curMapBuf)){ + state=S_U; + velocity.y=-FLOATING_VELOCITY; + } + break; + } + + super.update(); + } + + private function touches_something():Bool { + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.overlaps(this)&&(sp.frame==sp.up_frame))return true; + } + return false; + } + + + public function hit(hitter:String, dir_player_facing:Int):Int { + if(hitter=="Pew_Laser"){ + health -=5; + return Registry.HIT_NORMAL; + } + if(dir_player_facing==FlxObject.DOWN && !just_hit){ + Registry.sound_data.shieldy_hit.play(); + just_hit=true; + health --; + flicker(hit_timer_max / 2); + play("back_hit"); + return Registry.HIT_NORMAL; + } else if(!just_hit){ + play("front_hit"); + play_sfx("ineffective"); + var old_x:Int=Std.int(x); + var old_y:Int=Std.int(y); + switch(dir_player_facing){ + case LEFT: + if(x % 160>20){ + x -=8; + } + break; + + case UP: + y -=8;break; + case RIGHT: + if(x % 160<125){ + x +=8; + } + break; + } + just_hit=true; + var tile_type:Int=parent.map.getTile(int(int(x)/ 16), Std.int((int(y)- 20)/ 16)); + if(parent.curMapBuf._tileObjects[tile_type].allowCollisions==FlxObject.ANY){ + x=old_x; + y=old_y; + } + } + return -1; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/bedroom/Slime.hx b/AIR/intra/hsrc/entity/enemy/bedroom/Slime.hx new file mode 100644 index 0000000..aa9fc90 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/bedroom/Slime.hx @@ -0,0 +1,355 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import entity.gadget.Key; +import entity.player.HealthPickup; +import entity.player.Player; +import flash.geom.Point; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxEmitter; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import org.flixel.FlxG; +import global.Registry; +class Slime extends FlxSprite +{ + //[Embed("../../../res/sprites/enemies/slime.png")] public static var Slime_Sprite:Class; + //[Embed("../../../res/sprites/enemies/bedroom/slime_goo.png")] public var Slime_Goo_Sprite:Class; + //[Embed(source="../../../res/sprites/enemies/slime_bullet.png")] public static inline var embed_slime_bullet:Class; + //[Embed("../../../../../sfx/hit_slime.mp3")] public var Slime_Hit_Sound:Class; + public var slime_hit_sound:FlxSound=new FlxSound(); + + public var local_id:Int; + public var gotHit:Bool=false; + public var hitTimer:Float=0; + public var deathTimer:Float=0; + public var HIT_TIMEOUT:Float=0.3; + public var xml:XML; + + private var state:Int=0; + private var s_dead:Int=1; + private var dropped_health:Bool=false; + + public var type:Int; + public static var NORMAL_T:Int=0; + public static var KEY_T:Int=1; + public static var RISE_T:Int=2; + public static var SUPER_T:Int=3; + + public var played_rise:Bool=false; + public var has_key:Bool=false; + public var cid:Int=CLASS_ID.SLIME; + public var INCREMENTED_REGISTRY:Bool=false; + + public var change_vel_timer:Float=0.5; + public var change_vel_timer_max:Float=0.5; + private var VEL:Int=20; + private var BULLET_VEL:Int=40; + + public var t_shoot:Float=0; + public var tm_shoot:Float=1.8; + public var goo_collide_ticks:Int=4; + + + public var player:Player; + public var parent:Dynamic; + public var goo_group:FlxGroup=new FlxGroup(7); + public var goo_bullets:FlxGroup=new FlxGroup(4); + + public var move_frame_sound_sync:Bool=false; + + public function new(x:Int, y:Int, _local_id:Int, frame_type:Int, _xml:XML, _p:Player,_parent:Dynamic){ + super(x, y); + slime_hit_sound.loadEmbedded(Slime_Hit_Sound, false); + health=2; + loadGraphic(Slime_Sprite, true, false, 16, 16); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("Move", [2,3], 3); + addAnimation("Hurt", [2,8], 15); + addAnimation("Dead", [2, 8, 2, 8, 15, 9, 9], 12, false); + } else { + addAnimation("Move", [0, 1], 3); + addAnimation("Hurt", [0, 8], 15); + addAnimation("Dead", [0, 8, 0, 8, 15, 9, 9], 12, false); + } + addAnimation("Rise", [7, 7, 6, 6, 5, 5, 4, 4, 8, 0, 8, 0], 15, false); + width=height=12; + offset.x=offset.y=2; + if(frame_type !=RISE_T){ + play("Move"); + } else { + visible=false; + solid=true; + } + local_id=_local_id; + xml=_xml; + + if(frame_type==KEY_T){ + has_key=true; + } else if(frame_type==SUPER_T){ + VEL=40; + } + type=frame_type; + + player=_p; + parent=_parent; + + + for(i in 0...goo_group.maxSize){ + var goo:FlxSprite=new FlxSprite(0, 0); + goo.loadGraphic(Slime_Goo_Sprite, true, false, 6, 6); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + goo.addAnimation("move", [4,5,6,7,5,7,5,6,5,4], 5 + Std.int(5 * Math.random())); + } else { + goo.addAnimation("move", [0,1,2,3,1,3,1,2,1,0],5 + Std.int(5*Math.random())); + } + goo.play("move"); + + goo.my_shadow=new FlxSprite(); + goo.my_shadow.makeGraphic(3, 3, 0xff010101); + goo_group.add(goo); + parent.bg_sprites.add(goo.my_shadow); + + goo.exists=goo.my_shadow.exists=false; + goo.velocity.x=Math.random()>0.5 ? -10 - 5 * Math.random():10 + 5 * Math.random(); + goo.velocity.y=Math.random()>0.5 ? -10 - 5 * Math.random():10 + 5 * Math.random(); + goo.parabola_thing=new Parabola_Thing(goo, 16, 0.8 + 0.3 * Math.random(), "offset", "y"); + + } + + for(i=0;i0.5){ + solid=false; + state=s_dead; + goo_group.setAll("velocity", new FlxPoint(0, 0)); + } + } + } else { + + change_vel_timer -=FlxG.elapsed; + if(!gotHit && change_vel_timer<0){ + change_vel_timer=change_vel_timer_max + velocity.x=VEL * Math.random()- VEL/2; + velocity.y=VEL * Math.random()- VEL/2; + if(frame==1){ + velocity.x=velocity.y=0; + } + } else { + if(gotHit){ + hitTimer +=FlxG.elapsed; + } + if(hitTimer>HIT_TIMEOUT){ + play("Move"); + hitTimer=0;gotHit=false; + } + } + } + + /* update goo effect */ + for(var goo:FlxSprite in goo_group.members){ + if(goo !=null && goo.exists){ + if(goo.parabola_thing.tick()){ + if(goo.alpha==1){ + play_sfx("splash"); + } + goo.alpha -=0.01; + goo.my_shadow.exists=false; + goo._curAnim=null; + goo.velocity.x=goo.velocity.y=0; + } else { + goo.my_shadow.x=goo.x; + goo.my_shadow.y=goo.y; + FlxG.collide(goo, parent.curMapBuf); + } + } + } + + /* do bullets, maybe */ + goo_collide_ticks<0 ? goo_collide_ticks=3:goo_collide_ticks --; + if(type==SUPER_T){ + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot){ + t_shoot=0; + goo=goo_bullets.getFirstAvailable()as FlxSprite; + // Only shoot when alive + if(goo !=null && xml.@alive !="false"){ + goo.alpha=1; + goo.exists=true; + goo.x=x;goo.y=y; + play_sfx("shoot"); + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), goo.velocity, BULLET_VEL); + } + } + for(goo in goo_bullets.members){ + if(goo==null || !goo.exists)continue; + if(goo_collide_ticks==0){ + if(FlxG.collide(goo, parent.curMapBuf)){ + goo.exists=false; + } + } + goo.alpha -=0.013; + if(goo.alpha<=0.3){ + goo.exists=false; + goo.velocity.y=goo.velocity.x=0; + + } else { + if(!player.invincible && player.state !=player.S_AIR && goo.overlaps(player)){ + goo.velocity.x=goo.velocity.y=0; + goo.alpha=0; + player.touchDamage(1); + } + } + } + } + super.update(); + } + + /** + * Uh, getting hit. Type is what hits it. Dir is what direction. + * @param type + * @param dir + * @return HIT_NORMAL if died or normal. HIT_KEY if drops key... + */ + + public function hit(type:String, dir:Int):Int { + if(visible==false)return -1; + if(type=="broom" && !gotHit){ + for(i in 0...2){ + var goo:FlxSprite=goo_group.getFirstAvailable()as FlxSprite; + goo.exists=goo.my_shadow.exists=true; + goo.x=x; + goo.y=y; + } + health -=1; + slime_hit_sound.play(); + if(health==0){ + velocity.x=velocity.y=0; + if(!INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + visible=false; + play("Dead"); + } + + if(has_key){ + has_key=false; + gotHit=true; + return Registry.HIT_KEY; + } + + } else { + play("Hurt"); + } + switch(dir){ + + case FlxObject.LEFT: velocity.x=-100;break; + case FlxObject.RIGHT:velocity.x=100;break; + case FlxObject.UP: velocity.y=-100;break; + case FlxObject.DOWN: velocity.y=100;break; + } + } + gotHit=true; + return Registry.HIT_NORMAL; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/bedroom/Sun_Guy.hx b/AIR/intra/hsrc/entity/enemy/bedroom/Sun_Guy.hx new file mode 100644 index 0000000..7369c64 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/bedroom/Sun_Guy.hx @@ -0,0 +1,635 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.decoration.Light; +import entity.gadget.Dust; +import entity.player.Player; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import org.flixel.*; +import global.Registry; +import helper.EventScripts; +import flash.geom.Point; +import states.PlayState; + + +class Sun_Guy extends FlxSprite +{ + + /*intro:statue, darkened room, rays of light rotate out of eyes + * then whole room gets lit? + * + * floats, moves horizontally, usually has a force field + * shoots lasers across the screen, you must push dust to block them + * these comes from two orbs + * can only hit him when the orbs are not circling + * can attack the orbs too + * */ + public var xml:XML; + + /* state vars */ + private var times_hurt_player:Int=0; + private var S_INTRO_1:Int=0; + private var S_INTRO_2:Int=6; + private var S_INTRO_0:Int=7; + private var S_HORIZONTAL_FLOAT:Int=1; + private var HF_1:Bool=false; + private var VF_1:Bool=false; + private var S_CHARGE:Int=2; + private var S_CHARGE_CTR:Int=0; + private var S_FIRE_LASER:Int=3; + private var S_DYING:Int=4; + private var S_DYING_CTR:Int=0; + private var S_DEAD:Int=5; + private var S_VERTIFLOAT:Int=8; + private var S_VERTIFLOAT_CTR:Int=0; + + private var STATE:Int; + private var INCREMENTED_REGISTRY:Bool=false; + + public var just_got_hurt:Bool=false; + public var hit_timer:Float=1; + public var HIT_TIMER_MAX:Float=1.5; + + /* other stuff */ + public var dusts:FlxGroup=new FlxGroup(3); + private var dusts_poofed:Bool=false; + /* Lighting for Intro */ + private var light_cone_1:Light; + private var light_cone_2:Light; + + /* entities for dying outr o */ + private var white_overlay:FlxSprite=new FlxSprite(0, 0); + /* Circular protective orbs */ + private var light_orb_1:FlxSprite; + private var light_orb_2:FlxSprite; + private var orb_illum_1:Light; + private var orb_illum_2:Light; + private var sun_guy_wave:FlxSprite; + private var sun_wave_evaporating:Bool=false; + + /* Radii of circulation, rotation velocity(degrees/tick), angle about boss */ + public var lr_1:Float=16; + public var lr_2:Float=32; + public var rv_1:Float=0.05; + public var rv_2:Float=0.04; + private var a_1:Float=0; + private var a_2:Float=0; + + private var MAX_HEALTH:Int=7;//health of boss + private var center_pt:FlxPoint=new FlxPoint(0, 0);//used for rotations + + /* References we need for events/lighting */ + private var player:Player; + private var darkness:FlxSprite; + private var parent:PlayState; + + private var y_timer:Float=0;//For y-oscillations + private var stopped_song:Bool=false; + private var started_song:Bool=false; + private var base_pt:Point;//Spawn point of the boss + + //[Embed(source="../../../res/sprites/enemies/sun_guy.png")] public static var C_SUN_GUY:Class; + //[Embed(source="../../../res/sprites/enemies/light_orb.png")] public static var C_LIGHT_ORB:Class; + //[Embed(source="../../../res/sprites/enemies/sun_guy_wave.png")] public static var C_SUN_GUY_WAVE:Class; + + + private var DEAD_FRAME:Int=4; + public var cid:Int=CLASS_ID.SUN_GUY; + + public function new(_x:Int,_y:Int,_darkness:FlxSprite,_parent:PlayState,_xml:XML,_player:Player) + { + super(_x, _y); + base_pt=new Point(_x, _y); + xml=_xml; + health=MAX_HEALTH; + player=_player; + darkness=_darkness; + immovable=true; + parent=_parent; + if(Registry.FUCK_IT_MODE_ON){ + MAX_HEALTH=1; + xml.@alive="false"; + } + if(xml.@alive=="false"){ + STATE=S_DEAD; + } else { + STATE=S_INTRO_0; + } + + /* Animations for boss */ + loadGraphic(C_SUN_GUY, true, false, 16, 24); + addAnimation("foo", [0, 1, 2, 3, 4], 3); + addAnimation("death_fade", [12, 13, 14, 15, 16, 17, 18,19], 6,false); + play("foo"); + if(STATE==S_DEAD)frame=DEAD_FRAME; + + + light_cone_1=new Light(x - 12, y- 32, darkness, Light.T_CONE_LIGHT, false); + light_cone_2=new Light(x - 6, y - 32, darkness, Light.T_CONE_LIGHT, false); + + /* ANIMS FOR ORBS */ + light_orb_1=new FlxSprite(x - 16, y); + light_orb_2=new FlxSprite(x + 32, y); + + light_orb_1.addAnimation("glow", [0, 1, 2, 3, 4/*, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12*/], 10, true); + light_orb_2.addAnimation("glow", [2, 3, 4, 0, 1/*6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5*/], 10, true); + light_orb_1.play("glow"); + light_orb_2.play("glow"); + + light_orb_1.loadGraphic(C_LIGHT_ORB, true, false, 16, 16); + light_orb_2.loadGraphic(C_LIGHT_ORB, true, false, 16, 16); + light_orb_1.width=light_orb_1.height=light_orb_2.height=light_orb_2.width=12; + light_orb_1.offset.x=light_orb_1.offset.y=2; + light_orb_2.offset.x=light_orb_2.offset.y=2; + orb_illum_1=new Light(x, y, darkness, Light.T_FIVE_FRAME_GLOW, true, light_orb_1, 5, Light.L_SUN_GUY_ORBS); + orb_illum_2=new Light(x, y, darkness, Light.T_FIVE_FRAME_GLOW, true, light_orb_2, 5, Light.L_SUN_GUY_ORBS); + orb_illum_1.base_x_scale=orb_illum_1.base_y_scale=orb_illum_2.base_y_scale=orb_illum_2.base_x_scale=0.8; + orb_illum_1.addAnimation("flicker", [0, 1, 2, 3, 4,3,2,1], 6, true); + orb_illum_2.addAnimation("flicker", [0, 1, 2, 3, 4,3,2,1], 6, true); + orb_illum_1.play("flicker"); + orb_illum_2.play("flicker"); + + /* BIG WAVE ANIMS */ + sun_guy_wave=new FlxSprite(base_pt.x - 50, base_pt.y +8); + + sun_guy_wave.loadGraphic(C_SUN_GUY_WAVE, true, false, 128, 8); + sun_guy_wave.addAnimation("play", [3, 4, 5], 8, true); + sun_guy_wave.addAnimation("evaporate", [2, 1, 0], 8, false); + sun_guy_wave.play("play"); + parent.add(sun_guy_wave); + sun_guy_wave.visible=false; + + for(i in 0...3){ + var dust:Dust=new Dust(0, 0, null,parent); + dust.exists=false; + dusts.add(dust); + parent.bg_sprites.add(dusts); + + } + + light_orb_1.visible=light_orb_2.visible=false; + orb_illum_1.visible=orb_illum_2.visible=false; + parent.add(light_cone_1); + parent.add(light_cone_2); + parent.add(light_orb_1); + parent.add(light_orb_2); + parent.add(orb_illum_1); + parent.add(orb_illum_2); + alpha=light_cone_1.alpha=light_cone_2.alpha=0; + + /* White overlay */ + white_overlay.makeGraphic(160, 180, 0xffffffff); + white_overlay.scrollFactor=new FlxPoint(0, 0); + parent.add(white_overlay); + white_overlay.visible=false; + + + Registry.EVENT_CHANGE_DARKNESS_ALPHA=false; + } + + override public function update():Void { + + if(player.health_bar.cur_health<=0){ + light_orb_1.alpha -=0.05; + light_orb_2.alpha=sun_guy_wave.alpha=light_orb_1.alpha; + dusts.setAll("visible", false); + } + + if(player.broom.overlaps(this)){ + if(player.broom.visible){ + hit("broom", player.broom.root.facing); + } + } + + + if(just_got_hurt){ + hit_timer -=FlxG.elapsed; + if(hit_timer<0){ + hit_timer=HIT_TIMER_MAX; + just_got_hurt=false; + } + if(health==0){ + STATE=S_DYING; + light_cone_2.base_x_scale=light_cone_2.base_y_scale=1; + light_cone_2.x=x -8; + light_cone_2.y=y - 24; + parent.remove(white_overlay, true); + parent.add(white_overlay); + play("death_fade"); + health=-1; + Registry.sound_data.stop_current_song(); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.shake(0.01,1); + } + } + switch(STATE){ + case S_INTRO_0: + intro_state_0(); + break; + case S_INTRO_1: + intro_state_1(); + break; + case S_INTRO_2: + intro_state_2(); + break; + case S_HORIZONTAL_FLOAT: + horizontal_float_state(); + break; + case S_VERTIFLOAT: + vertifloat_state(); + break; + case S_DYING: + dying_state(); + break; + case S_DEAD: + dead_state(); + break; + case S_CHARGE: + charge_state(); + break; + } + super.update(); + } + + private function Intro_state_0():Void { + + if(Registry.sound_data.sun_guy_scream.playing){ + Registry.sound_data.sun_guy_scream=new FlxSound(); + Registry.sound_data.sun_guy_scream.loadEmbedded(SoundData.S_SUN_GUY_SCREAM); + + } + if(!stopped_song){ + stopped_song=true; + Registry.sound_data.stop_current_song(); + } + EventScripts.send_alpha_to(darkness, 0.9, 0.006); + + EventScripts.send_property_to(player.light, "base_x_scale", 1.7, -0.02); + EventScripts.send_property_to(player.light, "base_y_scale", 1.7, -0.02); + if((player.y - y)<48){ + + if(!started_song){ + started_song=true; + DH.start_dialogue(DH.name_sun_guy, DH.scene_sun_guy_before_fight); + } + player.dontMove=true; + EventScripts.send_alpha_to(light_cone_1, 1.0, 0.01); + EventScripts.send_alpha_to(light_cone_2, 1.0, 0.01); + EventScripts.send_alpha_to(this, 1.0, 0.007); + if(DH.a_chunk_just_finished()){ + Registry.sound_data.start_song_from_title("BOSS"); + STATE=S_INTRO_1; + player.dontMove=false; + } + } + } + + private function Intro_state_1():Void { + EventScripts.send_alpha_to(darkness, 0.1, -0.02); + EventScripts.send_property_to(light_cone_1, "base_x_scale", 3, 0.01); + EventScripts.send_property_to(light_cone_2, "base_x_scale", 3, 0.01); + if(EventScripts.send_property_to(light_cone_1, "base_y_scale", 3, 0.02)|| + EventScripts.send_property_to(light_cone_2, "base_y_scale", 3, 0.02)){ + STATE=S_INTRO_2; + } + FlxG.shake(0.01,1); + EventScripts.send_property_to(player.light, "base_x_scale", 1.0, -0.02); + EventScripts.send_property_to(player.light, "base_y_scale", 1.0, -0.02); + + FlxG.collide(player, this); + } + + private function Intro_state_2():Void { + if(EventScripts.send_property_to(light_cone_1, "angle", 180, 5)){ + if(EventScripts.send_property_to(light_cone_1, "base_x_scale", 5, 0.3)){ + STATE=S_HORIZONTAL_FLOAT; + light_orb_1.visible=light_orb_2.visible=true; + orb_illum_1.visible=orb_illum_2.visible=true; + } + } + FlxG.collide(player, this); + } + private function horizontal_float_state():Void { + /* Oscillate boss */ + y_timer +=FlxG.elapsed; + y=base_pt.y + 10 * Math.sin(y_timer); + /* Move left and right */ + + move_horizontally(); + + /* Rotate orbs around boss */ + + rotate_orbs_about_sun_guy(); + + + + + /* Touch damage with player */ + if(FlxG.collide(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + + if(health<=6){ + STATE=S_VERTIFLOAT; + } + } + + private function dying_state():Void { + velocity.x=velocity.y=0; + alpha -=0.05; + switch(S_DYING_CTR){ + case 0: + // Get dark, then show dialogue + if(times_hurt_player==0){ + times_hurt_player=1; + Achievements.unlock(Achievements.No_damage_sunguy); + } + if(EventScripts.send_alpha_to(darkness, 1, 0.01)){ + if(!DH.scene_is_dirty(DH.name_sun_guy,DH.scene_sun_guy_after_fight)){ + DH.start_dialogue(DH.name_sun_guy, DH.scene_sun_guy_after_fight); + } + } + + // Fade out other objects + EventScripts.send_alpha_to(orb_illum_1, 0, -0.01); + EventScripts.send_alpha_to(orb_illum_2, 0, -0.01); + EventScripts.send_alpha_to(light_orb_1, 0, -0.01); + EventScripts.send_alpha_to(light_orb_2, 0, -0.01); + EventScripts.send_alpha_to(light_cone_1, 0, -0.02); + EventScripts.send_alpha_to(sun_guy_wave, 0, -0.03); + + // When dialogue's finihsed, do the flashes etc. + if(DH.scene_is_finished(DH.name_sun_guy,DH.scene_sun_guy_after_fight)){ + + if(!white_overlay.visible){ + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.visible=true; + } + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.alpha=1; + frame++; + S_DYING_CTR++; + } + } + break; + case 1: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + S_DYING_CTR++; + frame++; + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.alpha=1; + } + break; + case 2: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + S_DYING_CTR++; + frame++; + FlxG.shake(0.02,2); + Registry.sound_data.sun_guy_death_l.play(); + white_overlay.alpha=1; + } + break; + case 3: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.005)){ + frame++; + S_DYING_CTR++; + } + break; + case 4: + EventScripts.send_alpha_to(darkness, 0.75, -0.005); + if(EventScripts.send_property_to(player.light, "base_x_scale", 4, 0.06))S_DYING_CTR++; + EventScripts.send_property_to(player.light, "base_y_scale", 4, 0.06); + break; + default: + STATE=S_DEAD; + + break; + } + } + + /* Change the XML, global state, so forth...cleanup etc */ + private function dead_state():Void { + //One-off + if(!INCREMENTED_REGISTRY){ + /* if(!Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Terminal_Gate_Bedroom; + }*/ + darkness.alpha=0.5; + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + for(i in 0...3){ + dusts.members[i].x=-5000;//HEHHEH + } + xml.@alive="false"; + trace("boss dead"); + Registry.GRID_ENEMIES_DEAD++; + trace("grid enemies dead",Registry.GRID_ENEMIES_DEAD); + INCREMENTED_REGISTRY=true; + //EventScripts.boss_drop_health_up(x, y); + Registry.sound_data.start_song_from_title(Registry.CURRENT_MAP_NAME); + exists=false; + + + } + } + + private function vertifloat_state():Void { + var res:Bool; + switch(S_VERTIFLOAT_CTR){ + case 0: + if(x>base_pt.x){ + res=EventScripts.send_property_to(this, "x", base_pt.x, -3); + } else { + res=EventScripts.send_property_to(this, "x", base_pt.x, 3); + } + if(res && EventScripts.send_property_to(this, "y", base_pt.y - 30, -0.2))S_VERTIFLOAT_CTR++; + break; + case 1: + EventScripts.send_property_to(this, "lr_1", 8, -0.5); + EventScripts.send_property_to(this, "lr_2", 8, -0.5); + EventScripts.send_property_to(this, "rv_1", 0.4, 0.001); + EventScripts.send_property_to(this, "rv_2", 0.4, 0.001); + move_horizontally(); + move_vertically(); + if(FlxG.overlap(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + break; + } + + rotate_orbs_about_sun_guy(); + } + private function charge_state():Void { + //move orbs to guy + if(FlxG.overlap(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + var res:Bool; + var i:Int; + switch(S_CHARGE_CTR){ + case 0: + EventScripts.send_property_to(light_orb_1, "x", x+4, 2); + EventScripts.send_property_to(light_orb_1, "y", y+10, 2); + EventScripts.send_property_to(this, "x", base_pt.x + 30, 1); + EventScripts.send_property_to(light_orb_2, "x", x-4, 2); + EventScripts.send_property_to(light_orb_2, "y", y + 10, 2); + if(EventScripts.send_property_to(this, "y", base_pt.y - 20, 1)){ + S_CHARGE_CTR++; + sun_guy_wave.play("play"); + Registry.sound_data.sun_guy_charge.play(); + } + break; + case 1: + sun_guy_wave.visible=true; + sun_guy_wave.flicker(3); + FlxG.shake(0.02, 0.1); + sun_guy_wave.x=base_pt.x - 50; + sun_guy_wave.y=base_pt.y - 10; + sun_guy_wave.velocity.y=0; + velocity.x=velocity.y=0; + if(FlxG.overlap(sun_guy_wave, player)){ sun_guy_wave.visible=false;player.touchDamage(1);S_CHARGE_CTR=3; + times_hurt_player++;} + EventScripts.send_property_to(light_orb_1, "x", base_pt.x - 50, 0.3); + if(EventScripts.send_property_to(light_orb_2, "x", base_pt.x + 75, 0.3)){ + S_CHARGE_CTR++; + Registry.sound_data.sun_guy_death_s.play(); + } + break; + case 2: + sun_guy_wave.velocity.y=30; + if(!sun_wave_evaporating){ + for(i=0;i180){ + S_CHARGE_CTR=3; + sun_wave_evaporating=false; + sun_guy_wave.play("evaporate"); + } + break; + case 3: + if(!dusts_poofed){ + for(i=0;iARTHUR_timer_max){ + ctr++; + DH.start_dialogue(DH.name_arthur, DH.scene_arthur_circus_alone); + } + } else if(ctr==5){ + if(Registry.cur_dialogue==""){ + ctr++; + play("walk_d"); + } + } else if(ctr==6){ // Move off + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "y", ARTHUR_INIT_PT.y + 32, 1)){ + play("walk_l"); + if(parabola_thing.tick()){ + my_shadow.visible=false; + if(EventScripts.send_property_to(this, "x", ARTHUR_INIT_PT.x - 40, 1)){ + sub_ctr++; + } + } else { + if(!my_shadow.visible){ + my_shadow.visible=true; + my_shadow.play("get_small"); + } + my_shadow.x=x + 4;my_shadow.y=y + 4; + } + + } + if(sub_ctr==1){ + exists=false; + xml.@alive="false"; + ctr++; + } + } + } + + private function javiera_logic():Void { + if(parent.state==parent.S_TRANSITION)return; + + + if(state==s_really_dead){ + super.update(); + return; + } + + if(ctr==0){ + DH.start_dialogue(DH.name_javiera, DH.scene_javiera_circus_alone); + ctr++; + } else if(ctr==1){ + if(Registry.cur_dialogue==""){ + ctr++; + loadGraphic(javiera_sprite, true, false, 16, 16); + } + } else if(ctr==2){ + if(Registry.GRID_ENEMIES_DEAD==2){ + play("walk_d"); + JAVIERA_timer +=FlxG.elapsed; + if(JAVIERA_timer>JAVIERA_timer_max){ + ctr++; + DH.start_dialogue(DH.name_javiera, DH.scene_javiera_circus_alone); + } + } + } else if(ctr==3){ + if(Registry.cur_dialogue==""){ + ctr++; + } + } else if(ctr==4){ + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "y", JAVIERA_INIT_PT.y, 1)){ + play("walk_l"); + if(EventScripts.send_property_to(this, "x", JAVIERA_INIT_PT.x - 66, 1)){ + sub_ctr++; + } + } + if(sub_ctr==1){ + exists=false; + xml.@alive="false"; + ctr++; + Registry.GRID_PUZZLES_DONE++; + + } + } + } + + + private function both_logic():Void { + if(!added_to_parent){ + added_to_parent=true; + if(javiera !=null)parent.sortables.add(javiera); + if(arthur !=null)parent.sortables.add(arthur); + parent.sortables.add(shockwaves); + parent.sortables.add(my_shadow); + } + + if(state==s_walk){ + walk_state(); + } else if(state==s_jump){ + jump_state(); + } else if(state==s_throw){ + throw_state(); + } else if(state==s_intro){ + intro_state(); + } else if(state==s_dying){ + dying_logic(); + } else if(state==s_dead){ + dead_logic(); + } + + if(state !=s_dying && state !=s_dead && t_hurt<0){ + hurt_logic(); + } else { + t_hurt -=FlxG.elapsed; + } + + + if(player.overlaps(this)&& visible && state !=s_dying){ + player.touchDamage(1); + } + + } + + /* Stand, talk, walk Into eachother, flash, load a+j sprite, go to walk. */ + private function Intro_state():Void { + if(skip_intro){ + ctr=3; + } + + switch(ctr){ + // Talk. + case 0: + + if(player.y>tl.y + 7 * 16 - 5)return; + + if(!DH.scene_is_dirty(DH.name_circus_folks, DH.scene_circus_folks_before_fight)){ + DH.start_dialogue(DH.name_circus_folks, DH.scene_circus_folks_before_fight); + player.be_idle(); + } + Registry.volume_scale -=0.01; + if(Registry.volume_scale<0.05){ + + if(DH.scene_is_finished(DH.name_circus_folks, DH.scene_circus_folks_before_fight)){ + ctr++; + } + } + break; + // Walk. + case 1: + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + arthur.play("walk_r"); + javiera.play("walk_l"); + javiera.scale.x=-1; + arthur.velocity.x=20; + javiera.velocity.x=-20; + ctr++; + break; + // Stop when touching. + case 2: + if(arthur.x>tl.x + 64){ + arthur.velocity.x=javiera.velocity.x=0; + ctr++; + } + break; + // Load joint sprite. + case 3: + javiera.exists=arthur.exists=false; + facing=LEFT; + play("walk_l"); + visible=true; + if(test_throw){ + state=s_throw; + } else { + state=s_walk; + } + velocity.x=-walk_vel; + x=tl.x + 56; + y=tl.y; + ctr=0; + break; + } + } + /* Walk ccw */ + private function walk_state():Void { + walk_about_perimeter(this,walk_vel); + + t_walk +=FlxG.elapsed; + if(t_walk>tm_walk){ + t_walk=0; + ctr=0; + if(Math.random()>0.6){ + state=s_jump; + } else { + state=s_throw; + } + } + } + + private function jump_state():Void { + // Set target coords. for jump, switch facing for animation, reset parabola and shadow. + if(ctr==0){ + tx=(player.x>tl.x + 60)? tl.x:tl.x + 112; + ty=(player.y>tl.y + 60)? tl.y:tl.y + 112; + if(tx==tl.x && ty==tl.y){ + facing=DOWN; + } else if(tx==tl.x + 112 && ty==tl.y){ + facing=LEFT; + } else if(tx==tl.x + 112 && ty==tl.y + 112){ + facing=UP; + } else { + facing=RIGHT; + } + + var d:Float=EventScripts.distance(this, new Point(tx, ty)); + parabola_thing.period=d / jump_vel; + parabola_thing.reset_time(); + EventScripts.scale_vector(this, new Point(tx, ty), velocity, jump_vel); + + my_shadow.play("get_small", true); + my_shadow.visible=true; + my_shadow.x=x + 4; + my_shadow.y=y + 8; + parabola_thing.set_shadow_fall_animation("get_big"); + play_sfx("jump_up"); + ctr++; + // Move and then generate shockwaves. + } else if(ctr==1){ + my_shadow.x=x; + my_shadow.y=y; + if(parabola_thing.tick()){ + play_sfx("jump_down"); + Registry.sound_data.wb_tap_ground.play(); + my_shadow.visible=false; + velocity.x=velocity.y=0; + offset.y=16; + x=tx; + y=ty; + + // Cap the max shockwaves generated from this attack. + if(shockwaves.countExisting()>5){ + ctr++; + return; + } + + var sw1:FlxSprite=shockwaves.getFirstAvailable()as FlxSprite; + if(sw1==null){ + ctr++; + return; + } + sw1.exists=true; + var sw2:FlxSprite=shockwaves.getFirstAvailable()as FlxSprite; + if(sw2==null){ + ctr++; + return; + } + sw2.exists=true; + + sw2.x=sw1.x=x; + sw1.y=sw2.y=y; + + + switch(facing){ + case UP: + sw1.velocity.x=-sw_vel; + sw2.velocity.y=-sw_vel; + break; + case DOWN: + sw1.velocity.x=sw_vel; + sw2.velocity.y=sw_vel; + break; + case RIGHT: + sw1.velocity.x=sw_vel; + sw2.velocity.y=-sw_vel; + break; + case LEFT: + sw1.velocity.x=-sw_vel; + sw2.velocity.y=sw_vel; + break; + } + + ctr++; + + } + // Wait a bit and then walk. + } else if(ctr==2){ + t_jump +=FlxG.elapsed; + if(t_jump>tm_jump){ + t_jump=0; + ctr=0; + state=s_walk; + if(xtl.x +105){ + facing=UP; + play("walk_u"); + } else if(y>tl.y +106){ + facing=RIGHT; + play("walk_r"); + } else { + facing=LEFT; + play("walk_l"); + } + } + } + } + + private function throw_state():Void { + // Switch places + if(ctr==0){ + velocity.x=velocity.y=0; + play("switch"); + ctr++; + // Wait for switch to be done. + } else if(ctr==1){ + if(_curAnim.frames.length - 1==_curFrame){ + FlxG.flash(0xffffffff, 0.2); + + ctr++; + } + // Face the player and throw. + } else if(ctr==2){ + var e2e:Int=EventScripts.get_entity_to_entity_dir(x, y, player.x, player.y); + arthur.facing=e2e; + switch(e2e){ + case UP: + play("throw_u"); + break; + case DOWN: + play("throw_d"); + break + case RIGHT: + play("throw_r"); + break; + case LEFT: + play("throw_l"); + break; + } + ctr++; + // Wait for throw anim to finish, then separate a+j Into separate sprites. + // Move arthur at the player. + } else if(ctr==3){ + if(_curAnim.frames.length - 1==_curFrame){ + EventScripts.scale_vector(this, player, arthur.velocity, throw_vel); + visible=false; + arthur.exists=javiera.exists=true; + arthur.play("roll"); + javiera.x=x;javiera.y=y; + arthur.x=x;arthur.y=y - 16; + ctr++; + Registry.sound_data.slasher_atk.play(); + } + // If arthur touches a wall that he didn't come from, + // spawn 2 shockwaves, stop arthur, and play arthur's stun animation. + } else if(ctr==4){ + + if(arthur.xtl.x + 112 && arthur.velocity.x>0){ + arthur.x=tl.x + 112;arthur.velocity.x=arthur.velocity.y=0;arthur.facing=NONE; + } else if(arthur.y>tl.y + 112 && arthur.velocity.y>0){ + arthur.y=tl.y + 112;arthur.velocity.x=arthur.velocity.y=0;arthur.facing=NONE; + } else if(arthur.ytl.x + 112){ + arthur.x=tl.x + 112; + } else if(arthur.y>tl.y + 112){ + arthur.y=tl.y + 112; + } else if(arthur.ytl.x +105){ + facing=UP; + play("walk_u"); + } else if(y>tl.y +106){ + facing=RIGHT; + play("walk_r"); + } else { + facing=LEFT; + play("walk_l"); + } + state=s_walk; + ctr=0; + + } + + } + + + private function dying_logic():Void { + + if(ctr==0){ + Registry.volume_scale=0; + Registry.sound_data.stop_current_song(); + velocity.x=velocity.y=0; + play("dying"); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.shake(0.04, 1.0); + player.be_idle(); + + DH.start_dialogue(DH.name_circus_folks, DH.scene_circus_folks_after_fight); + ctr++; + } else if(ctr==1){ + if(DH.scene_is_finished(DH.name_circus_folks,DH.scene_circus_folks_after_fight)&& _curAnim.frames.length - 1==_curFrame){ + ctr++; + visible=false; + javiera.exists=arthur.exists=true; + arthur.x=x;arthur.y=y; + javiera.x=x;javiera.y=y - 16; + + arthur.parabola_thing=new Parabola_Thing(arthur, 24, 1.0, "offset", "y"); + javiera.parabola_thing=new Parabola_Thing(javiera, 18, 0.8, "offset", "y"); + arthur.frame=1; + javiera.frame=1; + tm_jump=2; + t_jump=0; + + } + } else if(ctr==2){ + // do something? + var n:Float=Math.sin(t_jump * 6.28); + arthur.offset.x=-3 * n; + javiera.offset.x=3 * n; + t_jump +=FlxG.elapsed; + if(t_jump>tm_jump){ + t_jump=0; + Registry.sound_data.floor_crack.play(); + ctr++; + EventScripts.scale_vector(arthur, new Point(tl.x + 64, tl.y + 40), arthur.velocity, 40); + EventScripts.scale_vector(javiera, new Point(tl.x + 36, tl.y + 50), javiera.velocity, 70); + } + + } else if(ctr==3){ + if(arthur.parabola_thing.tick()){ + arthur.velocity.x=arthur.velocity.y=0; + arthur.alpha -=0.005; + if(arthur._curAnim==null || arthur._curAnim.name !="fall"){ + arthur.play("fall"); + } + } + if(javiera.parabola_thing.tick()){ + javiera.velocity.x=javiera.velocity.y=0; + javiera.alpha -=0.005; + if(javiera._curAnim==null || javiera._curAnim.name !="fall"){ + javiera.play("fall"); + } + } + if(javiera.alpha==0 && arthur.alpha==0){ + ctr++; + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff0000, 1); + } + } else if(ctr==4){ + t_jump +=FlxG.elapsed; + if(t_jump>1.3){ + ctr++; + } + } else { + state=s_dead; + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("CIRCUS"); + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]=true; + xml.@alive="false"; + javiera.exists=arthur.exists=false; + } + + + } + + private function dead_logic():Void { + exists=false; + } + + private function hurt_logic():Void { + if(offset.y<18){ + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + t_hurt=tm_hurt; + play_sfx(HURT_SOUND_NAME); + health--; + if(health<0 && state==s_throw){ + health=0; + } + flicker(1); + } + } + + /* Only go to dying when in the joint state */ + if(health<=0 && visible){ + ctr=0; + health=-1; + state=s_dying; + } + + } + private function on_anim_change(name:String, _frame:Int, _index:Int):Void { + if(name=="walk_l" || name=="throw_l"){ + scale.x=-1; + } else { + scale.x=1; + } + + } + + // A shockwave travels around the perimeter until it hits another shockwave, or the player. + private function shockwave_logic():Void { + + if(state==s_dying || state==s_dead){ + for(var shockwave:FlxSprite in shockwaves.members){ + if(shockwave._curAnim.name !="evaporate"){ + shockwave.play("evaporate"); + shockwave.velocity.x=shockwave.velocity.y=0; + } else { + shockwave.alpha -=0.1; + } + } + return; + } + for(var sw:FlxSprite in shockwaves.members){ + if(sw==null || !sw.exists)continue; + if(!sw.alive){ + if(sw._curAnim.frames.length - 1==sw._curFrame){ + sw.exists=false; + sw.alive=true; + sw.play("move"); + } + continue; + } + if(sw.x>tl.x + 114){ + + sw.x=tl.x + 112; + sw.velocity.x=0; + sw.velocity.y=(sw.y>tl.y + 60)? -sw_vel:sw_vel; + } else if(sw.xtl.y + 60)? -sw_vel:sw_vel; + } else if(sw.y>tl.y + 114){ + sw.y=tl.y + 112; + sw.velocity.y=0; + sw.velocity.x=(sw.x>tl.x + 60)? -sw_vel:sw_vel; + } else if(sw.ytl.x + 60)? -sw_vel:sw_vel; + } + if(player.state !=player.S_AIR && sw.overlaps(player)){ + player.touchDamage(1); + sw.alive=false; + sw.play("evaporate"); + sw.velocity.x=sw.velocity.y=0; + + } + if(player.broom.visible && player.broom.overlaps(sw)){ + sw.alive=false; + sw.play("evaporate"); + sw.velocity.x=sw.velocity.y=0; + } + } + } + + private function load_javiera(javiera_ref:FlxSprite):Void + { + javiera_ref.loadGraphic(javiera_sprite, true, false, 16, 16); + javiera_ref.addAnimation("walk_d", [0, 1], 8); + javiera_ref.addAnimation("walk_l", [4, 5], 8); + javiera_ref.addAnimation("walk_u", [2, 3], 8); + javiera_ref.addAnimation("walk_r", [4, 5], 8); + javiera_ref.addAnimation("juggle", [0, 1], 8); + javiera_ref.addAnimation("fall", [6, 7, 8, 9, 10, 11, 12], 2, false);// Should end on an empty frame + javiera_ref.play("juggle"); + } + + private function load_arthur(arthur_ref:FlxSprite):Void + { + arthur_ref.loadGraphic(arthur_sprite, true, false, 16, 16); + arthur_ref.addAnimation("walk_d", [0, 1], 8); + arthur_ref.addAnimation("walk_l", [4, 5], 8); + arthur_ref.addAnimation("walk_u", [2, 3], 8); + arthur_ref.addAnimation("walk_r", [4, 5], 8); + arthur_ref.addAnimation("roll", [6], 6);// For flying through the air + arthur_ref.addAnimation("stunned", [8, 9], 6); + arthur_ref.addAnimation("wobble", [16,17], 8); + arthur_ref.addAnimation("fall_1", [10], 8); + arthur_ref.addAnimation("fall", [10, 11, 12, 13, 14, 15, 6], 2, false);// Should end on an empty frame + arthur_ref.parabola_thing=new Parabola_Thing(this, 32, 1, "offset", "y"); + arthur_ref.parabola_thing.set_shadow_fall_animation("get_big"); + arthur_ref.my_shadow=EventScripts.make_shadow("8_small"); + arthur_ref.play("wobble"); + } + + private function walk_about_perimeter(s:FlxSprite,speed:Int):Void + { + s.scale.x=1; + if(s.facing & LEFT){ + s.scale.x=-1; + s.velocity.x=-speed; + if(s.xtl.x + 112){ + s.x=tl.x + 112; + s.velocity.x=0; + s.velocity.y=-speed; + s.play("walk_u"); + s.facing=UP; + } + } else if(s.facing & UP){ + s.velocity.y=-speed; + if(s.ytl.y + 112){ + s.y=tl.y + 112; + s.velocity.y=0; + s.velocity.x=speed; + s.play("walk_r"); + s.facing=RIGHT; + } + } + } + + override public function destroy():Void + { + ARTHUR_INIT_PT=JAVIERA_INIT_PT=null; + tl=null; + if(light !=null){ + parent.sortables.remove(light, true); + } + if(TYPE==T_BOTH){ + parent.sortables.remove(arthur, true); + parent.sortables.remove(javiera, true); + parent.sortables.remove(shockwaves, true); + parent.sortables.remove(my_shadow, true); + arthur.destroy();javiera.destroy();shockwaves.destroy(); + arthur=javiera=null; + shockwaves=null; + } + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/circus/Contort.hx b/AIR/intra/hsrc/entity/enemy/circus/Contort.hx new file mode 100644 index 0000000..bf0f001 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/circus/Contort.hx @@ -0,0 +1,295 @@ +package entity.enemy.circus +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +/** + * Mechanically the same as a shieldy at first, + * but hitting it once splits it Into + * two balls that bounce about the room. and blood. eeew + */ +class Contort extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + //[Embed(source="../../../res/sprites/enemies/circus/contort_small.png")] public static var contort_small_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/contort_big.png")] public static var contort_big_sprite:Class; + + private var BIG_HEALTH:Int=3; + private var t_big_hit:Float=0; + private var tm_big_hit:Float=1.5; + private var just_hurt:Bool=false; + private var big_death_timeout:Float=1.0; + + private var t_small_roll:Float=0; + private var tm_small_roll:Float=0.8; + + private var state:Int=0; + private var s_big_roll:Int=0; + private var s_big_dying:Int=1; + private var s_big_dead:Int=2; + private var big_is_h_flipped:Bool=false; + private var big_is_v_flipped:Bool=false; + + private var VEL:Int=35; + + public var small_sprites:FlxGroup=new FlxGroup(3); + + private var added_to_parent:Bool=false; + private var collide_ctr:Int=0; + private var tl:Point=new Point(0, 0); + + private var did_normal:Bool=false; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Add anims for the big sprite */ + loadGraphic(contort_big_sprite, true, false, 16, 32); + height=12; + width=12; + offset.x=2; + offset.y=20; + addAnimation("move", [0, 1, 2, 1], 9); + play("move"); + health=BIG_HEALTH; + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + + for(i in 0...small_sprites.maxSize){ + var ss:FlxSprite=new FlxSprite(); + ss.loadGraphic(contort_small_sprite, true, false, 16, 16); + //yellow purple blue + switch(i){ + case 0: + ss.addAnimation("move", [0,1], 9, true);//b + break; + case 1: + ss.addAnimation("move", [4,5], 9, true);//p + break; + case 2://y + ss.addAnimation("move", [2,3], 9, true);//y + break; + } + ss.visible=false; + ss.play("move"); + ss.offset.y=12 * i; + + ss.my_shadow=EventScripts.make_shadow("8_small", true); + ss.parabola_thing=new Parabola_Thing(ss, 16 + 8 * i, 1.2, "offset", "y"); + ss.parabola_thing.set_shadow_fall_animation("get_big"); + + small_sprites.add(ss); + parent.bg_sprites.add(ss.my_shadow); + } + + if(xml.@alive=="false"){ + exists=false; + } + + + } + + override public function preUpdate():Void + { + if(collide_ctr==3){ + collide_ctr=0; + FlxG.collide(parent.curMapBuf, this); + } else { + collide_ctr++; + } + super.preUpdate(); + } + override public function update():Void + { + if(!added_to_parent){ + if(parent.state==parent.S_NORMAL){ + added_to_parent=true; + parent.sortables.add(small_sprites); + + velocity.x=Math.random()>0.5 ? VEL:-VEL; + velocity.y=Math.random()>0.5 ? VEL:-VEL; + } + + return; + } + + big_logic(); + + super.update(); + } + + private function big_logic():Void + { + + if(did_normal && parent.state==parent.S_TRANSITION){ + velocity.x=velocity.y=0; + small_sprites.setAll("velocity", new FlxPoint(0, 0)); + //EventScripts.prevent_leaving_map(parent, this); + } else { + did_normal=true; + } + + if(state==s_big_roll){ + + + if(xtl.x + 160){ + touching=RIGHT; + } else if(ytl.y + 160){ + touching=DOWN; + } + + //Bounce + if(touching !=NONE){ + if(touching & RIGHT){ + velocity.x=-VEL; + } else if(touching & LEFT){ + velocity.x=VEL; + } + + if(touching & UP){ + velocity.y=VEL; + } else if(touching & DOWN){ + velocity.y=-VEL; + } + + velocity.x=velocity.x - 10 + 20 * Math.random(); + velocity.y=velocity.y - 10 + 20 * Math.random(); + } + + //Hit player + if(!player.invincible && player.overlaps(this)){ + player.touchDamage(1); + } + + //Damage logic + if(!just_hurt && player.broom.visible && player.broom.overlaps(this)){ + health--; + t_big_hit=0; + flicker(tm_big_hit); + just_hurt=true; + + } else { + if(just_hurt){ + t_big_hit +=FlxG.elapsed; + if(t_big_hit>tm_big_hit){ + just_hurt=false; + } + } + } + + + if(health==0){ + play("release_smalls"); + state=s_big_dying; + velocity.x=velocity.y=0; + } + } else if(state==s_big_dying){ + big_death_timeout -=FlxG.elapsed; + if(big_death_timeout<0){ + solid=visible=false; + state=s_big_dead; + + EventScripts.make_explosion_and_sound(this); + /* Init small sprites */ + small_sprites.setAll("visible", true); + small_sprites.setAll("x", x+2); + small_sprites.setAll("y", y + 2); + for(var ss:FlxSprite in small_sprites.members){ + ss.my_shadow.x=ss.x + 4; + ss.my_shadow.y=ss.y + 6; + ss.velocity.x=Math.random()>0.5 ? VEL:-VEL; + ss.velocity.y=Math.random()>0.5 ? VEL:-VEL; + ss.velocity.x=ss.velocity.x - 5 + 10 * Math.random(); + ss.velocity.y=ss.velocity.y - 5 + 10 * Math.random(); + ss.health=1; + ss.flicker(1); + ss.my_shadow.play("get_small"); + } + } + } else if(state==s_big_dead){ + var sub_ctr:Int=0; + for(var _ss:FlxSprite in small_sprites.members){ + if(_ss.parabola_thing.tick()){ + _ss.my_shadow.visible=false; + } + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, _ss); + } + _ss.my_shadow.x=_ss.x + 4; + _ss.my_shadow.y=_ss.y + 6; + FlxG.collide(parent.curMapBuf, _ss); + + if(t_small_roll>tm_small_roll){ + _ss.velocity.x=Math.random()>0.5 ? VEL:-VEL; + _ss.velocity.y=Math.random()>0.5 ? VEL:-VEL; + + _ss.velocity.x=_ss.velocity.x - 5 + 10 * Math.random(); + _ss.velocity.y=_ss.velocity.y - 5 + 10 * Math.random(); + } + + + if(xtl.x + 160){ + velocity.x *=-1; + } else if(ytl.y + 160){ + velocity.y *=-1; + } + + if(_ss.health>0){ + if(!player.invincible && player.overlaps(_ss)){ + player.touchDamage(1); + } + if(!flickering && player.broom.visible && player.broom.overlaps(_ss)){ + _ss.health --; + _ss.my_shadow.exists=false; + EventScripts.drop_small_health(_ss.x, _ss.y, 0.4); + EventScripts.make_explosion_and_sound(_ss); + } + } else { + _ss.alpha -=0.07; + if(_ss.alpha==0){ + sub_ctr++; + } + } + } + + if(t_small_roll>tm_small_roll){ + t_small_roll=0; + } + t_small_roll +=FlxG.elapsed; + + if(sub_ctr==3){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + // Keep track of the small guys + } + } + + + override public function destroy():Void + { + parent.sortables.remove(small_sprites, true); + small_sprites=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/circus/Fire_Pillar.hx b/AIR/intra/hsrc/entity/enemy/circus/Fire_Pillar.hx new file mode 100644 index 0000000..a9a5717 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/circus/Fire_Pillar.hx @@ -0,0 +1,125 @@ +package entity.enemy.circus +{ +import entity.enemy.crowd.Spike_Roller; +import entity.gadget.Dust; +import entity.player.Player; +import flash.display.InterpolationMethod; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Fire_Pillar extends FlxSprite { + //[Embed(source="../../../res/sprites/enemies/circus/fire_pillar.png")] public static var fire_pillar_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/fire_pillar_base.png")] public static var fire_pillar_base_sprite:Class; + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var added_to_parent:Bool=false; + + public var hitbox:FlxSprite=new FlxSprite; + public var base:FlxSprite=new FlxSprite; + + private var t:Float=0; + private var tm_idle:Float=0.74; + private var tm_emerge:Float=0.3; + private var tm_flame:Float=1.0; + private var tm_recede:Float=0.3; + + private var ctr:Int=0; + + public function new(_xml:XML, _player:Player, _parent:Dynamic){ + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(fire_pillar_sprite, true, false, 16, 32); + + hitbox.makeGraphic(16, 9, 0x00112332); + base.loadGraphic(fire_pillar_base_sprite, true, false, 16, 16); + base.addAnimation("dormant", [0, 1], 6); + base.play("dormant"); + + addAnimation("idle", [0], 15); + addAnimation("emerge", [1, 2, 3, 4], 8, false); + addAnimation("flame", [3, 4], 10); + addAnimation("recede", [5, 6, 0], 8, false); + play("idle"); + + add_sfx("shoot", Registry.sound_data.flame_pillar_group); + + + } + + override public function update():Void + { + if(!added_to_parent){ + added_to_parent=true; + height=23; + base.x=hitbox.x=x + base.y=hitbox.y=y + 16; + + parent.bg_sprites.members.splice(0, 0, base); + parent.bg_sprites.length++; + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + if(dust.visible && dust.overlaps(hitbox)){ + ctr=0; + play("idle"); + } + } + + for(var spike_roller:Spike_Roller in Registry.subgroup_spike_rollers){ + if(spike_roller==null)continue; + if(spike_roller.visible && spike_roller.overlaps(hitbox)){ + ctr=0; + play("idle"); + } + } + + if(ctr==0){ + t +=FlxG.elapsed; + if(t>tm_idle){ + t=0; + ctr++; + play("emerge"); + flicker(.25); + } + } else if(ctr==1){ + t +=FlxG.elapsed; + if(t>tm_emerge){ + t=0; + ctr++; + play_sfx("shoot"); + play("flame"); + } + } else if(ctr==2){ + t +=FlxG.elapsed; + if(t>tm_flame){ + t=0; + ctr++; + play("recede"); + flicker(.25) + } + if(player.overlaps(hitbox)){ + player.touchDamage(1); + } + } else if(ctr==3){ + t +=FlxG.elapsed; + if(t>tm_recede){ + t=0; + ctr=0; + play("idle"); + } + } + + + super.update(); + } + + override public function destroy():Void + { + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/circus/Lion.hx b/AIR/intra/hsrc/entity/enemy/circus/Lion.hx new file mode 100644 index 0000000..4cf4242 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/circus/Lion.hx @@ -0,0 +1,541 @@ +package entity.enemy.circus +{ +import data.Common_Sprites; +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +class Lion extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/circus/lion.png")] public static var lion_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/lion_fireballs.png")] public static var lion_fireball_sprite:Class; + + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var max_health:Int=4; + private var is_hurt:Bool=false; + + private var hori_hitbox:FlxSprite=new FlxSprite; + private var H_OFF_X:Int=3; + private var H_OFF_Y:Int=11; + private var vert_hitbox:FlxSprite=new FlxSprite; + private var V_OFF_X:Int=10; + private var V_OFF_Y:Int=4; + private var hitbox:FlxSprite; + + private var state:Int=0; + private var state_pace:Int=0; + private var t_pace:Float=0; + private var tm_pace:Float=0.8; + private var vel_pace:Float=43; + private var ctr_pace:Int=0; + + private var state_shoot:Int=1; + private var fireballs:FlxGroup=new FlxGroup(10); + private var vel_fireball:Int=88; + private var max_fireball_x_distance:Int=80; + private var ctr_shoot:Int=0; + private var t_shoot:Float=0; + private var tm_shoot:Float=0.165; + private var tm_shoot_warning:Float=0.8; + private var ctr_shots:Int=0; + private var max_shots:Int=18; + + private var state_charge:Int=2; + private var ctr_charge:Int=0; + private var vel_charge:Int=110; + private var t_charge:Float=0; + private var h_shadow:FlxSprite=new FlxSprite; + private var v_shadow:FlxSprite=new FlxSprite; + + + private var state_dying:Int=3; + + private var did_init:Bool=false; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + health=max_health; + solid=false; + + loadGraphic(lion_sprite, true, false, 32, 32); + addAnimation("walk_l", [0, 1], 5); + addAnimation("walk_r", [0, 1], 5); + addAnimation("walk_d", [10,11], 5); + addAnimation("walk_u", [5,6], 5); + + addAnimation("warn_l", [3], 5, true); + addAnimation("warn_r", [3], 5, true); + + addAnimation("shoot_l", [2], 15, true); + addAnimation("shoot_r", [2], 15, true); + addAnimation("shoot_d", [12], 15, true); + addAnimation("shoot_u", [7], 15, true); + + addAnimation("pounce_r", [4]); + addAnimation("pounce_l", [4]); + addAnimation("pounce_u", [9]); + addAnimation("pounce_d", [14]); + + play("walk_r"); + addAnimationCallback(on_anim_change); + + + add_sfx("shoot", Registry.sound_data.fireball_group); + + /* Make shadows */ + h_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + v_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + v_shadow.visible=h_shadow.visible=false; + h_shadow.frame=v_shadow.frame=4; + h_shadow.offset.x=-2;h_shadow.offset.y=-24; + v_shadow.offset.y=-12; + v_shadow.scale.x=0.5;v_shadow.scale.y=2;// Remove when you add teha ctual shadows + + parabola_thing=new Parabola_Thing(this, 12, 1.0, "offset", "y"); + + hori_hitbox.makeGraphic(26, 13, 0x00ff0000); + vert_hitbox.makeGraphic(10, 20, 0x0000ff00); + hitbox=hori_hitbox; + hitbox.velocity.x=vel_pace; + + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + + fireball.loadGraphic(lion_fireball_sprite, true, false, 16, 16); + fireball.width=fireball.height=8; + fireball.centerOffsets(true); + + fireball.addAnimation("shoot", [0, 1], 10); + fireball.addAnimation("poof", [2,3,4,5], 10,false); + fireball.play("shoot"); + fireball.alive=fireball.exists=false; + fireballs.add(fireball); + } + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + state=state_pace; + } + + override public function update():Void + { + if(parent.state==parent.S_TRANSITION){ + hitbox.velocity.x=hitbox.velocity.y=0; + return; + } + if(!did_init){ + did_init=true; + center_hitboxes(); + parent.fg_sprites.add(vert_hitbox); + parent.fg_sprites.add(hori_hitbox); + parent.fg_sprites.add(fireballs); + parent.bg_sprites.add(v_shadow); + parent.bg_sprites.add(h_shadow); + } + + //Graphic pinned to hitbox(hitbox moves) + if(hitbox==vert_hitbox){ + x=hitbox.x - V_OFF_X; + y=hitbox.y - V_OFF_Y; + } else if(hitbox==hori_hitbox){ + x=hitbox.x - H_OFF_X; + y=hitbox.y - H_OFF_Y; + } + + //Stop moving if touchign solid tile + FlxG.collide(hitbox, parent.curMapBuf); + + if(hitbox.touching !=NONE){ + hitbox.velocity.x=hitbox.velocity.y=0; + } + + //hurt player + if(!player.invincible && player.overlaps(hitbox)){ + player.touchDamage(1); + } + + // Get hurt + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + flicker(1); + is_hurt=true; + play_sfx(HURT_SOUND_NAME); + health--; + if(health<=0){ + state=state_dying; + } + } else { + is_hurt=false; + } + + if(state==state_pace){ + pace_state(); + } else if(state==state_shoot){ + shoot_state(); + } else if(state==state_charge){ + charge_state(); + } else if(state==state_dying){ + alpha -=0.05; + if(alpha==0){ + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + exists=false; + v_shadow.exists=h_shadow.exists=false; + } + } + + super.update(); + } + + public function on_anim_change(name:String, frame_nr:Int, frame_index:Int):Void { + if(name=="walk_l" || name=="shoot_l" || name=="warn_l" || name=="pounce_l"){ + facing=LEFT; + scale.x=-1; + } else { + scale.x=1; + if(name=="walk_r" || name=="shoot_r"){ + facing=RIGHT; + } else if(name=="walk_u" || name=="shoot_u"){ + facing=UP; + } else if(name=="walk_d" || name=="shoot_d"){ + facing=DOWN; + } + } + } + + private function center_hitboxes():Void + { + hori_hitbox.x=x + H_OFF_X; + hori_hitbox.y=y + H_OFF_Y; + vert_hitbox.x=x + V_OFF_X; + vert_hitbox.y=y + V_OFF_Y; + } + + private function pace_state():Void + { + t_pace +=FlxG.elapsed; + if(t_pace>tm_pace){ + t_pace=0; + ctr_pace=Std.int(6 * Math.random()); + var r:Float=Math.random(); + if(r<0.25){ + state=state_shoot; + if(player.x>x + 16){ + play("warn_r"); + } else { + play("warn_l"); + } + + return; + } else if(r<0.55){ + state=state_charge; + return; + } + switch(ctr_pace){ + case 0: + hitbox=hori_hitbox; + hitbox.velocity.x=vel_pace; + hitbox.velocity.y=0; + center_hitboxes(); + play("walk_r"); + break; + case 1: + hitbox=vert_hitbox; + hitbox.velocity.x=0; + hitbox.velocity.y=vel_pace; + play("walk_d"); + center_hitboxes(); + break; + case 2: + hitbox=hori_hitbox; + hitbox.velocity.y=0; + hitbox.velocity.x=-vel_pace; + play("walk_l"); + center_hitboxes(); + break; + case 3: + hitbox=vert_hitbox; + hitbox.velocity.x=0; + hitbox.velocity.y=-vel_pace; + play("walk_u"); + center_hitboxes(); + break; + default: + //hitbox.velocity.x=hitbox.velocity.y=0; + break; + } + } + } + + private function shoot_state():Void + { + hitbox.velocity.x=hitbox.velocity.y=0; + + var fireball:FlxSprite; + + if(ctr_shoot==0){ + t_shoot +=FlxG.elapsed; + if(t_shoot<=tm_shoot_warning){ + return; + } else { + t_shoot=0; + ctr_shoot++; + } + } + + + // Periodically shoot a fireball + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot){ + t_shoot=0; + if(ctr_shots0){ + fireball=fireballs.getFirstDead()as FlxSprite; + if(fireball !=null){ + ctr_shots++; + play_sfx("shoot"); + face_player(); + switch(facing){ + case UP: + fireball.x=x + width / 2; + fireball.y=y - 2; + EventScripts.scale_vector(getMidpoint(), new Point(x + 32*Math.random(), y - 32), fireball.velocity, vel_fireball); + break; + case DOWN: + fireball.x=x + width / 2; + fireball.y=y + height + 2; + EventScripts.scale_vector(getMidpoint(), new Point(x + 32*Math.random(), y + 32), fireball.velocity, vel_fireball); + break; + case RIGHT: + fireball.x=x + width; + fireball.y=y + 6; + EventScripts.scale_vector(new Point(x + width, y + 6), new Point(x + 80, y - 26 + 52*Math.random()), fireball.velocity, vel_fireball); + break; + case LEFT: + fireball.x=x; + fireball.y=y + 6; + EventScripts.scale_vector(new Point(x, y + 6), new Point(x - 30, y - 26 + 52*Math.random()), fireball.velocity, vel_fireball); + break; + } + fireball.exists=fireball.alive=true; + fireball.finished=false; + fireball.play("shoot"); + } + } else { + ctr_shots=0; + state=state_pace; + } + } + // Fireballs hit player and map + for(fireball in fireballs.members){ + + if(fireball._curAnim !=null && fireball._curAnim.name !="poof"){ + for(var dust:Dust in Registry.subgroup_dust){ + if(dust !=null){ + if(dust.visible && dust.overlaps(fireball)){ + fireball.play("poof");fireball.finished=false; + } + } + } + if(fireball.alive){ + if(!player.invincible && player.overlaps(fireball)){ + player.touchDamage(1); + fireball.play("poof");fireball.finished=false; + //fireball.alive=false; + } + if(player.broom.visible && player.broom.overlaps(fireball)){ + fireball.play("poof");fireball.finished=false; + //fireball.alive=false; + } + } + if(Math.abs(fireball.x - x)>max_fireball_x_distance){ + //fireball.alive=fireball.exists=false; + + fireball.play("poof");fireball.finished=false; + } else if(Math.abs(fireball.y - y)>max_fireball_x_distance){ + //fireball.alive=fireball.exists=false; + fireball.play("poof");fireball.finished=false; + + } + } + + if(fireball.finished && fireball._curAnim !=null && fireball._curAnim.name=="poof"){ + fireball.exists=fireball.alive=false; + fireball.play("shoot"); + } + } + + + // If hurt then go back to charge + if(is_hurt){ + ctr_shots=max_shots; + } + } + + private function charge_state():Void + { + if(ctr_charge==0){ // Walk away forom the player + hitbox=hori_hitbox; + center_hitboxes(); + hitbox.velocity.x=20; + hitbox.velocity.y=0; + if(player.x>x){ + hitbox.velocity.x *=-1; + play("walk_l"); + } else { + play("walk_r"); + } + ctr_charge++; + } else if(ctr_charge==1){ // Face the player + t_charge +=FlxG.elapsed; + if(t_charge>1.4){ + hitbox.velocity.x=hitbox.velocity.y=0; + if(_curAnim.name=="walk_r"){ + hitbox.velocity.x=-10; + play("warn_l"); + } else { + hitbox.velocity.x=10; + play("warn_r"); + } + t_charge=0; + ctr_charge++; + + } + } else if(ctr_charge==2){ //pause a little + t_charge +=FlxG.elapsed; + if(t_charge>0.6){ + t_charge=0; + ctr_charge++; + } + } else if(ctr_charge==3){ //dash to theplayer + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), hitbox.velocity, vel_charge); + ctr_charge++; + scale.x=1; + switch(EventScripts.get_entity_to_entity_dir(x, y, player.x, player.y)){ + case UP: + v_shadow.visible=true; + play("pounce_u"); + break; + case DOWN: + v_shadow.visible=true; + play("pounce_d"); + break; + case LEFT: + h_shadow.visible=true; + play("pounce_l"); + break; + case RIGHT: + h_shadow.visible=true; + play("pounce_r"); + break; + } + if(v_shadow.visible){ + v_shadow.x=x; + v_shadow.y=y; + } else { + h_shadow.x=x; + h_shadow.y=y; + } + + } else if(ctr_charge==4){ //Check the graphic against tilemap to avoid weird graphics steppingoutside the bounds + solid=true; + + if(v_shadow.visible){ + v_shadow.x=x; + v_shadow.y=y; + } else { + h_shadow.x=x; + h_shadow.y=y; + } + FlxG.collide(this, parent.curMapBuf); + if(parabola_thing.tick()||(touching !=NONE && offset.y>4)){ + offset.y=0; + parabola_thing.reset_time(); + h_shadow.visible=v_shadow.visible=false; + hitbox.velocity.x=hitbox.velocity.y=0; + ctr_charge=0; + if(_curAnim.name=="pounce_l"){ + play("walk_l"); + } else if(_curAnim.name=="pounce_r"){ + play("walk_r"); + } else if(_curAnim.name=="pounce_d"){ + play("walk_d"); + } else { + play("walk_u"); + + } + state=state_pace; + } + solid=false; + } + } + + /* Get dy/dx and the slope to figure out which way to face */ + private function face_player():Void { + var midpoint:FlxPoint=getMidpoint(); + var dy:Float=midpoint.y - player.midpoint.y; + var dx:Float=midpoint.x - player.midpoint.x; + var eps:Float=0.0001; + (Math.abs(dx)1){ + if(dy>0){ + if(state==state_shoot){ + play("shoot_u"); + } else { + play("walk_u") + } + } else { + if(state==state_shoot){ + play("shoot_d"); + } else { + play("walk_d"); + } + } + + } else { + if(dx>0){ + if(state==state_shoot){ + play("shoot_l"); + } else { + play("walk_l"); + } + } else { + if(state==state_shoot){ + play("shoot_r"); + } else { + play("walk_r"); + } + } + } + } + + override public function destroy():Void + { + fireballs=null; + h_shadow=null; + hori_hitbox=null; + hitbox=null; + v_shadow=null; + vert_hitbox=null; + + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/Dog.hx b/AIR/intra/hsrc/entity/enemy/crowd/Dog.hx new file mode 100644 index 0000000..4467acf --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/Dog.hx @@ -0,0 +1,275 @@ +package entity.enemy.crowd +{ +import entity.gadget.Gate; +import entity.gadget.Switch_Pillar; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import helper.EventScripts; +import org.flixel.FlxObject; +import org.flixel.FlxRect; +import org.flixel.FlxSprite; +import entity.player.Player; +import data.CLASS_ID; +import org.flixel.FlxTilemap; + +class Dog extends FlxSprite +{ + public var xml:XML; + public var cid:Int=CLASS_ID.DOG; + public var player:Player; + public var parent:Dynamic; + //dame props - alive(false or true), p(1) + //[Embed(source="../../../res/sprites/enemies/crowd/dog.png")] public static var dog_sprite:Class; + + + private var timer:Float=0; + + private var state:Int=0; + private var s_pace:Int=0; + private var pace_vel:Int=20; + private var pace_timer_max:Float=1.0; + + private var s_alert:Int=1; + private var alert_timer_max:Float=1.0; + private var s_attack:Int=2; + private var attack_pts:Array=new Array(new Point(), new Point(), new Point(), new Point(), new Point()); + private var vel_base_attack:Float=60; + private var attack_speeds:Array=new Array(1.1, 1.4, 1.4, 1.6, 1.7); + private var attack_timer_max:Float=1.0;//latency before dog "gives up" going to a pt + + private var s_attack_phase:Int=0; + private var s_dead:Int=3; + + private var Dead_Frame:Int=7; + + private var hit_timer_max:Float=1.5; + private var hit_timer:Float=0; + + private var active_region:FlxObject=new FlxObject(0, 0, 96, 96); + + private var type:Int=0; + private var T_NORMAL:Int=0; + private var T_SUPER:Int=1; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* DOG ANIMATIONS*/ + loadGraphic(dog_sprite, true, false, 16, 16); + width=height=12; + offset.y=offset.x=2; + drag.x=20; + + addAnimation("stop_d", [0]); + /* walk_l is walk_r reflected */ + addAnimation("walk_l", [2, 3], 4, true); + addAnimation("walk_r", [2, 3], 4, true); + addAnimation("alert", [4, 5], 5); + /* attack_l is attack_r reflected */ + addAnimation("attack_r", [6, 7],6,true); + addAnimation("attack_l", [6, 7 ],6,true); + addAnimation("die", [1, 2, 3, 4, 4, 3, 1, 3, 2, 1,7], 15, false); + + addAnimationCallback(set_scale); + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + + if(parseInt(xml.@type)==T_SUPER){ + type=T_SUPER; + health=3; + } else { + health=3; + type=T_NORMAL; + } + + add_sfx("bark", Registry.sound_data.dog_bark_group); + add_sfx("dash", Registry.sound_data.dog_dash); + } + override public function preUpdate():Void + { + FlxG.collide(parent.curMapBuf, this); + super.preUpdate(); + } + + override public function update():Void + { + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp !=null &&(sp.frame==sp.up_frame)){ + FlxG.collide(sp, this); + } + } + if(player.state !=player.S_AIR && player.overlaps(this)&&(xml.@alive !="false")){ + player.touchDamage(1); + } + + for(var g:Gate in Registry.subgroup_gates){ + if(g !=null){ + if(g.overlaps(this)){ + velocity.x=velocity.y=0; + } + } + } + + /* pin active region to self */ + active_region.x=x - 40; + active_region.y=y - 40; + if(hit_timer=hit_timer_max){ + if(player.broom.overlaps(this)&& player.broom.visible){ + hit_timer=0; + health--; + flicker(hit_timer_max); + play_sfx(HURT_SOUND_NAME); + } + } + } + /* pace and wait for player to get near */ + if(state==s_pace){ + timer +=FlxG.elapsed; + if(timer>pace_timer_max){ + if(FlxG.random()>0.33){ + play("walk_r"); + velocity.x=pace_vel; + } else { + if(FlxG.random()>0.5){ + play("walk_l"); + velocity.x=-pace_vel; + } else { + play("stop_d"); + velocity.x=0; + } + } + timer=0; + } + if(active_region.overlaps(player)){ + state=s_alert; + velocity.x=velocity.y=0; + play("alert"); + play_sfx("bark"); + timer=0; + } + /* set points for dash attack */ + } else if(state==s_alert){ + timer +=FlxG.elapsed; + if(timer>alert_timer_max){ + state=s_attack; + timer=0; + velocity.y=30; + /* Set up points for dog to dash to */ + attack_pts[0].x=player.x - 50 + 12 * Math.random();// LEFT + attack_pts[0].y=player.y - 8; + + attack_pts[1].x=player.x + 30 + 12 * Math.random(); + attack_pts[1].y=player.y - 8;// right + + attack_pts[2].x=player.x - 50 + 12*Math.random(); + attack_pts[2].y=player.y - 8;// DOWN + + EventScripts.scale_vector(new Point(x, y), attack_pts[0], velocity, vel_base_attack * attack_speeds[0]); + + + if(velocity.x>0){ + play("attack_r"); + } else { + play("attack_l"); + } + } + /* dash to points and then reset */ + } else if(state==s_attack){ + var p_done:Int=0; + + timer +=FlxG.elapsed; + if(timer>attack_timer_max){ + velocity.x=velocity.y=0; + timer=0; + p_done=2; + s_attack_phase++; + + } + /* When the dash timer runs out*/ + if(p_done==2){ + + /* If SUPER dog,dynamically determine dash points */ + if(s_attack_phase<=4 && type==T_SUPER){ + if(player.x>x){ + attack_pts[s_attack_phase].x=player.x + 25;// RIGHT + attack_pts[s_attack_phase].y=player.y + 8; + } else { + attack_pts[s_attack_phase].x=player.x - 28;// LEFT + attack_pts[s_attack_phase].y=player.y - 8; + } + } + /* change the velocity if the dog doesn't need to stop */ + if(s_attack_phase<5){ + EventScripts.scale_vector(new Point(x, y), attack_pts[s_attack_phase], velocity, vel_base_attack * attack_speeds[s_attack_phase]); + } + /* Set the correct attacking anim*/ + if(velocity.x>0){ + play("attack_r"); + } else { + play("attack_l"); + } + + /* State change */ + if(type==T_NORMAL && s_attack_phase>2){ + state=s_pace; + velocity.x=velocity.y=0; + play("walk_r"); + s_attack_phase=0; + } else if(s_attack_phase>4){ + state=s_pace; + s_attack_phase=0; + } else { + + play_sfx("dash"); + } + } + } else if(state==s_dead){ + // if(frame==Dead_Frame){ + xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 1.0); + EventScripts.make_explosion_and_sound(this); + //play die sound effect + exists=false;//:( + //} + } + super.update(); + } + + public function set_scale(name:String,frame_nr:Int,frame_idx:Int):Void { + if(name=="walk_l" || name=="stop_l"){ + scale.x=-1; + } else if(name=="attack_l"){ + scale.x=-1; + } else { + scale.x=1; + } + + + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/Frog.hx b/AIR/intra/hsrc/entity/enemy/crowd/Frog.hx new file mode 100644 index 0000000..ed66dfd --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/Frog.hx @@ -0,0 +1,309 @@ +package entity.enemy.crowd +{ +import data.Common_Sprites; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import entity.player.Player; +import data.CLASS_ID; +class Frog extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.FROG; + public var player:Player; + public var parent:Dynamic; + + //[Embed(source="../../../res/sprites/enemies/crowd/frog.png")] public static var frog_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/frog_bullet.png")] public var frog_bullet_sprite:Class; + + private var state:Int=0; + private var s_face_player:Int=0; + private var s_shoot:Int=1; + private var s_dying:Int=2; + private var s_dead:Int=3; + private var has_shot:Bool=false + private var did_shoot_anim:Bool=false + private var added_to_parent:Bool=false; + + public var y_bullets:FlxGroup=new FlxGroup(); + public var BULLET_EMPTY_FRAME:Int=3; + + private var dame_frame:Int; + private var hit_timer:Float=0; + private var hit_timer_max:Float=1.0; + + private var init_latency:Float=0.8; + + + //dame - p(1), alive , frame(attk type) + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Frog animations */ + loadGraphic(frog_sprite, true, false, 16, 16); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("idle_d", [6,7], 2, true); + addAnimation("shoot_d", [8], 3, false); + addAnimation("shoot_r", [8], 3, false);// DEFAULT:R + addAnimation("shoot_l", [8], 3, false); + addAnimation("shoot_u", [8], 3, false); + } else { + addAnimation("idle_d", [0, 1], 2, true); + addAnimation("shoot_d", [3], 3, false); + addAnimation("shoot_r", [4], 3, false);// DEFAULT:R + addAnimation("shoot_l", [4], 3, false); + addAnimation("shoot_u", [5], 3, false); + } + play("idle_d"); + addAnimationCallback(on_anim_change); + + add_sfx("shoot", Registry.sound_data.bubble_triple_group); + add_sfx("pop", Registry.sound_data.bubble_group); + + dame_frame=parseInt(xml.@frame); + immovable=true; + health=2; + + for(i in 0...3){ + var b:FlxSprite=new FlxSprite; + // TODO:add bullet gfx, test frog placeholders + b.loadGraphic(frog_bullet_sprite, true, false, 8, 8); + b.exists=false; + /* Add bullet shadow anims, of which there are none */ + b.my_shadow=EventScripts.make_shadow("8_small",true); + b.my_shadow.play("get_big"); + + + /* Add bullet animations */ + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + b.addAnimation("bullet_move", [4,5], 12); + b.addAnimation("bullet_explode", [2, 3, 3], 8, false); + } else { + b.addAnimation("bullet_move", [0, 1], 12); + b.addAnimation("bullet_explode", [2, 3, 3], 8, false); + } + BULLET_EMPTY_FRAME=3; + b.play("bullet_move"); + + y_bullets.add(b); + var p:Parabola_Thing=new Parabola_Thing(b, 16,0.8 + Math.random(), "offset", "y"); + if(dame_frame==2){ + b.velocity.y=15 *(i + 1); + } else { + b.velocity.x=-15 *(i + 1); + } + b.parabola_thing=p; + b.parabola_thing.set_shadow_fall_animation("get_big"); + } + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="shoot_l"){ + scale.x=-1; + } else { + scale.x=1; + } + } + + override public function update():Void + { + + if(init_latency>0){ + init_latency -=FlxG.elapsed; + return; + } + + if(player.overlaps(this)&& visible && player.state !=player.S_AIR){ + player.touchDamage(1); + } + if(health<=0 && state !=s_dead){ + state=s_dying; + } + var b:FlxSprite; + if(!added_to_parent){ + added_to_parent=true; + //get draw order right later + for(b in y_bullets.members){ + if(b==null)continue; + parent.bg_sprites.add(b.my_shadow) + parent.fg_sprites.add(b); + } + } + + hit_timer -=FlxG.elapsed; + if(player.broom.overlaps(this)&& player.broom.visible){ + if(hit_timer<=0){ + flicker(hit_timer_max); + hit_timer=hit_timer_max; + health--; + play_sfx(HURT_SOUND_NAME); + } + } + + if(state==s_face_player){ + + var dx:Int=player.x - x; + var dy:Int=player.y - y; + + if(dx>0){ + if(Math.abs(dy)0){ + facing=DOWN; + } else { + facing=UP; + } + } else { + if(Math.abs(dy)0){ + facing=DOWN; + } else { + facing=UP; + } + } + + if(EventScripts.distance(player, this)<64){ + state=s_shoot; + + } + } else if(state==s_shoot){ + if(!did_shoot_anim){ + + if(facing==DOWN){ + play("shoot_d"); + } else if(facing==LEFT){ + play("shoot_l"); + } else if(facing==RIGHT){ + play("shoot_r"); + } else { + play("shoot_u"); + } + did_shoot_anim=true; + + for(b in y_bullets.members){ + if(b==null)continue; + b.my_shadow.play("get_small"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.parabola_thing.reset_time(); + b.velocity=EventScripts.scale_vector(this, player, b.velocity, 15 *(y_bullets.members.indexOf(b)+ 1))as FlxPoint; + b.exists=b.visible=true; + b.my_shadow.exists=true; + b.x=b.my_shadow.x=x; + b.y=b.my_shadow.y=y; + b.play("bullet_move"); + } + + play_sfx("shoot"); + } else { + var nr_done:Int=0; + + for(b in y_bullets.members){ + if(b==null)continue; + if(!b.exists){ + nr_done++; + continue; + } + // Move until touches player... + if(!b.parabola_thing.tick()){ + + b.my_shadow.y=b.y; + b.my_shadow.x=b.x; + if(b.offset.y<8){ + if(player.overlaps(b)){ + player.touchDamage(1); + b.play("bullet_explode"); + } + } + //...or hits ground. + } else { + // First time it hits ground, play pop sound. + if(b.velocity.x !=0 && b.velocity.y !=0){ + play_sfx("pop"); + } + b.play("bullet_explode"); + b.velocity.x=b.velocity.y=0; + if(b.frame==BULLET_EMPTY_FRAME){ + b.offset.y=0; + b.my_shadow.exists=false; + b.exists=b.visible=false; + nr_done++; + } + } + } + + if(nr_done==3){ + state=s_face_player; + did_shoot_anim=false; + play("idle_d"); + + } + + } + } else if(state==s_dying){ + //play("die"); + //sfx + //do the below once + trace("dead!"); + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + xml.@alive="false"; + solid=false; + visible=false; + } else if(state==s_dead){ + for(b in y_bullets.members){ + if(b==null)continue; + if(!b.parabola_thing.tick()){ + + b.my_shadow.y=b.y; + b.my_shadow.x=b.x; + if(b.offset.y<8){ + if(player.overlaps(b)){ + player.touchDamage(1); + } + } + } else { + b.play("bullet_explode"); + b.my_shadow.exists=false; + + b.velocity.x=b.velocity.y=0; + if(b.frame==BULLET_EMPTY_FRAME){ + b.offset.y=0; + b.exists=false; + } + + } + } + } + super.update(); + } + + + + override public function destroy():Void + { + + for(var b:FlxSprite in y_bullets.members){ + + parent.fg_sprites.remove(b, true); + } + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/Person.hx b/AIR/intra/hsrc/entity/enemy/crowd/Person.hx new file mode 100644 index 0000000..93f42df --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/Person.hx @@ -0,0 +1,173 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.system.FlxTile; + +class Person extends FlxSprite +{ + + + + public var xml:XML; + public var cid:Int=CLASS_ID.PERSON; + public var player:Player; + public var parent:Dynamic; + public var switch_dir_timer_max:Float=1.3; + public var switch_dir_timer:Float=0.6; + public var initial_vel_timeout:Float=2; + public var wait:Int=0; + public var speed:Int=10; + + public var cur_x_vel:Int=0; + public var cur_y_vel:Int=0; + + public var init_vel:Point=new Point(0, 0); + + public var dame_frame:Int; + + private var collide_timeout:Int=0; + + private var talk_timer:Float; + + //[Embed(source="../../../res/sprites/enemies/crowd/person.png")] public static var person_sprite:Class; + /* + * dame params:frame:the direction of player travel this one opposes(or none at all) + * URDLN, unsurprisingly... 01234 + * direction given away by the way they walk initially + * */ + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(person_sprite, true, false, 16, 16); + addAnimation("walk_d", [0, 1], 5); + addAnimation("walk_r", [2,3], 5); + addAnimation("walk_u", [4,5], 5); + addAnimation("walk_l", [2, 3], 5); + addAnimationCallback(on_anim_change); + height=2; + width=4; + offset.y=13; + offset.x=7; + talk_timer=0.5 + Math.random(); + + dame_frame=parseInt(xml.@frame); + switch(dame_frame){ //urdln + case 0:init_vel.y=10;play("walk_d");break; + case 1:init_vel.x=10;play("walk_r");break; + case 2:init_vel.y=-10;play("walk_u");break; + case 3:init_vel.x=-10;play("walk_l");break; + case 4:init_vel.x=init_vel.y=-10 + 20 * Math.random(); + if(init_vel.x>0){ + play("walk_r"); + } else { + play("walk_l"); + } + switch_dir_timer=0.3; + switch_dir_timer_max=0.5; + drag.x=20; + drag.y=20; + break; + } + + add_sfx("talk", Registry.sound_data.talk_group); + } + + + override public function preUpdate():Void + { + + //urdln + //which dir of travel it blocks + //allow pushing if touching to olong + if(collide_timeout>1){ + collide_timeout=0; + FlxG.collide(parent.curMapBuf, this); + } else { + collide_timeout++; + } + + /* When the player touches, change player's velocity and + * maybe collide with the player as well. */ + if(player.overlaps(this)){ + player.slow_mul=0.5; + player.slow_ticks=7; + player.velocity.x *=0.25; + player.velocity.y *=0.25; + FlxG.collide(this, player); + player.velocity.x *=4; + player.velocity.y *=4; + } + super.preUpdate(); + } + override public function update():Void + { + + if(talk_timer<0){ + talk_timer=0.5 + Math.random(); + play_sfx("talk",true); + } else { + talk_timer -=FlxG.elapsed; + } + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } else { + return; + } + } + + switch_dir_timer -=FlxG.elapsed; + initial_vel_timeout -=FlxG.elapsed; + /* Switch directions semi-randomly */ + if(switch_dir_timer<0){ + /* Walk in an initial velocity for a fixed period of time */ + if(initial_vel_timeout>0){ + velocity.x=init_vel.x; + velocity.y=init_vel.y; + } else { + switch_dir_timer=switch_dir_timer_max; + if(Math.random()>0.5){ + velocity.y=0; + if(Math.random()>0.5){ + velocity.x=speed; + play("walk_r"); + } else { + velocity.x=-speed; + play("walk_l"); + } + } else { + velocity.x=0; + if(Math.random()>0.5){ + velocity.y=speed; + play("walk_d"); + } else { + velocity.y=-speed; + play("walk_u"); + } + } + } + } + super.update(); + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="walk_l"){ + scale.x=-1; + } else { + scale.x=1; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/Rotator.hx b/AIR/intra/hsrc/entity/enemy/crowd/Rotator.hx new file mode 100644 index 0000000..c8a9631 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/Rotator.hx @@ -0,0 +1,79 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * Simple enemy - harmful sprite rotates about center thing + * @author Seagaia + */ +class Rotator extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/crowd/f_rotator.png")] public static var rotator_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_rotator_ball.png")] public static var rotator_ball_sprite:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.ROTATOR; + public var player:Player; + public var sprite_ball:FlxSprite; + public var avel:Float=0.02; + public var r:Float=0; + + private var t_timeout:Float=1.4; + /** + * dame props: + * frame:both the sprite to use as well as the rotational radius/speed... see types + * + */ + public function new(_xml:XML,_player:Player) + { + xml=_xml; + player=_player; + super(parseInt(xml.@x), parseInt(xml.@y)); + + + sprite_ball=new FlxSprite(0, 0); + sprite_ball.loadGraphic(rotator_ball_sprite, true, false, 8, 8); + sprite_ball.rotate_angle=0; + sprite_ball.addAnimation("ball_move", [0, 1], 10); + sprite_ball.play("ball_move"); + + sprite_ball.width=sprite_ball.height=4; + sprite_ball.offset.x=sprite_ball.offset.y=2; + sprite_ball.x +=2;sprite_ball.y +=2; + + loadGraphic(rotator_sprite, true, false, 16, 16); + + + width=6; + height=5; + offset.x=5; + offset.y=2; + x +=5;y +=2; + + + addAnimation("tower_pulsate", [0, 1], 10); + play("tower_pulsate"); + immovable=true; + + } + + override public function update():Void + { + + if(r<59){ + r +=0.5; + } + EventScripts.rotate_about_center_of_sprite(this, sprite_ball, r, avel, 8, 8); + FlxG.collide(player, this); + if(Registry.GAMESTATE.state !=Registry.GAMESTATE.S_TRANSITION && sprite_ball.overlaps(player)&& player.state !=player.S_AIR){ + + player.touchDamage(1); + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/Spike_Roller.hx b/AIR/intra/hsrc/entity/enemy/crowd/Spike_Roller.hx new file mode 100644 index 0000000..51653f2 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/Spike_Roller.hx @@ -0,0 +1,284 @@ +package entity.enemy.crowd +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +import entity.player.Player; +import data.CLASS_ID; + +/** + * pretty self explanatoory + * falls from ceiling and rolls across the room stops on other side + * roomm should be empty from obstacles or this looks awkward + */ +class Spike_Roller extends FlxSprite +{ + public var xml:XML; + public var cid:Int=CLASS_ID.SPIKE_ROLLER; + public var player:Player; + public var parent:Dynamic; + + public var added_extras:Bool=false; + private var transitioned_in:Bool=false; + public var dame_type:Int=0; + private var state:Int=0; + private var s_hidden:Int=0; + private var s_fall:Int=1; + private var s_roll:Int=2; + private var s_stopped:Int=3; + + private var vel_x:Int=0; + private var vel_y:Int=0; + private var Fall_Rate:Float=1.0; + private var init_pt:Point=new Point(); + + private var is_bounce:Bool=false; + private var bounce_vel:Int=45; + private var ctr:Int=0; + + + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller.png")] public var Spike_Roller_Sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_horizontal.png")] public static var Spike_Roller_Sprite_H:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_shadow.png")] public var vert_shadow_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_horizontal_shadow.png")] public var hori_shadow_sprite:Class; + + + + // Dame:Frame:URLD 0123 + // Bounce - 4567 + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + dame_type=parseInt(_xml.@frame); + + my_shadow=new FlxSprite(x, y); + + switch(dame_type % 4){ + case 0: + loadGraphic(Spike_Roller_Sprite_H, true, false, 128, 16); + height=12; + my_shadow.loadGraphic(hori_shadow_sprite, true, false, 128, 16); + vel_y=-20; + facing=UP;break; + case 1: + loadGraphic(Spike_Roller_Sprite, true, false, 16, 128); + width=12; + vel_x=20; + my_shadow.loadGraphic(vert_shadow_sprite, true, false, 16, 128); + facing=RIGHT;break; + case 3: + loadGraphic(Spike_Roller_Sprite_H, true, false, 128, 16); + height=12; + my_shadow.loadGraphic(hori_shadow_sprite, true, false, 128, 16); + vel_y=20; + facing=DOWN;break; + case 2: + loadGraphic(Spike_Roller_Sprite, true, false, 16, 128); + width=12; + my_shadow.loadGraphic(vert_shadow_sprite, true, false, 16, 128); + vel_x=-20; + facing=LEFT;break; + + } + + /* ADd spike roller animations */ + addAnimation("roll_l", [0, 1], 5); + addAnimation("roll_r", [0, 1], 5);// DEFAULT RIGHT + addAnimation("roll_d", [0, 1], 5);//DEFAULT DOWN + addAnimation("roll_u", [0, 1], 5); + addAnimation("idle", [0]); + play("idle"); + + /* add shadow animations */ + my_shadow.addAnimation("hiding", [0]); + my_shadow.addAnimation("fall", [0], 2); + my_shadow.play("hiding"); + my_shadow.flicker(-1); + + + visible=my_shadow.visible=false; + + /* If bounce type */ + if(dame_type>3){ + has_tile_callbacks=false; + offset.y=0; + is_bounce=true; + play("roll_l"); + if(vel_x>0){ + play("roll_r"); + } else if(vel_x<0){ + play("roll_l"); + } else if(vel_y<0){ + play("roll_u"); + } else { + play("roll_d"); + } + visible=true; + } else { + offset.y=80; + immovable=true; + } + + Registry.subgroup_spike_rollers.push(this); + } + override public function preUpdate():Void + { + ctr++; + if(is_bounce && ctr==4){ + ctr=0; + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + private function bounce_logic():Void { + if(touching){ + if(touching & LEFT){ + play("roll_r"); + velocity.x=bounce_vel; + } else if(touching & RIGHT){ + play("roll_l"); + scale.x=-1; + velocity.x=-bounce_vel; + } else if(touching & DOWN){ + play("roll_u"); + scale.y=-1; + velocity.y=-bounce_vel; + } else { + play("roll_d"); + velocity.y=bounce_vel; + } + + Registry.sound_data.hitground1.play(); + } + + + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + } + + } + + private var move_that_shit_to_front_ticks:Int=5; + private var moveeeeeeeeeeeed:Bool=false; + override public function update():Void + { + + if(!added_extras){ + added_extras=true; + init_pt.x=x; + init_pt.y=y; + if(is_bounce){ + velocity.x=vel_x * 2; + velocity.y=vel_y * 2; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } else { + my_shadow.x=x; + my_shadow.y=y; + parent.bg_sprites.add(my_shadow); + parent.sortables.remove(this, true); + parent.fg_sprites.add(this); + } + } + + + if(move_that_shit_to_front_ticks>0){ + move_that_shit_to_front_ticks -=1; + } else { + if(Registry.CURRENT_MAP_NAME !="BLUE" && Registry.CURRENT_MAP_NAME !="CIRCUS" && moveeeeeeeeeeeed==false && is_bounce){ + moveeeeeeeeeeeed=true; + parent.bg_sprites.move_to_front(this); + + } + } + + if(parent.state==parent.S_TRANSITION){ + if(!transitioned_in){ + x=init_pt.x; + y=init_pt.y; + } else { + velocity.x=velocity.y=0; + } + return; + } else { + transitioned_in=true; + } + + if(is_bounce){ + bounce_logic(); + return; + } + switch(state){ + case s_hidden: + if(player.overlaps(my_shadow)){ + state=s_fall; + my_shadow.play("fall"); + my_shadow.exists=true; + exists=true; + Registry.sound_data.fall1.play(); + my_shadow.visible=visible=true; + } + break; + case s_fall: + offset.y -=Fall_Rate; + if(offset.y<0){ + if(facing==UP || facing==DOWN){ + offset.y=2; + } else { + offset.y=0; + offset.x=2; + } + Registry.sound_data.hitground1.play(); + state=s_roll; + velocity.x=vel_x; + velocity.y=vel_y; + parent.fg_sprites.remove(this, true); + parent.bg_sprites.add(this); + my_shadow.visible=false; + + if(vel_x>0){ + play("roll_r"); + } else if(vel_x<0){ + play("roll_l"); + scale.x=-1; + } else if(vel_y<0){ + play("roll_u"); + scale.y=-1; + } else { + play("roll_d"); + } + + } + break; + case s_roll: + if(player.state !=player.S_AIR &&(player.overlaps(this))){ + player.touchDamage(1); + } + if(Math.abs(init_pt.x - x)>=112){ + Registry.sound_data.hitground1.play(); + velocity.x=0; + state=s_stopped; + } else if(Math.abs(init_pt.y - y)>=112){ + Registry.sound_data.hitground1.play(); + velocity.y=0; + state=s_stopped; + } + break; + case s_stopped: + frame=0; + if(player.state !=player.S_AIR &&(player.overlaps(this))){ + player.touchDamage(1); + } + + break; + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/crowd/WallBoss.hx b/AIR/intra/hsrc/entity/enemy/crowd/WallBoss.hx new file mode 100644 index 0000000..9f49b49 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/crowd/WallBoss.hx @@ -0,0 +1,896 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import data.Common_Sprites; +import data.TileData; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; + +/** + * The 3rd boss. Face on a wall, and two fists. + * Basically. + * @author Seagaia + */ +class WallBoss extends FlxSprite +{ + + /* Generic properties */ + public var tl:Point=new Point(); + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + public var cid:Int=CLASS_ID.WALLBOSS; + private var max_health:Int=12; + public var cur_phase:Int=0; + private var phase_2_health:Int=10; + private var phase_3_health:Int=5; + private var fade_in_alpha_rate:Float=0.04; + private var fade_out_alpha_rate:Float=0.003; + private var broke_ground:Bool=false; + + private var talk_timer:Float=0; + + + + + /* wall properties */ + public var wall:FlxSprite; + private var death_explosions:FlxGroup=new FlxGroup(4); + private var death_explosion_timer:Float=0.25; + private var tm_de:Float=0.20; + + /* Face properties */ + public var face:FlxSprite; + private var s_face:Int=-1; + private var s_face_intro:Int=-1; + private var s_face_normal:Int=0; + private var s_face_charge:Int=1; + private var s_face_hit:Int=2; + private var s_face_dying:Int=3; + private var s_face_dead:Int=4; + private var s_face_shoot:Int=5; + public var hurt_t:Float=0; + public var hurt_tm:Float=1.0; + public var charge_t:Float=0; + public var charge_tm:Float=3.0; + public var finish_charge_tm:Float=1.0; + public var face_bullets:FlxGroup=new FlxGroup(8); + public var nr_bullets:Array=new Array(5, 6, 8); + + /* Hand properties */ + public var lhand:FlxSprite; + public var rhand:FlxSprite; + private var lhand_init_pt:Point=new Point(); + private var rhand_init_pt:Point=new Point(); + + private var lhand_poof:FlxSprite=new FlxSprite; + private var rhand_poof:FlxSprite=new FlxSprite; + + + private var s_hand:Int=0; + private var s_hand_intro:Int=0; + + private var s_hand_float:Int=1; + private var t_float:Float=0; + private var tm_float:Float=2.0; + + private var s_hand_push:Int=2; + private var max_nr_pushes:Array=new Array(2,3, 3); + private var nr_pushes:Int=0; + private var push_y_vel:Array=new Array(60, 90, 120); + private var p_double_push:Array=new Array(0.5, 0.7, 0.8); + + + /** + * Lhand only=0, rhand=1, both=2 + */ + private var push_type:Int=0; + private var ctr_hand_push:Int=0; + + + private var s_hand_stomp:Int=3; + private var s_hand_stomp_rhand:Int=LEFT; + private var max_nr_falls:Array=new Array(2, 3, 4); + private var nr_falls:Int=0;//counter + private var period_lhand_stomp:Float=2.0; + private var ctr_hand_stomp:Int=0;//sub-state ctr + private var rhand_stomp_vel:Float=30; + private var t_lhand_stomp:Float=0; + private var tm_lhand_stomp:Float=0.7 + private var played_sound:Bool=false; + + /* laser states*/ + + private var s_hand_h_laser:Int=4; + private var s_hand_h_laser_ctr:Int=0; + public var h_laser:FlxSprite=new FlxSprite(); + + private var s_hand_dying:Int=5; + private var t_dying:Float=0; + private var tm_dying:Float=3; + + private var s_hand_dead:Int=6; + + private var do_intro:Bool=true; + private var Intro_ctr:Int=0; + + + /* Assets */ + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_wall.png")] public static var wall_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_laser.png")] public var laser_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_bullet.png")] public var bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_face.png")] public static var face_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_l_hand.png")] public static var l_hand_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_l_hand.png")] public static var r_hand_sprite:Class; + + /* N.B. all Interactive entities added and removed directly in this code */ + public function new(_x:XML,_p:Player,_s:Dynamic) + { + /* boilerplate */ + xml=_x; + player=_p; + parent=_s; + + super(parseInt(_x.@x), parseInt(_x.@y)); + tl.x=Registry.CURRENT_GRID_X * 160 + 16; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT + 16; + var ctr:Int; + + health=max_health; + visible=false; + + + wall=new FlxSprite(tl.x - 16, tl.y - 16); + face=new FlxSprite(tl.x +(128 - 64)/ 2, tl.y - 16); + lhand=new FlxSprite(tl.x, tl.y + 16); + rhand=new FlxSprite(tl.x + 16 * 6, tl.y + 16); + + /* init wall entities */ + wall.loadGraphic(wall_sprite, true, false, 160, 32); + wall.addAnimation("move", [0, 1], 4); + wall.play("move"); + wall.immovable=true; + + // Death explosions + for(ctr=0;ctrcharge_tm){ + s_face=s_face_charge; + charge_t=0; + } + if(hurt_t>hurt_tm){ + if(player.broom.visible && player.broom.overlaps(face)){ + health--; + if(health==phase_2_health)cur_phase=1; + if(health==phase_3_health)cur_phase=2; + if(health==0){ + s_face=s_face_dying; + s_hand=s_hand_dying; + play_sfx("hurt_2"); + } else { + + play_sfx("hurt"); + } + hurt_t=0; + face.play("hurt"); + } else { + face.play("normal"); + } + } else { + hurt_t +=FlxG.elapsed; + } + //charge up, and then set all teh bullet properties + } else if(s_face==s_face_charge){ + face.play("charge"); + charge_t +=FlxG.elapsed; + if(charge_t>finish_charge_tm){ + charge_t=0; + s_face=s_face_shoot; + face.play("shoot"); + play_sfx("shoot"); + face_bullets.setAll("exists", true); + + for(s in face_bullets.members){ //BARF + if(s==null)continue; + s.x=face.x + 32; + s.y=face.y + 16; + s.parabola_thing=null; + s.parabola_thing=new Parabola_Thing(s, 16 + Std.int(8 * Math.random()), 1 + 0.5 * Math.random(), "offset", "y"); + s.parabola_thing.set_shadow_fall_animation("get_big"); + s.velocity.x=-30 + Std.int(60 * Math.random()); + s.velocity.y=30; + + s.my_shadow.exists=true; + s.my_shadow.play("get_small"); + s.my_shadow.x=s.x; + s.my_shadow.y=s.y; + } + } + //release bullets and chek for collisions. return to normal state + // when all bullets have hit the ground. + } else if(s_face==s_face_shoot){ + for(s in face_bullets.members){ + s.my_shadow.x=s.x;//pin shadow to bullet + s.my_shadow.y=s.y; + if(!player.invincible && s.overlaps(player)&& s.alive && s.exists){ //check overlap only if player vulnerable + player.touchDamage(1); + } + + if(s.parabola_thing.tick()){ + if(s.alive && s.exists){ + s.alive=false; + s.play("explode"); + play_sfx("pop"); + s.my_shadow.exists=false; + s.velocity.x=s.velocity.y=0; + + } else { + if(s._curAnim.frames.length - 1==s._curFrame){ + if(s.exists){ + s.alive=true; + s.exists=false; + s.play("move"); + } + } + } + + } + + if(!s.exists){ + ctr++; + } + } + if(ctr>=face_bullets.maxSize){ + s_face=s_face_normal; + } + } else if(s_face==s_face_intro){ + //play some sort of animation + //wait for hands to appear + if(s_hand !=s_hand_intro){ + s_face=s_face_normal; + } + + } else if(s_face==s_face_dying){ + + if(t_dying<0){ + if(!played_sound){ + DH.start_dialogue(DH.name_wallboss, DH.scene_wallboss_after_fight); + player.be_idle(); + played_sound=true; + play_sfx("death"); + } + + if(!DH.scene_is_finished(DH.name_wallboss, DH.scene_wallboss_after_fight)){ + super.update(); + return; + } + + face.alpha -=fade_out_alpha_rate; + wall.alpha -=fade_out_alpha_rate; + if(face.alpha==0 && wall.alpha==0){ + s_face=s_face_dead; + t_dying=1; + } + } else if(s_hand==s_hand_dead){ + t_dying -=FlxG.elapsed; + } + + } else if(s_face==s_face_dead){ + if(t_dying<0){ + Registry.sound_data.start_song_from_title("CROWD"); + Registry.GRID_ENEMIES_DEAD++; + //if(!Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]){ + // Registry.CURRENT_CUTSCENE=Cutscene.Terminal_Gate_Crowd; + // Registry.E_Load_Cutscene=true; + //} + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + xml.@alive="false"; + exists=false; + } else { + t_dying -=FlxG.elapsed; + } + } + + /**************/ + /* Hand logic */ + //only collide if not in stomp state + + set_shadow_size(lhand); + set_shadow_size(rhand); + + if(s_hand !=s_hand_stomp){ + FlxG.collide(player, lhand); + FlxG.collide(player, rhand); + } + if(s_hand==s_hand_intro){ + rhand.alpha +=fade_in_alpha_rate; + lhand.alpha +=fade_in_alpha_rate; + if(lhand.alpha==1 && rhand.alpha==1){ + s_hand=s_hand_float; + } + /* Floating logic */ + } else if(s_hand==s_hand_float){ + t_float +=FlxG.elapsed; + if(t_float>tm_float){ + t_float=0; + + choose_attack(); + if(s_hand==s_hand_push){ + nr_pushes=max_nr_pushes[cur_phase]; + } + + } + lhand.y=lhand_init_pt.y + 4 + Math.sin(t_float * 6.28)* 8; + rhand.y=rhand_init_pt.y + 4 - Math.sin(t_float * 6.28)* 8; + /* Logic for pushing */ + } else if(s_hand==s_hand_push){ + var sub_ctr:Int=0; + //move hands to correct place then depending on the type of + //attack, set velocities + if(ctr_hand_push==0){ + if(push_type !=0){ + if(EventScripts.send_property_to(lhand, "y", tl.y, 0.5))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", tl.x, 0.5))sub_ctr++; + } else { + sub_ctr +=2; + } + if(push_type !=1){ + if(EventScripts.send_property_to(rhand, "y", tl.y, 0.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", tl.x + 16*6, 0.5))sub_ctr++; + } else { + sub_ctr +=2; + } + + if(sub_ctr==4){ + if(push_type !=1){ + rhand.play("push"); + play_sfx("push"); + rhand.velocity.y=push_y_vel[cur_phase]; + rhand.velocity.x=-20 - 40 * Math.random(); + } + if(push_type !=0){ + lhand.play("push"); + play_sfx("push"); + lhand.velocity.y=push_y_vel[cur_phase]; + lhand.velocity.x=20 + 40 * Math.random(); + } + + ctr_hand_push++; + } + //if the hand goes far enough, then change states + } else if(ctr_hand_push==1){ + if(lhand.y>tl.y + 5 * 16 || rhand.y>tl.y + 5*16){ + ctr_hand_push++; + } + //reset hand push script if more pushes, otherwise go back to float + } else if(ctr_hand_push==2){ + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 3))sub_ctr++; + + if(sub_ctr==4){ + ctr_hand_push=0; + lhand.play("idle"); + rhand.play("idle"); + lhand.velocity.y=lhand.velocity.x=0; + rhand.velocity.y=rhand.velocity.x=0; + set_next_push(); + nr_pushes--; + if(nr_pushes==0){ + s_hand=s_hand_float; + } + } + } + /* Logic for stomping */ + } else if(s_hand==s_hand_stomp){ + sub_ctr=0; + // Pin shadows to hands + lhand.my_shadow.x=lhand.x; + lhand.my_shadow.y=lhand.y + 20; + rhand.my_shadow.x=rhand.x; + rhand.my_shadow.y=rhand.y + 20; + // Init nuumber of falls and other things + if(ctr_hand_stomp==0){ + lhand.play("stomp"); + rhand.play("stomp"); + if(EventScripts.send_property_to(rhand, "y", tl.y + 16, 0.5)){ + ctr_hand_stomp++; + nr_falls=max_nr_falls[cur_phase]; + lhand.my_shadow.visible=rhand.my_shadow.visible=true; + } + //Stomp the rhand back and forth, have the lhand sort of follow the player + //state change when lhand stomps enough times + } else if(ctr_hand_stomp==1){ + if(rhand.parabola_thing.tick()){ + play_sfx("tap_ground"); + rhand_poof.exists=true; + rhand_poof.play("poof"); + rhand_poof.x=rhand.x; + rhand_poof.y=rhand.y; + rhand.parabola_thing.reset_time(); + } + if(rhand.offset.y<=8 && rhand.my_shadow.overlaps(player)){ + player.touchDamage(1); + } + if(s_hand_stomp_rhand==LEFT){ + rhand.velocity.x=-rhand_stomp_vel; + if(rhand.x(tl.x + 16 * 8 - rhand.width)){ + s_hand_stomp_rhand=LEFT; + } + } + //rise and fall for lhand + if(lhand.parabola_thing.t>(lhand.parabola_thing.period / 2)){ + if(!played_sound){ + play_sfx("fall"); + played_sound=true; + } + if(t_lhand_stomp>tm_lhand_stomp){ + if(lhand.parabola_thing.tick()){ + lhand_poof.exists=true; + lhand_poof.play("poof"); + play_sfx("hit_ground"); + lhand_poof.x=lhand.x; + lhand_poof.y=lhand.y; + lhand.parabola_thing.reset_time(); + nr_falls--; + played_sound=false; + FlxG.shake(0.01, 0.2); + //break the ground if damaged a bit + if(!broke_ground && cur_phase>=1){ + FlxG.shake(0.02, 0.5); + Registry.sound_data.floor_crack.play(); + if(break_ground()){ + broke_ground=true; + } + } + if(nr_falls==0){ + ctr_hand_stomp=2; + rhand.velocity.x=0; + rhand.my_shadow.visible=lhand.my_shadow.visible=false; + } + } + if(lhand.offset.y<8 && lhand.my_shadow.overlaps(player)){ + player.touchDamage(1); + } + } else { + t_lhand_stomp +=FlxG.elapsed; + } + } else { + EventScripts.send_property_to(lhand, "x", player.x, 1); + EventScripts.send_property_to(lhand, "y", player.y - 16, 1); + lhand.parabola_thing.tick(); + } + //reset then return to float state + } else if(ctr_hand_stomp==2){ + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand.offset, "y", 0, 2))sub_ctr++; + + if(sub_ctr==5){ + + lhand.play("idle"); + rhand.play("idle"); + s_hand=s_hand_float; + ctr_hand_stomp=0; + + } + } + } else if(s_hand==s_hand_h_laser){ + if(player.ytl.y + 16 * 5){ + lhand.velocity.y=rhand.velocity.y=-65; + s_hand_h_laser_ctr++; + } + } else if(s_hand_h_laser_ctr==2){ + if(lhand.ytl.y + 16 * 5){ + s_hand_h_laser_ctr++; + lhand.velocity.y=rhand.velocity.y=-20; + } + } else { + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 1.5))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 1.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 1.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 1.5))sub_ctr++; + if(sub_ctr==4){ + h_laser.visible=false; + lhand.velocity.y=rhand.velocity.y=0; + s_hand=s_hand_float; + lhand.play("idle"); + rhand.play("idle"); + s_hand_h_laser_ctr=0; + } + } + + } else if(s_hand==s_hand_dying){ + + if(Registry.sound_data.current_song.playing){ + rhand.velocity.x=rhand.velocity.y=lhand.velocity.x=lhand.velocity.y=0; + Registry.sound_data.stop_current_song(); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.flash(0xffffffff, 3); + t_dying=tm_dying; + } + if(t_dying>0){ + t_dying -=FlxG.elapsed; + death_explosions.exists=true; + super.update(); + return; + } + FlxG.shake(0.02, 0.1, null, true); + + + rhand.alpha -=fade_out_alpha_rate; + lhand.alpha -=fade_out_alpha_rate; + rhand.my_shadow.alpha -=fade_out_alpha_rate; + lhand.my_shadow.alpha -=fade_out_alpha_rate; + + if(death_explosion_timer<0){ + death_explosion_timer=tm_de; + for(var de:FlxSprite in death_explosions.members){ + if(!de.visible){ + de.visible=true; + de.play("explode"); + de.x=wall.x +(160 - de.width)* Math.random(); + de.y=wall.y + 32 * Math.random(); + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + break; + } else { + if(de._curAnim.frames.length - 1==de._curFrame){ + de.visible=false; + } + } + } + } else { + death_explosion_timer -=FlxG.elapsed; + } + if(rhand.alpha<=0.03 && lhand.alpha<=0.03){ + s_hand=s_hand_dead; + h_laser.visible=false; + rhand.my_shadow.visible=false; + lhand.my_shadow.visible=false; + } + } else if(s_hand==s_hand_dead){ + lhand.velocity.x=rhand.velocity.x=lhand.velocity.y=rhand.velocity.y=0; + + } + + //laser attacks + + super.update(); + } + + private function choose_attack():Void { + var r:Float=Math.random(); + switch(cur_phase){ + case 0: + if(r<=0.7){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + case 1: + if(r<=0.35){ + s_hand=s_hand_h_laser; + } else if(r<=0.7){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + case 2: + if(r<=0.5){ + s_hand=s_hand_h_laser; + } else if(r<=0.75){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + } + } + + private function set_shadow_size(fist:FlxSprite):Void { + var y_off:Int=fist.offset.y; + + if(y_off>=29){ + fist.my_shadow.frame=0; + } else if(y_off>=24){ + fist.my_shadow.frame=1; + } else if(y_off>=16){ + fist.my_shadow.frame=2; + } else if(y_off>=8){ + fist.my_shadow.frame=3; + } else { + fist.my_shadow.frame=4; + } + } + /** + * Breaks the ground in the 6th row of the play area + */ + private function break_ground():Int { + var tile_indices:Array=new Array(62, 63, 64, 65, 66, 67); + var cracked_index:Int=71; + var is_broken:Bool=false; + for(var index:Int in tile_indices){ + var tm:FlxTilemap=parent.curMapBuf; + if(tm.getTileByIndex(index)!=cracked_index){ + tm.setTileByIndex(index, cracked_index, true); + } else { + tm.setTileByIndex(index, 81, true); + is_broken=true; + } + } + + return is_broken ? 1:0; + } + + /** + * Helper function, sets the some of the next push properties + */ + private function set_next_push():Void { + + if(Math.random()pre_thorn.y + 2){ + player.y=pre_thorn.y - player.height; + player.touchDamage(1); + } + super.update(); + } + + private var pre_thorn:FlxSprite; + private var pre_ctr:Int=0; + private function state_pre():Void { + switch(pre_ctr){ + case 0: + + pre_ctr=1; + break; + case 1: + if(player.y=new Array(100); + + private function update_parent_map(done:Bool):Void { + var during:Array=new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 172, 172, 173, 0, 0, 0, + 0, 171, 172, 181, 170, 170, 180, 172, 173, 0, + 0, 177, 170, 170, 170, 170, 170, 170,178, 0, + 0, 177, 170, 170, 170, 170, 170, 170, 178, 0, + 0, 174, 175, 175, 183, 182, 175, 175, 176, 0, + 0, 184, 185, 185, 177, 178, 185, 185, 186, 0 + ); + + var t:FlxTilemap; + t=parent.curMapBuf; + + if(saved_old==false){ + saved_old=true; + for(j in 0...100){ + old[j]=t.getTileByIndex(j); + } + } + var p:PlayState=parent; + if(done==false){ + + parent.map_bg_2.visible=false; + p.anim_tiles_group.setAll("visible", false); + for(i in 0...100){ + t.setTileByIndex(i, during[i], true); + } + } else { + p.anim_tiles_group.setAll("visible", true); + for(i=0;i<100;i++){ + t.setTileByIndex(i, old[i], true); + } + } + } + private var Intro_ctr:Int=0; + private var Intro_add_lock:Bool=true; + private function state_intro():Void { + switch(intro_ctr){ + case 0: + (Registry.volume_scale>0)? Registry.volume_scale -=0.01:1; + + if(player.y0)? Registry.volume_scale -=0.01:1; + if(false==DH.a_chunk_is_playing()){ + Water_Anim.START_WATER_ANIMF(); + Registry.sound_data.stream_sound.play(); + intro_ctr +=1; + FlxG.shake(0.01, 100); + Registry.sound_data.stop_current_song(); + } + break; + case 2: + // The water anim freezes the player till it's done. + if(player.state !=player.S_INTERACT){ + FlxG.shake(0, 0); + intro_ctr +=1; + } + break; + case 3: + player.be_idle(); + intro_ctr +=1; + briar.play("oh_no"); + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_before_fight);// !!! + break; + case 4: + if(DH.a_chunk_just_finished()){ + intro_add_lock=false; + Registry.sound_data.start_song_from_title("BRIARFIGHT"); + Registry.volume_scale=1; + FlxG.flash(0xffffffff, 1); + update_parent_map(false); + parent.anim_tiles_group.setAll("visible", false); + briar.visible=false; + intro_ctr +=1; + Registry.GAMESTATE.dialogue_latency=-1; + } + break; + case 5: + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_before_fight);// Oh no + player.be_idle(); + intro_ctr +=1; + break; + case 6: + if(false==DH.a_chunk_is_playing()){ + state=S_ATK_BIG; + Water_Anim.UNALIVE=true; + } + break; + } + } + + private var ctr_atk_big:Int=0;// State counter + private var ctr_atk_big_atks:Int=0;// How many attacks it's done + private var thorn_ref:FlxSprite; + private var t_atk_big:Float=0; + private var iter_atk_big:Int=0; + private var atk_big_max_atks:Array=new Array(1, 1, 1, 2, 2, 3, 3); + private var tm_atk_big:Array=new Array(0.18, 0.16, 0.14, 0.13, 0.11, 0.09,0.06); + private var atk_big_fps:Array=new Array(12, 13, 14, 15, 16, 17, 17); + private var t_shoot_bullets:Float=0; + private var tm_shoot_bullets:Array=new Array(1.4, 1.4,1.2,1.2,1,1,1); + + private function new_bul(group:FlxGroup,ref:Point,x:Int, y:Int, vx:Int=0, vy:Int=0, ax:Int=0, ay:Int=0,anim:String=""):Void { + var b:FlxSprite=group.getFirstAvailable()as FlxSprite; + + if(b !=null){ + b.velocity.x=vx; + b.velocity.y=vy; + b.acceleration.x=ax; + b.acceleration.y=ay; + if(ref==null){ + b.x=x; + b.y=y; + } else { + b.x=ref.x + x; + b.y=ref.y + y; + } + + if(anim !=""){ + b.play(anim); + } + b.exists=true; + } + } + + private function atk_big_shoot_bullets(type:Int):Void { + var b:FlxSprite; + if(type>4){ + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + } else if(type>2){ + new_bul(bullet_thorns, tl, 16 + 20, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 101, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + } else { + + new_bul(bullet_thorns, tl, 16 + 4, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 116, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl, 16 + 20, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 101, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + + } + } + private function state_atk_big():Void { + + // Ground thorn attack - gives a warning then they sort of + // poke out from the ground. + for(thorn_ref in thorns.members){ + if(thorn_ref !=null && thorn_ref._animations !=null){ + if(thorn_ref._curFrame>=thorn_harmful_idx && thorn_ref._curFrametm_shoot_bullets[6 -(blue_health + happy_health)]){ + t_shoot_bullets=0; + atk_big_shoot_bullets(blue_health + happy_health); + } + + for(thorn_ref in bullet_thorns.members){ + if(thorn_ref !=null && true==thorn_ref.exists){ + if(player.state==player.S_GROUND && thorn_ref.overlaps(player)){ + player.touchDamage(1); + } + + if(thorn_ref.y + 6>tl.y + 160){ + thorn_ref.exists=false; + } + } + } + + + if(body._curAnim !=null && body._curAnim.name=="active" && body._curAnim.frames.length -1==body._curFrame){ + body.play("idle"); + } + // Also do an attack when less than 3 health. + + switch(ctr_atk_big){ + // Make thorns follow the player across the screen and begin to pop up. + case 0: + t_atk_big +=FlxG.elapsed; + // Speed of the attack increases + if(t_atk_big>tm_atk_big[6 -(blue_health + happy_health)]){ + t_atk_big=0; + body.play("active"); + if(iter_atk_big==0){ + Registry.sound_data.play_sound_group(Registry.sound_data.briar_shine_group); + } + thorn_ref=thorns.getFirstAvailable()as FlxSprite; + if(thorn_ref !=null){ + + thorn_ref.exists=true; + thorn_ref.x=thorn_ref.offset.x + tl.x + 16 *(1 + iter_atk_big); + if(player.y1 && iter_atk_big<6 &&(player.yatk_big_max_atks[6 -(blue_health + happy_health)]){ + ctr_atk_big_atks=0; + + if(happy_health==0){ + state=S_ATK_HAPPY; + } else if(blue_health==0){ + state=S_ATK_BLUE; + } else { + body.play("idle"); + if(Math.random()>0.5){ + state=S_ATK_HAPPY; + } else { + state=S_ATK_BLUE; + } + } + } + } + + break; + } + + + } + + private var atk_blue_ctr:Int=0; + + private var t_atk_blue:Float=0; + + private var atk_blue_vels:Array=new Array(50, 70, 90); + private var atk_blue_init:Bool=false; + private var atk_blue_pt:Point; + private var atk_blue_init_pt:Point; + private var atk_blue_vel_mul:Float=1; + + + private function state_atk_blue():Void { + + if(!atk_blue_init){ + atk_blue_init=true; + atk_blue_pt=new Point(happy_thorn.x + 6, happy_thorn.y + 52); + atk_blue_init_pt=new Point(blue_thorn.x, blue_thorn.y + 52); + } + + var ex_ref:FlxSprite; + for(ex_ref in ice_exs.members){ + if(ex_ref !=null && ex_ref.exists==true){ + if(ex_ref.finished){ + ex_ref.exists=false; + } + } + } + switch(atk_blue_ctr){ + case 0: + + + blue_thorn.play("active"); + t_atk_blue +=FlxG.elapsed; + ice_crystal.x=blue_thorn.x; + ice_crystal.y=blue_thorn.y + 52; + ice_crystal.visible=true; + ice_crystal.flicker(0.2); + if(t_atk_blue<1.5){ + break; + + } + + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.teleguy_down.play(); + EventScripts.scale_vector(atk_blue_init_pt, player, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + atk_blue_ctr=1; + t_atk_blue=0; + break; + case 1: + if(player.overlaps(ice_crystal)){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + player.touchDamage(1); + atk_blue_ctr=3; + } + + if(player.broom.visible && player.broom.overlaps(ice_crystal)){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.broom_hit.play(); + atk_blue_vel_mul +=0.15; + EventScripts.scale_vector(ice_crystal, atk_blue_pt, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + ice_crystal.velocity.x *=atk_blue_vel_mul; + ice_crystal.velocity.y *=atk_blue_vel_mul; + atk_blue_ctr=2; + } + + if(ice_crystal.x>tl.x + 160 || ice_crystal.xtl.y + 160){ + atk_blue_ctr=3; + } + break; + case 2: + if(EventScripts.distance(ice_crystal, atk_blue_pt)<5){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.play_sound_group(Registry.sound_data.sb_ball_appear); + atk_blue_vel_mul +=0.15; + EventScripts.scale_vector(ice_crystal, player, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + ice_crystal.velocity.x *=atk_blue_vel_mul; + ice_crystal.velocity.y *=atk_blue_vel_mul; + + if(happy_health==3 && atk_blue_vel_mul>=1.6){ + atk_blue_ctr=4; + } else if(happy_health==2 && atk_blue_vel_mul>=1.9){ + atk_blue_ctr=4; + } else if(happy_health==1 && atk_blue_vel_mul>2.05){ + atk_blue_ctr=4; + } else { + atk_blue_ctr=1; + } + } + + if(EventScripts.distance(ice_crystal, atk_blue_pt)>200){ + atk_blue_ctr=3; + } + break; + case 3:// transition back to atk_big state, do some cleanup + + if(ice_exs.countExisting()==0){ + ice_crystal.visible=false; + blue_thorn.play("off"); + + if(happy_health==0 && blue_health==0){ + state=S_DYING; + } else { + state=S_ATK_BIG; + } + atk_blue_vel_mul=1; + ice_crystal.velocity.x=ice_crystal.velocity.y=0; + atk_blue_ctr=0; + } + break; + case 4:// Staggered. + ice_crystal.visible=false; + + happy_thorn.play("hurt"); + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff1111, 0.4); + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + atk_blue_ctr=5; + break; + case 5:// Logic for hitting the thorn + if(player.broom.overlaps(happy_thorn)&& player.broom.visible){ + happy_health -=1; + core.play("flash"); + FlxG.flash(0xffff0000, 0.8); + happy_thorn.play("hit"); + Registry.sound_data.wb_hit_ground.play(); + atk_blue_ctr=6; + FlxG.shake(0.03, 0.4); + } + break; + case 6: + if(happy_thorn.finished){ + core.play("glow"); + happy_thorn.play("off"); + atk_blue_ctr=3; + } + break; + } + + /* + * Right side(Blue) + * + * shoots out ice lazer thing, need to hit it back and forth with the red eye to hurt and open it + * Or a sharp one that explodes + * */ + } + + private var atk_happy_ctr:Int=0; + + private var fire_eye:FlxSprite; + private var fireballs:FlxGroup; + private var dusts:FlxGroup; + private var dust_explosions:FlxGroup; + private var did_atk_happy_init:Bool=false; + private var mists:FlxGroup; + + private var t_atk_happy:Float=0; + + private function state_atk_happy():Void { + + if(!did_atk_happy_init){ + did_atk_happy_init=true; + + // Fire-eye init MARINA_ANIMS_FIRE_EYE + fire_eye=new FlxSprite(); + fire_eye.loadGraphic(embed_fire_eye, true, false, 16, 16); + fire_eye.addAnimation("shoot", [6, 7, 8, 9], 10, true); + fire_eye.addAnimation("grow", [0, 1, 2, 3, 4, 5], 10, false); + fire_eye.addAnimation("ungrow", [5, 4, 3, 2, 1, 0], 10, false); + fire_eye.play("shoot"); + parent.bg_sprites.add(fire_eye); + + // Fireballs init MARINA_ANIMS_FIREBALLS + fireballs=new FlxGroup(12); + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + fireball.loadGraphic(embed_fire_eye, true, false, 16, 16); + fireball.addAnimation("move", [12, 13], 12, true); + fireball.play("move"); + fireball.exists=false; + fireball.width=fireball.height=6; + fireball.offset.x=fireball.offset.y=5; + fireballs.add(fireball); + } + parent.sortables.add(fireballs); + + // Dusts init + dusts=new FlxGroup(4); + for(i=0;itl.x + 160 || fireball.ytl.y + 160){ + fireball.exists=false; + } + + for(mist in mists.members){ + if(mist.exists==true && fireball.overlaps(mist)){ + fireball.exists=false; + } + } + + // Check for dust overlap, cause an explosion + for(dust in dusts.members){ + if(dust !=null && dust.exists && dust.frame==0){ + if(dust.overlaps(fireball)){ + Registry.sound_data.play_sound_group(Registry.sound_data.dust_explode_group); + fireball.exists=false; + dust.exists=false; + dust_explos=dust_explosions.getFirstAvailable()as FlxSprite; + if(dust_explos !=null){ + dust_explos.x=dust.x - 16; + dust_explos.y=dust.y - 16; + dust_explos.exists=true; + dust_explos.play("explode"); + + // Make fireballs appear + var fire_ref:FlxSprite=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + + fire_ref.velocity.y=0;fire_ref.velocity.x=-70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.y=0;fire_ref.velocity.x=70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.x=0;fire_ref.velocity.y=70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.x=0;fire_ref.velocity.y=-70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + if(dust_explos.overlaps(blue_thorn)){ + atk_happy_ctr=4; + + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff1111, 0.4); + FlxG.shake(0.01, 0.2); + } + } + } + } + } + + if(!player.invincible && player.state !=player.S_AIR && player.overlaps(fireball)){ + fireball.exists=false; + player.touchDamage(1); + } + + } + } + + switch(atk_happy_ctr){ + + case -1: + if(fire_eye.finished){ + fire_eye.play("shoot"); + atk_happy_ctr=1; + } + break; + case 0: + happy_thorn.play("active"); + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy<1.5){ + break; + } + // Position of fire eye and dusts should vary by health + + fire_eye.exists=true; + fire_eye.frame=6; + fire_eye.play("grow"); + + if(blue_health==3){ + fire_eye.x=tl.x + 70; + fire_eye.y=tl.y + 80; + } else if(blue_health==2){ + fire_eye.x=tl.x + 50; + fire_eye.y=tl.y + 100; + } else { + fire_eye.x=tl.x + 50; + fire_eye.y=tl.y + 100; + } + + var mist_ref:FlxSprite; + if(blue_health==3){ + // No mists. + } else if(blue_health==2){ + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16 - 7; + mist_ref.y=tl.y + 5 * 16 - 12; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16 - 7; + mist_ref.y=tl.y + 7 * 16 - 12; + } else { + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 5 * 16 + 8; + mist_ref.y=tl.y + 4 * 16 + 5; + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16; + mist_ref.y=tl.y + 6 * 16 + 3; + } + + var dust_ref:Dust; + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 7; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 8 * 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 7; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 3 * 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 5; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 5; + + dusts.setAll("frame", Dust.EMPTY_FRAME); + dusts.setAll("exists", true); + + for(dust in dusts.members){ + dust.play("unpoof"); + } + t_atk_happy=0; + atk_happy_ctr=-1; + + break; + case 1: + // Shoot fireballs + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy>0.4){ + t_atk_happy=0; + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + fireball=fireballs.getFirstAvailable()as FlxSprite; + if(fireball !=null){ + fireball.x=fire_eye.x + 4; + fireball.y=fire_eye.y + 4; + fireball.exists=true; + EventScripts.scale_vector(fireball, player, fireball.velocity, 45); + } + } + + for(dust_explos in dust_explosions.members){ + if(dust_explos.finished){ + dust_explos.exists=false; + } + } + // If all dusts gone then exit this state + if(dusts.countExisting()==0 && dust_explosions.countExisting()==0){ + atk_happy_ctr=7; + } + break; + + case 3:// Transitioning back to big atk state + fire_eye.exists=false; + dust_explosions.setAll("exists", false); + dusts.setAll("exists", false); + fireballs.setAll("exists", false); + mists.setAll("exists", false); + happy_thorn.play("off"); + blue_thorn.play("off"); + atk_happy_ctr=0; + + if(happy_health==0 && blue_health==0){ + state=S_DYING; + } else { + state=S_ATK_BIG; + } + break; + case 4:// Just got hit + blue_thorn.play("hurt"); + atk_happy_ctr=5; + break; + case 5: + if(player.broom.visible && player.broom.overlaps(blue_thorn)){ + blue_health -=1; + FlxG.flash(0xffff1111, 0.6); + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.03, 0.4); + blue_thorn.play("hit"); + core.play("flash"); + atk_happy_ctr=6; + } + break; + case 6: + // wait for hurt anim to finish, if we add a new one + if(blue_thorn.finished){ + core.play("glow"); + blue_thorn.play("off"); + atk_happy_ctr=7; + } + break; + case 7: + for(dust in dusts.members){ + if(dust.exists)dust.play("poof"); + } + fire_eye.play("ungrow"); + for(mist in mists.members){ + mist.flicker(1); + } + atk_happy_ctr=8; + break; + case 8: + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy>1.3){ + t_atk_happy=0; + atk_happy_ctr=3; + } + break; + } + } + + private var dying_ctr:Int=0; + private var explode_ctr:Int=0; + private function state_dying():Void { + switch(dying_ctr){ + case 0: + DH.disable_menu(); + Registry.sound_data.stop_current_song(); + player.be_idle(); + dying_ctr=-1; + t_atk_blue=0; + break; + case -1: + t_atk_blue +=FlxG.elapsed; + player.be_idle(); + player.state=player.S_INTERACT; + + happy_thorn.play("hit"); + if(t_atk_blue>0.2){ + t_atk_blue=0; + EventScripts.make_explosion_and_sound(happy_thorn, 1); + explode_ctr ++; + if(explode_ctr>10){ + FlxG.flash(0xffff1111, 1.5); + Registry.sound_data.sun_guy_death_s.play(); + dying_ctr=-2; + happy_thorn.visible=false; + explode_ctr=0; + } + } + break; + case -2: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>0.2){ + t_atk_blue=0; + blue_thorn.play("hit"); + EventScripts.make_explosion_and_sound(blue_thorn, 2); + explode_ctr ++; + if(explode_ctr>10){ + dying_ctr=-30; + blue_thorn.visible=false; + explode_ctr=0; + FlxG.flash(0xff1111ff, 1.5); + Registry.sound_data.sun_guy_death_s.play(); + } + } + break; + case -30: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>1.5){ + dying_ctr=-3; + } + break; + case -3: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>0.15){ + t_atk_blue=0; + core.play("flash"); + EventScripts.make_explosion_and_sound(body, 3); + explode_ctr ++; + if(explode_ctr>15){ + FlxG.flash(0xffffffff, 5); + Registry.sound_data.sun_guy_death_l.play(); + dying_ctr=-40; + body.visible=false; + core.visible=false; + update_parent_map(true); + overhang.visible=false; + parent.map_bg_2.visible=true; + briar.exists=true;briar.visible=true; + } + } + break; + case -40: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>1.5){ + dying_ctr=1; + } + break; + case 1: + dying_ctr=2; + player.state=player.S_INTERACT; + if(ice_crystal !=null && ice_exs !=null)ice_crystal.exists=ice_exs.exists=false; + if(dusts !=null && fire_eye !=null && fireballs !=null && dust_explosions !=null)dusts.exists=fire_eye.exists=fireballs.exists=dust_explosions.exists=false; + bullet_thorns.exists=thorns.exists=false; + body.exists=blue_thorn.exists=happy_thorn.exists=pre_thorn.exists=core.exists=false; + t_atk_big=0; + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_after_fight); + break; + case 2: + + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + if(false==DH.a_chunk_is_playing()){ + t_atk_big +=FlxG.elapsed; + if(t_atk_big>1.0){ + dying_ctr=3; + briar.velocity.y=-20; + Achievements.unlock(Achievements.A_DEFEAT_BRIAR); + Achievements.is_100_percent(); + Registry.sound_data.start_song_from_title("GO"); + Registry.sound_data.current_song.volume=1; + briar.play("walk_u"); + } + } + break; + case 3: + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + if(briar.ytl.y + 120){ + player.y=tl.y + 120; + } + xml.@alive="false"; + Registry.GE_States[Registry.GE_BRIAR_BOSS_DEAD]=true; + state=S_DEAD; + break; + } + } + + private function state_dead():Void { + // Ain't no thang. + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + } + private function init_pre_thorn(x:Int,y:Int):Void + { + pre_thorn=new FlxSprite(); + pre_thorn.loadGraphic(embed_ground_thorn, false, false, 32, 16); + pre_thorn.addAnimation("move", [6,7,8], 6); + pre_thorn.play("move"); + pre_thorn.x=tl.x + x; + pre_thorn.y=tl.y + y; + parent.sortables.add(pre_thorn); + pre_thorn.immovable=true; + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/Chaser.hx b/AIR/intra/hsrc/entity/enemy/etc/Chaser.hx new file mode 100644 index 0000000..e9c35cb --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/Chaser.hx @@ -0,0 +1,193 @@ +package entity.enemy.etc +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.system.FlxTile; + +class Chaser extends FlxSprite +{ + private var xml:XML; + private var player:Player; + private var parent:Dynamic; + + + private var state:Int; + private static inline var s_idle:Int=0; + private static inline var s_moving:Int=1; + + private var dame_type:Int; + private var dt_hori:Int=0; + private var dt_vert:Int=1; + + private var float_vel:Int=15; + + private var tl:Point; + + private var lookahead:Point; + + + //[Embed(source="../../../res/sprites/enemies/etc/chaser.png")] public static var embed_chaser_sprite:Class; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + dame_type=parseInt(xml.@frame); + + state=s_idle; + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + lookahead=new Point(0, 0); + + + loadGraphic(embed_chaser_sprite, true, false, 16, 32); + width=height=8; + offset.y=20; + offset.x=4; + x +=4; + y +=20; + // MARINA_ANIMS + if(dame_type==dt_hori){ + frame=6; + } else { + frame=4; + } + addAnimation("d", [4, 5], 8); + addAnimation("r", [6,7], 8); + addAnimation("u", [8, 9], 8); + addAnimation("l", [10,11], 8); + addAnimationCallback(on_anim_change); + + } + + override public function preUpdate():Void + { + super.preUpdate(); + } + + override public function update():Void + { + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.mover_move_group); + } + + if(player.broom.visible){ + if(Math.abs(velocity.x)<100 && Math.abs(velocity.y)<100){ + velocity.x *=1.025; + velocity.y *=1.025; + } + } else { + float_vel=15; + } + switch(state){ + case s_idle: + + if(dame_type==dt_hori){ + if(player.y>y - player.height && player.yx){ + velocity.x=float_vel; + play("r"); + } else { + velocity.x=-float_vel; + play("l"); + } + } + } else if(dame_type==dt_vert){ + if(player.x + player.width>x && player.xy){ + play("d"); + velocity.y=float_vel; + } else { + play("u"); + velocity.y=-float_vel; + } + } + } + break; + case s_moving: + if(EventScripts.get_tile_allow_collisions(lookahead.x,lookahead.y,parent.curMapBuf)){ + switch(facing){ + case UP: + facing=DOWN; + play("d"); + velocity.y *=-1; + break; + case DOWN: + play("u"); + facing=UP; + velocity.y *=-1; + break; + case LEFT: + play("r"); + facing=RIGHT; + velocity.x *=-1; + break; + case RIGHT: + play("l"); + facing=LEFT; + velocity.x *=-1; + break; + } + } + // Now update the lookahead point to reflect the possible state change above + if(facing &(UP | DOWN)){ + if(facing & UP){ + lookahead.y=y; + lookahead.x=x + width / 2; + } else { + lookahead.x=x + width / 2; + lookahead.y=y + height; + } + } else { + if(facing & RIGHT){ + lookahead.x=x + width; + lookahead.y=y + height / 2; + } else { + lookahead.x=x; + lookahead.y=y + height / 2; + } + } + + // Check to kill the player + if(player.overlaps(this)){ + player.touchDamage(6); + } + break; + } + super.update(); + } + + private function on_anim_change(name:String, frame:Int, index:Int):Void { + switch(name){ + case "u": + facing=UP; + break; + case "d": + facing=DOWN; + break; + case "l": + facing=LEFT; + break; + case "r": + facing=RIGHT; + break; + } + } + + override public function destroy():Void + { + tl=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/ControlsDeity.hx b/AIR/intra/hsrc/entity/enemy/etc/ControlsDeity.hx new file mode 100644 index 0000000..a013001 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/ControlsDeity.hx @@ -0,0 +1,211 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import global.Keys; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import global.Registry; +import states.ControlsState; +import states.PlayState; +import flash.events.KeyboardEvent; +import entity.player.Player; + +/** + * straightforward, an invisible event thing that + * lets you set hte movement controls + * @author Seagaia + */ +class ControlsDeity extends FlxSprite +{//FUCK IT!!! + + public var cid:Int=CLASS_ID.CONTROLSDEITY; + public var xml:XML; + public var text:FlxBitmapFont=new FlxBitmapFont(Registry.C_FONT_BLACK, 8, 8, Registry.C_FONT_BLACK_STRING, 27); + public var state:Int=1; + public var S_CONTROL:Int=0; + public var control_ctr:Int=0; + public var S_NORMAL:Int=1; + public var normal_ctr:Int=0; + public var S_CONTROL_2:Int=2; + public var recent_key_code:Int=1000; + + public var player:Player; + public var input:String=" "; + public var portal:FlxSprite=new FlxSprite(120, 100); + public var type:Int=0; + public var T_1:Int=0; + public var T_2:Int=1; + public function new(x:Int,y:Int,_xml:XML,_player:Player) + { + super(x, y); + xml=_xml; + player=_player; + + makeGraphic(1, 1, 0xffffffff); + + FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + portal.makeGraphic(16, 16, 0xffffff00); + portal.visible=false; + + if(parseInt(xml.@frame)==1)type=T_2; + + if(type==T_1){ + text.setText(" \nMove. \n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT] + + "\nESC to\nchange controls.", + true, 0, 0, "center", true); + text.x=10; + text.y=24; + } else if(type==T_2){ + text.setText("Interact. \nUse " + Registry.controls[Keys.IDX_ACTION_1] + " or " + Registry.controls[Keys.IDX_ACTION_2] + + ".\nESC to \nchange controls.", true, 0, 0, "center", true); + //text.scrollFactor=new FlxPoint(0, 0); + text.x=5 + 320;//hehheh + text.y=24; + } + } + + override public function update():Void { + super.update(); + switch(state){ + case S_CONTROL: + update_control(); + break; + case S_CONTROL_2: + update_control_2(); + break; + case S_NORMAL: + if(FlxG.keys.justPressed("SPACE")){ + if(type==T_2) + state=S_CONTROL_2; + else + state=S_CONTROL; + player.dontMove=true; + } + break; + } + + } + public function update_control_2():Void { + + if(recent_key_code !=1000){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + input=FlxG.keys.getKeyName(recent_key_code); + trace(input); + recent_key_code=1000; + if(input=="SPACE"){ + input=" "; + return; + } + } + switch(control_ctr){ + case 0: + text.text="Press what you want\nto use for\naction 1."; + if(input !=" "){ + if(is_valid(Keys.IDX_ACTION_1, input))break; + control_ctr++; + Registry.controls[Keys.IDX_ACTION_1]=input; + } + break; + case 1: + text.text="Press what you want\nto use to for\n action 2\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_ACTION_2, input))break; + control_ctr++; + Registry.controls[Keys.IDX_ACTION_2]=input; + } + break; + case 2: + text.setText("Interact. \nUse " + Registry.controls[Keys.IDX_ACTION_1] + " or " + Registry.controls[Keys.IDX_ACTION_2] + + ".\nESC to \nchange controls.", true, 0, 0, "center", true); + control_ctr=0; + state=S_NORMAL; + player.dontMove=false; + break; + } + input=" "; + return; + } + public function update_control():Void { + if(recent_key_code !=1000){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + input=FlxG.keys.getKeyName(recent_key_code); + trace(input); + recent_key_code=1000; + if(input=="SPACE"){ + input=" "; + return; + } + } + switch(control_ctr){ + case 0: + text.text="Press what you want\nto use to move\nupwards.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_UP, input))break; + control_ctr++; + Registry.controls[Keys.IDX_UP]=input; + } + break; + case 1: + text.text="Press what you want\nto use to move\ndownwards.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_DOWN, input))break; + control_ctr++; + Registry.controls[Keys.IDX_DOWN]=input; + } + break; + case 2: + text.text="Press what you want\nto use to move\nto the left.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_LEFT, input))break; + control_ctr++; + Registry.controls[Keys.IDX_LEFT]=input; + } + break; + case 3: + text.text="Press what you want\nto use to move\nto the right.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_RIGHT, input))break; + control_ctr++; + Registry.controls[Keys.IDX_RIGHT]=input; + } + break; + case 4: + text.setText("Move here with\n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT] + + "\nPress ESC to set\ndifferent controls", + true, 0, 0, "center", true); + control_ctr=0; + state=S_NORMAL; + player.dontMove=false; + break; + + + + } + input=" "; + return; + } + + public function is_valid(index:Int, input:String):Int { + trace("----"); + trace("input:", input); + for(i in 0...index){ + trace(Registry.controls[i]); + if(input=="ESCAPE")return 1; + if(Registry.controls[i]==input)return 1; + } + + return 0; + } + public function reportKeyDown(event:KeyboardEvent):Void { + recent_key_code=event.keyCode; + } + + override public function destroy():Void { + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/Follower_Bro.hx b/AIR/intra/hsrc/entity/enemy/etc/Follower_Bro.hx new file mode 100644 index 0000000..fce06d9 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/Follower_Bro.hx @@ -0,0 +1,84 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Follower_Bro extends FlxSprite +{ + //[Embed(source="../../../res/sprites/npcs/follower_bro.png")] public static var sprite_follower:Class; + public var player_ref:Player; + public var cid:Int=CLASS_ID.FOLLOWER_BRO; + public var xml:XML; + + private var state:Int=0; + private var s_hidden:Int=0; + private var s_walk:Int=1; + private var s_gone:Int=2; + private var s_disappearing:Int=3; + public function new(_xml:XML,p:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + player_ref=p; + xml=_xml; + loadGraphic(sprite_follower, true, false, 16, 24); + addAnimation("walk", [1, 2, 1, 0], 4, true); + alpha=0; + immovable=true; + trace("makin bro"); + if(xml.@alive=="false"){ + state=s_gone; + visible=solid=false; + } + } + override public function update():Void + { + + switch(state){ + case s_hidden: + solid=false; + if(player_ref.y - y<-20){ + player_ref.dontMove=true; + alpha +=0.02; + } + if(alpha>0.96){ + player_ref.dontMove=false; + state=s_walk; + } + break; + case s_walk: + if(FlxG.overlap(player_ref, this))state=s_disappearing; + solid=true; + if(player_ref.y>y){ + velocity.y=velocity.x=0; + frame=1; + } else { + velocity.y=-10; + velocity.x=(player_ref.x>x)? 10:-10; + play("walk"); + } + break; + case s_gone: + return; + case s_disappearing: + alpha -=0.02; + if(alpha<=0){ + visible=solid=false; + } + break; + } + super.update(); + } + + override public function destroy():Void + { + xml.@alive="false"; + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/Red_Walker.hx b/AIR/intra/hsrc/entity/enemy/etc/Red_Walker.hx new file mode 100644 index 0000000..66fbd29 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/Red_Walker.hx @@ -0,0 +1,63 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Red_Walker extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redwalker.png")] public static var sprite_redwalker:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.RED_WALKER; + public var tl:Point; + + public var player:Player; + public function new(_xml:XML,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(sprite_redwalker, true, false, 32, 48); + addAnimation("walk", [0, 1, 2, 3, 4], 5, true); + play("walk"); + + velocity.x=5 + 15 * Math.random(); + _curFrame=Std.int(5 * Math.random()); + player=_player; + immovable=true; + + width=20; + height=8; + offset.x=4; + x +=4; + offset.y=40; + y +=40; + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + + } + + override public function update():Void + { + + FlxG.collide(this, player); + + if(velocity.x>0 && x + width>tl.x + 160){ + velocity.x *=-1; + scale.x *=-1; + } else if(velocity.x<0 && x0)? Registry.volume_scale -=0.01:0; + if(Registry.volume_scale !=0)return; + + if(EventScripts.distance(this, player)<32 && player.state==player.S_GROUND){ + player.be_idle(); + player.state=player.S_INTERACT; + + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_before_fight, Registry.CURRENT_MAP_NAME); + + Registry.sound_data.stop_current_song(); + + substate_ctr++; + } + } else if(substate_ctr==2){ + if(DH.a_chunk_just_finished()){ + substate_ctr++; + play("idle_d"); + play_sfx("warp_out"); + alpha=0; + visible=false; + x=tl.x + 80 - width / 2; + y=tl.y + 24; + } + } else if(substate_ctr==3){ + // relaly bad timing hacks + alpha +=0.008; + if(alpha>=0.4){ + visible=true; + if(alpha<=0.43){ + play_sfx("warp_in"); + } + + if(alpha==1){ + substate_ctr++; + Registry.sound_data.start_song_from_title("SAGEFIGHT"); + Registry.volume_scale=1; + FlxG.flash(0xff000000, 2.18); + FlxG.shake(0.02, 1.5); + } + } + } else if(substate_ctr==4){ + alpha +=0.07; + if(alpha>=1){ + + substate_ctr++; + } + } else if(substate_ctr==5){ + + gt +=FlxG.elapsed; + + if(gt>2.18){ + gt=0; + FlxG.flash(0xff000000, 2.15); + FlxG.shake(0.025, 1.5); + substate_ctr++; + } + } else if(substate_ctr==6){ + gt +=FlxG.elapsed; + + x=tl.x + 40 + 60 * Math.random(); + y=tl.y + 70 - 40 * Math.random(); + + if(gt>2.16){ + gt=0; + FlxG.flash(0xff000000, 2.15); + FlxG.shake(0.03, 1.5); + x=player.x - 2; + y=player.y - 16; + substate_ctr++; + } + + } else if(substate_ctr==7){ + gt +=FlxG.elapsed; + if(gt>2.15){ + gt=0; + + x=tl.x + 80 - width / 2; + y=tl.y + 25; + + FlxG.flash(0xff000000, 6); + FlxG.shake(0.035, 1.7); + substate_ctr++; + alpha=0; + } + } else if(substate_ctr==8){ + alpha +=0.005; + if(alpha==1){ + substate_ctr++; + } + } else { + state=S_ACTIVE; + substate_ctr=0; + active_substate=1; + } + } + + private static inline var s1_vel:Int=50; + private var t_s1:Float=0; + private var tm_s1:Array=new Array(1.6, 1.4, 1.2); + private static inline var s1_max_health:Int=3; + private var s1_health:Int=3; + + /** + * Stage 1:Razors become large razors, sweep vertically, must jump forward to reach and hit sage + */ + private function stage_1():Void { + + var b:FlxSprite; + // Periodically shoot + t_s1 +=FlxG.elapsed; + if(t_s1>tm_s1[s1_max_health - s1_health]){ + b=l_bullets.getFirstAvailable()as FlxSprite; + if(b !=null){ + b.play("spin"); + b.exists=true; + b.x=tl.x + 48 +(64 - b.width)/ 2; + b.y=tl.y + 20; + b.velocity.y=s1_vel; + } + + t_s1=0; + + } + + // Check to destroy some bullets + // Dust or wall + for(b in l_bullets.members){ + if(b !=null && b.exists){ + if(b.y>tl.y + 16 * 9){ + if(b._curAnim.name !="poof"){ + b.play("poof"); + } else { + if(b.finished){ + b.exists=false; + b.velocity.y=0; + } + } + } + } + } + + + // Check to hurt player + + for(b in l_bullets.members){ + if(b !=null && b.exists){ + if(player.state==player.S_GROUND){ + if(b.overlaps(player)&& b._curAnim.name !="poof"){ + player.touchDamage(1); + } + } + + /*if(b.overlaps(dusts.members[0])|| b.overlaps(dusts.members[1])){ + b.play("poof"); + b.exists=false; + b.velocity.y=0; + }*/ + } + } + + // Check if boss hurt + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(1); + play_sfx("hurt"); + s1_health--; + } + + + if(s1_health<=0){ + l_bullets.setAll("x", -1000); + state=S_RESET; + } + } + + + /** + * Stage 2:Razors go to ends of bridge, sage dashes up and down with razors in front and back + */ + private static inline var s2_max_health:Int=3; + private var s2_health:Int=3; + private var s2_dash_vel:Array=new Array(50, 70, 90); + + private var s2_d1:FlxSprite; + private var s2_d2:FlxSprite; + private var s2_set_vel:Bool=false; + + private function stage_2():Void { + // Wait for sage to stop flickering + if(substate_ctr==0){ + if(!flickering){ + substate_ctr++; + } + return; + // Make long dusts appear flicker for a bit + } else if(substate_ctr==1){ + for(i in 0...2){ + var ld:FlxSprite=l_bullets.getFirstAvailable()as FlxSprite; + ld.velocity.x=ld.velocity.y=0; + ld.exists=true; + ld.play("spin"); + ld.x=tl.x + 48 +(64 - ld.width)/ 2; + if(i==0){ + ld.y=tl.y + 16 +(16 - ld.height)/ 2; + } else { + ld.y=tl.y + 8 * 16 +(16 - ld.height)/ 2; + } + ld.flicker(1); + } + substate_ctr ++; + return; + // Start fight when lds stop flickering + } else if(substate_ctr==2){ + ld=l_bullets.getFirstExtant()as FlxSprite; + if(!ld.flickering){ + substate_ctr++; + s2_d1=s_bullets.getFirstAvailable()as FlxSprite; + s2_d1.exists=true; + s2_d2=s_bullets.getFirstAvailable()as FlxSprite; + s2_d2.exists=true; + } + velocity.x=40; + + return; + } + + // Snap dusts to sage + s2_d1.x=x +(width - s2_d1.width)/ 2; + s2_d2.x=x +(width - s2_d2.width)/ 2; + + s2_d1.y=y - 10; + s2_d2.y=y + 12; + + // Dash up and down + if(substate_ctr==3){ // Down + if(!s2_set_vel){ + velocity.y=s2_dash_vel[s2_max_health - s2_health]; + s2_set_vel=true; + play("dash_d"); + } + if(y>tl.y + 16 * 8){ + substate_ctr=4; + s2_set_vel=false; + } + } else if(substate_ctr==4){ + if(!s2_set_vel){ + play("dash_u"); + velocity.y=-s2_dash_vel[s2_max_health - s2_health]; + s2_set_vel=true; + } + if(y0){ + if(x>tl.x + 16 * 7 - 4){ + velocity.x=-40; + } + } else { + if(x=new Array(80, 90, 100, 115); + + private function stage_3():Void { + + // Move to top + // Poof the 4 dusts in order + // Start movin' + switch(substate_ctr){ + case 0: + x=tl.x + 80 - width / 2; + y=tl.y + 25; + substate_ctr++; + + return; + case 1: + s3_t +=FlxG.elapsed; + if(s3_t>1){ + s3_t=0; + substate_ctr++; + s_bullets.setAll("exists", false); + } + return; + // Make the small bullets appear around sage slowly + case 2: + s3_t +=FlxG.elapsed; + if(s3_t>0.8){ + s3_t=0; + var d:FlxSprite=s_bullets.getFirstAvailable()as FlxSprite; + d.exists=true; + d.play("spin"); + Dust.dust_sound.play(); + switch(s3_nr_dusts_made){ + case 0: + s3_d1=d; + s3_d1.y=y - 10 - off; + s3_d1.x=x +(width - s3_d1.width)/ 2; + break; + case 1: + s3_d2=d; + s3_d2.y=y + 12 + off; + s3_d2.x=x +(width - s3_d2.width)/ 2; + break; + case 2: + s3_d3=d; + s3_d3.x=x - 12; + s3_d3.y=y; + break; + case 3: + s3_d4=d; + s3_d4.x=x + 14; + s3_d4.y=y; + break; + } + s3_nr_dusts_made++; + if(s3_nr_dusts_made==4){ + substate_ctr++; + velocity.x=20; + } + } + return; + } + + if(substate_ctr==3){ // Down + if(!s3_set_vel){ + velocity.y=s3_dash_vel[s3_max_health - s3_health]; + s3_set_vel=true; + play("dash_d"); + } + if(y>tl.y + 16 * 8){ + substate_ctr=4; + s3_set_vel=false; + } + } else if(substate_ctr==4){ + if(!s3_set_vel){ + play("dash_u"); + velocity.y=-s3_dash_vel[s3_max_health - s3_health]; + s3_set_vel=true; + } + if(y0){ + if(x>tl.x + 16 * 7 - 4){ + velocity.x=-20; + } + } else { + if(x2){ + s3_dust_osc_t=0; + } + if(s3_dust_osc_t<1){ + r=s3_dust_osc_t; + } else { + r=2 - s3_dust_osc_t; + } + var off:Int=Std.int(r * 34); + s3_d1.x=x +(width - s3_d1.width)/ 2; + s3_d2.x=x +(width - s3_d2.width)/ 2; + s3_d3.x=x - 12 - off; + s3_d4.x=x + 14 + off; + + s3_d1.y=y - 10 - off; + s3_d2.y=y + 12 + off; + s3_d3.y=y; + s3_d4.y=y; + + hit_hurt_logic(); + + if(s3_health<=0){ + state=S_RESET; + substate_ctr=0; + } + + } + + /** + * Stage 4:Lots of small dusts thrown at you. + */ + private var s4_t:Float=0; + private var s4_tm:Float=0.55; + + private var s4_health:Int=3; + private var s4_health_max:Int=3; + private var s4_vel:Array=new Array(50, 60, 70); + + private function stage_4():Void { + if(substate_ctr==0){ + play_sfx("warp_out"); + x=tl.x + 80 - width / 2; + y=tl.y + 38; + velocity.x=velocity.y=0; + substate_ctr++; + return; + } + + var d:FlxSprite; + + s4_t +=FlxG.elapsed; + if(s4_t>s4_tm){ + s4_t=0; + d=s_bullets.getFirstDead()as FlxSprite; + if(d !=null){ + d.exists=d.alive=true; + d.x=tl.x + 4 + 48 + 16 *(int(4 * Math.random())); + d.y=tl.y + 16; + d.velocity.y=s4_vel[s4_health_max - s4_health]; + d.play("shoot"); + } + } + + for(d in s_bullets.members){ + var undo:Bool=false; + if(d !=null && d.alive){ + if(d.overlaps(player)&& player.state !=player.S_AIR){ + undo=true; + player.touchDamage(1); + } + // if(d.overlaps(dusts)){ + // undo=true; + // } + + if(d.y>tl.y + 16 * 9){ + undo=true; + } + + if(undo){ + d.play("poof"); + d.alive=false; + d.velocity.x=d.velocity.y=0; + undo=false; + } + } + } + + if(player.overlaps(this)){ + player.touchDamage(1); + + } + + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(2.5); + play_sfx("hurt"); + s4_health--; + + + /*dusts.members[0].x=tl.x + 48; + dusts.members[1].x=tl.x + 48; + dusts.members[0].y=tl.y + 16 * 7; + dusts.members[1].y=tl.y + 16 * 7; + */ + } + + if(s4_health<=0){ + state=S_RESET; + substate_ctr=0; + } + + + } + + + private function dying_state():Void { + switch(substate_ctr){ + case 0: + Registry.sound_data.stop_current_song(); + play("idle_d"); + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_after_fight); + substate_ctr++; + break; + case 1: + if(DH.a_chunk_just_finished()){ + DH.dont_need_recently_finished(); + substate_ctr=2; + } + break; + case 2: + play("walk_u"); + player.state=player.S_INTERACT; + velocity.y=-20; + substate_ctr=3; + break; + case 3: + if(y + 16latency){ + t_dust=0; + var d:Dust; + for(d in dusts.members){ + if(d.fell_in_hole){ + d.exists=true; + d.fell_in_hole=false; + d.play("unpoof"); + d.flicker(0.5); + var idx:Int=dusts.members.indexOf(d); + d.y=tl.y + 8 * 16; + if(idx==0){ + d.x=tl.x + 48; + } else { + d.x=tl.x + 48 + 48; + } + } + } + }*/ + } + + private function hit_hurt_logic():Void + { + //Check for player hitting sage + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(1); + play_sfx("hurt"); + FlxG.flash(0xff000000, 0.4); + if(active_substate==2){ + s2_health--; + } else if(active_substate==3){ + s3_health--; + } + } + + + // check for player getting hurt(Sage, sage dusts, long dusts) + if(player.overlaps(this)){ + player.touchDamage(1); + } + + var s:FlxSprite; + + if(player.state==player.S_AIR)return; + + for(s in s_bullets.members){ + if(s !=null && s.exists && s.visible){ + if(s.overlaps(player)){ + player.touchDamage(1); + } + } + } + + for(s in l_bullets.members){ + if(s !=null && s.exists){ + if(s.overlaps(player)&& s.visible){ + player.touchDamage(1); + } + } + } + } + + private function poof_small():Void + { + var d:FlxSprite; + for(d in s_bullets.members){ + if(d !=null){ + d.play("poof"); + d.alive=false; + } + } + } + + private function poof_big():Void + { + var d:FlxSprite; + for(d in l_bullets.members){ + if(d !=null){ + d.play("poof"); + d.alive=false; + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/Space_Face.hx b/AIR/intra/hsrc/entity/enemy/etc/Space_Face.hx new file mode 100644 index 0000000..733cb22 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/Space_Face.hx @@ -0,0 +1,66 @@ +package entity.enemy.etc +{ +import entity.interactive.npc.Space_NPC; +import flash.display.InterpolationMethod; +import flash.geom.Point; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +class Space_Face extends AnoSprite +{ + + + public var t_dash:Float=0; + public var tm_dash:Float; + + public var t_calc_angle:Float=0; + public var tm_calc_angle:Float=0.2; + + + public function new(args:Array) + { + super(args); + + loadGraphic(Space_NPC.embed_space_npc,true,false,16,16); + + + dame_frame=parseInt(xml.@frame); + + // MARINA_ANIMS(face) + // Happy + if(dame_frame==0){ + addAnimation("a", [22,23], 6, true); + // Sad + } else if(dame_frame==1){ + addAnimation("a", [20,21], 6); + } + play("a"); + + tm_dash=0.5 + 1.5 * Math.random(); + } + + override public function update():Void + { + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + + if(EventScripts.time_cond(this,"t_dash","tm_dash")){ + EventScripts.scale_vector(this, player, velocity, 55);// dash vel + drag.x=drag.y=15 + 10 * Math.random(); + } + + + super.update(); + } + + override public function destroy():Void + { + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/etc/Wall_Laser.hx b/AIR/intra/hsrc/entity/enemy/etc/Wall_Laser.hx new file mode 100644 index 0000000..edfa837 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/etc/Wall_Laser.hx @@ -0,0 +1,87 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import global.Registry; +import org.flixel.FlxObject; +class Wall_Laser extends FlxSprite +{ + + ////[Embed(source="../../../res/sprites/enemies/wall_laser.png")] public var Wall_Laser_Sprite:Class; + //[Embed(source="../../../../../sfx/laser_charge.mp3")] public var Laser_Charge_Sound:Class; + //[Embed(source="../../../../../sfx/laser_fire.mp3")] public var Laser_Fire_Sound:Class; + + + + public var dir_type:Int;//left, right, down, up + public var local_id:Int; + public var type:String="Wall_Laser"; + public var is_charging:Bool=false; + public var charge_timer:Float=0; + public var laser:FlxSprite=new FlxSprite(); + public var sound_state:Int=0; + public var sound_state_charge:Int=1; + public var sound_state_fire:Int=2; + public var soundObj:FlxSound=new FlxSound(); + + public var cid:Int=CLASS_ID.WALL_LASER; + + public function new(_x:Int , _y:Int, _type:String, _local_id:Int) + { + super(_x , _y); + local_id=_local_id; + //FlxG.visualDebug=true; + if(_type.indexOf("left")!=-1){ + dir_type=FlxObject.LEFT; + //loadGraphic(Wall_Laser_Sprite, true, false, 16, 16); + addAnimation("blink", [0, 1], 4, true); + addAnimation("charge", [1, 2, 1, 3], 6, true); + } + laser=new FlxSprite(x - Registry.SCREEN_WIDTH_IN_PIXELS, y); + laser.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, 16, 0xffffffff); + laser.visible=false; + laser.solid=false; + play("blink"); + } + + override public function update():Void { + if(is_charging){ + play("charge"); + if(sound_state==0){ + sound_state=sound_state_charge; + soundObj.loadEmbedded(Laser_Charge_Sound, false); + soundObj.play(); + } + charge_timer +=FlxG.elapsed; + } else { + play("blink"); + } + if(charge_timer>1.5){ + //BOOM! + if(sound_state==sound_state_charge){ + soundObj.stop(); + sound_state=sound_state_fire; + soundObj.loadEmbedded(Laser_Fire_Sound, false); + soundObj.play(); + } + laser.visible=true; + if(charge_timer>3){ + charge_timer=0; + sound_state=0; + is_charging=false; + laser.visible=false; + } + } + super.update(); + } + + public function touches(sprite:FlxSprite):Void { + if(dir_type==FlxObject.LEFT || dir_type==FlxObject.RIGHT){ + if(sprite.y>(y - sprite.height)&& sprite.y<(y + height)){ + is_charging=true; + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/hotel/Burst_Plant.hx b/AIR/intra/hsrc/entity/enemy/hotel/Burst_Plant.hx new file mode 100644 index 0000000..9715f19 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/hotel/Burst_Plant.hx @@ -0,0 +1,212 @@ +package entity.enemy.hotel +{ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Burst_Plant extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var bullets:FlxGroup=new FlxGroup(8); + private var added_to_parent:Bool=false; + + private var t_timeout:Float=0; + private var tm_timeout:Float=1; + + + private var t_hurt:Float=0; + private var tm_hurt:Float=1.0; + + + private var state:Int=0; + private var s_idle:Int=0; + private var s_charge:Int=1; + private var t_charge:Float=0; + private var tm_charge:Float=0.5; + private var s_shoot:Int=2; + private var s_dying:Int=3; + private var s_dead:Int=4; + public var cid:Int=CLASS_ID.BURSTPLANT; + private var max_x_vel:Int=50; + + private var init_latency:Float=0.4; + + + //[Embed(source="../../../res/sprites/enemies/hotel/burst_plant.png")] public static var burst_plant_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/burst_plant_bullet.png")] public static var burst_plant_bullet_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Burst Plant Anims */ + loadGraphic(burst_plant_sprite, true, false, 16, 16); + addAnimation("idle", [0], 1); + addAnimation("charge", [0, 1], 8); + addAnimation("shoot", [3]); + play("idle"); + + for(i in 0...bullets.maxSize){ + /* Bullet and bullet shadow anims */ + var bullet:FlxSprite=new FlxSprite(); + bullet.loadGraphic(burst_plant_bullet_sprite, true, false, 8, 8); + bullet.addAnimation("move", [0, 1], 12); + bullet.addAnimation("explode", [2, 3, 4,4], 10, false); + bullet.play("move"); + + bullet.my_shadow=new FlxSprite(); + bullet.my_shadow.loadGraphic(Common_Sprites.shadow_sprite_8_8, true, false, 8, 8); + bullet.my_shadow.addAnimation("get_big", [0, 1, 2, 3], 8, false); + bullet.my_shadow.addAnimation("get_small", [3, 2, 1, 0], 8, false); + bullet.my_shadow.play("get_big"); + + bullets.add(bullet); + bullet.parabola_thing=new Parabola_Thing(bullet, 24 + Std.int(10 * Math.random()), 0.7 + Math.random(), "offset", "y"); + bullet.velocity.x=10; + } + + tm_timeout=0.4 + Math.random(); + + health=2; + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + add_sfx("shoot", Registry.sound_data.bubble_triple_group); + add_sfx("pop", Registry.sound_data.four_shooter_pop_group); + } + + override public function update():Void + { + + if(!added_to_parent){ + added_to_parent=true; + parent.fg_sprites.add(bullets); + for(var b:FlxSprite in bullets.members){ + parent.bg_sprites.add(b.my_shadow); + } + } + + if(init_latency>0){ + init_latency -=FlxG.elapsed; + return; + } + + //get hurt and transition to dying if needed + if((t_hurt>tm_hurt)&& player.broom.visible && player.broom.overlaps(this)){ + if(state !=s_dying && state !=s_dead){ + health--; + play_sfx(HURT_SOUND_NAME); + t_hurt=0; + flicker(tm_hurt); + if(health<=0){ + state=s_dying; + } + } + } else { + t_hurt +=FlxG.elapsed; + } + + var subctr:Int=0; + var bullet:FlxSprite; + if(state==s_idle){ //wait a bit before charging + t_timeout +=FlxG.elapsed; + if(t_timeout>tm_timeout){ + play("charge"); + state=s_charge; + t_timeout=0; + tm_timeout=0.4 + Math.random(); + } + } else if(state==s_charge){ + t_charge +=FlxG.elapsed;//charge + if(t_charge>tm_charge){ + for(bullet in bullets.members){ //init pos, vel etc - randomized a bit of course + bullet.x=bullet.my_shadow.x=x + 5; + bullet.y=bullet.my_shadow.y=y + 6; + + bullet.exists=bullet.my_shadow.exists=true; + bullet.parabola_thing.reset_time(); + bullet.play("move"); + bullet.my_shadow.play("get_small"); + bullet.parabola_thing.set_shadow_fall_animation("get_big");// Reset the bullet fall anim thing + + var sign:Int=Math.random()>0.5 ? -1:1; + max_x_vel=10 + 30 * Math.random(); + if(subctr>0){ + bullet.velocity.x=-max_x_vel + 2 * max_x_vel * Math.random(); + bullet.velocity.y=sign * Math.sqrt(max_x_vel * max_x_vel - bullet.velocity.x * bullet.velocity.x); + } else { //one bullet tries to hit the player + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), bullet.velocity, 2.5 * max_x_vel); + bullet.parabola_thing.period=1.5; + } + subctr++; + } + t_charge=0; + state=s_shoot; + play("shoot"); + play_sfx("shoot"); + } + } else if(state==s_shoot){ + for(bullet in bullets.members){ //move the bullets' offsets + bullet.my_shadow.x=bullet.x; + bullet.my_shadow.y=bullet.y; + if(bullet.parabola_thing.tick()){ + //do something + subctr++; + if(bullet.exists){ // If bullet hits ground, explode + bullet.my_shadow.exists=false; + bullet.play("explode"); + bullet.velocity.x=bullet.velocity.y=0; + + if(bullet.frame==bullet._curAnim.frames.length - 1){ + bullet.exists=false; + play_sfx("pop"); + } + } + } + if(bullet.offset.y<=4){ + if(!player.invincible && player.overlaps(bullet)&& bullet.velocity.x !=0){ + player.touchDamage(1); + } + } + + } + if(subctr==bullets.maxSize){ + play("idle"); + state=s_idle; + } + } else if(state==s_dying){ + //die, sfx... + //timer... + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + xml.@alive="false"; + } else if(state==s_dead){ + bullets.setAll("exists", false); + for(bullet in bullets.members){ + bullet.my_shadow.exists=false; + } + + + exists=false; + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/hotel/Dustmaid.hx b/AIR/intra/hsrc/entity/enemy/hotel/Dustmaid.hx new file mode 100644 index 0000000..df04b7d --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/hotel/Dustmaid.hx @@ -0,0 +1,161 @@ +package entity.enemy.hotel +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Dustmaid extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var state:Int=0; + private var s_idle:Int=0; + private var s_chasing:Int=1; + private var s_dying:Int=2; + private var s_dead:Int=3; + + private var ctr:Int=0; + private var freq:Int=10; + + private var player_pt:Point=new Point(); + private var pt:Point=new Point(); + + private var t_hit:Float=0; + private var tm_hit:Float=1.0; + public var cid:Int=CLASS_ID.DUSTMAID; + //[Embed(source="../../../res/sprites/enemies/hotel/dustmaid.png")] public static var dustmaid_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + health=3; + state=s_idle; + alpha=0.7; + + loadGraphic(dustmaid_sprite, true, false, 16, 24); + width=8; + height=18; + centerOffsets(true); + offset.x +=1; + offset.y +=2; + addAnimation("idle", [0],1); + addAnimation("turn_dark", [1,2,1,2],12,false); + addAnimation("move_r", [5,6],7); + addAnimation("move_l", [5,6],7); + addAnimation("move_d", [3,4],7); + addAnimation("move_u", [7,8],7); + play("idle"); + + add_sfx("alert", Registry.sound_data.dustmaid_alert); + + } + override public function preUpdate():Void + { + FlxG.collide(this, parent.curMapBuf); + super.preUpdate(); + } + override public function update():Void + { + + if(state !=s_dying && !player.invincible && player.overlaps(this)){ + if(state !=s_dead){ + player.touchDamage(1); + } + } + + t_hit +=FlxG.elapsed; + if(health>0 && player.broom.visible && state==s_chasing && player.broom.overlaps(this)){ + if(t_hit>tm_hit){ + flicker(1); + t_hit=0; + health--; + play_sfx(HURT_SOUND_NAME); + if(health==0){ + state=s_dying; + } + if(state==s_idle){ + state=s_chasing; + play("turn_dark"); + } + } + } + + + if(state==s_idle){ + if(player.broom.has_dust){ + state=s_chasing; + play("turn_dark"); + alpha=1; + play_sfx("alert"); + } + + } else if(state==s_chasing){ + if(_curAnim.name=="turn_dark"){ + if(_curFrame==_curAnim.frames.length - 1){ + } else { + return; + } + } + if(ctr==freq){ + ctr=0; + player_pt.x=player.x; + player_pt.y=player.y; + pt.x=x; + pt.y=y; + scale.x=1; + offset.x=5; + switch(EventScripts.get_entity_to_entity_dir(pt.x, pt.y, player_pt.x, player_pt.y)){ + case UP: + play("move_u"); + offset.x=1; + break; + case LEFT: + scale.x=-1; + play("move_l"); + break; + case RIGHT: + play("move_r"); + break; + case DOWN: + play("move_d"); + break; + } + EventScripts.scale_vector(pt, player_pt, velocity, 20); + } + + ctr++; + + + } else if(state==s_dying){ + //play dying + //sfx dying + //alpha -=0.04; + alpha=0; + if(alpha==0){ + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + Registry.GRID_ENEMIES_DEAD++; + state=s_dead; + } + } else if(state==s_dead){ + exists=false; + } + + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/hotel/Eye_Boss.hx b/AIR/intra/hsrc/entity/enemy/hotel/Eye_Boss.hx new file mode 100644 index 0000000..5c73995 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/hotel/Eye_Boss.hx @@ -0,0 +1,751 @@ +package entity.enemy.hotel +{ +import data.Common_Sprites; +import entity.gadget.Dust; +import entity.player.HealthBar; +import entity.player.Player; +import flash.geom.Point; +import flash.text.engine.BreakOpportunity; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; + +class Eye_Boss extends FlxSprite +{ + + public var xml:XML; + private var parent:Dynamic; + private var player:Player; + private var tl:Point=new Point(); + + private var hitbox:FlxSprite; + + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_water.png")] public static var eye_boss_water_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_bullet.png")] public static var eye_boss_bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_splash.png")] public static var eye_boss_splash_sprite:Class; + + + private var did_init:Bool=false; + + public static var global_state:Int=0; + public static var gs_new:Int=0; + public var gs_land:Int=1; + public var gs_water:Int=2; + public var gs_dead:Int=3; + public var gs_transition_to_land:Int=4; + + + public static var cur_health:Int; + private var max_health:Int=12; + private var phase_2_health:Int=6; + private var ctr:Int=0; + public var state:Int=0; + + /* Land state var s*/ + + private var s_land_pace:Int=0; + private var s_land_shoot:Int=1; + private var s_land_charge:Int=2; + private var s_land_dying:Int=3; + private var s_land_dead:Int=4; + + private var t_pace:Float=0; + private var tm_pace:Float=1; + + private var t_shoot:Float=0; + private var tm_shoot:Array=new Array(1, 1, 0.9, 0.8, 0.7, 0.65); + + private var grp_land_splashes:FlxGroup=new FlxGroup(18); + + private var base_pt:Point=new Point(); + private var rel_coords:Point=new Point(1, 1); + + private var land_hitbox:FlxSprite=new FlxSprite; + + /* Water state vars */ + private var Intro_ctr:Int=0; + private var s_water_intro:Int=-1; + private var s_water_waiting:Int=0; + private var s_water_moving:Int=3; + private var s_water_dying:Int=1; + private var s_water_dead:Int=2; + private var s_water_blinded:Int=4; + private var s_water_leaving:Int=5; + + + private var grp_water_bullets:FlxGroup=new FlxGroup(8); + private var vel_water_bullet:Int=70; + private var t_blink:Float=0; + private var tm_blink:Array=new Array(1.1, 0.95, 0.9, 0.8, 0.7, 0.65); + + private var move_vel:Float=100; + private var t_move:Float=0; + private var tm_move:Float=0.8; + + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + parent=_parent; + player=_player; + tl.x=Registry.CURRENT_GRID_X*160 + 16; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT + 16; + + super(parseInt(xml.@x), parseInt(xml.@y)); + + // Set hitboxes/sprites + if(global_state==gs_water || global_state==gs_new){ + hitbox=this; + } else { + land_hitbox.makeGraphic(24, 11, 0xff123123); + hitbox=land_hitbox; + } + + loadGraphic(eye_boss_water_sprite, true, false, 24, 24); + parabola_thing=new Parabola_Thing(this, 16, 0.6, "offset", "y"); + my_shadow=new FlxSprite; + my_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + + /* Water anims for Eye */ + addAnimation("blink", [0, 1, 2, 3, 2, 1, 0], 10, false); + addAnimation("blink_fast", [0, 1, 2, 3, 2, 1], 20, true); + addAnimation("idle", [0]); + addAnimation("closed", [3]); + addAnimation("open", [3, 2, 1, 0],5); + /* Land anims for Eye(same spritesheet a water anims)*/ + addAnimation("walk", [4, 5], 6); + addAnimation("blink_land", [5, 6, 7, 6, 5,5], 6,false); + + for(i in 0...grp_water_bullets.maxSize){ + var b:FlxSprite=new FlxSprite; + /* Bullet and bullet shadow anims */ + b.loadGraphic(eye_boss_bullet_sprite, true, false, 16, 16); + b.addAnimation("move", [0, 1], 12); + b.addAnimation("pop", [2, 3, 4, 5], 12, false); + b.addAnimation("move_land", [6, 7], 12); + b.addAnimation("pop_land", [2, 3, 4, 5], 24, false); + + b.play("move"); + b.width=b.height=8; + b.centerOffsets(true); + + b.my_shadow=EventScripts.make_shadow("8_small",true); + b.my_shadow.exists=false; + b.my_shadow.visible=true; + b.my_shadow.play("get_big"); + + b.parabola_thing=new Parabola_Thing(b, 45, 1.5, "offset", "y"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + grp_water_bullets.add(b); + } + grp_water_bullets.setAll("exists", false); + grp_water_bullets.setAll("alive", false); + + + for(i=0;itl.y && alpha==1 && framePixels_y_push==22){ + velocity.y=0; + play("walk"); + framePixels_y_push=0; + my_shadow.visible=true; + Registry.sound_data.play_sound_group(Registry.sound_data.bubble_triple_group); + ctr++; + } + } else if(ctr==1){ + offset.y +=1.5; + if(offset.y>90){ + ctr++; + y=tl.y + 75; + x=tl.x + 16; + Registry.sound_data.fall1.play(); + + } + } else if(ctr==2){ + offset.y -=3; + if(offset.y<=0){ + offset.y=0; + FlxG.shake(0.03, 0.5); + global_state=gs_land; + state=s_land_pace; + my_shadow.visible=false; + + base_pt.x=x - 16; + base_pt.y=y - 16; + } + + } + + } + + private var land_ctr:Int=0; + + private function do_land():Void { + hitbox.x=x; + hitbox.y=y +(height - hitbox.height); + + var b:FlxSprite; + if(state==s_land_pace){ + + // Occasionally shoot a big bullet. + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot[phase_2_health - health]){ + t_shoot=0; + play("blink_land"); + play_sfx("land_shoot"); + shoot_big_bullet(); + } + + if(_curAnim.name=="blink_land" && _curAnim.frames.length - 1==_curFrame){ + play("walk"); + } + + // Pace about a small 3x3 grid of points + t_pace +=FlxG.elapsed; + + if(t_pace>tm_pace){ + t_pace=0; + var r:Float=Math.random(); + if(r<0.7){ + rel_coords.x=Std.int(3 * Math.random()); + rel_coords.y=Std.int(3 * Math.random()); + } else { + + } + } + EventScripts.send_property_to(this, "x", base_pt.x + rel_coords.x * 16, 1); + EventScripts.send_property_to(this, "y", base_pt.y + rel_coords.y * 16, 1); + + // Get hurt by the player maybe + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + ctr=0; + get_hurt(); + play_sfx(HURT_SOUND_NAME); + if(player.x>x){ + ctr=1; + velocity.x=-20; + my_shadow.exists=true; + my_shadow.x=x; + my_shadow.y=y +(height - my_shadow.height); + } + state=s_land_charge; + } + + } else if(state==s_land_charge){ + if(ctr==0){ // Charge to the right side + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "x", tl.x + 16 * 8 - width, 1.7))sub_ctr++; + if(EventScripts.send_property_to(this, "y", tl.y + 57, 1))sub_ctr++; + if(sub_ctr==2){ //Shoot some bullets when hitting the wall + FlxG.shake(0.05, 0.3); + play_sfx("hit_ground"); + for(j in 0...3){ + shoot_big_bullet(); + } + state=s_land_pace; + } + } else if(ctr==1){ // If hit from the front hop back a bit + my_shadow.visible=true; + my_shadow.x=x; + my_shadow.y=y +(height - my_shadow.height); + if(offset.y>=10){ + my_shadow.frame=2; + } else if(offset.y>=6){ + my_shadow.frame=3; + } else { + my_shadow.frame=4; + } + if(parabola_thing.tick()){ + offset.y=0; + ctr=0; + play_sfx("bounce"); + parabola_thing.reset_time(); + my_shadow.visible=false; + + } + } + } else if(state==s_land_dying){ + player.invincible_timer=0.3; + if(DH.scene_is_finished(DH.name_eyeboss, DH.scene_eyeboss_after_fight)){ + + if(land_ctr==0){ + ctr=0; + land_ctr=1; + offset.x=5; + offset.y=5; + } else if(land_ctr==1){ + t_blink +=FlxG.elapsed; + if(t_blink>0.3){ + x +=(-4 + 8 * Math.random()); + y +=(-4 + 8 * Math.random()); + EventScripts.make_explosion_and_sound(this); + t_blink=0; + ctr +=1; + if(ctr>=10){ + land_ctr=2; + FlxG.flash(0xffffffff, 2); + Registry.sound_data.sun_guy_death_l.play(); + visible=false; + } + } + } else { + my_shadow.exists=false; + if(grp_land_splashes.countLiving()==0){ + if(grp_water_bullets.countLiving()==0){ + state=s_land_dead; + exists=false; + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]=true; + Registry.sound_data.start_song_from_title("HOTEL"); + global_state=gs_dead; + xml.@alive="false"; + } + } + } + + } else { + if(!DH.scene_is_dirty(DH.name_eyeboss, DH.scene_eyeboss_after_fight)){ + DH.start_dialogue(DH.name_eyeboss, DH.scene_eyeboss_after_fight); + Registry.sound_data.stop_current_song(); + FlxG.flash(0xffffffff, 1); + velocity.x=velocity.y=0; + Registry.sound_data.sun_guy_death_l.play(); + } + } + } + + + // Update "bombs" + for(b in grp_water_bullets.members){ + if(b.exists){ + b.my_shadow.x=b.x; + b.my_shadow.y=b.y; + + if(b.offset.y<7 && !player.invincible && player.overlaps(b)){ + player.touchDamage(1); + } + + + if(b.parabola_thing.tick()){ + b.play("pop_land"); + + if(b._curAnim.frames.length - 1==b._curFrame){ + b.parabola_thing.reset_time(); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.exists=b.alive=b.my_shadow.exists=false; + b.velocity.x=b.velocity.y=0; + play_sfx("unpop"); + // Make little splash sprites and move them sort of randomly + for(i in 0...4 ++){ + var splash:FlxSprite=grp_land_splashes.getFirstDead()as FlxSprite; + if(splash==null)break; + splash.play("move"); + splash.my_shadow.play("get_small"); + splash.x=b.x; + splash.y=b.y; + splash.alive=splash.exists=splash.my_shadow.exists=true; + splash.velocity.x=-20 + 40 * Math.random(); + splash.velocity.y=Math.sqrt(20 * 20 - Math.pow(splash.velocity.x, 2)); + Math.random()>0.5 ? splash.velocity.y *=-1:1; + } + } + } + } + } + + // Update slow-you-down-splashes - mostly boilerplate + + for(b in grp_land_splashes.members){ + if(b.exists){ + if(b.offset.y<9 && !player.invincible && player.overlaps(b)){ + //player.touchDamage(1); + Registry.sound_data.play_sound_group(Registry.sound_data.bubble_group); + b.my_shadow.exists=false; + player.slow_mul=0.3; + player.slow_ticks=100; + } + b.my_shadow.x=b.x; + b.my_shadow.y=b.y; + if(b.parabola_thing.tick()){ + b.play("explode"); + if(b._curAnim.frames.length - 1==b._curFrame){ + b.parabola_thing.reset_time(); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.alive=b.exists=b.my_shadow.exists=false; + b.velocity.x=b.velocity.y=0; + play_sfx("pop"); + } + } + } + } + + // Hit the player + + if(state !=s_land_dying && !player.invincible && player.overlaps(hitbox)&& state !=s_land_dead){ + player.touchDamage(1); + } + + if(health<=0){ + + state=s_land_dying; + } + + /* Occasionally charge */ + } + + private function do_water():Void { + var bullet:FlxSprite; + + switch(state){ + case s_water_intro: + if(intro_ctr==0){ + Registry.volume_scale -=0.007; + if(player.y>tl.y + 24 && player.state !=player.S_AIR){ + if(!DH.scene_is_dirty(DH.name_eyeboss, DH.scene_eyeboss_before_fight)){ + DH.start_dialogue(DH.name_eyeboss, DH.scene_eyeboss_before_fight); + player.be_idle(); + } + + if(!DH.scene_is_finished(DH.name_eyeboss, DH.scene_eyeboss_before_fight)){ + super.update(); + return; + } + play("open"); + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + state=s_water_moving; + } + } + break; + case s_water_waiting: + if(EventScripts.bounce_in_box(hitbox, tl.x + 16 * 7 + 4, tl.x + 12, tl.y + 16 * 8, tl.y + 16)!=0){ + play_sfx("bounce"); + } + // Timeout for launching a bullet + t_blink +=FlxG.elapsed; + if(t_blink>tm_blink[max_health - health]){ + + t_blink=0; + bullet=grp_water_bullets.getFirstDead()as FlxSprite; + if(bullet==null)break; + bullet.exists=true; + bullet.alive=true; + bullet.play("move"); + play("blink"); + + play_sfx("shoot"); + bullet.velocity.x=bullet.velocity.y=50; + bullet.x=x;bullet.y=y; + } + + // If harmed, bounce about the room, initially away from player + // Or if at low enough health, move to land + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + play_sfx(HURT_SOUND_NAME); + get_hurt(); + if(health<=phase_2_health){ + water_death_logic(); + } else { + state=s_water_moving; + } + play("closed", true); + velocity.x=Math.min(20, move_vel * Math.random()); + velocity.y=Math.sqrt(move_vel * move_vel - velocity.x * velocity.x); + + player.facing==UP ? velocity.y *=-1:1; + player.facing==LEFT ? velocity.x *=-1:1; + } + + break; + case s_water_moving: + // Bounce in a box. + if(EventScripts.bounce_in_box(hitbox, tl.x + 16 * 7 + 4, tl.x + 12, tl.y + 16 * 8, tl.y + 16)!=0){ + play_sfx("bounce"); + } + if(!player.invincible && hitbox.overlaps(player)){ + player.touchDamage(1); + } + // After a timeout, return back to drifting state, + // speed based on current health + t_move +=FlxG.elapsed; + if(t_move>tm_move){ + t_move=0; + velocity.x=velocity.y=(max_health - health)* 15; + play("blink"); + state=s_water_waiting; + } + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + get_hurt(); + play_sfx(HURT_SOUND_NAME); + if(health<=phase_2_health){ + water_death_logic(); + } else { + t_move=0; + velocity.x *=1.5; + velocity.y *=1.5; + } + } + + // If hit, reset the timeout and bounce even faster. + + break; + case s_water_leaving: + velocity.x=0; + //play smoe harmed animation + velocity.y=40; + if(y>tl.y + 16 * 6){ + framePixels_y_push++; + alpha -=0.05; + if(alpha==0){ + Registry.GRID_PUZZLES_DONE++; + global_state=gs_transition_to_land; + exists=false; + } + } + break; + } + + for(bullet in grp_water_bullets.members){ + if(bullet==null || !bullet.alive)continue; + if(!player.invincible && bullet.overlaps(player)&& player.state !=player.S_AIR){ + player.touchDamage(1); + bullet.play("pop"); + bullet.alive=false; + bullet.velocity.x=bullet.velocity.y=0; + play_sfx("poof"); + } + + if(player.broom.visible && player.broom.overlaps(bullet)){ + bullet.play("pop"); + bullet.alive=false; + bullet.velocity.x=bullet.velocity.y=0; + play_sfx("poof"); + } + + EventScripts.bounce_in_box(bullet, tl.x + 16 * 8, tl.x, tl.y + 16 * 9, tl.y); + } + } + + //intro stuff, transitions to water + private function do_new():Void { + global_state=gs_water; + } + + private function water_death_logic():Void + { + velocity.x=0; + state=s_water_leaving; + EventScripts.drop_big_health(x, y, 1); + cur_health=health; + for(var bullet:FlxSprite in grp_water_bullets.members){ + bullet.play("pop"); + bullet.alive=false; + } + } + + private function get_hurt():Void + { + health--; + if(global_state==gs_land){ + flicker(1.0); + } else { + flicker(2.3); + } + + } + + private function shoot_big_bullet():Void + { + var b:FlxSprite=grp_water_bullets.getFirstDead()as FlxSprite; + if(b==null)return; + b.play("move_land"); + b.my_shadow.play("get_small"); + b.alive=b.exists=b.my_shadow.exists=true; + b.x=x + width; + b.y=y + 2; + EventScripts.scale_vector(new Point(x + width, y + 4), new Point(player.x, player.y), b.velocity,(EventScripts.distance(player, this)- width)/ b.parabola_thing.period); + b.velocity.y +=5 * Math.random(); + b.velocity.x +=5 * Math.random(); + + } + + override public function destroy():Void + { + cur_health=health; + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/hotel/Steam_Pipe.hx b/AIR/intra/hsrc/entity/enemy/hotel/Steam_Pipe.hx new file mode 100644 index 0000000..8bd67a0 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/hotel/Steam_Pipe.hx @@ -0,0 +1,207 @@ +package entity.enemy.hotel +{ +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Steam_Pipe extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var dame_frame:Int; + private var added_to_parent:Bool=false; + + private var eject_pt:Point; + private var eject_vel:Int=50; + public var steam_clouds:FlxGroup=new FlxGroup(6); + public var timers:Array; + private var PUSH_VEL:Int=50; + + + private var active_region:FlxSprite=new FlxSprite(); + private var disabled:Bool=false; + + + //dame frames - DRUL + + //[Embed(source="../../../res/sprites/enemies/hotel/steam_pipe.png")] public static var steam_pipe_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/steam.png")] public static var steam_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(steam_pipe_sprite, true, false, 16, 16); + dame_frame=parseInt(xml.@frame); + + // Set directions and active regions(where you are pushed), and ejection points for the steam clouds + /* ADD ANIMATIONS FOR STEAM PIPE(if any)*/ + switch(dame_frame){ + case 0: + eject_pt=new Point(x + 2, y + Registry.HEADER_HEIGHT + 10); + active_region=new FlxSprite(x + 3, y + 16 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(10, 16, 0xff123123); + frame=0;facing=DOWN; + break; + case 1: + eject_pt=new Point(x + 14, y + 5 + Registry.HEADER_HEIGHT); + active_region=new FlxSprite(x + 16, y + Registry.HEADER_HEIGHT + 3); + active_region.makeGraphic(16, 10, 0xff123123); + addAnimation("do_something", [1], 12); + frame=1;facing=RIGHT; + break; + case 2: + eject_pt=new Point(x + 3, y - 2 + Registry.HEADER_HEIGHT); + frame=2;facing=UP; + active_region=new FlxSprite(x + 3, y + Registry.HEADER_HEIGHT - 16); + active_region.makeGraphic(10, 16, 0xff123123); + addAnimation("do_something", [2], 12); + break; + case 3: + eject_pt=new Point(x - 6, y + 3 + Registry.HEADER_HEIGHT); + frame=3;facing=LEFT; + active_region=new FlxSprite(x - 16, y + Registry.HEADER_HEIGHT + 3); + active_region.makeGraphic(16, 10, 0xff123123); + addAnimation("do_something", [3], 12); + break; + } + play("do_something"); + + active_region.visible=false; + + timers=new Array(steam_clouds.maxSize); + + + //Randomize the size of the clouds a little + /* ADD ANIMATIONS FOR STEAM CLOU */ + for(i in 0...steam_clouds.maxSize){ + var steam_cloud:FlxSprite=new FlxSprite(); + steam_cloud.loadGraphic(steam_sprite, true, false, 16, 16); + steam_cloud.addAnimation("s", [0, 1], 10); + steam_cloud.play("s"); + //steam_cloud.flicker(-1); + steam_clouds.add(steam_cloud); + steam_cloud.x=eject_pt.x; + steam_cloud.y=eject_pt.y; + steam_cloud.scale.x=steam_cloud.scale.y=0.8 + 0.2 * Math.random(); + steam_cloud.width=steam_cloud.height=width * steam_cloud.scale.x; + //steam_cloud.angle=360 * Math.random(); + timers[i]=30 + Std.int(20 * Math.random());//Timeouts for steam clouds to reset + set_vel(steam_cloud); + } + + add_sfx("pew", Registry.sound_data.fireball_group); + + } + + override public function update():Void + { + if(!added_to_parent){ + added_to_parent=true; + parent.bg_sprites.add(active_region); + parent.fg_sprites.add(steam_clouds); + } + + // dust on the active region disables the pushing effect + disabled=false; + for(var dust:Dust in Registry.subgroup_dust){ + if(dust !=null){ + if(dust.overlaps(active_region)&&(dust.frame !=Dust.EMPTY_FRAME)&&(dust !=player.raft)){ + disabled=true; + } + } + } + + for(var gas:FlxSprite in Registry.subgroup_gas){ + if(gas !=null){ + for(var steam_cloud:FlxSprite in steam_clouds.members){ + if(steam_cloud !=null){ + if(gas.overlaps(steam_cloud)){ + gas.velocity.x +=0.01 * steam_cloud.velocity.x; + gas.velocity.y +=0.01 * steam_cloud.velocity.y; + } + } + } + } + } + + var ctr:Int=0; + //Change timers for the visual effect of steam spewing forth, or being held by the dust + for(var steam:FlxSprite in steam_clouds.members){ + timers[ctr]--; + if(timers[ctr]==0){ + if(!disabled){ + timers[ctr]=30 + Std.int(20 * Math.random()); + } else { + timers[ctr]=3 + Std.int(2 * Math.random()); + } + steam.x=eject_pt.x; + steam.y=eject_pt.y; + set_vel(steam); + play_sfx("pew"); + } + ctr++; + + if(disabled==false){ + if(steam.overlaps(player)){ + pushplayer(); + } + } + } + + // Push the player if the pipe isn't disabled, and player touches active region + if(!disabled){ + if(player.overlaps(active_region)){ + pushplayer(); + } + } + + super.update(); + } + + //randomize velocity of clouds within certain ranges + private function set_vel(steam_cloud:FlxSprite):Void + { + switch(facing){ + case DOWN: + steam_cloud.velocity.y=eject_vel + 20 * Math.random(); + steam_cloud.velocity.x=-30 + 60 * Math.random(); + break; + case UP: + steam_cloud.velocity.y=-eject_vel - 20 * Math.random(); + steam_cloud.velocity.x=-30 + 60 * Math.random(); + break; + case LEFT: + steam_cloud.velocity.x=-eject_vel - 20 * Math.random(); + steam_cloud.velocity.y=-30 + 60 * Math.random(); + break; + case RIGHT: + steam_cloud.velocity.x=eject_vel + 20 * Math.random(); + steam_cloud.velocity.y=-30 + 60 * Math.random(); + break; + } + } + + private function pushplayer():Void + { + switch(facing){ + case DOWN: + player.additional_y_vel=PUSH_VEL;break; + case UP: + player.additional_y_vel=-PUSH_VEL;break; + case LEFT: + player.additional_x_vel=-PUSH_VEL;break; + case RIGHT: + player.additional_x_vel=PUSH_VEL;break; + + } + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/redcave/Four_Shooter.hx b/AIR/intra/hsrc/entity/enemy/redcave/Four_Shooter.hx new file mode 100644 index 0000000..6ad1a03 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/redcave/Four_Shooter.hx @@ -0,0 +1,189 @@ +package entity.enemy.redcave +{ +/** + * ... + * @author Seagaia + */ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import mx.core.FlexSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import states.PlayState; +class Four_Shooter extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redcave/f_four_shooter.png")] public static var four_shooter_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/f_four_shooter_bullet.png")] public static var four_shooter_bullet_sprite:Class; + + + + public var cid:Int=CLASS_ID.FOUR_SHOOTER; + public var xml:XML; + public var timer_max:Float=1.5; + public var timer:Float=timer_max; + public var state:Int=0; + public var S_STRAIGHT:Int=0; + public var S_DIAG:Int=1; + public var bullets:FlxGroup; + public var NR_BULLETS:Int=12; + public var parent:PlayState; + public var VEL:Int=50; + public var player:Player; + public function new(_xml:XML, _parent:PlayState, _player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + bullets=new FlxGroup(); + for(i in 0...NR_BULLETS){ + var bullet:FlxSprite=new FlxSprite(0, 0); + /* Animations for bullets */ + bullet.loadGraphic(four_shooter_bullet_sprite, true, false, 8, 8); + bullet.addAnimation("move", [0, 1], 12, true); + bullet.addAnimation("explode", [2, 3], 10, false); + + bullet.play("move"); + bullet.has_tile_callbacks=false; + bullets.add(bullet); + bullet.width=bullet.height=4; + bullet.offset.x=bullet.offset.y=2; + } + immovable=true; + bullets.setAll("alive", false); + parent=_parent; + parent.otherObjects.push(bullets); + player=_player; + + /* Animations for four_shooter */ + loadGraphic(four_shooter_sprite, true, false, 16, 16); + addAnimation("nesw", [0]); + addAnimation("shoot_then_nesw_to_diag", [0, 1, 2, 2], 3, false); + addAnimation("diag", [2]); + addAnimation("shoot_then_diag_to_nesw", [2, 1, 0, 0], 3, false); + play("nesw"); + + add_sfx("shoot", Registry.sound_data.four_shooter_shoot_group); + add_sfx("pop", Registry.sound_data.four_shooter_pop_group); + + + } + + override public function update():Void + { + FlxG.collide(player, this); + timer -=FlxG.elapsed; + if(timer<0){ + timer=timer_max; + shoot(); + rotate(); + } else { + if(_curAnim.frames.length - 1==_curFrame){ + if(state==S_DIAG){ + play("diag"); + } else { + play("nesw"); + } + } + } + check_overlap(); + super.update(); + } + + public function reset_bullet(b:FlxSprite, m:Dynamic):Void { + if(!b.alive)return; + b.alive=false; + play_sfx("pop"); + b.velocity.x=b.velocity.y=0; + b.play("explode"); + } + public function check_overlap():Void { + FlxG.collide(bullets, parent.curMapBuf, reset_bullet); + for(var b:FlxSprite in bullets.members){ + if(b !=null){ + if(player.state !=player.S_AIR && b.alive && b.overlaps(player)){ + player.touchDamage(1); + reset_bullet(b, null); + } + } + } + + for(var s:FlxSprite in bullets.members){ + if(s==null || !s.alive)continue; + if(s.velocity.x==0){ + if(s.y>parent.lowerBorder){ + reset_bullet(s, null);continue; + } else if(s.yparent.rightBorder){ + reset_bullet(s, null);continue; + } else if(s.x0){ + if(_curAnim.name=="foom" &&(_curAnim.frames.length - 1==_curFrame)){ + play("still"); + } + move_timer -=FlxG.elapsed; + } else { + play("foom"); + play_sfx("move"); + move_timer=move_timer_init; + var dx:Float=target.x - x; + var dy:Float=target.y - y; + var norm:Float=Math.min(3, 100 / Math.sqrt(dx * dx + dy * dy)); + velocity.x=dx * norm +(-5 + 5*Math.random()); + velocity.y=dy * norm +(-5 * 5 * Math.random()); + } + } + + if(!visible){ + if(!INCREMENTED_REG){ + INCREMENTED_REG=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + } + + } + + // If movers touch a laser they disappear + if(visible){ + if(player.overlaps(this)){ + player.additional_x_vel=velocity.x; + player.additional_y_vel=velocity.y; + } + + if(_curAnim.name=="die" &&(_curAnim.frames.length - 1==_curFrame)){ + visible=false; + } + + for(var l:On_Off_Laser in Registry.subgroup_on_off_lasers){ + if(l==null)continue; + if(l.laser.overlaps(this)&& l.state==l.s_hurting){ + if(_curAnim.name !="die"){ + alive=false; + play_sfx(HURT_SOUND_NAME); + play_sfx("die"); + } + play("die"); + } + } + } + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/redcave/On_Off_Laser.hx b/AIR/intra/hsrc/entity/enemy/redcave/On_Off_Laser.hx new file mode 100644 index 0000000..5af430d --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/redcave/On_Off_Laser.hx @@ -0,0 +1,207 @@ +package entity.enemy.redcave +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * DAME PROPS: + * frame - direction of the laser(URDL) + * note, row determines period + * + */ +class On_Off_Laser extends FlxSprite +{ + + public var cid:Int=CLASS_ID.ON_OFF_LASER; + public var xml:XML; + private var LASER_WIDTH:Int=12; + private var OFFSET:Int=0;//2; + + + public var laser:FlxSprite; + public var laser_active:Bool=false; + private var played_sound:Bool=false; + + private var player:Player; + + public var state:Int=0; + private var s_idle:Int=0; + private var s_emerging:Int=1; + public var s_hurting:Int=2; + private var s_receding:Int=3; + + private var t:Float=0; + private var tm_idle:Float=0; + private var tm_hurting:Float=0; + + private var did_move_offset:Bool=false; + // up, left + //[Embed(source="../../../res/sprites/enemies/redcave/f_on_off_h.png")] public var h_on_off_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/f_on_off_v.png")] public var v_on_off_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/on_off_shooter.png")] public static var on_off_shooter_sprite:Class; + + public function new(_xml:XML,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + immovable=true; + var dame_frame:Int=parseInt(xml.@frame); + switch(dame_frame){ + case 0://up + laser=new FlxSprite(x + OFFSET, y - 144); + laser.loadGraphic(v_on_off_sprite, true, true, 16, 144); + laser.height=112; + laser.scale.y=-1; + laser.width=8; + laser.offset.x=4; + laser.x +=4; + laser.y +=32; + laser.offset.y +=32; + + break; + case 1://r + laser=new FlxSprite(x + width, y + OFFSET); + laser.loadGraphic(h_on_off_sprite, true, true, 144, 16); + laser.scale.x=-1; + laser.offset.x=16; + laser.width=128; + laser.offset.x=16; + laser.height=8; + laser.offset.y=4; + laser.y +=4; + break; + case 2://down + laser=new FlxSprite(x + OFFSET, y + 16);//+height); + laser.loadGraphic(v_on_off_sprite, true, false, 16, 144); + laser.height=112; + laser.offset.y=16; + laser.width=8; + laser.offset.x=4; + laser.x +=4; + break; + case 3: + laser=new FlxSprite(x - 144, y + OFFSET); + laser.loadGraphic(h_on_off_sprite, true, false, 144, 16); + laser.offset.x=-16; + laser.width=112; + laser.height=8; + laser.offset.x=16; + laser.x +=32; + laser.offset.y=4; + laser.y +=4; + break; + } + /* Shooter/node's animations */ + //urdl + + loadGraphic(on_off_shooter_sprite, true, false, 16, 16); + switch(dame_frame){ + case 2:// If pointing down + addAnimation("shooter_closed", [0,1], 2); + addAnimation("shooter_open", [2]); + break; + case 1://pointing right + case 0:// ...down + case 3://left + if(dame_frame==1){ + angle=90; + } else if(dame_frame==3){ + angle=-90; + } + addAnimation("shooter_closed", [3,4], 2); + addAnimation("shooter_open", [5]); + break; + } + play("shooter_closed"); + + /* Steam's animations */ + laser.addAnimation("steam_is_harmful", [3, 4, 5, 6], 15, true); + /* for these non-looping anims, keep the extra frame index at the end because I use the animation + * index to tell the steam to change to the next state */ + laser.addAnimation("recede", [0, 1, 2, 2], 5, false); + laser.addAnimation("emerge", [2, 1, 0, 0], 5, false); + laser.addAnimation("idle_invisible", [0], 2,true); + laser.visible=false; + switch(parseInt(xml.@frame)){ + case 0:case 1:case 2:case 3: + tm_hurting=tm_idle=2; + break; + } + laser.play("idle_invisible"); + laser.visible=false; + + player=_player; + Registry.subgroup_on_off_lasers.push(this); + // anims:steam from head, head opening + // sfx:steam blowing + add_sfx("shoot", Registry.sound_data.on_off_laser_shoot); + + } + + override public function update():Void + { + + if(!did_move_offset){ + //urdl + did_move_offset=true; + switch(parseInt(xml.@frame)){ + case 0: + laser.offset.y -=16; + break; + case 1: + break; + case 2: + break; + case 3: + break; + } + } + + switch(state){ + case s_idle: + t +=FlxG.elapsed; + if(t>tm_idle){ + t=0; + laser.visible=true; + state=s_emerging; + play("shooter_open"); + play_sfx("shoot"); + laser.play("emerge"); + } + break; + case s_emerging: + laser.flicker(0.05); + if(laser._curFrame==(laser._curAnim.frames.length - 1)){ + laser.play("steam_is_harmful"); + state=s_hurting; + } + break; + case s_hurting: + t +=FlxG.elapsed; + if(t>tm_hurting){ + laser.play("recede"); + t=0; + state=s_receding; + } + if(player.overlaps(laser)){ + player.touchDamage(1); + } + + break; + case s_receding: + laser.flicker(0.05); + if(laser._curFrame==(laser._curAnim.frames.length - 1)){ + laser.play("idle_invisible"); + laser.visible=false; + state=s_idle; + play("shooter_closed"); + } + break; + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/redcave/Red_Boss.hx b/AIR/intra/hsrc/entity/enemy/redcave/Red_Boss.hx new file mode 100644 index 0000000..b8142c9 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/redcave/Red_Boss.hx @@ -0,0 +1,851 @@ + package entity.enemy.redcave +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import mx.core.FlexSprite; +import org.flixel.FlxBasic; +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxPoint; +import org.flixel.FlxSave; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; +import states.PlayState; + +/** + * Red cave boss + */ +class Red_Boss extends FlxSprite +{ + private var player:Player; + private var parent:PlayState; + private var xml:XML; + private var timer:Float=0; + + private var ripple:FlxSprite; + + private var added_to_parent:Bool=false; + public var cid:Int=CLASS_ID.RED_BOSS; + private var hit_timer_max:Float=1.3; + + private var pushdown_angle:Float=0; + private var amp:Int=5; + + public var state:Int=0; + private var s_intro:Int=0; + private var Intro_push_px:Int=32; + private var boss_fight_started:Bool=false; + + private var s_dead:Int=6; + private var s_dying:Int=5; + private var played_death_anim:Bool=false; + private var t_death_to_cutscene:Float=0; + private var t_death_push_tick:Float=0; + private var tm_death_to_cutscene:Float=2; + private var tm_death_push_tick:Float=0.15; + private var death_push_pixels:Int=0; + private var final_alpha:Float=1; + + private var ctr:Int=0; + /* stun wave entitites */ + private var s_stun_wave:Int=2; + private var small_wave:FlxSprite=new FlxSprite(); + private var big_wave:FlxSprite=new FlxSprite(); + private var player_hit_big_wave:Bool=false; + private var small_wave_risen:Bool=false; + private var small_wave_fallen:Bool=false; + private var big_wave_risen:Bool=false; + private var big_wave_fallen:Bool=false; + + /* Dash entities */ + private var s_dash:Int=3; + private var dash_timer:Float=0; + private var dash_timer_max:Float=5.0; + + + /* L-splash entities */ + private var s_l_splash:Int=1; + public var too_close_count:Int=0; + + private var timer_l_splash_max:Float=3.0; + private var timer_l_splash:Float=0; + private var sig_l_splash:Bool=false; + private var on_l_splash:Bool=false; + private var group_l_splash:FlxGroup=new FlxGroup(8); + private var group_l_splash_shadows:FlxGroup=new FlxGroup(8); + private var l_splash_start_tile_coords:Array=new Array(new Point(1, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5)); + private var l_splash_coeffs:Array=new Array(0,0,0,0,0,0,0,0); + private var l_splash_periods:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0); + private var l_splash_timers:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0); + + /* Tentacles */ + private var tentacles:FlxGroup=new FlxGroup(4); + private var tentacle_warnings:FlxGroup=new FlxGroup(4); + private var sig_tentacle_thrust:Bool=false; + private var on_tentacle_thrust:Bool=false; + private var timer_tentacle_thrust_max:Float=3.0; + private var timer_tentacle_thrust:Float=3.0; + private var tentacle_thrust_timers:Array=new Array(0, 0, 0, 0); + private var tt_type:Int=NONE; + + + + /** + * Top left walkable tile's world coordinates. + */ + private var pt_rm_tl:Point=new Point(); + + private var bullet_pool:FlxGroup=new FlxGroup(10); + private var bullet_shadows:FlxGroup=new FlxGroup(10); + private var tl:FlxPoint; + //[Embed(source="../../../res/sprites/enemies/red_boss.png")] public static var red_boss_sprite:Class; + //[Embed(source="../../../res/sprites/redboss_alternate.png")] public var red_boss_alternate_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_big_wave.png")] public var big_wave_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_small_wave.png")] public var small_wave_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_tentacle.png")] public var tentacle_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_warning.png")] public var warning_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_bullet.png")] public var bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_ripple.png")] public static var ripple_sprite:Class; + + public function new(_xml:XML,_parent:PlayState,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + player=_player; + parent=_parent; + xml=_xml; + + if(Registry.FUCK_IT_MODE_ON){ + state=s_dying; + //state=s_stun_wave; + } + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + tl=new FlxPoint(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + 20); + player.grid_entrance_x=tl.x + 23; + player.grid_entrance_y=tl.y + 40; + + immovable=true; + + /* HEAD SPRITES */ + var stupid:Bool=false; + if(stupid){ + loadGraphic(red_boss_alternate_sprite, true, false, 32, 32); + } else { + loadGraphic(red_boss_sprite, true, false, 32, 32); + } + addAnimation("bob", [0], 20, true); + addAnimation("close_eyes", [1],10,false); + addAnimation("warn", [2,2],24); + addAnimation("die", [0, 1, 2], 3, false); + addAnimation("last_death_frame", [1], 2); + play("bob"); + height=19; + offset.y=13; + width=26; + offset.x=3; + framePixels_y_push=32; + + ripple=new FlxSprite; + ripple.loadGraphic(ripple_sprite, true, false, 48, 8); + ripple.addAnimation("move", [0, 1], 12); + ripple.play("move"); + + pt_rm_tl.x=Registry.CURRENT_GRID_X * Registry.SCREEN_WIDTH_IN_PIXELS + Registry.TILE_WIDTH; + pt_rm_tl.y=Registry.CURRENT_GRID_Y * Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT + Registry.TILE_WIDTH; + + /* BULLET + BULLET SHADOW SPRITES */ + for(i in 0...bullet_pool.maxSize){ + + var b:FlxSprite=new FlxSprite(); + b.loadGraphic(bullet_sprite, true, false, 8, 8); + b.addAnimation("move", [0, 1], 12); + b.addAnimation("explode", [2, 3, 4, 4], 14, false); + /* load bulet shadow gfx */ + b.my_shadow=EventScripts.make_shadow("8_small"); + b.parabola_thing=new Parabola_Thing(b, 48, 1.2 + Math.random(), "offset", "y"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.visible=true; + + b.play("move"); + b.my_shadow.play("get_big"); + + bullet_pool.add(b); + bullet_shadows.add(b.my_shadow); + + } + bullet_pool.setAll("exists", false); + + bullet_shadows.setAll("exists", false); + + var j:Int; + + /* TENTACLE + WARNING SPRITES */ + for(j=0;j=pt_rm_tl.x + 32){ + + if(!DH.scene_is_dirty(DH.name_redboss, DH.scene_redboss_before_fight)){ + DH.start_dialogue(DH.name_redboss, DH.scene_redboss_before_fight); + play_sfx("rise_from_water"); + player.be_idle(); + } + + if(DH.scene_is_finished(DH.name_redboss, DH.scene_redboss_before_fight)){ + boss_fight_started=true; + state=s_l_splash; + Registry.sound_data.start_song_from_title("BOSS"); + stop_sfx("rise_from_water"); + play("bob"); + } + } else { + return; + } + } + framePixels_y_push=intro_push_px; + t_death_push_tick +=FlxG.elapsed; + if(t_death_push_tick>tm_death_push_tick){ + t_death_push_tick=0; + if(intro_push_px>0){ + FlxG.shake(0.021, 0.1); + intro_push_px--; + } + } + + return; + } + + // collisions for damage etc + if(player.broom.overlaps(this)&& player.broom.visible){ + if(timer>hit_timer_max && health>=0){ + timer=0; + health--; + play_sfx("moan"); + flicker(0.5); + if(health<=0){ + state=s_dying; + stop_sfx("rise_from_water"); + velocity.x=velocity.y=0; + tentacles.exists=false; + bullet_pool.exists=false; + bullet_shadows.exists=false; + tentacle_warnings.exists=false; + tentacles.exists=false; + big_wave.exists=small_wave.exists=false; + player.angle=0; + player.angularVelocity=0; + } + } + + } + + if(state==s_dying){ + //die etc + + if(!DH.scene_is_dirty(DH.name_redboss, DH.scene_redboss_after_fight)){ + Registry.sound_data.stop_current_song(); + DH.start_dialogue(DH.name_redboss, DH.scene_redboss_after_fight); + player.be_idle(); + FlxG.shake(0.05, 0.1); + FlxG.flash(0xffff0000, 1); + super.update(); + return; + } + + if(!DH.scene_is_finished(DH.name_redboss, DH.scene_redboss_after_fight)){ + super.update(); + return; + } + + tentacles.setAll("alpha", final_alpha); + tentacle_warnings.setAll("alpha", final_alpha); + bullet_shadows.setAll("alpha", final_alpha); + bullet_pool.setAll("alpha", final_alpha); + small_wave.alpha=final_alpha; + big_wave.alpha=final_alpha; + ripple.alpha -=0.005; + + final_alpha -=0.005; + + if(!played_death_anim){ + Registry.GFX_WAVE_EFFECT_ON=true; + played_death_anim=true; + play_sfx("death"); + play("die"); + } else { + if(_curAnim.name=="die" && _curAnim.frames.length - 1==_curFrame){ + play("last_death_frame"); + } + } + + framePixels_y_push=death_push_pixels; + if(framePixels_y_push>=32){ + framePixels_y_push=32; + if(t_death_to_cutscenedash_timer_max){ + dash_timer=0; + state=s_stun_wave; + velocity.x=velocity.y=0; + return; + } + timer_tentacle_thrust -=FlxG.elapsed; + if(timer_tentacle_thrust<=0){ + timer_tentacle_thrust=timer_tentacle_thrust_max/2; + sig_tentacle_thrust=true; + tt_type=get_player_proximity_type(); + /* If player approaches too many times, then dive under */ + if(tt_type !=NONE)too_close_count++; + } + + if(too_close_count==2){ + too_close_count=0; + state=s_l_splash; + velocity.x=velocity.y=0; + return; + } + //Set xvel + var vel:Int=60; + if(velocity.x>0){ + if(x + width>pt_rm_tl.x + 7 * 16){ + velocity.x=-vel; + FlxG.shake(0.05, 0.1, null, true, FlxCamera.SHAKE_HORIZONTAL_ONLY); + } + } else { + if(x0){ + if(y + height>pt_rm_tl.y + 7 * 16){ + FlxG.shake(0.05, 0.1, null, true, FlxCamera.SHAKE_VERTICAL_ONLY); + velocity.y=-vel; + } + } else { + if(y0){ + t.framePixels_y_push -=2; + if(t.framePixels_y_push<=0){ + t.alive=false; + } + } else if(tentacle_thrust_timers[idx]<0.3){ + if(t.framePixels_y_push0.5){ + if(b.velocity.x==0){ + b.visible=true; + play_sfx("bubble", true); + b.velocity.x=Std.int(10 + 7 * Math.random()); + b.my_shadow.play("get_small"); + } + + if(b.offset.y<10){ + if(b.overlaps(player)){ + player.touchDamage(1); + } + } + + if(b.parabola_thing.tick()&& b.offset.y<=4){ + b.play("explode"); + if(b._curAnim.frames.length - 1==b._curFrame){ + b.my_shadow.exists=b.exists=false; + b.parabola_thing.reset_time(); + b.play("move"); + play_sfx("bubble", true); + b.parabola_thing.set_shadow_fall_animation("get_big"); + } + } + } else { + b.my_shadow.flicker(0.05); + } + } + } + } + + private function do_stun_wave():Void + { + var sub_ctr:Int=0; + + /* Oscillation incrments */ + pushdown_angle +=0.05; + framePixels_y_push=amp + Math.sin(pushdown_angle % 6.28)* amp; + + /* big 'n' small wave logic. */ + if(small_wave.exists){ + if(small_wave.overlaps(player)){ + EventScripts.send_property_to(player, "x", 0, -0.5); + } + if(small_wave.xamp - 1){ + FlxG.camera.shake(0.03, 1.0); + ctr++; + play_sfx("small_wave"); + small_wave.play("move"); + small_wave.velocity.x=-20; + } + } else if(ctr==2){ //wait to be up to continue + if(framePixels_y_push==0){ + ctr++; + amp=20; + } + } else if(ctr==3){ //when down generate big wave + if(framePixels_y_push>18){ + if(!big_wave_risen){ + big_wave.x=pt_rm_tl.x + 64; + big_wave.y=pt_rm_tl.y + 32; + big_wave.exists=true; + big_wave_risen=true; + big_wave.play("rise"); + } + } + if(big_wave._curAnim.name=="rise" &&(big_wave._curFrame==big_wave._curAnim.frames.length - 1)){ + ctr++; + big_wave_risen=false; + big_wave.play("move"); + FlxG.camera.shake(0.05, 1.0); + play_sfx("big_wave"); + big_wave.velocity.x=-40; + } + + } else if(ctr==4){ //wait to be up + play("close_eyes"); + if(framePixels_y_push<2){ + ctr++; + amp=5; + } + } else if(ctr==5){ //when waves gone, go back to dash satate + if(!small_wave.exists && !big_wave.exists){ + if(EventScripts.send_property_to(this, "y", pt_rm_tl.y + 48, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "x", pt_rm_tl.x + 16 * 4, 0.5))sub_ctr++; + if(sub_ctr==2){ + small_wave.velocity.x=big_wave.velocity.x=0; + player_hit_big_wave=false; + state=s_dash; + play("bob"); + stop_sfx("rise_from_water"); + velocity.x=30; + velocity.y=20; + ctr=0; + } + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/redcave/Slasher.hx b/AIR/intra/hsrc/entity/enemy/redcave/Slasher.hx new file mode 100644 index 0000000..217df34 --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/redcave/Slasher.hx @@ -0,0 +1,448 @@ +package entity.enemy.redcave +{ +import data.CLASS_ID; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import entity.player.Player; +import org.flixel.FlxU; +import states.PlayState; + +class Slasher extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher.png")] public static var slasher_sprite:Class; + /* A little confusign:Dynamic/ + /* wide has down-facing Wide attack, right-facing long attack */ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher_wide.png")] public static var wide_atk_sprite:Class; + /* long has right-facing wide attack, up-facing long attack */ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher_long.png")] public static var long_atk_sprite:Class; + public var harmful_wide_atk_frames:Array=new Array(0, 1, 2); + public var harmful_long_atk_frames:Array=new Array(3, 4, 5); + + + public var cid:Int=CLASS_ID.SLASHER; + public var xml:XML; + + public var long_sprite:FlxSprite=new FlxSprite(); + public var wide_sprite:FlxSprite=new FlxSprite(); + + public var SPRITE_WIDTH:Int=16; + public var state:Int=0; + public var S_MOVE:Int=0; + public var move_timer_max:Float=1.4; + public var move_timer:Float=0; + private var initial_latency:Float=1.4; + + public var S_ATK_LONG:Int=1; + public var LONG_ATK_TIMEOUT_MAX:Float=0.8; + public var LONG_ATK_TIMEOUT:Float=LONG_ATK_TIMEOUT_MAX; + public var S_ATK_WIDE:Int=2; + public var S_ATK_WIDE_DELAY:Int=3; + public var WIDE_ATK_DISTANCE:Int=36; + public var WIDE_ATK_DELAY_MAX:Float=0.3; + public var WIDE_ATK_DELAY:Float=WIDE_ATK_DELAY_MAX; + public var WIDE_ATK_TIMER_MAX:Float=0.4; + public var WIDE_ATK_TIMER:Float=WIDE_ATK_TIMER_MAX; + public var INCREMENTED_REG:Bool=false; + + public var t_warning:Float=0; + public var tm_warning:Float=0.5; + public var played_warning:Bool=false; + + public var activate_attack_frame:Int=0; + public var started_attack_anim:Bool=false; + + + + + public var player:Player; + public var parent:PlayState; + + + public function new(_xml:XML, _parent:PlayState, _player:Player) + { + + // anims: + // walk urdl + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + player=_player; + parent=_parent; + + /** Note to Marina: + * All scalings are taken care of for the attack, the default facings of the attacks that + * i've programmed for are commented below */ + /* Add attack animations */ + long_sprite.loadGraphic(long_atk_sprite, true, false, 16, 48); + long_sprite.addAnimation("tall", [3, 4, 5, 6], 12, false);//Faces up, from the long sprite sheet + long_sprite.addAnimation("wide", [3, 4, 5, 6], 12, false);// Faces right, from the wide spritesheet + long_sprite.play("tall"); + + // 10 x 36 + + wide_sprite.loadGraphic(wide_atk_sprite, true, false, 48, 16); + wide_sprite.addAnimation("tall", [0, 1, 2, 6], 12, false);// Faces right, from the long spritesheet + wide_sprite.addAnimation("wide", [0, 1, 2, 6], 12, false);//faces down, from the wide spritesheet + wide_sprite.play("wide"); + + parent.otherObjects.push(long_sprite); + parent.otherObjects.push(wide_sprite); + + health=3; + + /* Add slasher's animations */ + /* Spritesheet horizontal facing is RIGHT */ + loadGraphic(slasher_sprite, true, false, 24, 24); + addAnimation("float_d", [0, 1], 3); + addAnimation("float_l", [2, 3], 3); + addAnimation("float_r", [2, 3], 3); + addAnimation("float_u", [4, 5], 3); + addAnimation("warning_d", [6,6], 10,false);//Duplicate the last frame + addAnimation("warning_l", [7,7], 10,false); + addAnimation("warning_r", [7,7], 10,false); + addAnimation("warning_u", [8,8], 10,false); + addAnimation("attack_d", [9,9], 10,false); + addAnimation("attack_l", [10,10], 10,false); + addAnimation("attack_r", [10,10], 10,false); + addAnimation("attack_u", [11,11], 10, false); + addAnimation("die", [9, 10, 11,11], 3, false); + play("float_d"); + addAnimationCallback(on_anim_change); + width=height=16; + centerOffsets(true); + + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + add_sfx("attack", Registry.sound_data.slasher_atk); + + } + + override public function preUpdate():Void + { + FlxG.collide(this, parent.curMapBuf); + super.preUpdate(); + } + + override public function update():Void + { + + if(touching !=NONE){ + velocity.x=velocity.y=0; + } + if(initial_latency>0){ + initial_latency -=FlxG.elapsed; + return; + } + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + /* Chceck if dead */ + if(xml.@alive=="false"){ + // When the death anim finishes, blow up + //if(_curAnim.frames.length - 1==_curFrame){ + /* Always immediately blow up unless we do make a death anim*/ + if(1){ + visible=false; + if(!INCREMENTED_REG){ + EventScripts.drop_big_health(x, y, 1); + INCREMENTED_REG=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + } + wide_sprite.visible=long_sprite.visible=false; + } + return; + } + if(state==S_MOVE){ + movement(); + } else { + if(!started_attack_anim){ + started_attack_anim=true; + switch(_curAnim.name){ + case "warning_r": + play("attack_r"); + break; + case "warning_l": + play("attack_l"); + break; + case "warning_d": + play("attack_d"); + break; + case "warning_u": + play("attack_u"); + break; + } + /* Some frame in the attack animation trigger sthe appearance of the slash attack */ + } else if(_curFrame>=activate_attack_frame){ + velocity.x=velocity.y=0; + attack();//Decrement the attack timers until state change + } + } + collisions(); + check_for_death(); + super.update(); + } + + private function check_for_death():Void { + if(health<=0){ + xml.@alive="false"; + play("die"); + } + } + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="float_r" || name=="warning_r" || name=="attack_r"){ + scale.x=-1; + } else { + scale.x=1; + } + } + + private var t_move:Float=0; + public function movement():Void { + t_move +=FlxG.elapsed; + if(t_move>0.25){ + t_move=0; + EventScripts.scale_vector(this, player, velocity, 20); + } + //EventScripts.send_property_to(this, "x", player.x + 8, 0.3); + //EventScripts.send_property_to(this, "y", player.y + 8, 0.3); + var dx:Int=(player.x + 8)-(x + SPRITE_WIDTH/2); + var dy:Int=(player.y + 8)-(y + SPRITE_WIDTH / 2); + + if(!played_warning){ + facing=EventScripts.get_entity_to_entity_dir(x + SPRITE_WIDTH / 2, y + SPRITE_WIDTH / 2, player.x + 8, player.y + 8); + switch(facing){ + case UP: + play("float_u"); + break; + case RIGHT: + play("float_r"); + break; + case LEFT: + play("float_l"); + break; + case DOWN: + play("float_d"); + break; + } + } + + move_timer -=FlxG.elapsed; + if(move_timer<0){ + if(!played_warning){ + switch(_curAnim.name){ + case "float_r": + play("warning_r"); + break; + case "float_d": + play("warning_d"); + break; + case "float_u": + play("warning_u"); + break; + case "float_l": + play("warning_l"); + break; + } + played_warning=true; + } + t_warning +=FlxG.elapsed; + if(t_warning>tm_warning){ + played_warning=false; + t_warning=0; + move_timer=move_timer_max; + if(Math.sqrt(dx * dx + dy * dy)WIDE_ATK_DISTANCE + 3){ //can get a good attack range here + // state=S_MOVE; + //wide_sprite.visible=false; + //anim of enemy + + + } + private function collisions():Void { + + if(long_sprite.visible){ + if(harmful_long_atk_frames.indexOf(long_sprite._curIndex)!=-1){ + if(long_sprite.overlaps(player))player.touchDamage(1); + } + } + if(wide_sprite.visible){ + if(harmful_wide_atk_frames.indexOf(wide_sprite._curIndex)!=-1){ + if(wide_sprite.overlaps(player)&& player.state==player.S_GROUND)player.touchDamage(1); + } + } + /*if(player.overlaps(this)){ + player.touchDamage(1); + }*/ + if(player.broom.visible){ + if(player.broom.overlaps(this)){ + if(!flickering){ + flicker(1); + health--; + play_sfx(HURT_SOUND_NAME); + + } + } + } + } + + /* update timers - long transitions back to move, wide can continue + * to transition to wide */ + public function attack():Void { + if(state==S_ATK_LONG){ + LONG_ATK_TIMEOUT -=FlxG.elapsed; + if(LONG_ATK_TIMEOUT<0){ + state=S_MOVE; + started_attack_anim=false; + LONG_ATK_TIMEOUT=LONG_ATK_TIMEOUT_MAX; + long_sprite.visible=false; + return; + } + } else { + /** This is a huge mess, the logic has been commented + * to act like the long attack, so it piggy backs on the + * code that does warning and attack */ + if(state==S_ATK_WIDE_DELAY){ + WIDE_ATK_DELAY -=FlxG.elapsed; + if(WIDE_ATK_DELAY<0){ + WIDE_ATK_DELAY=WIDE_ATK_DELAY_MAX; + // state=S_ATK_WIDE; + state=S_MOVE; + started_attack_anim=false; + wide_sprite.visible=false; + move_timer=move_timer_max / 2; + //wide_sprite.visible=true; + //update_wide_pos(); + //sfx + //anim + } + } else { + + WIDE_ATK_TIMER -=FlxG.elapsed; + if(WIDE_ATK_TIMER<0){ + WIDE_ATK_TIMER=WIDE_ATK_TIMER_MAX; + state=S_ATK_WIDE_DELAY; + wide_sprite.visible=false; + return; + } + + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Killer.hx b/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Killer.hx new file mode 100644 index 0000000..fb570ca --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Killer.hx @@ -0,0 +1,81 @@ +package entity.enemy.suburb +{ +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +class Suburb_Killer extends AnoSprite +{ + + private static inline var s_idle:Int=0; + private static inline var s_move:Int=1; + + private var t_flip_vel:Float=0; + private static inline var tm_flip_vel:Float=0.5; + + + //[Embed(source="../../../res/sprites/npcs/suburb_killers.png")] public static inline var embed_suburb_killer:Class; + public function new(args:Array) + { + super(args); + + loadGraphic(embed_suburb_killer, true, false, 16, 16); + + var off:Int=Math.random()* 6; + off *=9; + addAnimation("idle_d", [off+0], 1); + addAnimation("idle_r", [off+2], 1); + addAnimation("idle_u", [off+4], 1); + addAnimation("idle_l", [off+6], 1); + + addAnimation("walk_d", [off,off+1], 4); + addAnimation("walk_r", [off+2,off+3], 4); + addAnimation("walk_u", [off+4, off+5], 4); + addAnimation("walk_l", [off+6, off+7], 4); + + play("idle_d"); + + width=height=6; + offset.x=offset.y=5; + x +=5; + y +=5; + } + + override public function preUpdate():Void + { + if(state==s_move){ + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + + override public function update():Void + { + + switch(state){ + + case s_idle: + EventScripts.face_and_play(this, player, "idle"); + if(EventScripts.distance(player, this)<36){ + state=s_move; + } + break; + case s_move: + EventScripts.face_and_play(this, player, "walk"); + + t_flip_vel +=FlxG.elapsed; + if(t_flip_vel>tm_flip_vel){ + t_flip_vel=0; + EventScripts.scale_vector(this, player, velocity, 30); + } + + if(player.overlaps(this)){ + player.touchDamage(6); + } + + break; + + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Walker.hx b/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Walker.hx new file mode 100644 index 0000000..56c6feb --- /dev/null +++ b/AIR/intra/hsrc/entity/enemy/suburb/Suburb_Walker.hx @@ -0,0 +1,301 @@ +package entity.enemy.suburb +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + + +class Suburb_Walker extends AnoSprite +{ + //[Embed(source="../../../res/sprites/enemies/suburb/suburb_walker.png")] public static var embed_suburb_walker:Class; + //[Embed(source="../../../res/sprites/npcs/suburb_walkers.png")] public static var embed_suburb_folk:Class; + //[Embed(source="../../../res/sprites/npcs/suburb_killers.png")] public static var embed_suburb_killer:Class; + + + private var s_alive:Int=0; + private var s_dead:Int=1; + + private var t_walk:Float=0; + private var tm_walk:Float=1.0; + private var walk_vel:Int=20; + + public var active_region:FlxObject; + + private var dialogue_choices:Int; + private var blood:FlxSprite; + private var dialogue_scene_name:String; + private var ropes:FlxGroup; + + private var is_talker:Bool=false; + private var talker_nr:Int=1; + public function new(args:Array) + { + super(args); + + // MARINA_ANIMS + // will add gender sprite later + loadGraphic(embed_suburb_folk, true, false, 16, 16); + var off:Int=parseInt(xml.@frame); + var w:Int=9; + off *=w; + state=s_alive; + immovable=true; + tm_walk=1.0 + Math.random(); + + active_region=new FlxObject(0, 0, 22, 22); + + if(xml.@alive=="false"){ + play("dead"); + state=s_dead; + + + Registry.subgroup_interactives.push(this); + } + + blood=new FlxSprite; + blood.loadGraphic(embed_suburb_folk, true, false, 16, 16); + blood.addAnimation("a", [63,64,65,66], 3, false); + blood.visible=false; + + if(state==s_dead){ + blood.x=x - 3 + 6 * Math.random(); + blood.y=y - 3 + 6 * Math.random(); + blood.play("a"); + blood.visible=true; + } + + parent.bg_sprites.add(blood); + + gx=Registry.CURRENT_GRID_X; + gy=Registry.CURRENT_GRID_Y; + if(parseInt(xml.@frame)==12){ + Registry.subgroup_interactives.push(this); + is_talker=true; + talker_nr=1; + var first_anim:String="walk_d"; + if(gx==1 && gy==5){ // Paranoid Guy(74) + off=0; + } else if(gx==3 && gy==5){ // Younger kid in family house + off=4 * w; + } else if(gx==4 && gy==5){ // Older kid in family house + off=2 * w; + } else if(gx==0 && gy==7){ // dead mom + off=w; + first_anim="dead"; + } else if(gx==1 && gy==7){ // dead dad + off=0; + first_anim="dead"; + } else if(gx==1 && gy==6){ // Hanged guy + // Do weird stuff with the rope + ropes=new FlxGroup(3); + for(r in 0...3){ + var rope:FlxSprite=new FlxSprite(x, y - 16 *(r + 1)); + rope.loadGraphic(embed_suburb_folk, true, false, 16, 16); + rope.frame=55; + ropes.add(rope); + } + parent.fg_sprites.add(ropes); + addAnimation("hang", [54], 2); + off=0; + first_anim="hang"; + } else if(gx==0 && gy==6){ // festive person + off=0; + frame=4; + } + add_the_anims(off,false); + play(first_anim); + } else if(parseInt(xml.@frame)==14){ + Registry.subgroup_interactives.push(this); + is_talker=true; + talker_nr=2; + if(gx==3 && gy==5){ // prarent in family house + frame=4; + off=w; + add_the_anims(off,false); + play("walk_d"); + } + } else { + add_the_anims(off); + play("walk_d"); + } + + if(state==s_dead){ + play("dead"); + } + + + if(off/w<2){ + dialogue_scene_name=DH.scene_suburb_walker_words_adult; + } else if(off / w<4){ + dialogue_scene_name=DH.scene_suburb_walker_words_teen; + } else { + dialogue_scene_name=DH.scene_suburb_walker_words_kid; + } + dialogue_choices=DH.get_scene_length(DH.name_suburb_walker, dialogue_scene_name); + + + } + override public function preUpdate():Void + { + if(state !=s_dead){ + FlxG.collide(player, this); + immovable=false; + FlxG.collide(parent.curMapBuf, this); + immovable=true; + } + super.preUpdate(); + } + override public function update():Void + { + active_region.x=x - 3; + active_region.y=y - 3; + + if(is_talker){ + update_talker(); + super.update(); + return; + } + if(state==s_alive){ + if(player.broom.visible && player.broom.overlaps(this)){ + play("die"); + Registry.sound_data.broom_hit.play(); + Registry.Event_Nr_Suburb_Killed++; + state=s_dead; + Registry.sound_data.fall_in_hole.play(); + velocity.x=velocity.y=0; + xml.@alive="false"; + Registry.subgroup_interactives.push(this); + return; + } + + t_walk +=FlxG.elapsed; + + if(x + width>tl.x + 155 || xtl.y + 155 || ytl.x + 155)x=tl.x + 155 - width; + if(xtl.y + 155)y=tl.y + 155 - height; + if(ytm_walk){ + t_walk=0; + if(facing & DOWN){ + play("walk_r"); + } else if(facing & RIGHT){ + play("walk_u"); + } else if(facing & LEFT){ + play("walk_d"); + } else { + play("walk_l"); + } + + } + if(touching && player.touching==NONE){ + t_walk=tm_walk + 1; + } + } else if(state==s_dead){ + velocity.x=velocity.y=0; + if(blood.frame==66 && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + DH.start_dialogue(DH.name_suburb_walker, dialogue_scene_name, "", Std.int(Math.random()* dialogue_choices)); + player.be_idle(); + + } + if(finished){ + if(_curAnim.name=="die" && _curAnim.frames.length - 1==_curFrame){ + Registry.sound_data.player_hit_1.play(); + play("dead"); + blood.x=x - 3 + 6 * Math.random(); + blood.y=y - 3 + 6 * Math.random(); + blood.play("a"); + blood.visible=true; + } + } + } + super.update(); + } + + private var talker_state:Int=0; + private function update_talker():Void { + if(talker_state==0){ + if(DH.a_chunk_is_playing()==false){ + talker_state=1; + } + } else if(talker_state==1){ + if(player.state==player.S_GROUND && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + talker_state=0; + + if(talker_nr==2){ + if(gx==3 && gy==5){ // Mom in family + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_family, "", 0); + } + } else if(talker_nr==1){ + if(gx==1 && gy==5){ // Paranoid Guy(74) + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_paranoid); + } else if(gx==3 && gy==5){ // Younger kid in family house 73 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_family, "", 1); + } else if(gx==4 && gy==5){ // Older kid in family house 73 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_older_kid); + } else if(gx==0 && gy==7){ // dead mom 76 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_dead, "", 0); + } else if(gx==1 && gy==7){ // dead dad 76 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_dead, "", 1); + } else if(gx==1 && gy==6){ // Hanged guy 78 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_hanged); + } else if(gx==0 && gy==6){ // festive person 75 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_festive); + } + } + player.be_idle(); + + } + } + } + private function on_anim_change(name:String, frame:Int, index:Int):Void { + velocity.x=velocity.y=0; + if(name=="walk_d"){ + facing=DOWN; + velocity.y=walk_vel; + } else if(name=="walk_u"){ + facing=UP; + velocity.y=-walk_vel; + } else if(name=="walk_r"){ + facing=RIGHT; + velocity.x=walk_vel; + } else if(name=="walk_l"){ + facing=LEFT; + velocity.x=-walk_vel; + } + + } + + private function add_the_anims(off:Int,doeswalk:Bool=true):Void + { + addAnimation("walk_d", [0 + off, 1 + off], 4); + addAnimation("walk_r", [2 + off, 3 + off], 4); + addAnimation("walk_u", [4 + off, 5 + off], 4); + addAnimation("walk_l", [6 + off, 7 + off], 4); + addAnimation("die", [0+off,2+off,4+off,6+off,0+off,2+off,4+off,6+off,8+off], 8,false); + addAnimation("dead", [8 + off]); + if(true==doeswalk){ + addAnimationCallback(on_anim_change); + } + } + + override public function destroy():Void + { + active_region.destroy(); + active_region=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Big_Door.hx b/AIR/intra/hsrc/entity/gadget/Big_Door.hx new file mode 100644 index 0000000..b46a700 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Big_Door.hx @@ -0,0 +1,297 @@ +package entity.gadget; + +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; + +/** + * a big door. either alive or not alive. + * if alive, approaching this without enough growths has a bunch of outlines + * of squares pop-up, with as many filled in as you have. The squares then fade out. + * otherwise approaching with enough leads to the square sprites coming from + * the character, circling around him, eventually leaving trails of blurred sprites, which + * 'attack' the door, make it glow, then fizzle away. sets a global event. + * if not alive, the doorway is 'open', so the actual Door entity will be alive + * @author Seagaia + */ + +class Big_Door extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.BIG_DOOR; + //[Embed(source="../../res/sprites/gadgets/big_door.png")] public static var big_door_sprite:Class; + public var active_region:FlxSprite; + public var player:Player; + public var state:Int=0; + public var s_normal:Int=0; + public var s_opening:Int=1; + + public var s_locked_anim:Int=2; + public var s_locked_fade:Int=3; + public var s_wait_to_not_overlap:Int=4; + + public var s_open_anim:Int=6; + public var s_open_anim_ctr:Int=0; + public var center_sprite:FlxSprite=new FlxSprite(80, 80); + public var init_open_radius:Float=45; + + + public var s_open:Int=5; + public var timer:Float=0.06; + public var timer_max:Float=0.06; + + public var s_locked_ctr:Int=0; + public var locked_squares:FlxGroup=new FlxGroup(36); + + public var score_text_1:FlxBitmapFont; + public var score_text_2:FlxBitmapFont; + public var white_flash:FlxSprite=new FlxSprite(0, 0); + + /* Based on frame, which Big door */ + public static var bd_nexus1:Int=0; + /* + * dame params:frame is which door this corresponds to + **/ + public function new(_xml:XML,_player:Player):Void { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(big_door_sprite, true, false, 32, 32); + active_region=new FlxSprite(x + width / 2 - 1, y + height + 2 + Registry.HEADER_HEIGHT);; + active_region.makeGraphic(2, 2, 0xffff0000); + player=_player; + immovable=true; + init_squares(); + center_sprite.makeGraphic(1, 1); + center_sprite.scrollFactor=new FlxPoint(0, 0); + + score_text_1=EventScripts.init_bitmap_font(); + score_text_2=EventScripts.init_bitmap_font(); + score_text_2.scrollFactor=score_text_1.scrollFactor=new FlxPoint(0, 0); + score_text_1.y=30; + score_text_2.y=50; + white_flash.makeGraphic(160, 160, 0xffffffff);white_flash.alpha=0; + white_flash.y +=Registry.HEADER_HEIGHT; + white_flash.scrollFactor=new FlxPoint(0, 0); + + if(Registry.Big_Door_State[parseInt(xml.@frame)])exists=false; + + } + + private var hoooooops:Bool=false; + override public function update():Void + { + FlxG.collide(player, this); + + /* If the player overlaps the active region set off the event to open door. */ + if(state==s_normal){ + if(player.overlaps(active_region)){ + //if(false==hoooooops && Registry.nr_growths>=Registry.Big_Door_Reqs[parseInt(xml.@frame)]){ + if(true==hoooooops){ + state=s_open_anim; + hoooooops=false; + + } else { + hoooooops=true; + state=s_locked_anim; + /* Set the "0.x" text".. */ + score_text_1.setText(Registry.nr_growths.toString()+"\n---", true, 0, 0, "center", true); + score_text_2.setText(Registry.Big_Door_Reqs[parseInt(xml.@frame)].toString(), true, 0, 0, "center", true); + score_text_1.x=-20; + score_text_2.x=Registry.SCREEN_WIDTH_IN_PIXELS + 20; + Registry.sound_data.big_door_locked.play(); + } + } + } else if(state==s_opening){ + alpha -=0.01; + if(alpha<0.01){ + state=s_open; + exists=false; + Registry.Big_Door_State[parseInt(xml.@frame)]=true; + } + } else if(state==s_open){ + + /* FADE IN FOR LOCKED DOOR */ + } else if(state==s_locked_anim){ + timer -=FlxG.elapsed; + if(timer<0 && s_locked_ctr=1){ + locked_squares.members[i].scale.x -=0.04; + locked_squares.members[i].scale.y -=0.04; + } + } + + var text_move_ctr:Int=0; + if(EventScripts.send_property_to(score_text_1, "x", Registry.SCREEN_WIDTH_IN_PIXELS / 2 - 8, 4))text_move_ctr++; + if(EventScripts.send_property_to(score_text_2, "x", Registry.SCREEN_WIDTH_IN_PIXELS / 2, 4 ))text_move_ctr++; + + if(text_move_ctr==2 && locked_squares.members[locked_squares.maxSize - 1].alpha>=1){ + + white_flash.alpha +=0.05; + if(white_flash.alpha==1)text_move_ctr++; + if(text_move_ctr==3){ + state=s_locked_fade; + s_locked_ctr=0; + } + } + /* FADE OUT FOR LOCKED DOOR */ + } else if(state==s_locked_fade){ + timer -=FlxG.elapsed; + if(timer<0 && s_locked_ctr0.02){ + locked_squares.members[j].scale.x -=0.01; + locked_squares.members[j].scale.y -=0.01; + } + locked_squares.members[j].alpha -=0.03; + + } + + white_flash.alpha -=0.05; + EventScripts.send_property_to(score_text_1, "x", Registry.SCREEN_WIDTH_IN_PIXELS + 20, 3); + EventScripts.send_property_to(score_text_2, "x", -20, 3 ); + score_text_1.alpha -=0.02; + score_text_2.alpha -=0.02; + + if((score_text_1.alpha==0 && score_text_2.alpha==0)&& locked_squares.members[locked_squares.maxSize - 1].alpha==0){ + locked_squares.setAll("angularVelocity", 0); + locked_squares.setAll("angle", 0); + locked_squares.setAll("alpha", 0); + for(i=0;i0.8)s_open_anim_ctr++; + } + + } + } else if(s_open_anim_ctr==2){ // move squares to center and outwars + for(i=0;i0)s_open_anim_ctr++; + } else if(s_open_anim_ctr==4){ //flash in, rearrange squares + white_flash.alpha +=0.04; + if(white_flash.alpha>0.99){ + s_open_anim_ctr++; + for(square in locked_squares.members){ + square.scale.y=square.scale.x=0.5 + 2 * Math.random(); + square.x +=(-80 + 160 * Math.random()); + square.y +=(-80 + 160 * Math.random()); + square.angularVelocity=400 - 800 * Math.random(); + } + + } + } else if(s_open_anim_ctr==5){ // flash out + white_flash.alpha -=0.01; + if(white_flash.alpha<0.01){ + s_open_anim_ctr++; + } + } else { // move squares inwards + var ctr_ctr:Int=0; + var nr_done:Int=0; + white_flash.alpha -=0.1; + for(square in locked_squares.members){ + if(square.alpha==0){ + nr_done++; + if(nr_done==locked_squares.maxSize){ + s_open_anim_ctr++; + state=s_opening; + white_flash.alpha=0; + player.dontMove=false; + break; + } + continue; + } + if(EventScripts.send_property_to(square, "x", getScreenXY().x + width / 2, 1))ctr_ctr++; + if(EventScripts.send_property_to(square, "y", getScreenXY().y, 1))ctr_ctr++; + if(ctr_ctr==2){ + square.alpha=0; + } + ctr_ctr=0; + } + } + } + + + /* The event will freeze controls, and then show the squares in a grid if not enough, + * or play the animation if there are enough. */ + + super.update(); + } + + private function init_squares():Void { + for(i in 0...locked_squares.maxSize){ + var s:FlxSprite=new FlxSprite(10 + 24 *(i % 6), 20 + 24 * Std.int(i / 6)); + + if(i=new Array(CLASS_ID.PLAYER, CLASS_ID.SINGLEPUSHBLOCK, CLASS_ID.SILVERFISH, CLASS_ID.SHIELDY, CLASS_ID.MOVER,CLASS_ID.RAT,CLASS_ID.MITRA); + + public function new(x:Int,y:Int,_xml:XML,_parent:Dynamic) + { + super(x, y); + xml=_xml; + immovable=true; + solid=false; + type=parseInt(_xml.@frame); + loadGraphic(S_BUTTON, true, false, 16, 16); + + if(Registry.CURRENT_MAP_NAME=="STREET"){ + UP_FRAME=6; + DOWN_FRAME=7; + } else if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + UP_FRAME=0; + DOWN_FRAME=1; + } else if(Registry.CURRENT_MAP_NAME=="REDCAVE"){ + UP_FRAME=4; + DOWN_FRAME=5; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + UP_FRAME=8; + DOWN_FRAME=9; + }else { + UP_FRAME=2; + DOWN_FRAME=3; + } + parent=_parent; + frame=UP_FRAME; + } + + + override public function update():Void { + + + if(overlaps(parent.player)&& parent.player.state !=parent.player.S_AIR){ + overlap_callback(parent.player, this); + } + for(var o:Dynamic in parent.sortables.members){ + if(o !=null && o is FlxSprite){ + if(overlaps(o)){ + overlap_callback(o, this); + } + } + } + + + + if(type==TYPE_PERMANENT)return; + + if(INCREMENTED_REGISTRY && !pressed){ + Registry.sound_data.button_up.play(); + if(Registry.GRID_PUZZLES_DONE>0) + Registry.GRID_PUZZLES_DONE --; + INCREMENTED_REGISTRY=false; + frame=UP_FRAME; + } + pressed=false; + super.update(); + } + + + public function overlap_callback(s:Dynamic, x:Dynamic):Void { + if(Std.is(s, FlxGroup)){ + s=s.draw_root; + if(s==null)return; + } + if(s.exists && s.hasOwnProperty("cid")&& overlappable_cids.indexOf(s.cid)!=-1){ + pressed=true; + + if(!INCREMENTED_REGISTRY){ + Registry.sound_data.button_down.play(); + frame=DOWN_FRAME; + Registry.GRID_PUZZLES_DONE++; + INCREMENTED_REGISTRY=true; + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Challenge_Gate.hx b/AIR/intra/hsrc/entity/gadget/Challenge_Gate.hx new file mode 100644 index 0000000..12dfcec --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Challenge_Gate.hx @@ -0,0 +1,58 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxSprite; + +/** + * Gate that only opens when you have enough energy + * DAME PARAMS: + * p:2 + * alive:t/f, whether it should spawn + */ +class Challenge_Gate extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/challenge_gate.png")] public static var sprite_challenge_gate:Class; + + public var cid:Int=CLASS_ID.CHALLENGE_GATE; + public var xml:XML; + public var active_region:FlxSprite; + + public function new(_xml:XML) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + loadGraphic(sprite_challenge_gate, true, false, 16, 16); + addAnimation('disappear', [0, 1, 2, 3,4], 4, false); + immovable=true; + frame=0; + active_region=new FlxSprite(x, y + height); + active_region.makeGraphic(width, 4, 0xff00ffff); + + if(xml.@alive=="false"){ + visible=false; + } + } + + override public function update():Void + { + + if(frame==4){ + xml.@alive="false"; + } + super.update(); + } + + public function check_open(p:Player):Void { + + if(p.overlaps(active_region)){ + if(xml.@alive=="false")return; + if(p.health_bar.cur_health==p.health_bar.max_health && frame==0){ //change for energy + play('disappear'); + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Checkpoint.hx b/AIR/intra/hsrc/entity/gadget/Checkpoint.hx new file mode 100644 index 0000000..84cca86 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Checkpoint.hx @@ -0,0 +1,290 @@ +package entity.gadget +{ +import entity.player.Player; +import global.Keys; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; + +class Checkpoint extends FlxSprite +{ + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + private var did_init:Bool=false; + + private var state:Int; + private var s_inactive:Int=0; + private var s_stepped_on:Int=1; + private var s_active:Int=2; + private var s_dialog:Int=3; + private var did_save:Bool=false; + private var did_autosave:Bool=false; + private var t_save:Float=0; + private var tm_save:Float=0.1; + private var saved_coords:Bool=false; + + private var save_dialog_bg:FlxSprite; + private var save_dialog_text:FlxBitmapFont; + private var save_dialog_selector:FlxSprite; + private var ctr:Int=0; + + private var autosave_anim_ctr:Int=0; + private var autosave_started:Bool=false; + private var autosave_loop:Bool=true; + + + private var player_hasnt_stepped_off:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/checkpoint.png")] public static var checkpoint_sprite:Class; + //[Embed(source="../../res/sprites/inventory/checkpoint_save_box.png")] public static var checkpoint_save_box_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(checkpoint_sprite, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("inactive", [4]); + addAnimation("stepped_on", [5,6],12); + addAnimation("active", [5,6,7], 10, false); + } else { + addAnimation("inactive", [0]); + addAnimation("stepped_on", [1, 2],12); + addAnimation("active", [1, 2, 3], 10, false); + } + + width=height=8; + offset.x=offset.y=4; + x +=4; + y +=4; + + save_dialog_bg=new FlxSprite; + save_dialog_bg.loadGraphic(checkpoint_save_box_sprite, true, false, 80, 29); + save_dialog_bg.x=(160 - save_dialog_bg.width)/ 2; + save_dialog_bg.y=20 +(160 - save_dialog_bg.height)/ 2; + save_dialog_bg.scrollFactor=new FlxPoint(0, 0); + //save_dialog_text=EventScripts.init_bitmap_font("Save game?\n Yes\n No", "left", save_dialog_bg.x + 5, save_dialog_bg.y + 2, null, "apple_white"); + save_dialog_text=EventScripts.init_bitmap_font(DH.lk("checkpoint",0), "left", save_dialog_bg.x + 5, save_dialog_bg.y + 2, null, "apple_white"); + save_dialog_text.color=0xffffff; + save_dialog_text.drop_shadow=true; + save_dialog_selector=new FlxSprite; + save_dialog_selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + save_dialog_selector.scrollFactor=new FlxPoint(0, 0); + save_dialog_selector.addAnimation("flash", [0, 1], 8); + save_dialog_selector.play("flash"); + save_dialog_selector.scale.x=-1; + + parent.fg_sprites.add(save_dialog_bg); + parent.fg_sprites.add(save_dialog_text); + parent.fg_sprites.add(save_dialog_selector); + save_dialog_bg.visible=save_dialog_text.visible=save_dialog_selector.visible=false; + + } + + override public function update():Void + { + oscillate_autosave(); + if(!did_init){ + did_init=true; + + if(player.overlaps(this)){ + player_hasnt_stepped_off=true; + } + + if(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y){ + play("active"); + state=s_active; + } else { + state=s_inactive; + play("inactive"); + } + } + + if(player_hasnt_stepped_off){ + super.update(); + if(!player.overlaps(this)){ + player_hasnt_stepped_off=false; + } + return; + } + + // Info popup + if(!Registry.GE_States[Registry.GE_Did_A_Checkpoint]){ + if(!Intra.is_test && EventScripts.distance(this,player)<18){ + Registry.GE_States[Registry.GE_Did_A_Checkpoint]=true; + player.be_idle(); + + //DH.dialogue_popup("While standing on a checkpoint, press " + Registry.controls[Keys.IDX_ACTION_1] + " to save your progress and set it as your respawn point if you die."); + DH.dialogue_popup(DH.lk("checkpoint",1)+" " + Registry.controls[Keys.IDX_ACTION_1] + " "+DH.lk("checkpoint",2)); + } + } + + // Do autosave if close or in same room + //if(!did_autosave){ + //if(Registry.autosave_on){ + //if(Registry.is_playstate ||(Math.abs(x - player.x)<48 && Math.abs(y - player.y)<48)){ + //did_autosave=true; + //autosave_started=true; + // Make save icon appear + //Save.save(); + //} + //} + //} + // Behavior the same otherwise + switch(state){ + case s_inactive: + if(player.overlaps(this)&& player.state==player.S_GROUND){ + play("stepped_on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_stepped_on; + } + break; + case s_stepped_on: + // Require player input to set checkpint. + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.button_down.play(); + // If this checkpoint is activated and it is not ou current one, + // then refill the health of the palyer + if(!(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y)){ + player.health_bar.modify_health(20); + } + update_global_checkpoint(); + + // Ask the player if they want to save if autosave is not on. + if(!Registry.autosave_on){ + state=s_dialog; + player.state=player.S_INTERACT; + player.be_idle() + save_dialog_bg.visible=save_dialog_selector.visible=save_dialog_text.visible=true; + save_dialog_selector.x=save_dialog_text.x + 4; + save_dialog_selector.y=save_dialog_text.y + 8; + } else { + + if(Registry.is_playstate ||(Math.abs(x - player.x)<48 && Math.abs(y - player.y)<48)){ + did_autosave=true; + autosave_started=true; + // Make save icon appear + Save.save(); + } + + did_save=true; + state=s_active; + play("active"); + } + } else { + if(!player.overlaps(this)){ + state=s_inactive; + play("inactive"); + + if(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y){ + play("active"); + } + } + } + + break; + case s_active: + if(!did_save){ + if(player.overlaps(this)){ + play("stepped_on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_stepped_on; + } + } else { // Timeout, lets you save again if you want to + if(!player.overlaps(this)){ + t_save +=FlxG.elapsed; + if(t_save>tm_save){ + t_save=0; + did_save=false; + } + } + } + break; + case s_dialog: + player.invincible=true; + player.invincible_timer=0.1; + + if(ctr==0){ + if(Registry.keywatch.JP_DOWN){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + ctr++; + save_dialog_selector.y +=8; + } + } else { + if(Registry.keywatch.JP_UP){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + ctr--; + save_dialog_selector.y -=8; + } + } + + if(Registry.keywatch.JP_ACTION_1){ + if(ctr==0){ + Save.save(); + autosave_started=true; + } + + save_dialog_bg.visible=save_dialog_selector.visible=save_dialog_text.visible=false; + ctr=0; + player.state=player.S_GROUND; + state=s_active; + did_save=true; + play("active"); + } + //something something dialog + break; + } + super.update(); + } + + private function update_global_checkpoint():Void + { + if(saved_coords)return; + saved_coords=true; + Registry.checkpoint.area=Registry.CURRENT_MAP_NAME; + Registry.checkpoint.x=x; + Registry.checkpoint.y=y; + trace("Check point updated:",Registry.checkpoint.area, Registry.checkpoint.x, Registry.checkpoint.y); + } + + private function oscillate_autosave():Void { + + if(autosave_started){ + switch(autosave_anim_ctr){ + case 0: + parent.autosave_icon.visible=true; + parent.autosave_icon.alpha=1; + autosave_anim_ctr++; + break; + case 1: + parent.autosave_icon.alpha -=(FlxG.elapsed / 3); + if(parent.autosave_icon.alpha<0.03){ + parent.autosave_icon.visible=false; + autosave_started=false; + autosave_anim_ctr=0; + } + break; + } + } + } + + override public function destroy():Void + { + + super.destroy(); + save_dialog_bg=save_dialog_selector=null; + save_dialog_text=null; + if(parent.autosave_icon !=null){ + parent.autosave_icon.visible=false; + } + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Console.hx b/AIR/intra/hsrc/entity/gadget/Console.hx new file mode 100644 index 0000000..d0166de --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Console.hx @@ -0,0 +1,278 @@ +package entity.gadget +{ +import data.CLASS_ID; +import data.SoundData; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; +import states.PlayState; + +/** + * ... + * @author Seagaia + */ +class Console extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.CONSOLE; + public var active_region:FlxSprite; + public var is_active:Bool=true; + public var INCREMENTED_REGISTRY:Bool=false; + public var did_init:Bool=false; + public var do_sound_test:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/console.png")] public var sprite_console:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_inside.png")] public static var embed_windmill_inside:Class; + + private var p:Player; + + + public function new(x:Int,y:Int,_xml:XML,_p:Player) + { + super(x, y); + xml=_xml; + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + loadGraphic(embed_windmill_inside, true, false, 48, 48); + addAnimation("active", [0, 1], 5, true); + addAnimation("green", [1], 3, true); + active_region=new FlxSprite(x + 16, y + 16); + active_region.makeGraphic(24, 20, 0x00ffffff); + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("spaz", [0, 1, 2], 20); + play("spaz"); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(16, 4, 0x00ffffff); + } else if(Registry.CURRENT_MAP_NAME=="DEBUG" && Registry.CURRENT_GRID_Y<3){ + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("spaz", [0, 1, 2], 20); + play("spaz"); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(x, y + 16); + do_sound_test=true; + } else { + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("active", [0, 1], 5, true); + addAnimation("green", [2], 3, true); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(16, 4, 0x00ffffff); + } + play("active"); + immovable=true; + active_region.solid=false; + + p=_p; + xml.@p="2"; + + if(xml.@alive=="false"){ + play("green"); + is_active=false; + } + //visible=false; + + Registry.subgroup_interactives.push(this); + } + + override public function update():Void + { + + if(state==S_SOUND){ + sound_test(); + super.update(); + return; + } + if(!is_active && !INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_PUZZLES_DONE++; + play("green"); + + } + + if(Registry.CURRENT_MAP_NAME=="WINDMILL" && !did_init){ + did_init=true; + Registry.GAMESTATE.sortables.remove(this, true); + Registry.GAMESTATE.bg_sprites.add(this); + } + if(Registry.CURRENT_MAP_NAME !="WINDMILL"){ + FlxG.collide(this, p); + } + if(p.overlaps(active_region)&& p.facing==UP &&(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2)){ + if(!Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening] && Registry.CURRENT_MAP_NAME=="WINDMILL"){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Windmill_Opening; + is_active=false; + xml.@alive="false"; + Registry.sound_data.get_small_health.play(); + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + DH.start_dialogue(DH.name_rock, DH.scene_rock_five, "NEXUS"); + } else if(do_sound_test){ + state=S_SOUND; + Registry.GAMESTATE.player.be_idle(); + } else { + is_active=false; + xml.@alive="false"; + Registry.sound_data.get_small_health.play(); + + } + + } + + super.update(); + } + private var state:Int=0; + private static inline var S_SOUND:Int=1; + private var soundtest_init:Bool=false; + private var sound_bg:FlxSprite; + private var sound_text:FlxBitmapFont; + private var sound_select_1:FlxSprite; + private var sound_select_2:FlxSprite; + private var snd_ctr:Int=0; + private static inline var snd_text:String="Jukebox!\nMuzak\nSFX"; + private function sound_test():Void { + if(soundtest_init==false){ + + sound_bg=new FlxSprite; + sound_bg.loadGraphic(Checkpoint.checkpoint_save_box_sprite, true, false, 80, 29); + sound_bg.scrollFactor.x=sound_bg.scrollFactor.y=0; + sound_bg.x=(160 - sound_bg.width)/ 2; + sound_bg.y=20 +(160 - sound_bg.height)/ 2; + + sound_text=EventScripts.init_bitmap_font(snd_text, "center", sound_bg.x + 5, sound_bg.y + 3, null, "apple_black"); + sound_select_1=new FlxSprite; + sound_select_1.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + sound_select_1.scrollFactor=new FlxPoint(0, 0); + sound_select_1.addAnimation("flash", [0, 1], 12); + sound_select_1.play("flash"); + sound_select_1.scale.x=-1; + + sound_select_1.x=sound_text.x + 4; + sound_select_1.y=sound_text.y + 8; + + var p:PlayState; + p=Registry.GAMESTATE; + p.fg_sprites.add(sound_bg); + p.fg_sprites.add(sound_text); + p.fg_sprites.add(sound_select_1); + soundtest_init=true; + } + + if(Registry.keywatch.JP_ACTION_2 &&((snd_ctr==1)||(snd_ctr==2))){ + sound_bg.visible=sound_text.visible=sound_select_1.visible=false; + Registry.GAMESTATE.player.state=Registry.GAMESTATE.player.S_GROUND; + state=0; + snd_ctr=0; + return; + } + if(snd_ctr==0){ + sound_bg.visible=sound_text.visible=sound_select_1.visible=true; + Registry.GAMESTATE.player.state=Registry.GAMESTATE.player.S_INTERACT; + snd_ctr=1; + } else if(snd_ctr==1){ + if(Registry.keywatch.JP_DOWN){ + sound_select_1.y +=8; + snd_ctr=2; + } + if(Registry.keywatch.JP_ACTION_1){ + snd_ctr=3; + sound_select_1.visible=false; + sound_text.text="MUSIC\n" + music_idx.toString(); + } + } else if(snd_ctr==2){ + if(Registry.keywatch.JP_UP){ + sound_select_1.y -=8; + snd_ctr=1; + } + if(Registry.keywatch.JP_ACTION_1){ + sound_text.text="SFX\n\n" + snd_idx.toString(); + snd_ctr=4; + sound_select_1.visible=false; + } + } else if(snd_ctr==3){ + do_music(); + } else if(snd_ctr==4){ + do_sfx(); + } + } + + + private static var sfxs:Array; + private var snd_idx:Int=0; + private function do_sfx():Void { + if(sfxs==null){ + var s:SoundData=Registry.sound_data; + sfxs=new Array(s.unlock, s.open, s.fall_in_hole, s.push_block, s.button_up, s.button_down, s.floor_crack, s.get_treasure, s.get_key, s.dash_pad_1, s.dash_pad_2, s.spring_bounce, s.puddle_up, s.puddle_down, s.puddle_step, s.ladder_step, s.sun_guy_death_l, s.sun_guy_death_s, s.sun_guy_scream, s.sun_guy_charge, s.player_jump_down, s.player_jump_up, s.enter_door, s.player_hit_1, s.broom_hit, s.teleport_up, s.teleport_down, s.shieldy_hit, s.shieldy_ineffective, s.red_cave_rise, s.redboss_moan, s.small_wave, s.big_wave, s.redboss_death, s.dog_dash, s.talk_group, s.wb_tap_ground, s.wb_hit_ground, s.wb_shoot, s.wb_moan, s.wb_moan_2, s.talk_death, s.teleguy_up, s.teleguy_down, s.gasguy_shoot, s.gasguy_move, s.rat_move, s.sb_split, s.sb_hurt, s.sb_dash, s.sb_ball_appear, s.sf_move, s.dustmaid_alert, s.elevator_open, s.elevator_close, s.flame_pillar_group, s.fireball_group, s.get_small_health, s.big_door_locked, s.hitground1, s.fall1, s.slasher_atk, s.on_off_laser_shoot, s.dialogue_bloop, s.cicada_chirp, s.briar_shine_group, s.stream_sound, s.dust_explode_group, s.mushroom_sound_group, s.slime_walk_group, s.slime_splash_group, s.slime_shoot_group, s.four_shooter_pop_group, s.four_shooter_shoot_group, s.mover_move_group, s.mover_die_group, s.bubble_group, s.bubble_triple_group, s.laser_pew_group, s.menu_move_group, s.menu_select_group, s.pause_sound_group, s.enemy_explode_1_group, s.swing_broom_group, s.water_step_group, s.dialogue_blip_group, s.sparkle_group, s.dog_bark_group, Dust.dust_sound); + // Init array + } + if(Registry.keywatch.JP_ACTION_2){ + snd_ctr=2; + sound_text.text=snd_text; + sound_select_1.visible=true; + } + + if(Registry.keywatch.JP_RIGHT && snd_idx0){ + snd_idx -=1; + sound_text.text="SFX\n\n" + snd_idx.toString(); + } + + if(Registry.keywatch.JP_ACTION_1){ + if(sfxs[snd_idx]){ + if("FlxSound"==FlxU.getClassName(sfxs[snd_idx], true)){ + sfxs[snd_idx].play(); + } else { + Registry.sound_data.play_sound_group(sfxs[snd_idx]); + } + } + } + } + + private static var musicks:Array; + private var music_idx:Int=0; + + private function do_music():Void { + if(musicks==null){ + musicks=new Array("TITLE", "BLANK", "NEXUS", "STREET", "OVERWORLD", "BEDROOM", "BEDROOMBOSS", "MITRA", "FIELDS", "BEACH", "REDSEA", "FOREST", "CLIFF", "REDCAVE", "REDCAVEBOSS", "CROWD", "CROWDBOSS", "WINDMILL", "SUBURB", "SPACE", "APARTMENT", "APARTMENTBOSS", "ROOF", "HOTEL", "HOTELBOSS", "CELL", "CIRCUS", "CIRCUSBOSS", "PRETERMINAL", "SAGEFIGHT", "TERMINAL", "GO", "HAPPYINIT", "HAPPY", "BLUE", "BRIARFIGHT", "ENDING"); + } + + if(Registry.keywatch.JP_ACTION_2){ + snd_ctr=1; + sound_select_1.visible=true; + sound_text.text=snd_text; + } + + if(Registry.keywatch.JP_RIGHT && music_idx0){ + music_idx--; + sound_text.text="MUSIC\n" + music_idx.toString(); + } + + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.start_song_from_title(musicks[music_idx]); + } + } + + override public function destroy():Void + { + super.destroy(); + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/CrackedTile.hx b/AIR/intra/hsrc/entity/gadget/CrackedTile.hx new file mode 100644 index 0000000..04b2971 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/CrackedTile.hx @@ -0,0 +1,64 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +/** + * ... + * @author Seagaia + */ +class CrackedTile extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/crackedtiles.png")] public var C_CRACKED_TILES:Class; + + public var xml:XML; + public var on:Bool=false; + public var broken:Bool=false; + public var TIMER_DEFAULT:Float=1.0; + public var timer:Float=TIMER_DEFAULT; + public var hole:Hole; + public var type:String="CrackedTile"; + + private var player:Player; + + public var cid:Int=CLASS_ID.CRACKEDTILE; + + public function new(_x:Int, _y:Int, _xml:XML, _player:Player) + { + super(_x, _y); + xml=_xml; + immovable=true; + solid=false; + loadGraphic(C_CRACKED_TILES, false, false, 16, 16); + frame=parseInt(xml.@frame); + if(Registry.CURRENT_MAP_NAME=="BEDROOM")frame=0; + hole=new Hole(x, y, null, _player,frame); + hole.visible=false; + + player=_player; + } + + override public function update():Void { + + if(player.state !=player.S_AIR && player.overlaps(this)){ + on=true; + } + if(broken){ + return; + } + if(on){ + timer -=FlxG.elapsed; + if(timer<0){ + Registry.sound_data.floor_crack.play(); + broken=true; + visible=false; + hole.visible=true; + } + } + on=false; + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Dash_Pad.hx b/AIR/intra/hsrc/entity/gadget/Dash_Pad.hx new file mode 100644 index 0000000..c332581 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Dash_Pad.hx @@ -0,0 +1,84 @@ +package entity.gadget +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + + +class Dash_Pad extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/dash_pads.png")] public static var dash_pad_sprite:Class; + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var player_tracker:FlxSprite=new FlxSprite(); + + private var type:Int; + + + private var disabled:Bool=false; + private var t_disabled:Float=0; + private var tm_disabled:Float=1.0; + + + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + parent=_parent; + player=_player; + super(parseInt(xml.@x), parseInt(xml.@y)); + + type=parseInt(xml.@frame); + + loadGraphic(dash_pad_sprite, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="DEBUG" || 1){ + if(type==0){ + frame=4; + type=UP; + } else if(type==2){//down + frame=6; + type=DOWN; + } else if(type==1){//right + frame=5; + type=RIGHT; + } else if(type==3){ + frame=7; + type=LEFT; + } + + + } + + player_tracker.makeGraphic(1, 1, 0x00123123); + + } + + override public function update():Void + { + player_tracker.x=player.midpoint.x; + player_tracker.y=player.midpoint.y; + + if(!disabled &&(player.state==player.S_GROUND)&& player_tracker.overlaps(this)){ + player.SIG_DASH=true; + player.SIG_DASH_TYPE=type; + + alpha=0.5; + disabled=true; + trace("Sending SIG DASH(DURL)", type.toString(16)); + } else { + t_disabled +=FlxG.elapsed; + if(t_disabled>tm_disabled){ + t_disabled=0; + alpha=1; + disabled=false; + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Door.hx b/AIR/intra/hsrc/entity/gadget/Door.hx new file mode 100644 index 0000000..14bb2f4 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Door.hx @@ -0,0 +1,736 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.interactive.Fisherman; +import entity.player.HealthBar; +import entity.player.Player; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import states.PauseState; +import states.PlayState; +import global.Registry; +// Door class - based on "type" input, load +/* the right sprite, whether it's visible, etc,,,whatever the need arises */ +class Door extends FlxSprite + + +{ + +public static inline var INVISIBLE_TYPE:Int=1; +public static inline var NORMAL_TYPE:Int=2; +public static inline var THIN_INVISIBLE_TYPE:Int=3; +public static inline var BLANK_PORTAL_UP_TYPE:Int=4; +public static inline var INVISIBLE_TYPE_UP:Int=5; +public static inline var NO_ENTRANCE_INVIS:Int=6; +public static inline var WHIRLPOOL:Int=7; +public static inline var FALL_DOOR:Int=8; +public static inline var NO_MOVE_DOOR:Int=9; +public static inline var RIGHT_DOOR:Int=11; +public static inline var LEFT_DOOR:Int=10; +public static inline var WIDE_5_DOOR_D:Int=12; +public static inline var TALL_5_DOOR_L:Int=13; +public static inline var WIDE_5_DOOR_U:Int=14; +public static inline var TALL_5_DOOR_R:Int=15; +public static inline var NEXUS_PAD:Int=16; + +/* descriptive constants that essentially act like shitty keys + * for the state of certain doors in the game. */ +private static inline var Door_Red_Cave_Left:Int=5; +private static inline var Door_Red_Cave_Right:Int=7; +private static inline var Door_Red_Cave_North:Int=8; + +private static inline var Door_CrowdBossFilm:Int=14; + +/* Nexus door constants */ +private static inline var Door_Nexus2Blank:Int=4; +public static inline var Door_Nexus2Street:Int=13; + +public static inline var Door_Nexus_Cell:Int=45; +public static inline var Door_Nexus_Suburb:Int=46; +public static inline var Door_Nexus_Space:Int=47; +public static inline var Door_Nexus_Fields:Int=48; +public static inline var Door_Nexus_Overworld:Int=49; +public static inline var Door_Nexus_Forest:Int=50; +public static inline var Door_Nexus_Terminal:Int=51; +public static inline var Door_Nexus_Go:Int=52; +public static inline var Door_Nexus_Redsea:Int=53; +public static inline var Door_Nexus_Cliff:Int=54; +public static inline var Door_Nexus_Beach:Int=55; +public static inline var Door_Nexus_Blue:Int=56; +public static inline var Door_Nexus_Happy:Int=57; +public static inline var Door_Nexus_Circus:Int=58; +public static inline var Door_Nexus_Hotel:Int=59; +public static inline var Door_Nexus_Apartment:Int=60; +public static inline var Door_Nexus_Crowd:Int=61; +public static inline var Door_Nexus_Redcave:Int=62; +public static inline var Door_Nexus_Bedroom:Int=63; +public static inline var Door_Nexus_Windmill:Int=64; +private static inline var Door_Go_Secret:Int=71; + + + +private static var Nexus_Door_Keys:Array=new Array(4, 13, 45, 46, 47, 48, 49, 50, 51, 52, 53,54,55,56,57,58,59,60,61,62,63,64); +// Maps door keys ->indices in the preview spritesheet +// E,g, if you addded the graphic for REDSEA, then you'd look up the key(53), and then add "53:x" to the object below, +// where x is the first frame of the 4-frame animation in the spritesheet +private static var Nexus_Graphic_Hash:Dynamic={ 13:0, 49:4 , 62:8, 61:12, 60:16, 59:20, 58:24, 54:28, 50:32, 64:36, 53:40, 55:44 +, 63:48, 48:52,52:56,51:60,57:64,47:68,45:72,46:76,56:80}; +private static var Nexus_Key_Hash:Dynamic={ // For the states + 4:0, 13:1, 45:2, 46:3, + 47:4, 48:5, 49:6, 50:7, + 51:8, 52:9, 53:10, 54:11, + 55:12, 56:13, 57:14, 58:15, + 59:16, 60:17, 61:18, 62:19, +63:20, 64:21 }; +private var nexus_jump_exit_d:Float=0; + + +//defaults to -1 +public static var Next_Door_Pair_ID:Int=-1; + +/** + * Whether or not this door's sibling was used to enter the map. + * Used in determining which door is the "entrance" door, allowing the + * player to stand on it indefinitely until he moves off. + */ +private var is_entered_door:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/doors.png")] public static var Door_Sprites:Class; + //[Embed(source="../../res/sprites/decoration/whiteportal.png")] public static var White_Portal_Sprite:Class; + //[Embed(source="../../res/sprites/decoration/whirlpool.png")] public static var Whirlpool_Door_Sprite:Class; + //[Embed(source="../../res/sprites/gadgets/nexus_door.png")] public static var Sprite_nexus_door:Class; + //[Embed(source="../../res/sprites/decoration/nexus_door_preview_overlay.png")] public static var Nexus_door_previews_embed:Class; + //[Embed(source="../../res/sprites/decoration/nexus_door_preview_fade.png")] public static var Nexus_door_overlay_embed:Class; + //[Embed(source="../../res/sprites/decoration/nexus_cardgem.png")] public static inline var embed_nexus_cardgem:Class; + public var local_id:Int; + public var mapName:String; + // Constants used to lookup values in the door lookup array + public var XVAL:Int=0; + public var YVAL:Int=1; + public var MAPVAL:Int=2; + public var xml:XML; + public var index:Int;// The key Into the door lookup array + public var inactive:Bool=false;//whether or not this door 'works' + public var type:Int; + public var parent:Dynamic;//playstate or roamstate + + public var nexus_gem:FlxSprite; + public var preview:FlxSprite=new FlxSprite; + public var preview_fade:FlxSprite=new FlxSprite; + public var undim_region:FlxObject=new FlxObject; + public var is_dimmed:Bool=false; + + public var is_nexus_door:Bool=false; + private var start_nexus_door_outro:Bool=false; + private var nexus_ctr:Int=0; + + public var cid:Int=CLASS_ID.DOOR; + public function new(_x:Int, _y:Int, _xml:XML, _parent:Dynamic) + { + super(_x, _y); + + parent=_parent; + + mapName=Registry.CURRENT_MAP_NAME; + loadGraphic(Door_Sprites, false, false, 16, 16); + + immovable=true; + type=parseInt(_xml.@type);// behavior + + index=parseInt(_xml.@frame);// wher eit is + + if(index==Next_Door_Pair_ID || Next_Door_Pair_ID==-1){ + trace("is entered door! ", index); + is_entered_door=true; + } + + if(Registry.CURRENT_GRID_X==2 && Registry.CURRENT_GRID_Y==2 && Registry.CURRENT_MAP_NAME=="GO"){ + if(false==Registry.GE_States[Registry.GE_QUEST_SPACE]){ + exists=false; + } + } + + + xml=_xml; + + makeGraphic(16, 16, 0x00ffffff); + + + if(Registry.CURRENT_MAP_NAME=="NEXUS" && Nexus_Door_Keys.indexOf(index)!=-1){ + + + + + var doorPair:Array=Registry.DOOR_INFO[index]; + + loadGraphic(Sprite_nexus_door, true, false, 32, 32); + visible=false; + addAnimation("locked", [0, 1], 12); + addAnimation("open", [2]); + is_nexus_door=true; + + inactive=!is_active(index); + + if(inactive){ + play("locked"); + } else { + play("open"); + } + + + // Load the door preview graphics. By default they are hiden, they will + // pop iinto view if that nexus door is open + load_nexus_preview_graphics(index); + preview_fade.alpha=0.5; + if(inactive){ + height=32; + preview.visible=preview_fade.visible=false; + } else { + + preview.visible=preview_fade.visible=true; + } + is_nexus_door=true; + parent.bg_sprites.add(preview); + parent.bg_sprites.add(preview_fade); + + if(Registry.DOOR_INFO[index]==null || Registry.DOOR_INFO[index][0]==null || Registry.DOOR_INFO[index][1]==null){ + exists=false; + } else { + var check_name:String=Registry.DOOR_INFO[index][0][MAPVAL]=="NEXUS" ? Registry.DOOR_INFO[index][1][MAPVAL]:Registry.DOOR_INFO[index][0][MAPVAL]; + } + + if(true==have_all_cards(check_name)){ + nexus_gem=new FlxSprite(x, y + 2, embed_nexus_cardgem); + parent.bg_sprites.add(nexus_gem); + //trace(check_name, " has all cards."); + } else { + + //trace(check_name, " not has all."); + } + + undim_region=new FlxObject(x, y + 32, 32, 25); + + } else { + if(!is_active(index)){ + trace("Door ",index," inactive"); + inactive=true; + } + } + + + if(is_nexus_door){ + } else if(type==Door.THIN_INVISIBLE_TYPE){ + makeGraphic(16, 4, 0x00ffffff); + visible=false; + height=4; + } else if(type==Door.BLANK_PORTAL_UP_TYPE){ + loadGraphic(White_Portal_Sprite, true, false, 16, 16); + width=height=2; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + + addAnimation("a", [4,5], 8, true); + } else { + + addAnimation("a", [0, 1, 2], 10, true); + } + play("a"); + centerOffsets(true); + } else if(type==Door.INVISIBLE_TYPE_UP){ + width=height=8; + centerOffsets(true); + } else if(type==Door.NO_ENTRANCE_INVIS){ + x=-65234;//lol + y=-3422; + } else if(type==Door.LEFT_DOOR){ // Generally these are on the left side of a map + width=16; + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + width=20;// BAD HAX MAN + } + } else if(type==Door.WHIRLPOOL){ + loadGraphic(Whirlpool_Door_Sprite, true, false, 16, 16); + addAnimation("whirl", [0, 1], 6, true); + addAnimation("transition", [3, 4,4], 6, false); + addAnimation("whirl_red", [4, 5], 6, true); + if(Fisherman.fisherman_dead){ + play("whirl_red"); + } else { + play("whirl"); + } + } else if(type==Door.WIDE_5_DOOR_D || type==Door.WIDE_5_DOOR_U){ + width=80; + x -=32; + offset.x=-32; + } else if(type==Door.TALL_5_DOOR_L || type==Door.TALL_5_DOOR_R){ + height=80; + y -=32; + offset.y=-32; + } else if(type==Door.NEXUS_PAD){ + x=-60000; + y=-60000; + } else { + trace("Otherwise...", index); + width=height=14; + centerOffsets(true); + } + + } + + override public function update():Void { + if(start_nexus_door_outro){ + nexus_outro(); + super.update(); + return; + } + + if(type==WHIRLPOOL){ + if(Fisherman.fisherman_dead){ + if(_curAnim.name=="whirl"){ + play("transition"); + } + + if(_curAnim.name=="transition" && _curFrame==_curAnim.frames.length - 1){ + play("whirl_red"); + } + } + } + + /* Bugginess in FlxG.collide? When x values are aligned, + * collide returns true even though they're separated by 48 pixels */ + if(!is_nexus_door && parent.player.touches(this)){ + if(!is_entered_door ||(is_entered_door && !parent.player.hasnt_stepped_off_the_door_yet)){ + if(doorCallback(this, parent.player)){ + exists=false; + } + } + // jesus christ look at that conditional + } else if(is_nexus_door && !inactive){ + y +=3; + if(parent.player.touches(this)){ + parent.player.actions_disabled=true; + if(parent.player.facing==UP && Registry.keywatch.JP_ACTION_1 && !start_nexus_door_outro){ + start_nexus_door_outro=true; + } + } + y -=3; + } else { + y +=2; + if(is_entered_door && parent.player.hasnt_stepped_off_the_door_yet){ + parent.player.hasnt_stepped_off_the_door_yet=false; + } else if(is_nexus_door && parent.player.touches(this)){ + parent.player.actions_disabled=true; + if(parent.player.facing==UP && Registry.keywatch.JP_ACTION_1){ + parent.player.be_idle(); + //DH.dialogue_popup("The portal does not appear to be active."); + DH.dialogue_popup(DH.lk("door", 0)); + } + } + y -=2; + } + + if(parent.SWITCH_MAPS)return; + + if(is_nexus_door){ + if(!inactive){ + if(is_dimmed){ + if(undim_region.overlaps(parent.player)){ + is_dimmed=false; + preview.play("a"); + } + EventScripts.send_property_to(preview_fade, "alpha", 0.5, 0.01); + } else { + if(!undim_region.overlaps(parent.player)){ + is_dimmed=true; + preview.play("stop"); + } + EventScripts.send_property_to(preview_fade, "alpha", 0, 0.01); + } + } + + if(Math.abs(x - parent.player.x)<48 && Math.abs(y - parent.player.y)<48){ + if(parent.state==parent.S_NORMAL){ + FlxG.collide(parent.player, this); + } + } + } else { + if(inactive && is_active(index)){ + inactive=false; + } + } + super.update(); + } + + // There is nothing good about this entire class's code. + // this function does nothing but reinforce that fact. + private function nexus_outro():Void { + parent.player.actions_disabled=true; + switch(nexus_ctr){ + case 0: + var p:Player=parent.player; + p.solid=false; + p.parabola_thing=new Parabola_Thing(parent.player, 16, 0.5, "offset", "y"); + p.my_shadow.visible=true; + p.my_shadow.x=p.x + 2; + p.my_shadow.y=p.y + 7; + parent.bg_sprites.add(p.my_shadow); + p.my_shadow.frame=3; + p.s_interact_shadow_visibility_override=true; + p.state=p.S_INTERACT; + Registry.sound_data.player_jump_up.play(); + nexus_ctr++; + p.play("jump_u"); + break; + case 1: + parent.player.y -=0.57; + nexus_jump_exit_d +=0.57; + if(nexus_jump_exit_d>7){ + parent.player.s_interact_shadow_visibility_override=false; + } + parent.player.my_shadow.x=parent.player.x + 2; + parent.player.my_shadow.y=parent.player.y + 5; + if(parent.player.parabola_thing.tick()){ + parent.bg_sprites.remove(parent.player.my_shadow, true); + parent.player.state=parent.player.S_GROUND; + parent.player.velocity.y=0; + parent.player.my_shadow.visible=false; + doorCallback(this, parent.player); + } + } + } + + /* Lookup corresponding door and switch states, also revive sprites with permanence<=1 */ + public function doorCallback(door:Door, player:Player):Bool { + if(door.inactive)return false; + if(player.state !=player.S_GROUND && player.state !=player.S_LADDER)return false; + door.getNextParams(); + return true; + } + /** + * If there is a door(a,mid)and(mid,b)then calling this function when + * you touch a or b will send you to respectively, b or a. Useful for skipping unfinished + * areas without mucking around with the level editor. + * @param a + * @param mid + * @param b + * @param a_id + * @param b_id + */ + private function warp(a:String, mid:String, b:String, a_id:Int, b_id:Int):Void { + if(mapName==a && index==a_id){ + index=b_id; + Registry.CURRENT_MAP_NAME=mapName=mid; + yeah_no=true; + } else if(mapName==b && index==b_id){ + index=a_id; + Registry.CURRENT_MAP_NAME=mapName=mid; + yeah_no=true; + } + } + + //used in conjunction with warp to do something god knows what + private var yeah_no:Bool=false; + /* Sets the correct global values(map name, entrance x/y)based on the door. Then call switch state + * whereever ye want */ + public function getNextParams():Void { + // Override door ehaviors for demo since DEEP areas arent finished + // Door 3(Fields-beach)and 34(fields-windmill)are moved to forest for the time being. + if(Intra.is_demo){ + //warp("CLIFF", "SPACE", "HOTEL", 39, 25); + //warp("REDCAVE", "TRAIN", "CIRCUS", 41, 31); + //warp("OVERWORLD", "SUBURB", "APARTMENT", 37, 18); + //warp("OVERWORLD", "FIELDS", "FOREST", 33, 35); + + } + var doorPair:Array=Registry.DOOR_INFO[index]; + + Next_Door_Pair_ID=index; + var pairIndex:Int; + + + if(yeah_no){ + if(doorPair[0][MAPVAL]==mapName){ + pairIndex=1; + } else { + pairIndex=0; + } + } else { + if(doorPair[0][XVAL]==(x - offset.x)&& doorPair[0][YVAL]==(y - offset.y)&& doorPair[0][MAPVAL]==mapName){ + pairIndex=1; + } else { + pairIndex=0; + } + } + + + if(Intra.is_release){ + if(Registry.CURRENT_MAP_NAME=="FIELDS" &&(Registry.CURRENT_GRID_X<5 || Registry.CURRENT_GRID_Y>1)){ + //if((Registry.CURRENT_GRID_X !=1 || Registry.CURRENT_GRID_Y !=5)&& + //(Registry.CURRENT_GRID_X !=10 || Registry.CURRENT_GRID_Y !=8)){ + // 10 8 windmill + parent.player.hasnt_stepped_off_the_door_yet=true; + //DH.dialogue_popup("A voice:Sorry, but this area is as far as the demo goes! To proceed beyond, purchase the full version from www.anodynegame.com ! Thanks for playing!"); + DH.dialogue_popup("A voice:Sorry, but this area is blocked off in this demo! Buy the full version to explore more than these fields!"); + parent.player.be_idle(); + return; + //} + } + } + + Registry.NEXT_MAP_NAME=doorPair[pairIndex][MAPVAL]; + Registry.ENTRANCE_PLAYER_X=doorPair[pairIndex][XVAL]; + Registry.ENTRANCE_PLAYER_Y=doorPair[pairIndex][YVAL]; + + + //Special case things when transitioning + + Registry.E_PLAY_ROOF=false; + Registry.BOI=false; + // If coming from SPACE ->Hotel, play the roof song + if(Registry.NEXT_MAP_NAME=="HOTEL" && index==25){ + Registry.E_PLAY_ROOF=true; + + } else if(index==26){ + // Always change songs going between roof and hotel + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + // Coming from inside to outside, play roof + if(Registry.CURRENT_GRID_Y !=0){ + Registry.E_PLAY_ROOF=true; + } else { + } + } else if(index==14){ + if(!Registry.Event_Biofilm_Broken){ + return; + } + // Don't allow you to enter GO secret hut till quest is over + } else if(index==Door_Go_Secret && false==Registry.GE_States[Registry.GE_QUEST_SPACE]){ + return; + } else if(index==73 || index==75){ + // If we are entering a SUBURB house with no filter.. + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + if(Registry.CURRENT_GRID_Y<4){ + Registry.sound_data.trigger_soft=true; + Registry.E_NEXT_MAP_NO_STATIC=true; + } + } else if(index==74 || index==76 || index==78 || index==77){ + if(Registry.CURRENT_GRID_Y<4){ + Registry.E_NEXT_MAP_TURN_ON_LIGHT=true; + Registry.E_NEXT_MAP_DARKNESS_8=true; + } + } else if(index==94 && Registry.CURRENT_MAP_NAME=="REDSEA"){ // Entering BoI + Registry.E_PLAY_ROOF=true; + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + Registry.BOI=true; + } + + + trace("Getting next door...\ninput is(", x, ",", y, ",", Registry.CURRENT_MAP_NAME); + trace("offsets;", offset.x, offset.y); + trace("New:", Registry.ENTRANCE_PLAYER_X, Registry.ENTRANCE_PLAYER_Y, Registry.NEXT_MAP_NAME); + //trace(Registry.ENTRANCE_PLAYER_Y % Registry.SCREEN_HEIGHT_IN_PIXELS); + /* Use the just-stepped-on-door's type to determine where the player enters + * the next map in reference to the next door. */ + var door_type:Int=parseInt(xml.@type); + var curmap:String=Registry.CURRENT_MAP_NAME; + var next_y:Int=Registry.ENTRANCE_PLAYER_Y; + var next_x:Int=Registry.ENTRANCE_PLAYER_X; + + var going_to_nexus:Bool=false; + if(Registry.CURRENT_MAP_NAME !="NEXUS" && Registry.CURRENT_MAP_NAME !="BLANK" && Nexus_Door_Keys.indexOf(index)!=-1){ + going_to_nexus=true; + Registry.sound_data.teleport_up.play(); + } else if(is_nexus_door){ + Registry.sound_data.teleport_up.play(); + } + + // Based on this input door, determine which way + // hthe player should face in the next map + // and where it should be positioned wrt next map's door. + if(going_to_nexus){ + next_y +=35; + next_x +=10; + Registry.sound_data.enter_door.play(); + } else if(door_type==INVISIBLE_TYPE_UP || door_type==WIDE_5_DOOR_U){ + next_y=doorPair[pairIndex][YVAL] - 20; + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_u"; + Registry.GAMESTATE.player.facing=UP; + Registry.sound_data.enter_door.play(); + } else if(door_type==INVISIBLE_TYPE || door_type==WIDE_5_DOOR_D){ + trace("Door type:Invisible Down"); + next_y +=16; + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_d"; + Registry.GAMESTATE.player.facing=DOWN; + Registry.sound_data.enter_door.play(); + } else if(door_type==BLANK_PORTAL_UP_TYPE){ + Registry.sound_data.teleport_up.play(); + Registry.EVENT_TELEPORT_DOWN_SOUND=true; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + next_y -=12; + } + + } else if(door_type==WHIRLPOOL){ + + Registry.E_Enter_Whirlpool_Down=true; + if(curmap=="REDSEA"){ + next_y -=36; + } + } else if(door_type==FALL_DOOR){ + Registry.E_Enter_Fall_Down=true; + } else if(door_type==NO_MOVE_DOOR){ + if(is_nexus_door){ + next_x +=10; + next_y +=8; + } + Registry.sound_data.enter_door.play(); + } else if(door_type==RIGHT_DOOR || door_type==TALL_5_DOOR_R){ + next_x +=17; + Registry.sound_data.enter_door.play(); + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_r"; + Registry.GAMESTATE.player.facing=RIGHT; + } else if(door_type==LEFT_DOOR || door_type==TALL_5_DOOR_L){ + next_x -=16; + Registry.sound_data.enter_door.play(); + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_l"; + Registry.GAMESTATE.player.facing=LEFT; + } else { + Registry.sound_data.enter_door.play(); + next_y +=20; + } + Registry.ENTRANCE_PLAYER_Y=next_y; + Registry.ENTRANCE_PLAYER_X=next_x; + + parent.SWITCH_MAPS=true; + } + + private function change_stats(amount:Int,give_jump:Bool):Void { + amount=amount>16 ? 16:amount; + if(Registry.MAX_HEALTH; + loadGraphic(DUST_SPRITE, true, false, 16, 16); + dust_sound.loadEmbedded(S_DUST_POOF); + addAnimation("poof", [0, 1, 2, 3, 4], 13, false); + addAnimation("unpoof", [3, 2, 1, 0], 13, false); + addAnimationCallback(on_anim_change); + + Registry.subgroup_dust.push(this); + + if(parseInt(xml.@frame)==1){ + dame_frame=T_PUZZLE; + } + } + + public function hit(hitter:String, player_dir:Int):Int { + if(hitter=="broom" && visible){ + play("poof"); + if(!Registry.GE_States[Registry.GE_Swept_Dust]){ + Registry.GE_States[Registry.GE_Swept_Dust]=true; + if(!Intra.is_test){ + //DH.dialogue_popup("Your broom is now full of dust! Attack again to place it."); + DH.dialogue_popup(DH.lk("dust", 0)); + } + } + dust_sound.play(); + + } + if(frame==4){ + visible=false; + + } + return Registry.HIT_NORMAL; + } + + override public function update():Void + { + if(velocity==null){ + exists=false; + return; + } + /* Set midpoint for collision with conveyer-type tiles. */ + midpoint.x=x + 8; + midpoint.y=y + 8; + if(!ON_CONVEYER){ + velocity.x=velocity.y=0; + } + + + + /* Check for overlap with a Propelled and if so, + * don't fall in a hole. If just poofed, then propel the Propelled. o_o*/ + for(var propelled:Propelled in Registry.subgroup_propelled){ + if(propelled !=null){ + if(propelled.overlaps(this)){ + + // Instead, if the propelled is inactive, turn it on, and remove teh dust + // If the propelled is active do nothing + + propelled.turn_on(); + play("poof"); + if(frame==4){ + x=-5000; + exists=false; + } + + on_propelled=true; + + /*if(poofed_by_player_landing){ + propelled.propel_from_dust_poof(); + }*/ + } + } + } + + if(!on_propelled &&(this !=parent.player.raft)){ + if(fell_in_hole){ + play("poof"); + if(frame==4)x=-5000; + } + } + on_propelled=false; + + + if(parent.player.raft !=this){ + FlxG.collide(this, parent.curMapBuf);// Can set ON_CONVEYER to true. + } + + /* If dust is on the conveyer and player touches it, then the + * played should ride on top of it */ + if(ON_CONVEYER){ + if(parent.player.ON_RAFT==false && parent.player.state !=parent.player.S_AIR && parent.player.midpoint.xx && + parent.player.midpoint.y>y && parent.player.midpoint.y140){ + angle=90; + }*/ + + //HACKS + if(Registry.CURRENT_MAP_NAME=="CROWD" && Registry.CURRENT_GRID_X==0 && Registry.CURRENT_GRID_Y==4 && REQUIRED_PUZZLES==3){ + REQUIRED_PUZZLES=2; + } + Registry.subgroup_gates.push(this); + } + + /** + * TODO:Enemies that are perma-dead, as well as perma-solved + * puzzles should count in the GRID_..._... counter. + * + * possible source of bugs - dead enemies not auto-incrementing the counter. + * I checked over this on 7/23, though., seems okay + */ + + override public function update():Void { + + if(player_hasnt_stepped_off){ + if(!player.overlaps(this)){ + play("close"); + Registry.sound_data.hitground1.play(); + player_hasnt_stepped_off=false; + } + } + if(Registry.CURRENT_GRID_X !=grid_coords.x || Registry.CURRENT_GRID_Y !=grid_coords.y){ + return; + } + + FlxG.collide(this, player); + /* If ever alive and not closed, then close */ + if(frame !=CLOSED_FRAME){ + //close it if we're not touching + if(xml.@alive=="true" && !player.overlaps(this)){ + play("close"); + Registry.sound_data.hitground1.play(); + solid=true; + } + } + if(Registry.GRID_ENEMIES_DEAD>=REQUIRED_ENEMIES){ + xml.@alive="false"; + } else if(Registry.GRID_PUZZLES_DONE>=REQUIRED_PUZZLES){ + xml.@alive="false"; + } else if(is_temporary){ + xml.@alive="true"; + } + + if(frame==CLOSED_FRAME && xml.@alive=="false"){ + Registry.sound_data.open.play(); + play("rise"); + solid=false; + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Go_Detector.hx b/AIR/intra/hsrc/entity/gadget/Go_Detector.hx new file mode 100644 index 0000000..10aef81 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Go_Detector.hx @@ -0,0 +1,112 @@ +package entity.gadget +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; + + + +class Go_Detector extends AnoSprite +{ + + private var map:FlxTilemap; + public var door:FlxSprite; + + private static inline var RED_ID:Int=60; + private static inline var GREEN_ID:Int=62; + private static inline var YELLOW_ID:Int=63; + private static inline var BLUE_ID:Int=61; + + private var RED_PT:Point=new Point(0 + 2, 4 + 2); + private var BLUE_PT:Point=new Point(5 + 2, 3 + 2); + private var GREEN_PT:Point=new Point(4 + 2, 1 + 2); + private var YELLOW_PT:Point=new Point(1 + 2, 1 + 2); + + private static inline var s_closed:Int=0; + private static inline var s_opening:Int=1; + private static inline var s_open:Int=2; + + public function new(args:Array) + { + super(args); + + makeGraphic(4, 4, 0xff151515); + + door=new FlxSprite(0, 0); + door.makeGraphic(16, 16, 0xffff0000); + + xml.@p="2"; + + + if(xml.@alive=="false"){ + state=s_open; + door.color=0x00ff00; + } else { + state=s_closed; + + } + + if(Registry.CURRENT_GRID_X==0 && Registry.CURRENT_GRID_Y==4){ + RED_PT.x=2 + 1;RED_PT.y=2 + 3; + BLUE_PT.x=2 + 4;BLUE_PT.y=2 + 1; + GREEN_PT.x=2 + 4;GREEN_PT.y=2 + 3; + YELLOW_PT.x=2 + 3;YELLOW_PT.y=2 + 0; + } + visible=door.visible=false; + + } + + override public function update():Void + { + if(Registry.GE_States[Registry.GE_Briar_Blue_Done]){ + Registry.GRID_PUZZLES_DONE=1; + } + if(!did_init){ + did_init=true; + map=parent.curMapBuf; + parent.sortables.add(door); + door.x=tl.x + 50; + door.y=tl.y + 16; + } + + if(state==s_closed){ + var r:Int=map.getTile(RED_PT.x, RED_PT.y); + var g:Int=map.getTile(GREEN_PT.x, GREEN_PT.y); + var b:Int=map.getTile(BLUE_PT.x, BLUE_PT.y); + var y:Int=map.getTile(YELLOW_PT.x, YELLOW_PT.y); + + + if(r==RED_ID && y==YELLOW_ID && g==GREEN_ID && b==BLUE_ID){ + xml.@alive="false"; + state=s_opening; + Registry.sound_data.open.play(); + + } + } else if(state==s_opening){ + door.alpha -=0.07; + if(door.alpha==0){ + state=s_open; + Registry.GRID_PUZZLES_DONE +=1; + door.color=0x00ff00; + } + } else if(state==s_open){ + + } + + + + super.update(); + } + + override public function destroy():Void + { + RED_PT=BLUE_PT=GREEN_PT=YELLOW_PT=null; + parent.sortables.remove(door, true); + door.destroy(); + door=null; + + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Growth_Gate.hx b/AIR/intra/hsrc/entity/gadget/Growth_Gate.hx new file mode 100644 index 0000000..0ab77e4 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Growth_Gate.hx @@ -0,0 +1,58 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; + +/** + * Gate that only opens with the required number of growths + * DAME PARAMS: + * type:# of growths to open door + * p:2 + * alive:t/f, whether it should spawn + */ +class Growth_Gate extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/growth_gate.png")] public static var sprite_growth_gate:Class; + + public var growth_requirement:Int; + public var xml:XML; + public var active_region:FlxSprite; + public var cid:Int=CLASS_ID.GROWTH_GATE; + public function new(_xml:XML) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + growth_requirement=parseInt(xml.@type); + + loadGraphic(sprite_growth_gate, true, false, 16, 32); + addAnimation('disappear', [0, 1, 2, 3,4], 4, false); + immovable=true; + frame=0; + active_region=new FlxSprite(x, y + height); + active_region.makeGraphic(width, 4, 0xff00ffff); + + if(xml.@alive=="false"){ + visible=false; + } + } + + override public function update():Void + { + if(frame==4){ + xml.@alive="false"; + } + super.update(); + } + public function check_open(f:FlxSprite):Void { + + if(f.overlaps(active_region)){ + if(xml.@alive=="false")return; + if(Registry.nr_growths>=growth_requirement && frame==0){ + play('disappear'); + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Hole.hx b/AIR/intra/hsrc/entity/gadget/Hole.hx new file mode 100644 index 0000000..6cf4eff --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Hole.hx @@ -0,0 +1,53 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxSprite; +/** + * ... + * @author Seagaia + */ +class Hole extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/hole.png")] public var C_HOLE_SPRITE:Class; + public var type:String="Hole"; + public var xml:XML; + public var active_region:FlxSprite; + public var cid:Int=CLASS_ID.HOLE; + + private var player:Player; + public function new(_x:Int, _y:Int, _xml:XML, _player:Player, _frame:Int=0) + { + super(_x, _y); + + immovable=true;solid=true; + loadGraphic(C_HOLE_SPRITE, true, false, 16, 16); + width=4; + height=4; + offset.x=6; + offset.y=5; + x +=6; + y +=5; + if(_xml !=null){ + xml=_xml; + frame=parseInt(xml.@frame); + } else { + xml= + frame=_frame; + } + player=_player; + + } + + override public function update():Void { + if(player.state !=player.S_AIR && player.overlaps(this)){ + if(visible){ + player.isFalling=true; + player.fall_pt.x=x; + player.fall_pt.y=y; + } + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Jump_Trigger.hx b/AIR/intra/hsrc/entity/gadget/Jump_Trigger.hx new file mode 100644 index 0000000..7cf0286 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Jump_Trigger.hx @@ -0,0 +1,134 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; + +/* + * dame props: + * frame - how many tiles this makes the player jump + * past the next tile - 0=>1, 1=>2. + * */ +class Jump_Trigger extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/spring_pad.png")] public static var spring_pad_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + public var distance:Int; + public var time:Float; + public var cid:Int=CLASS_ID.JUMP_TRIGGER; + private var active_region:FlxSprite=new FlxSprite(0, 0); + + private var dame_type:Int=0; + private var T_NORMAL:Int=0; + private var T_SPRING:Int=1; + private var frame_down:Int=1; + private var frame_mid:Int=0; + private var activated:Bool=false; + + private var did_init:Bool=false; + + public function new(_xml:XML, _player:Player,_parent:Dynamic) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + player=_player; + parent=_parent; + dame_type=parseInt(xml.@type); + + if(dame_type==T_SPRING){ + loadGraphic(spring_pad_sprite, true, false, 16, 16); + addAnimation("still", [0], 0, false); + addAnimation("wobble", [0,2,0,1,0,2,0,1,0,0], 10, false); + play("still"); + + active_region=this; + } else { + makeGraphic(16, 2, 0x00000000); + immovable=true; + solid=false; + y +=12; + active_region.makeGraphic(6, 4, 0x000000); + } + + + switch(parseInt(xml.@frame)){ + case 0: + distance=32; + time=0.3; + break; + case 1: + distance=48; + time=0.5; + break; + case 2: + distance=64; + time=0.7; + break; + } + + + + } + + override public function update():Void + { + + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + if(dame_type==T_NORMAL){ + active_region.x=x + 5; + active_region.y=y; + + if(player.overlaps(active_region)&&(player.state==player.S_LADDER ||(player.state==player.S_GROUND && player.facing & DOWN))){ + make_player_jump(); + } + } else { + active_region.x=x; + active_region.y=y; + if(player.overlaps(active_region)){ + if(player.just_landed){ + if(!activated){ + activated=true; + player.is_spring_jump=true; + Registry.sound_data.spring_bounce.play(); + make_player_jump(); + play("wobble"); + } + } else { + if(!activated && player.state==player.S_GROUND){ + frame=frame_down; + } else if(player.state==player.S_AIR){ + frame=frame_mid; + } + } + } else { + if(!activated){ + frame=frame_mid; + } + if(_curAnim !=null && _curAnim.name=="wobble" && _curAnim.frames.length - 1==_curFrame){ + frame=frame_mid; + activated=false; + } + } + } + + super.update(); + } + + private function make_player_jump():Void + { + player.auto_jump_period=time; + player.auto_jump_distance=distance; + player.auto_jump_base_y=player.y; + player.state=player.S_AUTO_JUMP; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Key.hx b/AIR/intra/hsrc/entity/gadget/Key.hx new file mode 100644 index 0000000..8961412 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Key.hx @@ -0,0 +1,56 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; +/** + * OH COME ON WHAT DO YOU THINK THIS IS. + * @author Seagaia + */ +class Key extends FlxSprite +{ + public var type:String="Key"; + + //[Embed(source="../../res/sprites/gadgets/key.png")] public static var C_KEY_SPRITE:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.KEY; + + private var player:Player; + private var parent:Dynamic; + public function new(_x:Int, _y:Int, _player:Player, _parent:Dynamic,_xml:XML=null) + { + super(_x, _y); + loadGraphic(C_KEY_SPRITE, false, false, 16, 16); + if(_xml==null){ + xml=; + xml.@["x"]=_x.toString(); + xml.@["y"]=_y.toString(); + xml.@["p"]="2";//Keys only get collected once + xml.@["alive"]="true";//Presumably, uh. + } else { + xml=_xml; + if(xml.@alive=="false"){ + visible=false; + } + y -=20; + } + + player=_player; + parent=_parent; + } + + override public function update():Void { + + if(player.overlaps(this)&& visible){ + Registry.change_nr_keys(1); + Registry.sound_data.get_key.play(); + xml.@alive="false"; + visible=false; + parent.bg_sprites.remove(this, true); + } + + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/KeyBlock.hx b/AIR/intra/hsrc/entity/gadget/KeyBlock.hx new file mode 100644 index 0000000..d55cb9b --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/KeyBlock.hx @@ -0,0 +1,429 @@ +package entity.gadget +{ +/** + * A keyblock. These open up if you have a key. + * Its sprite is set based on the frame in the level editor. + * Alive refers to whether it has been opened. DUHH + * @author Seagaia + */ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.interactive.NPC; +import entity.player.Player; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import data.SoundData; +import global.Registry; + +class KeyBlock extends FlxSprite +{ + + public var type:String="KeyBlock"; + public var O:Int=16;//Offset for animation when unlocked + public var xml:XML; + public var cid:Int=CLASS_ID.KEYBLOCK; + public var sentinel:FlxSprite; + public var active_region:FlxSprite; + + private var is_big:Bool=false; + private var player:Player; + private var start_unlock_anim:Bool=false; + private var ctr:Int=0; + private var key_sprite:FlxSprite; + private var t:Float=0; + private var tm:Float=0.8; + + public static var sig_change:Bool=false; + private var explosion:FlxSprite; + + //[Embed(source="../../res/sprites/gadgets/keyhole.png")] public var C_KEYBLOCK_SPRITE:Class; + //[Embed(source="../../res/sprites/gadgets/gate_green.png")] public var green_gate_embed:Class; + /** + * + * @param _x + * @param _y + * @param _frame frame type + * @param _xml Reference to the sprites xml(if any) + */ + public function new(_x:Int, _y:Int, _frame:Int,_player:Player,_xml:XML=null) + { + super(_x , _y); + sentinel=new FlxSprite(x -2, y - 2); + sentinel.immovable=true; + sentinel.makeGraphic(20, 20, 0x00ffffff); + + loadGraphic(C_KEYBLOCK_SPRITE, true, false, 16, 16); + + frame=_frame; + immovable=true; + if(_xml !=null){ + xml=_xml; + } + + if(frame==2 && Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [0, 1, 2, 3, 4, 5], 12, false); + is_big=true; + if(xml.@alive=="false"){ + exists=false; + } + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + switch(frame){ + case 1: + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [7, 1, 2, 3, 4, 5], 12, false); + frame=7; + break; + //blue + case 2: + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [0, 1, 2, 3, 4, 5], 12, false); + break; + //green + case 3: + loadGraphic(green_gate_embed, true, false, 32, 16); + frame=6; + addAnimation("open", [6, 1, 2, 3, 4, 5], 12, false); + break; + //redcave + } + if(xml.@alive=="false"){ + exists=false; + } + is_big=true; + } else if(frame==4){ // card gate + loadGraphic(green_gate_embed, true, false, 32, 16); + if(xml.@alive=="false"){ + exists=false; + } + is_big=true; + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + frame=8;// 5 card door + addAnimation("open", [8, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="TERMINAL"){ + frame=14; + addAnimation("open", [14, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ + frame=9; + addAnimation("open", [9, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + frame=10; + addAnimation("open", [10, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + frame=13; + addAnimation("open", [13, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="BLANK"){ + if(Registry.CURRENT_GRID_Y>3 && Registry.CURRENT_GRID_Y<7){ // 48 + //frame=12;' + frame=11;//Changed so you cn get to the debug area with 47 + + addAnimation("open", [12, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_GRID_Y>=7){ + frame=16; + addAnimation("open", [16, 1, 2, 3, 4, 5], 12, false); + } else { // 47 + frame=11; + addAnimation("open", [11, 1, 2, 3, 4, 5], 12, false); + } + } else if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + frame=15; + addAnimation("open", [15, 1, 2, 3, 4, 5], 12, false); + } + active_region=sentinel; + + Registry.subgroup_interactives.push(this); + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + + loadGraphic(green_gate_embed, true, false, 32, 16); + frame=6; + addAnimation("open", [6, 1, 2, 3, 4, 5], 12, false); + is_big=true; + if(xml.@alive=="false"){ + exists=false; + } + } else { + addAnimation("open", [O, O + 1, O + 2, O + 3, O + 4], 10, false); + tm=0.2; + } + + player=_player; + + } + + public function unlock():Void { + Registry.sound_data.unlock.play(); + + play("open"); + xml.@alive=false; + solid=false; + + + + } + + override public function update():Void + { + FlxG.collide(this, player); + + if(FlxG.keys.justPressed("G")&& Intra.is_test){ + Registry.nr_growths +=18; + trace("New growhts:", Registry.nr_growths); + } + + if(!is_big){ + if(FlxG.overlap(player, sentinel)){ + t -=FlxG.elapsed; + + if(t<0 && Registry.get_nr_keys()>0 && xml.@alive==true){ + unlock(); + xml.@alive=false; + Registry.change_nr_keys(-1); + Registry.GAMESTATE.number_of_keys_text.text="x" + Registry.get_nr_keys().toString(); + } else if(t<0 && xml.@alive=="true" && alive && player.state==player.S_GROUND){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblock",0)); + alive=false; + } + } else { + t=tm; + } + } + + if(sig_change){ + explosion=new FlxSprite; + explosion.loadGraphic(EventScripts.small_explosion_sprite, true, false, 24,24); + explosion.x=x + 4; + explosion.y=y - 4; + Registry.GAMESTATE.fg_sprites.add(explosion); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + explosion.play("explode"); + sig_change=false; + frame=17; + } + + if(is_big && xml.@alive==true){ + sentinel.x=x + 6; + sentinel.y=y - 3; + sentinel.width=10; + + if(Registry.CURRENT_MAP_NAME=="OVERWORLD" && active_region==null){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND && Registry.inventory[Registry.IDX_GREEN_KEY]){ + start_unlock_anim=true; + + } + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND){ + switch(frame){ + case 0: + if(Registry.inventory[Registry.IDX_GREEN_KEY]){ + start_unlock_anim=true; + } + break; + case 6:// red + if(Registry.inventory[Registry.IDX_RED_KEY]){ + start_unlock_anim=true; + } + break; + case 7: + if(Registry.inventory[Registry.IDX_BLUE_KEY]){ + start_unlock_anim=true; + } + break; + } + } + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND){ + if(Registry.inventory[Registry.IDX_RED_KEY]){ + start_unlock_anim=true; + } + } + } else { // It's a fuckin' card gate! + var open_the_gate:Bool=false; + + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ // 4 Cards + if(Registry.nr_growths<4 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 0)); + //DH.dialogue_popup("The gate stares, petrified. It won't open until it senses four cards..."); + } else if(Registry.nr_growths>=4 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 1)); + //DH.dialogue_popup("Sensing four cards, the gate decides to open."); + open_the_gate=true; + } + } else if(Registry.CURRENT_MAP_NAME=="TERMINAL"){ + if(Registry.nr_growths<36 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + //DH.dialogue_popup("The gate stubbornly remains in place."); + } else if(Registry.nr_growths>=36 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 3)); + //DH.dialogue_popup("The gate senses all of the cards, and decides to open."); + open_the_gate=true; + } + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ // 8 + if(Registry.nr_growths<8 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=8 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ // 24 + if(Registry.nr_growths<24 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=24 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + //DH.dialogue_popup("The gate senses enough cards, and decides to open."); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ // 16 + if(Registry.nr_growths<16 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=16 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + //DH.dialogue_popup("The gate senses enough, and decides to open."); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="BLANK"){ + if(Registry.CURRENT_GRID_Y>3 && Registry.CURRENT_GRID_Y<7){ + if(Registry.nr_growths<47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 5)); + open_the_gate=true; + } + } else if(Registry.CURRENT_GRID_Y>=7){ + if(player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + //DH.dialogue_popup("It remains closed."); + DH.dialogue_popup(DH.lk("keyblockgate", 6)); + player.be_idle(); + } + } else { + if(Registry.nr_growths<47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 5)); + open_the_gate=true; + } + + } + } else if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + if(Registry.nr_growths<49 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup("...."); + } else if(Registry.nr_growths>=49 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup("!!!"); + open_the_gate=true; + } + } + + if(xml.@alive=="true" && !start_unlock_anim && open_the_gate && player.overlaps(sentinel)&& player.state==player.S_GROUND){ + start_unlock_anim=true; + ctr=4;// Skip key shit + } + } + + if(start_unlock_anim){ + unlock_anim(); + } + } + super.update(); + } + + override public function destroy():Void + { + active_region=sentinel=null; + super.destroy(); + } + private function unlock_anim():Void { + var sub_ctr:Int=0; + if(ctr==0){ + player.state=player.S_INTERACT; + player.be_idle(); + key_sprite=new FlxSprite(player.x, player.y - 16); + key_sprite.loadGraphic(NPC.key_green_embed, true, false, 16, 16); + key_sprite.alpha=0; + Registry.GAMESTATE.fg_sprites.add(key_sprite); + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + switch(frame){ + case 0: + key_sprite.frame=0;//WHO NEED SCOMMENTS ANYWAYS + break; + case 6://blue + key_sprite.frame=2; + break; + case 7:// red + key_sprite.frame=4; + break; + } + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + key_sprite.frame=2; + } else { + Registry.sound_data.stop_current_song(); + } + ctr++; + } else if(ctr==1){ + if(EventScripts.send_alpha_to(key_sprite, 1, 0.02))ctr++; + } else if(ctr==2){ + key_sprite.flicker(0.5); + if(EventScripts.send_property_to(key_sprite, "y", y, 0.2))sub_ctr++; + if(EventScripts.send_property_to(key_sprite, "x", x + 8, 0.2))sub_ctr++; + if(sub_ctr==2){ + ctr++; + Registry.sound_data.player_jump_down.play(); + } + } else if(ctr==3){ + if(EventScripts.send_alpha_to(key_sprite, 0, -0.025)){ + ctr++; + } + + } else if(ctr>3 && ctr<9){ + t +=FlxG.elapsed; + if(t>tm){ + trace(ctr); + FlxG.shake(0.02, 0.3); + t=0; + Registry.sound_data.hitground1.play(); + ctr++; + if(frame==0 || frame==6 || frame==7 || frame>=8){ + frame=1; + } else { + frame++; + } + } + } else if(ctr==9){ + Registry.sound_data.open.play(); + if(Registry.CURRENT_GRID_Y==6 && Registry.CURRENT_MAP_NAME=="WINDMILL" && Intra.is_release){ + DH.dialogue_popup("A voice:Nice work! You've gotten as far as this demo goes. For the completionists, there are a total of 12 cards to find in this demo."); + } + player.state=player.S_GROUND; + xml.@alive="false"; + solid=false; + start_unlock_anim=false; + + x -=160; + sentinel.x -=160; + } + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Pillar_Switch.hx b/AIR/intra/hsrc/entity/gadget/Pillar_Switch.hx new file mode 100644 index 0000000..82f7610 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Pillar_Switch.hx @@ -0,0 +1,81 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * Hitting this flips the global pillar_switch_state value. + * @author Seagaia + */ +class Pillar_Switch extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/pillar_switch.png")] public var pillar_switch_sprite:Class; + + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var t_hit:Float=1.0; + public var tm_hit:Float=1.0; + + public var cid:Int=CLASS_ID.PILLAR_SWITCH; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + + loadGraphic(pillar_switch_sprite, true, false, 16, 16); + addAnimation("a", [0]); + addAnimation("b", [1]); + addAnimation("hit", [2, 3], 12); + immovable=true; + + if(Registry.pillar_switch_state){ + play("a"); + } else { + play("b"); + } + + + } + + override public function update():Void + { + FlxG.collide(player, this); + if(t_hit>tm_hit){ + if(_curAnim.name=="hit"){ + if(Registry.pillar_switch_state){ + play("b"); + } else { + play("a"); + } + } + if(player.broom.visible && player.broom.overlaps(this)){ + play("hit"); + Registry.pillar_switch_state=!Registry.pillar_switch_state; + t_hit=0; + } + } else { + t_hit +=FlxG.elapsed; + } + + if(_curAnim.name=="a" && !Registry.pillar_switch_state){ + play("b"); + } else if(_curAnim.name=="b" && Registry.pillar_switch_state){ + play("a"); + } + + + + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Propelled.hx b/AIR/intra/hsrc/entity/gadget/Propelled.hx new file mode 100644 index 0000000..a2e8a89 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Propelled.hx @@ -0,0 +1,306 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * A platform that faces a certain direction. When dust is placed on top + * and it is jumped on, this will be propelled in that direction, taking + * the player with it. + */ +class Propelled extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/moving_platform.png")] public static var moving_platform_sprite:Class; + //[Embed(source="../../res/sprites/gadgets/moving_platform_poof.png")] public static var moving_platform_poof_sprite:Class; + + + public var xml:XML; + public var cid:Int=CLASS_ID.PROPELLED; + public var player:Player; + public var parent:Dynamic; + private var pushed_to_front:Bool=false; + private var Propel_Speed:Int=33; + + public var active_region:FlxSprite=new FlxSprite(); + public var dame_frame:Int; + public var is_active:Bool=false; + private var init_pt:Point=new Point(); + + public var dust_poof:FlxSprite=new FlxSprite(); + private var showed_dust_poof:Bool=false; + + + public var is_propelling:Bool=false; + + private var H_UP_OFF:Int=0; + private var H_UP_ON:Int=1; + private var H_DOWN_ON:Int=2; + private var H_DOWN_OFF:Int=3; + private var V_UP_OFF:Int=4; + private var V_UP_ON:Int=5; + private var V_DOWN_ON:Int=6; + private var V_DOWN_OFF:Int=7; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_done:Int=1; + + private var is_first_movement:Bool=true; + + /* + * dame params - frame:waht direction it faces, as well as the sprite itself. + * should be added to FRONT of "flat gadgets" so that dust is drawn on tope*/ + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + active_region.makeGraphic(10, 10, 0x00123456); + + dame_frame=parseInt(xml.@frame); + + switch(dame_frame % 4){ + case 0:facing=UP;break; + case 1:facing=RIGHT;break; + case 2: facing=DOWN;break; + case 3:facing=LEFT;break; + } + + if(dame_frame>3){ + is_active=true; + } else { + is_active=false; + } + + dust_poof.makeGraphic(16, 16, 0xffff1233); + dust_poof.loadGraphic(moving_platform_poof_sprite, true, false, 16, 16); + dust_poof.addAnimation("poof", [0, 1, 2, 3, 4], 12, false); + dust_poof.visible=false; + + loadGraphic(moving_platform_sprite, true, false, 16, 16); + + if(facing==RIGHT || facing==LEFT){ + if(is_active){ + frame=1; + } else { + frame=0; + } + } else { + if(is_active){ + frame=5; + } else { + frame=4; + } + } + + Registry.subgroup_propelled.push(this); + } + + override public function update():Void + { + + /* Draw beneath dust */ + if(!pushed_to_front){ + //noooo + pushed_to_front=true; + parent.bg_sprites.add(active_region); + parent.bg_sprites.move_to_front(active_region); + parent.bg_sprites.move_to_front(this); + parent.bg_sprites.add(dust_poof); + init_pt.x=x; + init_pt.y=y; + } + + if(state==s_done){ + if(active_region.overlaps(player)&& !player.hasFallen && player.state !=player.S_AIR){ + player.falling_disabled=true; + } + super.update(); + return; + } + + /* Pin active region to moving platform */ + active_region.x=x + 3; + active_region.y=y + 3; + if(active_region.overlaps(player)&& !player.hasFallen && player.state !=player.S_AIR){ + player.falling_disabled=true; + set_frame(true); + if(is_propelling){ + set_velocity(); + } + + if(player.just_landed){ + if(is_active){ + is_propelling=true;//start moving + if(!showed_dust_poof){ + Dust.dust_sound.play(); + dust_poof.play("poof"); + showed_dust_poof=true; + dust_poof.visible=true; + switch(facing){ + case LEFT: + dust_poof.x=x + width; + dust_poof.y=y; + break; + case RIGHT: + dust_poof.x=x - dust_poof.width; + dust_poof.y=y; + break; + case UP: + dust_poof.x=x; + dust_poof.y=y + height; + break; + case DOWN: + dust_poof.x=x; + dust_poof.y=y - dust_poof.height; + break; + } + } else { + //HI + } + } + } + } else { + set_frame(false); + } + + // On the return trip, if the platform is close, + // then stop it and return it tot he initial state + if(!is_first_movement){ + if(EventScripts.distance(this, init_pt)<3){ + x=init_pt.x; + y=init_pt.y; + reset_moving_props(); + } + } + + + super.update(); + } + + public function turn_on():Void { + if(!is_active){ + // dont make a noise with the already-activated platforms + // when entering map + if(parent==null){ + trace(Registry.GAMESTATE.sortables.members.indexOf(this)); + trace(Registry.GAMESTATE.members.indexOf(this)); + trace(Registry.GAMESTATE.bg_sprites.members.indexOf(this)); + exists=false; + } + if(parent.state !=parent.S_TRANSITION){ + Registry.sound_data.dash_pad_2.play(); + } + if(frame==H_UP_OFF){ + frame=H_UP_ON; + } else if(frame==V_UP_OFF){ + frame=V_UP_ON; + } else if(frame==H_DOWN_OFF){ + frame=H_DOWN_ON; + + } else if(frame==V_DOWN_OFF){ + frame=V_DOWN_ON; + } + is_active=true; + } + } + + private function set_frame(stepped_on:Bool):Void { + if(stepped_on){ + if(frame==H_UP_OFF){ + Registry.sound_data.button_down.play(); + frame=H_DOWN_OFF; + } else if(frame==H_UP_ON){ + Registry.sound_data.button_down.play(); + frame=H_DOWN_ON; + } else if(frame==V_UP_OFF){ + Registry.sound_data.button_down.play(); + frame=V_DOWN_OFF; + } else if(frame==V_UP_ON){ + Registry.sound_data.button_down.play(); + frame=V_DOWN_ON; + } + } else { + if(frame==H_DOWN_OFF){ + Registry.sound_data.button_up.play(); + frame=H_UP_OFF; + } else if(frame==H_DOWN_ON){ + Registry.sound_data.button_up.play(); + frame=H_UP_ON; + } else if(frame==V_DOWN_OFF){ + Registry.sound_data.button_up.play(); + frame=V_UP_OFF; + } else if(frame==V_DOWN_ON){ + Registry.sound_data.button_up.play(); + frame=V_UP_ON; + } + } + } + + // changes facing(to tell platform where to move next), dust state, + // etc + private function reset_moving_props():Void + { + is_propelling=false; + is_active=false; + if(facing==UP){ + facing=DOWN; + } else if(facing==DOWN){ + facing=UP; + } else if(facing==LEFT){ + facing=RIGHT; + } else { + facing=LEFT; + } + if(frame==H_UP_ON || frame==H_DOWN_ON || frame==H_DOWN_OFF || frame==H_UP_OFF){ + frame=H_UP_OFF; + } else { + frame=V_UP_OFF; + } + showed_dust_poof=false; + dust_poof.visible=false; + velocity.x=velocity.y=0; + is_first_movement=!is_first_movement; + } + + public function set_velocity():Void { + switch(facing){ + case UP:player.additional_y_vel=velocity.y=-Propel_Speed;break; + case DOWN:player.additional_y_vel=velocity.y=Propel_Speed;break; + case RIGHT:player.additional_x_vel=velocity.x=Propel_Speed;break; + case LEFT:player.additional_x_vel=velocity.x=-Propel_Speed;break; + } + } + + public function propel_from_dust_poof():Void { + is_propelling=true; + } + + //Called by stop markers when they overlap this moving platform. + public function stop_from_stop_marker(stop_marker:Stop_Marker):Void { + if(is_first_movement){ + x=stop_marker.x; + y=stop_marker.y; + reset_moving_props(); + } + } + + override public function destroy():Void + { + dust_poof=null; + init_pt=null; + parent.bg_sprites.remove(this, true); + parent.bg_sprites.remove(active_region, true); + parent.bg_sprites.remove(dust_poof, true); + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/SinglePushBlock.hx b/AIR/intra/hsrc/entity/gadget/SinglePushBlock.hx new file mode 100644 index 0000000..6bc4347 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/SinglePushBlock.hx @@ -0,0 +1,152 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import org.flixel.FlxG; +import global.Registry; +/** + * Single push blocks...push em from one direction, they move a tile. yeah WHAT + * @author seagaia + */ +class SinglePushBlock extends FlxSprite +{ + private var dir:Int; + private var hasBeenPushed:Bool=false; + private var sound_played:Bool=false; + private var distanceToGo:Int=Registry.TILE_HEIGHT; + private var startedMoving:Bool=false; + public var type:String="SinglePushBlock"; + public var xml:XML; + public var sentinel:FlxSprite=new FlxSprite(0, 0); + public var timeToPush:Float=0.3; + public var initial_coords:Point=new Point(); + public var MOVE_VEL:Int=24; + public var INCREMENTED_REG:Bool=false; + public var BEDROOM_INDEX:Int=4; + public var STREET_INDEX:Int=5; + public var cid:Int=CLASS_ID.SINGLEPUSHBLOCK; + + private var is_non_puzzle:Bool=false; + //[Embed(source="../../res/sprites/gadgets/pushyblocks.png")] public var C_PUSH_BLOCKS:Class; + + public var player:Player; +//frame mod 4 determines direction + + public function new(_x:Int, _y:Int, _xml:XML, _p:Player) + { + super(_x, _y); + initial_coords.x=x; + initial_coords.y=y; + xml=_xml; + switch(parseInt(xml.@frame)% 4){ + case 0:dir=FlxObject.UP;break; + case 1:dir=FlxObject.DOWN;break; + case 2:dir=FlxObject.LEFT;break; + case 3:dir=FlxObject.RIGHT;break; + } + + loadGraphic(C_PUSH_BLOCKS,true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + trace("SET PUSH BLOCK FRAME:", BEDROOM_INDEX); + frame=BEDROOM_INDEX; + } else if(Registry.CURRENT_MAP_NAME=="STREET"){ + frame=STREET_INDEX; + } + + if(parseInt(xml.@type)==1){ + is_non_puzzle=true; + } + immovable=true; + createSentinel(); + player=_p; + + } + + override public function update():Void { + + + if(FlxG.collide(player, this)){ + if(player.overlaps(sentinel))startMoving(); + } + + if(timeToPush<0){ + if(!sound_played){ + hasBeenPushed=true; + Registry.sound_data.push_block.play(); + sound_played=true; + } + switch(dir){ + case FlxObject.UP: + velocity.y=-MOVE_VEL; + break; + case FlxObject.DOWN: + velocity.y=MOVE_VEL; + break; + case FlxObject.RIGHT: + velocity.x=MOVE_VEL; + break; + case FlxObject.LEFT: + velocity.x=-MOVE_VEL; + break; + } + } + + if(Math.abs(x - initial_coords.x)>=16 || Math.abs(y - initial_coords.y)>=16){ + if(!INCREMENTED_REG){ + if(!is_non_puzzle){ + Registry.GRID_PUZZLES_DONE++; + } + INCREMENTED_REG=true; + } + if((x - initial_coords.x)>16){ + x=initial_coords.x + 16; + } else if((x - initial_coords.x)<-16){ + x=initial_coords.x - 16; + } + + if((y - initial_coords.y>16)){ + y=initial_coords.y + 16; + } else if((y - initial_coords.y)<-16){ + y=initial_coords.y - 16; + } + velocity.x=velocity.y=0; + } + + if(!startedMoving)timeToPush=0.3; + startedMoving=false; + super.update(); + } + + public function startMoving():Void { + if(hasBeenPushed)return; + timeToPush -=FlxG.elapsed; + startedMoving=true; + } + + public function createSentinel():Void { + sentinel.makeGraphic(4, 2, 0xFF022000); + sentinel.visible=false; + switch(dir){ + case FlxObject.DOWN: + sentinel.x=x + Registry.TILE_WIDTH / 2 - 2; + sentinel.y=y - 2; + break; + case FlxObject.UP: + sentinel.x=x + Registry.TILE_WIDTH / 2 - 2; + sentinel.y=y + Registry.TILE_WIDTH + 2; + break; + case FlxObject.LEFT: + sentinel.x=x + Registry.TILE_WIDTH + 2; + sentinel.y=y + Registry.TILE_WIDTH / 2; + break; + case FlxObject.RIGHT: + sentinel.x=x - 2; + sentinel.y=y + Registry.TILE_WIDTH / 2; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Stop_Marker.hx b/AIR/intra/hsrc/entity/gadget/Stop_Marker.hx new file mode 100644 index 0000000..8569b3a --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Stop_Marker.hx @@ -0,0 +1,40 @@ +package entity.gadget +{ +import data.CLASS_ID; +import global.Registry; +import org.flixel.FlxSprite; + +/** + * Interacts with Propelled, stops them on a dime + * @author Seagaia + */ +class Stop_Marker extends FlxSprite +{ + public var xml:XML; + + public var cid:Int=CLASS_ID.STOP_MARKER; + + public var parent:Dynamic; + + public function new(_xml:XML,_parent:Dynamic) + { + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + makeGraphic(16, 16, 0x69386243); + visible=false; + parent=_parent; + immovable=true; + solid=false; + } + + + override public function update():Void + { + for(var propelled:Propelled in Registry.subgroup_propelled){ + if(propelled.is_propelling && Math.abs(x - propelled.x)<=2 && Math.abs(y - propelled.y)<=2){ + propelled.stop_from_stop_marker(this); + } + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Switch_Pillar.hx b/AIR/intra/hsrc/entity/gadget/Switch_Pillar.hx new file mode 100644 index 0000000..1cbc4f4 --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Switch_Pillar.hx @@ -0,0 +1,81 @@ +package entity.gadget +{ +import entity.player.Player; +import flash.media.Video; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Switch_Pillar extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var up_frame:Int; + public var down_frame:Int; + + private var original_state:Bool=false; + + //[Embed(source="../../res/sprites/dame/dame-switch-pillar.png")] public var switch_pillar_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(switch_pillar_sprite, true, false, 16, 16); + + var dame_frame:Int=parseInt(xml.@frame); + if(dame_frame<2){ + up_frame=0; + down_frame=1; + } + + if(dame_frame % 2){ + if(Registry.pillar_switch_state){ + frame=down_frame; + } else { + frame=up_frame; + } + } else { + if(!Registry.pillar_switch_state){ + frame=down_frame; + } else { + frame=up_frame; + } + } + addAnimation("dissolve", [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1], 15,false); + + addAnimation("solidify", [1,14,13,12,11,10,9,8,7,6,5,4,0], 15,false); + original_state=Registry.pillar_switch_state; + Registry.subgroup_switch_pillars.push(this); + immovable=true; + } + + override public function update():Void { + if(frame==up_frame){ + FlxG.collide(this, player); + } + + if(original_state !=Registry.pillar_switch_state){ + + play_sfx(HURT_SOUND_NAME); + if(frame==up_frame){ + Registry.sound_data.dash_pad_1.play(); + play("dissolve"); + } else { + Registry.sound_data.dash_pad_2.play(); + play("solidify"); + } + original_state=Registry.pillar_switch_state; + } + super.update(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/gadget/Treasure.hx b/AIR/intra/hsrc/entity/gadget/Treasure.hx new file mode 100644 index 0000000..06df0ef --- /dev/null +++ b/AIR/intra/hsrc/entity/gadget/Treasure.hx @@ -0,0 +1,396 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Broom; +import entity.player.HealthBar; +import entity.player.Player; +import global.Keys; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import global.Registry; +import data.SoundData; +import states.PauseState; +/** + * @author Seagaia + */ + +class Treasure extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/treasureboxes.png")] public static var S_TREASURE_SPRITE:Class; + //[Embed(source="../../res/sprites/inventory/item_jump_shoes.png")] public static var embed_jump_shoes:Class; + //[Embed(source="../../res/sprites/inventory/item_long_attack.png")] public static var embed_long_attack:Class; + //[Embed(source="../../res/sprites/inventory/item_wide_attack.png")] public static var embed_wide_attack:Class; + //[Embed(source="../../res/sprites/inventory/item_tranformer.png")] public static var embed_transformer:Class; + //[Embed(source="../../res/sprites/menu/secret_trophies.png")] public static inline var embed_secret_trophies:Class; + public var CLOSED_BEDROOM:Int=0; + public var OPEN_BEDROOM:Int=1; + public var CLOSED_STREET:Int=0; + public var OPEN_STREET:Int=1; + + + public var xml:XML; + public var parent:Dynamic; + public var CONTENT:Int; + public var item:FlxSprite; + public var item_flicker_timer:Float=1; + public var item_flickered:Bool=false; + + public var cid:Int=CLASS_ID.TREASURE; + public var active_region:FlxSprite=new FlxSprite; + /* These reference the frame of the DAME object, and let the PlayState know what item to grant + * to the player. */ + public static inline var IDX_BROOM:Int=0; + public static inline var IDX_KEY:Int=1; + public static inline var IDX_GROWTH:Int=2; + private var start_growth_anim:Bool=false; + private var ctr:Int=0; + private var t:Float=0; + + + public static inline var IDX_JUMP:Int=3; + public static inline var IDX_WIDE:Int=4; + public static inline var IDX_LONG:Int=5; + public static inline var IDX_SWAP:Int=6; + + public static inline var IDX_goldenpoo:Int=7; + public static inline var IDX_can_of_spam:Int=8; + public static inline var IDX_missingno:Int=9; + public static inline var IDX_aus_heart:Int=10; + public static inline var IDX_electric:Int=11; + public static inline var IDX_kittystatue:Int=12; + public static inline var IDX_melos:Int=13; + public static inline var IDX_marina:Int=14; + public static inline var IDX_black:Int=15; + public static inline var IDX_red:Int=16; + public static inline var IDX_green:Int=17; + public static inline var IDX_blue:Int=18; + public static inline var IDX_white:Int=19; + + public static inline var IDX_SECRETS_MAX:Int=40; + + public static inline var IDX_NOTHING:Int=100; + + public function new(_x:Int, _y:Int, _xml:XML, _parent:Dynamic) + { + super(_x, _y); + + parent=_parent; + xml=_xml; + immovable=true; + loadGraphic(S_TREASURE_SPRITE, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + frame=CLOSED_BEDROOM; + } else if(Registry.CURRENT_MAP_NAME=="STREET"){ + frame=CLOSED_STREET; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + frame=4; + } + CONTENT=xml.@frame; + item=new FlxSprite(x, y); + if(CONTENT>=IDX_goldenpoo && CONTENT<=IDX_SECRETS_MAX){ + item.loadGraphic(embed_secret_trophies, true, false, 16, 16); + } + switch(CONTENT){ + case IDX_BROOM: + item.loadGraphic(Broom.Icon_Broom_Sprite, false, false, 16, 16); + break; + case IDX_KEY: + item.loadGraphic(Key.C_KEY_SPRITE, false, false, 16, 16); + break; + case IDX_GROWTH: + item.loadGraphic(PauseState.card_sheet_embed, false, false, 24, 24); + item.frame=get_card_frame(); + item.scale.x=0.5; + item.scale.y=0.5; + item.x -=4; + if(xml !=null && xml.@alive=="false"){ + Registry.card_states[item.frame]=1; + } + // oops + if(xml.@alive=="false" && item.frame !=uint.MAX_VALUE){ + if(Registry.card_states[item.frame]==0){ + Registry.nr_growths++; + Registry.card_states[item.frame]=1; + } + } + if(item.frame==uint.MAX_VALUE){ + item.makeGraphic(16, 16, 0xffff0000); + } + trace("Loading card with frame ", item.frame); + + if(item.frame==Registry.CARD_GOLDMAN_IDX && Registry.GE_States[Registry.GE_tradequesthelpedshopkeeper] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]){ + CONTENT=IDX_NOTHING; + } + break; + case IDX_LONG: + item.loadGraphic(embed_long_attack, false, false, 16, 16); + break; + case IDX_WIDE: + item.loadGraphic(embed_wide_attack, false, false, 16, 16); + break; + case IDX_JUMP: + item.loadGraphic(embed_jump_shoes, false, false, 16, 16); + break; + case IDX_SWAP: + item.loadGraphic(embed_transformer, false, false, 16, 16); + break; + case IDX_goldenpoo: + item.frame=0;break; + case IDX_can_of_spam: + item.frame=1;break; + case IDX_missingno: + item.frame=2;break; + case IDX_kittystatue: + item.frame=5;break; + case IDX_aus_heart: + item.frame=3;break; + case IDX_electric: + item.frame=4;break; + case IDX_melos: + item.frame=6;break; + case IDX_marina: + item.frame=7;break; + case IDX_black: + item.frame=8;break; + case IDX_red: + item.frame=9;break; + case IDX_green: + item.frame=10;break; + case IDX_blue: + item.frame=11;break; + case IDX_white: + item.frame=12;break; + default: + item.makeGraphic(16, 16, 0xff00ff00); + break; + } + item.visible=false; + + if(xml.@alive=="false"){ + frame++; + } + + active_region.makeGraphic(10, 3, 0x00000000); + active_region.x=x + 3; + active_region.y=y + 16; + + Registry.subgroup_interactives.push(this); + } + + private function get_card_frame():Int { + var _x:Int; + var _y:Int; + if(Registry.is_playstate){ + _x=Registry.CURRENT_GRID_X; + _y=Registry.CURRENT_GRID_Y; + } else { + _x=parseInt(xml.@x); + _y=parseInt(xml.@y); + } + + var a:Array=PauseState.card_data[Registry.CURRENT_MAP_NAME]; + for(var o:Dynamic in a){ + if(_x==o.x && _y==o.y){ + return o.id; + } + } + return -1; + } + + private var dont_do_shit:Bool=false; + override public function update():Void { + if(item.visible){ + if(CONTENT==IDX_GROWTH && !start_growth_anim){ + if(item.frame !=uint.MAX_VALUE){ + if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + Registry.card_states[48]=1; + Achievements.unlock(Achievements.A_GET_49TH_CARD); + } else { + Registry.card_states[item.frame]=1; + } + parent.player.state=parent.player.S_GROUND; + } + + + start_growth_anim=true; + + } else if(CONTENT==IDX_NOTHING){ + item.visible=false; + Registry.GAMESTATE.player.be_idle(); + //DH.dialogue_popup("Goldman:What? It's not there? That shopkeeper must have stolen it!"); + DH.dialogue_popup_misc_any("treasure", 10); + + } else if(CONTENT !=IDX_GROWTH){ + EventScripts.send_property_to(item, "y", y - 16, 0.5) + + if(!item_flickered){ + parent.player.state=parent.player.S_GROUND; + item_flickered=true; + item.flicker(item_flicker_timer); + } + if(!item.flickering)item.visible=false; + } + } + + + FlxG.collide(parent.player, this); + if(frontTouches(parent.player)&& Registry.keywatch.JP_ACTION_1 && xml.@alive=="true"){ + if(Registry.CURRENT_MAP_NAME=="WINDMILL" && Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + dont_do_shit=true; + //DH.dialogue_popup("Some strange force stops this treasure box from being opened."); + DH.dialogue_popup(DH.lk("treasure",0)); + } + if(dont_do_shit)return; + parent.player.update_player_inventory(this); + item.visible=true; + parent.player.state=parent.player.S_INTERACT; + Registry.sound_data.get_treasure.play(); + Achievements.is_200_percent(); + if(CONTENT==IDX_BROOM){ + Registry.bound_item_1="BROOM"; + //DH.dialogue_popup("An engraving on the broom handle reads:\"Press " + Registry.controls[Keys.IDX_ACTION_1] + " to sweep.\""); + DH.dialogue_popup(DH.lk("treasure", 1)+ " " + Registry.controls[Keys.IDX_ACTION_1] + " " + DH.lk("treasure", 2)); + + } else if(CONTENT==IDX_KEY && Registry.CURRENT_MAP_NAME=="STREET"){ + //DH.dialogue_popup("This key may be used a single time to open up a locked barrier."); + DH.dialogue_popup_misc_any("treasure", 3); + } else if(CONTENT==IDX_JUMP){ + Registry.bound_item_2="JUMP"; + //DH.dialogue_popup("A mysterious pair of boots has nothing but the branding on it, which says \"Press " + Registry.controls[Keys.IDX_ACTION_2]+"\"."); + DH.dialogue_popup(DH.lk("treasure", 4)+ " " + Registry.controls[Keys.IDX_ACTION_2] + " " + DH.lk("treasure", 5)); + } else if(CONTENT==IDX_WIDE){ + //DH.dialogue_popup("A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\""); + DH.dialogue_popup_misc_any("treasure", 6); + } else if(CONTENT==IDX_LONG){ + //DH.dialogue_popup("A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\""); + DH.dialogue_popup_misc_any("treasure", 7); + } else if(CONTENT==IDX_SWAP){ + //DH.dialogue_popup("A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\""); + DH.dialogue_popup_misc_any("treasure", 8); + } else if(CONTENT==IDX_goldenpoo){ + Registry.inventory[Registry.IDX_POO]=true; + Achievements.unlock(Achievements.A_GET_GOLDEN_POO); + } else if(CONTENT==IDX_can_of_spam){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_SPAM]=true; + } else if(CONTENT==IDX_electric){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_ELECTRIC]=true; + } else if(CONTENT==IDX_missingno){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_MISSINGNO]=true; + } else if(CONTENT==IDX_aus_heart){ + DH.dialogue_popup_misc_any("treasure", 9); + //DH.dialogue_popup("YOU FOUND A HEART!!! Maximum Health increased by...zero."); + Registry.inventory[Registry.IDX_AUS_HEART]=true; + } else if(CONTENT==IDX_kittystatue){ + Registry.inventory[Registry.IDX_KITTY]=true; + } else if(CONTENT==IDX_marina){ + Registry.inventory[Registry.IDX_MARINA]=true; + } else if(CONTENT==IDX_melos){ + Registry.inventory[Registry.IDX_MELOS]=true; + }else if(CONTENT==IDX_black){ + Registry.inventory[Registry.IDX_BLACK]=true; + if(Registry.inventory[Registry.IDX_WHITE]){ + Achievements.unlock(Achievements.A_GET_BW_CUBES); + } + }else if(CONTENT==IDX_red){ + Registry.inventory[Registry.IDX_RED]=true; + Achievements.unlock(Achievements.A_GET_RED_CUBE); + }else if(CONTENT==IDX_green){ + Registry.inventory[Registry.IDX_GREEN]=true; + Achievements.unlock(Achievements.A_GET_GREEN_CUBE); + }else if(CONTENT==IDX_blue){ + Registry.inventory[Registry.IDX_BLUE]=true; + Achievements.unlock(Achievements.A_GET_BLUE_CUBE); + }else if(CONTENT==IDX_white){ + Registry.inventory[Registry.IDX_WHITE]=true; + if(Registry.inventory[Registry.IDX_BLACK]){ + Achievements.unlock(Achievements.A_GET_BW_CUBES); + } + } + + if(CONTENT>=IDX_goldenpoo && CONTENTRegistry.CURRENT_GRID_Y * 160 + 20 + 80){ + item.y -=(24 * FlxG.elapsed); + } else { + item.y +=(24 * FlxG.elapsed); + } + if(item.scale.x>=1){ + item.scale.x=item.scale.y=1; + ctr++; + } + break; + case 2: + t +=FlxG.elapsed; + if(t>1){ + t=0; + ctr++; + if(item.y>Registry.CURRENT_GRID_Y * 160 + 20 + 80){ + item.acceleration.y=-80; + item.angularVelocity=50; + item.angularAcceleration=200; + } else { + item.acceleration.y=80; + item.angularVelocity=-50; + item.angularAcceleration=-200; + + } + } + break; + case 3: + item.scale.x +=FlxG.elapsed*3; + item.scale.y +=FlxG.elapsed*3; + item.alpha -=FlxG.elapsed / 2; + if(item.alpha<=0){ + item.visible=false; + ctr++; + } + break; + } + + } + + public function frontTouches(o:FlxSprite):Bool { + return(o.x>=(x - Registry.TILE_WIDTH / 2)&& o.x<=(x + Registry.TILE_WIDTH / 2)&& + o.y<=(y + Registry.TILE_WIDTH + 2)&& o.y>=(y + Registry.TILE_WIDTH - 3)); + } + + override public function destroy():Void + { + super.destroy(); + if(active_region !=null)active_region.destroy(); + active_region=null; + item=null; + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Black_Thing.hx b/AIR/intra/hsrc/entity/interactive/Black_Thing.hx new file mode 100644 index 0000000..c9972db --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Black_Thing.hx @@ -0,0 +1,198 @@ +package entity.interactive +{ +import entity.enemy.bedroom.Sun_Guy; +import entity.interactive.npc.Forest_NPC; +import flash.geom.Point; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxMath; + + +/** + * uses multiple draw calls to make a black square with other + * black squares that do silly things via sin/linear Interpolation + * + * FUN CLASS PROJECT make a class thing to hold timer/state/etc states and + * do this all with wrapper functions + */ + + +class Black_Thing extends AnoSprite +{ + + private var is_green:Bool=false; + + public function new(a:Array) + { + super(a); + + make_sin_table_180(); + makeGraphic(32, 32, 0xff000000); + + if(Registry.CURRENT_MAP_NAME=="FOREST"){ + is_green=true; + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, 16); + addAnimation("walk", [32, 33], 4); + play("walk"); + x=tl.x; + } + } + + private var dumct:Int=0; + private var t_yell:Float=0; + private var t_lol:Float=0; + + override public function update():Void + { + + if(is_green){ + if(x>tl.x + 80 && xtl.x + 160){ + Registry.GRID_PUZZLES_DONE=2; + } + + t_yell +=FlxG.elapsed; + if(t_yell>0.5){ + Registry.sound_data.play_sound_group(Registry.sound_data.rat_move); + t_yell=0; + } + + t_lol +=FlxG.elapsed; + if(x1){ + x +=1; + t_lol=0; + } + } else { // ~100 minutes + if(t_lol>80){ + t_lol=0; + x +=1; + } + } + //if(FlxG.keys.J){ + //t_lol=90; + //} + if(player.velocity.x !=0 || player.velocity.y !=0){ + x -=1; + } + super.update(); + return; + } + + if(player.overlaps(this)&& Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.fall_in_hole.play(); + dumct++; + if(dumct>50){ + mm1.y=10; + mm2.y=12; + mm3.y=9; + Registry.GRID_PUZZLES_DONE++; + } + } + super.update(); + } + + + private var scale1:Float=0.5; + private var mm1:Point=new Point(0.5, 2); + + private var scale2:Float=2; + private var mm2:Point=new Point(0.5, 2); + + private var scale3:Float=3; + private var mm3:Point=new Point(0.75, 3); + + + + private var state1:Int=0; + private var state2:Int=0; + private var state3:Int=0; + + private var t3:Float=0; + private var t3_m:Float=1; + + // vals between 0 and 1 + private var sin_table_180:Array; + + public function make_sin_table_180():Void { + sin_table_180=new Array; + for(i in 0...180){ + sin_table_180.push((1 + Math.sin((i / 180.0)* 6.28))/2); + } + } + + private var rate:Float=0.03; + override public function draw():Void + { + if(is_green){ + super.draw(); + return; + } + alpha=0.25; + color=0xff0000; + + scale.x=scale.y=scale1; + + + + if(state1==0){ + scale1 +=rate; + if(scale1>mm1.y){ + state1=1; + } + } else if(state1==1){ + scale1 -=rate; + if(scale1mm2.y){ + state2=1; + } + } else if(state2==1){ + scale2 -=rate; + if(scale2t3_m){ + t3=0; + } + + scale3=sin_table_180[int(180 *(t3 / t3_m))] *(mm3.y - mm3.x)+ mm3.x; + + angle=get_sin_table_180(t3, t3_m, -90, 90); + super.draw(); + + color=0x000000; + angle=0; + scale.x=scale.y=1; + alpha=0.3; + super.draw(); + } + + public function get_sin_table_180(t:Float,tm:Float,min:Float,max:Float):Float { + return sin_table_180[int(180 *(t3 / t3_m))] *(max - min)+ min; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Dungeon_Statue.hx b/AIR/intra/hsrc/entity/interactive/Dungeon_Statue.hx new file mode 100644 index 0000000..064faee --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Dungeon_Statue.hx @@ -0,0 +1,88 @@ +package entity.interactive +{ +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * Statues that block the ways out of the first 3 dungeons. + * If key not picked up, also spawns a key that does a little flashy nimation + */ +class Dungeon_Statue extends FlxSprite +{ + + //[Embed(source="../../res/sprites/npcs/big_statue.png")] public static var statue_bedroom_embed:Class; + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var active_region:FlxObject; + public function new(_p:Player,_pa:Dynamic,_xml:XML) + { + xml=_xml; + parent=_pa; + player=_p; + super(parseInt(xml.@x), parseInt(xml.@y)); + immovable=true; + active_region=new FlxObject(x, y, 34, 20); + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + y -=32; + } + break; + case "REDCAVE": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + frame=1; + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + x +=32; + } + break; + + case "CROWD": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + frame=2; + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + x +=32; + } + break; + } + + width=30; + height=16; + offset.x=1; + x +=1; + offset.y=32; + y +=32; + Registry.subgroup_interactives.push(this); + + } + + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==1){ + DH.start_dialogue(DH.name_dungeon_statue, DH.scene_dungeon_statue_bedroom_two); + } else { + DH.start_dialogue(DH.name_dungeon_statue, DH.scene_dungeon_statue_bedroom_one); + } + } + super.update(); + } + + override public function destroy():Void + { + + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Elevator.hx b/AIR/intra/hsrc/entity/interactive/Elevator.hx new file mode 100644 index 0000000..9a7f907 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Elevator.hx @@ -0,0 +1,223 @@ +package entity.interactive +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.ControlsState; +import states.PauseState; + +/** + * logic for the elevator in hotel. + */ +class Elevator extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var locations:Array=new Array(new Point(1344, 1360), new Point(1344, 560), new Point(384, 1840), new Point(384, 880)); + + private var state:Int=0; + private var s_closed:Int=0; + private var s_player_leaving:Int=1; + private var s_open:Int=2; + private var s_menu:Int=3; + private var s_leaving:Int=4; + + + + private var did_init:Bool=false; + + private var open_sensor:FlxSprite; + private var menu_sensor:FlxSprite; + + private var OPEN_FRAME:Int=3; + private var CLOSED_FRAME:Int=0; + + public var text:FlxBitmapFont; + public var menu:FlxSprite; + public var selector:FlxSprite; + public var selector_idx:Int=0; + public var line_height:Int=8; + public var min_selector_idx:Int=0; + public var max_selector_idx:Int=4; + public var choices:Array=new Array(); + + private var floor:Int; + + //[Embed(source="../../res/sprites/gadgets/elevator.png")] public static var Elevator_Sprite:Class; + + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Elevator anims */ + loadGraphic(Elevator_Sprite, true, false, 32, 32); + addAnimation("open", [0, 1, 2, 3], 12, false); + addAnimation("close", [3, 2, 1, 0], 12, false); + + frame=CLOSED_FRAME; + state=s_closed; + } + + override public function update():Void + { + if(!did_init){ // o god + did_init=true; + + open_sensor=new FlxSprite(x, y + 32); + open_sensor.makeGraphic(32, 32, 0xff992912); + + menu_sensor=new FlxSprite(x, y); + menu_sensor.makeGraphic(32, 20, 0xff991144); + + menu_sensor.visible=open_sensor.visible=false; + + menu=new FlxSprite(15, Registry.HEADER_HEIGHT + 20); + menu.loadGraphic(ControlsState.S_CONTROLS, false, false, 135, 125); + + //text=EventScripts.init_bitmap_font("Floor?\n", "center", menu.x + 12, menu.y + 4, null, "apple_white"); + text=EventScripts.init_bitmap_font(DH.lk("elevator",0)+"\n", "center", menu.x + 12, menu.y + 4, null, "apple_white"); + text.drop_shadow=true; + text.x=menu.x + 46; + text.y=menu.y + 34; + + + + floor=1; + + for(var point:Point in locations){ + if(x==point.x && y==(point.y + Registry.HEADER_HEIGHT)){ + break; + } + floor++; + } + + if(floor !=1){ text.text +=DH.lk("elevator",1);choices.push(1);} + if(floor !=2){ text.text +=DH.lk("elevator",2);choices.push(2);} + if(floor !=3){ text.text +=DH.lk("elevator",3);choices.push(3);} + if(floor !=4){ text.text +=DH.lk("elevator",4);choices.push(4);} + + + text.text +=DH.lk("elevator",5); + + selector=new FlxSprite(menu.x, menu.y); + selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + selector.addAnimation("a", [2, 3], 6, true); + selector.play("a"); + + text.scrollFactor=selector.scrollFactor=menu.scrollFactor=new FlxPoint(); + + parent.bg_sprites.add(open_sensor); + parent.bg_sprites.add(menu_sensor); + parent.fg_sprites.add(menu); + parent.fg_sprites.add(text); + parent.fg_sprites.add(selector); + + menu.visible=text.visible=selector.visible=false; + + } + + if(state==s_closed){ + if(player.overlaps(open_sensor)){ + play("open"); + Registry.sound_data.elevator_open.play(); + state=s_open; + } else if(player.overlaps(menu_sensor)){ + state=s_menu; + menu.visible=text.visible=selector.visible=true; + selector_idx=1; + selector.y=text.y + line_height; + selector.x=text.x - line_height; + if(DH.isZH()){ + selector.y +=8; + selector.x +=22; + } + player.frame=player.offset.y=player.velocity.x=player.velocity.y=0; + + player.offset.y=player.DEFAULT_Y_OFFSET; + player.invincible_timer=400000; + player.invincible=true; + } + } else if(state==s_open){ + if(!player.overlaps(open_sensor)){ + play("close"); + Registry.sound_data.elevator_close.play(); + state=s_closed; + } + } else if(state==s_menu){ + player.state=player.S_INTERACT; + if(Registry.keywatch.JP_DOWN &&(selector_idxmin_selector_idx + 1)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + selector.y -=line_height; + if(DH.isZH())selector.y -=4; + selector_idx--; + } else if(Registry.keywatch.JP_ACTION_1){ + menu.visible=text.visible=selector.visible=false; + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + if(selector_idx==max_selector_idx){ //cancel + state=s_leaving; + player.invincible_timer=0; + play("open"); + player.offset.y=player.DEFAULT_Y_OFFSET; + Registry.sound_data.elevator_open.play(); + } else { // move + Registry.ENTRANCE_PLAYER_X=locations[choices[selector_idx -1] - 1].x + 8; + Registry.ENTRANCE_PLAYER_Y=locations[choices[selector_idx -1] - 1].y + Registry.HEADER_HEIGHT + 30; + parent.SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="HOTEL"; + player.state=player.S_GROUND; + } + } + + } else if(state==s_leaving){ + player.state=player.S_GROUND; + if(!player.overlaps(menu_sensor)){ + state=s_open; + } + } + + //if elevator event triggered, go to "arrived closed" state, blocking event, open doors, move player out, go to open + + //normal: + // stay closed until player is close enough(cloed state) + // do open animation, either go back to close or:(open state) + // if player steps inside, freeze the controls, close the door(state) + // -->pop up menu with the other 3 floors and CANCEL, if chosen, do the transition, if CNACEL: + // -->open doors, move player out and give back control(return to closed).(blocking event) + + super.update(); + } + + private function move_player_out():Bool { + return false; + } + + // -1:exit, 0:ongoing, 1, 2, 3, 4 - floor change + private function menu_state():Int { + return 0; + } + + override public function destroy():Void + { + + super.destroy(); + text=null; + menu=menu_sensor=selector=open_sensor=null; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Fisherman.hx b/AIR/intra/hsrc/entity/interactive/Fisherman.hx new file mode 100644 index 0000000..db3c33c --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Fisherman.hx @@ -0,0 +1,81 @@ +package entity.interactive +{ +import data.CLASS_ID; +import entity.player.Player; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Fisherman extends FlxSprite +{ + + public var player:Player; + public var xml:XML; + public var cid:Int=CLASS_ID.FISHERMAN; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_dying:Int=1; + private var s_dead:Int=2; + + public static var fisherman_dead:Bool=false; + public function new(_xml:XML, _player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(NPC.embed_beach_npcs, true, false, 16, 16); + immovable=true; + health=2; + player=_player; + addAnimation("idle", [10,11], 3, true); + addAnimation("dead", [12], 3, true); + play("idle"); + if(xml.@alive=="false"){ + fisherman_dead=true; + x -=5000;//fuck it + exists=false; + } + } + + override public function update():Void + { + FlxG.collide(player, this); + switch(state){ + case s_normal: + if(!flickering && player.broom.overlaps(this)&& player.broom.visible){ + flicker(0.5); + health--; + } + if(health<=0){ + state=s_dying; + play("dead"); + } + break; + case s_dying: + player.state=player.S_INTERACT; + if(EventScripts.send_property_to(this, "y", parseInt(xml.@y)+ 44, 0.3)){ + state=s_dead; + fisherman_dead=true; + player.state=player.S_GROUND; + + } + break; + case s_dead: + xml.@alive="false"; + if(framePixels_y_push<16){ + framePixels_y_push ++; + } + if(scale.x>0 && scale.y>0){ + scale.x -=0.01; + scale.y -=0.01; + } + break; + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Health_Cicada.hx b/AIR/intra/hsrc/entity/interactive/Health_Cicada.hx new file mode 100644 index 0000000..953770d --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Health_Cicada.hx @@ -0,0 +1,280 @@ +package entity.interactive +{ +import entity.gadget.Checkpoint; +import entity.player.HealthBar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Achievements; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Health_Cicada extends FlxSprite +{ + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + + private var state:Int; + private var s_invisible:Int=0; + private var s_visible:Int=1; + private var s_animating:Int=2; + private var ctr:Int=0; + + + private var logic:Function; + + private var tl:Point; + private var target:Point=new Point; + private var t:Float=0; + private var tm:Float=1.7 ; + private var nr_gnaws:Int=0; + + private var t_sound:Float=0; + + + public var boxes:FlxGroup=new FlxGroup(10); + public var fly_away_distance:Int=80; + + + //[Embed(source="../../res/sprites/inventory/life_cicada.png")] public static var health_cicada_embed:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(health_cicada_embed, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("idle", [6,7,6,7,6,6,6,6], 8); + addAnimation("fly", [4,5], 14); + addAnimation("gnaw", [6,7], 14); + } else { + addAnimation("idle", [2, 3, 2, 3, 2, 2, 2, 2], 8); + addAnimation("fly", [0, 1], 14); + addAnimation("gnaw", [2, 3], 14); + } + play("idle"); + width=height=8; + offset.x=offset.y=4; + x +=4; + y +=4; + + visible=false; + + if(Registry.is_playstate){ + tl=new Point; + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + logic=dungeon_logic; + } else { + logic=roam_logic; + } + + if(xml.@alive=="false"){ + exists=false; + } + + for(i in 0...boxes.maxSize){ + var box:FlxSprite=new FlxSprite; + if(i % 2==0){ + box.makeGraphic(4, 4, 0xff000000); + } else { + box.makeGraphic(3, 3, 0xff000000); + } + box.visible=false; + boxes.add(box); + } + } + + + private function dungeon_logic():Void { + if(state==s_visible ||(state==s_animating && ctr<1)){ + Registry.sound_data.cicada_chirp.play(); + } + switch(state){ + case s_invisible: + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + start(tl.x + 72, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="REDCAVE"){ + if(Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]){ + start(tl.x + 90, tl.y + 75, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="CROWD"){ + if(Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + start(tl.x + 70, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="APARTMENT"){ + if(Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]){ + start(tl.x + 50, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="CIRCUS"){ + if(Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]){ + start(tl.x + 70, tl.y + 8 , tl.x - 16, tl.y + 30); + fly_away_distance=160; + } + } else if(Registry.CURRENT_MAP_NAME=="HOTEL"){ + if(Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]){ + start(tl.x + 60, tl.y + 70, tl.x -16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ + start(x, y, tl.x - 16, tl.y + 30); + } + + break; + case s_visible://Touch the player, freeze them. + if(ctr==0 && player.overlaps(this)&& player.state==player.S_GROUND){ + state=s_animating; + ctr=0; + play("fly"); + player.state=player.S_INTERACT; + player.be_idle(); + // Or fly away if plaer goes too far + } else if(ctr==1 || EventScripts.distance(player, this)>fly_away_distance){ + play("fly"); + velocity.y=-100; + ctr=1; + alpha -=0.02; + } + break; + case s_animating: + switch(ctr){ + case -1://move to target point + DH.disable_menu(); + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "x", target.x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "y", target.y, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr++; + state=s_visible; + play("idle"); + } + break; + case 0://After touched, heal the player + if(player.health_bar.max_health>player.health_bar.cur_health){ + t +=FlxG.elapsed; + if(t>0.5){ + Registry.sound_data.get_small_health.play(); + t=0; + player.health_bar.modify_health(1); + } + } else { //eventually upgrade the health and set a target point in the spot of the new health thing + ctr++; + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + Achievements.unlock(Achievements.Extra_health_1); + } + HealthBar.upgrade_health(player); + player.health_bar.members[player.health_bar.max_health - 1].visible=false; + target.x=player.health_bar.members[player.health_bar.max_health - 1].x + tl.x; + target.y=player.health_bar.members[player.health_bar.max_health - 1].y + tl.y - Registry.HEADER_HEIGHT; + } + break; + case 1://move there then nibble + sub_ctr=0; + if(EventScripts.send_property_to(this, "x", target.x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "y", target.y, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr++; + play("gnaw"); + boxes.setAll("visible", true); + set_boxes(); + } + break; + case 2:// do the box animation a few more times + for(var b:FlxSprite in boxes.members){ + if(b==null)continue; + b.alpha -=0.005; + } + t +=FlxG.elapsed; + if(t>tm){ + t=0; + set_boxes(); + } + if(nr_gnaws==3){ + ctr++; + player.health_bar.members[player.health_bar.max_health -1].visible=true; + play("fly"); + velocity.y=-40; + xml.@alive="false"; + } + break; + case 3://fade the last boxes out, then disappear after flying off + for(var b2:FlxSprite in boxes.members){ + if(b2==null)continue; + b2.alpha -=0.005; + } + alpha -=0.01; + if(alpha==0){ + DH.enable_menu(); + player.state=player.S_GROUND; + exists=false; + } + break; + } + break; + } + } + + private function set_boxes():Void { + nr_gnaws++; + Registry.sound_data.play_sound_group(Registry.sound_data.four_shooter_pop_group); + for(var box:FlxSprite in boxes.members){ + if(box==null)continue; + box.alpha=1; + box.acceleration.y=50 + 20 * Math.random(); + box.velocity.x=-40 + 80 * Math.random(); + box.velocity.y=10 + 20 * Math.random(); + box.x=x + 6; + box.y=y + 6; + } + } + private function roam_logic():Void { + + } + + private function start(target_x:Int,target_y:Int,start_x:Int,start_y:Int):Void + { + state=s_animating; + visible=true; + target.x=target_x; + target.y=target_y; + x=start_x; + y=start_y; + ctr=-1; + play("fly"); + } + override public function update():Void + { + logic(); + super.update(); + } + + override public function destroy():Void + { + tl=null; + logic=null; + DH.enable_menu(); + Registry.sound_data.cicada_chirp.stop(); + parent.header_group.remove(this, true); + parent.header_group.remove(boxes, true); + boxes=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/NPC.hx b/AIR/intra/hsrc/entity/interactive/NPC.hx new file mode 100644 index 0000000..9b69278 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/NPC.hx @@ -0,0 +1,1426 @@ +package entity.interactive +{ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.enemy.crowd.Dog; +import entity.enemy.etc.Briar_Boss; +import entity.enemy.hotel.Eye_Boss; +import entity.enemy.suburb.Suburb_Walker; +import entity.gadget.Door; +import entity.interactive.npc.Forest_NPC; +import entity.interactive.npc.Shadow_Briar; +import entity.interactive.npc.Space_NPC; +import entity.interactive.npc.Trade_NPC; +import entity.player.Player; +import flash.filters.BlurFilter; +import flash.geom.Point; +import flash.net.FileFilter; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.S_NPC; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import states.EndingState; +import states.PlayState; +import states.TitleState; + +/** + * ... + * @author Seagaia + */ +class NPC extends FlxSprite +{ + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var active_region:Dynamic; + public var get_dialogue:Function; + public var cid:Int=CLASS_ID.NPC_; + //[Embed(source="../../res/sprites/npcs/npc.png")] public static var npc_spritesheet:Class; + //[Embed(source="../../res/sprites/gadgets/biofilm.png")] public static var npc_biofilm:Class; + //[Embed(source="../../res/sprites/npcs/sage_statue.png")] public static var sage_statue:Class; + //[Embed(source="../../res/sprites/npcs/note_rock.png")] public static var note_rock:Class; + //[Embed(source="../../res/sprites/npcs/cube_kings.png")] public static var embed_cube_kings:Class; + //[Embed(source="../../res/sprites/gadgets/key_green.png")] public static var key_green_embed:Class; + //[Embed(source="../../res/sprites/gadgets/key_sparkle.png")] public static var key_sparkle_embed:Class; + //[Embed(source="../../res/sprites/gadgets/nexus_pad.png")] public static var embed_nexus_pad:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_shell.png")] public static var embed_windmill_shell:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_blade.png")] public static var embed_windmill_blade:Class; + //[Embed(source="../../res/sprites/npcs/cell_bodies.png")] public static var embed_cell_bodies:Class; + //[Embed(source="../../res/sprites/npcs/trade_npcs.png")] public static var embed_trade_npcs:Class; + //[Embed(source="../../res/sprites/npcs/geoms.png")] public static var embed_geoms:Class; + //[Embed(source="../../res/sprites/npcs/easter/randoms.png")] public static var embed_randoms:Class; + //[Embed(source="../../res/sprites/npcs/easter/smoke_red.png")] public static var embed_smoke_red:Class; + //[Embed(source="../../res/sprites/npcs/blue_npcs.png")] public static var embed_blue_npcs:Class; + //[Embed(source="../../res/sprites/npcs/cliffs_npcs.png")] public static var embed_cliff_npcs:Class; + + //[Embed(source="../../res/sprites/npcs/beach_npcs.png")] public static var embed_beach_npcs:Class; + //[Embed(source="../../res/sprites/npcs/hotel_npcs.png")] public static inline var embed_hotel_npcs:Class; + + public var sparkles:FlxGroup=new FlxGroup(3); + + private var t:Float=0; + private var tm:Float=0; + private var ctr:Int=0; + + private var is_key:Bool=false; + private var is_generic:Bool=false; + private var generic_update:Function; + + public var radius:Float=0; + private var rotational_velocity:Float=0.06; + private var did_init:Bool=false; + + private var windmill_blades:Array; + private var windmill_shell:FlxSprite; + private static var windmill_info:Array=new Array(0, 0, 0, 270, 0, 180); + private var windmill_invis:Float=0.1; + + private var distance:Float=0; + private var lonk_bush:FlxSprite; + + private static inline var gen_id_sbr_blocker:Int=0;// Guy blocking way to card / death room in SBR + private static inline var gen_id_happy_event:Int=1;// even marker for happy + private static inline var gen_id_nexus_pad:Int=2; + private static inline var gen_id_windmill_stuff:Int=3; + private static inline var gen_id_cube_kings:Int=4; + private static inline var gen_id_eyeboss_preview:Int=5; + private static inline var gen_id_cliff_dog:Int=6; + private static inline var gen_id_quest_npc:Int=7; + // redcave smoker, apartment thing + private static inline var gen_id_easter_eggs:Int=8;// not a typo + private static inline var gen_id_death_place:Int=9; + private static inline var gen_id_snowman:Int=10; + private static inline var gen_id_go_happy_blocker:Int=11; + private static inline var gen_id_hotelguy:Int=12; + private static inline var gen_id_hamster:Int=13; + private static inline var gen_id_chikapu:Int=14; + private static inline var gen_id_electric:Int=15; + private static inline var gen_id_marvin:Int=16; + private var gen_id_melos:Int=17; + private static inline var gen_id_marina:Int=18; + + + private static var eyeboss_preview_played:Bool=false; +/* dame vars: + * type - name + * */ +private var locked_ticks:Int=0; + + + public function new(_xml:XML,_parent:Dynamic,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + parent=_parent; + player=_player; + xml=_xml; + immovable=true; + switch(xml.@type.toString()){ + //exports from the Generic_NPC sprite in DAME. + // The frame determines what actions it will have. + // The mapping of DAME-frame to NPC is above + case "Cell_Body": + is_generic=true; + loadGraphic(embed_cell_bodies, true, false, 16, 16); + generic_update=gu_cell_body; + active_region=new FlxSprite(x - 2000, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + frame=parseInt(xml.@frame); + + break; + case "generic": + is_generic=true; + switch(parseInt(xml.@frame)){ + case 0:// SBR blocker + xml.@p="2"; + generic_update=gu_suburb_blocker; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Suburb_Walker.embed_suburb_folk, true,false, 16, 16); + addAnimation("walk_d", [0,1], 4, true); + addAnimation("walk_r", [2,3], 4, true); + addAnimation("walk_u", [4,5], 4, true); + addAnimation("walk_l", [6,7], 4, true); + play("walk_d"); + if(xml.@alive=="false"){ + exists=false; + } + break; + case 1: + if(Registry.GE_States[Registry.GE_Happy_Started]){ + exists=false; + + } + generic_update=gu_happy_event; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + makeGraphic(1, 1, 0x00123123); + + break; + case 2: + // NEXUS Pad + generic_update=gu_nexus_pad; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_nexus_pad, true, false, 32, 32); + width=20; + height=16; + offset.y=6;y +=8; + offset.x=8;x +=8; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("on", [3], 12); + addAnimation("off", [2], 12); + } else { + addAnimation("on", [1], 12); + addAnimation("off", [0], 12); + } + play("off"); + break; + case gen_id_windmill_stuff: + + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + generic_update=gu_windmill; + + windmill_blades=new Array(); + for(i in 0...3){ + var blade:FlxSprite=new FlxSprite(0, 0); + blade.loadGraphic(embed_windmill_blade, true, false, 192, 192); + switch(i){ + case 1: + blade.addAnimation("rotate", [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,0, 1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14,15], 20, true); + + blade.play("rotate"); + blade._curFrame=windmill_info[2]; + blade.angle=windmill_info[3]; + break; + case 0: + blade.addAnimation("rotate", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7], 20, true); + blade.play("rotate"); + blade._curFrame=windmill_info[0]; + blade.angle=windmill_info[1]; + break; + case 2: + blade.addAnimation("rotate", [16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], 20, true); + blade.play("rotate"); + blade._curFrame=windmill_info[4]; + blade.angle=windmill_info[5]; + break; + } + blade.visible=false; + // 0:Right, 1:up, 2:left, 3:down + parent.anim_tiles_group.add(blade);// Removed automagically. + windmill_blades.push(blade); + + + } + + windmill_shell=new FlxSprite(0, 0); + windmill_shell.loadGraphic(embed_windmill_shell, false, false, 48, 48); + windmill_shell.x=Registry.CURRENT_GRID_X * 160 + 32; + windmill_shell.y=Registry.CURRENT_GRID_Y * 160 + 20 + 48; + if(Registry.CURRENT_GRID_Y==3)windmill_shell.y -=160; + parent.fg_sprites.add(windmill_shell); + //windmill_shell.visible=false; + var center:Point=new Point(windmill_shell.x + 16, windmill_shell.y + 16); + windmill_blades[0].x=center.x - 16; + windmill_blades[0].y=center.y - 192 + 32; + windmill_blades[1].x=center.x -192 + 32; + windmill_blades[1].y=center.y - 192 + 32; + windmill_blades[2].x=center.x - 192 + 32; + windmill_blades[2].y=center.y - 16; + + makeGraphic(1, 1, 0x00ffffff); + break; + // marina_ANIMS_CUBE_KINGS + case gen_id_cube_kings: + generic_update=gu_cube_kings; + // add anmations ass needed + if(Registry.CURRENT_GRID_X<5){ // "gray" + loadGraphic(Space_NPC.embed_space_npc, true, false, 32,32); + addAnimation("a", [10,11], 4); + play("a"); + ctr=0; + } else { // "color" + loadGraphic(Space_NPC.embed_space_npc, true, false, 32,32); + addAnimation("a", [12,13], 4); + play("a"); + ctr=1; + } + active_region=new FlxSprite(x, y + 30 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(32, 3, 0x0000ff00); + break; + case gen_id_eyeboss_preview: + + active_region=new FlxSprite(x, y + 30 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(32, 3, 0x0000ff00); + + loadGraphic(Eye_Boss.eye_boss_water_sprite, true, false, 24,24); + addAnimation("blink", [0, 1, 2, 3, 2, 1, 0], 10, false); + addAnimation("open", [3, 2, 1, 0], 5); + addAnimation("closed", [3]); + play("closed"); + alpha=0; + frame=3; + generic_update=gu_eyeboss_preview; + if(Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx])exists=false; + if(eyeboss_preview_played){ + if(Math.random()>0.3){ + exists=false; + } + } else { + eyeboss_preview_played=true; + } + break; + case gen_id_cliff_dog: + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Dog.dog_sprite, true, false, 16, 16); + addAnimation("walk", [2, 3], 8, true); + addAnimation("stop", [0], 12, true); + play("stop"); + generic_update=gu_cliff_dog; + break; + // NPCs for the trade quest.(dialogue quest) + // Need to be talked to in order, give you access to the shed + // in northern GO that gives a hint to the post-game temple NW of OVERWORLD + case gen_id_quest_npc: + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_trade_npcs, true, false, 16, 16); + generic_update=gu_quest_npc; + switch(Registry.CURRENT_MAP_NAME){ + case "CLIFF": + loadGraphic(embed_cliff_npcs, true, false, 16, 16); + addAnimation("a", [1], 2); + addAnimation("move", [1,3,1,5,1,1,1,0,2,0,4,0,0,1,1], 3, false); + break; + case "BEACH": + loadGraphic(embed_beach_npcs, true, false, 16, 16); + addAnimation("a", [0], 2); + addAnimation("turn", [1], 2); + break; + case "FOREST": + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, + 16); + addAnimation("a", [10,10,10,11,10,10,10,12], 3, true); + break; + case "FIELDS": + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 32,32); + addAnimation("a", [15,15,15,15,15,15,15,15,16,17,17,18,18], 18, true); + lonk_bush=new FlxSprite(x + 16, y + 32); + lonk_bush.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + lonk_bush.frame=30; + width=height=16; + y +=16; + offset.y=16; + parent.bg_sprites.add(lonk_bush); + break; + case "TRAIN"://CELLc + loadGraphic(embed_cell_bodies, true, false, 16, 16); + addAnimation("idle_d", [8]); + addAnimation("a", [8]); + addAnimation("idle_r", [9]); + addAnimation("idle_u", [10]); + addAnimation("idle_l", [11]); + play("idle_d"); + break; + case "SUBURB": + loadGraphic(Suburb_Walker.embed_suburb_folk, true, false, 16, 16); + addAnimation("a", [0,1], 4, true); + break; + case "SPACE": + loadGraphic(Space_NPC.embed_space_npc, true, false, 16, 16); + addAnimation("a", [0,10,1,11], 10, true); + break; + case "GO": + loadGraphic(note_rock, true, false, 16, 16); + addAnimation("a", [0], 12, true); + break; + } + play("a"); + break; + case gen_id_easter_eggs: + //MARINA_ANIMS_GEOMS + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + // smoking guy hidden in redcave + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(36, 36, 0x0000ff00); + generic_update=gu_easter; + loadGraphic(embed_smoke_red, false, true, 32, 32); + break; + case "APARTMENT": + // Hidden something in roof of apartment + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + generic_update=gu_easter; + loadGraphic(embed_randoms, true, false, 16, 16); + addAnimation("APT", [0], 10); + play("APT"); + break; + case "FIELDS": + // Rabbit(Olive) + generic_update=gu_easter; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, 16); + addAnimation("idle", [30], 4, true); + addAnimation("hop", [32,33,32,33], 4, false); + break; + } + break; + case gen_id_death_place: + generic_update=gu_death_place; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + visible=false; + break; + case gen_id_snowman: + generic_update=gu_snowman; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_blue_npcs, true, false, 16, 16); + addAnimation("melt", [2, 3, 4, 5, 6], 8, false); + frame=0; + + if(xml.@alive=="false"){ + frame=6; + } else { + xml.@alive="true"; + xml.@p="1"; + } + + break; + case gen_id_go_happy_blocker: + generic_update=gu_go_happy_blocker; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])exists=false; + loadGraphic(Briar_Boss.embed_ground_thorn, true, false, 16, 16); + addAnimation("a", [7, 11], 8); + play("a"); + y +=8; + break; + case gen_id_hotelguy: + loadGraphic(embed_hotel_npcs, true, false, 16, 16); + generic_update=gu_hotel_guy; + addAnimation("idle_d", [0], 8); + addAnimation("idle_r", [1], 8); + addAnimation("idle_u", [2], 8); + addAnimation("idle_l", [3], 8); + play("idle_u"); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + break; + case gen_id_hamster: + generic_update=gu_fields_easter; + fields_easter_scene="hamster"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [80, 81], 4); + play("a"); + break; + case gen_id_chikapu: + generic_update=gu_fields_easter; + fields_easter_scene="chikapu"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [82,83], 4); + play("a"); + break; + case gen_id_electric: + generic_update=gu_fields_easter; + fields_easter_scene="electric"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [84,85], 4); + play("a"); + break; + case gen_id_marvin: + generic_update=gu_fields_easter; + fields_easter_scene="marvin"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [86,87], 4); + play("a"); + break; + casegen_id_melosn: + generic_update=gu_easter; + fields_easter_scene="melos"; + loadGraphic(EndingState.embed_dev_npcs, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [0], 4); + play("a"); + break; + case gen_id_marina: + generic_update=gu_easter; + fields_easter_scene="marina"; + loadGraphic(EndingState.embed_dev_npcs, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [10], 4); + play("a"); + break; + default: + + // Load some graphic + // Sets width/height + // Set update function + break; + } + break; + + case "npc_test": + loadGraphic(npc_spritesheet, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + get_dialogue=dialogue_test; + break; + case "statue": + loadGraphic(sage_statue, true, false, 16, 16); + height=16; + //offset.y=16 - 8; + //y +=16; + active_region=new FlxObject(x, y, 20, 20); + get_dialogue=dialogue_statue; + break; + case "rock": + get_dialogue=dialogue_rock; + if(Registry.CURRENT_MAP_NAME=="SPACE"){ + loadGraphic(Space_NPC.embed_space_npc, true, false, 16, 16); + if(Registry.CURRENT_GRID_X>5){ + frame=31; + } else { + frame=30; + } + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + + loadGraphic(note_rock, true, false, 16, 16); + frame=1; + } else { + loadGraphic(note_rock, true, false, 16, 16); + } + active_region=new FlxObject(x, y, 20, 20); + break; + case "big_key": + if(xml.@alive=="false"){ + exists=false; + } + active_region=new FlxObject(x, y, 20, 20); + Registry.subgroup_interactives.push(this); + loadGraphic(key_green_embed, false, false, 16, 16); + + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + frame=0; + break; + case "REDCAVE": + frame=2; + break; + case "CROWD": + frame=4; + break; + } + width=9; + offset.x=3; + x +=3; + tm=0.8; + for(i=0;i0.95 &&(player.y - tl)>140){ + Registry.E_DESTROY_PLAYSTATE=true; + Registry.cleanup_on_map_change(); + Registry.sound_data.stop_current_song(); + DH.enable_menu();// Disabled when you chose "No" from death screen + FlxG.switchState(new TitleState); + } + } + private function gu_easter():Void { + + immovable=true; + FlxG.collide(player, this); + + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "APARTMENT": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "FIELDS": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "DEBUG": + DH.start_dialogue(DH.name_generic_npc, fields_easter_scene); + break; + } + } + + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + PlayState.turn_on_effect(PlayState.GFX_DISCO); + alpha=0.6 + 0.4 * Math.random(); + scale.x=0.8 + 0.4 * Math.random(); + scale.y=0.8 + 0.4 * Math.random(); + break; + case "APARTMENT": + break; + case "FIELDS": + if(ctr==0){ + play("idle"); + t +=FlxG.elapsed; + if(t>1.4){ + t=0; + ctr=1; + } + } else if(ctr==1){ + play("hop"); + scale.x=1; + velocity.x=25; + ctr=2; + } else if(ctr==2){ + if(_curAnim.frames.length - 1==_curFrame){ + play("idle"); + velocity.x=0; + ctr=3; + } + } else if(ctr==3){ + t +=FlxG.elapsed; + if(t>1.6){ + t=0; + ctr=4; + velocity.x=-25; + scale.x=-1; + play("hop"); + } + } else if(ctr==4){ + if(_curAnim.frames.length - 1==_curFrame){ + play("idle"); + velocity.x=0; + ctr=0; + } + } + break; + + } + } + + // Only play the Quest NPC dialogue once per entrance Into the current room + private var local_played_quest:Bool=false; + private function gu_quest_npc():Void { + + immovable=true; + FlxG.collide(player, this); + + if(false==DH.a_chunk_is_playing()&& player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + immovable=true; + FlxG.collide(player, this); + var a:Array=Registry.GE_States; + var n:String=Registry.CURRENT_MAP_NAME; + var b:Bool=false; + if(n=="CLIFF" && false==a[Registry.GE_QUEST_BEACH]){ + b=a[Registry.GE_QUEST_CLIFF]=true; + play("move"); + } else if(n=="BEACH" && false==a[Registry.GE_QUEST_FOREST] && true==a[Registry.GE_QUEST_CLIFF]){ + b=a[Registry.GE_QUEST_BEACH]=true; + } else if(n=="FOREST" && false==a[Registry.GE_QUEST_FIELDS] && true==a[Registry.GE_QUEST_BEACH]){ + b=a[Registry.GE_QUEST_FOREST]=true; + } else if(n=="FIELDS" && false==a[Registry.GE_QUEST_CELL] && true==a[Registry.GE_QUEST_FOREST]){ + b=a[Registry.GE_QUEST_FIELDS]=true; + } else if(n=="TRAIN" && false==a[Registry.GE_QUEST_SUBURB] && true==a[Registry.GE_QUEST_FIELDS]){ + b=a[Registry.GE_QUEST_CELL]=true; + } else if(n=="SUBURB" && false==a[Registry.GE_QUEST_SPACE] && true==a[Registry.GE_QUEST_CELL]){ + b=a[Registry.GE_QUEST_SUBURB]=true; + } else if(n=="SPACE" && false==a[Registry.GE_QUEST_GO] && true==a[Registry.GE_QUEST_SUBURB]){ + b=a[Registry.GE_QUEST_SPACE]=true; + } else if(n=="GO" && true==a[Registry.GE_QUEST_SPACE]){ + b=a[Registry.GE_QUEST_GO]=true; + } + + // If the previous thing was done and the next is not done, play the event dialogue. + // Otherwise, play normal dialogue. + if(true==b && false==local_played_quest){ + local_played_quest=true; + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_event, n); + } else { + if(n=="BEACH" || n=="FOREST" || n=="CLIFF"){ + if(n=="CLIFF"){ + play("move"); + } + if(S_NPC.check_to_play_second(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n)){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_second, n); + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n); + } + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n); + } + } + + if(n=="TRAIN"){ + EventScripts.face_and_play(this, player, "idle"); + } + if(n=="BEACH"){ + play("turn"); + } + + } + // for debugging + //if(FlxG.keys.justPressed("W"))Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + + if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + lonk_bush.immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(lonk_bush, player); + if(false==DH.a_chunk_is_playing()&& player.broom.visible && player.broom.overlaps(lonk_bush)){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_rank_bush); + } + } + + // Other behavior, possibly.. + } + private function gu_cliff_dog():Void { + t +=FlxG.elapsed; + if(ctr==0){ // Still left + if(t>1){ + if(Math.random()>0.6){ + t=0; + ctr=1; + play("walk"); + scale.x=1; + velocity.x=15; + } + } + } else if(ctr==1){ // move l ->r + if(t>1){ + t=0; + ctr=3; + play("stop"); + scale.x=1; + velocity.x=0; + } + } else if(ctr==2){ // move r _>l + + if(t>1){ + t=0; + ctr=0; + scale.x=1; + play("stop"); + velocity.x=0; + } + } else { + if(t>1){ + if(Math.random()>0.6){ + t=0; + ctr=2; + scale.x=-1; + play("walk"); + velocity.x=-15; + } + } + } + + + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y - 2; + + + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.start_dialogue(DH.name_cliff_dog, DH.scene_cliff_dog_top_left); + } + + } + private function gu_cell_body():Void { + + } + private function gu_eyeboss_preview():Void { + + switch(ctr){ + case 0: + alpha +=0.008; + if(alpha>=1){ + ctr++; + play("open"); + } + break; + case 1: + if(finished){ + ctr++; + play("blink"); + } + break; + case 2: + if(finished){ + ctr++; + + } + break; + case 3: + alpha -=0.05; + break; + } + + } + private function gu_cube_kings():Void { + FlxG.collide(player, this); + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + switch(ctr){ + case 0://gray + if(!DH.a_chunk_is_playing()){ + player.be_idle(); + DH.start_dialogue(DH.name_cube_king, DH.scene_cube_king_space_gray); + } + break; + case 1://color + if(!DH.a_chunk_is_playing()){ + DH.start_dialogue(DH.name_cube_king, DH.scene_cube_king_space_color); + } + break; + } + } + } + private function gu_windmill():Void { + // rotate the blades + // RULD' + + windmill_invis -=FlxG.elapsed; + + var b:FlxSprite; + for(i in 0...3 ++){ + b=windmill_blades[i]; + + if(windmill_invis<0){ + b.visible=true; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + trace(1); + if(i==0) + b.frame=0; + if(i==1) + b.frame=8; + if(i==2) + b.frame=16; + } else { + if(b._curAnim==null) + b.play("rotate"); + } + + switch(i){ + case 0: + if(b._curFrame>=24){ + b.angle=270; + } else { + b.angle=0; + } + break; + case 1: + if(b._curFrame>=16){ + b.angle=180; + } else { + b.angle=270; + } + + break; + case 2: + if(b._curFrame>=8){ + b.angle=90; + } else { + b.angle=180; + } + break; + } + set_pos(b); + windmill_info[2*i]=b._curFrame; + windmill_info[2 * i + 1]=b.angle; + } + + } + + + private function set_pos(blade:FlxSprite):Void { + var center:Point=new Point(windmill_shell.x + 16, windmill_shell.y + 16); + switch(blade.angle){ + case 0: + blade.x=center.x - 16; + blade.y=center.y - 192 + 32; + break; + case 90: + blade.x=center.x - 16; + blade.y=center.y - 16; + break; + case 180: + blade.x=center.x - 192 + 32; + blade.y=center.y - 16; + break; + case 270: + blade.x=center.x -192 + 32; + blade.y=center.y - 192 + 32; + break; + } + } + + private function gu_nexus_pad():Void { + // If on, beep, if press c, warp + // if off.. + + // off + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + if(ctr==0){ + if(player.overlaps(this)&& player.state==player.S_GROUND){ + ctr=1; + play("on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + } + } else { + if(!player.overlaps(this)){ + ctr=0; + play("off"); + } + + if(Registry.keywatch.JP_ACTION_1){ + load_nexus_data(); + parent.SWITCH_MAPS=true; + } + } + + } + + private var happy_tlx:Int=Registry.CURRENT_GRID_X * 160 + 80; + private function gu_happy_event():Void { + switch(ctr){ + case 0: + Registry.volume_scale -=0.015; + if(player.state==player.S_GROUND && player.xtm){ + for(var sparkle:FlxSprite in sparkles.members){ + if(sparkle==null)continue; + if(sparkle.finished){ + sparkle.visible=true; + sparkle.x=x - 2 +(width + 4)* Math.random(); + sparkle.y=y - 3 +(height + 6)* Math.random()- offset.y; + sparkle.play("sparkle"); + t=0; + // Sparkles come out faster and faster nad fasters + if(ctr>0 && ctr<4){ + trace(tm); + if(tm>0.15){ + tm -=0.06; + } + sparkle.velocity.y=20; + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.sparkle_group); + } + break; + } + } + } + var sub_ctr:Int=0; + switch(ctr){ + case 0: + // Wait for player to Interact + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y - 2; + if(parent.state==parent.S_NORMAL){ + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& player.state==player.S_GROUND){ + DH.disable_menu(); + EventScripts.face_and_play(player, this, "idle"); + player.state=player.S_INTERACT; + ctr++; + rotate_angle=EventScripts.get_angle(player.x, player.y, x, y); + radius=EventScripts.distance(new Point(player.x + 5, player.y + 5), this); + my_shadow.visible=true; + my_shadow.frame=0; + + // Chang einventory state + xml.@alive="false"; + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + Registry.inventory[Registry.IDX_GREEN_KEY]=true; + break; + case "REDCAVE": + Registry.inventory[Registry.IDX_RED_KEY]=true; + break; + case "CROWD": + Registry.inventory[Registry.IDX_BLUE_KEY]=true; + break; + } + } + } + break; + case 1: + // rotate + if(EventScripts.send_property_to(this.offset, "y", 16, 0.3))sub_ctr++; + if(EventScripts.send_property_to(this, "radius", 40, 0.2))sub_ctr++; + + EventScripts.rotate_about_center_of_sprite(player, this, radius, rotational_velocity, 0, 0); + + if(sub_ctr==2){ + my_shadow.frame=2; + ctr++; + rotational_velocity *=2; + } + break; + case 2: + //slowly rotate higher/closer + if(EventScripts.send_property_to(this.offset, "y", 64, 0.3))sub_ctr++; + if(EventScripts.send_property_to(this, "radius", 2, 0.14))sub_ctr++; + + EventScripts.rotate_about_center_of_sprite(player, this, radius, rotational_velocity, 0, 0); + + if(sub_ctr==2){ + // Play "ding" noise, + ctr++; + } + break; + case 3: + //move higher while not rotating + if(EventScripts.send_property_to(this.offset, "y", 70, 0.05))sub_ctr++; + if(sub_ctr==1){ + ctr++; + } + + break; + case 4: + // fly Into player + if(EventScripts.send_property_to(this.offset, "y", 16, 2.2))sub_ctr++; + + // Flash the screen + if(sub_ctr==1){ + FlxG.flash(0xffffffff, 2.0); + FlxG.shake(0.02, 0.4); + + Registry.sound_data.sun_guy_death_l.play(); + visible=false; + my_shadow.visible=false; + ctr++; + } + + break; + case 5: + DH.enable_menu(); + parent.player.state=parent.player.S_GROUND; + xml.@alive="false"; + exists=false; + + break; + } + super.update(); + } + + private function dialogue_test():Void { + DH.start_dialogue(DH.name_test, DH.scene_test_debug_scene_1); + } + + private function dialogue_statue():Void { + player.be_idle(); + switch(Registry.CURRENT_MAP_NAME){ + case "OVERWORLD": + DH.start_dialogue(DH.name_statue, DH.scene_statue_overworld_bedroom_entrance); + break; + case "NEXUS": + DH.start_dialogue(DH.name_statue, DH.scene_statue_nexus_enter_nexus); + break; + case "BEDROOM": + DH.start_dialogue(DH.name_statue, DH.scene_statue_bedroom_after_boss); + break; + case "TERMINAL": + DH.start_dialogue(DH.name_statue, "one"); + break; + case "REDCAVE": + DH.start_dialogue(DH.name_statue, "one"); + break; + } + } + + private function dialogue_rock():Void { + + var scene:String; + switch(parseInt(xml.@frame)){ + case 0: + scene=DH.scene_rock_one; + break; + case 1: + scene=DH.scene_rock_two; + break; + case 2: + scene=DH.scene_rock_three; + break; + case 3: + scene=DH.scene_rock_four; + break; + case 4: + scene=DH.scene_rock_five; + break; + case 5: + scene=DH.scene_rock_six; + break; + } + + if(DH.start_dialogue(DH.name_rock, scene)){ + player.be_idle(); + DH.increment_property(DH.name_rock, "times_talked"); + trace("rock", DH.get_int_property(DH.name_rock, "times_talked")); + if(DH.get_int_property(DH.name_rock, "times_talked")<2){ + //Registry.cur_dialogue="There is writing scrawled on this rock:^\n" + Registry.cur_dialogue; + Registry.cur_dialogue=DH.lk("rock",0)+"^\n" + Registry.cur_dialogue; + } + } + // Update + } + + private static function nexus_helper(idx:Int,curmap:String):Void + { + //Door.is_nexus_door_open(idx); + Registry.NEXT_MAP_NAME="NEXUS"; + var a:Array=Registry.DOOR_INFO[idx]; + + if(Registry.DOOR_INFO[idx][0][2] !=curmap){ + Registry.ENTRANCE_PLAYER_X=Registry.DOOR_INFO[idx][0][0]; + Registry.ENTRANCE_PLAYER_Y=Registry.DOOR_INFO[idx][0][1]; + } else { + Registry.ENTRANCE_PLAYER_X=Registry.DOOR_INFO[idx][1][0]; + Registry.ENTRANCE_PLAYER_Y=Registry.DOOR_INFO[idx][1][1]; + } + Registry.ENTRANCE_PLAYER_X +=10; + Registry.ENTRANCE_PLAYER_Y +=34; + } + + public static function load_nexus_data():Void + { + switch(Registry.CURRENT_MAP_NAME){ + case "WINDMILL": + nexus_helper(Door.Door_Nexus_Windmill, Registry.CURRENT_MAP_NAME); + break; + case "CLIFF": + nexus_helper(Door.Door_Nexus_Cliff, Registry.CURRENT_MAP_NAME); + break; + case "FOREST": + nexus_helper(Door.Door_Nexus_Forest, Registry.CURRENT_MAP_NAME); + break; + case "REDSEA": + nexus_helper(Door.Door_Nexus_Redsea, Registry.CURRENT_MAP_NAME); + break; + case "BEACH": + nexus_helper(Door.Door_Nexus_Beach, Registry.CURRENT_MAP_NAME); + break; + case "GO": + nexus_helper(Door.Door_Nexus_Go, Registry.CURRENT_MAP_NAME); + break; + case "HAPPY": + nexus_helper(Door.Door_Nexus_Happy, Registry.CURRENT_MAP_NAME); + break; + case "BLUE": + nexus_helper(Door.Door_Nexus_Blue, Registry.CURRENT_MAP_NAME); + break; + case "FIELDS": + nexus_helper(Door.Door_Nexus_Fields, Registry.CURRENT_MAP_NAME); + break; + case "BEDROOM": + nexus_helper(Door.Door_Nexus_Bedroom, Registry.CURRENT_MAP_NAME); + break; + case "REDCAVE": + nexus_helper(Door.Door_Nexus_Redcave, Registry.CURRENT_MAP_NAME); + break; + case "CROWD": + nexus_helper(Door.Door_Nexus_Crowd, Registry.CURRENT_MAP_NAME); + break; + case "APARTMENT": + nexus_helper(Door.Door_Nexus_Apartment, Registry.CURRENT_MAP_NAME); + break; + case "HOTEL": + nexus_helper(Door.Door_Nexus_Hotel, Registry.CURRENT_MAP_NAME); + break; + case "CIRCUS": + nexus_helper(Door.Door_Nexus_Circus, Registry.CURRENT_MAP_NAME); + break; + case "TRAIN": + nexus_helper(Door.Door_Nexus_Cell, Registry.CURRENT_MAP_NAME); + break; + case "SUBURB": + nexus_helper(Door.Door_Nexus_Suburb, Registry.CURRENT_MAP_NAME); + break; + case "SPACE": + nexus_helper(Door.Door_Nexus_Space, Registry.CURRENT_MAP_NAME); + break; + case "TERMINAL": + nexus_helper(Door.Door_Nexus_Terminal, Registry.CURRENT_MAP_NAME); + break; + case "OVERWORLD": + nexus_helper(Door.Door_Nexus_Overworld, Registry.CURRENT_MAP_NAME); + break; + case "STREET": + nexus_helper(Door.Door_Nexus2Street, Registry.CURRENT_MAP_NAME); + break; + } + } + + + override public function destroy():Void + { + DH.a_chunk_just_finished(); + sparkles=null; + active_region=null; + windmill_blades=null; + windmill_shell=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Red_Pillar.hx b/AIR/intra/hsrc/entity/interactive/Red_Pillar.hx new file mode 100644 index 0000000..be7f981 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Red_Pillar.hx @@ -0,0 +1,145 @@ +package entity.interactive +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +class Red_Pillar extends FlxSprite +{ + /* dame props: + * alive - whether this appears as broken or not etc + * p=2 + * frame:what event it triggers when destroyed + * L R C1 C2 <-- the triggers(1 to 4)WHERE THEY ARE LOCATED */ + public var xml:XML; + public var cid:Int=CLASS_ID.RED_PILLAR; + + public var state:Int=0; + public var s_disappearing:Int=3; + public var s_dead:Int=2; + public var s_dying:Int=1; + public var s_alive:Int=0; + + public var player:Player; + public var parent:Dynamic; + + public var active_region:FlxSprite; + public var ripple:FlxSprite; + public var pixel_push:Float=0; + public var retract_speed:Float=0.4; + + //[Embed(source="../../res/sprites/enemies/redcave/red_pillar.png")] public static var red_pillar_sprite:Class; + //[Embed(source="../../res/sprites/enemies/redcave/red_pillar_ripple.png")] public static var red_pillar_ripple_sprite:Class; + + public function new(_xml:XML, _p:Player, _parent:Dynamic) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + /* AD DANIMS */ + loadGraphic(red_pillar_sprite, true, false, 16, 80); + addAnimation("move", [1, 2], 8); + addAnimation("stuck", [0]); + retract_speed=0.7; + play("stuck"); + + // need to add + ripple=new FlxSprite; + ripple.loadGraphic(red_pillar_ripple_sprite, true, false, 16, 16); + ripple.addAnimation("move", [0, 1], 8, true); + ripple.play("move"); + ripple.visible=false; + ripple.x=x; + ripple.y=y + height + Registry.HEADER_HEIGHT - ripple.height + 1; + + if(xml.@alive=="false"){ + exists=false; + } + immovable=true; + + player=_p; + + active_region=new FlxSprite(x, y + Registry.HEADER_HEIGHT + 16); + active_region.makeGraphic(16, 16, 0x000000); + + parent=_parent; + _parent.sortables.add(ripple); + } + + + override public function update():Void + { + if(state==s_dying){ + if(!flickering){ + Registry.Event_Nr_Red_Pillars_Broken++; + switch(parseInt(xml.@frame)){ + case 1: + case 2: + if(Registry.Event_Nr_Red_Pillars_Broken==4){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_North; + + } + xml.@alive="false"; + break; + case 3: + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_Left; + xml.@alive="false"; + break; + case 4: + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_Right; + xml.@alive="false"; + break; + } + player.state=player.S_GROUND; + exists=false; + } + } + + if(state==s_alive && player.broom.overlaps(active_region)&& player.broom.visible){ + hit(); + play_sfx(HURT_SOUND_NAME); + play("hit"); + } + + if(state==s_disappearing){ + + player.invincible=true; + if(player.broom.visible==false){ + player.state=player.S_INTERACT; + player.be_idle(); + } + pixel_push +=retract_speed; + framePixels_y_push=pixel_push; + if(framePixels_y_push==height){ + state=s_dying; + ripple.exists=false; + } + } else { + FlxG.collide(this, player); + } + + super.update(); + } + + public function hit():Void { + flicker(1.5); + play("move"); + state=s_disappearing; + ripple.visible=true; + + } + + override public function destroy():Void + { + parent.sortables.remove(ripple, true); + active_region=ripple=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/Terminal_Gate.hx b/AIR/intra/hsrc/entity/interactive/Terminal_Gate.hx new file mode 100644 index 0000000..6dc8b95 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/Terminal_Gate.hx @@ -0,0 +1,83 @@ +package entity.interactive +{ +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import org.flixel.FlxSprite; + +/** + * The gate in TERMINAL with three tiers. One is removed for + * of the first three bosses defeated. + * A container class for the associated entities + * @author Seagaia + */ +class Terminal_Gate extends FlxSprite +{ + + public var xml:XML; + public var p:Player; + public var parent:Dynamic; + + public var gate_bedroom:FlxSprite; + public var gate_redcave:FlxSprite; + public var gate_crowd:FlxSprite; + public var button:FlxSprite; + + public function new(_xml:XML, _p:Player, _parent:Dynamic,is_cutscene:Bool=false) + { + xml=_xml; + p=_p; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + gate_bedroom=new FlxSprite(x, y + 16 + Registry.HEADER_HEIGHT); + gate_redcave=new FlxSprite(x, y + 32 + Registry.HEADER_HEIGHT); + gate_crowd=new FlxSprite(x, y + 48 + Registry.HEADER_HEIGHT); + + gate_bedroom.makeGraphic(16, 16, 0xff00ee00); + gate_redcave.makeGraphic(16, 16, 0xffee0000); + gate_crowd.makeGraphic(16, 16, 0xff0000ee); + + + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]){ + gate_bedroom.exists=false; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Redcave]){ + gate_redcave.exists=false; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]){ + gate_crowd.exists=false; + } + visible=false; + button=new FlxSprite(x, y + Registry.HEADER_HEIGHT); + button.makeGraphic(16, 16, 0xff000000); + + if(!is_cutscene){ + parent.sortables.add(button); + parent.sortables.add(gate_bedroom); + parent.sortables.add(gate_redcave); + parent.sortables.add(gate_crowd); + } + + } + + override public function update():Void + { + + super.update(); + + + } + + override public function destroy():Void { + parent.sortables.remove(gate_bedroom, true); + parent.sortables.remove(gate_redcave, true); + parent.sortables.remove(gate_crowd, true); + parent.sortables.remove(button, true); + gate_bedroom=gate_redcave=gate_crowd=button=null; + super.destroy(); + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/npc/Forest_NPC.hx b/AIR/intra/hsrc/entity/interactive/npc/Forest_NPC.hx new file mode 100644 index 0000000..e1c72d5 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/npc/Forest_NPC.hx @@ -0,0 +1,150 @@ +package entity.interactive.npc +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * Behaviors of forest sprites, minus mr. bear who is in NPC as a Quest_npc + * @author Melos Han-Tani + */ + + +class Forest_NPC extends AnoSprite +{ + + private var type:Int; + private var T_LORAX:Int=0; + private var T_MUSHROOM:Int=1; + private var T_BUNNY:Int=2; + private var T_BUNNY_RUN:Int=3; + public var active_region:FlxSprite; + +//[Embed(source="../../../res/sprites/npcs/forest_npcs.png")] public static inline var embed_forest_npcs:Class; + + public function new(a:Array) + { + super(a); + + loadGraphic(embed_forest_npcs,true,false,16,16); + + switch(parseInt(xml.@frame)){ + case 0://Lorax + type=T_LORAX; + addAnimation("move", [0, 1], 4); + addAnimation("stand", [1], 0); + addAnimation("squat", [0], 0); + play("move"); + Registry.subgroup_interactives.push(this); + break; + case 20:// mushroom + type=T_MUSHROOM; + addAnimation("idle", [20], 4); + addAnimation("move", [20, 21, 20,22,20,21,20,22,20], 8,false); + play("idle"); + break; + case 30:// rabbit + type=T_BUNNY; + add_bunny_anims(this); + Registry.subgroup_interactives.push(this); + break; + case 34:// Random bunny swap + type=T_BUNNY_RUN; + add_bunny_anims(this); + if(Math.random()<0.25){ + var r:Float=Math.random(); + if(r<0.25){ + play("walk_d"); + } else if(r<0.5){ + play("walk_r"); + } else if(r<0.75){ + play("walk_u"); + } else { + play("walk_l"); + } + } else { + exists=false; + } + break; + } + active_region=new FlxSprite(x - 2, y - 2); + active_region.makeGraphic(20, 20, 0x00ffffff); + } + override public function destroy():Void + { + active_region.destroy(); + active_region=null; + super.destroy(); + } + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + if(type==T_LORAX){ + immovable=true; + FlxG.collide(this, player); + wait_to_talk(DH.name_forest_npc, DH.scene_forest_npc_thorax); + } else if(type==T_BUNNY){ + immovable=true; + FlxG.collide(this, player); + wait_to_talk(DH.name_forest_npc, DH.scene_forest_npc_bunny, "walk"); + } else if(type==T_MUSHROOM){ + immovable=true; + FlxG.collide(this, player); + if(player.broom.visible && player.broom.overlaps(this)&& _curAnim.name !="move"){ + play("move"); + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.mushroom_sound_group); + } else if(_curAnim.name=="move"){ + if(finished){ + play("idle"); + } + } + } else if(type==T_BUNNY_RUN){ + if(state==0){ + if(EventScripts.distance(this, player)<48){ + Registry.sound_data.play_sound_group(Registry.sound_data.rat_move); + state=1; + var run_spd:Int=100; + _curAnim.delay=1.0 / 14.0; + if(_curAnim.name=="walk_d"){ + velocity.y=run_spd; + } else if(_curAnim.name=="walk_r"){ + velocity.x=run_spd; + } else if(_curAnim.name=="walk_u"){ + velocity.y=-run_spd; + } else if(_curAnim.name=="walk_l"){ + velocity.x=-run_spd; + } + } + } else { + if(xtl.x + 160 || y>tl.y + 160 || y=1){ + play("fall"); + alive=false; + xml.@alive="false"; + xml.@p="2"; + } + } else if(Registry.CURRENT_MAP_NAME=="BLUE"){ + if(Registry.GRID_PUZZLES_DONE>=3){ + play("fall"); + alive=false; + xml.@p="2"; + xml.@alive="false"; + } + } + super.update(); + return; + } + active_region.x=x - 2; + active_region.y=y - 2; + + immovable=true; + player.solid=true; + FlxG.collide(parent.curMapBuf,this); + FlxG.collide(this, player); + if(DH.nc(player, active_region)){ + velocity.x=velocity.y=0; + EventScripts.face_and_play(this, player, "idle"); + if(type==T_HOT)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_hot); + if(type==T_DUMP)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_dump); + if(type==T_GOLD)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_gold); + if(type==T_DRINK)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_drink); + if(type==T_BEAUTIFUL)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_beautiful); + } + + // Behaviors + + if(DH.a_chunk_is_playing()==false){ + if(type==T_HOT){ + pace(); + } else if(type==T_DUMP){ + run(); + } else if(type==T_GOLD){ + run(); + } else if(type==T_DRINK){ + run(); + } else if(type==T_BEAUTIFUL){ + pace(); + } + } else { + + velocity.x=velocity.y=0; + } + + super.update(); + } + + private var t:Float=0; + private var tm:Float=1.0; + private var ctr:Int=0; + private function pace():Void { + t +=FlxG.elapsed; + if(t>tm){ + t=0; + if(ctr==0){ + if(Math.random()<0.5){ + ctr=1; + velocity.x=20; + play("walk_r"); + } else { + velocity.x=0; + random_idle(); + } + + } else if(ctr==1){ + velocity.x=0; + if(Math.random()<0.5){ + ctr=0; + play("walk_l"); + velocity.x=-20; + } else { + random_idle(); + velocity.x=0; + } + } + } + } + + private function run():Void { + t +=FlxG.elapsed; + if(t>tm){ + t=0; + if(ctr==0){ + play("walk_r"); + velocity.x=40; + ctr=1; + } else { + play("walk_l"); + velocity.x=-40; + ctr=0; + } + } + } + + private function random_idle():Void { + var r:Float=Math.random(); + + if(r<0.25){ + play("idle_d"); + } else if(r<0.5){ + play("idle_r"); + } else if(r<0.75){ + play("idle_u"); + } else { + play("idle_l"); + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/npc/Huge_Fucking_Stag.hx b/AIR/intra/hsrc/entity/interactive/npc/Huge_Fucking_Stag.hx new file mode 100644 index 0000000..721cd28 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/npc/Huge_Fucking_Stag.hx @@ -0,0 +1,32 @@ +package entity.interactive.npc +{ +import org.flixel.AnoSprite; +import org.flixel.FlxG; + +/** + * ... + * @author Melos Han-Tani + */ +class Huge_Fucking_Stag extends AnoSprite +{ + //[Embed(source="../../../res/sprites/npcs/forest_stag.png")] public static inline var embed_stag:Class; + public function new(a:Array) + { + super(a); + + loadGraphic(embed_stag, true, false, 64, 80); + addAnimation("a", [0, 1, 2], 4); + play("a"); + if(Math.random()<0.01 ||(FlxG.keys.Q && FlxG.keys.W && FlxG.keys.E)){ + + } else { + exists=false; + } + } + + override public function update():Void + { + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/npc/Mitra.hx b/AIR/intra/hsrc/entity/interactive/npc/Mitra.hx new file mode 100644 index 0000000..396c14d --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/npc/Mitra.hx @@ -0,0 +1,910 @@ +package entity.interactive.npc +{ +import data.CLASS_ID; +import entity.enemy.etc.Sage_Boss; +import entity.player.Player; +import flash.geom.Point; +import global.Keys; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + + +class Mitra extends FlxSprite +{ + + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + private var dame_frame:Int; + public var active_region:FlxObject; + public var sage_active_region:FlxObject; + + public var bike:FlxSprite; + public var cid:Int=CLASS_ID.MITRA; + public var sage:FlxSprite; + + + private var logic:Function; + private var fields_state:Int=0; + private static inline var FS_cards:Int=1; + private static inline var FS_init:Int=2; + // whehter an in + private var gave_initial_hint:Bool=false; + private var state_counter:Int=0; + // Generic flags + private var b1:Bool=false; + private var b2:Bool=false; + private var tl:Point=new Point(); + private var ctr:Int=0; + private var bullet:FlxSprite; + + //[Embed(source="../../../res/sprites/npcs/bike.png")] public static var bike_sprite:Class; + //[Embed(source="../../../res/sprites/npcs/mitra.png")] public static var mitra_sprite:Class; + //[Embed(source="../../../res/sprites/npcs/mitra_bike.png")] public static var mitra_on_bike_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + dame_frame=parseInt(xml.@frame); + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=20 + Registry.CURRENT_GRID_Y * 160; + super(parseInt(xml.@x), parseInt(xml.@y)); + + addAnimation("bike_d", [0,1], 8); + addAnimation("bike_u", [4,5], 8); + addAnimation("bike_idle_u", [4], 8); + addAnimation("bike_r", [2,3], 8); + addAnimation("bike_l", [2,3], 8); + + addAnimation("walk_d", [0,1], 8); + addAnimation("walk_u", [4,5], 8); + addAnimation("walk_r", [2,3], 8); + addAnimation("walk_l", [2,3], 8); + + addAnimation("idle_d", [6], 8); + addAnimation("idle_u", [8], 8); + addAnimation("idle_r", [7], 8); + addAnimation("idle_l", [7], 8); + + addAnimationCallback(on_anim_change); + + play("idle_d"); + + bike=new FlxSprite; + bike.loadGraphic(bike_sprite, true, false, 20, 20) + bike.addAnimation("r", [1], 2); + bike.addAnimation("d", [0], 2); + bike.addAnimation("u", [2], 2); + bike.visible=false; + bike.play("r"); + bike.width=16; + bike.height=10; + bike.offset.x=2; + bike.offset.y=11; + parent.sortables.add(bike); + + active_region=new FlxObject(x, y, 20, 20); + sage_active_region=new FlxObject(x, y, 20, 20); + + Registry.subgroup_interactives.push(this); + + switch(Registry.CURRENT_MAP_NAME){ + case "OVERWORLD": + to_bike(); + + if(dame_frame==0){ + Registry.EVENT_CHANGE_VOLUME_SCALE=true; + Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET=0.3; + logic=overworld_logic; + visible=false; + if(DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld)){ + exists=false; + } + } + break; + case "FIELDS": + + bike.visible=true; + bike.x=x - 20; + bike.y=y + 20; + if(Registry.all_bosses_dead()&& Registry.nr_growths<36){ + trace("Mitra.as:All bosses dead!"); + fields_state=FS_cards; + } + + if(DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_fields_init, "FIELDS")==false){ + fields_state=FS_init; + } + logic=fields_logic; + + loadGraphic(mitra_sprite, true, false, 16, 16); + break; + case "CLIFF": + logic=cliff_logic; + x=tl.x - 20; + y=tl.y + 70; + to_bike(); + if(Registry.inventory[Registry.IDX_JUMP])exists=false; + break; + case "GO": + // Make a sage sprite + if(Registry.GE_States[Registry.GE_Briar_Blue_Done]==false){ + exists=false; + break; + } + loadGraphic(mitra_on_bike_sprite, true, false, 20,20); + visible=false; + sage=new FlxSprite(0, 0); + + sage.loadGraphic(Sage.sage_sprite, true, false, 16, 16); + + sage.addAnimation("walk_d", [0, 1], 6, true); + sage.addAnimation("walk_r", [2,3], 6, true); + sage.addAnimation("walk_l", [2,3],6, true); + sage.addAnimation("walk_u", [4,5], 6, true); + sage.addAnimation("idle_d",[6]); + sage.addAnimation("idle_r", [7]); + sage.addAnimation("idle_l", [7]); + sage.addAnimation("idle_u", [8]); + sage.visible=false; + parent.sortables.add(sage); + + bullet=new FlxSprite(0, 0); + bullet.loadGraphic(Sage_Boss.embed_sage_attacks, true, false, 16, 16); + bullet.addAnimation("a", [0, 1], 8); + bullet.play("a"); + parent.sortables.add(bullet); + + logic=go_logic; + + if(Registry.GE_States[Registry.GE_go_mitra]==true){ + GO_STATE=GO_STATE_AFTER; + loadGraphic(mitra_sprite, true, false, 16, 16); + sage.x=tl.x + 32 + 8; + sage.y=tl.y + 7 * 16 + 2; + sage.visible=true; + bike.visible=true; + visible=true; + bike.x=tl.x + 6 * 16 + 2; + bike.y=tl.y + 7 * 16; + x=tl.x + 6 * 16 + 2; + y=tl.y + 8 * 16 - 20; + } + + break; + } + } + + override public function preUpdate():Void + { + if(solid){ + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + override public function update():Void + { + if(parent.state==parent.S_NORMAL){ + logic(); + } + super.update(); + } + + private static inline var GO_STATE_AFTER:Int=2; + private static inline var GO_STATE_DURING:Int=1; + private static inline var GO_STATE_BEFORE:Int=0; + private var GO_STATE:Int=0; + private function go_logic():Void { + if(GO_STATE==GO_STATE_BEFORE){ + if(ctr==0 && player.xtl.x + 7 * 16){ + player.x=tl.x + 7 * 16; + ctr++; + } + } else if(ctr==2){ + if(player.y>tl.y + 7 * 16){ + player.y -=1; + player.play("walk_u"); + } else if(player.yplayer.y - 4){ + loadGraphic(mitra_sprite, true, false, 16, 16); + velocity.y=20; + play("walk_d"); + + bike.visible=true; + bike.x=player.x - 18; + bike.y=player.y + 10; + + ctr++; + } + } + } else if(ctr==4){ + if(y>player.y + player.height){ + velocity.y=0; + velocity.x=20; + play("walk_r"); + if(x>player.x){ + player.play("idle_d"); + play("idle_u"); + velocity.x=0; + + sage.x=tl.x + 4 * 16; + sage.y=tl.y + 160; + sage.velocity.y=-20; + sage.visible=true; + sage.play("walk_u"); + + ctr++; + } + } + } else if(ctr==5){ + if(sage.ytl.x + 9 * 16){ + player.x=tl.x + 9 * 16; + } + + if(player.xtl.y + 9 * 16){ + player.y=tl.y + 9 * 16; + } + if(player.ytm){ + t=0; + bullet.velocity.x=10; + ctr++; + Registry.sound_data.play_sound_group(Registry.sound_data.laser_pew_group); + } + + // Fire bullet + } else if(ctr==3){ + if(bullet.x>bike.x - 3){ + bullet.visible=false; + FlxG.flash(0xffff0000, 1); + EventScripts.make_explosion_and_sound(bullet); + ctr=6; + } + if(bullet.overlaps(player)){ + FlxG.flash(0xffff0000, 1); + EventScripts.make_explosion_and_sound(bullet); + player.state=player.S_INTERACT; + bullet.visible=false; + player.play("slumped"); + ctr=4; + } + if(player.broom.visible && player.broom.overlaps(bullet)){ + FlxG.flash(0xffffffff, 1); + EventScripts.make_explosion_and_sound(bullet); + ctr=4; + bullet.visible=false; + } + } else if(ctr==4){ + // Wares doesnt gets hit + DH.start_dialogue(DH.name_sage, "hit", "", 0); + ctr=5; + } else if(ctr==5){ + if(DH.a_chunk_is_playing()==false){ + Registry.GAMESTATE.dialogue_latency=-1; + ctr=9; + DH.start_dialogue(DH.name_sage, "hit", "", 1); + } + } else if(ctr==6){ + //wares gets hit + DH.start_dialogue(DH.name_sage, "hit", "", 2); + ctr ++; + } else if(ctr==7){ + velocity.x=-20; + scale.x=-1; + play("walk_l"); + if(xtl.y + 50 && player.state !=player.S_LADDER){ + Registry.sound_data.stop_current_song(); + Registry.sound_data.start_song_from_title("MITRA"); + player.be_idle(); + player.state=player.S_INTERACT; + DH.disable_menu(); + //DH.dialogue_popup("Hey, Young!"); + DH.dialogue_popup(DH.lk("mitra",0)); + state_counter=1; + x=tl.x + 160 + 20; + y=tl.y + 80; + } + } else if(state_counter==1){ + player.be_idle(); + player.state=player.S_INTERACT; + if(DH.a_chunk_is_playing()==false){ + play("bike_l"); + velocity.x=-37; + state_counter=2; + } + } else if(state_counter==2){ + if(x<=player.x){ + velocity.x=0; + bike.x=x - 1; + bike.y=y - 1; + bike.visible=true; + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + //DH.dialogue_popup("Are those bike shoes for me? Wow! Thanks, Young! I’ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump with them on!"); + DH.dialogue_popup(DH.lk("mitra",1)+ " "+Registry.controls[Keys.IDX_ACTION_2] + " "+DH.lk("mitra",2)); + + } else { + //DH.dialogue_popup("Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip Into Wares' pedals. Since I’ll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump with them on!"); + DH.dialogue_popup(DH.lk("mitra",3)+ " "+Registry.controls[Keys.IDX_ACTION_2] + " "+DH.lk("mitra",4)); + } + + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.bound_item_2="JUMP"; + Registry.inventory[Registry.IDX_BIKE_SHOES]=false; + state_counter=6; + loadGraphic(mitra_sprite, true, false, 16, 16); + play("idle_u"); + offset.x=offset.y=0; + + } + } else if(state_counter==3){ + if(!DH.a_chunk_is_playing()){ + player.state=player.S_INTERACT; + player.be_idle(); + //DH.dialogue_popup("Alright, take care!"); + DH.dialogue_popup(DH.lk("mitra",5)); + state_counter=4; + } + } else if(state_counter==4){ + + if(!DH.a_chunk_is_playing()){ + velocity.x=37; + bike.visible=false; + to_bike(); + play("bike_r"); + player.state=player.S_INTERACT; + state_counter=5; + } + } else if(state_counter==5){ + + if(x>tl.x + 160){ + exists=false; + player.state=player.S_GROUND; + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="CLIFF"; + DH.enable_menu(); + } + } else if(state_counter==6){ + EventScripts.face_and_play(this, player, "idle"); + + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + + + FlxG.collide(this, player); + if(player.state==player.S_AIR){ + jumpedonce=true; + } + if(player.overlaps(active_region)&& DH.a_chunk_is_playing()==false && player.state==player.S_GROUND && Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(DH.get_int_property(DH.name_mitra, "smells")==-1){ + DH.increment_property(DH.name_mitra, "smells"); + //DH.dialogue_popup("Go on, try them out! ^...They’re not THAT smelly."); + DH.dialogue_popup(DH.lk("mitra",6)); + } else { + if(jumpedonce){ + //DH.dialogue_popup("Cool, huh?"); + DH.dialogue_popup(DH.lk("mitra",7)); + } + } + } + + if(player.ytl.x + 135){ + if(player.state==player.S_GROUND){ + state_counter=3; + } + player.x=tl.x + 135; + } + } + } + private var jumpedonce:Bool=false; + //hints and shit + private function fields_logic():Void { + bike.immovable=true; + FlxG.collide(bike, player); + if(fields_state==FS_cards){ + // Find next card thing to help with + idle_card(); + } else if(fields_state==FS_init){ + idle_fields_init(); + } else { + idle_fields(); + // Give hints about game, maybe + // Orj ust talk in general + } + } + + private function idle_fields_init():Void { + + EventScripts.face_and_play(this, player, "idle"); + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + if(DH.nc(player,active_region)){ + if(DH.get_scene_position(DH.name_mitra, DH.scene_mitra_fields_init)<2){ + if(DH.get_int_property(DH.name_mitra, "wares")!=-1){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init, "", 0); + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_init, 2); + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init, "", 1); + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_init, 2); + } + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init); + } + } + + } + + private function overworld_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + if(DH.a_chunk_just_finished()){ + state_counter++; + EventScripts.scale_vector(this, player, velocity, 80); + visible=true; + + } else { + if(Math.abs(player.y -y)<48){ + if(!Registry.EVENT_CHANGE_VOLUME_SCALE && !DH.a_chunk_is_playing()){ + Registry.sound_data.start_song_from_title("MITRA"); + Registry.volume_scale=1; + x -=20;// Keep mitra off screen + player.state=player.S_INTERACT; + player.play("idle_l"); + play("bike_r"); + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + } else { + + } + } + } + break; + case 1:// Move down + player.state=player.S_INTERACT; + if(player.x - x<24 &&(x>Registry.CURRENT_GRID_X * 160 + 40)){ + state_counter++; + velocity.x=0; + velocity.y=80; + play("bike_d"); + } + break; + case 2:// move right + if(y - player.y>24){ + state_counter++; + velocity.y=0; + velocity.x=80; + player.play("idle_d"); + play("bike_r"); + } + break; + case 3://Hit the wall, flash, shake, cahnge graphic + if(touching !=NONE){ + FlxG.shake(0.02, 0.3); + Registry.sound_data.sun_guy_death_s.play(); + loadGraphic(mitra_sprite, true, false, 16, 16); + width=height=10; + offset.x=3; + offset.y=3; + velocity.x=velocity.y=0; + play("idle_r"); + + //Bike stuff + bike.visible=true; + bike.x=x - 4;bike.y=y; + + // After flash, move left + FlxG.flash(0xffffffff, 1.0, function():Void { + state_counter++; + velocity.x=-20; + velocity.y=0; + play("walk_l"); + player.play("idle_r"); + }); + } + break; + case 4: + // walk up to player + if(x-4){ + velocity.x=20; + play("walk_r"); + } else if(dx>-20 && dx<-4){ + velocity.x=20; + play("walk_r"); + } + } else { + player.be_idle(); + // Touch the bike first + play("walk_r"); + touching=NONE; + velocity.x=20; + player.state=player.S_INTERACT; + + if(EventScripts.distance(this,bike)<8){ + state_counter++; + to_bike(); + bike.visible=false; + play("bike_d"); + velocity.y=50; + velocity.x=0; + } + } + } else { + if(false==DH.a_chunk_is_playing()&& EventScripts.distance(this, player)>48){ + player.be_idle(); + DH.set_scene_to_end(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + // otherwise wait for Interaction + } else { + idle(DH.scene_mitra_overworld_initial_overworld); + } + } + break; + case 8: + // When off map, change song back + if(y>160 *(Registry.CURRENT_GRID_Y + 1)+ 30){ + Registry.volume_scale -=0.02; + if(Registry.volume_scale<0.2){ + DH.enable_menu(); + DH.dont_need_recently_finished(); + player.state=player.S_GROUND; + player.ANIM_STATE=7; + Registry.sound_data.start_song_from_title("OVERWORLD"); + Registry.volume_scale=1; + exists=false; + } + } + break; + + } + } + + + private function idle(scene:String):Void + { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + EventScripts.face_and_play(player, this, "idle"); + DH.start_dialogue(DH.name_mitra, scene); + + if(scene==DH.scene_mitra_overworld_initial_overworld){ + // If we heard the "wares" line then set a flag which + // affects the init FIELDS scene for mitra + DH.increment_property(DH.name_mitra, "wares"); + } + } + } + + private function idle_card():Void { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + + EventScripts.face_and_play(player, this, "idle"); + + // Give quest hint first till they go to cliff? + if(!gave_quest_hint){ + gave_quest_hint=true; + if(Registry.GE_States[Registry.GE_QUEST_CLIFF]==false){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_quest_event); + Registry.GE_States[Registry.GE_QUEST_MITRA]=true; + return; + } + } + + + var i:Int=Std.int(36 * Math.random()); + + for(j in 0...36){ + if(!Registry.card_states[(i + j)% 36]){ + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_card_hints,(i + j)% 36); + break; + } + } + if(Registry.nr_growths==0){ + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_card_hints, 36); + } + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_card_hints); + } + } + + private var gave_quest_hint:Bool=false; + private function idle_fields():Void { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + EventScripts.face_and_play(player, this, "idle"); + + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + Registry.inventory[Registry.IDX_BIKE_SHOES]=false; + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.bound_item_2="JUMP"; + + //DH.dialogue_popup("Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump\". I've never understood that, though, because there's no \"" + Registry.controls[Keys.IDX_ACTION_2] + "\" anywhere on the shoes..."); + DH.dialogue_popup(DH.lk("mitra", 8)+ " " + Registry.controls[Keys.IDX_ACTION_2] + " " + DH.lk("mitra", 9)+ Registry.controls[Keys.IDX_ACTION_2] + DH.lk("mitra", 10)); + + } else if(!gave_initial_hint){ + + gave_initial_hint=true; + // Before widmill event. + if(0==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + // hint to go to beach(or forest) + if(!Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && !Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + if(Math.random()<0.5){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 1); + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 2); + } + } else if(Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && !Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 8); + + } else if(!Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 7); + // hint to go to windmill + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 3); + } + } else { + // If the bosses aren't all dead, hint to go past dungeon statues + if(!Registry.all_bosses_dead()){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 4); + // If don't have the transformer, hint to go to terminal + } else if(!Registry.inventory[Registry.IDX_TRANSFORMER]){ // No GO yet + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 5); + // Otheriwse a hint for hte puzzle? + } else { // got swap + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 6); + } + } + } else if(!gave_quest_hint){ + // Give quest hint first till they go to cliff? + if(Registry.GE_States[Registry.GE_QUEST_CLIFF]==false){ + if(true==DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_quest_event)){ + gave_quest_hint=true; + Registry.GE_States[Registry.GE_QUEST_MITRA]=true; + } + return; + } + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_general_banter); + } + } + } + + private function to_bike():Void + { + loadGraphic(mitra_on_bike_sprite, true, false, 20, 20); + width=height=10; + centerOffsets(true); + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="walk_l" || name=="bike_l" || name=="idle_l"){ + scale.x=-1; + + } else { + scale.x=1; + } + } + + override public function destroy():Void + { + parent.sortables.remove(bike, true); + bike.destroy(); + bike=null; + + if(sage !=null){ + parent.sortables.remove(sage, true); + sage.destroy(); + sage=null; + } + + if(bullet !=null){ + parent.sortables.remove(bullet, true); + bullet.destroy(); + bullet=null; + } + + active_region.destroy(); + active_region=null; + + sage_active_region.destroy(); + sage_active_region=null; + + DH.a_chunk_just_finished(); + DH.enable_menu(); + super.destroy(); + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/npc/Redsea_NPC.hx b/AIR/intra/hsrc/entity/interactive/npc/Redsea_NPC.hx new file mode 100644 index 0000000..599bf74 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/npc/Redsea_NPC.hx @@ -0,0 +1,110 @@ +package entity.interactive.npc +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import helper.S_NPC; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxObject; + +/** + * ... + * @author Melos Han-Tani + */ +class Redsea_NPC extends AnoSprite +{ + + private var type:Int; + + private static inline var T_HAIR:Int=0; + private static inline var T_BOMB:Int=1; + + public var active_region:FlxObject; + + //[Embed(source="../../../res/sprites/npcs/redsea_npcs.png")] public static inline var embed_redsea_npcs:Class; + + public function new(a:Array) + { + super(a); + + loadGraphic(embed_redsea_npcs, true, false, 16, 16); + switch(parseInt(xml.@frame)){ + // ... + case 0://hair + type=T_HAIR; + addAnimation("walk_d", [0, 1], 4); + addAnimation("walk_r", [2,3], 4); + addAnimation("walk_u", [4,5], 4); + addAnimation("walk_l", [6, 7], 4); + play("walk_d"); + break; + case 10:// bomb + xml.@p="2"; + if(xml.@alive=="false"){ + exists=false; + } + type=T_BOMB; + addAnimation("walk", [10, 11], 4); + play("walk"); + DH.set_scene_to_pos(DH.name_generic_npc, "bomb", 0); + break; + } + active_region=new FlxObject(0, 0, 20, 20); + Registry.subgroup_interactives.push(this); + } + + + private var S_exploding:Int=1; + private var s_exploded:Int=2; + private var t:Float=0; + private var tm:Float=1; + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + immovable=true; + FlxG.collide(this, player); + if(type==T_HAIR){ + EventScripts.face_and_play(this, player, "walk"); + if(DH.nc(player, active_region)){ + if(S_NPC.check_to_play_second(DH.name_generic_npc, DH.scene_generic_npc_any_first, "REDSEA")){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_second, "REDSEA"); + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_first, "REDSEA"); + } + } + } else if(type==T_BOMB){ + + if(state==s_exploded){ + visible=false; + x -=160; + y -=160; + } else if(state==S_exploding){ + if(DH.nc(player, active_region)){ + + EventScripts.make_explosion_and_sound(this); + if(player.overlaps(active_region)){ + player.touchDamage(1); + } + state=s_exploded; + DH.set_scene_to_pos(DH.name_generic_npc, "bomb", 0); + } + } else { + if(DH.scene_is_finished(DH.name_generic_npc, "bomb")){ + state=S_exploding; + xml.@alive="false"; + } + if(DH.nc(player, active_region)){ + if(DH.scene_is_finished(DH.name_generic_npc, "bomb")){ + // Explode + } else { + DH.start_dialogue(DH.name_generic_npc, "bomb"); + } + } + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/interactive/npc/Sage.hx b/AIR/intra/hsrc/entity/interactive/npc/Sage.hx new file mode 100644 index 0000000..8473a32 --- /dev/null +++ b/AIR/intra/hsrc/entity/interactive/npc/Sage.hx @@ -0,0 +1,770 @@ +package entity.interactive.npc +{ +import data.Common_Sprites; +import entity.gadget.KeyBlock; +import flash.geom.Point; +import flash.utils.Endian; +import global.Keys; +import global.Registry; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxRect; +import org.flixel.FlxSprite; +import entity.player.Player; +import states.EndingState; +import states.PlayState; +class Sage extends FlxSprite +{ + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + + // The logic function specific to a map/area. + private var logic:Function; + + private var dame_frame:Int; + + private var state_counter:Int=0; + + private var briar_ref:FlxSprite; + private var whitelayer:FlxSprite; + // Generic flags + private var b1:Bool=false; + private var b2:Bool=false; + public var active_region:FlxObject; + + private var tl:Point=new Point(); + + + //[Embed(source="../../../res/sprites/npcs/sage.png")] public static var sage_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + + player=_player; + parent=_parent; + xml=_xml; + dame_frame=parseInt(xml.@frame); + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(sage_sprite, true, false, 16, 16); + addAnimation("walk_d", [0, 1], 6, true); + addAnimation("walk_r", [2,3], 6, true); + addAnimation("walk_l", [2,3],6, true); + addAnimation("walk_u", [4,5], 6, true); + addAnimation("idle_d",[6]); + addAnimation("idle_r", [7]); + addAnimation("idle_l", [7]); + addAnimation("idle_u", [8]); + addAnimationCallback(on_anim_change); + + width=height=10; + offset.x=3; + offset.y=3; + x +=3; + y +=3; + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + 20; + + play("idle_d"); + + + // Pick the function that will be called(for map-specific events, etc) + switch(Registry.CURRENT_MAP_NAME){ + case "BLANK": + visible=false; + logic=blank_logic; + Registry.subgroup_interactives.push(this); + break; + case "BEDROOM": + // Do not show up after being talked to once and having left bedroom + if(Registry.GE_States[Registry.GE_Left_BDR_After_Boss_Dead]){ + exists=false; + } + logic=bedroom_logic; + Registry.subgroup_interactives.push(this); + break; + case "REDCAVE": + if(Registry.GE_States[Registry.GE_Left_RDC_After_Boss_Dead] && Registry.inventory[Registry.IDX_RED_KEY]){ + exists=false; + } + play("idle_u"); + logic=redcave_logic; + Registry.subgroup_interactives.push(this); + break; + case "OVERWORLD": + // Do not show up after sunboss dead + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + exists=false; + } + logic=overworld_logic; + break; + case "NEXUS": + if(Registry.GE_States[Registry.GE_Sage_Dead_Idx]){ + exists=false; + } + logic=nexus_logic; + Registry.subgroup_interactives.push(this); + break; + case "TERMINAL": + // If all cards, sage should appear on the bridge for the fight, otherwise at terminal etrance. + xml.@p="2"; + if(xml.@alive=="false" || Registry.GE_States[Registry.GE_Sage_Dead_Idx]==true){ + exists=false; + } else { + logic=terminal_logic; + Registry.subgroup_interactives.push(this); + } + break; + case "CROWD": + if(Registry.GE_States[Registry.GE_Left_CRD_After_Boss_Dead]){ + exists=false; + } + logic=crowd_logic; + Registry.subgroup_interactives.push(this); + break; + case "GO": + + if(Registry.playtime<15 * 60){ + Achievements.unlock(Achievements.A_ENDING_SUB_15_M); + } + player.grid_entrance_x=tl.x + 75; + player.grid_entrance_y=tl.y + 140; + briar_ref=new FlxSprite; + briar_ref.loadGraphic(Shadow_Briar.embed_briar, true, false, 16, 16); + briar_ref.addAnimation("walk_d", [0, 1], 4); + briar_ref.addAnimation("walk_r", [2, 3], 4); + briar_ref.addAnimation("walk_u", [4, 5], 4); + briar_ref.addAnimation("walk_l", [6, 7], 4); + briar_ref.play("walk_d"); + briar_ref.x=tl.x + 16 * 4; + briar_ref.y=tl.y + 60; + briar_ref.framePixels_y_push=8; + + whitelayer=new FlxSprite(tl.x, tl.y); + whitelayer.makeGraphic(160, 160, 0xffffffff); + whitelayer.alpha=0; + whitelayer.height=2; + parent.sortables.add(whitelayer); + + parent.sortables.add(briar_ref); + + visible=false; + exists=true; + logic=gof_logic; + + parent.darkness.loadGraphic(Common_Sprites.ending_blend, true, false, 160, 160); + Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET=1; + Registry.EVENT_CHANGE_DARKNESS_ALPHA=true; + break; + } + + + immovable=true; + // Where the player can talk to sage + active_region=new FlxObject(x, y, 20, 20); + + + } + + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + if(parent.state==parent.S_NORMAL){ + logic(); + super.update(); + } + } + + + +//The player controls Young again. Jumps Into water and swims up to the next screen. Sees Briar swimming up off the top of the screen. Young struggles up through the water, sinking, the sides of the canal are steep, so Young sinks all the way Into the water> +// + //Dude, Young. +// +//Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! + private function gof_logic():Void { + if(player.y>tl.y + 144){ + player.y=tl.y + 144; + } + DH.disable_menu(); + switch(state_counter){ + case 0: + if(player.ytl.x + 88){ + player.x=tl.x + 88; + } + briar_ref.framePixels_y_push=8; + briar_ref.velocity.y=-20; + briar_ref.play("walk_u"); + if(player.y14){ + player.state=player.S_INTERACT; + state_counter=1; + } + break; + case 1: + DH.start_dialogue(DH.name_briar, "final"); + player.framePixels_y_push=14; + state_counter=2; + break; + case 2: + + player.framePixels_y_push=14; + if(DH.a_chunk_is_playing()==false){ + player.state=player.S_INTERACT; + briar_ref.y=tl.y - 16; + briar_ref.play("walk_d"); + player.play("idle_u"); + briar_ref.framePixels_y_push=14; + briar_ref.velocity.y=25; + state_counter=3; + + } + break; + case 3: + player.framePixels_y_push=14; + EventScripts.move_to_x_and_stop(briar_ref, 10, player.x); + t_pushdown +=FlxG.elapsed; + if(t_pushdown>0.4 && briar_ref.framePixels_y_push<14){ + briar_ref.framePixels_y_push++; + t_pushdown=0; + } + if(EventScripts.distance(briar_ref, player)<7){ + briar_ref.play("idle_d"); + briar_ref.velocity.y=briar_ref.velocity.x=0; + state_counter=4; + } + break; + case 4: + t_pushdown +=FlxG.elapsed; + + player.framePixels_y_push=briar_ref.framePixels_y_push; + if(t_pushdown>0.3 && briar_ref.framePixels_y_push>0){ + t_pushdown=0; + briar_ref.framePixels_y_push--; + player.framePixels_y_push=briar_ref.framePixels_y_push; + } + // after rising from water play dialogue + if(briar_ref.framePixels_y_push==6){ + state_counter=5; + DH.start_dialogue(DH.name_briar, "final"); + + } + break; + + // +//Well, come on, let’s go get a sandwich or something. +// +//SAGE: + //You... you did adequately. Until we meet again. +//tl.y + 150){ + player.y=tl.y + 150; + } + if(player.x>tl.x + 92){ + player.x=tl.x + 92; + } + if(player.x1){ + state_counter=14; + t_pushdown=0; + Registry.GFX_WAVE_EFFECT_ON=true; + } + break; + case 14: + whitelayer.alpha +=0.002; + if(whitelayer.alpha>=1){ + play("walk_r"); + velocity.x=10; + var p:PlayState; + parent.black_overlay.alpha +=0.005; + if(parent.black_overlay.alpha>=1){ + t_pushdown +=FlxG.elapsed; + + Registry.volume_scale -=0.0015; + if(t_pushdown>3 && Registry.volume_scale<0.002){ + DH.enable_menu(); + Registry.GE_States[Registry.GE_Finished_Game]=true; + FlxG.switchState(new EndingState); + } + } + } + break; + default: + + if(FlxG.volume<0.002){ + //Registry.volume_scale=1; + Registry.sound_data.stop_current_song(); + FlxG.switchState(new EndingState); + } + break; + } + } + + private var t_pushdown:Float=0; + private var tm_pushdown:Float=1; + private var pushdown_val:Int=0; + + private function go_logic():Void { + switch(state_counter){ + case 0: + if(player.ytm_pushdown){ + t_pushdown=0; + if(pushdown_val<16)pushdown_val +=1; + } + briar_ref.framePixels_y_push=pushdown_val; + player.framePixels_y_push=pushdown_val; + + if(Registry.volume_scale>0)Registry.volume_scale -=0.01; + if(player.y<=tl.y + 2){ + player.velocity.y=0; + alpha -=0.005; + if(alpha<=0 && Registry.volume_scale<=0){ + + Registry.E_DESTROY_PLAYSTATE=true; + Registry.sound_data.stop_current_song(); + Registry.reset_events(); + Registry.reset_subgroups(); + state_counter +=1; + } + } else { + player.y -=0.4; + } + break; + case 4: + Registry.sound_data.big_door_locked.play(); + FlxG.flash(0xffffffff, 3, function():Void { FlxG.switchState(new EndingState);}); + // Load some image of the area. + parent.header_group.setAll("exists", false); + state_counter +=1; + break; + case 5: + + break; + } + } + + private var blank:Dynamic={ + played:false + }; + + private function blank_logic():Void { + if(!blank.played){ + blank.played=true; + if(dame_frame==0 && DH.get_scene_position(DH.name_sage,DH.scene_sage_blank_intro)==1){ + player.be_idle(); + DH.dialogue_popup(DH.lookup_string("sage", "BLANK","intro", 1)+ Registry.controls[Keys.IDX_ACTION_1] + DH.lookup_string("sage", "BLANK", "intro",2)); + DH.set_scene_to_pos(DH.name_sage, DH.scene_sage_blank_intro, 2); + } else if(dame_frame==1 && DH.get_scene_position(DH.name_sage, DH.scene_sage_blank_intro)==2){ + player.be_idle(); + DH.dialogue_popup(DH.lookup_string("sage", "BLANK", "intro",3)+ Registry.controls[Keys.IDX_PAUSE] + DH.lookup_string("sage", "BLANK","intro", 4)); + DH.set_scene_to_pos(DH.name_sage, DH.scene_sage_blank_intro, 3); + } + } + } + + private function crowd_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(46, 24, "walk_d", "idle_d", "idle_u", 20, 2, DH.scene_sage_crowd_one, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_crowd_one); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_crowd_one); + break; + } + } + + private function redcave_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(28, 16, "walk_u", "idle_u", "idle_d", 20, 2, DH.scene_sage_crowd_one, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_redcave_one); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_redcave_one); + + break; + } + } + + private function bedroom_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(48, 24, "walk_l", "idle_l", "idle_r", 20, 2, DH.scene_sage_bedroom_after_boss, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_bedroom_after_boss); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_bedroom_after_boss); + break; + + + } + } + private function nexus_logic():Void { + switch(state_counter){ + case 0:// Initial cutscene when entering from bLANK + wait_then_approach_player(64, 32, "walk_d", "idle_d", "idle_u", 20, 2, DH.scene_sage_nexus_enter_nexus, DH.name_sage, this); + + break; + case 1: + DH.disable_menu(); + play_chunk_then_proceed(DH.scene_sage_nexus_enter_nexus); + + break; + case 2:// Idle logic, messages change based on game state + DH.enable_menu(); + + + if(Registry.GE_States[Registry.GE_got_all_cards_inanarea] && DH.scene_is_dirty(DH.name_sage,DH.scene_sage_nexus_all_card_first)==false){ + idle(DH.scene_sage_nexus_all_card_first); + } else if(1==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + idle(DH.scene_sage_nexus_after_windmill); + } else if(0==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening] && Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + idle(DH.scene_sage_nexus_before_windmill); + } else if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + idle(DH.scene_sage_nexus_after_bed); + } else if(Registry.GE_States[Registry.GE_ent_str]){ + idle(DH.scene_sage_nexus_after_ent_str); + } else { + idle(DH.scene_sage_nexus_enter_nexus); + } + break; + } + + } + + private function overworld_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(56, 28, "walk_d", "idle_d", "idle_u", 20, 5, DH.scene_sage_overworld_bedroom_entrance, DH.name_sage, this); + break; + case 1: + player.invincible_timer=0.3; + player.invincible=true; + play_chunk_then_proceed(DH.scene_sage_overworld_bedroom_entrance); + break; + case 2: + player.dontMove=true; + player.state=player.S_GROUND; + if(!b1 && player.broom.is_active()){ + b1=true; + } else if(b1 && !player.broom.is_active()){ + b1=false; + player.dontMove=false; + player.state=player.S_INTERACT; + state_counter++; + Registry.subgroup_interactives.push(this); + } + + + break; + case 3: + play_chunk_then_proceed(DH.scene_sage_overworld_bedroom_entrance); + if(state_counter !=3){ + player.state=player.S_GROUND; + } + break; + case 4: + DH.enable_menu(); + idle(DH.scene_sage_overworld_bedroom_entrance); + break; + case 5: + Registry.subgroup_interactives.push(this); + state_counter=4; + + } + } + public var ctr:Int=0; + private function terminal_logic():Void { + + active_region.x=x - 2; + active_region.y=y - 2; + immovable=true; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(ctr==0){ + if(EventScripts.distance(player, this)<46){ + // play Intro text at least once + if(DH.scene_is_dirty(DH.name_sage, DH.scene_sage_terminal_entrance)==false){ + Registry.GAMESTATE.dialogue_latency=-1; + player.be_idle(); + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance); + } + ctr++; + } + } else if(ctr==1){ + // autoplay if you have 36 or more + if(DH.nc(player, active_region)||(EventScripts.distance(player, this)<46 && Registry.nr_growths>=36)){ + player.be_idle(); + if(Registry.nr_growths<18){ + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance, "", 1); + } else if(Registry.nr_growths<36){ + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance, "", 2); + } else { + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_etc,"",0); + ctr++; + } + } + } else if(ctr==2){ + if(DH.a_chunk_is_playing()==false){ + KeyBlock.sig_change=true; + ctr++; + } + } else if(ctr==3){ + if(player.ytm_wheel_snd){ + //t_wheel_snd=0; + //total_ticks --; + //Registry.sound_data.play_sound_group(Registry.sound_data.dialogue_blip_group); + //if(total_ticks<45){ + //tm_wheel_snd=0.05; + //wheel.play("spin3"); + //} else if(total_ticks<84){ + //tm_wheel_snd=0.09; + //wheel.play("spin2"); + //} else { + //wheel.play("spin1"); + //} + //} + //} + //if(total_ticks<0){ + //ctr--; + //FlxG.shake(0.01, 0.5); + //Registry.sound_data.hitground1.play(); + //wheel.play("idle"); + //player.state=player.S_INTERACT; + //} + //break; + //case -3: + //player.x=wheel_start_pt.x; + //player.y=wheel_start_pt.y; + //t_wheel_snd +=FlxG.elapsed; + //if(t_wheel_snd>1){ + //player.play("walk_r"); + //wheel.play("backspin"); + //FlxG.shake(0.01, 0.5); + //Registry.sound_data.hitground1.play(); + //ctr--; + //t_wheel_snd=0; + //total_ticks=50; + //} + //break; + //case -4: + //player.x=wheel_start_pt.x; + //player.y=wheel_start_pt.y; + //t_wheel_snd +=FlxG.elapsed; + //if(t_wheel_snd>tm_wheel_snd){ + //t_wheel_snd=0; + //Registry.sound_data.play_sound_group(Registry.sound_data.dialogue_blip_group); + //total_ticks--; + //if(total_ticks<0){ + //wheel.play("idle"); + //Registry.sound_data.player_hit_1.play(); + //ctr--; + //} + //} + //break; + //case -5: + //player.play("slumped"); + //if(EventScripts.send_property_to(player, "x", tl.x + 140,2)){ + //FlxG.shake(0.02, 0.76); + //Registry.sound_data.hitground1.play(); + //ctr=0; + //} + //break; + case 0: + ctr++; + DH.disable_menu(); + player.state=player.S_INTERACT; + player.be_idle(); + mitra.y=tl.y + 33; + mitra.visible=true; + break; + case 1: + Registry.volume_scale -=0.04; + if(Registry.volume_scale<=0){ + Registry.sound_data.stop_current_song(); + ctr++; + } + break; + case 2: + Registry.volume_scale +=0.01; + if(Registry.volume_scale>0.5){ + Registry.sound_data.start_song_from_title("MITRA"); + ctr++; + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_blue_one); + } + break; + // 4. Mitra Bikes in. + // 5. Mitra sas hi + case 3: + if(DH.a_chunk_is_playing()==true)break; + if(Registry.volume_scale<1)Registry.volume_scale +=0.01; + mitra.play("bike_l"); + mitra.velocity.x=-70; + player.be_idle(); + player.state=player.S_INTERACT; + x=mitra.x; + y=mitra.y; + cid=CLASS_ID.MITRA; + if(mitra.xtl.x + 160){ + mitra.exists=false; + Registry.volume_scale -=0.03; + if(Registry.volume_scale<0){ + Registry.volume_scale=0; + Registry.sound_data.stop_current_song(); + ctr=69; + } + } + break; + case 69: + t +=FlxG.elapsed; + if(t>1.5){ + t=0; + ctr=8; + y=tl.y; + x=tl.x + 48; + } + break; + // 12. Briar fades in + case 8: + alpha +=0.02; + if(alpha>0.5){ + ctr++; + play("walk_d"); + } + break; + // 13. Briar walks down, while GO fades in + case 9: + alpha +=0.02; + Registry.volume_scale +=0.02; + if(Registry.volume_scale>0.5){ + velocity.y=20; + Registry.sound_data.start_song_from_title("GO"); + Water_Anim.START_WATER_ANIMF(); + ctr++; + } + break; + case 10: + alpha +=0.02; + if(Registry.volume_scale<1){ + Registry.volume_scale +=0.02; + } else { + Registry.volume_scale=1; + } + + if(y>tl.y + 43){ + velocity.y=0; + velocity.x=-20; + Registry.GE_States[Registry.GE_Briar_Blue_Done]=true; + play("walk_l"); + ctr++; + } + break; + case 11: + if(x0){ + ctr++; + player.be_idle(); + player.state=player.S_INTERACT; + DH.disable_menu(); + play("walk_d"); + } + break; + case 1: + Registry.volume_scale -=0.01; + if(Registry.volume_scale<=0){ + ctr++; + Registry.sound_data.stop_current_song(); + Registry.GE_States[Registry.GE_Briar_Happy_Done]=true; + } + break; + case 2: + // walk downwards a bit, fading in. remove palyer control + alpha +=0.004; + Registry.volume_scale +=0.004; + if(alpha>0.4){ + velocity.y=20; + if(Registry.sound_data.current_song !=null && !Registry.sound_data.current_song.playing){ + Water_Anim.START_WATER_ANIMF(); + Registry.sound_data.start_song_from_title("GO"); + } + } + if(y>=tl.y + 44){ + velocity.y=0; + velocity.x=20; + play("walk_r"); + alpha=1; + ctr++; + } + break; + case 3: + // walk to the right, out of the screen + if(x>tl.x + 16 * 10){ + visible=false; + velocity.x=0; + ctr++; + } + break; + case 4: + player.state=player.S_GROUND; + DH.enable_menu(); + is_finished_happy=true; + Registry.GE_States[Registry.GE_Briar_Happy_Done]=true; + xml.@alive="false"; + exists=false; + break; + } + } + + private function update_beach():Void { + + switch(ctr){ + case 0: + play("walk_d"); + velocity.y=20; + alpha +=0.007; + if(alpha>=1){ + ctr++; + play("idle_d"); + } + break; + case 1: + velocity.y=0; + + if(player.overlaps(this)){ + ctr++; + velocity.y=15; + play("walk_d"); + xml.@alive="false"; + } + break; + case 2: + alpha -=0.01; + break; + + } + + } + + private function update_forest():Void { + switch(ctr){ + case 0: + play("walk_u"); + velocity.y=-20; + alpha +=0.005; + if(y16){ + EventScripts.scale_vector(midpoint, player.midpoint, velocity, 70); + } else { + velocity.x=velocity.y=0; + } + + if(touching &(UP | DOWN)){ + velocity.y=0; + } + + if(touching &(LEFT | RIGHT)){ + velocity.x=0; + } + + if(velocity.x==0 && velocity.y==0){ + // Do nothing + } else if(Math.abs(velocity.x)>Math.abs(velocity.y)){ + if(velocity.x>0){ + play("walk_r"); + } else { + play("walk_l"); + } + } else { + if(velocity.y>0){ + play("walk_d"); + } else { + play("walk_u"); + } + } + + // Determine events + gx=Registry.CURRENT_GRID_X; + gy=Registry.CURRENT_GRID_Y; + + if(gx==7 && gy==4){ // shop + if(DH.get_int_property(DH.name_shopkeeper,"talkedto")!=-1){ + if(t_talk>tm_talk)t_talk=0;// Want the timer to be local to this room + t_talk +=FlxG.elapsed; + if(false==DH.a_chunk_is_playing()&& t_talk>tm_talk && DH.get_int_property(DH.name_miao, "shop")==-1){ + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_shop); + player.be_idle(); + DH.increment_property(DH.name_miao, "shop"); + } + } + } else if(gx==5 && gy==4){ // Mitra + if(false==DH.a_chunk_is_playing()&& DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_fields_init)==true){ + if(t_talk>tm_talk)t_talk=0; + t_talk +=FlxG.elapsed; + if(t_talk>tm_talk && DH.get_int_property(DH.name_miao, "mitra")==-1){ + Registry.GAMESTATE.dialogue_latency=-1; + player.be_idle(); + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_mitra); + player.be_idle(); + DH.increment_property(DH.name_miao, "mitra"); + } + } + + } else if(gx==6 && gy==3){ // Nexus pad + if(t_talk>tm_talk)t_talk=0; + t_talk +=FlxG.elapsed; + if(t_talk>tm_talk && DH.get_int_property(DH.name_miao, "nexus")==-1){ + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_nexus); + player.be_idle(); + DH.increment_property(DH.name_miao, "nexus"); + } + + } else { + t_talk +=FlxG.elapsed; + if(t_talk>70 && DH.a_chunk_is_playing()==false){ + Registry.GAMESTATE.dialogue_latency=-1; + t_talk=0; + if(Registry.GE_States[Registry.GE_tradequestspookedmonster]==false){ + player.be_idle(); + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_icky_worry); + } else if(DH.get_int_property(DH.name_miao,"nexus")!=-1 && DH.get_int_property(DH.name_miao,"mitra")!=-1 && DH.get_int_property(DH.name_miao,"shop")!=-1){ + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", 5 + Std.int(3 * Math.random())); + trace("Saying random"); + } + } + } + + // Say something if you leave the map + if(// 3,3 7,5 + (Registry.CURRENT_GRID_Y<2 || Registry.CURRENT_GRID_Y>5 || Registry.CURRENT_GRID_X<3 || Registry.CURRENT_GRID_X>7) + ||(Registry.GAMESTATE.SWITCH_MAPS==true && hasnt_left==true)){ + hasnt_left=false; + player.be_idle(); + leavingleaving=true; + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_leave_map); + } + + if(leavingleaving && Registry.GAMESTATE.state !=Registry.GAMESTATE.S_TRANSITION){ + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_ref, true); + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_dust_ref, true); + state=s_cat_water; + cat_ref=null; + cat_dust_ref=null; + } + // go to water + //if distance>16 from center, move towardsplayer + + if(cat_dust_ref !=null){ + cat_dust_ref.x=x - 2; + cat_dust_ref.y=y; + cat_dust_ref.height=3; + + if(player.ON_CONVEYER)ON_CONVEYER=true; + if(ON_CONVEYER && cat_dust_ref.frame==Dust.EMPTY_FRAME){ + cat_dust_ref.play("unpoof"); + cat_dust_ref.visible=true; + } else if(!ON_CONVEYER && cat_dust_ref.frame==0){ + cat_dust_ref.play("poof"); + } + } + + break; + case s_cat_water: + break; + } + + ON_CONVEYER=false; + } + private var leavingleaving:Bool=false; + + private static inline var goldman_idx_run_away:Int=0; + private static inline var goldman_idx_give_card:Int=1; + private static inline var goldman_idx_box_open:Int=2; + private static inline var goldman_idx_icky_thx:Int=3; + private function u_monster_out():Void { + if(state==s_monst_out_present){ + if(visible){ + FlxG.collide(this, player); + } + + } + + if(monster_box.visible){ + FlxG.collide(player, monster_box); + } + + // Monster present, run away if you have the cat + if(state==s_monst_out_present){ + active_region.x=x - 2; + active_region.y=y - 2; + + if(DH.a_chunk_is_playing()==false && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(cat_ref==null){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_outside); + } else { + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"",goldman_idx_run_away); + Registry.GE_States[Registry.GE_tradequestspookedmonster]=true; + state=s_monst_out_spooked; + } + } + // Mosnster, animate it running Into cave + } else if(state==s_monst_out_spooked){ + if(ctr==0){ + player.state=player.S_INTERACT; + if(false==DH.a_chunk_is_playing()){ + velocity.y=-40; + play("walk_u"); + ctr=1; + } + } else if(ctr==1){ + if(ytl.x + 160){ + visible=false; + player.state=player.S_GROUND; + ctr=0; + state=s_monst_out_gone; + } + } + } + + // Monster gone. If we're here wait till we Interact with box + // then make it dispappear, small cat pops out, state, etc. + } else if(state==s_monst_out_gone){ + monster_box_ar.x=monster_box.x - 2; + monster_box_ar.y=monster_box.y + 2; + + if(ctr==0){ + if(DH.a_chunk_is_playing()==false && player.overlaps(monster_box_ar)&& Registry.keywatch.JP_ACTION_1){ + Registry.GAMESTATE.dialogue_latency=-1; + Registry.sound_data.broom_hit.play(); + player.actions_disabled=true; + player.be_idle(); + DH.disable_menu(); + ctr=1; + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_box_open); + monster_box.frame +=1; + Registry.inventory[Registry.IDX_BOX]=true; + } + } else if(ctr==1){ + player.actions_disabled=true; + if(DH.a_chunk_is_playing()==false){ + other_cat.visible=true; + monster_box.visible=false;// make box disappear + monster_box_ar.x -=1000; + player.state=player.S_INTERACT; + player.be_idle(); + other_cat.velocity.x=20; + other_cat.play("walk_r"); + ctr=2; + } + + } else if(ctr==2){ + if(other_cat.x>tl.x + 85){ + other_cat.velocity.x=0; + if(DH.a_chunk_is_playing()==false){ + ctr=3; + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"", goldman_idx_icky_thx); + other_cat.play("walk_d"); + } + } + } else if(ctr==3){ + player.actions_disabled=true; + player.state=player.S_INTERACT; + if(DH.a_chunk_is_playing()==false){ + player.state=player.S_GROUND; + DH.enable_menu(); + other_cat.play("walk_r"); + other_cat.velocity.x=40; + ctr=4; + } + } else if(ctr==4){ + if(other_cat.x>tl.x + 6 * 16){ + other_cat.velocity.x=0; + other_cat.play("walk_d"); + ctr++; + } + } else if(ctr==5){ + monster_box_ar.x=other_cat.x - 2; + monster_box_ar.y=other_cat.y - 2; + monster_box_ar.width=20; + monster_box_ar.height=20; + + other_cat.immovable=true; + FlxG.collide(player, other_cat); + if(player.overlaps(monster_box_ar)){ + player.actions_disabled=true; + } + if(DH.nc(player, monster_box_ar)){ + player.actions_disabled=true; + player.be_idle(); + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"",goldman_idx_icky_thx+1); + } + } + } + + } + + private function u_monster_in():Void { + FlxG.collide(this, player); + active_region.x=x - 2; + active_region.y=y - 2; + if(DH.a_chunk_is_playing()==false && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(Registry.GE_States[Registry.GE_tradequesthelpedmonster]){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_give_card); + } else { + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_inside); + } + } + + if(state==s_monst_in_unhelped){ + var exists_ct:Int=0; + for(var dust:Dust in dusts.members){ + + if(!dust.fell_in_hole){ + exists_ct ++; + } + } + + for(dust in Registry.subgroup_dust){ + if(dust !=null && !dust.fell_in_hole){ + exists_ct +=1; + } + } + if(exists_ct==0){ + state=s_monst_in_giving; + } + } else if(state==s_monst_in_helped){ + x=tl.x + 16 * 7; + } else if(state==s_monst_in_giving){ + if(ctr==0){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_give_card); + ctr=1; + } else if(ctr==1){ + // give gift + Registry.GE_States[Registry.GE_tradequesthelpedmonster]=true; + ctr=2; + } else if(ctr==2){ + velocity.x=20; + play("walk_r"); + if(x>tl.x + 16 * 7){ + velocity.x=0; + play("walk_d"); + state=s_monst_in_helped; + } + } + } + } + + private var shop_start_anim:Bool=false; + private var shop_array:Array=new Array(false, false, false, false); + private var shop_card_start:Bool=false; + private var shop_ctr:Int=0; + + private function u_shop():Void { + FlxG.collide(this, player); + active_region.x=x - 2; + active_region.y=y - 2; + + //if(FlxG.keys.justPressed("B")){ + //Registry.inventory[Registry.IDX_BOX]=true; + //} else if(FlxG.keys.justPressed("W")){ + //Registry.inventory[Registry.IDX_JUMP]=true; + //Registry.card_states[Registry.CARD_GOLDMAN_IDX]=1; + //} else if(FlxG.keys.justPressed("Q")){ + //Registry.inventory[Registry.IDX_JUMP]=true; + //Registry.card_states[Registry.CARD_GOLDMAN_IDX]=0; + //} else if(FlxG.keys.justPressed("R")){ + //state=s_shop_unhelped; + //} + + if(shop_card_start){ + if(shop_ctr==0){ + if(parent.state !=parent.S_DIALOGUE){ + card.visible=true; + card.x=player.x - 8; + card.y=player.y - 8; + Registry.sound_data.get_treasure.play(); + shop_ctr ++; + } + } else if(shop_ctr==1){ + card.flicker(2); + shop_ctr++; + } else if(shop_ctr==2){ + if(card.flickering==false){ + card.exists=false; + } + } + } + + + if(Registry.PLAYSTATE.state !=Registry.PLAYSTATE.S_DIALOGUE && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(DH.get_int_property(DH.name_shopkeeper, "talkedto")==-1){ + DH.increment_property(DH.name_shopkeeper, "talkedto"); + //DH.dialogue_popup("Finty:Welcome, welcome, my friend Young! The name’s Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye!"); + DH.dialogue_popup(DH.lk("tradenpc", 0)); + }else if(state==s_shop_helped){ + //DH.dialogue_popup("Finty:I still appreciate that box!"); + DH.dialogue_popup(DH.lk("tradenpc", 1)); + } else { + if(Registry.inventory[Registry.IDX_BOX]){ + Registry.inventory[Registry.IDX_BOX]=false; + state=s_shop_helped; + Registry.GE_States[Registry.GE_tradequesthelpedshopkeeper]=true; + if(Registry.inventory[Registry.IDX_JUMP] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]){ + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead!");//Goldman card + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc",11)+" "+DH.lk("tradenpc",3)); + player.health_bar.modify_health(20); + } else if(Registry.inventory[Registry.IDX_JUMP] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]==0){ + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!"); + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc", 11)); + Registry.card_states[Registry.CARD_GOLDMAN_IDX]=1; + Registry.nr_growths++; + shop_card_start=true; + } else { + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take these stylish biking shoes!"); + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc",4)); + Registry.inventory[Registry.IDX_BIKE_SHOES]=true; + shop_start_anim=true; + } + // Give the player the BIKE SHOEZ or a NICE GIFT + } else { + //DH.dialogue_popup("Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around."); + DH.dialogue_popup(DH.lk("tradenpc", 5)); + } + } + } + + + if(shop_start_anim){ + + if(items.members[2].frame !=57){ + items.members[2].acceleration.y=-10; + + if(items.members[2].velocity.y<-10 && items.members[2].velocity.y>-15){ + items.members[2].flicker(1); + } + + if(items.members[2].velocity.y<-25){ + if(items.members[2].flickering==false){ + items.members[2].alpha=0; + items.members[2].velocity.y=items.members[2].acceleration.y=0; + items.members[2].y=items.members[1].y; + items.members[2].frame=57; + } + } + } else if(items.members[2].frame==57){ + items.members[2].alpha +=0.01; + if(items.members[2].alpha>=1){ + shop_start_anim=false; + } + } + } + for(var item:FlxSprite in items.members){ + item.immovable=true; + FlxG.collide(player, item); + if(player.xitem.x - 2&& player.yitem.y - 2){ + if(DH.a_chunk_is_playing()==false && Registry.keywatch.JP_ACTION_1){ + player.actions_disabled=true; + player.be_idle(); + if(shop_array[item.frame - 54]){ + DH.dialogue_popup("Too bad, looks like you can't afford this item! Come back later, when you have the cash!"); + + DH.dialogue_popup(DH.lk("tradenpc", 6)); + break; + } + switch(item.frame){ + case 54: + //DH.dialogue_popup("Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 7)); + shop_array[0]=true; + break; + case 55: + //DH.dialogue_popup("Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 8)); + shop_array[1]=true; + break; + case 56: + //DH.dialogue_popup("Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 9)); + shop_array[2]=true; + break; + case 57: + //DH.dialogue_popup("Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 10)); + shop_array[3]=true; + break; + } + } + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/Broom.hx b/AIR/intra/hsrc/entity/player/Broom.hx new file mode 100644 index 0000000..17080a5 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/Broom.hx @@ -0,0 +1,337 @@ +package entity.player +{ +import entity.gadget.Dust; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import global.Registry; +class Broom extends FlxSprite +{ + + + /* + * @param root:Who this broom is attached to. + **/ + + public var root:Player; + + public var horizontal_broom:FlxSprite; + public var vertical_broom:FlxSprite; + public var has_dust:Bool=false; + public var dust:Dust; + public var just_released_dust:Bool=false; + + public var is_wide:Bool=false; + public var is_long:Bool=false; + + public var long_attack_v:FlxSprite=new FlxSprite(); + public var wide_attack_v:FlxSprite=new FlxSprite(); + public var long_attack_h:FlxSprite=new FlxSprite(); + public var wide_attack_h:FlxSprite=new FlxSprite(); + + private var WATK_W:Int=24; + private var WATK_H:Int=12; + private var LATK_W:Int=12; + private var LATK_H:Int=22; + + public var visible_timer:Float=0; + + private var is_behind_player:Bool=false; + + private var just_played_extra_anim:Bool=false; + + + public var locked:Bool;//When the player is holding attack, broom should not switch directions. + //[Embed(source="../../res/sprites/inventory/broom.png")] public static var Broom_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/knife.png")] public static var Knife_Sprite:Class; + //[Embed(source="../../res/sprites/broom_cell.png")] public static var Cell_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/broom-icon.png")] public static var Icon_Broom_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/wide_attack_h.png")] public static var Wide_Attack_h:Class; + //[Embed(source="../../res/sprites/inventory/long_attack_h.png")] public static var Long_Attack_h:Class; + //[Embed(source="../../res/sprites/inventory/wide_attack_v.png")] public static var Wide_Attack_v:Class; + //[Embed(source="../../res/sprites/inventory/long_attack_v.png")] public static var Long_Attack_v:Class; + public function new(_root:Player, _x:Int, _y:Int){ + root=_root; + x=root.x- 10; + y=root.y; + loadGraphic(Broom_Sprite, true, true, 16, 16); + + addAnimation("stab", [1, 2,2,1,0,0], 20, false); + addAnimation("stab2", [4, 5,5,4,3,9], 20, false); + addAnimation("stab3", [7 , 8, 8, 7, 6, 9], 20, false); + + wide_attack_h.loadGraphic(Wide_Attack_h, true, false, WATK_W,WATK_H); + wide_attack_v.loadGraphic(Wide_Attack_v, true, false, WATK_H,WATK_W); + long_attack_h.loadGraphic(Long_Attack_h, true, false, LATK_H,LATK_W); + long_attack_v.loadGraphic(Long_Attack_v, true, false, LATK_W, LATK_H); + + // Add lots of blank frames to the end of the animation. It is a hack to + // avoid complexity in the code. + + //ASSUMES THAT LONG ATTACK FACES LEFT/UP BY DEFAULT + //ASSUMES THAT WIDE ATTACK FACES LEFT/UP BY DEFAULT + wide_attack_h.addAnimation("a", [0,1,2,3,4], 14, false); + wide_attack_v.addAnimation("a", [0,1,2,3,4], 14, false); + long_attack_h.addAnimation("a", [0,1,2,3,4], 14, false); + long_attack_v.addAnimation("a", [0,1,2,3,4], 14, false); + } + + public function is_active():Bool { + if(frame==0){ + return false; + } + return true; + } + + override public function draw():Void + { + super.draw(); + } + override public function update():Void { + + if(!has_dust && dust !=null){ + dust=null; + } + if(finished){ + visible=false; + } + /* Hack to get around bug where broom gets "stuck" visible, + * I can't reprodue.... */ + if(visible){ + visible_timer +=FlxG.elapsed; + // needs to be long enough to ensure the broom makes a full anim + if(visible_timer>0.4){ + long_attack_h.visible=long_attack_v.visible=visible=false; + wide_attack_h.visible=wide_attack_v.visible=false; + } + } else { + visible_timer=0; + } + + + if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + is_wide=true; + is_long=false; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + is_wide=false; + is_long=true; + } else { + is_wide=is_long=false; + } + if(Registry.CURRENT_MAP_NAME=="TRAIN" || Registry.CURRENT_MAP_NAME=="SUBURB"){ + is_wide=is_long=false; + } + + wide_attack_h.visible=false; + long_attack_h.visible=false; + wide_attack_v.visible=false; + long_attack_v.visible=false; + offset.y=offset.x=0; + offset.y=-root.framePixels_y_push; + width=height=16; + + + if(!finished){ + wide_attack_v.scale.x=1; + wide_attack_h.scale.y=1; + long_attack_h.scale.x=1; + long_attack_v.scale.y=1; + + + + if(root.facing==LEFT){ + angle=0; + x=root.x - 14;y=root.y; + + if(is_wide && visible){ + y -=6; + offset.y=-6; + if(!just_played_extra_anim){ + wide_attack_v.play("a", true); + } + wide_attack_v.visible=true; + wide_attack_v.x=x; + wide_attack_v.y=y; + this.width=WATK_H; + this.height=WATK_W; + + + } else if(is_long && visible){ + x -=11; + offset.x=-11; + if(!just_played_extra_anim)long_attack_h.play("a",true); + long_attack_h.visible=true; + long_attack_h.x=x; + long_attack_h.y=y; + this.width=LATK_H; + this.height=LATK_W; + } + + switch(frame){ + case 0:x +=10;break; + case 1:x +=6;break; + case 2:x -=1;break; + } + } else if(root.facing==RIGHT){ + angle=180; + x=root.x + root.width;y=root.y - 2; + if(is_wide && visible){ + x +=4; + y -=6; + offset.x=4; + offset.y=-6; + wide_attack_v.scale.x=-1; + if(!just_played_extra_anim)wide_attack_v.play("a",true); + wide_attack_v.x=x; + wide_attack_v.y=y + 2; + wide_attack_v.visible=true; + this.width=WATK_H; + this.height=WATK_W; + } else if(is_long && visible){ + x +=6; + offset.x=6; + long_attack_h.scale.x=-1; + if(!just_played_extra_anim)long_attack_h.play("a",true); + long_attack_h.visible=true; + long_attack_h.x=x; + long_attack_h.y=y + 2; + this.width=LATK_H; + this.height=LATK_W; + + } + + switch(frame){ + case 0:x -=12;break; + case 1:x -=8;break; + case 2:x -=1;break; + } + } else if(root.facing==UP){ + angle=90; + x=root.x - 2;y=root.y - 16; + x=Std.int(x); + y=Std.int(y); + if(is_wide && visible){ + x -=2; + offset.x=-2; + if(!just_played_extra_anim)wide_attack_h.play("a",true); + wide_attack_h.x=x - 1; + wide_attack_h.y=y; + wide_attack_h.visible=true; + this.width=WATK_W; + this.height=WATK_H; + + } else if(is_long && visible){ + y -=9; + offset.y=-9; + x +=3; + offset.x=3; + if(!just_played_extra_anim)long_attack_v.play("a",true); + long_attack_v.x=x; + long_attack_v.y=y; + long_attack_v.visible=true; + width=LATK_W; + height=LATK_H; + } + switch(frame){ + case 0:y +=12;break; + case 1:y +=6;break; + case 2:y +=2;break; + } + } else if(root.facing==DOWN){ + angle=270; + x=root.x - 6;y=root.y + root.height; + if(is_wide && visible){ + x -=2; + y +=4; + offset.y=4; + offset.x=-2; + wide_attack_h.scale.y=-1; + if(!just_played_extra_anim)wide_attack_h.play("a",true); + wide_attack_h.x=x -2; + wide_attack_h.y=y; + wide_attack_h.visible=true; + this.width=WATK_W; + this.height=WATK_H; + } else if(is_long && visible){ + long_attack_v.scale.y=-1; + if(!just_played_extra_anim)long_attack_v.play("a",true); + long_attack_v.x=x; + long_attack_v.y=y; + long_attack_v.visible=true; + width=LATK_W; + height=LATK_H; + } + switch(frame){ + case 0:y -=8;break; + case 1:y -=5;break; + case 2:y -=2;break; + } + } + + + if(!just_played_extra_anim && visible &&(is_long || is_wide)){ + just_played_extra_anim=true; + } + } else { + just_played_extra_anim=false; + } + + switch(root.facing){ + case LEFT:case UP: + if(! is_behind_player){ + flip_player_broom_draw_order(ANY); + } + break; + default: + if(is_behind_player){ + flip_player_broom_draw_order(NONE); + } + break; + } + + + super.update(); + } + + /** + * Moves the broom upgrades to right above the broom ased on bidx + * @param bidx + */ + private function move_upgrades():Void { + var pgm:Array=Registry.GAMESTATE.player_group.members; + var idx:Int=pgm.indexOf(wide_attack_h); + pgm.splice(idx, 4);// Delete thingy + var bidx:Int=pgm.indexOf(this); + pgm.splice(bidx + 1, 0, wide_attack_h, wide_attack_v, long_attack_h, long_attack_v); + } + private function flip_player_broom_draw_order(dir:Int):Void { + // player Broom + // foot<-> player + // Broom foot + is_behind_player=!is_behind_player; + var player_group_members:Array=Registry.GAMESTATE.player_group.members; + var player_idx:Int=player_group_members.indexOf(root); + var broom_idx:Int=player_group_members.indexOf(this); + var foot_overlay_idx:Int=player_group_members.indexOf(root.foot_overlay); + if(dir==ANY){ // left, up + player_group_members[player_idx]=this; + player_group_members[broom_idx]=root.foot_overlay; + player_group_members[foot_overlay_idx]=root; + move_upgrades(); + } else { // right, down + player_group_members[broom_idx]=root; + player_group_members[player_idx]=root.foot_overlay; + player_group_members[foot_overlay_idx]=this; + move_upgrades(); + } + + // flip reflections too! + if(root.reflection.exists){ + var reflect_broom_idx:Int=Registry.GAMESTATE.members.indexOf(root.reflection_broom); + var reflect_idx:Int=Registry.GAMESTATE.members.indexOf(root.reflection); + + Registry.GAMESTATE.members[reflect_broom_idx]=root.reflection; + Registry.GAMESTATE.members[reflect_idx]=root.reflection_broom; + } + + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/Foot_Overlay.hx b/AIR/intra/hsrc/entity/player/Foot_Overlay.hx new file mode 100644 index 0000000..08047b6 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/Foot_Overlay.hx @@ -0,0 +1,266 @@ +package entity.player +{ +import global.Registry; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import states.PlayState; + +/** + * sanity class for the foot overlay + * @author Seagaia + */ +class Foot_Overlay extends FlxSprite +{ + //[Embed(source="../../res/sprites/decoration/player_overlay_foot_test.png")] public static var foot_test:Class; + //[Embed(source="../../res/sprites/decoration/overlay_APARTMENT_water.png")] public static var APARTMENT_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_REDCAVE_water.png")] public static var REDCAVE_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_REDSEA.png")] public static var REDSEA_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_WINDMILL_water.png")] public static var WINDMILL_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_FIELDS_grass.png")] public static var FIELDS_grass:Class; + //[Embed(source="../../res/sprites/decoration/overlay_water.png")] public static var general_water:Class; + + private var debug_tiles:Array=new Array(2, -1); + private var fields_tiles:Array=new Array(200,201,250,270,271,272,273, -1); + private var apartment_tiles:Array=new Array(206, 231, -1); + private var redcave_tiles:Array=new Array(16, 17, 18, 19, 28, -1); + private var redsea_tiles:Array=new Array(61, 71, -1); + private var circus_tiles:Array=new Array(110, 111, 112, 113, 114, -1); + private var windmill_tiles:Array=new Array(130, -1); + private var working_maps:Array=new Array("DEBUG", "FOREST", "TERMINAL", "GO", "FIELDS", "APARTMENT", "REDCAVE", "CIRCUS", "HOTEL", "WINDMILL","BEACH", "REDSEA"); + + + private var player:Player + private var cur_player_state:Int; + private var cur_player_anim_state:Int; + private var cur_tile:Int=-1; + + public var map:FlxTilemap; + private var map_name:String; + + + private var X_OFF:Int=-4; + private var Y_OFF:Int=0; + private var W:Int=24; + private var H:Int=24; + private var player_midpoint:FlxPoint=new FlxPoint(); + + + public function new(_player:Player) + { + super(); + + player=_player; + player_midpoint=player.getMidpoint(player_midpoint); + + if(working_maps.indexOf(Registry.CURRENT_MAP_NAME)==-1){ + exists=false; + } + + loadGraphic(foot_test, true, false, W, H); + addAnimation("foot_test", [0, 1], 12); + + //200 - yello, 201 - green + addAnimation("FIELDS_yellow_stop", [3],20); + addAnimation("FIELDS_yellow_go", [2, 3], 8); + addAnimation("FIELDS_green_stop", [5],20); + addAnimation("FIELDS_green_go", [4, 5], 8); + + addAnimation("REDCAVE_water", [0],1); + + addAnimation("APARTMENT_water", [0], 5); + + addAnimation("WINDMILL_water", [0, 1], 5); + + addAnimation("general_water", [0], 5); + + visible=false; + map_name=Registry.CURRENT_MAP_NAME; + } + + // When we change a map we need to reset some data + // so that things don't break. + public function reset_anodyne():Void { + map_name=Registry.CURRENT_MAP_NAME; + if(working_maps.indexOf(Registry.CURRENT_MAP_NAME)==-1){ + exists=false; + } else { + exists=true; + } + } + override public function update():Void + { + + player_midpoint=player.getMidpoint(player_midpoint); + + var tile_type:Int=map.getTile(player_midpoint.x/16,(player_midpoint.y - Registry.HEADER_HEIGHT)/16); + if(tile_type !=cur_tile){ + cur_tile=tile_type; + change_anim(); + } + + // Player state takes precedence over tile type + if(player.state !=cur_player_state){ + cur_player_state=player.state; + change_anim(); + } + + if(player.ANIM_STATE !=cur_player_anim_state){ + cur_player_anim_state=player.ANIM_STATE; + change_anim(); + } + + if(player.facing==LEFT){ + x=player.x - player.offset.x + X_OFF + 1; + } else if(player.facing==RIGHT){ + x=player.x - player.offset.x + X_OFF - 1; + + } else { + x=player.x - player.offset.x + X_OFF;//SUBTrACTION DOESNTO COMMUTe + y=player.y - player.offset.y + Y_OFF; + } + + super.update(); + } + + private function change_anim():Void { + flicker(0);// Stop infinite flickering + visible=false; + + Y_OFF=0; + + if(map_name=="DEBUG"){ + if(cur_player_state==player.S_GROUND){ + if(debug_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==2){ + visible=true; + loadGraphic(foot_test, true, false, W, H); + play("foot_test"); + } + } + } + } else if(map_name=="FIELDS"){ + if(cur_player_state==player.S_GROUND){ + if(fields_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==201){ + Y_OFF=-1; + loadGraphic(FIELDS_grass, true, false, W, H); + if(player.velocity.x==0 && player.velocity.y==0){ + visible=true; + play("FIELDS_green_stop"); + } else { + visible=true; + play("FIELDS_green_go"); + } + } else if(cur_tile==200){ + loadGraphic(FIELDS_grass, true, false, W, H); + if(player.velocity.x==0 && player.velocity.y==0){ + //visible=true; + play("FIELDS_yellow_stop"); + } else { + //visible=true; + play("FIELDS_yellow_go"); + } + } else { // It's a water tile + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + + } + } + } + } else if(map_name=="APARTMENT"){ + if(cur_player_state==player.S_GROUND){ + if(apartment_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==231 || cur_tile==206){ + visible=true; + loadGraphic(APARTMENT_water, true, false, W, H); + play("APARTMENT_water"); + flicker(-1); + } + } + } + } else if(map_name=="REDCAVE"){ + if(cur_player_state==player.S_GROUND){ + if(redcave_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==16 || cur_tile==17 || cur_tile==18 || cur_tile==19 || cur_tile==28){ + visible=true; + loadGraphic(REDCAVE_water, true, false, W, H); + play("REDCAVE_water"); + flicker(-1); + } + } + } + } else if(map_name=="REDSEA"){ + if(cur_player_state==player.S_GROUND){ + if(redsea_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==61 || cur_tile==71){ + visible=true; + loadGraphic(REDSEA_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } + } else if(map_name=="WINDMILL"){ + if(cur_player_state==player.S_GROUND){ + if(windmill_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==130){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + //flicker(-1); + } + } + } + } else if(map_name=="CIRCUS"){ + if(cur_player_state==player.S_GROUND){ + if(circus_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==110 || cur_tile==111 || cur_tile==112 || cur_tile==113 || cur_tile==114){ + visible=true; + loadGraphic(general_water, true, false, W, H); + play("general_water"); + flicker(-1); + } + } + } + } else if(map_name=="BEACH"){ + if(cur_player_state==player.S_GROUND){ + if((cur_tile>=140 && cur_tile<=146)|| cur_tile>=250){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } else if(map_name=="FOREST"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile==110 ||(cur_tile>=134 && cur_tile<=137)){ + visible=true; + loadGraphic(general_water, true, false, W, H); + play("general_water"); + flicker(-1); + } + } + } else if(map_name=="TERMINAL"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile==150 || cur_tile==151){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } else if(map_name=="GO"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile>=50 && cur_tile<=53){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/HealthBar.hx b/AIR/intra/hsrc/entity/player/HealthBar.hx new file mode 100644 index 0000000..5cbfae9 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/HealthBar.hx @@ -0,0 +1,122 @@ +package entity.player +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxGroup; +class HealthBar extends FlxGroup +{ + /** + * + * @param _x x coordinate of the top-right health box. + * @param _y y coordinate of the top-right health box. + * @param health Max number of health boxes to show. + */ + + public var cur_health:Int; + public var max_health:Int; + public var health_boxes:Array; + + public var BOX_WIDTH:Int=11; + public var BOX_HEIGHT:Int=6; + public var BOX_SPACING:Int=-3; + + public var COLOR_FULL:Int=0x7d1818; + public var COLOR_EMPTY:Int=0x494949; + + public var FULL_FRAME:Int=0; + public var EMPTY_FRAME:Int=1; + + public var NO_SCROLL:FlxPoint=new FlxPoint(0, 0); + public var x:Int; + //[Embed(source="../../res/sprites/inventory/health_piece.png")] public static var health_piece_sprite:Class; + + public function new(_x:Int,_y:Int,_max_health:Int) + { + super(16); + x=_x; + y=_y; + for(i in 0..._max_health){ + make_box(i+1); + + } + max_health=_max_health; + cur_health=max_health; + // Thse values are deserialized when continuing a save + Registry.MAX_HEALTH=max_health;// Want to do this because in the testing mode + Registry.CUR_HEALTH=cur_health;// Sometimes we do construct a health bar more than once. + } + + public function make_box(i:Int):Void { + i--; + var health_box:FlxSprite=new FlxSprite; + + health_box.x=(x - BOX_WIDTH - 8 *(7 - i % 8))- 7 * Std.int(i / 8); + health_box.y=y + Std.int(i / 8)*(BOX_HEIGHT + 1); + + health_box.loadGraphic(health_piece_sprite, true, false, BOX_WIDTH, BOX_HEIGHT); + health_box.alpha=1; + health_box.scrollFactor=NO_SCROLL; + health_box.addAnimation("flash", [0, 2], 7, true); + health_box.addAnimation("full", [0], 0,false); + + add(health_box); + } + /** + * + * @param change_amount How much the health changes + * @return -1 if the change resulted in 0 health, 1 if full, 0 otherwise + */ + public function modify_health(change_amount:Int):Int { + var nrChanges:Int=0; + var health_box:FlxSprite; + if(change_amount<0){ + if(-change_amount>cur_health)change_amount=-cur_health; + cur_health=Math.max(0, cur_health + change_amount); + while(nrChanges<-change_amount){ + health_box=getLastAlive()as FlxSprite; + + if(health_box==null)return -1; + health_box.alive=false; + health_box.frame=EMPTY_FRAME; + nrChanges++; + } + } else if(change_amount>0){ + cur_health=Math.min(max_health, cur_health + change_amount); + while(nrChanges1){ + members[0].play("full"); + } + + return 0; + } + + public static function upgrade_health(player:Player):Void { + player.health_bar.make_box(player.health_bar.max_health + 1);// Extend bar + player.health_bar.max_health ++;// Reflect changes in health bar state + player.health_bar.modify_health(player.health_bar.max_health);// Heal player + Registry.MAX_HEALTH++;// Reflect changes in global state + } + override public function update():Void { + super.update(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/HealthPickup.hx b/AIR/intra/hsrc/entity/player/HealthPickup.hx new file mode 100644 index 0000000..99fd842 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/HealthPickup.hx @@ -0,0 +1,97 @@ +package entity.player +{ +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import states.PlayState; + +/** + * +1, +3 health things, and the extenderzzz + * @author Seagaia + */ +class HealthPickup extends FlxSprite +{ + + public static var HP_1:Int=1; + public static var HP_3:Int=3; + public static var HP_EXTEND:Int=0; + public var pickup_type:Int; + public var xml:XML; + public var parent:Dynamic; + public var LATENCY:Float=0.5;// Timeout for broom touching + //[Embed(source="../../res/sprites/inventory/small_health_pickup.png")] public static inline var S_SMALL_HEALTH:Class; + //[Embed(source="../../res/sprites/inventory/big_health_pickup.png")] public static inline var embed_Big_health:Class; + + public function new(x:Int,y:Int,_pickup_type:Int,_parent:Dynamic,_xml:XML=null):Void + { + super(x, y); + solid=false; + pickup_type=_pickup_type; + has_tile_callbacks=false; + parent=_parent; + switch(pickup_type){ + case HP_1: + loadGraphic(S_SMALL_HEALTH, true, false, 10, 16); + addAnimation("float", [0, 1, 2, 3], 5, true); + play("float"); + break; + case HP_3: + loadGraphic(embed_Big_health, true, false, 16, 16); + addAnimation("float", [0, 1, 2, 3], 5, true); + play("float"); + break; + //makeGraphic(12, 12, 0xffff0000);break; + case HP_EXTEND: + makeGraphic(16, 16, 0xffff2200);break; + } + + xml=_xml; + if(xml==null){ // Usually when a health-pickup is dropped by an enemy + xml=; + } else { + if(xml.@alive=="false"){ + exists=false; + } + } + } + + override public function update():Void + { + if(LATENCY>0){ + LATENCY -=FlxG.elapsed; + } else { + if(parent.player.overlaps(this)|| + (parent.player.broom.visible && parent.player.broom.overlaps(this))){ + picked_up(parent.player); + } + } + super.update(); + } + /** + * Given a reference to the player, heal it or trigger the events + * to increase health bar + * @param player + */ + public function picked_up(player:Player):Void { + switch(pickup_type){ + case HP_1: + Registry.sound_data.get_small_health.play(); + player.health_bar.modify_health(1);break; + case HP_3: + Registry.sound_data.get_small_health.play(); + player.health_bar.modify_health(3);break; + case HP_EXTEND: + xml.@alive="false"; + Registry.EVENT_EXTEND_HEALTH=true; + break; + } + visible=solid=false; + exists=false; + } + + override public function destroy():Void { + //shouldget cleaned up in delete_otherobjecs + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/Miniminimap.hx b/AIR/intra/hsrc/entity/player/Miniminimap.hx new file mode 100644 index 0000000..3e108f5 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/Miniminimap.hx @@ -0,0 +1,139 @@ +package entity.player +{ +import data.CSV_Data; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import states.MinimapState; + +class Miniminimap extends FlxSprite +{ + + //[Embed(source="../../res/tilemaps/mini_minimap_tiles.png")] public static inline var embed_miniminimap_tiles:Class; + + // Used for calculating room bounds + private var width_in_rooms:Int; + private var height_in_rooms:Int; + private var buffer:FlxSprite; + private var minimap:FlxTilemap; + + private static inline var RED_IDX:Int=9; + private var bm:FlxSprite; + private var t:FlxTilemap; + + public function new() + { + makeGraphic(25, 20, 0x00000000); + //visible=false; + scrollFactor.x=scrollFactor.y=0; + x=55; + y=0; + bm=new FlxSprite(0, 0, embed_miniminimap_tiles); + t=new FlxTilemap(); + } + + /** + * + * @param x_next + * @param y_next + */ + public function switch_rooms(x_next:Int, y_next:Int):Void { + if(visible==false)return; + // Find next room, get type, update map buffer + dirty=true; + + // Max coords of minimap + var mx:Int=minimap.widthInTiles - 1; + var my:Int=minimap.heightInTiles - 1; + + // Try to find a 5x4 rectangle of things to show with the marker at(2,1). If not then offset it. + + //We're good + if(y_next>=1 &&(my - y_next>=2)&& x_next>=2 &&(mx - x_next)>=2){ + update_graphics_routine(x_next - 2, y_next - 1, 7); + // Otherwise change the rectangle a bit + } else { + var cx:Int; + var cy:Int; + if(x_next<2){ + cx=2 - x_next; + } else if((mx - x_next)<2){ + cx=-2 +(mx - x_next); + } + + if(y_next<1){ + cy=1; + } else if((my - y_next)<2){ + cy=-2 +(my - y_next); + } + update_graphics_routine(x_next - 2 + cx, y_next - 1 + cy,7 +(-cy * 5)- cx ); + // Edge cases fuuuuuuuuck + } + } + + private function update_graphics_routine(_x:Int, _y:Int, red_idx:Int):Void { + var w:Int=minimap.widthInTiles; + var h:Int=minimap.heightInTiles; + var source_rect:Rectangle=new Rectangle(0, 0, 5, 5); + var dest_point:Point=new Point(0, 0); + + var visited:Array=MinimapState.visited[Registry.CURRENT_MAP_NAME]; + visited[w * Registry.CURRENT_GRID_Y + Registry.CURRENT_GRID_X]=1; + var data:Array=t.getData(); + + var t_idx:Int;// tile idex + var tt:Int;//tile type + for(i in 0...20){ + + t_idx=w *(_y + Std.int(i / 5))+(_x +(i % 5)); + tt=data[t_idx]; + if(visited[t_idx]==0){ + tt=0;// Make it blank + } + + dest_point.x=5 *(i % 5); + dest_point.y=5 * Std.int(i / 5); + // Miniminimap tileset is 20x25 pixels. Indexed by same values as the other minimap + source_rect.x=(tt % 4)* 5; + source_rect.y=Std.int(tt / 4)* 5; + pixels.copyPixels(bm.pixels, source_rect, dest_point); + } + + source_rect.x=5 + 1; + source_rect.y=10 + 1 + source_rect.width=3; + source_rect.height=3; + dest_point.x=(red_idx % 5)* 5 + 1; + dest_point.y=Std.int(red_idx / 5)* 5 + 1; + pixels.copyPixels(bm.pixels, source_rect, dest_point); + draw(); + } + /** + * Switch to the next map, either make visible or not. Call AFTER updatin' minimap + * Set bounds of map. + * @param next_map + */ + public function switch_map():Void { + + + var mms:MinimapState=Registry.GAMESTATE.pause_state.minimap; + var _minimap:FlxTilemap=mms.get_minimap(); + + if(_minimap==null){ + visible=false; + return; + } + + visible=true; + var s:String=new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME]; + t=new FlxTilemap(); + t.loadMap(s, embed_miniminimap_tiles, 5, 5); + minimap=_minimap; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/Player.hx b/AIR/intra/hsrc/entity/player/Player.hx new file mode 100644 index 0000000..dcf00d3 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/Player.hx @@ -0,0 +1,1630 @@ +package entity.player +{ +import data.CLASS_ID; +import data.TileData; +import flash.media.Sound; +import flash.net.URLRequest; +import helper.Achievements; +import helper.EventScripts; +import org.flixel.FlxBasic; +import org.flixel.FlxGroup; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import flash.geom.Point; +import org.flixel.FlxG; +import global.Keys; +import global.Registry; +import org.flixel.FlxTilemap; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import org.flixel.system.FlxTile; +import states.PlayState; +import entity.gadget.*; +import entity.decoration.*; + + +class Player extends FlxSprite +{ + //[Embed(source="../../res/sprites/young_player.png")] public static var Player_Sprite:Class; + //[Embed(source="../../res/sprites/young_player_cell.png")] public static inline var Cell_Player_Sprite:Class; + //[Embed(source="../../res/sprites/player_mobile_indicator.png")] public static inline var Player_Mobile_Indicator_Sprite:Class; + + + //[Embed(source="../../res/sprites/young_player_reflection.png")] public static var Player_reflection_Sprite:Class; + //[Embed(source="../../res/sprites/broom_reflection.png")] public static var broom_reflection_sprite:Class; + + private var keyWatch:Keys; + private var parent:Dynamic; + public var cid:Int=CLASS_ID.PLAYER; + /* animation constants */ + private var ORIGINAL_WIDTH:Int=16; + private var ORIGINAL_HEIGHT:Int=16; + public var DEFAULT_Y_OFFSET:Int=4; + private var HITBOX_HEIGHT:Int=12; + private var HITBOX_WIDTH:Int=10; + public var TRANSITION_IDLE:String="idle_u"; + + /* properties associated with moving about the grid*/ + public var gridX:Int=0;//Where on the current grid we are. + public var gridY:Int=0; + public var grid_entrance_x:Int; + public var grid_entrance_y:Int; + public var UL_Sentinel:FlxSprite=new FlxSprite(); + public var LR_Sentinel:FlxSprite=new FlxSprite(); + public var midpoint:Point=new Point(0, 0); + public var hasnt_stepped_off_the_door_yet:Bool=true; + + public var force_position_ticks:Int;//i dont know what this is + + /* movement constants */ + + private var walkSpeed:Int=70; + /** + * A base multiplier for the base walkspeed, pre-effects. + */ + public var c_vel:Float=1.0; + /** + * A multiplier for walk-speed, post-effects. + */ + public var slow_mul:Float=1.0; + public var slow_ticks:Int=0; + public var additional_x_vel:Int=0; + public var additional_y_vel:Int=0; + + /* some misc movement state vars */ + public var sig_reverse:Bool=false; + private var reversed:Bool=false; + private var t_reverse:Float=0; + private var tm_reverse:Float=0.9; + + public var dontMove:Bool=false; + + + /* General 'where the fuck are we' state */ + public var state:Int=0; + public var S_GROUND:Int=0; + public var S_AIR:Int=1; + public var S_RAFT:Int=2; + public var S_AUTO_JUMP:Int=3; + public var S_INTERACT:Int=4; + public var S_ENTER_FALL:Int=5; + public var S_LADDER:Int=6; + + + + /* State for raft or on conveyer blah blah */ + public var ON_CONVEYER:Int=NONE; + private var CONVEYER_VEL:Int=35; + private var sink_timer_max:Float=3/16; + private var sink_timer:Float=sink_timer_max; + public var IS_SINKING:Bool=false; + public var ON_RAFT:Bool=false; + public var raft:Dust; + public var conveyer_fudge_factor:Int=0;//<_< + + /* State for jumping */ + private var jump_period:Float=0.4*1.15;//length of jump + private var jump_timer:Float=0; + private var JUMP_SHADOW_X_OFF:Int=0; + private var JUMP_SHADOW_Y_OFF:Int=8; + public var just_landed:Bool=false; + private var just_landed_timer:Int=0; + private var prevent_jump_repeat:Bool=false; + private var anim_air_did_up:Bool=false; + private var anim_air_did_down:Bool=false; + public var no_jump_ticks:Int=0; + public var s_interact_shadow_visibility_override:Bool=false; + + /* State for autojump */ + public var auto_jump_period:Float=0; + public var auto_jump_timer:Float=auto_jump_period; + public var auto_jump_distance:Int=0; + public var auto_jump_base_y:Int=0; + public var AUTO_JUMP_HEIGHT:Int=22; + public var is_spring_jump:Bool=false; + + /* Stuff associated with getting hit */ + public var SMALL_BUMP_VEL:Int=50; + public var bump_vel_x:Int; + public var bump_vel_y:Int; + public var do_bump:Bool=false; + public var BUMP_TIMER_MAX:Float=0.2; + public var bump_timer:Float=0.2; + public var zap_timer:Float=0.1; + public var ZAP_TIMER_MAX:Float=0.05; + + /* State for falling Into hole */ + public var isFalling:Bool=false;//Slipping + public var hasFallen:Bool=false;// + public var just_fell:Bool=false; + public var FALL_TIMER_DEFAULT:Float=0.016*8 + 0.001; + public var fallTimer:Float=FALL_TIMER_DEFAULT; + public var lastGoodPt:Point=new Point(); + public var fall_pt:Point=new Point(); + public var falling_disabled:Bool=false;// Propelled sets this + + /* Dashing */ + private var dashing:Bool=false; + public var SIG_DASH:Bool=false; + public var SIG_DASH_TYPE:Int=0x0; + private var dash_flags:Int=0x0; + private var dash_h_state:Int=0; + private var dash_v_state:Int=0; + + /* State for treasure open */ + public var opening_treasure:Bool=false; + /* Itmes */ + public var broom:Broom; + public var health_bar:HealthBar; + public var transformer:Transformer; + + /* Invincibility */ + public var invincible_timer:Float=0; + public var invincible:Bool=false; + public var INVINCIBLE_TIME:Float=0.8; + + /* graphics associated with player */ + public var light:Light; + public var foot_overlay:Foot_Overlay; + public var foot_overlay_bg_bg2:Foot_Overlay; + public var reflection:FlxSprite; + public var reflection_broom:FlxSprite; + public var mobile_current:FlxSprite; + /* Animation state */ + public var ANIM_STATE:Int=0; + public var ANIM_DEFAULT:Int=0; + public var ANIM_ATK_R:Int=1; + public var ANIM_ATK_L:Int=2; + public var ANIM_ATK_U:Int=3; + public var ANIM_ATK_D:Int=4; + public var ANIM_FALL:Int=5; + public var ANIM_DEAD:Int=6; + private var as_idle:Int=7; + private var idle_ticks:Int=0; + private var as_walk:Int=8; + private var as_slumped:Int=9; + private var last_frame:Dynamic={ walk_l:0, walk_r:0, walk_u:0, walk_d:0 }; + public var DEATH_FRAME:Int; + + public var action_latency_max:Float=0.24; + public var action_latency:Float=0.24; + public static var ATK_DELAY:Float=0.2; + public static var WATK_DELAY:Float=0.35; + public static var LATK_DELAY:Float=0.4; + + public var actions_disabled:Bool=false; + + public var step_noise_timer_max:Float=0.5; + public var step_noise_timer:Float=step_noise_timer_max; + + public var start_in_slump:Bool=false; + + public function reset_anodyne():Void { + hasnt_stepped_off_the_door_yet=true; + reflection.exists=false; + reflection_broom.exists=false; + if(Registry.CURRENT_MAP_NAME=="WINDMILL" || Registry.CURRENT_MAP_NAME=="DEBUG"){ + reflection.exists=true; + reflection_broom.exists=true; + } + + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + loadGraphic(Cell_Player_Sprite, true, false, 16, 16); + } else { + loadGraphic(Player_Sprite, true, false, 16, 16); + } + + height=HITBOX_HEIGHT; + width=HITBOX_WIDTH; + + sig_reverse=false; + if(reversed){ + reverse_controls(); + } + reversed=false; + t_reverse=0; + alive=true; + + state=S_GROUND; + offset.y=DEFAULT_Y_OFFSET; + alpha=1; + scrollFactor.x=scrollFactor.y=1; + + + ANIM_STATE=as_idle; + play(TRANSITION_IDLE); + + if(start_in_slump==true){ + start_in_slump=false; + ANIM_STATE=as_slumped; + play("slumped"); + } + + if(Registry.CURRENT_MAP_NAME=="DRAWER" || Registry.E_NEXT_MAP_TURN_ON_LIGHT==true || Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light.exists=true; + light.visible=true; + Registry.E_NEXT_MAP_TURN_ON_LIGHT=false; + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light.setlighttype(Light.T_BEDROOM_BOUNCE); + light.followee=this; + } else { + light.followee=this; + light.scrollFactor.x=light.scrollFactor.y=1; + light.special_type=Light.L_PLAYER; + light.setlighttype(Light.T_GLOW_LIGHT); + } + } else { + light.visible=false; + light.exists=false; + } + + + if(Registry.E_Enter_Fall_Down){ + Registry.E_Enter_Fall_Down=false; + Registry.sound_data.fall1.play(); + state=S_ENTER_FALL; + offset.y=150; + dontMove=true; + } + } + + public function new(_x:Int,_y:Int,_keyWatch:Keys,darkness:FlxSprite,_parent:Dynamic=null) + + { + + super(_x, _y + DEFAULT_Y_OFFSET); + parent=_parent; + + // Init reflection thiniges + reflection=new FlxSprite(); + reflection.loadGraphic(Player_reflection_Sprite, true, false, 16, 16); + reflection.exists=false; + reflection_broom=new FlxSprite(); + reflection_broom.loadGraphic(broom_reflection_sprite, true, false, 16, 16); + reflection_broom.exists=false; + + mobile_current=new FlxSprite(); + mobile_current.loadGraphic(Player_Mobile_Indicator_Sprite, true, false, 5, 5); + mobile_current.alpha=0.8; + if(Intra.is_mobile==false){ + mobile_current.exists=false; + } + + + raft=new Dust(0, 0, null, parent); + raft.exists=false; + keyWatch=_keyWatch; + loadGraphic(Player_Sprite, true, false, 16, 16); + /* add anims */ + addAnimation("walk_d", [1, 0], 6, true); + addAnimation("walk_r", [2, 3], 8, true); + addAnimation("walk_u", [4, 5], 6, true); + addAnimation("walk_l", [6, 7], 8, true); + + addAnimation("attack_down", [8, 9], 10, false); + addAnimation("attack_right", [10, 11], 10, false); + addAnimation("attack_up", [12, 13], 10, false); + addAnimation("attack_left", [14, 15], 10, false); + addAnimation("fall", [28, 29, 30, 31], 5, false); + addAnimation("die", [25, 26, 27, 24, 25, 26, 27, 24, 25, 26, 27, 32], 6, false); + addAnimation("slumped", [32]); + DEATH_FRAME=32; + addAnimation("whirl", [25, 26, 27, 24], 12, true); + + addAnimation("idle_d", [24], 4, true); + addAnimation("idle_r", [25], 4, true); + addAnimation("idle_u", [26], 4, true); + addAnimation("idle_l", [27], 4, true); + + addAnimation("jump_d", [16, 17], 4, true); + addAnimation("jump_r", [18, 19], 4, true); + addAnimation("jump_u", [20, 21], 4, true); + addAnimation("jump_l", [22, 23], 4, true); + addAnimation("idle_climb", [33]); + addAnimation("climb", [34, 35], 8, true); + + addAnimationCallback(on_anim_change); + + height=HITBOX_HEIGHT;offset.y=DEFAULT_Y_OFFSET; + width=HITBOX_WIDTH; + + play("idle_u"); + ANIM_STATE=as_idle; + + /* add sfx */ + add_sfx("jump_down", Registry.sound_data.player_jump_down); + add_sfx("jump_up", Registry.sound_data.player_jump_up); + add_sfx("dash_1", Registry.sound_data.dash_pad_1); + add_sfx("dash_2", Registry.sound_data.dash_pad_2); + + update_sentinels(); + UL_Sentinel.makeGraphic(1, 1, 0xffffffff); + LR_Sentinel.makeGraphic(1, 1, 0xffffffff); + UL_Sentinel.visible=LR_Sentinel.visible=false; + + lastGoodPt.x=x;lastGoodPt.y=y; + + /* Init items */ + broom=new Broom(this, x, y); + broom.visible=false; + + transformer=new Transformer(this, parent); + + health_bar=new HealthBar(155, 2, Registry.MAX_HEALTH); + health_bar.modify_health(-1 *(Registry.MAX_HEALTH - Registry.CUR_HEALTH)); + /* Add light */ + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light=new Light(0, 0, darkness, Light.T_BEDROOM_BOUNCE, false, this, 0, Light.L_BEDROOM_BOUNCE); + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + light.visible=false; + } + } else { + light=new Light(0, 0, darkness, Light.T_GLOW_LIGHT, true, this, 6, Light.L_PLAYER); + light.exists=false; + if(Registry.CURRENT_MAP_NAME=="STREET"){ + light.exists=true; + } + } + + my_shadow=EventScripts.make_shadow("8_small",false,20); + + foot_overlay=new Foot_Overlay(this); + foot_overlay_bg_bg2=new Foot_Overlay(this); + + } + override public function postUpdate():Void + { + super.postUpdate(); + Registry.PLAYER_X=x - 160 * Registry.CURRENT_GRID_X + 3; + Registry.PLAYER_Y=y - 20 - 160 * Registry.CURRENT_GRID_Y + 4; + } + + public static var Player_mobile_timer:Float=0; + public static var Player_mobile_angle:Float=0; + override public function update():Void { + + if(Intra.is_mobile){ + if(Player_mobile_timer>0){ + mobile_current.alpha=0.9; + Player_mobile_timer -=FlxG.elapsed; + mobile_current.x=(x + 8 - 2)- offset.x +(12 * Math.cos(Player_mobile_angle)); + mobile_current.y=(y + 8 - 2)- offset.y -(12 * Math.sin(Player_mobile_angle)); + } else { + mobile_current.alpha=0; + } + } + if(Registry.FUCK_IT_MODE_ON){ + solid=false; + walkSpeed=200; + //walkSpeed=60; + + if(FlxG.keys.justPressed("V")){ + visible=!visible; + } + } else { + walkSpeed=70; + solid=true; + } + + if(sig_reverse){ + sig_reverse=false; + if(!reversed){ + Registry.GFX_WAVE_EFFECT_ON=true; + reverse_controls(); + } + reversed=true; + } else if(reversed){ + t_reverse +=FlxG.elapsed; + if(t_reverse>tm_reverse){ + t_reverse=0; + reversed=false; + Registry.GFX_WAVE_EFFECT_ON=false; + reverse_controls(); + } + } + + + midpoint.x=(x + width / 2); + midpoint.y=(y + height / 2); + + + // Reflection logic. + // In a map with reflections, if the ***BG*** layer + // has a certain tile type, then the reflection(drawn between BG and BG2) + // should appear and mirror the player's animations + if(reflection.exists){ + var tile_type:Int=parent.map.getTile(midpoint.x / 16,(midpoint.y - Registry.HEADER_HEIGHT)/ 16); + reflection.visible=false; + reflection_broom.visible=false; + switch(Registry.CURRENT_MAP_NAME){ + case "DEBUG": + if(tile_type==47){ + reflection.visible=true; + reflection_broom.visible=broom.visible; + reflection_broom.angle=broom.angle; + } + break; + case "WINDMILL": + if(tile_type==130){ + reflection.visible=true; + reflection_broom.visible=broom.visible; + reflection_broom.angle=broom.angle; + } + break; + } + + reflection_broom.frame=broom.frame; + + + reflection_broom.x=broom.x; + reflection_broom.y=broom.y + 10; + if(facing==LEFT){ + reflection.x=x - 4; + } else { + reflection.x=x - 3; + } + reflection.y=y + 10; + reflection.frame=frame; + reflection.offset.y=-(offset.y - DEFAULT_Y_OFFSET); + } + + + if(!common_conditions()){ + return; + } + + + switch(state){ + case S_GROUND: + my_shadow.visible=false; + if(dontMove){ + velocity.x=0;velocity.y=0; + } else { + ground_movement();//modify player vels + } + + falling_logic(); + + + update_sentinels(); + + for(var t:Dynamic in Registry.subgroup_interactives){ + if(t !=null){ + if(t.active_region !=null && t.active_region.overlaps(this)){ + actions_disabled=true; + break;// As soon as this is true we can stop checking + } + } + } + if(!hasFallen && !actions_disabled){ + if(action_latency>0){ + action_latency -=FlxG.elapsed; + } + update_actions(Registry.keywatch.ACTION_1,Registry.keywatch.JP_ACTION_1,Registry.bound_item_1); + update_actions(Registry.keywatch.ACTION_2, Registry.keywatch.JP_ACTION_2, Registry.bound_item_2); + } + ground_animation(); + if(just_landed)just_landed=false; + dash_logic(); + + break; + case S_AIR: + if(dontMove){ + velocity.x=velocity.y=0; + } else { + air_movement(); + air_animation(); + } + dash_logic(); + + break; + case S_AUTO_JUMP: + solid=false; + my_shadow.visible=true; + auto_jump_animation(); + break; + case S_INTERACT: + velocity.x=velocity.y=0; + if(s_interact_shadow_visibility_override){ + my_shadow.visible=true; + } else { + my_shadow.visible=false; + } + /* Don't do anything until whatever put you in + * this state takes you out. */ + break; + case S_ENTER_FALL: + velocity.x=velocity.y=0; + angularVelocity=400; + frame=2; + if(EventScripts.send_property_to(this.offset, "y", 0, 1.7)){ + dontMove=false; + if(!(Registry.CURRENT_MAP_NAME=="CROWD" && Registry.CURRENT_GRID_X==3 && Registry.CURRENT_GRID_Y==4)){ //wHAT YOU GONNA DO PUNK + angle=0; + play("slumped"); + ANIM_STATE=as_slumped; + FlxG.shake(0.05, 0.4); + Registry.sound_data.hitground1.play(); + angularVelocity=0; + } + state=S_GROUND; + } + break; + case S_LADDER: + ladder_logic(); + + + break; + } + + //Reset callback settings + ON_CONVEYER=NONE; + if(slow_ticks>0){ + slow_ticks--; + } else { + slow_mul=1; + } + IS_SINKING=false; + falling_disabled=false; + actions_disabled=false; + + additional_x_vel=0; + additional_y_vel=0; + + if(no_jump_ticks>0){ + no_jump_ticks--; + } + + + super.update(); + } + + /* Falling logic */ + public function falling_logic():Void { + /* If you fall reset position to last known safe position */ + if(hasFallen){ + fallTimer -=FlxG.elapsed; + dontMove=true; + x=fall_pt.x - 5; + y=fall_pt.y + 2; + if(fallTimer<-1.0 || frame==31){ + c_vel=1.0; + fallTimer=FALL_TIMER_DEFAULT; + hasFallen=false; + x=grid_entrance_x; + y=grid_entrance_y; + flicker(1); + play("idle_d"); + solid=false; + just_fell=true; + dontMove=false; + ANIM_STATE=as_idle; + //health_bar.modify_health(-1); + } + return; + } + if(falling_disabled)isFalling=false; + if(!isFalling){ + /* If not falling update last known safe position */ + c_vel=1.0; + lastGoodPt.x=x; + lastGoodPt.y=y; + fallTimer=FALL_TIMER_DEFAULT; + } else { + /* Player movement should change here */ + //some other sort of gradual falling?? + //c_vel=0.5; + fallTimer -=FlxG.elapsed; + if(just_landed){ + fallTimer=-1; + just_landed=false; + } + /* Fall after a time out, or instantly if dashing */ + if(fallTimer<0 ||(dashing && fallTimer0){ + conveyer_fudge_factor--; + if(conveyer_fudge_factor==1 && raft==null){ + var _raft:Dust=new Dust(x, y, null,parent); + _raft.ON_CONVEYER=true; + parent.player_group.remove(raft, true); + + raft=_raft; + parent.player_group.members.splice(0, 0, raft); + parent.player_group.length++; + } else if(conveyer_fudge_factor==1){ + + } + ON_RAFT=true; + ON_CONVEYER=ANY; + } + + + /* Pin the raft to the player, and also increase + * the player's velocity accordingly. */ + if(ON_CONVEYER){ //set by the callback or the line above + if(ON_RAFT){ //set raft to be under player. set in Dust collision + raft.x=x - 2; + raft.y=y - 2; + } + switch(ON_CONVEYER){ + case UP: + velocity.y -=CONVEYER_VEL;break; + case DOWN: + velocity.y +=CONVEYER_VEL;break; + case LEFT: + velocity.x -=CONVEYER_VEL;break; + case RIGHT: + velocity.x +=CONVEYER_VEL;break; + } + + var tidx:Int; + var tile:FlxTile; + + if(framePixels_y_push>0){ + tidx=EventScripts.get_tile_nr(midpoint.x + 2, midpoint.y, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + tidx=EventScripts.get_tile_nr(midpoint.x - 2, midpoint.y, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + tidx=EventScripts.get_tile_nr(midpoint.x, midpoint.y + 5, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + } + } else if(parent.state !=parent.S_TRANSITION){ + /* only reset the raft if we didn't fall off while on it */ + if((velocity.x !=0 || velocity.y !=0)&& raft !=null && !isFalling && !hasFallen){ + tidx=EventScripts.get_tile_nr(midpoint.x, midpoint.y, parent.curMapBuf); + if(tidx>parent.curMapBuf._tileObjects.length){ + tidx=3; + } + if(parent.curMapBuf._tileObjects[tidx].callback==TileData.conveyer){ + + } else { + ON_RAFT=false; + if(velocity.x>0)raft.x -=3; + if(velocity.x<0)raft.x +=3; + if(velocity.y>0)raft.y -=3; + if(velocity.y<0)raft.y +=3; + // Move the raft to the playstate's ownership + parent.player_group.remove(raft, true); + Registry.subgroup_dust.push(raft); + parent.bg_sprites.add(raft); + raft=null; + } + } + } + step_noise_timer -=FlxG.elapsed; + + if(step_noise_timer<0 &&(velocity.x !=0 || velocity.y !=0)){ + if(IS_SINKING && step_noise_timer<0){ + Registry.sound_data.play_sound_group(Registry.sound_data.water_step_group); + step_noise_timer=step_noise_timer_max; + } else if(!IS_SINKING && ON_CONVEYER & ANY){ // sound for walking in puddle + Registry.sound_data.play_sound_group(Registry.sound_data.puddle_step); + step_noise_timer=0.25; + } else if(foot_overlay.visible && Registry.CURRENT_MAP_NAME=="REDSEA"){ + Registry.sound_data.play_sound_group(Registry.sound_data.puddle_step,0.5); + step_noise_timer=0.25; + } + } + velocity.x +=additional_x_vel; + velocity.y +=additional_y_vel; + + velocity.x *=slow_mul; + velocity.y *=slow_mul; + } + + // For wheny ou die whilst on a raft, to prevent a "destroy"d raft + // from being added to the game and blowing shit up + public function unraftify_safely():Void { + parent.player_group.remove(raft, true); + raft=null; + } + /* visual fx with jumping(shadow, offset Interpolation)*/ + public function air_animation():Void { + // Play sfx, set the animation, set the shadow, hide the broom. + if(!anim_air_did_up){ + broom.visible=false; + anim_air_did_up=true; + + if(ON_CONVEYER){ + Registry.sound_data.puddle_up.play(); + } else { + play_sfx("jump_up"); + } + + my_shadow.play("get_small"); + ANIM_STATE=as_idle;// Always land in idle state. + switch(facing){ // Play the jump animation + case UP: + play("jump_u"); + break; + case DOWN: + play("jump_d"); + break; + case LEFT: + play("jump_l"); + break; + case RIGHT: + play("jump_r"); + break; + } + } + // Move the shadow iwth the player. + my_shadow.x=x + JUMP_SHADOW_X_OFF + 1; + my_shadow.y=y + JUMP_SHADOW_Y_OFF - 3; + offset.y=DEFAULT_Y_OFFSET + Std.int((((-4*24)/(jump_period*jump_period))* jump_timer *(jump_timer - jump_period))); + jump_timer +=FlxG.elapsed; + + + + // On the way down, change the shadow animation + if(!anim_air_did_down && jump_timer>jump_period / 2){ + my_shadow.play("get_big"); + anim_air_did_down=true; + } + + // sfx for landing, change state, set some state flags, fix the offset + if(jump_timer>jump_period){ + jump_timer=0; + if(ON_CONVEYER){ + Registry.sound_data.puddle_down.play(); + } else { + play_sfx("jump_down"); + } + state=S_GROUND; + + my_shadow.visible=false; + offset.y=DEFAULT_Y_OFFSET; + just_landed=true; + anim_air_did_down=anim_air_did_up=false; + } + } + public function air_movement():Void { + + set_init_vel(0.83); + + if(velocity.x !=0 && velocity.y !=0){ + velocity.x *=.7; + velocity.y *=.7; + } + + if(ON_RAFT){ + if(ON_CONVEYER !=NONE){ + raft.x=x - 2; + raft.y=y - 2; + } + } + + velocity.x +=additional_x_vel; + velocity.y +=additional_y_vel; + } + + + private function dash_logic():Void { + var VEL_DASH_1:Int=walkSpeed * 1.3; + var VEL_DASH_2:Int=walkSpeed * 1.77; + if(SIG_DASH){ + SIG_DASH=false; + dashing=true; + switch(SIG_DASH_TYPE){ + case UP: + if(dash_flags & DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else { + dash_flags |=UP; + if(dash_v_state<2){ + + dash_v_state++; + (dash_v_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case DOWN: + if(dash_flags & UP){ + dash_flags &=~UP; + dash_v_state=0; + } else { + dash_flags |=DOWN; + if(dash_v_state<2){ + dash_v_state++; + (dash_v_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case RIGHT: + if(dash_flags & LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } else { + dash_flags |=RIGHT; + if(dash_h_state<2){ + dash_h_state++; + (dash_h_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case LEFT: + if(dash_flags & RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } else { + dash_flags |=LEFT; + if(dash_h_state<2){ + dash_h_state++; + (dash_h_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + } + } + + if(!dashing)return; + + // Stop dashing if not pressing the respective move key + if((dash_flags & UP)&& !keyWatch.UP){ + dash_flags &=~UP; + dash_v_state=0; + } else if((dash_flags & DOWN)&& !keyWatch.DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else if((dash_flags & RIGHT)&& !keyWatch.RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } else if((dash_flags & LEFT)&& !keyWatch.LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } + + // Stop dashing if touching wall + if((dash_flags & touching)& UP){ + dash_flags &=~UP; + dash_v_state=0; + } else if((dash_flags & touching)& DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else if((dash_flags & touching)& LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } else if((dash_flags & touching)& RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } + + if(dash_v_state==1){ + velocity.y=velocity.y>0 ? VEL_DASH_1:-VEL_DASH_1; + } else if(dash_v_state==2){ + velocity.y=velocity.y>0 ? VEL_DASH_2:-VEL_DASH_2; + } else { + //Decelerate the player, or stop them... + } + + if(dash_h_state==1){ + velocity.x=velocity.x>0 ? VEL_DASH_1:-VEL_DASH_1; + } else if(dash_h_state==2){ + velocity.x=velocity.x>0 ? VEL_DASH_2:-VEL_DASH_2; + } else { + + } + + if(dash_flags==0 || broom.visible){ + dashing=false; + } + } + /* largely similar to air anim but we want a different timer + * based on the Jump_Trigger that caused the auto_jump */ + public function auto_jump_animation():Void { + if(!anim_air_did_down){ + play("jump_d"); + Registry.sound_data.player_jump_up.play(); + my_shadow.frame=0; + auto_jump_timer=0; + anim_air_did_down=true; + } + if(auto_jump_timer>auto_jump_period / 2 && !anim_air_did_up){ + anim_air_did_up=true; + my_shadow.play("get_big"); + } + + velocity.x=velocity.y=0; + my_shadow.x=x + JUMP_SHADOW_X_OFF + 3; + if(is_spring_jump){ + my_shadow.y=y + 3; + } else { + my_shadow.y=auto_jump_base_y + auto_jump_distance; + } + //parabola between two pts + // x(x - t), where f(t/2)=h. - h=16, solve for a + var a:Float=-1 *((4 * AUTO_JUMP_HEIGHT)/(auto_jump_period * auto_jump_period)); + offset.y=DEFAULT_Y_OFFSET + Std.int((a * auto_jump_timer *(auto_jump_timer - auto_jump_period))); + + // also lerp the distance + y=auto_jump_base_y + Std.int(auto_jump_distance *(auto_jump_timer / auto_jump_period)); + auto_jump_timer +=FlxG.elapsed; + if(auto_jump_timer>auto_jump_period){ + solid=true; + is_spring_jump=false; + velocity.x=velocity.y=0; + auto_jump_timer=0; + + state=S_GROUND; + + my_shadow.visible=false; + offset.y=DEFAULT_Y_OFFSET; + + just_landed=true; + + anim_air_did_down=false; + anim_air_did_up=false; + play("idle_d"); + ANIM_STATE=as_idle; + + Registry.sound_data.player_jump_down.play(); + } + } + + private var t_just_left_water:Float=0; + private var tm_just_left_water:Float=0.04; + /* update ground anim - modifies offset.x */ + public function ground_animation():Void { + if(ON_CONVEYER && IS_SINKING){ //If on a conveyer and sinking, make me sink. + t_just_left_water=0; + sink_timer -=FlxG.elapsed; + if(sink_timer<0){ + sink_timer=sink_timer_max; + if(framePixels_y_push<16){ + framePixels_y_push +=1; + } else { + x=grid_entrance_x; + y=grid_entrance_y; + framePixels_y_push=0; + touchDamage(1); + } + } + + } else { + t_just_left_water +=FlxG.elapsed; + if(t_just_left_water>tm_just_left_water){ + t_just_left_water=0; + framePixels_y_push=0; + } + } + + // We don't want the bump velocity to change the direction we face. + if(do_bump)return; + + switch(ANIM_STATE){ + case ANIM_ATK_R: + case ANIM_ATK_L: + case ANIM_ATK_D: + case ANIM_ATK_U: + if(broom.finished){ + ANIM_STATE=as_idle; + switch(_curAnim.name){ + case "attack_right": + play("idle_r"); + break; + case "attack_up": + play("idle_u"); + break; + case "attack_left": + play("idle_l"); + break; + case "attack_down": + play("idle_d"); + break; + } + break; + } + + if(frame !=8 && ANIM_STATE==ANIM_ATK_R){ play("attack_right");} + if(frame !=16 && ANIM_STATE==ANIM_ATK_L){ play("attack_left");} + if(frame !=12 && ANIM_STATE==ANIM_ATK_U){ play("attack_up");} + if(frame !=22 && ANIM_STATE==ANIM_ATK_D){ play("attack_down");} + return; + case ANIM_FALL: + play("fall"); + return; + case ANIM_DEAD: + return; + case as_idle: + if(idle_ticks>0){ + idle_ticks -=1; + return; + } + if(velocity.y<0){ + facing=UP; + play("walk_u"); + } else if(velocity.y>0){ + facing=DOWN; + play("walk_d"); + } else if(velocity.x<0){ + facing=LEFT; + play("walk_l"); + } else if(velocity.x>0){ + facing=RIGHT; + play("walk_r"); + } else { + switch(facing){ + case UP: + play("idle_u"); + break; + case LEFT: + play("idle_l"); + break; + case DOWN: + play("idle_d"); + break; + case RIGHT: + play("idle_r"); + break; + } + break; + } + ANIM_STATE=as_walk; + _curFrame=last_frame[_curAnim.name]; + _curIndex=_curAnim.frames[_curFrame]; + + break; + case as_walk: + if(idle_ticks>0){ + idle_ticks --; + } + if(velocity.x==0 && velocity.y==0){ + ANIM_STATE=as_idle; + switch(facing){ + case UP:last_frame["walk_u"]=_curFrame;play("idle_u");break; + case DOWN:last_frame["walk_d"]=_curFrame;play("idle_d");break; + case LEFT:last_frame["walk_l"]=_curFrame;play("idle_l");break; + case RIGHT:last_frame["walK_r"]=_curFrame;play("idle_r");break; + } + } else { + if(velocity.y<0){ + if(facing !=UP ||(_curAnim !=null && _curAnim.name !="walk_u")){ + facing=UP; + play("walk_u"); + } + } else if(velocity.y>0){ + if(facing !=DOWN){ + facing=DOWN; + play("walk_d"); + } + } else if(velocity.x<0){ + if(facing !=LEFT){ + facing=LEFT; + play("walk_l"); + } + } else { + if(facing !=RIGHT){ + facing=RIGHT; + play("walk_r"); + } + } + + } + break; + case as_slumped: + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2 || Registry.keywatch.UP || Registry.keywatch.DOWN || Registry.keywatch.LEFT || Registry.keywatch.RIGHT){ + ANIM_STATE=as_idle; + } + break; + } + + + + } + public function update_actions(action_is_down:Bool, just_pressed_action:Bool, bound_item:String):Void { + + if(action_is_down){ + if(bound_item=="BROOM"){ + if(just_pressed_action && !broom.visible && framePixels_y_push<8){ + if(action_latency>=0)return;//DELAY FOR ATTACK + + broom.visible_timer=0;// Reset this so we do not get the edge case where the broom goes invisible mid-swing from + // perfectly timing two attacks + action_latency=action_latency_max; + + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.swing_broom_group); + + + if(broom.has_dust){ + y=Std.int(y); + x=Std.int(x); + if(facing==UP){broom.dust.x=x;broom.dust.y=y - 16;} + else if(facing==LEFT){ broom.dust.x=x - 16;broom.dust.y=y;} + else if(facing==RIGHT){ broom.dust.x=x + 16;broom.dust.y=y;} + else { broom.dust.x=x;broom.dust.y=y + 16;} + + var dust_x:Int=broom.dust.x; + var dust_y:Int=broom.dust.y - 20; + /* Snap dust to nearest tile */ + if(broom.dust.x % 16<=9){ broom.dust.x -=broom.dust.x % 16;} + else { broom.dust.x +=(16 - broom.dust.x % 16);} + if(dust_y % 16<=7){ broom.dust.y -=(dust_y % 16);} + else { broom.dust.y +=(16 - dust_y % 16);} + /* Look Into the(unmodified)tilemap to get the tile's number this dust is being dropped on */ + var tile_type:Int=parent.map.getTile(broom.dust.x / 16,(broom.dust.y - 20)/ 16); + /* And then actually look up that tile's properties in the current map buffer to figure out + * whether we can drop the dust. This is stupid but it works so who cares */ + + + var skip_if_dust_overlaps:Bool=false; + for(var d:Dust in Registry.subgroup_dust){ + if(d !=null){ + if(broom.dust.overlaps(d)&& d !=broom.dust){ + skip_if_dust_overlaps=true; + } + } + } + + if(!skip_if_dust_overlaps && parent.curMapBuf._tileObjects[tile_type].allowCollisions !=FlxObject.ANY){ + broom.dust.visible=true; + broom.has_dust=false; + if(broom.dust._animations !=null){ + broom.dust.play("unpoof"); + } + Dust.dust_sound.play(); + broom.just_released_dust=true; + } + + + } + + + broom.visible=true; + if(facing==RIGHT){ + broom.angle=180; + broom.play("stab",true); + }else if(facing==DOWN){ + broom.angle=270; + broom.play("stab",true); + } else if(facing==LEFT){ + broom.angle=0; + broom.play("stab",true); + } else if(facing==UP){ + broom.angle=90; + broom.play("stab",true); + } + broom.update(); + switch(facing){ + case LEFT:ANIM_STATE=ANIM_ATK_L;break; + case UP:ANIM_STATE=ANIM_ATK_U;break; + case DOWN:ANIM_STATE=ANIM_ATK_D;break; + case RIGHT: ANIM_STATE=ANIM_ATK_R;break; + } + } + } + if(bound_item=="JUMP" &&(ON_RAFT ||(ON_CONVEYER==NONE || ON_CONVEYER==ANY))&& !IS_SINKING && !prevent_jump_repeat && no_jump_ticks<=0 && framePixels_y_push==0){ + if(state !=S_AIR){ + state=S_AIR; + my_shadow.visible=true; + my_shadow.x=x;my_shadow.y=y; + prevent_jump_repeat=true; + } + } + + if(just_pressed_action && bound_item=="TRANSFORMER"){ + transformer.use_item(); + } + } + + if(!broom.visible && !action_is_down && bound_item=="BROOM"){ + broom.just_released_dust=false; + } else if(!action_is_down && bound_item=="JUMP"){ + prevent_jump_repeat=false; + } + } + + public function touchDamage(damage:Int,type:String=" "):Void { + + if(parent.state==parent.S_DIALOGUE){ //aint no damge in dialogue + return; + } + if(invincible==false && !isFalling && !flickering){ + Registry.sound_data.player_hit_1.play(); + flicker(INVINCIBLE_TIME); + invincible_timer=INVINCIBLE_TIME; + invincible=true; + health_bar.modify_health(-damage); + if(health_bar.cur_health !=0){ + do_bump=true; + } + bump_vel_x=bump_vel_y=0; + if(facing==UP){ + bump_vel_y=SMALL_BUMP_VEL; + } else if(facing==LEFT){ + bump_vel_x=SMALL_BUMP_VEL; + } else if(facing==DOWN){ + bump_vel_y=-SMALL_BUMP_VEL; + } else { + bump_vel_x=- SMALL_BUMP_VEL; + } + } + + if(type=="zap"){ + zap_timer=0; + } + //bump in direction opposite of facing + } + + public function touches(o:FlxSprite):Bool { + if(Std.is(o, Door)){ + var d:Door=cast(o, Door); + if(dontMove && d.type==Door.FALL_DOOR){ + return false; + } + } + if(o.overlaps(this)){ + return true; + } + return false; + + } + /* Update the inventory blah blah */ + public function update_player_inventory(treasure:Treasure):Void { + trace("Get treasure number ", parseInt(treasure.xml.@frame)); + switch(parseInt(treasure.xml.@frame)){ + case Treasure.IDX_BROOM: + Registry.inventory[Registry.IDX_BROOM]=true; + Achievements.unlock(Achievements.A_GET_BROOM); + break; + case Treasure.IDX_KEY: + Registry.change_nr_keys(1); + parent.number_of_keys_text.setText("x" + Registry.get_nr_keys().toString(), true, 0, 0, "left", true); + break; + case Treasure.IDX_GROWTH: + trace("Growths", Registry.nr_growths); + Registry.nr_growths++; + check_for_card_achvs(); + break; + case Treasure.IDX_JUMP: + Registry.inventory[Registry.IDX_JUMP]=true; + break; + case Treasure.IDX_WIDE: + Registry.inventory[Registry.IDX_WIDEN]=true; + break; + case Treasure.IDX_LONG: + Registry.inventory[Registry.IDX_LENGTHEN]=true; + break; + case Treasure.IDX_SWAP: + Registry.inventory[Registry.IDX_TRANSFORMER]=true; + break; + } + } + + private function check_for_card_achvs():Void { + if(Registry.CURRENT_MAP_NAME=="WINDMILL")Achievements.unlock(Achievements.A_GET_WINDMILL_CARD); + if(Registry.nr_growths==1)Achievements.unlock(Achievements.Card_1); + if(Registry.nr_growths==7)Achievements.unlock(Achievements.Card_7); + if(Registry.nr_growths>=48)Achievements.unlock(Achievements.A_GET_48_CARDS); + } + + /* reset things that need to be reset */ + public function cleanup_on_grid_transition():Void { + broom.has_dust=false; + t_reverse=0; + if(reversed){ + Registry.GFX_WAVE_EFFECT_ON=false; + reversed=false; + reverse_controls(); + } + } + + public function init_player_group(player_group:FlxGroup,player:Player,map:FlxTilemap):Void { + player_group.add(player.raft); + player_group.add(player.my_shadow); + + player_group.add(player.transformer.selector); + player_group.add(player.transformer.selected); + player_group.add(player.transformer); + + player_group.add(player); + + player_group.add(player.foot_overlay); + var p:PlayState=Registry.GAMESTATE; + + p.intra_bg_bg2_sprites.add(player.foot_overlay_bg_bg2); + + player_group.add(player.light); + + player_group.add(player.broom.wide_attack_h); + player_group.add(player.broom.wide_attack_v); + player_group.add(player.broom.long_attack_h); + player_group.add(player.broom.long_attack_v); + player_group.add(player.broom); + + player_group.add(player.LR_Sentinel); + player_group.add(player.UL_Sentinel); + if(Intra.is_mobile){ + player_group.add(player.mobile_current); + } + player_group.set_draw_ref(player); + } + /** + * Checks for conditions that stop the player from updating, or update + * various state(temporary invincibility, health...) + * @return 0 if player actions should be terminated here. 1 otherise + */ + private function common_conditions():Int + { + Registry.CUR_HEALTH=health_bar.cur_health; + + if(parent.state==parent.S_TRANSITION){ + dontMove=true; + velocity.x=velocity.y=0; + if(ON_RAFT){ + raft.x=x - 2; + raft.y=y - 3; + conveyer_fudge_factor=5;//<_< + } + + if(state==S_AIR){ + my_shadow.x=x + JUMP_SHADOW_X_OFF + 1; + my_shadow.y=y + JUMP_SHADOW_Y_OFF - 3; + } + return 0; + } + + if(parent.SWITCH_MAPS){ + super.update(); + return 0; + } + + if(!solid && just_fell){ + solid=true; + just_fell=false; + } + if(!alive){ + super.update(); + return 0; + + } + + if(invincible_timer>0){ + invincible_timer -=FlxG.elapsed + } else { + invincible=false; + if(!Registry.FUCK_IT_MODE_ON){ + visible=true; + } + } + + + + return 1; + } + + private function reverse_controls():Void + { + var down_key:String=Registry.controls[Keys.IDX_DOWN]; + var up_key:String=Registry.controls[Keys.IDX_UP]; + Registry.controls[Keys.IDX_DOWN]=up_key; + Registry.controls[Keys.IDX_UP]=down_key; + + var left_key:String=Registry.controls[Keys.IDX_LEFT]; + var right_key:String=Registry.controls[Keys.IDX_RIGHT]; + Registry.controls[Keys.IDX_RIGHT]=left_key; + Registry.controls[Keys.IDX_LEFT]=right_key; + } + + private var turn_in_place_ticks:Int=0; + private function set_init_vel(mul:Float=1):Void + { + // If actions are disabled(overlapping an NPC or something), then + // don't do the slidy-push thing + if(actions_disabled){ + touching=NONE; + } + + + if(keyWatch.UP && !keyWatch.DOWN){ + velocity.y=-mul*walkSpeed*c_vel; + // Check if we need to push the player to get around corner snags. + // Looks up tile collision flags and uses those, as well as the + // hitbox's corner points to determine whether pushing is needed. + if(touching==UP){ + var col_tl:Int=EventScripts.get_tile_collision_flags(x, y - 1, parent.map,parent.curMapBuf); + var col_tr:Int=EventScripts.get_tile_collision_flags(x + width, y - 1, parent.map,parent.curMapBuf); + if((x + width)% 16<6 &&(col_tl !=FlxObject.ANY)&&(col_tl !=FlxObject.DOWN)){ + additional_x_vel=-30; + } else if((x % 16)>9 &&(col_tr !=FlxObject.ANY)&&(col_tr !=FlxObject.DOWN)){ + additional_x_vel=30; + } + } + } else if(keyWatch.DOWN && !keyWatch.UP){ + velocity.y=mul*walkSpeed*c_vel; + if(touching==DOWN){ + var col_bl:Int=EventScripts.get_tile_collision_flags(x, y + height + 1, parent.map, parent.curMapBuf); + var col_br:Int=EventScripts.get_tile_collision_flags(x + width, y + height + 1, parent.map, parent.curMapBuf); + if((x + width)% 16<6 &&(col_bl !=FlxObject.ANY)&&(col_bl !=FlxObject.UP)){ + additional_x_vel=-30; + } else if(x % 16>9 &&(col_br !=FlxObject.ANY)&&(col_br !=FlxObject.UP)){ + additional_x_vel=30; + } + } + } else { + velocity.y=0; + + } + if(keyWatch.LEFT && !keyWatch.RIGHT){ + velocity.x=-mul*walkSpeed*c_vel; + if(touching==LEFT){ + var col_tl2:Int=EventScripts.get_tile_collision_flags(x-1, y, parent.map,parent.curMapBuf); + var col_bl2:Int=EventScripts.get_tile_collision_flags(x-1, y + height, parent.map, parent.curMapBuf); + if((y - Registry.HEADER_HEIGHT + height)% 16<6 &&(col_tl2 !=FlxObject.ANY)&&(col_tl2 !=FlxObject.RIGHT)){ + additional_y_vel=-30; + } else if((y - Registry.HEADER_HEIGHT)% 16>9 &&(col_bl2 !=FlxObject.ANY)&&(col_bl2 !=FlxObject.RIGHT)){ + additional_y_vel=30; + } + + } + } else if(keyWatch.RIGHT && !keyWatch.LEFT){ + velocity.x=mul*walkSpeed * c_vel; + if(touching==RIGHT){ + var col_tr2:Int=EventScripts.get_tile_collision_flags(x + width + 1, y, parent.map,parent.curMapBuf); + var col_br2:Int=EventScripts.get_tile_collision_flags(x + width + 1, y + height, parent.map, parent.curMapBuf); + if((y - Registry.HEADER_HEIGHT + height)% 16<6 &&(col_tr2 !=FlxObject.ANY)&&(col_tr2 !=FlxObject.LEFT)){ + additional_y_vel=-30; + } else if((y - Registry.HEADER_HEIGHT)% 16>9 &&(col_br2 !=FlxObject.ANY)&&(col_br2 !=FlxObject.LEFT)){ + additional_y_vel=30; + } + + } + } else { + velocity.x=0; + } + + if(keyWatch.ACTION_1){ + turn_in_place_ticks +=1; + velocity.x=velocity.y=0; + if(turn_in_place_ticks>23){ + ANIM_STATE=as_idle; + if(keyWatch.RIGHT){ + facing=RIGHT; + } else if(keyWatch.LEFT){ + facing=LEFT; + } else if(keyWatch.UP){ + facing=UP; + } else if(keyWatch.DOWN){ + facing=DOWN; + } + } + } else { + turn_in_place_ticks=0; + } + + + } + + private function ladder_logic():Void + { + velocity.x=velocity.y=0; + if(keyWatch.UP){ + velocity.y=-walkSpeed*0.7; + play("climb"); + } else if(keyWatch.DOWN){ + velocity.y=walkSpeed*0.7; + play("climb"); + } else { + play("idle_climb"); + } + + if(keyWatch.LEFT){ + velocity.x=-walkSpeed; + } else if(keyWatch.RIGHT){ + velocity.x=walkSpeed; + } + + step_noise_timer -=FlxG.elapsed; + + if(step_noise_timer<0 &&(velocity.y !=0)){ + step_noise_timer=0.2; + Registry.sound_data.play_sound_group(Registry.sound_data.ladder_step); + } + + // Make sure the ladder anim doesn't keep playing when leaving ladder state + state=S_GROUND; + ANIM_STATE=as_idle; + } + + public function on_anim_change(name:String, _frame:Int, _index:Int):Void { + switch(name){ + case "walk_l": + case "attack_left": + offset.x=4; + break; + case "walk_r": + case "attack_right": + offset.x=3; + break; + case "walk_d": + case "attack_down": + offset.x=3; + break; + case "walk_u": + case "attack_up": + offset.x=3; + break; + } + } + + public function be_idle():Void { + ANIM_STATE=as_idle; + idle_ticks=5; + switch(facing){ + case UP: + play("idle_u"); + break; + case LEFT: + play("idle_l"); + break; + case RIGHT: + play("idle_r"); + break; + case DOWN: + play("idle_d"); + break; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/entity/player/Transformer.hx b/AIR/intra/hsrc/entity/player/Transformer.hx new file mode 100644 index 0000000..f928050 --- /dev/null +++ b/AIR/intra/hsrc/entity/player/Transformer.hx @@ -0,0 +1,245 @@ +package entity.player +{ +import flash.geom.Point; +import global.Registry; +import helper.DH; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +/** + * Item that switches two arbitrary tiles on the map. + * Obviously breaks things to hell so we only give it + * to the player at the end. + * @author Seagaia + */ +class Transformer extends FlxSprite +{ + + public var selector:FlxSprite=new FlxSprite; + public var selected:FlxSprite=new FlxSprite; + + private var state:Int=0; + private var s_idle:Int=0; + private var s_ready:Int=-1; + private var s_has_one:Int=1; + private var s_transforming:Int=2; + + private var map:FlxTilemap=new FlxTilemap; + private var g_off:Point=new Point(); + private var is_playstate:Bool=false; + + private var p:Player; + private var parent:Dynamic; + + private var did_init:Bool=false; + private var dontfuckgindoanything:Bool=true; + + private var okay_places:Array; + private var okay_rooms:Array; + + + //[Embed(source="../../res/sprites/inventory/selector.png")] public static inline var embed_selector:Class; + public function new(_p:Player,_parent:Dynamic) + { + p=_p; + parent=_parent; + reset_next(); + + selector.loadGraphic(embed_selector, true, false, 16, 16); + selected.loadGraphic(embed_selector, true, false, 16, 16); + selected.addAnimation("a", [1]); + selector.addAnimation("a", [0, 1], 4); + selector.play("a"); + selected.play("a"); + + visible=false; + selector.visible=false; + selected.visible=false; + + + okay_places=new Array("GO", "CIRCUS", "HOTEL", "APARTMENT"); + okay_rooms=new Array(new Point(2,3), new Point(7, 0), new Point(8, 11), new Point(8, 7)); + + + } + + + override public function update():Void + { + + if(Registry.FUCK_IT_MODE_ON && FlxG.keys.justPressed("T")){ + trace("Transformer.as:GE_EVENTS:BEAT GAME IS NOW TRUE"); + Registry.GE_States[Registry.GE_Finished_Game]=true; + } + + // Extra nexus and drawer hardcoded check... + + if(!did_init){ + reset_next(); + did_init=true; + + } + // hack + map=parent.curMapBuf; + g_off.x=Registry.CURRENT_GRID_X * 160; + g_off.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + switch(state){ + case s_idle: + break; + case s_ready: + case s_transforming: + facing=p.facing; + var hh:Int=Registry.HEADER_HEIGHT; + + if(facing==UP){x=p.x;y=p.y - 16;} + else if(facing==LEFT){ x=p.x - 16;y=p.y;} + else if(facing==RIGHT){ x=p.x + 16;y=p.y;} + else { x=p.x;y=p.y + 16;} + + if(x % 16<=10){ x -=x % 16;} + else { x +=(16 - x % 16);} + if((y - hh)% 16<=7){ y -=((y - hh)% 16);} + else { y +=(16 -(y - hh)% 16);} + + selector.x=x; + selector.y=y; + + break; + + } + + if(Registry.E_Transformer_On){ + Registry.E_Transformer_On=false; + + } + if(Registry.E_Transformer_Off){ + Registry.E_Transformer_Off=false; + selector.visible=selected.visible=false; + state=s_idle; + + } + + super.update(); + } + + //called by player + public function use_item():Void { + if(Registry.sound_data.current_song_name=="BRIARFIGHT"){ + return; + } + // If we finished the game, use swap everywhere + if(Registry.GE_States[Registry.GE_Finished_Game]){ + dontfuckgindoanything=false; + + if(Registry.CURRENT_MAP_NAME=="DRAWER" && Registry.CURRENT_GRID_Y>=9){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="NEXUS" && Registry.CURRENT_GRID_Y<=3){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="SPACE" && Registry.CURRENT_GRID_Y>=5){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN" && Registry.CURRENT_GRID_Y>=8){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="SUBURB" && Registry.CURRENT_GRID_Y>=5 && Registry.CURRENT_GRID_X==2){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="DEBUG"){ + dontfuckgindoanything=true; + } + // Otherwise, only activate swap in certain rooms. + } else { + for(i in 0...4){ + if(Registry.CURRENT_MAP_NAME==okay_places[i] && Registry.CURRENT_GRID_X==okay_rooms[i].x && Registry.CURRENT_GRID_Y==okay_rooms[i].y){ + if(Registry.CURRENT_MAP_NAME=="GO"){ + if(Registry.GAMESTATE.player.facing==FlxObject.UP && Registry.GAMESTATE.player.y=7){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="SPACE" && Registry.CURRENT_GRID_Y>=5){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN" && Registry.CURRENT_GRID_Y>=7){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB" && Registry.CURRENT_GRID_Y>=5 && Registry.CURRENT_GRID_X==2){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="DEBUG"){ + //DH.dialogue_popup("Sorry!"); + DH.dialogue_popup(DH.lk("swap", 0)); + } else { + //DH.dialogue_popup("Young could not muster the strength to use the swap here."); + DH.dialogue_popup(DH.lk("swap", 2)); + } + return; + } + + if(state==s_idle){ + state=s_ready; + selector.visible=true; + } else if(state==s_ready){ + selected.visible=true; + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + selected.x=selector.x; + selected.y=selector.y; + state=s_transforming; + } else if(state==s_transforming){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + + var _x:Int=(selected.x - g_off.x)/ 16; + var _y:Int=(selected.y - g_off.y)/ 16; + + var tt1:Int=map.getTile(_x, _y); + + var _x2:Int=(selector.x - g_off.x)/ 16; + var _y2:Int=(selector.y - g_off.y)/ 16; + + var tt2:Int=map.getTile(_x2, _y2); + + //Switch tiles + + //trace("tt1:", tt1, _x, _y); + //trace("tt2:", tt2, _x2, _y2); + + map.setTile(_x, _y, tt2); + map.setTile(_x2, _y2, tt1); + + state=s_ready; + selected.visible=false; + + } + } + /** + * Updates grid coords if needed, also the current map buffer + */ + public function reset_next():Void { + state=s_idle; + selected.visible=selector.visible=false; + if(Registry.is_playstate){ + is_playstate=true; + g_off.x=Registry.CURRENT_GRID_X * 160; + g_off.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + } else { + g_off.x=0; + g_off.y=Registry.HEADER_HEIGHT; + } + map=parent.curMapBuf; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/extension/JoyQuery/Joystick.hx b/AIR/intra/hsrc/extension/JoyQuery/Joystick.hx new file mode 100644 index 0000000..159f9d7 --- /dev/null +++ b/AIR/intra/hsrc/extension/JoyQuery/Joystick.hx @@ -0,0 +1,240 @@ +/* +JoyQuery ActionScript 3.0 Class Version:1 + +(C)2011 Alexander O'Mara + +The following line must be added to the AIR Application XML +descriptor file between the root("application")tags: +extendedDesktop +Additionally, for release, the Joy Query executable must be +included in the installer and published as a native installer. + +This class file is designed to be used with AIR to give +Native Windows AIR applications a set of APIs to Interface +with joystick input through the JoyQuery extension. This +class file is free software. You may copy, edit, reuse, and +redistribute this class freely provided that altered versions +are not distrubuted as the original. + +This class file is provided "as is" without warranty of any +kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and +fitness for a particular purpose. In no event will the +author of this program be liable for any damages of any kind. +*/ +package extension.JoyQuery; + +import flash.filesystem.File; +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.ProgressEvent; +import flash.events.NativeProcessExitEvent; + +class Joystick extends Dynamic +{ + private var capable:Array; + private var inputStatus:Array; + private var isRunning:Bool; + private var ready:Bool; + private var total:Float; + private var callerObject:Dynamic; + private var extensionPath:File; + private var process:NativeProcess; + public var exists:Bool=false; + + public function new(mainWindowObject:Dynamic, joystickExtensionPath:String):Void + { + callerObject=mainWindowObject; + var file:File=File.applicationDirectory; + extensionPath=file.resolvePath(joystickExtensionPath); + exists=true; + } + //Main handler for the extension. + private function main(command:String):Void + { + //Process info. + var processInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + processInfo.executable=extensionPath; + + //Process arguments. + var commandSplit:Array=command.split(" "); + var args:Array=new Array(); + for(i in 0...commandSplit.length) + { + args.push(commandSplit[i]); + } + processInfo.arguments=args; + + //Create process. + process=new NativeProcess(); + process.start(processInfo); + + //Listen for program to close. + process.addEventListener(NativeProcessExitEvent.EXIT, onExit); + function onExit(e:NativeProcessExitEvent):Void + { + capable=null; + inputStatus=null; + ready=false; + total=0; + } + //Listen for output. + process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); + function onOutputData(e:ProgressEvent):Void + { + //Check if not running. + if(!isRunning) + { + return; + } + try { + //Get STD:OUT. + var input:String=process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable); + //Check that the extension is giving state output. + if(input.split(":")[0] !="S") + { + ready=true; + return; + } + + //Array for joystick string. + var inputArray:Array=input.split(":")[1].split("|"); + + //Split up axis positions and button states for axis. + var loc_inputStatus:Array=new Array(inputArray.length); + for(i in 0...inputArray.length) + { + loc_inputStatus[i]=inputArray[i].split("~"); + } + //Set total joysticks. + if(inputArray[0]=="none") + { + total=0; + } + else + { + total=loc_inputStatus.length; + } + + //Index each axis and button. + for(i=0;i=new Array(total); + for(i=0;i=new Array(3, true); + symlink[0]='Resources'; + symlink[1]=framework_dir.name.substr(0, framework_dir.name.length-framework_dir.extension.length-1); + symlink[2]='Versions/Current'; + var fileToFix:Int=symlink.length, + fileFixed:Int=0, + fileFailed:Int=0; + symlink.every( + function(item:String, index:Int, a:Array):Bool { + var f:File=framework_dir.resolvePath(item); + if(!f.isSymbolicLink){ + var fs:FileStream=new FileStream(); + fs.open(f, FileMode.READ); + var lnk:String=fs.readUTFBytes(fs.bytesAvailable); + fs.close(); + var nativeProcessStartupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + nativeProcessStartupInfo.executable=new File('/bin/ln'); + nativeProcessStartupInfo.workingDirectory=f.parent; + nativeProcessStartupInfo.arguments=new Array(3, true); + nativeProcessStartupInfo.arguments[0]="-Fs"; + nativeProcessStartupInfo.arguments[1]=lnk; + nativeProcessStartupInfo.arguments[2]=f.name; + + + var process:NativeProcess=new NativeProcess(); + process.start(nativeProcessStartupInfo); + //process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, callback_output); + process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, callback_error); + process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, callback_ioerror); + process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, callback_ioerror); + process.addEventListener( + NativeProcessExitEvent.EXIT, + function(event:NativeProcessExitEvent):Void { + if(event.exitCode==0) + fileFixed++; + else + fileFailed++ + + if(fileFixed+fileFailed==fileToFix){ + if(fileFailed==0){ + trace('ANE '+extensionID+' fixed.'); + } else { + trace('Unable to fix ANE ' + extensionID + '!'); + } + if(onExit !=null){ + trace("Nope! 133"); + onExit(extensionID, fileFailed==0); + } + } + } + ); + } else { + trace("A file fixed.? 146"); + fileFixed++; + } + return true; + } + ); + if(fileFixed==3){ + if(onExit !=null){ + onExit(extensionID, true); + } + } + trace("Exiting:150"); + return true; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/Achievements.hx b/AIR/intra/hsrc/helper/Achievements.hx new file mode 100644 index 0000000..1579bd5 --- /dev/null +++ b/AIR/intra/hsrc/helper/Achievements.hx @@ -0,0 +1,253 @@ +package helper +{ +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; +import flash.desktop.NativeApplication; +import flash.utils.ByteArray; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGame; +class Achievements +{ + + private static var IS_NEWGROUNDS:Bool=false; + public static var IS_KONG:Bool=false; + public static var KONG_LOADED:Bool=false; + public static var IS_STEAM:Bool=true; + + public static inline var Card_1:Int=0; + public static inline var Card_7:Int=1; + public static inline var Extra_health_1:Int=2; + public static inline var Fast_fields:Int=3; + public static inline var No_damage_sunguy:Int=4; + public static inline var Trophy_1:Int=5; + public static inline var Greenlit:Int=6; + public static inline var Website:Int=7; + + public static inline var A_GET_BROOM:Int=8; + public static inline var A_GET_WINDMILL_CARD:Int=9; + public static inline var A_DEFEAT_BRIAR:Int=10; + + public static inline var A_100_PERCENT_ANY_TIME:Int=11; + public static inline var A_200_PERCENT:Int=12; + public static inline var A_GET_RED_CUBE:Int=13; + public static inline var A_GET_GREEN_CUBE:Int=14; + public static inline var A_GET_BLUE_CUBE:Int=15; + public static inline var A_GET_BW_CUBES:Int=16; + public static inline var A_CONSOLE:Int=17; + public static inline var A_GET_GOLDEN_POO:Int=18; + public static inline var A_GET_48_CARDS:Int=19; + public static inline var A_GET_49TH_CARD:Int=20; + + public static inline var A_ENDING_SUB_15_M:Int=21; + public static inline var A_100_PERCENT_SUB_3_HR:Int=22; + + public static inline var achvname:Dynamic={ 8:"broom", 9:"windmill", 10:"briar", + 11:"100" , 12:"200" , 13:"red", 14:"green", 15:"blue", 16:"bw", + 17:"console", 18:"poo", 19:"48", 20:"49", 21:"fast", 22:"100fast"}; + + public static var Steamworks:FRESteamWorks; + + private static var did_init:Bool=false; + public static var DEBUG_TEXT:String=""; + + public static function init(root:Dynamic):Void { + if(did_init)return; + did_init=true; + + } + + public static function kong_loaded():Void { + KONG_LOADED=true; + } + + public static function init_steam():Void { + DEBUG_TEXT +="In Init Steam\n"; + if(IS_STEAM && Steamworks==null){ + if(Intra.IS_LINUX){ + //return; + } + DEBUG_TEXT +="LOADING STEAM\n"; + Steamworks=new FRESteamWorks(); + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + if(Steamworks.init()){ + if(Steamworks.isReady){ + if(false==Intra.IS_LINUX){ + Steamworks.setCloudEnabledForApp(true); + } + DEBUG_TEXT +="STEAM LOADED\n"; + } + //DEBUG_TEXT=DEBUG_TEXT + "atest:" + Steamworks.setAchievement("ACH_WIN_ONE_GAME").toString()+ "\n"; + //Steamworks.clearAchievement("ACH_WIN_ONE_GAME"); + //Steamworks.setStatFloat('FeetTraveled', 42.42); + //Steamworks.storeStats(); + //DEBUG_TEXT=DEBUG_TEXT + Steamworks.getStatFloat('FeetTraveled').toString()+ "\n"; + // + + } else { + DEBUG_TEXT +="FAILED\n"; + } + } + } + + public static function get_completion_rate():Int { + + // 36 Cards(+2)=72 + // 10 health ups(+1)=10 + // 4 broom upgrades(+4)=16 + // Jump shoes(+2)=2 + + // 12 Cards + // 13 weird items - all + 5 + + var rate:Int=0; + + for(i in 0...48){ + if(Registry.card_states[i]==1){ + if(i<36){ + rate +=2; + } else { + rate +=4; + } + } + } + + rate +=(Registry.MAX_HEALTH - 6); + + if(Registry.inventory[Registry.IDX_BROOM])rate +=4; + if(Registry.inventory[Registry.IDX_WIDEN])rate +=4; + if(Registry.inventory[Registry.IDX_LENGTHEN])rate +=4; + if(Registry.inventory[Registry.IDX_TRANSFORMER])rate +=4; + + if(Registry.inventory[Registry.IDX_JUMP])rate +=2; + + for(i=11;i<=Registry.IDX_WHITE;i++){ + if(Registry.inventory[i]){ + rate +=4; + } + } + + Achievements.DEBUG_TEXT +=rate.toString()+ "\n"; + return rate; + } + + public static function set_steam_achievements():Void { + if(IS_STEAM && Steamworks !=null && Steamworks.isReady){ + trace("Steam achievement state:", Registry.achivement_state); + for(i in 8...23){ + if(Registry.achivement_state[i]){ + Steamworks.setAchievement(achvname[i]); + } + } + } + } + + public static function writeFileToCloud(fileName:String, data:Dynamic):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeObject(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public static function readFileFromCloud(fileName:String):Dynamic { + var dataIn:ByteArray=new ByteArray(); + var dataOut:Dynamic=new Dynamic(); + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + DEBUG_TEXT +=dataIn.length.toString(); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + return dataIn.readObject(); + } + return null; + } + + + public static function is_100_percent():Bool { + if(Registry.MAX_HEALTH>=16 && Registry.inventory[Registry.IDX_TRANSFORMER] && Registry.inventory[Registry.IDX_WIDEN] && Registry.inventory[Registry.IDX_LENGTHEN] && Registry.nr_growths>=37){ + Achievements.unlock(Achievements.A_100_PERCENT_ANY_TIME); + if(Registry.playtime<3 * 60 * 60){ + Achievements.unlock(Achievements.A_100_PERCENT_SUB_3_HR); + } + return true; + } + return false; + } + + public static function is_200_percent():Bool { + var a:Array=Registry.inventory; + if(is_100_percent()&& Registry.nr_growths>=49 && a[Registry.IDX_BLUE] && a[Registry.IDX_GREEN] && a[Registry.IDX_RED] && a[Registry.IDX_BLACK] && a[Registry.IDX_WHITE] && a[Registry.IDX_KITTY] && a[Registry.IDX_POO] && a[Registry.IDX_AUS_HEART] && a[Registry.IDX_ELECTRIC] && a[Registry.IDX_MARINA] && a[Registry.IDX_MELOS] && a[Registry.IDX_MISSINGNO] && a[Registry.IDX_SPAM]){ + Achievements.unlock(Achievements.A_200_PERCENT); + return true; + } + return false; + } + + public static function onSteamResponse(e:SteamEvent):Void { + //Achievements.DEBUG_TEXT=DEBUG_TEXT + "STEAMresponse type:" + e.req_type + " response:" + e.response + "\n"; + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsStored:" + e.response + "\n"; + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsReceived:" + e.response + "\n"; + break; + case SteamConstants.RESPONSE_OnAchievementStored: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnAchievementStored:" + e.response + "\n"; + break; + case 3: + //case SteamConstants.RESPONSE_OnGameOverlayActivated: + //FlxGame.HARD_PAUSED=!FlxGame.HARD_PAUSED;// This is probably not the right hting to do. + break; + default: + } + } + + + + public static function unlock_all():Void { + for(i in 8...23){ + unlock(i); + } + } + public static function unlock(id:Int):Void { + if(!IS_STEAM && false==Intra.is_web)return; + + if(IS_STEAM){ + trace("Achievement:", id, achvname[id]); + + + if(Steamworks !=null && Steamworks.isReady){ + switch(id){ + case A_GET_BROOM://** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_GET_WINDMILL_CARD://** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_100_PERCENT_ANY_TIME:// ** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_100_PERCENT_SUB_3_HR:// ** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_GET_48_CARDS:// + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + } + } + } + + + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/Cutscene.hx b/AIR/intra/hsrc/helper/Cutscene.hx new file mode 100644 index 0000000..8849ac1 --- /dev/null +++ b/AIR/intra/hsrc/helper/Cutscene.hx @@ -0,0 +1,467 @@ +package helper +{ +import data.Common_Sprites; +import data.CSV_Data; +import data.TileData; +import entity.decoration.Solid_Sprite; +import entity.interactive.Dungeon_Statue; +import entity.interactive.Terminal_Gate; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTileblock; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import states.PushableFlxState; +class Cutscene extends PushableFlxState +{ + /* Cutscene types */ + public static inline var Red_Cave_Left:Int=0; + public static inline var Red_Cave_Right:Int=1; + public static inline var Red_Cave_North:Int=2; + public static inline var Terminal_Gate_Bedroom:Int=3; + public static inline var Terminal_Gate_Redcave:Int=4; + public static inline var Terminal_Gate_Crowd:Int=5; + public static inline var Windmill_Opening:Int=6; + + // pointers to functions for transitioning in and out of the cutscene + private var transition_in:Function; + private var transition_out:Function; + private var step_cutscene:Function; + + // parameters you set that will be used in the above functions + private var tran_in_args:Array=new Array(1, 2); + private var tran_out_args:Array=new Array(3, 4); + + public static inline var s_transition_in:Int=-1; + public static inline var s_in_progress:Int=0; + public static inline var s_transition_out:Int=2; + public static inline var s_done:Int=3; + public var state:Int=-1; + + public var timer:Float; + public var timer_max:Float; + public var pushdown:Int=0; + public var pushee:FlxSprite; + + public var entity_1:FlxSprite; + public var entity_2:FlxSprite; + public var entity_3:FlxSprite; + + private var ctr_cutscene:Int=0; + + private var _parent:Dynamic; + + + public var scene_1:FlxTilemap; + public var scene_2:FlxTilemap; + public var scene_3:FlxTilemap; + + public var fade:FlxSprite; + + public function new(v_parent:Dynamic){ + _parent=v_parent; + create(); + } + + + /* Initialize the entities with each cutscene */ + override public function create():Void + { + transition_in=do_nothing; + transition_out=do_nothing; + switch(Registry.CURRENT_CUTSCENE){ + case Red_Cave_Left: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_left(); + //Load the sprites and store 'em + //Pick a section of map to load from the right map and load it + break; + case Red_Cave_North: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_north(); + break; + case Red_Cave_Right: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_right(); + break; + case Terminal_Gate_Bedroom: + case Terminal_Gate_Crowd: + case Terminal_Gate_Redcave: + transition_in=terminal_gate_in; + transition_out=terminal_gate_out; + step_cutscene=step_terminal_gate; + inst_terminal_gate(); + + break; + case Windmill_Opening: + transition_in=windmill_in; + transition_out=windmill_out; + step_cutscene=step_windmill_opening; + inst_windmill(); + break; + } + } + + override public function update():Void + { + if(state==s_transition_in){ + transition_in.apply(null, tran_in_args); + } else if(state==s_in_progress){ + step_cutscene(); + } else if(state==s_transition_out){ + transition_out.apply(null, tran_out_args); + } else if(state==s_done){ + + } + super.update(); + } + + public function do_nothing():Void { + + } + + private function windmill_in(a:Int, b:Int):Void { + state=s_in_progress; + } + private function windmill_out(a:Int, b:Int):Void { + state=s_done; + } + private function step_windmill_opening():Void { + + switch(ctr_cutscene){ + case 0: + Registry.volume_scale -=0.01; + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + if(Registry.volume_scale<=0){ + Registry.volume_scale=0; + Registry.sound_data.wb_tap_ground.play(); + ctr_cutscene +=2; + } else { + Registry.volume_scale=0; + } + break; + case 1: + break; + case 2: + ctr_cutscene++; + fade.exists=true; + fade.alpha=0; + break; + case 3: + fade.alpha +=0.01; + if(fade.alpha==1){ + ctr_cutscene++; + entity_1.exists=scene_1.exists=true; + } + break; + case 4:// Move bedroom satue + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_1, "y", 20, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 5: + fade.alpha +=0.01; + if(fade.alpha==1){ + entity_1.exists=scene_1.exists=false; + entity_2.exists=scene_2.exists=true; + ctr_cutscene++; + } + break; + case 6:// move red stat + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_2, "x", 4 * 16 + 32, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 7: + fade.alpha +=0.01; + if(fade.alpha==1){ + entity_2.exists=scene_2.exists=false; + entity_3.exists=scene_3.exists=true; + ctr_cutscene++; + } + break; + case 8:// move blue stat + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_3, "x", 4 * 16 + 32, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 9: + fade.alpha +=0.01; + if(fade.alpha==1){ + ctr_cutscene++; + entity_3.exists=scene_3.exists=false; + } + break; + case 10: + fade.alpha -=0.01; + if(Registry.volume_scale<1){ + Registry.volume_scale +=0.01; + } else { + Registry.volume_scale=1; + } + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + if(fade.alpha==0 && Registry.volume_scale==1){ + state=s_transition_out; + Registry.sound_data.start_song_from_title("WINDMILL"); + } + break; + + } + } + + private function red_out(a:Int, b:Int):Void { + state=s_done; + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Red_Cave_Left: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Left]=1;break; + case Cutscene.Red_Cave_Right: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Right]=1;break; + case Cutscene.Red_Cave_North: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_North]=1;break; + } + } + + private function red_in(a:Int, b:Int):Void { + state=s_in_progress; + Registry.sound_data.red_cave_rise.play(); + } + + private function step_red_cave():Void { + //perform the rise effect. + if(ctr_cutscene==0){ + timer -=FlxG.elapsed; + if(timer<0){ + pushdown--; + pushee.framePixels_y_push=pushdown; + + timer=timer_max; + FlxG.shake(0.05); + if(pushdown==0){ + ctr_cutscene=1; + timer=1.5; + } + } + } else if(ctr_cutscene==1){ + timer -=FlxG.elapsed; + if(timer<0){ + ctr_cutscene++; + } + } else { + state=s_transition_out; + } + } + + + private function terminal_gate_out(a:Int, b:Int):Void { + state=s_done; + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Terminal_Gate_Bedroom: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]=1; + break; + case Cutscene.Terminal_Gate_Redcave: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Redcave]=1; + break; + case Cutscene.Terminal_Gate_Crowd: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]=1; + break; + } + } + + private function terminal_gate_in(a:Int, b:Int):Void { + state=s_in_progress; + + } + + private function step_terminal_gate():Void { + var tg:Terminal_Gate=cast(entity_1, Terminal_Gate); + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Terminal_Gate_Bedroom: + tg.gate_bedroom.alpha -=0.005; + if(tg.gate_bedroom.alpha==0){ + state=s_transition_out; + } + break; + case Cutscene.Terminal_Gate_Redcave: + tg.gate_redcave.alpha -=0.005; + if(tg.gate_redcave.alpha==0){ + state=s_transition_out; + } + break; + case Cutscene.Terminal_Gate_Crowd: + tg.gate_crowd.alpha -=0.005; + if(tg.gate_crowd.alpha==0){ + state=s_transition_out; + } + break; + + } + } + /** + * loads a cutscenes view + * @param map_name The name of the map + * @param tileset the reference to the embedded tileste + * @param gx the top left grid coordinate of the view. + * @param gy see gx + * @param w width of the view in tiles + * @param h height ... + * @param off_gx grid offset for the view to start. + * @param off_gy see off_gx + * @return the requested tilemap for viewin'. + */ + public function load_cutscene_view(map_name:String, tileset:Class, gx:Int,gy:Int, w:Int=10,h:Int=10,off_gx:Int=0,off_gy:Int=0):FlxTilemap { + var CSV:String=CSV_Data.getMap(map_name); + var tilemap:FlxTilemap=new FlxTilemap(); + tilemap.loadMap(CSV, tileset, 16, 16); + var submap_data:Array=new Array(); + for(var i:Int=0;i; +import flash.utils.describeType; +import global.Registry; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import states.DialogueState; + +/** + * Dialogue Helper(DH) + * Contains helper functions to query the Dialogue state object + */ + +class DH +{ + // A copy of the raw dialogue state. Used for updating + // Dialogue state in patches + public static var RAW_DIALOGUE_STATE:Dynamic; + + public static inline var name_card:String="card"; + public static inline var name_arthur:String="arthur"; + public static inline var name_briar:String="briar"; + public static inline var name_javiera:String="javiera"; + public static inline var name_mitra:String="mitra"; + public static inline var name_sage:String="sage"; + public static inline var name_statue:String="statue"; + public static inline var name_test:String="test"; + public static inline var name_sun_guy:String="sun_guy"; + public static inline var name_rock:String="rock"; + public static inline var name_sadbro:String="sadbro"; + public static inline var name_dungeon_statue:String="dungeon_statue"; + public static inline var name_splitboss:String="splitboss"; + public static inline var name_wallboss:String="wallboss"; + public static inline var name_eyeboss:String="eyeboss"; + public static inline var name_redboss:String="redboss"; + public static inline var name_circus_folks:String="circus_folks"; + public static inline var name_suburb_walker:String="suburb_walker"; + public static inline var name_suburb_blocker:String="suburb_blocker"; + public static inline var name_cube_king:String="cube_king"; + public static inline var name_cliff_dog:String="cliff_dog"; + public static inline var name_generic_npc:String="generic_npc"; + public static inline var name_forest_npc:String="forest_npc"; + public static inline var name_geoms:String="geoms"; + public static inline var name_miao:String="miao"; + public static inline var name_shopkeeper:String="shopkeeper"; + public static inline var name_goldman:String="goldman"; + public static inline var name_happy_npc:String="happy_npc"; + + // For card popups, treasure dialogs + public static var area_etc:String="ETC"; + + + + public static var scene_arthur_circus_alone:String="alone"; + + public static var scene_briar_go_before_fight:String="before_fight"; + public static var scene_briar_go_after_fight:String="after_fight"; + + + public static var scene_card_one:String="one"; + + public static var scene_cliff_dog_top_left:String="top_left"; + + public static var scene_dungeon_statue_bedroom_one:String="one"; + public static var scene_dungeon_statue_bedroom_two:String="two"; + + public static var scene_forest_npc_bunny:String="bunny"; + public static var scene_forest_npc_thorax:String="thorax"; + + public static var scene_snowman_one:String="one"; + + public static var scene_goldman_etc:String="etc"; + public static var scene_goldman_inside:String="inside"; + public static var scene_goldman_outside:String="outside"; + + public static var scene_generic_npc_any_quest_normal:String="quest_normal"; + public static var scene_generic_npc_any_second:String="second"; + public static var scene_generic_npc_any_first:String="first"; + public static var scene_generic_npc_any_quest_event:String="quest_event"; + public static var scene_generic_npc_any_easter_egg:String="easter_egg"; + public static var scene_rank_bush:String="bush"; + + public static var scene_happy_npc_beautiful:String="beautiful"; + public static var scene_happy_npc_drink:String="drink"; + public static var scene_happy_npc_hot:String="hot"; + public static var scene_happy_npc_dump:String="dump"; + public static var scene_happy_npc_gold:String="gold"; + public static var scene_happy_npc_briar:String="briar"; + + public static var scene_javiera_circus_alone:String="alone"; + + public static var scene_miao_init:String="init"; + public static var scene_miao_randoms:String="randoms"; + public static var scene_miao_philosophy:String="philosophy"; + + public static var scene_mitra_overworld_initial_overworld:String="initial_overworld"; + public static var scene_mitra_blue_one:String="one"; + public static var scene_mitra_fields_init:String="init"; + public static var scene_mitra_fields_game_hints:String="game_hints"; + public static var scene_mitra_fields_card_hints:String="card_hints"; + public static var scene_mitra_fields_general_banter:String="general_banter"; + public static var scene_mitra_fields_quest_event:String="quest_event"; + + public static var scene_rock_one:String="one"; + public static var scene_rock_two:String="two"; + public static var scene_rock_three:String="three"; + public static var scene_rock_four:String="four"; + public static var scene_rock_five:String="five"; + public static var scene_rock_six:String="six"; + + public static var scene_shopkeeper_init:String="init"; + + public static var scene_suburb_walker_words_adult:String="words_adult"; + public static var scene_suburb_walker_words_teen:String="words_teen"; + public static var scene_suburb_walker_words_kid:String="words_kid"; + public static var scene_suburb_walker_family:String="family"; + public static var scene_suburb_walker_hanged:String="hanged"; + public static var scene_suburb_walker_festive:String="festive"; + public static var scene_suburb_walker_paranoid:String="paranoid"; + public static var scene_suburb_walker_dead:String="dead"; + public static var scene_suburb_walker_older_kid:String="older_kid"; + + public static inline var scene_suburb_blocker_one:String="one"; + + public static var scene_sadbro_overworld_initial_forced:String="initial_forced"; + public static var scene_sadbro_overworld_bedroom_done:String="bedroom_done"; + public static var scene_sadbro_overworld_bedroom_not_done:String="bedroom_not_done"; + + public static var scene_sage_blank_intro:String="intro"; + public static var scene_sage_nexus_enter_nexus:String="enter_nexus"; + public static var scene_sage_nexus_after_ent_str:String="after_ent_str"; + public static var scene_sage_nexus_after_bed:String="after_bed"; + public static var scene_sage_nexus_before_windmill:String="before_windmill"; + public static var scene_sage_nexus_after_windmill:String="after_windmill"; + public static var scene_sage_nexus_all_card_first:String="all_card_first"; + public static var scene_sage_overworld_bedroom_entrance:String="bedroom_entrance"; + public static var scene_sage_bedroom_after_boss:String="after_boss"; + public static var scene_sage_redcave_one:String="one"; + public static var scene_sage_crowd_one:String="one"; + public static var scene_sage_terminal_before_fight:String="before_fight"; + public static var scene_sage_terminal_after_fight:String="after_fight"; + public static var scene_sage_terminal_entrance:String="entrance"; + public static var scene_sage_terminal_etc:String="etc"; + public static var scene_sage_happy_posthappy_sage:String="posthappy_sage"; + public static var scene_sage_happy_posthappy_mitra:String="posthappy_mitra"; + + public static var scene_splitboss_before_fight:String="before_fight"; + public static var scene_splitboss_after_fight:String="after_fight"; + + public static var scene_redboss_before_fight:String="before_fight"; + public static var scene_redboss_after_fight:String="after_fight"; + + public static var scene_eyeboss_before_fight:String="before_fight"; + public static var scene_eyeboss_after_fight:String="after_fight"; + + public static var scene_wallboss_before_fight:String="before_fight"; + public static var scene_wallboss_after_fight:String="after_fight"; + + public static var scene_circus_folks_before_fight:String="before_fight"; + public static var scene_circus_folks_after_fight:String="after_fight"; + + public static var scene_sun_guy_before_fight:String="before_fight"; + public static var scene_sun_guy_after_fight:String="after_fight"; + + public static var scene_statue_nexus_enter_nexus:String="enter_nexus"; + public static var scene_statue_bedroom_after_boss:String="after_boss"; + public static var scene_statue_overworld_bedroom_entrance:String="bedroom_entrance"; + + public static var scene_cube_king_space_color:String="color"; + public static var scene_cube_king_space_gray:String="gray"; + + public static var scene_geoms_space_color:String="color"; + public static var scene_geoms_space_gray:String="gray"; + + + public static var scene_test_debug_scene_1:String="scene_1"; + + private static var property_resettable:String="does_reset"; + + private static var scenes_to_reset_on_map_change:Array=new Array(); + private static var current_active_scene:Dynamic; + private static var current_active_dialogue:Array; + /** + * Whether or not a chunk of dialogue has finished playing. Reset whenever + * a new chunk is fetched. + */ + private static var recently_finished_chunk:Bool=false; + private static var chunk_is_playing:Bool=false; + private static var most_recently_played_chunk_pos:Int; + + + /** + * Start a dialogue popup given the parameters. Increments the chosen scene's pos parameter, + * or loops it to its loop point. Marks this scene as dirty(i.e., "read at least once"). + * @param name The name of the npc. Use constants in DH.as when you can - DH.name_sage, etc. + * @param scene The name of the scene. Use constants in DH.as when you can - DH.scene_sage_blank_intro, etc. + * @param area What map this occurs in. Defaults to current player's map. + * @param pos which dialogue to show. If -1, reads the next one and increments the position state. Otherwise returns the requested chunk + * @param has_alternate Whether this NPC has altenrate text based on state from helper.S_NPC.as + * @return true on success(read a dialogue chunk), crash the game otherwise + */ + public static function start_dialogue(name:String, scene:String, _area:String="", pos:Int=-1,has_alternate:Bool=false):Bool { + if(true==a_chunk_is_playing()||(Registry.GAMESTATE !=null && Registry.GAMESTATE.dialogue_latency>0)){ + return false; + } + recently_finished_chunk=false; + + // Maybe get an alternate text. + if(has_alternate==true){ + // S_NPC.something... + } + // Grab the area of the dialogue to take place + var area:String=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + + // Grab the scene associated with this area + var cur_scene_state:Dynamic=Registry.DIALOGUE_STATE[name][area][scene]; + var cur_scene_dialogue:Array=Registry.DIALOGUE[name][area][scene].dialogue; + cur_scene_state.dirty=true; + + // Make the box at top or bottom + if(cur_scene_state.hasOwnProperty("top")){ + DialogueState.set_dialogue_box_align(FlxObject.UP); + } else { + DialogueState.set_dialogue_box_align(FlxObject.DOWN); + } + + + // Grab the dialogue chunk, if we hit the end, loop, otherwise increment position counter + if(pos==-1){ + most_recently_played_chunk_pos=cur_scene_state.pos; + Registry.cur_dialogue=cur_scene_dialogue[cur_scene_state.pos]; + if(cur_scene_state.pos==cur_scene_dialogue.length - 1){ + cur_scene_state.pos=cur_scene_state.loop; + } else { + cur_scene_state.pos++; + } + } else { + most_recently_played_chunk_pos=pos; + Registry.cur_dialogue=cur_scene_dialogue[pos]; + } + + + + // If resettable, add its reference to list of references to reset dialogue position on map change + if(Registry.DIALOGUE_STATE[name].hasOwnProperty(property_resettable)&& Registry.DIALOGUE_STATE[name][property_resettable]){ + scenes_to_reset_on_map_change.push(cur_scene_state); + } + + + if(Registry.GAMESTATE !=null){ + Registry.GAMESTATE.load_dialogue=true; + } + current_active_scene=cur_scene_state; + current_active_dialogue=cur_scene_dialogue; + chunk_is_playing=true; + return true; + } + + public static function dialogue_popup_misc_any(scene:String, pos:Int):Void { + dialogue_popup(DH.lookup_string("misc", "any", scene, pos)); + } + /** + * Make a dialogue popup with 'words'. + * @param words + */ + public static function dialogue_popup(words:String):Void { + Registry.cur_dialogue=words; + Registry.GAMESTATE.load_dialogue=true; + + } + /** + * Get the dialogue position in a given scene. + * @param name + * @param scene + * @param _area + * @return an Integer>=0 denoting the position, or -1 if not found + */ + public static function get_scene_position(name:String, scene:String, _area:String=""):Int { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].pos; + } + + /** + * Check if the scene had any dialogue started at any point in time. Useful if you don't want to add in + * another boolean to wherever the dialogue is being played from, and the call originally sits in a block + * that is iterated over. + * @param name + * @param scene + * @param _area + * @return + */ + public static function scene_is_dirty(name:String, scene:String, _area:String=""):Bool { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].dirty; + } + + /** + * Check if the scene has finished completely. Useful for say, boss Intro dialogue which blocks scripting of an Intro sequence + * @param name + * @param scene + * @param _area + * @return + */ + public static function scene_is_finished(name:String, scene:String, _area:String=""):Bool { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].finished; + } + + /** + * Updates current scene to be "finished" if all dialogue is played from that scene. + * Also sets "recently_finished_chunk" to true, and "chunk_is_playing" to false; + */ + public static function update_current_scene_on_chunk_finish():Void { + if(current_active_scene==null)return; + if(most_recently_played_chunk_pos==current_active_dialogue.length - 1){ + current_active_scene.finished=true; + } + current_active_dialogue=null; + current_active_scene=null; + recently_finished_chunk=true; + chunk_is_playing=false; + } + + public static function get_scene_length(name:String, scene:String, _area:String=""):Int { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + + return Registry.DIALOGUE[name][_area][scene].dialogue.length; + } + /** + * Called when transitioning out of a Roam or Playstate. + */ + public static function reset_scenes_on_map_change():Void { + while(scenes_to_reset_on_map_change.length>0){ + var scene:Dynamic=scenes_to_reset_on_map_change.pop()as Dynamic; + scene.pos=0; + } + } + + public static function a_chunk_just_finished():Bool { + if(recently_finished_chunk){ + recently_finished_chunk=false; + return true; + } + return false; + } + public static function dont_need_recently_finished():Void { + recently_finished_chunk=false; + } + + public static function a_chunk_is_playing():Bool { + return chunk_is_playing; + } + + /** + * Fill Registry.DIALOGUE with all the game's dialogue, make a copy of the initial dialogue state + * Into Registry.DIALOGUE_STATE + */ + public static function init_dialogue_state(only_change_dialogue:Bool=false):Void { + + Registry.DIALOGUE={ }; + var varList:XMLList=null; + if(language_type==LANG_ja){ + + varList=describeType(NPC_Data_JP)..variable; + } else if(language_type==LANG_ko){ + varList=describeType(NPC_Data_KR)..variable; + } else if(language_type==LANG_es){ + varList=describeType(NPC_Data_ES)..variable; + } else if(language_type==LANG_it){ + varList=describeType(NPC_Data_IT)..variable; + } else if(language_type==LANG_pt){ + varList=describeType(NPC_Data_PT)..variable; + } else if(language_type==LANG_zhs){ + varList=describeType(NPC_Data_ZHS)..variable; + } else { + varList=describeType(NPC_Data_EN)..variable; + } + var d:Dynamic={ }; + for(var i:Int=0;i=new ByteArray(); + myBA.writeObject(d); + myBA.position=0; + // dialogue state doesnt hold any "dialogue" just state + Registry.DIALOGUE_STATE=myBA.readObject(); + myBA.position=0; + RAW_DIALOGUE_STATE=myBA.readObject(); + } + + } + + public static function isZH():Bool { + if(language_type==LANG_zhs)return true; + return false; + } + + public static var language_type:String="en"; + public static inline var LANG_en:String="en"; + public static inline var LANG_ja:String="ja"; + public static inline var LANG_ko:String="ko"; + public static inline var LANG_es:String="es"; + public static inline var LANG_pt:String="pt"; + public static inline var LANG_zhs:String="zh-CN"; + public static inline var LANG_it:String="it"; + public static function set_language(lang_string:String):Void { + if(lang_string==LANG_ja){ + trace("Japanese Language set."); + DialogueState.Max_Line_Size=18; + language_type=LANG_ja; + } else if(lang_string==LANG_ko){ + trace("Korean language set."); + DialogueState.Max_Line_Size=18; + language_type=LANG_ko; + } else if(lang_string==LANG_es){ + trace("Spanish language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_es; + } else if(lang_string==LANG_it){ + trace("Italian language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_it; + } else if(lang_string==LANG_pt){ + trace("pt-br language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_pt; + } else if(lang_string==LANG_zhs || lang_string=="zh" || lang_string=="zh-TW"){ + trace("zh-CN langage set."); + DialogueState.Max_Line_Size=13; + language_type=LANG_zhs; + } else { + trace("English Language set."); + language_type=LANG_en; + DialogueState.Max_Line_Size=21; + } + // When called a 2nd time in game or after loading or whatever + if(Registry.PLAYSTATE !=null && Registry.PLAYSTATE.dialogue_state !=null){ + Registry.PLAYSTATE.dialogue_state.create_bitmap_text(); + } + + // Change the pointer to the new object but don't update the state. + init_dialogue_state(true); + + // Update these strings after re-initializing dialogue state + if(Registry.PLAYSTATE !=null && Registry.PLAYSTATE.pause_state !=null){ + Registry.PLAYSTATE.pause_state.set_pausemenu_labels(); + } + + } + // Patches the save file's dialogue state + // with the raw dialogue state. + // Useful if we add an NPC or somethin' . + public static function patch_dialogue_state():Void { + var debug:Bool=false; + var npc_ctr:Int=0; + var area_ctr:Int=0; + var scene_ctr:Int=0; + if(debug)trace("Patching dialogue state."); + + for(npc in RAW_DIALOGUE_STATE){ + npc_ctr++; + // If the save file already has this NPC then we need to check its areas + if(Registry.DIALOGUE_STATE.hasOwnProperty(npc)){ + // Check the NPC's areas. + for(area in RAW_DIALOGUE_STATE[npc]){ + area_ctr++; + if(area=="does_reset")continue; + // Check its scenes. + if(Registry.DIALOGUE_STATE[npc].hasOwnProperty(area)){ + for(scene in RAW_DIALOGUE_STATE[npc][area]){ + scene_ctr++; + // If this scene exists, just update its loop property + if(Registry.DIALOGUE_STATE[npc][area].hasOwnProperty(scene)){ + Registry.DIALOGUE_STATE[npc][area][scene]["loop"]=RAW_DIALOGUE_STATE[npc][area][scene]["loop"] + if(RAW_DIALOGUE_STATE[npc][area][scene].hasOwnProperty("top")){ + Registry.DIALOGUE_STATE[npc][area][scene]["top"]=true; + } + } else { + if(debug)trace("New scene:" + scene + " , " + area + " , " + npc) + Registry.DIALOGUE_STATE[npc][area][scene]=RAW_DIALOGUE_STATE[npc][area][scene]; + } + } + } else { + if(debug)trace("New Area:" + area+" , "+npc); + Registry.DIALOGUE_STATE[npc][area]=RAW_DIALOGUE_STATE[npc][area]; + } + } + // Otherwise just add it in! + } else { + if(debug)trace("New NPC:" + npc); + Registry.DIALOGUE_STATE[npc]=RAW_DIALOGUE_STATE[npc]; + } + } + + if(debug)trace("And now for # of things we had to check..."); + if(debug)trace("NPCs:" + npc_ctr.toString()+ " Areas:" + area_ctr.toString()+ " scenes:" + scene_ctr.toString()); + } + + /** + * Increments an Integer property on this ENTIRE NPC by one + * Creates the property if it doesn't exist, inits to 1. + * @return 1 if property exists, 0 otherswise + */ + public static function increment_property(name:String,property:String):Int { + if(!Registry.DIALOGUE_STATE[name].hasOwnProperty(property)){ + Registry.DIALOGUE_STATE[name][property]=1; + + } else { + Registry.DIALOGUE_STATE[name][property]++; + return 1; + } + return 0; + } + + /** + * Get an Integer property of the NPC ENTIRE NPC + * @param name + * @param property + * @return + */ + public static function get_int_property(name:String, property:String):Int { + if(Registry.DIALOGUE_STATE[name].hasOwnProperty(property)){ + return Registry.DIALOGUE_STATE[name][property]; + } + return -1; + + } + + public static function enable_menu():Void { + Registry.disable_menu=false; + } + public static function disable_menu():Void { + Registry.disable_menu=true; + } + + /** + * Specify what chunk of dialogue to play next, by the "pos" var + * @param pos + * @return the new position in this scene, or -1 if current scene null + */ + + public static function set_scene_to_pos(name:String,scene:String,pos:Int):Int { + if(Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene]==null)return -1; + + Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene].pos=pos; + return pos; + } + + /** + * Set pos to the last chunk of dialogue. + * @param pos + * @return the new position in this scene, or or -1 if current scene null + */ + public static function set_scene_to_end(name:String,scene:String):Int { + if(Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene]==null)return -1; + + var new_pos:Int=Registry.DIALOGUE[name][Registry.CURRENT_MAP_NAME][scene].dialogue.length - 1; + Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene].pos=new_pos; + return new_pos; + } + + /** + * Macro:"Normal Condition" Does the conditional checks for entering a dialogue, covers 95% of cases + * @param p - player reference + * @param ar - active region of the sprites talking to + * @return whether to talk or not + */ + public static function nc(player:Player, active_region:FlxObject):Bool { + if(player.overlaps(active_region)&& DH.a_chunk_is_playing()==false && player.state==player.S_GROUND && Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + return true; + } + return false; + } + + public static function lookup_string(name:String, map:String, scene:String, pos:Int):String { + var retval:String=Registry.DIALOGUE[name][map][scene].dialogue[pos]; + return retval; + } + + public static function lk(scene:String, pos:Int):String { + var retval:String=Registry.DIALOGUE["misc"]["any"][scene].dialogue[pos]; + return retval; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/EventScripts.hx b/AIR/intra/hsrc/helper/EventScripts.hx new file mode 100644 index 0000000..084f402 --- /dev/null +++ b/AIR/intra/hsrc/helper/EventScripts.hx @@ -0,0 +1,567 @@ +package helper +{ +/** + * ... + * @author seagaia + + + */ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.enemy.etc.Briar_Boss; +import entity.player.HealthPickup; +import flash.geom.Point; +import global.Registry; +import mx.core.FlexSprite; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import org.flixel.system.FlxTile; +import states.DialogueState; +import states.PlayState; +class EventScripts extends FlxSprite +{ + + //[Embed(source="../res/sprites/enemies/enemy_explode_2.png")] public static var small_explosion_sprite:Class; + + public var xml:XML; + public var cid:Int=CLASS_ID.EVENT_SCRIPT; + public function new(){ + super(0, 0); + makeGraphic(1, 1, 0x00ffffff); + xml=; + } + public static function move_to_x_and_stop(o:FlxSprite, vel:Float, x:Float):Void { + if(vel>0 && o.x>x){ + o.velocity.x=0; + } else if(vel<0 && o.x=x)return true; + } + return false; + } + public static function check_x_zero(...args):Bool { + var next:FlxSprite; + var ret:Bool=true; + for(i in 0...args.length){ + next=args[i]; + if(next.velocity.x !=0){ + ret=false; + break; + } + } + return ret; + } + + /** + * Decreases or increases the given FlxSprite's alpha at rate to a target value. + * -rate for decrease, +rate for increase. + * @return true if the alpha reached the target value, false otherwise + */ + + + public static function send_alpha_to(o:FlxSprite, target:Float, rate:Float):Bool { + if(rate>0){ + if(o.alpha>=target)return true; + o.alpha=Math.min(1, o.alpha + rate); + } else { + if(o.alpha<=target)return true; + o.alpha=Math.max(0, o.alpha + rate); + } + return false; + } + + public static function send_property_to(o:Dynamic, property:String, target:Float, rate:Float):Bool { + if(rate<0)rate *=-1; + + if(o[property]>target){ + o[property]=Math.max(target, o[property] - rate); + } else if(o[property](1 - chance)){ + if(Registry.is_playstate){ + Registry.GAMESTATE.otherObjects.push(hp);//So we remove these on screen transition + Registry.GAMESTATE.bg_sprites.add(hp);//So these are immediately drawn + } else { + Registry.GAMESTATE.entities.push(hp); + Registry.GAMESTATE.add(hp); + } + } + } + + public static function drop_big_health(x:Int,y:Int,chance:Float):Void { + var hp:HealthPickup=new HealthPickup(x, y, HealthPickup.HP_3, Registry.GAMESTATE); + if(Math.random()>(1 - chance)){ + if(Registry.is_playstate){ + Registry.GAMESTATE.otherObjects.push(hp); + Registry.GAMESTATE.bg_sprites.add(hp); + } else { + Registry.GAMESTATE.entities.push(hp); + } + } + } + + /** + * Create an explosion sprite and add it to the current draw group. + * @param enemy The enemy that's exploding - used for deciding the explosion + */ + /* Images for explosions are embedded at the top of EventScripts.as */ + /* Sounds are managed in SoundData.as */ + public static function make_explosion_and_sound(enemy:FlxSprite,ignore:Int=0,this_parameter:Int=0):Void { + var class_name:String=FlxU.getClassName(enemy, true); + var explosion:FlxSprite=new FlxSprite(enemy.x, enemy.y); + + /* Make the explosion */ + + /* Later, load the explosion and sound based on the class name. */ + switch(class_name){ // e.g., "Dog", "Lion", "Contort" + case "Velociraptor X3000": + // load the graphic, add animation, offset the explosion, play a sound + break; + default:// Executed when there is no case statement for the enemy + + if(ignore==1){ + explosion.loadGraphic(Briar_Boss.embed_dust_explosion, true, false, 48, 48); + explosion.addAnimation("explode", [0, 1, 2, 3, 4, 5], 12, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + } else if(ignore==2){ + explosion.loadGraphic(Briar_Boss.embed_ice_explosion, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3,4], 15, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + } else if(ignore==3){ + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [5,6,7,8,9], 10, false); + explosion.x -=4; + explosion.y -=4; + + } else { + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + explosion.x -=4; + explosion.y -=4; + } + + + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + break; + } + + if(ignore>0){ + Registry.GAMESTATE.fg_sprites.add(explosion); + } else { + Registry.GAMESTATE.bg_sprites.add(explosion); + } + explosion.play("explode"); + + + /* Play sound */ + + } + public static function boss_drop_health_up(x:Int, y:Int):Void { + trace("Boss dropping health up"); + var hp:HealthPickup=new HealthPickup(x, y, HealthPickup.HP_EXTEND,Registry.GAMESTATE); + hp.xml=fake_xml("HealthPickup", x.toString(), y.toString(), HealthPickup.HP_EXTEND.toString(), "true", "2"); + Registry.GAMESTATE.stateful_gridXML.appendChild(hp.xml); + Registry.GAMESTATE.bg_sprites.add(hp); + } + + /** + * Create a fake xml to be used for some sprite that wasnte + * exported with dame + * @param name name of the node + * @param x x value + * @param y y value + * @param type_attr value of "type" if relevant + * @return the new xml objet + */ + public static function fake_xml(name:String,x:String,y:String,type_attr:String="",alive:String="true",p:String="0",frame:String="0"):XML { + var xml:XML=; + trace(xml.toXMLString()); + xml.setName(name); + xml.@p=p; + xml.@["x"]=x; + xml.@y=y; + xml.@frame=frame; + xml.@alive=alive; + xml.@type=type_attr; + trace(xml.toXMLString()); + + return xml; + + } + + + /** + * Rotates ROTATEE about PIVOT's top-left pt with offset(off_x,off_y), + * at some velocity(per game tick), at a radius of...radius! + * + * ROTATEE NEEDS A rotate_angle PROPERTY. + */ + public static function rotate_about_center_of_sprite(pivot:FlxSprite,rotatee:Dynamic,radius:Float,velocity:Float,off_x:Int=-8,off_y:Int=-5):Void { + var pivot_x:Float=pivot.x + pivot.width / 2; + var pivot_y:Float=pivot.y + pivot.height / 2; + + + rotatee.x=Math.cos(rotatee.rotate_angle)*(radius)+ pivot_x + off_x; + rotatee.y=Math.sin(rotatee.rotate_angle)*(radius)+ pivot_y + off_y; + rotatee.rotate_angle=(rotatee.rotate_angle + velocity)% 6.28; + } + + /** + * Gives the angle swept from the x axis to((x1,y1),(x2,y2))by treating x1,y1 as the origin + * */ + + public static function get_angle(x1:Float, y1:Float, x2:Float, y2:Float):Float { + + var x:Float=x2 - x1; + var y:Float=y2 - y1; + return Math.atan2(y, x); + } + + + /** + * Set "out" to be a vector in the direction of to - from, + * with magnitude new_mag. + * @param from + * @param to + * @param out + * @param new_mag + * @return + */ + public static function scale_vector(from:Dynamic, to:Dynamic, out:Dynamic, new_mag:Float):FlxPoint { + + var dx:Float=to.x - from.x; + var dy:Float=to.y - from.y; + var mag:Float=Math.sqrt(dx * dx + dy * dy); + var scale:Float=new_mag / mag; + out.x=scale * dx; + out.y=scale * dy; + return out; + } + + /** + * Return the distance between two points. + * Input is any objects with an x and y property. + */ + public static function distance(a:Dynamic, b:Dynamic):Float { + var dx:Float=a.x - b.x; + var dy:Float=a.y - b.y; + return Math.sqrt(dx * dx + dy * dy); + } + + public static function prevent_leaving_map(playstate:PlayState,o:FlxSprite):Void { + if(o.yplaystate.lowerBorder)o.y=playstate.lowerBorder - o.height; + if(o.x + o.width>playstate.rightBorder)o.x=playstate.rightBorder - o.width; + if(o.xx_max){ + o.velocity.x *=-1;res |=1; + } + } + + if(o.velocity.y<0){ + if(o.yy_max){ + o.velocity.y *=-1;res |=2; + } + } + return res; + } + + /** + * Lookup the tile at(x,y)of map, and then check its properties according to submap. + * @param x + * @param y + * @param map + * @param submap + * @return + */ + public static function get_tile_collision_flags(x:Int, y:Int, map:FlxTilemap,submap:FlxTilemap):Int { + var tile_type:Int=map.getTile(x / 16,(y - Registry.HEADER_HEIGHT)/ 16); + + if(submap._tileObjects[tile_type]==null)return NONE; + + return submap._tileObjects[tile_type].allowCollisions; + } + + /** + * Get the direction from entity 1's position(e1x,e1y)to entity + * 2's position(e2x,e2y), using the rotated quadrants method. + * + * @param e1x + * @param e1y + * @param e2x + * @param e2y + * @return The FlxObject constant showing where the 2nd entity is relative to entity 1 + */ + public static function get_entity_to_entity_dir(e1x:Int, e1y:Int, e2x:Int, e2y:Int):Int { + + var dx:Int=e2x - e1x; + var dy:Int=e2y - e1y; + + if(dx>0){ + if(Math.abs(dy)0)? DOWN:UP); + } + + /** + * Makes e1's facing flag set towards e2. Also then plays the associated directional + * animation - prefix+"_"+{d,u,r,l} + */ + public static function face_and_play(e1:Dynamic, e2:Dynamic, prefix:String="idle"):String { + e1.facing=get_entity_to_entity_dir(e1.x, e1.y, e2.x, e2.y); + switch(e1.facing){ + case UP: + e1.play(prefix + "_u"); + break; + case DOWN: + e1.play(prefix + "_d"); + break; + case LEFT: + e1.play(prefix + "_l"); + break; + case RIGHT: + e1.play(prefix + "_r"); + break; + } + return(e1._curAnim==null)? "":e1._curAnim.name; + } + + public static function play_based_on_facing(e1:Dynamic,prefix:String="idle"):String { + switch(e1.facing){ + case UP: + e1.play(prefix + "_u"); + break; + case DOWN: + e1.play(prefix + "_d"); + break; + case LEFT: + e1.play(prefix + "_l"); + break; + case RIGHT: + e1.play(prefix + "_r"); + break; + } + return(e1._curAnim==null)? "":e1._curAnim.name; + } + + /** + * Checks if e1 and e2's facing flags are directional opposites. + * @param e1 + * @param e2 + * @return True or False. + */ + public static function are_facing_opposite(e1:Dynamic, e2:Dynamic):Bool { + if(e1.facing==UP && e2.facing==DOWN)return true; + if(e2.facing==UP && e1.facing==DOWN)return true; + if(e1.facing==LEFT && e2.facing==RIGHT)return true; + if(e2.facing==LEFT && e1.facing==RIGHT)return true; + + return false; + + } + + /** + * Create a shadow specified by name, and adds the animations get_big and get_small, + * and also makes it invisible. You still need to add it to the parent. + * @param name:8_small + * @return the shadow + */ + public static function make_shadow(name:String,visible:Bool=false,fps:Int=8):FlxSprite { + var shadow:FlxSprite=new FlxSprite; + + switch(name){ + case "8_small": + default: + shadow.loadGraphic(Common_Sprites.shadow_sprite_8_8, true, false, 8, 8); + shadow.addAnimation("get_big", [0, 1, 2, 3], fps, false); + shadow.addAnimation("get_small", [3, 2, 1, 0], fps, false); + shadow.play("get_big"); + shadow.visible=visible; + + break; + } + + return shadow; + + } + + /** + * Called by create()in PlayState and roamstate, this returns a reference to the loaded + * autosave icon. Gives it an animation, to boot. + * @param autosave_icon + * @param autosave_icon_embed + * @return + */ + public static function init_autosave_icon(autosave_icon:FlxSprite, autosave_icon_embed:Class):FlxSprite { + + autosave_icon=new FlxSprite(160 - 80 - 32, 20);//(160 - 2 - 64, 20 + 160 - 2 - 64); + autosave_icon.loadGraphic(autosave_icon_embed, true, false, 64, 16); + autosave_icon.visible=false; + autosave_icon.addAnimation("a", [0, 1, 2, 3, 4, 5], 8, true); + autosave_icon.play("a"); + autosave_icon.scrollFactor.x=autosave_icon.scrollFactor.y=0; + return autosave_icon; + } + + /** + * Gets the tile's collision flags at(x,y)(default screenspace coords) + * @param x + * @param y + * @param map + * @param screen_coords + * @return + */ + public static function get_tile_allow_collisions(x:Int, y:Int, map:FlxTilemap, screen_coords:Bool=true):Int { + + if(screen_coords){ + var _x:Int=(x % 160)/ 16;//FCK IT + var _y:Int=((y - 20)% 160)/ 16; + var tile_idx:Int=map.getTileByIndex(_y * 10 + _x); + var tile:FlxTile=map._tileObjects[tile_idx]; + return tile.allowCollisions; + } + return NONE; + } + + public static function get_tile_nr(x:Int, y:Int, map:FlxTilemap):Int { + var _x:Int=(x % 160)/ 16;//FCK IT + var _y:Int=((y - 20)% 160)/ 16; + var tile_idx:Int=map.getTileByIndex(_y * 10 + _x); + return tile_idx; + } + + public static function fade_and_switch(name:String):Void { + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG=name; + Registry.E_FADED=false; + } + + /** + * Increments timer until it reaches timer_max, then sets timer to 0. + * @param timer + * @param timer_max + * @return false if timerref[timer_max]){ + ref[timer]=0; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/Joypad_Config_Group.hx b/AIR/intra/hsrc/helper/Joypad_Config_Group.hx new file mode 100644 index 0000000..846ea17 --- /dev/null +++ b/AIR/intra/hsrc/helper/Joypad_Config_Group.hx @@ -0,0 +1,294 @@ +package helper +{ +import global.Keys; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; + +/** + * ... + * @author Melos Han-Tani + */ +class Joypad_Config_Group extends FlxGroup +{ + + public var controls:FlxBitmapFont=EventScripts.init_bitmap_font("JOYPAD CONFIG", "left", 5, 20, null, "apple_white"); + public var instructions:FlxBitmapFont=EventScripts.init_bitmap_font("h", "left", 5, 65, null, "apple_white"); + public var yesno:FlxBitmapFont=EventScripts.init_bitmap_font("Yes No", "center", 20, 140, null, "apple_white"); + public var debugtext:FlxBitmapFont=EventScripts.init_bitmap_font(".", "left", 2, 150, null, "apple_white"); + public var selector:FlxSprite=new FlxSprite; + + + public static var REAL_JOYBINDS:Array; + private var state:Int=0; + private var cursor_state:Int=0; + + private static inline var S_DETECTED:Int=0; + private static inline var S_INPUT:Int=1; + private static inline var S_IDLE:Int=-1; + private static inline var S_DONE:Int=2; + private static inline var S_TEST:Int=3; + + private var move_square:FlxSprite=new FlxSprite(100, 110); + private var goal_square:FlxSprite=new FlxSprite(20, 130); + + private var blackscrn:FlxSprite=new FlxSprite(0, 0); + public function new() + { + + blackscrn.makeGraphic(160, 180, 0xff000000); + blackscrn.scrollFactor=new FlxPoint(0, 0); + add(blackscrn); + add(controls); + add(instructions); + add(yesno); + add(debugtext); + + set_instructions_text(); + + selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + selector.frame=2; + selector.scrollFactor=new FlxPoint(0, 0); + selector.x=yesno.x - 8; + selector.y=yesno.y; + add(selector); + + move_square.scrollFactor.x=goal_square.scrollFactor.x=0; + move_square.scrollFactor.y=goal_square.scrollFactor.y=0; + move_square.makeGraphic(16, 16, 0xfff0f0f0); + goal_square.makeGraphic(16, 16, 0xffff0000); + add(move_square); + add(goal_square); + move_square.visible=goal_square.visible=false; + + } + + // keys_idx is 0 to 7 + // so earlier it was checking input_id !=keys_idx + // that person was having errors with action 1 + 2, which are keys_idx=4 and 5 + // it wasn't detecting a duplicate when keys_idx=5 + // they had two axes, meaning button input_id would be from 5 to ... + // meaning the checkk is 5 !=5. his controller probably double-inputs presses? + // this should work now.. + private function no_dups(input_id:Int,keys_idx:Int):Bool { + for(i in 0...8){ + if(Registry.joybinds[i]==input_id && i !=keys_idx){ + return false; + } + } + return true; + } + private var delay:Float=1; + private var timeout:Float=15; + private var wait_time:Float=4; + override public function update():Void + { + + // Force an exit out of the config if we d/c while configing + if(Keys.has_joypad==false ||(Intra.IS_MAC && Main.mac_joy_manager.joysticks[0]==null)){ + state=S_DONE; + return; + } + + if(Main.mac_joy_manager !=null){ + for(a in 1...Main.mac_joy_manager.joysticks.length){ + if(Main.mac_joy_manager.joysticks[a] !=null){ + Main.mac_joy_manager.joysticks[0]=Main.mac_joy_manager.joysticks[a]; + break; + } + } + } + + debugtext.text="Axes " + Keys.get_axis_stats()+ "\n" + "Btns " + Keys.get_btn_stats()+ "\n" + Keys.nr_axes.toString()+ "/" + Keys.nr_btns.toString(); + + if(state==S_DETECTED){ + if(FlxG.keys.justPressed("SPACE")){ + state=S_DONE; + cursor_state=0; + selector.x -=40; + } else if(cursor_state==0 &&(1==Keys.joy_any_axis()|| Registry.keywatch.JP_RIGHT)){ + cursor_state=1; + selector.x +=40; + + } else if(cursor_state==1 &&(-1==Keys.joy_any_axis()|| Registry.keywatch.JP_LEFT)){ + cursor_state=0; + selector.x -=40; + } else if(Keys.joy_any_button()|| FlxG.keys.any()){ + if(Registry.keywatch.RIGHT || Registry.keywatch.LEFT)return; + if(cursor_state==0){ + for(j in 0...8){ + Registry.joybinds[j]=0; + } + + yesno.visible=false; + selector.visible=false; + instructions.visible=false; + state=S_IDLE; + + } else { + trace(Registry.joybinds); + state=S_DONE; + cursor_state=0; + selector.x -=40; + } + } + } else if(state==S_IDLE){ + controls.text="Don't press anything.\n\nConfig starting in\n\n" + wait_time.toFixed(2); + wait_time -=FlxG.elapsed; + if(wait_time<0){ + wait_time=4; + controls.text="Press input for\nUP."; + state=S_INPUT; + } + } else if(state==S_INPUT){ + + if(delay>0){ + delay -=FlxG.elapsed; + return; + } + + if(Keys.joy_get_first_active_button_id()!=0 || Keys.joy_get_first_active_axis_id()!=0){ + + var next_id:Int=Keys.joy_get_first_active_button_id(); + if(next_id==0){ + next_id=Keys.joy_get_first_active_axis_id(); + } + + debugtext.text +="(" + next_id.toString()+ ")"; + + if(cursor_state==0){ + if(no_dups(next_id, Keys.IDX_UP)==false)return; + Registry.joybinds[Keys.IDX_UP]=next_id; + controls.text="Press input for\nRIGHT."; + } else if(cursor_state==1){ + if(no_dups(next_id, Keys.IDX_RIGHT)==false)return; + Registry.joybinds[Keys.IDX_RIGHT]=next_id; + controls.text="Press input for\nDOWN."; + } else if(cursor_state==2){ + if(no_dups(next_id, Keys.IDX_DOWN)==false)return; + Registry.joybinds[Keys.IDX_DOWN]=next_id; + controls.text="Press input for\nLEFT."; + } else if(cursor_state==3){ + if(no_dups(next_id, Keys.IDX_LEFT)==false)return; + Registry.joybinds[Keys.IDX_LEFT]=next_id; + controls.text="Press input for\nConfirm."; + } else if(cursor_state==4){ + if(no_dups(next_id, Keys.IDX_ACTION_1)==false)return; + Registry.joybinds[Keys.IDX_ACTION_1]=next_id; + controls.text="Press input for\nCancel."; + } else if(cursor_state==5){ + if(no_dups(next_id, Keys.IDX_ACTION_2)==false)return; + Registry.joybinds[Keys.IDX_ACTION_2]=next_id; + controls.text="Press input for\nPause."; + } else if(cursor_state==6){ + if(no_dups(next_id, Keys.IDX_PAUSE)==false)return; + Registry.joybinds[Keys.IDX_PAUSE]=next_id; + } + cursor_state++; + if(cursor_state==7){ + cursor_state=0; + controls.text="Move the white square\nto the red square\nto confirm.\n\nOr, wait for the timer\nto run out\nto rebind the controls."; + instructions.visible=true; + instructions.y +=24; + + goal_square.visible=move_square.visible=true; + state=S_TEST;//Need to do test thing + } + + } + } else if(state==S_TEST){ + timeout -=FlxG.elapsed; + instructions.y=89; + instructions.text=timeout.toFixed(2); + if(timeout<10)instructions.text +=" "; + + if(Keys.get_joy_state(Keys.IDX_ACTION_1)){ + instructions.text +=" CONFIRM:ON\n"; + } else { + instructions.text +=" CONFIRM:OFF\n"; + } + + if(Keys.get_joy_state(Keys.IDX_ACTION_2)){ + instructions.text +=" CANCEL:ON\n"; + } else { + instructions.text +=" CANCEL:OFF\n"; + } + + + if(Keys.get_joy_state(Keys.IDX_PAUSE)){ + instructions.text +=" PAUSE:ON\n"; + } else { + instructions.text +=" PAUSE:OFF\n"; + } + + if(timeout<=0){ + reset_before_leave(); + state=S_DETECTED; + return; + } + + if(Registry.keywatch.LEFT){ + move_square.velocity.x=-20; + } else if(Registry.keywatch.RIGHT){ + move_square.velocity.x=20; + } else { + move_square.velocity.x=0; + } + + if(Registry.keywatch.UP){ + move_square.velocity.y=-20; + } else if(Registry.keywatch.DOWN){ + move_square.velocity.y=20; + } else { + move_square.velocity.y=0; + } + + if(move_square.overlaps(goal_square)){ + REAL_JOYBINDS=Registry.joybinds; + state=S_DONE; + } + } else if(state==S_DONE){ + + } + + super.update(); + } + + public function is_done():Bool { + if(state==S_DONE){ + state=S_DETECTED; + reset_before_leave(); + return true; + } + return false; + } + + private function set_instructions_text():Void + { + if(Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]==false){ + instructions.text="Joypad detected for\nthe first time.\n\nConfiguration is\nnecessary!\n\nConfigure?\n(Skip w/ SPACE)"; + Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]=true; + } else { + instructions.text="Joypad detected.\n\nReconfigure?\n(Skip w/ SPACE)\n"; + } + + } + + private function reset_before_leave():Void + { + timeout=15; + goal_square.visible=move_square.visible=false; + move_square.velocity.x=move_square.velocity.y=0; + move_square.x=100;move_square.y=110; + set_instructions_text(); + yesno.visible=true; + delay=1; + selector.visible=true; + instructions.y -=24; + controls.text="JOYPAD CONFIG"; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/Parabola_Thing.hx b/AIR/intra/hsrc/helper/Parabola_Thing.hx new file mode 100644 index 0000000..aff9667 --- /dev/null +++ b/AIR/intra/hsrc/helper/Parabola_Thing.hx @@ -0,0 +1,106 @@ +package helper +{ +import org.flixel.FlxG; +import org.flixel.FlxSprite; +/** + * ... + * @author Seagaia + */ +class Parabola_Thing +{ + + /** + */ + /** + * helper class for making stuff move like a parabola. when tick is called it will + * change the given PROPERTY. changes it over a PERIOD of time, reaches MAX value.. + * up to you to use the return stuff blahbalh + * DOESNT CHECK FOR ERRORS so get your values right. ia m lazy + * @param s + * @param max + * @param period + * @param property + */ + + private var sprite_ref:FlxSprite; + private var height:Float; + public var period:Float; + public var t:Float; + private var coeff:Float; + private var prop:String; + private var subprop:String; + + private var shadow_fall_anim:String; + + private var has_fallen:Bool=true; + + public var OFFSET:Int=0; + + public function new(s:FlxSprite,_height:Float,_period:Float,_property:String,_subprop:String="") + { + sprite_ref=s; + height=_height; + period=_period; + prop=_property; + subprop=_subprop; + t=0; + coeff=get_parabola_coeff(height, period); + + } + + public function destroy():Void { + sprite_ref=null; + } + /** + * Set an animation for the shadow to play when it falls. + *(Falls=current t>period/2) + * @param name + */ + public function set_shadow_fall_animation(name:String):Void { + shadow_fall_anim=name; + has_fallen=false; + } + /** + * changes its set property according to the parabola and blah blah. + * @return 1 if done, 0 if not. might be useful, but this sets "done" for you anyways + */ + public function tick():Int { + + if(t>period){ + return 1; + } + if(!has_fallen &&(t>period/2)){ + has_fallen=true; + sprite_ref.my_shadow.play(shadow_fall_anim); + } + if(subprop !=""){ + sprite_ref[prop][subprop]=OFFSET + get_next_parabola_param(t, period, coeff); + } else { + sprite_ref[prop]=OFFSET + get_next_parabola_param(t, period, coeff); + } + + t +=FlxG.elapsed; + return 0; + } + + + public function reset_time():Void { + t=0; + } + /* Returns the coefficient for a parameterization of parabola-like path */ + + public static function get_parabola_coeff(h:Float, period:Float):Float { + return(-4*h)/(period*period); + } + + /** + * given current time, period, and coeff, return the next value of + * what ever value is being changed + * @return next value yo + */ + public static function get_next_parabola_param(t:Float,period:Float,coeff:Float):Float { + return coeff * t *(t - period); + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/S_NPC.hx b/AIR/intra/hsrc/helper/S_NPC.hx new file mode 100644 index 0000000..5024210 --- /dev/null +++ b/AIR/intra/hsrc/helper/S_NPC.hx @@ -0,0 +1,126 @@ +package helper +{ +import global.Registry; +/** + * Helper functions for stateful npcs. + * @author Melos Han-Tani + */ +class S_NPC +{ + + public static var states:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + public static inline var IDX_TEST:Int=0; + public static inline var IDX_LOBSTER:Int=1; + public static inline var IDX_HAIR:Int=2; + public static inline var IDX_BEAR:Int=3; + public static inline var IDX_GOLEM:Int=4; + + private static inline var BIT_DIRTY:Int=1<<9; + private static inline var BIT_SECOND_PLAYED:Int=1<<8; + private static inline var BIT_BEDROOM_BOSS:Int=1<<7; + private static inline var BIT_REDCAVE_BOSS:Int=1<<6; + private static inline var BIT_CROWD_BOSS:Int=1<<5; + private static inline var BIT_APARTMENT_BOSS:Int=1<<4; + private static inline var BIT_HOTEL_BOSS:Int=1<<3; + private static inline var BIT_CIRCUS_BOSS:Int=1<<2; + private static inline var MAX_STATE:Int=0xfc; + + //Dirty bit, read_second bit, bits on bosses. + + + // Set state, based on index Into state and current Boss states. + + public static function test():Void { + // WOOO INCOMPREHENSIBLE TESTS!!! + trace(check_to_play_second(DH.name_test), "FALSE!");// Playing when clean plays first + trace(check_to_play_second(DH.name_test), "FALSE!");// Playing when dirty but no state change doesnt play 2nd + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!");// Make sure state changing plays the 2nd + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!");// Make sure playing the 2nd once makes any further play the 2nd + + states[IDX_TEST]=0; + trace(check_to_play_second(DH.name_test), "FALSE!");// Check that starting clean but with state plays 1st + trace(check_to_play_second(DH.name_test), "FALSE!");// Dirty and state plays 1st(state donst change) + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!"); + + states[IDX_TEST]=0; + + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "FALSE!");// PLaying hwen clena plays first + trace(check_to_play_second(DH.name_test), "TRUE!");// play with all state set plays 2nd + + + } + + /** + * check if you need to play the 2nd dialogue choice. + * if you leave 'scene' blank, then the functiond only relies on + * the stored state of the npc rather than the state of the scene too + * @param name + * @param scene + * @param map + * @return + */ + public static function check_to_play_second(name:String, scene:String="", map:String=""):Bool { + var res:Bool=false; + if(name==DH.name_test){ + res=update(IDX_TEST); + } else if(name==DH.name_generic_npc && map=="BEACH"){ // Lobster + res=update(IDX_LOBSTER); + } else if(name==DH.name_generic_npc && map=="REDSEA"){ + res=update(IDX_HAIR); + } else if(name==DH.name_generic_npc && map=="FOREST"){ + res=update(IDX_BEAR); + } else if(name==DH.name_generic_npc && map=="CLIFF"){ + res=update(IDX_GOLEM); + } + if(scene !="" && DH.scene_is_finished(name, scene, map)==false)return false;// We want all of the first set of dialogue to play at least once + // Put the call after the update because we + // always want to record state + return res; + } + + // Returns true if:All event-bits set, or new result greater than current and dirty is set + private static function update(idx:Int):Bool { + if(states[idx] & BIT_DIRTY){ + var s_new:Int=get_current_states()| states[idx]; + // i.e., if we've done all the events and talked to the NPC once, then play its second dialogue set + // OR if the new state is newer then try to play the 2nd + // or if we've tried to play the 2nd. + var sidx:Int=states[idx]; + //trace("S_NPC.update:New:", s_new, " Old:", states[idx]); + if((sidx & MAX_STATE)==MAX_STATE || s_new>sidx || s_new & BIT_SECOND_PLAYED){ + states[idx]=s_new; + states[idx] |=BIT_SECOND_PLAYED; + return true; + } + } else { + states[idx] |=BIT_DIRTY; + states[idx] |=get_current_states(); + return false; + } + return false; + } + + static private function get_current_states():Int + { + var s_new:Int=0; + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx] ? s_new |=BIT_BEDROOM_BOSS:1; + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] ? s_new |=BIT_REDCAVE_BOSS:1; + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx] ? s_new |=BIT_CROWD_BOSS:1; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx] ? s_new |=BIT_APARTMENT_BOSS:1; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx] ? s_new |=BIT_HOTEL_BOSS:1; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx] ? s_new |=BIT_CIRCUS_BOSS:1; + //trace("S_NPC.get_current_states returns ", s_new); + return s_new; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/ScreenFade.hx b/AIR/intra/hsrc/helper/ScreenFade.hx new file mode 100644 index 0000000..a677e62 --- /dev/null +++ b/AIR/intra/hsrc/helper/ScreenFade.hx @@ -0,0 +1,173 @@ +package helper +{ +import flash.display.BitmapData; +import flash.display.Bitmap; +import flash.geom.Rectangle; +import flash.utils.ByteArray; +import org.flixel.FlxG; +import org.flixel.FlxState; + +class ScreenFade +{ + + public var base:BitmapData; + public var old:BitmapData; + public var thing_to_draw:Bitmap; + public var parent:FlxState; + + private var timer:Float; + public var timer_max:Float; + private var type:Int; + public var rate:Int; + private var cur:Int=1; + public static var T_RECT:Int=0; + public static var T_DS:Int=1;//downsample + public static var T_US:Int=2;//upsample + + public static var DONE:Int=0; + public static var NOT_DONE:Int=1; + + public var width:Int=160; + public var height:Int=180;//change as needed + + public var offset:Int=0; + public var ADDED_CHILD:Bool=false; + public function new(width:Int,height:Int,_parent:FlxState,_type:Int) + { + base=new BitmapData(width, height, true,0x00000000); + old=new BitmapData(width, height, true,0x00000000); + thing_to_draw=new Bitmap(base); + + type=_type; + switch(type){ + case T_RECT: + FlxG.stage.addChild(thing_to_draw); + rate=8; + timer=timer_max=0.02; + break; + case T_DS: + rate=10; + cur=1; + thing_to_draw=new Bitmap(FlxG.camera.buffer); + timer=timer_max=0.01; + break; + case T_US: + rate=1;//min + cur=10;//start + thing_to_draw=new Bitmap(FlxG.camera.buffer); + timer=timer_max=0.01; + break; + } + parent=_parent; + } + + public function reset():Void { + if(type==T_DS){ + rate=10; + cur=1; + } else if(type==T_US){ + rate=1; + cur=10; + } + + } + + public function do_effect():Int { + + timer -=FlxG.elapsed; + if(timer<0){ + timer=timer_max; + switch(type){ + case T_RECT: + return fx_rect(rate); + break; + case T_DS: + FlxG.camera.buffer.copyPixels(thing_to_draw.bitmapData, thing_to_draw.bitmapData.rect, thing_to_draw.bitmapData.rect.topLeft); + cur++; + return fx_downsample(cur,rate); + break; + case T_US: + FlxG.camera.buffer.copyPixels(thing_to_draw.bitmapData, thing_to_draw.bitmapData.rect, thing_to_draw.bitmapData.rect.topLeft); + cur--; + return fx_downsample(cur, rate); + } + } else { + if(type==T_DS){ + return fx_downsample(cur,rate); + } else if(type==T_US){ + return fx_downsample(cur, rate); + } + + } + return NOT_DONE; + } + + private function fx_rect(rate:Int):Int { + + for(var i:Int=offset;i=base.height)return DONE; + return NOT_DONE; + } + + /* + * Downsamples the camera buffer with a from-top-left-square-downsample effect. + * This is a post-processing effect. The camera's buffer is copied to thing_to_draw, + * then on every iteration it copies a downsampled version on top + **/ + private function fx_downsample(stride:Int, max:Int):Int { + var next_color:Int; + if(stride<1)stride=1;//prevent infinite loop + for(y in 0...height +=stride){ + for(x in 0...width +=stride){ + next_color=thing_to_draw.bitmapData.getPixel32(x,y); + for(var _x:Int=x;_xmax)return DONE; + } else if(type==T_US){ + if(stride<=max)return DONE; + } + return NOT_DONE; + } + + /* Downsamples buf based on the top-left squares method. + * Internal locking of buf. + * This should be called before this buffer gets copied out to + * flash. */ + public static function dumsample(stride:Int, buf:BitmapData):Void { + + var next_color:Int; + buf.lock(); + for(y in 0...buf.height +=stride){ + for(x in 0...buf.width +=stride){ + next_color=buf.getPixel32(x,y); + for(var _x:Int=x;_x=null, player:Player=null, parent_state:Dynamic=null, darkness:FlxSprite=null):Int { + var newSprite:FlxSprite; + var x:Int=parseInt(sprite.@x); + var y:Int=parseInt(sprite.@y)+ Registry.HEADER_HEIGHT; + var frame_type:Int=parseInt(sprite.@frame); + var permanence:Int=parseInt(sprite.@p); + var name:String=sprite.name(); + + if(permanence==0 && sprite.@alive=="false")sprite.@alive="true"; + if(name=="Slime"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + if(frame_type==Slime.KEY_T)sprite.@p=P_GLOBAL; + newSprite=new Slime(x, y, id, frame_type,sprite,player,parent_state); + gridObjects.push(newSprite); + return 0; + } else if(name=="SinglePushBlock"){ + var spb:SinglePushBlock=new SinglePushBlock(x, y, sprite,player); + gridObjects.push(spb); + otherObjects.push(spb.sentinel); + return 0; + } else if(name=="Door"){ + newSprite=new Door(x, y, sprite, parent_state); + parent_state.bg_sprites.add(newSprite); + if(parseInt(sprite.@type.toXMLString())==Door.NEXUS_PAD){ + trace("Faking nexus pad"); + var _npc:NPC=new NPC(EventScripts.fake_xml("NPC",x.toString(),y.toString(),"generic","true","0","2"), parent_state,player); + gridObjects.push(_npc); + otherObjects.push(_npc.active_region); + return 1; + } + return -1; + } else if(name=="Wall_Laser"){ + var newerSprite:Wall_Laser=new Wall_Laser(x, y, sprite.@type, id); + gridObjects.push(newerSprite); + otherObjects.push(newerSprite.laser); + return 1; + } else if(name=="Eye_Light"){ + var eye_light:Eye_Light=new Eye_Light(x, y, sprite, darkness); + gridObjects.push(eye_light); + otherObjects.push(eye_light.light); + return 0; + } else if(name=="Mover"){ + var mover:Mover=new Mover(x, y, player, 1.0,sprite,player,parent_state); + gridObjects.push(mover);return 0; + } else if(name=="KeyBlock"){ + if(sprite.@alive=="false")return -1; + var keyBlock:KeyBlock=new KeyBlock(x, y, frame_type,player, sprite); + gridObjects.push(keyBlock);return 0; + } else if(name=="Key"){ + var key:Key=new Key(x, y,player,parent_state,sprite); + gridObjects.push(key); + } else if(name=="Hole"){ + var hole:Hole=new Hole(x, y, sprite,player); + parent_state.bg_sprites.add(hole);return -1; + } else if(name=="Gate"){ + sprite.@p="2"; + var gate:Gate=new Gate(x, y, sprite,player); + + gridObjects.push(gate);return 0; + } else if(name=="Treasure"){ + var treasure:Treasure=new Treasure(x, y, sprite,parent_state as FlxState); + sprite.@p="2"; + parent_state.fg_sprites.add(treasure.item); + gridObjects.push(treasure);return 0; + } else if(name=="CrackedTile"){ + var cracked_tile:CrackedTile=new CrackedTile(x, y, sprite,player); + parent_state.anim_tiles_group.add(cracked_tile.hole); + parent_state.anim_tiles_group.add(cracked_tile);//will get drawn because anim tiles added later + return -1; + } else if(name=="Button"){ + var button:Button=new Button(x, y, sprite,parent_state); + parent_state.anim_tiles_group.add(button); + return -1; + } else if(name=="Sun_Guy"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + var sun_guy:Sun_Guy=new Sun_Guy(x, y, darkness, parent_state as PlayState, sprite,player); + gridObjects.push(sun_guy); + return 0; + } else if(name=="Dust"){ + var dust:Dust=new Dust(x, y, sprite, parent_state); + parent_state.bg_sprites.add(dust); + return -1; + } else if(name=="Event"){ + //var event_script:EventScripts=new EventScripts(); + //gridObjects.push(event_script);//For consistency + deal_with_event(sprite, parent_state); + return -1; + + } else if(name=="Shieldy"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + var shieldy:Shieldy=new Shieldy(x, y, sprite,parent_state as PlayState); + gridObjects.push(shieldy);return 0; + } else if(name=="Pew_Laser"){ + var pew_laser:Pew_Laser=new Pew_Laser(x, y, sprite, parent_state as PlayState); + gridObjects.push(pew_laser);return 0; + } else if(name=="Annoyer"){ + var annoyer:Annoyer=new Annoyer(x, y, sprite, player,parent_state); + gridObjects.push(annoyer);return 0; + } else if(name=="Console"){ + var console:Console=new Console(x, y, sprite,player); + gridObjects.push(console); + return 0; + } else if(name=="Follower_Bro"){ + var fb:Follower_Bro=new Follower_Bro(sprite, player); + fb.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fb); + return 0; + } else if(name=="Sadbro"){ + var sadbro:Sadbro=new Sadbro(sprite, player); + sadbro.y +=Registry.HEADER_HEIGHT; + gridObjects.push(sadbro); + return 0; + } else if(name=="Red_Walker"){ + var redwalker:Red_Walker=new Red_Walker(sprite,player); + redwalker.y +=Registry.HEADER_HEIGHT; + gridObjects.push(redwalker); + return 0; + } else if(name=="Four_Shooter"){ + var fsht:Four_Shooter=new Four_Shooter(sprite, parent_state as PlayState, player); + fsht.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fsht); + return 0; + } else if(name=="Slasher"){ + var slasher:Slasher=new Slasher(sprite, parent_state as PlayState, player); + slasher.y +=Registry.HEADER_HEIGHT; + gridObjects.push(slasher); + return 0; + } else if(name=="On_Off_Laser"){ + var oolasser:On_Off_Laser=new On_Off_Laser(sprite,player); + oolasser.y +=Registry.HEADER_HEIGHT; + oolasser.laser.y +=Registry.HEADER_HEIGHT; + gridObjects.push(oolasser); + otherObjects.push(oolasser.laser); + return 0; + } else if(name=="Red_Pillar"){ + var red_pillar:Red_Pillar=new Red_Pillar(sprite,player,parent_state); + red_pillar.y +=Registry.HEADER_HEIGHT; + gridObjects.push(red_pillar); + return 0; + } else if(name=="Solid_Sprite"){ + var ss:Solid_Sprite=new Solid_Sprite(sprite,false,player); + ss.y +=Registry.HEADER_HEIGHT; + gridObjects.push(ss); + ss.y +=0; + return 0; + } else if(name=="Big_Door"){ + var bigdoor:Big_Door=new Big_Door(sprite, player); + bigdoor.y +=Registry.HEADER_HEIGHT; + otherObjects.push(bigdoor.active_region); + gridObjects.push(bigdoor); + parent_state.fg_sprites.add(bigdoor.locked_squares); + parent_state.fg_sprites.add(bigdoor.white_flash); + parent_state.fg_sprites.add(bigdoor.score_text_1); + parent_state.fg_sprites.add(bigdoor.score_text_2); + return 0; + } else if(name=="Fisherman"){ + var fisherman:Fisherman=new Fisherman(sprite, player); + fisherman.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fisherman); + return 0; + } else if(name=="Jump_Trigger" || name=="Spring_Pad"){ + var jt:Jump_Trigger=new Jump_Trigger(sprite, player,parent_state); + jt.y +=Registry.HEADER_HEIGHT; + gridObjects.push(jt); + + return 0; + } else if(name=="NPC"){ + var npc:NPC=new NPC(sprite, parent_state,player); + npc.y +=Registry.HEADER_HEIGHT; + gridObjects.push(npc); + otherObjects.push(npc.active_region); + return 0; + } else if(name=="Red_Boss"){ + var redboss:Red_Boss=new Red_Boss(sprite, parent_state as PlayState, player); + redboss.y +=Registry.HEADER_HEIGHT; + gridObjects.push(redboss); + return 0; + } else if(name=="Propelled"){ + var propelled:Propelled=new Propelled(sprite, player, parent_state); + propelled.y +=Registry.HEADER_HEIGHT; + parent_state.bg_sprites.add(propelled); + return -1; + } else if(name=="Stop_Marker"){ + var stopmarker:Stop_Marker=new Stop_Marker(sprite, parent_state); + stopmarker.y +=Registry.HEADER_HEIGHT; + gridObjects.push(stopmarker); + return 0; + } else if(name=="Person"){ + var person:Person=new Person(sprite, player, parent_state); + person.y +=Registry.HEADER_HEIGHT; + gridObjects.push(person); + return 0; + } else if(name=="Rotator"){ + var rotator:Rotator=new Rotator(sprite, player); + rotator.y +=Registry.HEADER_HEIGHT; + gridObjects.push(rotator); + otherObjects.push(rotator.sprite_ball); + return 0; + } else if(name=="Frog"){ + var frog:Frog=new Frog(sprite, player, parent_state); + frog.y +=Registry.HEADER_HEIGHT; + gridObjects.push(frog); + return 0; + }else if(name=="Spike_Roller"){ + var spike_roller:Spike_Roller=new Spike_Roller(sprite, player, parent_state); + spike_roller.y +=Registry.HEADER_HEIGHT; + gridObjects.push(spike_roller); + //adding done inside class + return 0; + } else if(name=="Dog"){ + var dog:Dog=new Dog(sprite, player, parent_state); + dog.y +=Registry.HEADER_HEIGHT; + gridObjects.push(dog); + return 0; + } else if(name=="WallBoss"){ + var wallboss:WallBoss=new WallBoss(sprite, player, parent_state); + gridObjects.push(wallboss); + return 0; + } else if(name=="Pillar_Switch"){ + var psw:Pillar_Switch=new Pillar_Switch(sprite, player, parent_state); + psw.y +=20;gridObjects.push(psw);return 0; + } else if(name=="Switch_Pillar"){ + var ssss:Switch_Pillar=new Switch_Pillar(sprite, player, parent_state); + ssss.y +=20;parent_state.bg_sprites.add(ssss);return -1; + } else if(name=="Silverfish"){ + var silverfish:Silverfish=new Silverfish(sprite, player, parent_state); + silverfish.y +=Registry.HEADER_HEIGHT;gridObjects.push(silverfish);return 0; + } else if(name=="Rat"){ + var rat:Rat=new Rat(sprite, player, parent_state); + rat.y +=Registry.HEADER_HEIGHT;gridObjects.push(rat);return 0; + } else if(name=="Teleguy"){ + var teleguy:Teleguy=new Teleguy(sprite, player, parent_state); + teleguy.y +=Registry.HEADER_HEIGHT;gridObjects.push(teleguy);return 0; + } else if(name=="Dash_Trap"){ + var dashtrap:Dash_Trap=new Dash_Trap(sprite, player, parent_state); + dashtrap.y +=Registry.HEADER_HEIGHT;gridObjects.push(dashtrap);return 0; + } else if(name=="Gasguy"){ + var gasguy:Gasguy=new Gasguy(sprite, player, parent_state); + gasguy.y +=Registry.HEADER_HEIGHT;gridObjects.push(gasguy);return 0; + + } else if(name=="Terminal_Gate"){ + var tgate:Terminal_Gate=new Terminal_Gate(sprite, player, parent_state); + tgate.y +=Registry.HEADER_HEIGHT;gridObjects.push(tgate);return 0; + } else if(name=="Dustmaid"){ + var dustmaid:Dustmaid=new Dustmaid(sprite, player, parent_state); + dustmaid.y +=Registry.HEADER_HEIGHT;gridObjects.push(dustmaid);return 0; + } else if(name=="Splitboss"){ + var splitboss:Splitboss=new Splitboss(sprite, player, parent_state); + splitboss.y +=Registry.HEADER_HEIGHT;gridObjects.push(splitboss);return 0; + } else if(name=="Nonsolid"){ + var nonsolid:Nonsolid=new Nonsolid(sprite); + nonsolid.y +=Registry.HEADER_HEIGHT;gridObjects.push(nonsolid);return 0; + } else if(name=="Steam_Pipe"){ + var steam_pipe:Steam_Pipe=new Steam_Pipe(sprite, player, parent_state); + steam_pipe.y +=Registry.HEADER_HEIGHT;gridObjects.push(steam_pipe);return 0; + } else if(name=="Burst_Plant"){ + var burstplant:Burst_Plant=new Burst_Plant(sprite, player, parent_state); + burstplant.y +=Registry.HEADER_HEIGHT;gridObjects.push(burstplant);return 0; + } else if(name=="Dash_Pad"){ + var dashpad:Dash_Pad=new Dash_Pad(sprite, player, parent_state); + dashpad.y +=Registry.HEADER_HEIGHT;parent_state.bg_sprites.add(dashpad);return -1; + } else if(name=="Elevator"){ + var elevator:Elevator=new Elevator(sprite, player, parent_state); + elevator.y +=Registry.HEADER_HEIGHT;parent_state.fg_sprites.add(elevator); + return -1; + } else if(name=="Eye_Boss"){ + var eyeboss:Eye_Boss=new Eye_Boss(sprite, player, parent_state); + eyeboss.y +=Registry.HEADER_HEIGHT; + if(Eye_Boss.global_state !=eyeboss.gs_water){ + gridObjects.push(eyeboss); + } else { + parent_state.bg_sprites.add(eyeboss); + } + return -1; + } else if(name=="HealthPickup"){ + var healthpickup:HealthPickup=new HealthPickup(x, y + 20, parseInt(sprite.@type), parent_state, sprite); + + gridObjects.push(healthpickup);return 0;//broken + } else if(name=="Contort"){ + var contort:Contort=new Contort(sprite, player, parent_state); + contort.y +=Registry.HEADER_HEIGHT; + gridObjects.push(contort);return 0; + } else if(name=="Lion"){ + var lion:Lion=new Lion(sprite, player, parent_state); + lion.y +=Registry.HEADER_HEIGHT; + gridObjects.push(lion);return 0; + } else if(name=="Circus_Folks"){ + var circus_folk:Circus_Folks=new Circus_Folks(sprite, player, parent_state); + circus_folk.y +=Registry.HEADER_HEIGHT; + gridObjects.push(circus_folk);return 0; + + } else if(name=="Fire_Pillar"){ + var fire_pillar:Fire_Pillar=new Fire_Pillar(sprite, player, parent_state); + fire_pillar.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fire_pillar);return 0; + } else if(name=="solid_tile"){ + var g:FlxTilemap; + var tx:Int; + var ty:Int; + + g=parent_state.curMapBuf; + tx=Std.int((x % 160)/ 16); + ty=Std.int(((y - 20)% 160)/ 16); + g.setTileByIndex(10 * ty + tx,1, false); + + // Now set the BG2 and FG2 layers since they don't load dynamically. + tx=Std.int(x / 16); + ty=Std.int((y - 20)/ 16); + + g=parent_state.map_bg_2; + g.setTileByIndex(g.widthInTiles * ty + tx, 1, false); + g=parent_state.map_fg; + g.setTileByIndex(g.widthInTiles * ty + tx, 1, false); + + } else if(name=="Sage"){ + var sage:Sage=new Sage(player, parent_state, sprite); + sage.y +=Registry.HEADER_HEIGHT; + gridObjects.push(sage);return 0; + } else if(name=="Mitra"){ + var mitra:Mitra=new Mitra(player, parent_state, sprite); + mitra.y +=Registry.HEADER_HEIGHT; + gridObjects.push(mitra);return 0; + } else if(name=="Health_Cicada"){ + var hc:Health_Cicada=new Health_Cicada(player, parent_state, sprite); + hc.y +=Registry.HEADER_HEIGHT; + parent_state.header_group.add(hc.boxes); + parent_state.header_group.add(hc); + + Registry.subgroup_destroyems.push(hc); + return -1; + } else if(name=="Dungeon_Statue"){ + var dunst:Dungeon_Statue=new Dungeon_Statue(player, parent_state, sprite); + dunst.y +=Registry.HEADER_HEIGHT; + gridObjects.push(dunst); + return 0; + } else if(name=="Chaser"){ + var chaser:Chaser=new Chaser(sprite, player, parent_state); + chaser.y +=Registry.HEADER_HEIGHT; + gridObjects.push(chaser); + return 0; + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + if(name=="Suburb_Walker"){ + var subwalk:Suburb_Walker=new Suburb_Walker(new Array(sprite, player, parent_state,true)); + gridObjects.push(subwalk); + return 0; + } else if(name=="Suburb_Killer"){ + var subkiller:Suburb_Killer=new Suburb_Killer(new Array(sprite, player, parent_state,true)); + gridObjects.push(subkiller); + return 0; + } + } else if(name=="Space_Face"){ + var space_face:Space_Face=new Space_Face(new Array(sprite, player, parent_state,true)); + gridObjects.push(space_face); + return 0; + } else if(name=="Water_Anim"){ + var waternaim:Water_Anim=new Water_Anim(new Array(sprite, player, parent_state)); + gridObjects.push(waternaim); + return 0; + } else if(name=="Go_Detector"){ + var gd:Go_Detector=new Go_Detector(new Array(sprite, player, parent_state,true)); + gridObjects.push(gd); + return 0; + } else if(name=="Sage_Boss"){ + var sbb:Sage_Boss=new Sage_Boss(new Array(sprite, player, parent_state, true)); + gridObjects.push(sbb); + return 0; + } else if(name=="Shadow_Briar"){ + if(Registry.CURRENT_MAP_NAME=="GO"){ + var briarboss:Briar_Boss=new Briar_Boss(new Array(sprite, player, parent_state, true)); + gridObjects.push(briarboss); + return 0; + } + var sbri:Shadow_Briar=new Shadow_Briar(new Array(sprite, player, parent_state, true)); + gridObjects.push(sbri); + return 0; + } else if(name=="Trade_NPC"){ //cat, monster, shopkeeper - in FIELDS + var tradenpc:Trade_NPC=new Trade_NPC(new Array(sprite, player, parent_state, true)); + // only add to statelesses or wahetvver if it isnt the cat + if(parseInt(sprite.@frame)!=0){ + gridObjects.push(tradenpc); + return 0; + } + return -1; + } else if(name=="Forest_NPC"){ + var forestnpc:Forest_NPC=new Forest_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(forestnpc); + return 0; + } else if(name=="Redsea_NPC"){ + var redseanpc:Redsea_NPC=new Redsea_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(redseanpc); + return 0; + } else if(name=="Happy_NPC"){ + var hapnpc:Happy_NPC=new Happy_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(hapnpc); + return 0; + } else if(name=="Space_NPC"){ + var spacenpc:Space_NPC=new Space_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(spacenpc); + return 0; + } else if(name=="Huge_Fucking_Stag"){ + var hfs:Huge_Fucking_Stag=new Huge_Fucking_Stag(new Array(sprite, player, parent_state, true)); + gridObjects.push(hfs); + return 0; + } else if(name=="Black_Thing"){ + var blackthing:Black_Thing=new Black_Thing(new Array(sprite, player, parent_state, true)); + gridObjects.push(blackthing); + } + + + + return -1; + } + + public static function deal_with_event(e:XML,parent:Dynamic=null):Int { + var event_type:Int=parseInt(e.@frame); + + switch(event_type){ + case EVENT_TYPE_DARKNESS_ALPHA: + Registry.EVENT_CHANGE_DARKNESS_ALPHA=true; + Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET=parseFloat(e.@type); + break; + case EVENT_TYPE_SCALE_VOLUME: + Registry.EVENT_CHANGE_VOLUME_SCALE=true; + Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET=parseFloat(e.@type); + break; + case EVENT_TYPE_SET_ENTRANCE: + var checkpoint:Checkpoint=new Checkpoint(parent.player, parent, e); + checkpoint.y +=Registry.HEADER_HEIGHT; + parent.bg_sprites.add(checkpoint); + break; + case EVENT_TYPE_TEXT: + var font:FlxBitmapFont; + if(e.@type.toString()=="street1"){ + font=EventScripts.init_bitmap_font(" ", "center", 0, 0, new Point(1, 1), "apple_white"); + } else { + font=EventScripts.init_bitmap_font(" ", "center", 0, 0, new Point(1, 1), "apple_black"); + } + font.setText(set_text_event(e.@type.toString()),true,0,0,"center",true); + font.x=parseInt(e.@x); + font.y=parseInt(e.@y); + parent.bg_sprites.add(font); + //parent.sortables.add(font); + font.y +=Registry.HEADER_HEIGHT; + return 1; + + break; + case EVENT_TYPE_STATIC_OFF: + PlayState.GFX_STATIC_ALWAYS_ON=false; + parent.dec_over.exists=false; + break; + } + return 0; + } + + public static function set_text_event(type:String):String { + if(type=="blank1"){ + return " \nMove with \n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT]; + } else if(type=="blank2"){ + return "Interact with\nthe " + Registry.controls[Keys.IDX_ACTION_1] + " key."; + } else if(type=="blank3"){ + if(!Intra.is_demo){ + return "Press " + Registry.controls[Keys.IDX_PAUSE] + " \nto open the menu \nand save the game.\n"; + } else { + return " "; + } + + } else if(type=="street1"){ + return "Attack to pick up\nand drop dust."; + } + return "a"; + + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/SteamThing.hx b/AIR/intra/hsrc/helper/SteamThing.hx new file mode 100644 index 0000000..f62f047 --- /dev/null +++ b/AIR/intra/hsrc/helper/SteamThing.hx @@ -0,0 +1,16 @@ +package helper +{ +import com.amanitadesign.steam.FRESteamWorks; +/** + * ... + * @author Melos Han-Tani + */ +class SteamThing +{ + + public var SteamWorks:FRESteamWorks; + public function init():Void { + SteamWorks=new FRESteamWorks(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/helper/UI_Offsets.hx b/AIR/intra/hsrc/helper/UI_Offsets.hx new file mode 100644 index 0000000..88b3653 --- /dev/null +++ b/AIR/intra/hsrc/helper/UI_Offsets.hx @@ -0,0 +1,170 @@ +package helper +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.FlxG; +/** + * ... + * @author Copyright Melos Han-Tani, Developer of Analgesic Productions LLC, 2013 - ? , www.twitter.com/seagaia2 + */ +class UI_Offsets +{ + + public function new() + { + // Set defaults + } + + public var save_array:Array; + + public var portrait_dpad:Point=new Point(); + public var portrait_x_a1:Point=new Point(); + public var portrait_c_a2:Point=new Point(); + public var portrait_pause:Point=new Point(); + public var portrait_game:Point=new Point(); + + public var landscape_dpad:Point=new Point(); + public var landscape_x_a1:Point=new Point(); + public var landscape_c_a2:Point=new Point(); + public var landscape_pause:Point=new Point(); + public var landscape_game:Point=new Point(); + + public var scale_portrait_dpad:Float=1; + public var scale_portrait_x_a1:Float=1; + public var scale_portrait_c_a2:Float=1; + public var scale_portrait_pause:Float=1; + public var scale_portrait_game:Float=1; + + public var scale_landscape_dpad:Float=1; + public var scale_landscape_x_a1:Float=1; + public var scale_landscape_c_a2:Float=1; + public var scale_landscape_pause:Float=1; + public var scale_landscape_game:Float=1; + + public function get_save_array():Array { + var a:Array=new Array( + portrait_dpad.x, portrait_dpad.y, scale_portrait_dpad, + portrait_x_a1.x, portrait_x_a1.y, scale_portrait_x_a1, + portrait_c_a2.x, portrait_c_a2.y, scale_portrait_c_a2, + portrait_pause.x, portrait_pause.y, scale_portrait_pause, + portrait_game.x,portrait_game.y,scale_portrait_game, + landscape_dpad.x, landscape_dpad.y, scale_landscape_dpad, + landscape_x_a1.x, landscape_x_a1.y, scale_landscape_x_a1, + landscape_c_a2.x, landscape_c_a2.y, scale_landscape_c_a2, + landscape_pause.x, landscape_pause.y, scale_landscape_pause, + landscape_game.x,landscape_game.y,scale_landscape_game); + return a; + + + } + + public function load_save_array(a:Array):Void { + if(a==null)return; + save_array=a; + portrait_dpad.x=a[0];portrait_dpad.y=a[1];scale_portrait_dpad=a[2]; + portrait_x_a1.x=a[3];portrait_x_a1.y=a[4];scale_portrait_x_a1=a[5]; + portrait_c_a2.x=a[6];portrait_c_a2.y=a[7];scale_portrait_c_a2=a[8]; + portrait_pause.x=a[9];portrait_pause.y=a[10];scale_portrait_pause=a[11]; + portrait_game.x=a[12];portrait_game.y=a[13];scale_portrait_game=a[14]; + landscape_dpad.x=a[15];landscape_dpad.y=a[16];scale_landscape_dpad=a[17]; + landscape_x_a1.x=a[18];landscape_x_a1.y=a[19];scale_landscape_x_a1=a[20]; + landscape_c_a2.x=a[21];landscape_c_a2.y=a[22];scale_landscape_c_a2=a[23]; + landscape_pause.x=a[24];landscape_pause.y=a[25];scale_landscape_pause=a[26]; + landscape_game.x=a[27];landscape_game.y=a[28];scale_landscape_game=a[29]; + } + + public function set_defaults(sw:Int, sh:Int,fsw:Int,fsh:Int,only_land:Bool=false,only_portrait:Bool=false):Void { + + var l:Int=sw>sh ? sw:sh; + var s:Int=sw>sh ? sh:sw; + + trace(s, l); + //Landscape + //scale_landscape_game=Std.int(3 *(s / 540.0))/ 3.0; + if(!only_portrait){ + scale_landscape_game=(s / 540.0); + + var margin_w:Int=(l - 480.0 * scale_landscape_game)/ 2; + scale_landscape_dpad=Std.int(4 *((margin_w - 8)/ 144.0))/ 4.0; + if(scale_landscape_dpad<=0.85){ + scale_landscape_dpad=1; + } + landscape_dpad.x=(margin_w - 144.0 * scale_landscape_dpad)/ 2.0; + if(s<600){ + landscape_dpad.y=(s - 144.0 * scale_landscape_dpad); + } else { + landscape_dpad.y=(s - 144.0 * scale_landscape_dpad)/ 2.0; + } + if(landscape_dpad.x<0)landscape_dpad.x=0; + + scale_landscape_x_a1=scale_landscape_c_a2=Std.int(4 *((margin_w - 6)/(2 * 48.0)))/ 4.0; + if(scale_landscape_c_a2<1){ + scale_landscape_c_a2=scale_landscape_x_a1=1; + } + landscape_x_a1.x=(l - margin_w)+((margin_w / 2)-(48.0 * scale_landscape_x_a1))/ 2.0; + landscape_c_a2.x=landscape_x_a1.x +(margin_w / 2); + + var action_bottom:Int=3 *(s / 5.0); + landscape_x_a1.y=action_bottom - 96.0 * scale_landscape_x_a1; + landscape_c_a2.y=action_bottom - 96.0 * scale_landscape_c_a2; + + scale_landscape_pause=Std.int(4 *((margin_w - 6)/ 96.0))/ 4.0; + landscape_pause.x=(l - margin_w)+(margin_w -(scale_landscape_pause * 96.0))/ 2; + landscape_pause.y=s - 4.0 - 48 * scale_landscape_pause; + + + landscape_game.x=(l - 480.0 * scale_landscape_game)/ 2; + landscape_game.x /=scale_landscape_game;// ??? + landscape_game.y=(s - 540.0 * scale_landscape_game)/ 2; + landscape_game.y /=scale_landscape_game; + } + // Portrait + //scale_portrait_game=Std.int(3*((2*l / 3)/ 480.0))/3.0; + if(!only_land){ + scale_portrait_game=Math.min((2 * l / 3)/ 480.0, s / 480.0); + var game_bottom:Int=scale_portrait_game * 540.0; + var margin_h:Int=l - game_bottom; + action_bottom=(game_bottom +(3 / 4)* margin_h); + margin_w=s / 2; + + scale_portrait_dpad=Std.int(3 *((Math.min(margin_h, margin_w)* 0.9)/ 144.0))/ 3.0; + if(scale_portrait_dpad<=1){ + scale_portrait_dpad=0.85; + } + portrait_dpad.x=(margin_w - 144.0 * scale_portrait_dpad)/ 2.0; + portrait_dpad.y=((margin_h - scale_portrait_dpad * 144.0)/ 2)+ game_bottom; + + scale_portrait_c_a2=scale_portrait_x_a1=Math.min(int(4 *((margin_w * 0.8)/(2 * 48.0)))/ 4.0, Std.int(4 *(((3 / 4)* margin_h - 6)/ 96.0))/ 4.0); + if(scale_portrait_c_a2<1){ // on a fucking iphone + scale_portrait_c_a2=0.86; + scale_portrait_x_a1=0.86; + } + portrait_x_a1.x=(margin_w)+((margin_w / 2.0)-(48.0 * scale_portrait_x_a1))/ 2.0; + portrait_c_a2.x=portrait_x_a1.x +(margin_w / 2.0); + + portrait_c_a2.y=portrait_x_a1.y=game_bottom +((action_bottom - game_bottom)-(scale_portrait_c_a2 * 96.0))/ 2.0; + + scale_portrait_pause=Math.min(int(((margin_w * 0.8)/ 96.0)* 2)/ 2.0, Std.int(((margin_h * 0.9 * .25)/ 48.0)* 2)/ 2.0); + if(scale_portrait_pause<1)scale_portrait_pause=0.77; + portrait_pause.x=((margin_w - 96.0 * scale_portrait_pause)/ 2)+ margin_w; + portrait_pause.y=action_bottom +((l - action_bottom)-(48.0 * scale_portrait_pause))/ 2.0; + + if(scale_portrait_pause<1){ + portrait_pause.y -=2; + } + + + portrait_game.x=(s - 480.0 * scale_portrait_game)/ 2; + portrait_game.x /=scale_portrait_game; + portrait_game.y=0; + } + //scale_portrait_game=Std.int(3*((2*l / 3)/ 480.0))/3.0; + //scale_landscape_game=Std.int(3 *(s / 540.0))/ 3.0; + + + + //Intra.scale_ctr=Intra.SCALE_TYPE_FIT; + //var i:Intra=FlxG._game as Intra; + //i.resize_mobile_game(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/AnoSprite.hx b/AIR/intra/hsrc/org/flixel/AnoSprite.hx new file mode 100644 index 0000000..0c4d91d --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/AnoSprite.hx @@ -0,0 +1,48 @@ +package org.flixel +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +/** + * ... + * @author ... + */ +class AnoSprite extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var state:Int; + public var tl:Point; + private var dame_frame:Int; + private var did_init:Bool=false; + + /** + * Creates a flxsprite but with the args that most entities in anodyne have. + * Should be:[XML,Player ref,Parent,offset_the_y] + * offset_the_y is a boolean, if true then we add 20 to the DAME y- value + * @param args + */ + public function new(args:Array) + { + xml=args[0]; + player=args[1]; + parent=args[2]; + + super(parseInt(xml.@x), parseInt(xml.@y)); + + if(args.length>3){ + args[3] ? y +=Registry.HEADER_HEIGHT:1; + } + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + + } + + override public function destroy():Void + { + tl=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxBasic.hx b/AIR/intra/hsrc/org/flixel/FlxBasic.hx new file mode 100644 index 0000000..8a0447f --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxBasic.hx @@ -0,0 +1,153 @@ +package org.flixel; + +/** + * This is a useful "generic" Flixel object. + * BothFlxObjectandFlxGroupextend this class, + * as do the plugins. Has no size, position or graphical data. + * + * @author Adam Atomic + */ +class FlxBasic +{ + static Internal var _ACTIVECOUNT:Int; + static Internal var _VISIBLECOUNT:Int; + + /** + * IDs seem like they could be pretty useful, huh? + * They're not actually used for anything yet though. + */ + public var ID:Int; + /** + * Controls whetherupdate()anddraw()are automatically called by FlxState/FlxGroup. + */ + public var exists:Bool; + /** + * Controls whetherupdate()is automatically called by FlxState/FlxGroup. + */ + public var active:Bool; + /** + * Controls whetherdraw()is automatically called by FlxState/FlxGroup. + */ + public var visible:Bool; + /** + * Useful state for many game objects - "dead"(!alive)vs alive. + *kill()andrevive()both flip this switch(along with exists, but you can override that). + */ + public var alive:Bool; + /** + * An array of camera objects that this object will use duringdraw(). + * This value will initialize itself during the first draw to automatically + * point at the main camera list out inFlxGunless you already set it. + * You can also change it afterward too, very flexible! + */ + public var cameras:Array; + /** + * Setting this to true will prevent the object from appearing + * when the visual debug mode in the debugger overlay is toggled on. + */ + public var ignoreDrawDebug:Bool; + + /** + * Instantiate the basic flixel object. + */ + public function new() + { + ID=-1; + exists=true; + active=true; + visible=true; + alive=true; + ignoreDrawDebug=false; + } + + /** + * Override this function to null out variables or manually call + *destroy()on class members if necessary. + * Don't forget to callsuper.destroy()! + */ + public function destroy():Void {} + + /** + * Pre-update is called right beforeupdate()on each object in the game loop. + */ + public function preUpdate():Void + { + _ACTIVECOUNT++; + } + + /** + * Override this function to update your class's position and appearance. + * This is where most of your game rules and behavioral code will go. + */ + public function update():Void + { + } + + /** + * Post-update is called right afterupdate()on each object in the game loop. + */ + public function postUpdate():Void + { + } + + /** + * Override this function to control how the object is drawn. + * Overridingdraw()is rarely necessary, but can be very useful. + */ + public function draw():Void + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObject.reset(). + */ + public function revive():Void + { + alive=true; + exists=true; + } + + /** + * Convert object to readable string name. Useful for debugging, save games, etc. + */ + public function toString():String + { + return FlxU.getClassName(this,true); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxButton.hx b/AIR/intra/hsrc/org/flixel/FlxButton.hx new file mode 100644 index 0000000..efd3332 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxButton.hx @@ -0,0 +1,355 @@ +package org.flixel; + +import flash.events.MouseEvent; + +/** + * A simple button class that calls a function when clicked by the mouse. + * + * @author Adam Atomic + */ +class FlxButton extends FlxSprite +{ + //[Embed(source="data/button.png")] private var ImgDefaultButton:Class; + //[Embed(source="data/beep.mp3")] private var SndBeep:Class; + + /** + * Used with public variablestatus, means not highlighted or pressed. + */ + static public var NORMAL:Int=0; + /** + * Used with public variablestatus, means highlighted(usually from mouse over). + */ + static public var HIGHLIGHT:Int=1; + /** + * Used with public variablestatus, means pressed(usually from mouse click). + */ + static public var PRESSED:Int=2; + + /** + * The text that appears on the button. + */ + public var label:FlxText; + /** + * Controls the offset(from top left)of the text from the button. + */ + public var labelOffset:FlxPoint; + /** + * This function is called when the button is released. + * We recommend assigning your main button behavior to this function + * via theFlxButtonconstructor. + */ + public var onUp:Function; + /** + * This function is called when the button is pressed down. + */ + public var onDown:Function; + /** + * This function is called when the mouse goes over the button. + */ + public var onOver:Function; + /** + * This function is called when the mouse leaves the button area. + */ + public var onOut:Function; + /** + * Shows the current state of the button. + */ + public var status:Int; + /** + * Set this to play a sound when the mouse goes over the button. + * We recommend using the helper function setSounds()! + */ + public var soundOver:FlxSound; + /** + * Set this to play a sound when the mouse leaves the button. + * We recommend using the helper function setSounds()! + */ + public var soundOut:FlxSound; + /** + * Set this to play a sound when the button is pressed down. + * We recommend using the helper function setSounds()! + */ + public var soundDown:FlxSound; + /** + * Set this to play a sound when the button is released. + * We recommend using the helper function setSounds()! + */ + public var soundUp:FlxSound; + + /** + * Used for checkbox-style behavior. + */ + private var _onToggle:Bool; + + /** + * Tracks whether or not the button is currently pressed. + */ + private var _pressed:Bool; + /** + * Whether or not the button has initialized itself yet. + */ + private var _initialized:Bool; + + /** + * Creates a newFlxButtonobject with a gray background + * and a callback function on the UI thread. + * + * @param X The X position of the button. + * @param Y The Y position of the button. + * @param Label The text that you want to appear on the button. + * @param OnClick The function to call whenever the button is clicked. + */ + public function new(X:Float=0,Y:Float=0,Label:String=null,OnClick:Function=null) + { + super(X,Y); + if(Label !=null) + { + label=new FlxText(0,0,80,Label); + label.setFormat(null,8,0x333333,"center"); + labelOffset=new FlxPoint(-1,3); + } + loadGraphic(ImgDefaultButton,true,false,80,20); + + onUp=OnClick; + onDown=null; + onOut=null; + onOver=null; + + soundOver=null; + soundOut=null; + soundDown=null; + soundUp=null; + + status=NORMAL; + _onToggle=false; + _pressed=false; + _initialized=false; + } + + /** + * Called by the game state when state is changed(if this object belongs to the state) + */ + override public function destroy():Void + { + if(FlxG.stage !=null) + FlxG.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); + if(label !=null) + { + label.destroy(); + label=null; + } + onUp=null; + onDown=null; + onOut=null; + onOver=null; + if(soundOver !=null) + soundOver.destroy(); + if(soundOut !=null) + soundOut.destroy(); + if(soundDown !=null) + soundDown.destroy(); + if(soundUp !=null) + soundUp.destroy(); + super.destroy(); + } + + /** + * Since button uses its own mouse handler for thread reasons, + * we run a little pre-check here to make sure that we only add + * the mouse handler when it is actually safe to do so. + */ + override public function preUpdate():Void + { + super.preUpdate(); + + if(!_initialized) + { + if(FlxG.stage !=null) + { + FlxG.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + _initialized=true; + } + } + } + + /** + * Called by the game loop automatically, handles mouseover and click detection. + */ + override public function update():Void + { + updateButton();//Basic button logic + + //Default button appearance is to simply update + // the label appearance based on animation frame. + if(label==null) + return; + switch(frame) + { + case HIGHLIGHT: //Extra behavior to accomodate checkbox logic. + label.alpha=1.0; + break; + case PRESSED: + label.alpha=0.5; + label.y++; + break; + case NORMAL: + default: + label.alpha=0.8; + break; + } + } + + /** + * Basic button update logic + */ + private function updateButton():Void + { + //Figure out if the button is highlighted or pressed or what + //(ignore checkbox behavior for now). + if(FlxG.mouse.visible) + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + var offAll:Bool=true; + while(iFlxU.openURL()). + */ + private function onMouseUp(event:MouseEvent):Void + { + if(!exists || !visible || !active ||(status !=PRESSED)) + return; + if(onUp !=null) + onUp(); + if(soundUp !=null) + soundUp.play(true); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxCamera.hx b/AIR/intra/hsrc/org/flixel/FlxCamera.hx new file mode 100644 index 0000000..fdf4ff2 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxCamera.hx @@ -0,0 +1,711 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.ColorTransform; +import flash.geom.Point; +import flash.geom.Rectangle; +import helper.EventScripts; + +/** + * The camera class is used to display the game's visuals in the Flash player. + * By default one camera is created automatically, that is the same size as the Flash player. + * You can add more cameras or even replace the main camera using utilities inFlxG. + * + * @author Adam Atomic + */ +class FlxCamera extends FlxBasic +{ + /** + * Camera "follow" style preset:camera has no deadzone, just tracks the focus object directly. + */ + static public static inline var STYLE_LOCKON:Int=0; + /** + * Camera "follow" style preset:camera deadzone is narrow but tall. + */ + static public static inline var STYLE_PLATFORMER:Int=1; + /** + * Camera "follow" style preset:camera deadzone is a medium-size square around the focus object. + */ + static public static inline var STYLE_TOPDOWN:Int=2; + /** + * Camera "follow" style preset:camera deadzone is a small square around the focus object. + */ + static public static inline var STYLE_TOPDOWN_TIGHT:Int=3; + + /** + * Camera "shake" effect preset:shake camera on both the X and Y axes. + */ + static public static inline var SHAKE_BOTH_AXES:Int=0; + /** + * Camera "shake" effect preset:shake camera on the X axis only. + */ + static public static inline var SHAKE_HORIZONTAL_ONLY:Int=1; + /** + * Camera "shake" effect preset:shake camera on the Y axis only. + */ + static public static inline var SHAKE_VERTICAL_ONLY:Int=2; + + /** + * While you can alter the zoom of each camera after the fact, + * this variable determines what value the camera will start at when created. + */ + static public var defaultZoom:Float; + + /** + * The X position of this camera's display. Zoom does NOT affect this number. + * Measured in pixels from the left side of the flash window. + */ + public var x:Int; + /** + * The Y position of this camera's display. Zoom does NOT affect this number. + * Measured in pixels from the top of the flash window. + */ + public var y:Int; + /** + * How wide the camera display is, in game pixels. + */ + public var width:Int; + /** + * How tall the camera display is, in game pixels. + */ + public var height:Int; + /** + * Tells the camera to follow thisFlxObjectobject around. + */ + public var target:FlxObject; + /** + * You can assign a "dead zone" to the camera in order to better control its movement. + * The camera will always keep the focus object inside the dead zone, + * unless it is bumping up against the bounds rectangle's edges. + * The deadzone's coordinates are measured from the camera's upper left corner in game pixels. + * For rapid prototyping, you can use the preset deadzones(e.g.STYLE_PLATFORMER)withfollow(). + */ + public var deadzone:FlxRect; + /** + * The edges of the camera's range, i.e. where to stop scrolling. + * Measured in game pixels and world coordinates. + */ + public var bounds:FlxRect; + + /** + * Stores the basic parallax scrolling values. + */ + public var scroll:FlxPoint; + /** + * The actual bitmap data of the camera display itself. + */ + public var buffer:BitmapData; + /** + * The natural background color of the camera. Defaults to FlxG.bgColor. + * NOTE:can be transparent for crazy FX! + */ + public var bgColor:Int; + /** + * Sometimes it's easier to just work with aFlxSpritethan it is to work + * directly with theBitmapDatabuffer. This sprite reference will + * allow you to do exactly that. + */ + public var screen:FlxSprite; + + /** + * Indicates how far the camera is zoomed in. + */ + private var _zoom:Float; + /** + * Internal, to help avoid costly allocations. + */ + private var _point:FlxPoint; + /** + * Internal, help with color transforming the flash bitmap. + */ + private var _color:Int; + + /** + * Internal, used to render buffer to screen space. + */ + private var _flashBitmap:Bitmap; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashSprite:Sprite; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashOffsetX:Float; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashOffsetY:Float; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashRect:Rectangle; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashPoint:Point; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashColor:Int; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashDuration:Float; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashComplete:Function; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashAlpha:Float; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeColor:Int; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeDuration:Float; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeComplete:Function; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeAlpha:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeIntensity:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeDuration:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeComplete:Function; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeOffset:FlxPoint; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeDirection:Int; + /** + * Internal helper variable for doing better wipes/fills between renders. + */ + private var _fill:BitmapData; + + /** + * Instantiates a new camera at the specified location, with the specified size and zoom level. + * + * @param X X location of the camera's display in pixels. Uses native, 1:1 resolution, ignores zoom. + * @param Y Y location of the camera's display in pixels. Uses native, 1:1 resolution, ignores zoom. + * @param Width The width of the camera display in pixels. + * @param Height The height of the camera display in pixels. + * @param Zoom The initial zoom level of the camera. A zoom level of 2 will make all pixels display at 2x resolution. + */ + public function new(X:Int,Y:Int,Width:Int,Height:Int,Zoom:Float=0) + { + x=X; + y=Y; + width=Width; + height=Height; + target=null; + deadzone=null; + scroll=new FlxPoint(); + _point=new FlxPoint(); + bounds=null; + screen=new FlxSprite(); + screen.makeGraphic(width,height,0,true); + screen.setOriginToCorner(); + buffer=screen.pixels; + bgColor=FlxG.bgColor; + _color=0xffffff; + + _flashBitmap=new Bitmap(buffer); + _flashBitmap.x=-width*0.5; + _flashBitmap.y=-height*0.5; + _flashSprite=new Sprite(); + zoom=Zoom;//sets the scale of flash sprite, which in turn loads flashoffset values + _flashOffsetX=width*0.5*zoom; + _flashOffsetY=height*0.5*zoom; + _flashSprite.x=x + _flashOffsetX; + _flashSprite.y=y + _flashOffsetY; + _flashSprite.addChild(_flashBitmap); + _flashRect=new Rectangle(0,0,width,height); + _flashPoint=new Point(); + + _fxFlashColor=0; + _fxFlashDuration=0.0; + _fxFlashComplete=null; + _fxFlashAlpha=0.0; + + _fxFadeColor=0; + _fxFadeDuration=0.0; + _fxFadeComplete=null; + _fxFadeAlpha=0.0; + + _fxShakeIntensity=0.0; + _fxShakeDuration=0.0; + _fxShakeComplete=null; + _fxShakeOffset=new FlxPoint(); + _fxShakeDirection=0; + + _fill=new BitmapData(width,height,true,0); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + screen.destroy(); + screen=null; + target=null; + scroll=null; + deadzone=null; + bounds=null; + buffer=null; + _flashBitmap=null; + _flashRect=null; + _flashPoint=null; + _fxFlashComplete=null; + _fxFadeComplete=null; + _fxShakeComplete=null; + _fxShakeOffset=null; + _fill=null; + } + + /** + * Updates the camera scroll as well as special effects like screen-shake or fades. + */ + override public function update():Void + { + //Either follow the object closely, + //or doublecheck our deadzone and update accordingly. + if(target !=null) + { + if(deadzone==null) + focusOn(target.getMidpoint(_point)); + else + { + + var edge:Float; + var targetX:Float=target.x +((target.x>0)?0.0000001:-0.0000001); + var targetY:Float=target.y +((target.y>0)?0.0000001:-0.0000001); + edge=targetX - deadzone.x; + if(scroll.x>edge) + scroll.x=edge; + edge=targetX + target.width - deadzone.x - deadzone.width; + if(scroll.xedge) + scroll.y=edge; + edge=targetY + target.height - deadzone.y - deadzone.height; + if(scroll.ybounds.right - width) + scroll.x=bounds.right - width; + if(scroll.ybounds.bottom - height) + scroll.y=bounds.bottom - height; + } + + //Update the "flash" special effect + if(_fxFlashAlpha>0.0) + { + _fxFlashAlpha -=FlxG.elapsed/_fxFlashDuration; + if((_fxFlashAlpha<=0)&&(_fxFlashComplete !=null)) + _fxFlashComplete(); + } + + //Update the "fade" special effect + if((_fxFadeAlpha>0.0)&&(_fxFadeAlpha<1.0)) + { + _fxFadeAlpha +=FlxG.elapsed/_fxFadeDuration; + if(_fxFadeAlpha>=1.0) + { + _fxFadeAlpha=1.0; + if(_fxFadeComplete !=null) + _fxFadeComplete(); + } + } + + //Update the "shake" special effect + if(_fxShakeDuration>0) + { + _fxShakeDuration -=FlxG.elapsed; + if(_fxShakeDuration<=0) + { + _fxShakeOffset.make(); + if(_fxShakeComplete !=null) + _fxShakeComplete(); + } + else + { + if((_fxShakeDirection==SHAKE_BOTH_AXES)||(_fxShakeDirection==SHAKE_HORIZONTAL_ONLY)) + _fxShakeOffset.x=(FlxG.random()*_fxShakeIntensity*width*2-_fxShakeIntensity*width)*_zoom; + if((_fxShakeDirection==SHAKE_BOTH_AXES)||(_fxShakeDirection==SHAKE_VERTICAL_ONLY)) + _fxShakeOffset.y=(FlxG.random()*_fxShakeIntensity*height*2-_fxShakeIntensity*height)*_zoom; + } + } + } + + /** + * Tells this camera object whatFlxObjectto track. + * + * @param Target The object you want the camera to track. Set to null to not follow anything. + * @param Style Leverage one of the existing "deadzone" presets. If you use a custom deadzone, ignore this parameter and manually specify the deadzone after callingfollow(). + */ + public function follow(Target:FlxObject, Style:Int=STYLE_LOCKON):Void + { + target=Target; + var helper:Float; + switch(Style) + { + case STYLE_PLATFORMER: + var w:Float=width/8; + var h:Float=height/3; + deadzone=new FlxRect((width-w)/2,(height-h)/2 - h*0.25,w,h); + break; + case STYLE_TOPDOWN: + helper=FlxU.max(width,height)/4; + deadzone=new FlxRect((width-helper)/2,(height-helper)/2,helper,helper); + break; + case STYLE_TOPDOWN_TIGHT: + helper=FlxU.max(width,height)/8; + deadzone=new FlxRect((width-helper)/2,(height-helper)/2,helper,helper); + break; + case STYLE_LOCKON: + default: + deadzone=null; + break; + } + } + + /** + * Move the camera focus to this location instantly. + * + * @param Point Where you want the camera to focus. + */ + public function focusOn(Point:FlxPoint):Void + { + Point.x +=(Point.x>0)?0.0000001:-0.0000001; + Point.y +=(Point.y>0)?0.0000001:-0.0000001; + scroll.make(Point.x - width*0.5,Point.y - height*0.5); + } + + /** + * Specify the boundaries of the level or where the camera is allowed to move. + * + * @param X The smallest X value of your level(usually 0). + * @param Y The smallest Y value of your level(usually 0). + * @param Width The largest X value of your level(usually the level width). + * @param Height The largest Y value of your level(usually the level height). + * @param UpdateWorld Whether the global quad-tree's dimensions should be updated to match(default:false). + */ + public function setBounds(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0, UpdateWorld:Bool=false):Void + { + if(bounds==null) + bounds=new FlxRect(); + bounds.make(X,Y,Width,Height); + if(UpdateWorld) + FlxG.worldBounds.copyFrom(bounds); + update(); + } + + /** + * The screen is filled with this color and gradually returns to normal. + * + * @param Color The color you want to use. + * @param Duration How long it takes for the flash to fade. + * @param OnComplete A function you want to run when the flash finishes. + * @param Force Force the effect to reset. + */ + public function flash(Color:Int=0xffffffff, Duration:Float=1, OnComplete:Function=null, Force:Bool=false):Void + { + if(!Force &&(_fxFlashAlpha>0.0)) + return; + _fxFlashColor=Color; + if(Duration<=0) + Duration=Number.MIN_VALUE; + _fxFlashDuration=Duration; + _fxFlashComplete=OnComplete; + _fxFlashAlpha=1.0; + } + + /** + * The screen is gradually filled with this color. + * + * @param Color The color you want to use. + * @param Duration How long it takes for the fade to finish. + * @param OnComplete A function you want to run when the fade finishes. + * @param Force Force the effect to reset. + */ + public function fade(Color:Int=0xff000000, Duration:Float=1, OnComplete:Function=null, Force:Bool=false):Void + { + if(!Force &&(_fxFadeAlpha>0.0)) + return; + _fxFadeColor=Color; + if(Duration<=0) + Duration=Number.MIN_VALUE; + _fxFadeDuration=Duration; + _fxFadeComplete=OnComplete; + _fxFadeAlpha=Number.MIN_VALUE; + } + + /** + * A simple screen-shake effect. + * + * @param Intensity Percentage of screen size representing the maximum distance that the screen can move while shaking. + * @param Duration The length in seconds that the shaking effect should last. + * @param OnComplete A function you want to run when the shake effect finishes. + * @param Force Force the effect to reset(default=true, unlike flash()and fade()!). + * @param Direction Whether to shake on both axes, just up and down, or just side to side(use class constants SHAKE_BOTH_AXES, SHAKE_VERTICAL_ONLY, or SHAKE_HORIZONTAL_ONLY). + */ + public function shake(Intensity:Float=0.05, Duration:Float=0.5, OnComplete:Function=null, Force:Bool=true, Direction:Int=SHAKE_BOTH_AXES):Void + { + if(!Force &&((_fxShakeOffset.x !=0)||(_fxShakeOffset.y !=0))) + return; + _fxShakeIntensity=Intensity; + _fxShakeDuration=Duration; + _fxShakeComplete=OnComplete; + _fxShakeDirection=Direction; + _fxShakeOffset.make(); + } + + /** + * Just turns off all the camera effects instantly. + */ + public function stopFX():Void + { + _fxFlashAlpha=0.0; + _fxFadeAlpha=0.0; + _fxShakeDuration=0; + _flashSprite.x=x + width*0.5; + _flashSprite.y=y + height*0.5; + } + + /** + * Copy the bounds, focus object, and deadzone info from an existing camera. + * + * @param Camera The camera you want to copy from. + * + * @return A reference to thisFlxCameraobject. + */ + public function copyFrom(Camera:FlxCamera):FlxCamera + { + if(Camera.bounds==null) + bounds=null; + else + { + if(bounds==null) + bounds=new FlxRect(); + bounds.copyFrom(Camera.bounds); + } + target=Camera.target; + if(target !=null) + { + if(Camera.deadzone==null) + deadzone=null; + else + { + if(deadzone==null) + deadzone=new FlxRect(); + deadzone.copyFrom(Camera.deadzone); + } + } + return this; + } + + /** + * The zoom level of this camera. 1=1:1, 2=2x zoom, etc. + */ + public var zoom(get_zoom, set_zoom):Float; + private function get_zoom():Float + { + return _zoom; + } + + /** + * @private + */ + private function set_zoom(Zoom:Float):Void + { + if(Zoom==0) + _zoom=defaultZoom; + else + _zoom=Zoom; + setScale(_zoom,_zoom); + } + + /** + * The alpha value of this camera display(a Float between 0.0 and 1.0). + */ + public var alpha(get_alpha, set_alpha):Float; + private function get_alpha():Float + { + return _flashBitmap.alpha; + } + + /** + * @private + */ + private function set_alpha(Alpha:Float):Void + { + _flashBitmap.alpha=Alpha; + } + + /** + * The angle of the camera display(in degrees). + * Currently yields weird display results, + * since cameras aren't nested in an extra display object yet. + */ + public var angle(get_angle, set_angle):Float; + private function get_angle():Float + { + return _flashSprite.rotation; + } + + /** + * @private + */ + private function set_angle(Angle:Float):Void + { + _flashSprite.rotation=Angle; + } + + /** + * The color tint of the camera display. + */ + public var color(get_color, set_color):Int; + private function get_color():Int + { + return _color; + } + + /** + * @private + */ + private function set_color(Color:Int):Void + { + _color=Color; + var colorTransform:ColorTransform=_flashBitmap.transform.colorTransform; + colorTransform.redMultiplier=(_color>>16)*0.00392; + colorTransform.greenMultiplier=(_color>>8&0xff)*0.00392; + colorTransform.blueMultiplier=(_color&0xff)*0.00392; + _flashBitmap.transform.colorTransform=colorTransform; + } + + /** + * Whether the camera display is smooth and filtered, or chunky and pixelated. + * Default behavior is chunky-style. + */ + public var antialiasing(get_antialiasing, set_antialiasing):Bool; + private function get_antialiasing():Bool + { + return _flashBitmap.smoothing; + } + + /** + * @private + */ + private function set_antialiasing(Antialiasing:Bool):Void + { + _flashBitmap.smoothing=Antialiasing; + } + + /** + * The scale of the camera object, irrespective of zoom. + * Currently yields weird display results, + * since cameras aren't nested in an extra display object yet. + */ + public function getScale():FlxPoint + { + return _point.make(_flashSprite.scaleX,_flashSprite.scaleY); + } + + /** + * @private + */ + public function setScale(X:Float,Y:Float):Void + { + _flashSprite.scaleX=X; + _flashSprite.scaleY=Y; + } + + /** + * Fetches a reference to the FlashSpriteobject + * that contains the camera display in the Flash display list. + * Uses include 3D projection, advanced display list modification, and more. + * NOTE:We don't recommend modifying this directly unless you are + * fairly experienced. For simple changes to the camera display, + * like scaling, rotation, and color tinting, we recommend + * using the existingFlxCameravariables. + * + * @return A FlashSpriteobject containing the camera display. + */ + public function getContainerSprite():Sprite + { + return _flashSprite; + } + + /** + * Fill the camera with the specified color. + * + * @param Color The color to fill with in 0xAARRGGBB hex format. + * @param BlendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is true. + */ + public function fill(Color:Int,BlendAlpha:Bool=true):Void + { + _fill.fillRect(_flashRect,Color); + buffer.copyPixels(_fill,_flashRect,_flashPoint,null,null,BlendAlpha); + } + + /** + * Internal helper function, handles the actual drawing of all the special effects. + */ + private function drawFX():Void + { + var alphaComponent:Float; + + //Draw the "flash" special effect onto the buffer + if(_fxFlashAlpha>0.0) + { + alphaComponent=_fxFlashColor>>24; + fill((uint(((alphaComponent<=0)?0xff:alphaComponent)*_fxFlashAlpha)<<24)+(_fxFlashColor&0x00ffffff)); + } + + //Draw the "fade" special effect onto the buffer + if(_fxFadeAlpha>0.0) + { + alphaComponent=_fxFadeColor>>24; + fill((uint(((alphaComponent<=0)?0xff:alphaComponent)*_fxFadeAlpha)<<24)+(_fxFadeColor&0x00ffffff)); + } + + if((_fxShakeOffset.x !=0)||(_fxShakeOffset.y !=0)) + { + _flashSprite.x=x + _flashOffsetX + _fxShakeOffset.x; + _flashSprite.y=y + _flashOffsetY + _fxShakeOffset.y; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxEmitter.hx b/AIR/intra/hsrc/org/flixel/FlxEmitter.hx new file mode 100644 index 0000000..fcfffd0 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxEmitter.hx @@ -0,0 +1,380 @@ +package org.flixel; + + +/** + *FlxEmitteris a lightweight particle emitter. + * It can be used for one-time explosions or for + * continuous fx like rain and fire.FlxEmitter + * is not optimized or anything;all it does is launch + *FlxParticleobjects out at set Intervals + * by setting their positions and velocities accordingly. + * It is easy to use and relatively efficient, + * relying onFlxGroup's RECYCLE POWERS. + * + * @author Adam Atomic + */ +class FlxEmitter extends FlxGroup +{ + /** + * The X position of the top left corner of the emitter in world space. + */ + public var x:Float; + /** + * The Y position of the top left corner of emitter in world space. + */ + public var y:Float; + /** + * The width of the emitter. Particles can be randomly generated from anywhere within this box. + */ + public var width:Float; + /** + * The height of the emitter. Particles can be randomly generated from anywhere within this box. + */ + public var height:Float; + /** + * The minimum possible velocity of a particle. + * The default value is(-100,-100). + */ + public var minParticleSpeed:FlxPoint; + /** + * The maximum possible velocity of a particle. + * The default value is(100,100). + */ + public var maxParticleSpeed:FlxPoint; + /** + * The X and Y drag component of particles launched from the emitter. + */ + public var particleDrag:FlxPoint; + /** + * The minimum possible angular velocity of a particle. The default value is -360. + * NOTE:rotating particles are more expensive to draw than non-rotating ones! + */ + public var minRotation:Float; + /** + * The maximum possible angular velocity of a particle. The default value is 360. + * NOTE:rotating particles are more expensive to draw than non-rotating ones! + */ + public var maxRotation:Float; + /** + * Sets theacceleration.ymember of each particle to this value on launch. + */ + public var gravity:Float; + /** + * Determines whether the emitter is currently emitting particles. + * It is totally safe to directly toggle this. + */ + public var on:Bool; + /** + * How often a particle is emitted(if emitter is started with Explode==false). + */ + public var frequency:Float; + /** + * How long each particle lives once it is emitted. + * Set lifespan to 'zero' for particles to live forever. + */ + public var lifespan:Float; + /** + * How much each particle should bounce. 1=full bounce, 0=no bounce. + */ + public var bounce:Float; + /** + * Set your own particle class type here. + * Default isFlxParticle. + */ + public var particleClass:Class; + /** + * Internal helper for deciding how many particles to launch. + */ + private var _quantity:Int; + /** + * Internal helper for the style of particle emission(all at once, or one at a time). + */ + private var _explode:Bool; + /** + * Internal helper for deciding when to launch particles or kill them. + */ + private var _timer:Float; + /** + * Internal counter for figuring out how many particles to launch. + */ + private var _counter:Int; + /** + * Internal point object, handy for reusing for memory mgmt purposes. + */ + private var _point:FlxPoint; + + /** + * Creates a newFlxEmitterobject at a specific position. + * Does NOT automatically generate or attach particles! + * + * @param X The X position of the emitter. + * @param Y The Y position of the emitter. + * @param Size Optional, specifies a maximum capacity for this emitter. + */ + public function new(X:Float=0, Y:Float=0, Size:Float=0) + { + super(Size); + x=X; + y=Y; + width=0; + height=0; + minParticleSpeed=new FlxPoint(-100,-100); + maxParticleSpeed=new FlxPoint(100,100); + minRotation=-360; + maxRotation=360; + gravity=0; + particleClass=null; + particleDrag=new FlxPoint(); + frequency=0.1; + lifespan=3; + bounce=0; + _quantity=0; + _counter=0; + _explode=true; + on=false; + _point=new FlxPoint(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + minParticleSpeed=null; + maxParticleSpeed=null; + particleDrag=null; + particleClass=null; + _point=null; + super.destroy(); + } + + /** + * This function generates a new array of particle sprites to attach to the emitter. + * + * @param Graphics If you opted to not pre-configure an array of FlxSprite objects, you can simply pass in a particle image or sprite sheet. + * @param Quantity The number of particles to generate when using the "create from image" option. + * @param BakedRotations How many frames of baked rotation to use(boosts performance). Set to zero to not use baked rotations. + * @param Multiple Whether the image in the Graphics param is a single particle or a bunch of particles(if it's a bunch, they need to be square!). + * @param Collide Whether the particles should be flagged as not 'dead'(non-colliding particles are higher performance). 0 means no collisions, 0-1 controls scale of particle's bounding box. + * + * @return This FlxEmitter instance(nice for chaining stuff together, if you're Into that). + */ + public function makeParticles(Graphics:Class, Quantity:Int=50, BakedRotations:Int=16, Multiple:Bool=false, Collide:Float=0.8):FlxEmitter + { + maxSize=Quantity; + + var totalFrames:Int=1; + if(Multiple) + { + var sprite:FlxSprite=new FlxSprite(); + sprite.loadGraphic(Graphics,true); + totalFrames=sprite.frames; + sprite.destroy(); + } + + var randomFrame:Int; + var particle:FlxParticle; + var i:Int=0; + while(i0) + particle.loadRotatedGraphic(Graphics,BakedRotations,randomFrame); + else + { + particle.loadGraphic(Graphics,true); + particle.frame=randomFrame; + } + } + else + { + if(BakedRotations>0) + particle.loadRotatedGraphic(Graphics,BakedRotations); + else + particle.loadGraphic(Graphics); + } + if(Collide>0) + { + particle.width *=Collide; + particle.height *=Collide; + particle.centerOffsets(); + } + else + particle.allowCollisions=FlxObject.NONE; + particle.exists=false; + add(particle); + i++; + } + return this; + } + + /** + * Called automatically by the game loop, decides when to launch particles and when to "die". + */ + override public function update():Void + { + if(on) + { + if(_explode) + { + on=false; + var i:Int=0; + var l:Int=_quantity; + if((l<=0)||(l>length)) + l=length; + while(i0)&&(_timer>frequency)&& on) + { + _timer -=frequency; + emitParticle(); + if((_quantity>0)&&(++_counter>=_quantity)) + { + on=false; + _quantity=0; + } + } + } + } + super.update(); + } + + /** + * Call this function to turn off all the particles and the emitter. + */ + override public function kill():Void + { + on=false; + super.kill(); + } + + /** + * Call this function to start emitting particles. + * + * @param Explode Whether the particles should all burst out at once. + * @param Lifespan How long each particle lives once emitted. 0=forever. + * @param Frequency Ignored if Explode is set to true. Frequency is how often to emit a particle. 0=never emit, 0.1=1 particle every 0.1 seconds, 5=1 particle every 5 seconds. + * @param Quantity How many particles to launch. 0="all of the particles". + */ + public function start(Explode:Bool=true,Lifespan:Float=0,Frequency:Float=0.1,Quantity:Int=0):Void + { + revive(); + visible=true; + on=true; + + _explode=Explode; + lifespan=Lifespan; + frequency=Frequency; + _quantity +=Quantity; + + _counter=0; + _timer=0; + } + + /** + * This function can be used both Internally and externally to emit the next particle. + */ + public function emitParticle():Void + { + var particle:FlxParticle=recycle(FlxParticle)as FlxParticle; + particle.lifespan=lifespan; + particle.elasticity=bounce; + particle.reset(x -(particle.width>>1)+ FlxG.random()*width, y -(particle.height>>1)+ FlxG.random()*height); + particle.visible=true; + + if(minParticleSpeed.x !=maxParticleSpeed.x) + particle.velocity.x=minParticleSpeed.x + FlxG.random()*(maxParticleSpeed.x-minParticleSpeed.x); + else + particle.velocity.x=minParticleSpeed.x; + if(minParticleSpeed.y !=maxParticleSpeed.y) + particle.velocity.y=minParticleSpeed.y + FlxG.random()*(maxParticleSpeed.y-minParticleSpeed.y); + else + particle.velocity.y=minParticleSpeed.y; + particle.acceleration.y=gravity; + + if(minRotation !=maxRotation) + particle.angularVelocity=minRotation + FlxG.random()*(maxRotation-minRotation); + else + particle.angularVelocity=minRotation; + if(particle.angularVelocity !=0) + particle.angle=FlxG.random()*360-180; + + particle.drag.x=particleDrag.x; + particle.drag.y=particleDrag.y; + particle.onEmit(); + } + + /** + * A more compact way of setting the width and height of the emitter. + * + * @param Width The desired width of the emitter(particles are spawned randomly within these dimensions). + * @param Height The desired height of the emitter. + */ + public function setSize(Width:Int,Height:Int):Void + { + width=Width; + height=Height; + } + + /** + * A more compact way of setting the X velocity range of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setXSpeed(Min:Float=0,Max:Float=0):Void + { + minParticleSpeed.x=Min; + maxParticleSpeed.x=Max; + } + + /** + * A more compact way of setting the Y velocity range of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setYSpeed(Min:Float=0,Max:Float=0):Void + { + minParticleSpeed.y=Min; + maxParticleSpeed.y=Max; + } + + /** + * A more compact way of setting the angular velocity constraints of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setRotation(Min:Float=0,Max:Float=0):Void + { + minRotation=Min; + maxRotation=Max; + } + + /** + * Change the emitter's midpoint to match the midpoint of aFlxObject. + * + * @param Object TheFlxObjectthat you want to sync up with. + */ + public function at(Object:FlxObject):Void + { + Object.getMidpoint(_point); + x=_point.x -(width>>1); + y=_point.y -(height>>1); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxG.hx b/AIR/intra/hsrc/org/flixel/FlxG.hx new file mode 100644 index 0000000..23201ee --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxG.hx @@ -0,0 +1,1321 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.display.Sprite; +import flash.display.Stage; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.plugin.DebugPathDisplay; +import org.flixel.plugin.TimerManager; +import org.flixel.system.FlxDebugger; +import org.flixel.system.FlxQuadTree; +import org.flixel.system.input.*; + +/** + * This is a global helper class full of useful functions for audio, + * input, basic info, and the camera system among other things. + * Utilities for maths and color and things can be found inFlxU. + *FlxGis specifically for Flixel-specific properties. + * + * @author Adam Atomic + */ +class FlxG +{ + /** + * If you build and maintain your own version of flixel, + * you can give it your own name here. + */ + static public var LIBRARY_NAME:String="flixel"; + /** + * Assign a major version to your library. + * Appears before the decimal in the console. + */ + static public var LIBRARY_MAJOR_VERSION:Int=2; + /** + * Assign a minor version to your library. + * Appears after the decimal in the console. + */ + static public var LIBRARY_MINOR_VERSION:Int=55; + + /** + * Debugger overlay layout preset:Wide but low windows at the bottom of the screen. + */ + static public static inline var DEBUGGER_STANDARD:Int=0; + /** + * Debugger overlay layout preset:Tiny windows in the screen corners. + */ + static public static inline var DEBUGGER_MICRO:Int=1; + /** + * Debugger overlay layout preset:Large windows taking up bottom half of screen. + */ + static public static inline var DEBUGGER_BIG:Int=2; + /** + * Debugger overlay layout preset:Wide but low windows at the top of the screen. + */ + static public static inline var DEBUGGER_TOP:Int=3; + /** + * Debugger overlay layout preset:Large windows taking up left third of screen. + */ + static public static inline var DEBUGGER_LEFT:Int=4; + /** + * Debugger overlay layout preset:Large windows taking up right third of screen. + */ + static public static inline var DEBUGGER_RIGHT:Int=5; + + /** + * Some handy color presets. Less glaring than pure RGB full values. + * Primarily used in the visual debugger mode for bounding box displays. + * Red is used to indicate an active, movable, solid object. + */ + static public static inline var RED:Int=0xffff0012; + /** + * Green is used to indicate solid but immovable objects. + */ + static public static inline var GREEN:Int=0xff00f225; + /** + * Blue is used to indicate non-solid objects. + */ + static public static inline var BLUE:Int=0xff0090e9; + /** + * Pink is used to indicate objects that are only partially solid, like one-way platforms. + */ + static public static inline var PINK:Int=0xfff01eff; + /** + * White... for white stuff. + */ + static public static inline var WHITE:Int=0xffffffff; + /** + * And black too. + */ + static public static inline var BLACK:Int=0xff000000; + + /** + * Internal tracker for game object. + */ + static public var _game:FlxGame; + /** + * Handy shared variable for implementing your own pause behavior. + */ + static public var paused:Bool; + /** + * Whether you are running in Debug or Release mode. + * Set automatically byFlxPreloaderduring startup. + */ + static public var debug:Bool; + + /** + * Represents the amount of time in seconds that passed since last frame. + */ + static public var elapsed:Float; + /** + * How fast or slow time should pass in the game;default is 1.0. + */ + static public var timeScale:Float; + /** + * The width of the screen in game pixels. + */ + static public var width:Int; + /** + * The height of the screen in game pixels. + */ + static public var height:Int; + /** + * The dimensions of the game world, used by the quad tree for collisions and overlap checks. + */ + static public var worldBounds:FlxRect; + /** + * How many times the quad tree should divide the world on each axis. + * Generally, sparse collisions can have fewer divisons, + * while denser collision activity usually profits from more. + * Default value is 6. + */ + static public var worldDivisions:Int; + /** + * Whether to show visual debug displays or not. + * Default=false. + */ + static public var visualDebug:Bool; + /** + * Setting this to true will disable/skip stuff that isn't necessary for mobile platforms like Android. [BETA] + */ + static public var mobile:Bool; + /** + * The global random number generator seed(for deterministic behavior in recordings and saves). + */ + static public var globalSeed:Float; + /** + *FlxG.levelsandFlxG.scoresare generic + * global variables that can be used for various cross-state stuff. + */ + static public var levels:Array; + static public var level:Int; + static public var scores:Array; + static public var score:Int; + /** + *FlxG.savesis a generic bucket for storing + * FlxSaves so you can access them whenever you want. + */ + static public var saves:Array; + static public var save:Int; + + /** + * A reference to aFlxMouseobject. Important for input! + */ + static public var mouse:Mouse; + /** + * A reference to aFlxKeyboardobject. Important for input! + */ + static public var keys:Keyboard; + + /** + * A handy container for a background music object. + */ + static public var music:FlxSound; + /** + * A list of all the sounds being played in the game. + */ + static public var sounds:FlxGroup; + /** + * Whether or not the game sounds are muted. + */ + static public var mute:Bool; + /** + * Internal volume level, used for global sound control. + */ + static private var _volume:Float; + + /** + * An array ofFlxCameraobjects that are used to draw stuff. + * By default flixel creates one camera the size of the screen. + */ + static public var cameras:Array; + /** + * By default this just refers to the first entry in the cameras array + * declared above, but you can do what you like with it. + */ + static public var camera:FlxCamera; + /** + * Allows you to possibly slightly optimize the rendering process IF + * you are not doing any pre-processing in your game state'sdraw()call. + * @default false + */ + static public var useBufferLocking:Bool; + /** + * Internal helper variable for clearing the cameras each frame. + */ + static private var _cameraRect:Rectangle; + + /** + * An array container for plugins. + * By default flixel uses a couple of plugins: + * DebugPathDisplay, and TimerManager. + */ + static public var plugins:Array; + + /** + * Set this hook to get a callback whenever the volume changes. + * Function should take the formmyVolumeHandler(Volume:Float). + */ + static public var volumeHandler:Function; + + /** + * Useful helper objects for doing Flash-specific rendering. + * Primarily used for "debug visuals" like drawing bounding boxes directly to the screen buffer. + */ + static public var flashGfxSprite:Sprite; + static public var flashGfx:Graphics; + + /** + * Internal storage system to prevent graphics from being used repeatedly in memory. + */ + static private var _cache:Dynamic; + + static public function getLibraryName():String + { + return FlxG.LIBRARY_NAME + " v" + FlxG.LIBRARY_MAJOR_VERSION + "." + FlxG.LIBRARY_MINOR_VERSION; + } + + /** + * Log data to the debugger. + * + * @param Data Anything you want to log to the console. + */ + static public function log(Data:Dynamic):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.log.add((Data==null)?"ERROR:null object":((Std.is(Data, Array))?FlxU.formatArray(Data as Array):Data.toString())); + } + + /** + * Add a variable to the watch list in the debugger. + * This lets you see the value of the variable all the time. + * + * @param AnyObject A reference to any object in your game, e.g. Player or Robot or this. + * @param VariableName The name of the variable you want to watch, in quotes, as a string:e.g. "speed" or "health". + * @param DisplayName Optional, display your own string instead of the class name + variable name:e.g. "enemy count". + */ + static public function watch(AnyObject:Dynamic,VariableName:String,DisplayName:String=null):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.watch.add(AnyObject,VariableName,DisplayName); + } + + /** + * Remove a variable from the watch list in the debugger. + * Don't pass a Variable Name to remove all watched variables for the specified object. + * + * @param AnyObject A reference to any object in your game, e.g. Player or Robot or this. + * @param VariableName The name of the variable you want to watch, in quotes, as a string:e.g. "speed" or "health". + */ + static public function unwatch(AnyObject:Dynamic,VariableName:String=null):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.watch.remove(AnyObject,VariableName); + } + + /** + * How many times you want your game to update each second. + * More updates usually means better collisions and smoother motion. + * NOTE:This is NOT the same thing as the Flash Player framerate! + */ + static public var framerate(get_framerate, set_framerate):Float; + private function get_framerate():Float + { + return 1000/_game._step; + } + + /** + * @private + */ + static private function set_framerate(Framerate:Float):Void + { + _game._step=1000/Framerate; + if(_game._maxAccumulation<_game._step) + _game._maxAccumulation=_game._step; + } + + /** + * How many times you want your game to update each second. + * More updates usually means better collisions and smoother motion. + * NOTE:This is NOT the same thing as the Flash Player framerate! + */ + static public var flashFramerate(get_flashFramerate, set_flashFramerate):Float; + private function get_flashFramerate():Float + { + if(_game.root !=null) + return _game.stage.frameRate; + else + return 0; + } + + /** + * @private + */ + static private function set_flashFramerate(Framerate:Float):Void + { + _game._flashFramerate=Framerate; + if(_game.root !=null) + _game.stage.frameRate=_game._flashFramerate; + _game._maxAccumulation=2000/_game._flashFramerate - 1; + if(_game._maxAccumulation<_game._step) + _game._maxAccumulation=_game._step; + } + + /** + * Switch to full-screen display. + */ + static public function fullscreen():Void + { + FlxG.stage.displayState="fullScreen"; + var fsw:Int=FlxG.width*FlxG.camera.zoom; + var fsh:Int=FlxG.height*FlxG.camera.zoom; + FlxG.camera.x=(FlxG.stage.fullScreenWidth - fsw)/2; + FlxG.camera.y=(FlxG.stage.fullScreenHeight - fsh)/2; + } + + /** + * Generates a random number. Deterministic, meaning safe + * to use if you want to record replays in random environments. + * + * @return ANumberbetween 0 and 1. + */ + static public function random():Float + { + return globalSeed=FlxU.srand(globalSeed); + } + + /** + * Shuffles the entries in an array Into a new random order. + *FlxG.shuffle()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.shuffle()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param A A FlashArrayobject containing...stuff. + * @param HowManyTimes How many swaps to perform during the shuffle operation. Good rule of thumb is 2-4 times as many objects are in the list. + * + * @return The same FlashArrayobject that you passed in in the first place. + */ + static public function shuffle(Objects:Array,HowManyTimes:Int):Array + { + var i:Int=0; + var index1:Int; + var index2:Int; + var object:Dynamic; + while(iFlxG.getRandom()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.getRandom()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param Objects A Flash array of objects. + * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. + * @param Length Optional restriction on the number of values you want to randomly select from. + * + * @return The random object that was selected. + */ + static public function getRandom(Objects:Array,StartIndex:Int=0,Length:Int=0):Dynamic + { + if(Objects !=null) + { + var l:Int=Length; + if((l==0)||(l>Objects.length - StartIndex)) + l=Objects.length - StartIndex; + if(l>0) + return Dynamics[StartIndex + Int(FlxG.random()*l)]; + } + return null; + } + + /** + * Load replay data from a string and play it back. + * + * @param Data The replay that you want to load. + * @param State Optional parameter:if you recorded a state-specific demo or cutscene, pass a new instance of that state here. + * @param CancelKeys Optional parameter:an array of string names of keys(see FlxKeyboard)that can be pressed to cancel the playback, e.g. ["ESCAPE","ENTER"]. Also accepts 2 custom key names:"ANY" and "MOUSE"(fairly self-explanatory I hope!). + * @param Timeout Optional parameter:set a time limit for the replay. CancelKeys will override this if pressed. + * @param Callback Optional parameter:if set, called when the replay finishes. Running to the end, CancelKeys, and Timeout will all trigger Callback(), but only once, and CancelKeys and Timeout will NOT call FlxG.stopReplay()if Callback is set! + */ + static public function loadReplay(Data:String,State:FlxState=null,CancelKeys:Array=null,Timeout:Float=0,Callback:Function=null):Void + { + _game._replay.load(Data); + if(State==null) + FlxG.resetGame(); + else + FlxG.switchState(State); + _game._replayCancelKeys=CancelKeys; + _game._replayTimer=Timeout*1000; + _game._replayCallback=Callback; + _game._replayRequested=true; + } + + /** + * Resets the game or state and replay requested flag. + * + * @param StandardMode If true, reload entire game, else just reload current game state. + */ + static public function reloadReplay(StandardMode:Bool=true):Void + { + if(StandardMode) + FlxG.resetGame(); + else + FlxG.resetState(); + if(_game._replay.frameCount>0) + _game._replayRequested=true; + } + + /** + * Stops the current replay. + */ + static public function stopReplay():Void + { + _game._replaying=false; + if(_game._debugger !=null) + _game._debugger.vcr.stopped(); + resetInput(); + } + + /** + * Resets the game or state and requests a new recording. + * + * @param StandardMode If true, reset the entire game, else just reset the current state. + */ + static public function recordReplay(StandardMode:Bool=true):Void + { + if(StandardMode) + FlxG.resetGame(); + else + FlxG.resetState(); + _game._recordingRequested=true; + } + + /** + * Stop recording the current replay and return the replay data. + * + * @return The replay data in simple ASCII format(seeFlxReplay.save()). + */ + static public function stopRecording():String + { + _game._recording=false; + if(_game._debugger !=null) + _game._debugger.vcr.stopped(); + return _game._replay.save(); + } + + /** + * Request a reset of the current game state. + */ + static public function resetState():Void + { + _game._requestedState=new(FlxU.getClass(FlxU.getClassName(_game._state,false)))(); + } + + /** + * Like hitting the reset button on a game console, this will re-launch the game as if it just started. + */ + static public function resetGame():Void + { + _game._requestedReset=true; + } + + /** + * Reset the input helper objects(useful when changing screens or states) + */ + static public function resetInput():Void + { + keys.reset(); + mouse.reset(); + } + + /** + * Set up and play a looping background soundtrack. + * + * @param Music The sound file you want to loop in the background. + * @param Volume How loud the sound should be, from 0 to 1. + */ + static public function playMusic(Music:Class,Volume:Float=1.0):Void + { + if(music==null) + music=new FlxSound(); + else if(music.active) + music.stop(); + music.loadEmbedded(Music,true); + music.volume=Volume; + music.survive=true; + music.play(); + } + + /** + * Creates a new sound object. + * + * @param EmbeddedSound The embedded sound resource you want to play. To stream, use the optional URL parameter instead. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * @param AutoPlay Whether to play the sound. + * @param URL Load a sound from an external web resource instead. Only used if EmbeddedSound=null. + * + * @return AFlxSoundobject. + */ + static public function loadSound(EmbeddedSound:Class=null,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=false,AutoPlay:Bool=false,URL:String=null):FlxSound + { + if((EmbeddedSound==null)&&(URL==null)) + { + FlxG.log("WARNING:FlxG.loadSound()requires either\nan embedded sound or a URL to work."); + return null; + } + var sound:FlxSound=sounds.recycle(FlxSound)as FlxSound; + if(EmbeddedSound !=null) + //sound.loadEmbedded(EmbeddedSound, Looped,AutoDestroy); + sound.loadEmbedded(EmbeddedSound, Looped); + else + sound.loadStream(URL, Looped); + //sound.loadStream(URL,Looped,AutoDestroy); + sound.volume=Volume; + if(AutoPlay) + sound.play(); + return sound; + } + + /** + * Creates a new sound object from an embeddedClassobject. + * NOTE:Just calls FlxG.loadSound()with AutoPlay==true. + * + * @param EmbeddedSound The sound you want to play. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * + * @return AFlxSoundobject. + */ + static public function play(EmbeddedSound:Class,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=true):FlxSound + { + return FlxG.loadSound(EmbeddedSound,Volume,Looped,AutoDestroy,true); + } + + /** + * Creates a new sound object from a URL. + * NOTE:Just calls FlxG.loadSound()with AutoPlay==true. + * + * @param URL The URL of the sound you want to play. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether or not to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * + * @return A FlxSound object. + */ + static public function stream(URL:String,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=true):FlxSound + { + return FlxG.loadSound(null,Volume,Looped,AutoDestroy,true,URL); + } + + /** + * Setvolumeto a number between 0 and 1 to change the global volume. + * + * @default 0.5 + */ + static public var volume(get_volume, set_volume):Float; + private function get_volume():Float + { + return _volume; + } + + /** + * @private + */ + static private function set_volume(Volume:Float):Void + { + _volume=Volume; + if(_volume<0) + _volume=0; + else if(_volume>1) + _volume=1; + if(volumeHandler !=null) + volumeHandler(FlxG.mute?0:_volume); + } + + /** + * Called by FlxGame on state changes to stop and destroy sounds. + * + * @param ForceDestroy Kill sounds even if they're flaggedsurvive. + */ + static Internal function destroySounds(ForceDestroy:Bool=false):Void + { + if((music !=null)&&(ForceDestroy || !music.survive)) + { + music.destroy(); + music=null; + } + var i:Int=0; + var sound:FlxSound; + var l:Int=sounds.members.length; + while(i=new Array(); + var refs:Array=new Array(); + for(key in _cache){ + keys.push(key); + if(_cache[key] !=null){ + refs.push(_cache[key]); + } + } + + while(keys.length>0 && refs.length>0){ + key=keys.pop(); + var idx:Int=refs.length * Math.random(); + var ref:BitmapData; + ref=refs.splice(idx, 1)[0]; + if(key.indexOf("Tile")!=-1){ + var x:Int=0; + var y:Int=0; + + + refs.splice(refs.indexOf(_cache[key]),1); + while(x<_cache[key].width){ + while(y<_cache[key].height){ + _cache[key].copyPixels(ref, ref.rect, new flash.geom.Point(x, y)); + y +=ref.height; + } + y=0; + x +=ref.width; + } + } else { + _cache[key]=ref; + } + + + } + } + /** + * Generates a newBitmapDataobject(a colored square)and caches it. + * + * @param Width How wide the square should be. + * @param Height How high the square should be. + * @param Color What color the square should be(0xAARRGGBB) + * @param Unique Ensures that the bitmap data uses a new slot in the cache. + * @param Key Force the cache to use a specific Key to index the bitmap. + * + * @return TheBitmapDatawe just created. + */ + static public function createBitmap(Width:Int, Height:Int, Color:Int, Unique:Bool=false, Key:String=null):BitmapData + { + if(Key==null) + { + Key=Width+"x"+Height+":"+Color; + if(Unique && checkBitmapCache(Key)) + { + var inc:Int=0; + var ukey:String; + do + { + ukey=Key + inc++; + } while(checkBitmapCache(ukey)); + Key=ukey; + } + } + if(!checkBitmapCache(Key)) + _cache[Key]=new BitmapData(Width,Height,true,Color); + return _cache[Key]; + } + + /** + * Loads a bitmap from a file, caches it, and generates a horizontally flipped version if necessary. + * + * @param Graphic The image file that you want to load. + * @param Reverse Whether to generate a flipped version. + * @param Unique Ensures that the bitmap data uses a new slot in the cache. + * @param Key Force the cache to use a specific Key to index the bitmap. + * + * @return TheBitmapDatawe just created. + */ + static public function addBitmap(Graphic:Class, Reverse:Bool=false, Unique:Bool=false, Key:String=null):BitmapData + { + var needReverse:Bool=false; + if(Key==null) + { + Key=Std.string(Graphic)+(Reverse?"_REVERSE_":""); + if(Unique && checkBitmapCache(Key)) + { + var inc:Int=0; + var ukey:String; + do + { + ukey=Key + inc++; + } while(checkBitmapCache(ukey)); + Key=ukey; + } + } + + //If there is no data for this key, generate the requested graphic + if(!checkBitmapCache(Key)) + { + _cache[Key]=(new Graphic).bitmapData; + if(Reverse) + needReverse=true; + } + var pixels:BitmapData=_cache[Key]; + if(!needReverse && Reverse &&(pixels.width==(new Graphic).bitmapData.width)) + needReverse=true; + if(needReverse) + { + var newPixels:BitmapData=new BitmapData(pixels.width<<1,pixels.height,true,0x00000000); + newPixels.draw(pixels); + var mtx:Matrix=new Matrix(); + mtx.scale(-1,1); + mtx.translate(newPixels.width,0); + newPixels.draw(pixels,mtx); + pixels=newPixels; + _cache[Key]=pixels; + } + return pixels; + } + + /** + * Dumps the cache's image references. + */ + static public function clearBitmapCache():Void + { + _cache=new Dynamic(); + } + + /** + * Read-only:retrieves the Flash stage object(required for event listeners) + * Will be null if it's not safe/useful yet. + */ + static public var stage(get_stage, set_stage):Stage; + private function get_stage():Stage + { + if(_game.root !=null) + return _game.stage; + return null; + } + + /** + * Read-only:access the current game state from anywhere. + */ + static public var state(get_state, set_state):FlxState; + private function get_state():FlxState + { + return _game._state; + } + + /** + * Switch from the current game state to the one specified here. + */ + static public function switchState(State:FlxState):Void + { + _game._requestedState=State; + } + + /** + * Change the way the debugger's windows are laid out. + * + * @param Layout See the presets above(e.g.DEBUGGER_MICRO, etc). + */ + static public function setDebuggerLayout(Layout:Int):Void + { + if(_game._debugger !=null) + _game._debugger.setLayout(Layout); + } + + /** + * Just resets the debugger windows to whatever the last selected layout was(DEBUGGER_STANDARDby default). + */ + static public function resetDebuggerLayout():Void + { + if(_game._debugger !=null) + _game._debugger.resetLayout(); + } + + /** + * Add a new camera object to the game. + * Handy for PiP, split-screen, etc. + * + * @param NewCamera The camera you want to add. + * + * @return ThisFlxCamerainstance. + */ + static public function addCamera(NewCamera:FlxCamera):FlxCamera + { + FlxG._game.addChildAt(NewCamera._flashSprite,FlxG._game.getChildIndex(FlxG._game._mouse)); + FlxG.cameras.push(NewCamera); + return NewCamera; + } + + /** + * Remove a camera from the game. + * + * @param Camera The camera you want to remove. + * @param Destroy Whether to call destroy()on the camera, default value is true. + */ + static public function removeCamera(Camera:FlxCamera,Destroy:Bool=true):Void + { + try + { + FlxG._game.removeChild(Camera._flashSprite); + } + catch(E:Dynamic) + { + FlxG.log("Error removing camera, not part of game."); + } + if(Destroy) + Camera.destroy(); + } + + /** + * Dumps all the current cameras and resets to just one camera. + * Handy for doing split-screen especially. + * + * @param NewCamera Optional;specify a specific camera object to be the new main camera. + */ + static public function resetCameras(NewCamera:FlxCamera=null):Void + { + var cam:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObjectoverlaps another. + * Can be called with one object and one group, or two groups, or two objects, + * whatever floats your boat! For maximum performance try bundling a lot of objects + * together using aFlxGroup(or even bundling groups together!). + * + *

NOTE:does NOT take objects' scrollfactor Into account, all overlaps are checked in world space.

+ * + * @param ObjectOrGroup1 The first object or group you want to check. + * @param ObjectOrGroup2 The second object or group you want to check. If it is the same as the first, flixel knows to just do a comparison within that group. + * @param NotifyCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. + * @param ProcessCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. If a ProcessCallback is provided, then NotifyCallback will only be called if ProcessCallback returns true for those objects! + * + * @return Whether any oevrlaps were detected. + */ + + + static public function overlap(ObjectOrGroup1:FlxBasic=null,ObjectOrGroup2:FlxBasic=null,NotifyCallback:Function=null,ProcessCallback:Function=null):Bool + { + if(ObjectOrGroup1==null) + ObjectOrGroup1=FlxG.state; + if(ObjectOrGroup2===ObjectOrGroup1) + ObjectOrGroup2=null; + + FlxQuadTree.divisions=FlxG.worldDivisions; + var quadTree:FlxQuadTree=FlxQuadTree.quadTreePool.getNew(); + quadTree.init(FlxG.worldBounds.x,FlxG.worldBounds.y,FlxG.worldBounds.width,FlxG.worldBounds.height); + quadTree.load(ObjectOrGroup1,ObjectOrGroup2,NotifyCallback,ProcessCallback); + var result:Bool=quadTree.execute(); + quadTree.destroy(); + return result; + } + + /** + * Call this function to see if oneFlxObjectcollides with another. + * Can be called with one object and one group, or two groups, or two objects, + * whatever floats your boat! For maximum performance try bundling a lot of objects + * together using aFlxGroup(or even bundling groups together!). + * + *

This function just calls FlxG.overlap and presets the ProcessCallback parameter to FlxObject.separate. + * To create your own collision logic, write your own ProcessCallback and use FlxG.overlap to set it up.

+ * + *

NOTE:does NOT take objects' scrollfactor Into account, all overlaps are checked in world space.

+ * + * @param ObjectOrGroup1 The first object or group you want to check. + * @param ObjectOrGroup2 The second object or group you want to check. If it is the same as the first, flixel knows to just do a comparison within that group. + * @param NotifyCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. + * + * @return Whether any objects were successfully collided/separated. + */ + static public function collide(ObjectOrGroup1:FlxBasic=null, DynamicOrGroup2:FlxBasic=null, NotifyCallback:Function=null):Bool + { + return overlap(ObjectOrGroup1,ObjectOrGroup2,NotifyCallback,FlxObject.separate); + } + + /** + * Adds a new plugin to the global plugin array. + * + * @param Plugin Any object that extends FlxBasic. Useful for managers and other things. See org.flixel.plugin for some examples! + * + * @return The sameFlxBasic-based plugin you passed in. + */ + static public function addPlugin(Plugin:FlxBasic):FlxBasic + { + //Don't add repeats + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(iFlxPathorFlxTimerconstructors for example usage. + * + * @return The plugin object, or null if no matching plugin was found. + */ + static public function getPlugin(ClassType:Class):FlxBasic + { + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(iFlxBasic-based plugin you passed in. + */ + static public function removePlugin(Plugin:FlxBasic):FlxBasic + { + //Don't add repeats + var pluginList:Array=FlxG.plugins; + var i:Int=pluginList.length-1; + while(i>=0) + { + if(pluginList[i]==Plugin) + pluginList.splice(i,1); + i--; + } + return Plugin; + } + + /** + * Removes an instance of a plugin from the global plugin array. + * + * @param ClassType The class name of the plugin type you want removed from the array. + * + * @return Whether or not at least one instance of this plugin type was removed. + */ + static public function removePluginType(ClassType:Class):Bool + { + //Don't add repeats + var results:Bool=false; + var pluginList:Array=FlxG.plugins; + var i:Int=pluginList.length-1; + while(i>=0) + { + if(pluginList[i] is ClassType) + { + pluginList.splice(i,1); + results=true; + } + i--; + } + return results; + } + + /** + * Called byFlxGameto set upFlxGduringFlxGame's constructor. + */ + static Internal function init(Game:FlxGame,Width:Int,Height:Int,Zoom:Float):Void + { + FlxG._game=Game; + FlxG.width=Width; + FlxG.height=Height; + + FlxG.mute=false; + FlxG._volume=0.5; + FlxG.sounds=new FlxGroup(); + FlxG.volumeHandler=null; + + FlxG.clearBitmapCache(); + + if(flashGfxSprite==null) + { + flashGfxSprite=new Sprite(); + flashGfx=flashGfxSprite.graphics; + } + + FlxCamera.defaultZoom=Zoom; + FlxG._cameraRect=new Rectangle(); + FlxG.cameras=new Array(); + useBufferLocking=false; + + plugins=new Array(); + addPlugin(new DebugPathDisplay()); + addPlugin(new TimerManager()); + + FlxG.mouse=new Mouse(FlxG._game._mouse); + FlxG.keys=new Keyboard(); + FlxG.mobile=false; + + FlxG.levels=new Array(); + FlxG.scores=new Array(); + FlxG.visualDebug=false; + } + + /** + * Called whenever the game is reset, doesn't have to do quite as much work as the basic initialization stuff. + */ + static Internal function reset():Void + { + FlxG.clearBitmapCache(); + FlxG.resetInput(); + FlxG.destroySounds(true); + FlxG.levels.length=0; + FlxG.scores.length=0; + FlxG.level=0; + FlxG.score=0; + FlxG.paused=false; + FlxG.timeScale=1.0; + FlxG.elapsed=0; + FlxG.globalSeed=Math.random(); + FlxG.worldBounds=new FlxRect(-10,-10,FlxG.width+20,FlxG.height+20); + FlxG.worldDivisions=6; + var debugPathDisplay:DebugPathDisplay=FlxG.getPlugin(DebugPathDisplay)as DebugPathDisplay; + if(debugPathDisplay !=null) + debugPathDisplay.clear(); + } + + /** + * Called by the game object to update the keyboard and mouse input tracking objects. + */ + static Internal function updateInput():Void + { + FlxG.keys.update(); + if(!_game._debuggerUp || !_game._debugger.hasMouse) + FlxG.mouse.update(FlxG._game.mouseX,FlxG._game.mouseY); + } + + /** + * Called by the game object to lock all the camera buffers and clear them for the next draw pass. + */ + static Internal function lockCameras():Void + { + var cam:FlxCamera; + var cams:Array=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(i=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(i=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(iupdate()on all the plugins. + */ + static Internal function updatePlugins():Void + { + var plugin:FlxBasic; + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(idraw()on all the plugins. + */ + static Internal function drawPlugins():Void + { + var plugin:FlxBasic; + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(icreateFocusScreen()). + */ + private var _focus:Sprite; + /** + * The sound tray display container(seecreateSoundTray()). + */ + private var _soundTray:Sprite; + /** + * Helps us auto-hide the sound tray after a volume change. + */ + private var _soundTrayTimer:Float; + /** + * Helps display the volume bars on the sound tray. + */ + private var _soundTrayBars:Array; + /** + * The debugger overlay object. + */ + private var _debugger:FlxDebugger; + /** + * A handy boolean that keeps track of whether the debugger exists and is currently visible. + */ + private var _debuggerUp:Bool; + + /** + * Container for a game replay object. + */ + private var _replay:FlxReplay; + /** + * Flag for whether a playback of a recording was requested. + */ + private var _replayRequested:Bool; + /** + * Flag for whether a new recording was requested. + */ + private var _recordingRequested:Bool; + /** + * Flag for whether a replay is currently playing. + */ + private var _replaying:Bool; + /** + * Flag for whether a new recording is being made. + */ + private var _recording:Bool; + /** + * Array that keeps track of keypresses that can cancel a replay. + * Handy for skipping cutscenes or getting out of attract modes! + */ + private var _replayCancelKeys:Array; + /** + * Helps time out a replay if necessary. + */ + private var _replayTimer:Int; + /** + * This function, if set, is triggered when the callback stops playing. + */ + private var _replayCallback:Function; + + /** + * Instantiate a new game object. + * + * @param GameSizeX The width of your game in game pixels, not necessarily final display pixels(see Zoom). + * @param GameSizeY The height of your game in game pixels, not necessarily final display pixels(see Zoom). + * @param InitialState The class name of the state you want to create and switch to first(e.g. MenuState). + * @param Zoom The default level of zoom for the game's cameras(e.g. 2=all pixels are now drawn at 2x). Default=1. + * @param GameFramerate How frequently the game should update(Std.is(default, 60) times per second). + * @param FlashFramerate Sets the actual display framerate for Flash player(Std.is(default, 30) times per second). + * @param UseSystemCursor Whether to use the default OS mouse pointer, or to use custom flixel ones. + */ + public function new(GameSizeX:Int,GameSizeY:Int,InitialState:Class,Zoom:Float=1,GameFramerate:Int=60,FlashFramerate:Int=30,UseSystemCursor:Bool=false) + { + //super high priority init stuff(focus, mouse, etc) + _lostFocus=false; + _focus=new Sprite(); + _focus.visible=false; + _soundTray=new Sprite(); + _mouse=new Sprite() + + //basic display and update setup stuff + FlxG.init(this,GameSizeX,GameSizeY,Zoom); + FlxG.framerate=GameFramerate; + FlxG.flashFramerate=FlashFramerate; + _accumulator=_step; + _total=0; + _state=null; + useSoundHotKeys=true; + useSystemCursor=UseSystemCursor; + if(!useSystemCursor) + flash.ui.Mouse.hide(); + forceDebugger=false; + _debuggerUp=false; + + //replay data + _replay=new FlxReplay(); + _replayRequested=false; + _recordingRequested=false; + _replaying=false; + _recording=false; + + //then get ready to create the game object for real + _iState=InitialState; + _requestedState=null; + _requestedReset=true; + _created=false; + addEventListener(Event.ENTER_FRAME, create); + } + + /** + * Makes the little volume tray slide out. + * + * @param Silent Whether or not it should beep. + */ + private function showSoundTray(Silent:Bool=false):Void + { + return; + if(!Silent) + FlxG.play(SndBeep); + _soundTrayTimer=1; + _soundTray.y=0; + _soundTray.visible=true; + var globalVolume:Int=Math.round(FlxG.volume*10); + if(FlxG.mute) + globalVolume=0; + for(i in 0..._soundTrayBars.length) + { + if(i_maxAccumulation) + _accumulator=_maxAccumulation; + while(_accumulator>_step) + { + step(); + _accumulator=_accumulator - _step; + } + } + + FlxBasic._VISIBLECOUNT=0; + draw(); + + if(_debuggerUp) + { + _debugger.perf.flash(elapsedMS); + _debugger.perf.visibleObjects(FlxBasic._VISIBLECOUNT); + _debugger.perf.update(); + _debugger.watch.update(); + } + } + } + + /** + * If there is a state change requested during the update loop, + * this function handles actual destroying the old state and related processes, + * and calls creates on the new state and plugs it Into the game object. + */ + private function switchState():Void + { + //Basic reset stuff + FlxG.resetCameras(); + FlxG.resetInput(); + FlxG.destroySounds(); + FlxG.clearBitmapCache(); + /* Remove the screen fade at the same time*/ + if(screen_fade !=null){ + //screen_fade.destroy(); + //screen_fade=null; + } + //Clear the debugger overlay's Watch window + if(_debugger !=null) + _debugger.watch.removeAll(); + + //Clear any timers left in the timer manager + var timerManager:TimerManager=FlxTimer.manager; + if(timerManager !=null) + timerManager.clear(); + + //Destroy the old state(if there is an old state) + if(_state !=null) + _state.destroy(); + + //Finally assign and create the new state + _state=_requestedState; + _state.create(); + } + + /** + * This is the main game update logic section. + * The onEnterFrame()handler is in charge of calling this + * the appropriate number of times each frame. + * This block handles state changes, replays, all that good stuff. + */ + private function step():Void + { + //handle game reset request + if(_requestedReset) + { + _requestedReset=false; + _requestedState=new _iState(); + _replayTimer=0; + _replayCancelKeys=null; + FlxG.reset(); + } + + //handle replay-related requests + if(_recordingRequested) + { + _recordingRequested=false; + _replay.create(FlxG.globalSeed); + _recording=true; + if(_debugger !=null) + { + _debugger.vcr.recording(); + FlxG.log("FLIXEL:starting new flixel gameplay record."); + } + } + else if(_replayRequested) + { + _replayRequested=false; + _replay.rewind(); + FlxG.globalSeed=_replay.seed; + if(_debugger !=null) + _debugger.vcr.playing(); + _replaying=true; + } + + //handle state switching requests + if(_state !=_requestedState) + switchState(); + + //finally actually step through the game physics + FlxBasic._ACTIVECOUNT=0; + if(_replaying) + { + _replay.playNextFrame(); + if(_replayTimer>0) + { + _replayTimer -=_step; + if(_replayTimer<=0) + { + if(_replayCallback !=null) + { + _replayCallback(); + _replayCallback=null; + } + else + FlxG.stopReplay(); + } + } + if(_replaying && _replay.finished) + { + FlxG.stopReplay(); + if(_replayCallback !=null) + { + _replayCallback(); + _replayCallback=null; + } + } + if(_debugger !=null) + _debugger.vcr.updateRuntime(_step); + } + else + FlxG.updateInput(); + if(_recording) + { + _replay.recordFrame(); + if(_debugger !=null) + _debugger.vcr.updateRuntime(_step); + } + update(); + FlxG.mouse.wheel=0; + if(_debuggerUp) + _debugger.perf.activeObjects(FlxBasic._ACTIVECOUNT); + } + + /** + * This function just updates the soundtray object. + */ + private function updateSoundTray(MS:Float):Void + { + //animate stupid sound tray thing + + if(_soundTray !=null) + { + if(_soundTrayTimer>0) + _soundTrayTimer -=MS/1000; + else if(_soundTray.y>-_soundTray.height) + { + _soundTray.y -=(MS/1000)*FlxG.height*2; + if(_soundTray.y<=-_soundTray.height) + { + _soundTray.visible=false; + + //Save sound preferences + var soundPrefs:FlxSave=new FlxSave(); + if(soundPrefs.bind("flixel")) + { + if(soundPrefs.data.sound==null) + soundPrefs.data.sound=new Dynamic; + soundPrefs.data.sound.mute=FlxG.mute; + soundPrefs.data.sound.volume=FlxG.volume; + soundPrefs.close(); + } + } + } + } + } + + /** + * This function is called by step()and updates the actual game state. + * May be called multiple times per "frame" or draw call. + */ + private function update():Void + { + var mark:Int=getTimer(); + + FlxG.elapsed=FlxG.timeScale*(_step/1000); + FlxG.updateSounds(); + FlxG.updatePlugins(); + _state.update(); + FlxG.updateCameras(); + + if(_debuggerUp) + _debugger.perf.flixelUpdate(getTimer()-mark); + } + + /** + * Goes through the game state and draws all the game objects and special effects. + */ + private function draw():Void + { + var mark:Int=getTimer(); + FlxG.lockCameras(); + _state.draw(); + FlxG.drawPlugins(); + FlxG.unlockCameras(); + if(_debuggerUp) + _debugger.perf.flixelDraw(getTimer()-mark); + } + + /** + * Used to instantiate the guts of the flixel game object once we have a valid reference to the root. + * + * @param FlashEvent Just a Flash system event, not too important for our purposes. + */ + private function create(FlashEvent:Event):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME, create); + _total=getTimer(); + + //Set up the view window and double buffering + stage.scaleMode=StageScaleMode.NO_SCALE; + stage.align=StageAlign.TOP_LEFT; + stage.frameRate=_flashFramerate; + + //Add basic input event listeners and mouse container + stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); + stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel); + stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); + addChild(_mouse); + + //Let mobile devs opt out of unnecessary overlays. + if(!FlxG.mobile) + { + //Debugger overlay + if(FlxG.debug || forceDebugger) + { + _debugger=new FlxDebugger(FlxG.width*FlxCamera.defaultZoom,FlxG.height*FlxCamera.defaultZoom); + addChild(_debugger); + } + + //Volume display tab + createSoundTray(); + + //Focus gained/lost monitoring + stage.addEventListener(Event.DEACTIVATE, onFocusLost); + stage.addEventListener(Event.ACTIVATE, onFocus); + createFocusScreen(); + } + + //Finally, set up an event for the actual game loop stuff. + addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + /** + * Sets up the "sound tray", the little volume meter that pops down sometimes. + */ + private function createSoundTray():Void + { + _soundTray.visible=false; + _soundTray.scaleX=2; + _soundTray.scaleY=2; + var tmp:Bitmap=new Bitmap(new BitmapData(80,30,true,0x7F000000)); + _soundTray.x=(FlxG.width/2)*FlxCamera.defaultZoom-(tmp.width/2)*_soundTray.scaleX; + _soundTray.addChild(tmp); + + var text:TextField=new TextField(); + text.width=tmp.width; + text.height=tmp.height; + text.multiline=true; + text.wordWrap=true; + text.selectable=false; + text.embedFonts=true; + text.antiAliasType=AntiAliasType.NORMAL; + text.gridFitType=GridFitType.PIXEL; + text.defaultTextFormat=new TextFormat("system",8,0xffffff,null,null,null,null,null,"center");; + _soundTray.addChild(text); + text.text="VOLUME"; + text.y=16; + + var bx:Int=10; + var by:Int=14; + _soundTrayBars=new Array(); + var i:Int=0; + while(i<10) + { + tmp=new Bitmap(new BitmapData(4,++i,false,0xffffff)); + tmp.x=bx; + tmp.y=by; + _soundTrayBars.push(_soundTray.addChild(tmp)); + bx +=6; + by--; + } + + _soundTray.y=-_soundTray.height; + _soundTray.visible=false; + addChild(_soundTray); + + //load saved sound preferences for this game if they exist + var soundPrefs:FlxSave=new FlxSave(); + if(soundPrefs.bind("flixel")&&(soundPrefs.data.sound !=null)) + { + if(soundPrefs.data.sound.volume !=null) + //FlxG.volume=soundPrefs.data.sound.volume; + FlxG.volume=1; + if(soundPrefs.data.sound.mute !=null) + FlxG.mute=soundPrefs.data.sound.mute; + soundPrefs.destroy(); + } + } + + /** + * Sets up the darkened overlay with the big white "play" button that appears when a flixel game loses focus. + */ + private function createFocusScreen():Void + { + var gfx:Graphics=_focus.graphics; + var screenWidth:Int=FlxG.width*FlxCamera.defaultZoom; + var screenHeight:Int=FlxG.height*FlxCamera.defaultZoom; + + //draw transparent black backdrop + gfx.moveTo(0,0); + gfx.beginFill(0,0.5); + gfx.lineTo(screenWidth,0); + gfx.lineTo(screenWidth,screenHeight); + gfx.lineTo(0,screenHeight); + gfx.lineTo(0,0); + gfx.endFill(); + + //draw white arrow + var halfWidth:Int=screenWidth/2; + var halfHeight:Int=screenHeight/2; + var helper:Int=FlxU.min(halfWidth,halfHeight)/3; + gfx.moveTo(halfWidth-helper,halfHeight-helper); + gfx.beginFill(0xffffff,0.65); + gfx.lineTo(halfWidth+helper,halfHeight); + gfx.lineTo(halfWidth-helper,halfHeight+helper); + gfx.lineTo(halfWidth-helper,halfHeight-helper); + gfx.endFill(); + + var logo:Bitmap=new ImgLogo(); + logo.scaleX=Std.int(helper/10); + if(logo.scaleX<1) + logo.scaleX=1; + logo.scaleY=logo.scaleX; + logo.x -=logo.scaleX; + logo.alpha=0.35; + _focus.addChild(logo); + + addChild(_focus); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxGroup.hx b/AIR/intra/hsrc/org/flixel/FlxGroup.hx new file mode 100644 index 0000000..4148cdc --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxGroup.hx @@ -0,0 +1,639 @@ +package org.flixel; + +/** + * This is an organizational class that can update and render a bunch ofFlxBasics. + * NOTE:AlthoughFlxGroupextendsFlxBasic, it will not automatically + * add itself to the global collisions quad tree, it will only add its members. + * + * @author Adam Atomic + */ +class FlxGroup extends FlxBasic +{ + /** + * Use withsort()to sort in ascending order. + */ + static public static inline var ASCENDING:Int=-1; + /** + * Use withsort()to sort in descending order. + */ + static public static inline var DESCENDING:Int=1; + + /** + * Array of all theFlxBasics that exist in this group. + */ + public var members:Array; + /** + * The number of entries in the members array. + * For performance and safety you should check this variable + * instead of members.length unless you really know what you're doing! + */ + public var length:Float; + + /** + * If defined, if we sort an array this group is present in by + * y value, then this group will have its own draw order within, but + * in reference to "outside the group" will be drawn according to the + * draw_root's y value. etc. + */ + public var draw_root:FlxSprite=null; + + /** + * Used in tandem with draw_root + */ + public var y:Int=0; + public var y_bottom:Int=0; + + /** + * Internal tracker for the maximum capacity of the group. + * Default is 0, or no max capacity. + */ + private var _maxSize:Int; + /** + * Internal helper variable for recycling objects a laFlxEmitter. + */ + private var _marker:Int; + + /** + * Helper for sort. + */ + private var _sortIndex:String; + /** + * Helper for sort. + */ + private var _sortOrder:Int; + + /** + * Constructor + */ + public function new(MaxSize:Int=0) + { + super(); + members=new Array(); + length=0; + _maxSize=MaxSize; + _marker=0; + _sortIndex=null; + } + + /** + * Override this function to handle any deleting or "shutdown" type operations you might need, + * such as removing traditional Flash children like Sprite objects. + */ + override public function destroy():Void + { + if(members !=null) + { + var basic:FlxBasic; + var i:Int=0; + while(i=_maxSize) + _marker=0; + if((_maxSize==0)||(members==null)||(_maxSize>=members.length)) + return; + + //If the max size has shrunk, we need to get rid of some objects + var basic:FlxBasic; + var i:Int=_maxSize; + var l:Int=members.length; + while(iFlxBasicsubclass(FlxBasic, FlxSprite, Enemy, etc)to the group. + * FlxGroup will try to replace a null member of the array first. + * Failing that, FlxGroup will add it to the end of the member array, + * assuming there is room for it, and doubling the size of the array if necessary. + * + *

WARNING:If the group has a maxSize that has already been met, + * the object will NOT be added to the group!

+ * + * @param Object The object you want to add to the group. + * + * @return The sameFlxBasicobject that was passed in. + */ + public function add(Object:FlxBasic):FlxBasic + { + + //Don't bother adding an object twice. + + if(members.indexOf(Object)>=0) + return Dynamic; + + //First, look for a null entry where we can add the object. + var i:Int=0; + var l:Int=members.length; + while(i=length) + length=i+1; + return Dynamic; + } + i++; + } + + //Failing that, expand the array(if we can)and add the object. + if(_maxSize>0) + { + if(members.length>=_maxSize) + return Dynamic; + else if(members.length * 2<=_maxSize) + members.length *=2; + else + members.length=_maxSize; + } + else + members.length *=2; + + //If we made it this far, then we successfully grew the group, + //and we can go ahead and add the object at the first open slot. + members[i]=Object; + length=i+1; + return Dynamic; + } + + /** + * Recycling is designed to help you reuse game objects without always re-allocating or "newing" them. + * + *

If you specified a maximum size for this group(like in FlxEmitter), + * then recycle will employ what we're calling "rotating" recycling. + * Recycle()will first check to see if the group is at capacity yet. + * If group is not yet at capacity, recycle()returns a new object. + * If the group IS at capacity, then recycle()just returns the next object in line.

+ * + *

If you did NOT specify a maximum size for this group, + * then recycle()will employ what we're calling "grow-style" recycling. + * Recycle()will return either the first object with exists==false, + * or, finding none, add a new object to the array, + * doubling the size of the array if necessary.

+ * + *

WARNING:If this function needs to create a new object, + * and no object class was provided, it will return null + * instead of a valid object!

+ * + * @param ObjectClass The class type you want to recycle(e.g. FlxSprite, EvilRobot, etc). Do NOT "new" the class in the parameter! + * + * @return A reference to the object that was created. Don't forget to cast it back to the Class you want(e.g. myObject=myGroup.recycle(myObjectClass)as myObjectClass;). + */ + public function recycle(ObjectClass:Class=null):FlxBasic + { + var basic:FlxBasic; + if(_maxSize>0) + { + if(length<_maxSize) + { + if(ObjectClass==null) + return null; + return add(new DynamicClass()as FlxBasic); + } + else + { + basic=members[_marker++]; + if(_marker>=_maxSize) + _marker=0; + return basic; + } + } + else + { + basic=getFirstAvailable(ObjectClass); + if(basic !=null) + return basic; + if(ObjectClass==null) + return null; + return add(new DynamicClass()as FlxBasic); + } + } + + /** + * Removes an object from the group. + * + * @param Object TheFlxBasicyou want to remove. + * @param Splice Whether the object should be cut from the array entirely or not. + * + * @return The removed object. + */ + public function remove(Object:FlxBasic,Splice:Bool=false):FlxBasic + { + var index:Int=members.indexOf(Object); + if((index<0)||(index>=members.length)) + return null; + if(Splice) + { + members.splice(index,1); + length--; + } + else + members[index]=null; + return Dynamic; + } + + + public function move_to_front(Object:FlxBasic):Int { + var idx:Int=members.indexOf(Object); + if(idx==-1)return 0; + members.splice(idx, 1);// remove + //ad + members.splice(0, 0, Dynamic); + return 1; + } + + /** + * Replaces an existingFlxBasicwith a new one. + * + * @param OldObject The object you want to replace. + * @param NewObject The new object you want to use instead. + * + * @return The new object. + */ + public function replace(OldObject:FlxBasic,NewObject:FlxBasic):FlxBasic + { + var index:Int=members.indexOf(OldObject); + if((index<0)||(index>=members.length)) + return null; + members[index]=NewObject; + return NewObject; + } + + /** + * Call this function to sort the group according to a particular value and order. + * For example, to sort game objects for Zelda-style overlaps you might call + *myGroup.sort("y",ASCENDING)at the bottom of your + *FlxState.update()override. To sort all existing objects after + * a big explosion or bomb attack, you might callmyGroup.sort("exists",DESCENDING). + * + * @param Index TheStringname of the member variable you want to sort on. Default value is "y". + * @param Order AFlxGroupconstant that defines the sort order. Possible values areASCENDINGandDESCENDING. Default value isASCENDING. + */ + public function sort(Index:String="y",Order:Int=ASCENDING):Void + { + _sortIndex=Index; + _sortOrder=Order; + members.sort(sortHandler); + } + + /** + * Go through and set the specified variable to the specified value on all members of the group. + * + * @param VariableName The string representation of the variable name you want to modify, for example "visible" or "scrollFactor". + * @param Value The value you want to assign to that variable. + * @param Recurse Default value is true, meaning ifsetAll()encounters a member that is a group, it will callsetAll()on that group rather than modifying its variable. + */ + public function setAll(VariableName:String,Value:Dynamic,Recurse:Bool=true):Void + { + var basic:FlxBasic; + var i:Int=0; + while(icallAll()encounters a member that is a group, it will callcallAll()on that group rather than calling the group's function. + */ + public function callAll(FunctionName:String,Recurse:Bool=true):Void + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasiccurrently flagged as not existing. + */ + public function getFirstAvailable(ObjectClass:Class=null):FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iintindicating the first null slot in the group. + */ + public function getFirstNull():Int + { + var basic:FlxBasic; + var i:Int=0; + var l:Int=members.length; + while(iFlxBasiccurrently flagged as existing. + */ + public function getFirstExtant():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasiccurrently flagged as not dead. + */ + public function getFirstAlive():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(i=0;i--){ + if(members[i] !=null){ + basic=members[i] as FlxBasic; + if(basic.alive)return basic; + } + } + return null; + } + /** + * Call this function to retrieve the first object with dead==true in the group. + * This is handy for checking if everything's wiped out, or choosing a squad leader, etc. + * + * @return AFlxBasiccurrently flagged as dead. + */ + public function getFirstDead():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasics flagged as not dead. Returns -1 if group is empty. + */ + public function countLiving():Int + { + var count:Int=-1; + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasics flagged as dead. Returns -1 if group is empty. + */ + public function countDead():Int + { + var count:Int=-1; + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasicfrom the members list. + */ + public function getRandom(StartIndex:Int=0,Length:Int=0):FlxBasic + { + if(Length==0) + Length=length; + return FlxG.getRandom(members,StartIndex,Length)as FlxBasic; + } + + /** + * Remove all instances ofFlxBasicsubclass(FlxSprite, FlxBlock, etc)from the list. + * WARNING:does not destroy()or kill()any of these objects! + */ + public function clear():Void + { + length=members.length=0; + } + + /** + * Calls kill on the group's members and then on the group itself. + */ + override public function kill():Void + { + var basic:FlxBasic; + var i:Int=0; + while(iObj2[_sortIndex]) + return -_sortOrder; + return 0; + } + + public function set_draw_ref(s:FlxSprite):Void { + draw_root=s; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxObject.hx b/AIR/intra/hsrc/org/flixel/FlxObject.hx new file mode 100644 index 0000000..c7fd835 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxObject.hx @@ -0,0 +1,1182 @@ +package org.flixel; + +import entity.player.Player; +import flash.display.Graphics; +import flash.display.Sprite; +import flash.geom.Point; + +import org.flixel.FlxBasic; + +/** + * This is the base class for most of the display objects(FlxSprite,FlxText, etc). + * It includes some basic attributes about game objects, including retro-style flickering, + * basic state information, sizes, scrolling, and basic physics and motion. + * + * @author Adam Atomic + */ +class FlxObject extends FlxBasic +{ + /** + * Generic value for "left" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var LEFT:Int =0x0001; + /** + * Generic value for "right" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var RIGHT:Int =0x0010; + /** + * Generic value for "up" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var UP:Int =0x0100; + /** + * Generic value for "down" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var DOWN:Int =0x1000; + + /** + * Special-case constant meaning no collisions, used mainly byallowCollisionsandtouching. + */ + static public static inline var NONE:Int =0; + /** + * Special-case constant meaning up, used mainly byallowCollisionsandtouching. + */ + static public static inline var CEILING:Int=UP; + /** + * Special-case constant meaning down, used mainly byallowCollisionsandtouching. + */ + static public static inline var FLOOR:Int =DOWN; + /** + * Special-case constant meaning only the left and right sides, used mainly byallowCollisionsandtouching. + */ + static public static inline var WALL:Int =LEFT | RIGHT; + /** + * Special-case constant meaning any direction, used mainly byallowCollisionsandtouching. + */ + static public static inline var ANY:Int =LEFT | RIGHT | UP | DOWN; + + /** + * Handy constant used during collision resolution(seeseparateX()andseparateY()). + */ + static public static inline var OVERLAP_BIAS:Float=4; + + /** + * Path behavior controls:move from the start of the path to the end then stop. + */ + static public static inline var PATH_FORWARD:Int =0x000000; + /** + * Path behavior controls:move from the end of the path to the start then stop. + */ + static public static inline var PATH_BACKWARD:Int =0x000001; + /** + * Path behavior controls:move from the start of the path to the end then directly back to the start, and start over. + */ + static public static inline var PATH_LOOP_FORWARD:Int =0x000010; + /** + * Path behavior controls:move from the end of the path to the start then directly back to the end, and start over. + */ + static public static inline var PATH_LOOP_BACKWARD:Int =0x000100; + /** + * Path behavior controls:move from the start of the path to the end then turn around and go back to the start, over and over. + */ + static public static inline var PATH_YOYO:Int =0x001000; + /** + * Path behavior controls:ignores any vertical component to the path data, only follows side to side. + */ + static public static inline var PATH_HORIZONTAL_ONLY:Int =0x010000; + /** + * Path behavior controls:ignores any horizontal component to the path data, only follows up and down. + */ + static public static inline var PATH_VERTICAL_ONLY:Int =0x100000; + + /** + * X position of the upper left corner of this object in world space. + */ + public var x:Float; + /** + * Y position of the upper left corner of this object in world space. + */ + public var y:Float; + public var y_bottom:Int;//used for sorting + /** + * The width of this object. + */ + public var width:Float; + /** + * The height of this object. + */ + public var height:Float; + + /** + * Whether an object will move/alter position after a collision. + */ + public var immovable:Bool; + + /** + * The basic speed of this object. + */ + public var velocity:FlxPoint; + /** + * The virtual mass of the object. Default value is 1. + * Currently only used withelasticityduring collision resolution. + * Change at your own risk;effects seem crazy unpredictable so far! + */ + public var mass:Float; + /** + * The bounciness of this object. Only affects collisions. Default value is 0, or "not bouncy at all." + */ + public var elasticity:Float; + /** + * How fast the speed of this object is changing. + * Useful for smooth movement and gravity. + */ + public var acceleration:FlxPoint; + /** + * This isn't drag exactly, more like deceleration that is only applied + * when acceleration is not affecting the sprite. + */ + public var drag:FlxPoint; + /** + * If you are usingacceleration, you can usemaxVelocitywith it + * to cap the speed automatically(very useful!). + */ + public var maxVelocity:FlxPoint; + /** + * Set the angle of a sprite to rotate it. + * WARNING:rotating sprites decreases rendering + * performance for this sprite by a factor of 10x! + */ + public var angle:Float; + /** + * This is how fast you want this sprite to spin. + */ + public var angularVelocity:Float; + /** + * How fast the spin speed should change. + */ + public var angularAcceleration:Float; + /** + * Likedragbut for spinning. + */ + public var angularDrag:Float; + /** + * Use in conjunction withangularAccelerationfor fluid spin speed control. + */ + public var maxAngular:Float; + /** + * Should always represent(0,0)- useful for different things, for avoiding unnecessarynewcalls. + */ + static protected var _pZero:FlxPoint=new FlxPoint(); + + /** + * A point that can store numbers from 0 to 1(for X and Y independently) + * that governs how much this object is affected by the camera subsystem. + * 0 means it never moves, like a HUD element or far background graphic. + * 1 means it scrolls along a the same speed as the foreground layer. + * scrollFactor is initialized as(1,1)by default. + */ + public var scrollFactor:FlxPoint; + /** + * Internal helper used for retro-style flickering. + */ + private var _flicker:Bool; + /** + * Internal helper used for retro-style flickering. + */ + private var _flickerTimer:Float; + /** + * Handy for storing health percentage or armor points or whatever. + */ + public var health:Float; + /** + * This is just a pre-allocated x-y point container to be used however you like + */ + private var _point:FlxPoint; + /** + * This is just a pre-allocated rectangle container to be used however you like + */ + private var _rect:FlxRect; + /** + * Set this to false if you want to skip the automatic motion/movement stuff(seeupdateMotion()). + * FlxObject and FlxSprite default to true. + * FlxText, FlxTileblock, FlxTilemap and FlxSound default to false. + */ + public var moves:Bool; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating surface contacts. + * Use bitwise operators to check the values stored here, or use touching(), justStartedTouching(), etc. + * You can even use them broadly as boolean values if you're feeling saucy! + */ + public var touching:Int; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating surface contacts from the previous game loop step. + * Use bitwise operators to check the values stored here, or use touching(), justStartedTouching(), etc. + * You can even use them broadly as boolean values if you're feeling saucy! + */ + public var wasTouching:Int; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating collision directions. + * Use bitwise operators to check the values stored here. + * Useful for things like one-way platforms(e.g. allowCollisions=UP;) + * The accessor "solid" just flips this variable between NONE and ANY. + */ + public var allowCollisions:Int; + + /** + * Important variable for collision processing. + * By default this value is set automatically duringpreUpdate(). + */ + public var last:FlxPoint; + + /** + * A reference to a path object. Null by default, assigned byfollowPath(). + */ + public var path:FlxPath; + /** + * The speed at which the object is moving on the path. + * When an object completes a non-looping path circuit, + * the pathSpeed will be zeroed out, but thepathreference + * will NOT be nulled out. SopathSpeedis a good way + * to check if this object is currently following a path or not. + */ + public var pathSpeed:Float; + /** + * The angle in degrees between this object and the next node, where 0 is directly upward, and 90 is to the right. + */ + public var pathAngle:Float; + /** + * Internal helper, tracks which node of the path this object is moving toward. + */ + private var _pathNodeIndex:Int; + /** + * Internal tracker for path behavior flags(like looping, horizontal only, etc). + */ + private var _pathMode:Int; + /** + * Internal helper for node navigation, specifically yo-yo and backwards movement. + */ + private var _pathInc:Int; + /** + * Internal flag for whether hte object's angle should be adjusted to the path angle during path follow behavior. + */ + private var _pathRotate:Bool; + + /** + * Instantiates aFlxObject. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + */ + public function new(X:Float=0,Y:Float=0,Width:Float=0,Height:Float=0) + { + x=X; + y=Y; + last=new FlxPoint(x,y); + width=Width; + height=Height; + mass=1.0; + elasticity=0.0; + + health=1; + + immovable=false; + moves=true; + + touching=NONE; + wasTouching=NONE; + allowCollisions=ANY; + + velocity=new FlxPoint(); + acceleration=new FlxPoint(); + drag=new FlxPoint(); + maxVelocity=new FlxPoint(10000,10000); + + angle=0; + angularVelocity=0; + angularAcceleration=0; + angularDrag=0; + maxAngular=10000; + + scrollFactor=new FlxPoint(1.0,1.0); + _flicker=false; + _flickerTimer=0; + + _point=new FlxPoint(); + _rect=new FlxRect(); + + path=null; + pathSpeed=0; + pathAngle=0; + } + + /** + * Override this function to null out variables or + * manually call destroy()on class members if necessary. + * Don't forget to call super.destroy()! + */ + override public function destroy():Void + { + velocity=null; + acceleration=null; + drag=null; + maxVelocity=null; + scrollFactor=null; + _point=null; + _rect=null; + last=null; + cameras=null; + if(path !=null) + path.destroy(); + path=null; + } + + /** + * Pre-update is called right beforeupdate()on each object in the game loop. + * InFlxObjectit controls the flicker timer, + * tracking the last coordinates for collision purposes, + * and checking if the object is moving along a path or not. + */ + override public function preUpdate():Void + { + _ACTIVECOUNT++; + + if(_flickerTimer !=0) + { + if(_flickerTimer>0) + { + _flickerTimer=_flickerTimer - FlxG.elapsed; + if(_flickerTimer<=0) + { + _flickerTimer=0; + _flicker=false; + } + } + } + + if(last !=null){ + last.x=x; + last.y=y; + } + + if((path !=null)&&(pathSpeed !=0)&&(path.nodes[_pathNodeIndex] !=null)) + updatePathMotion(); + } + + /** + * Post-update is called right afterupdate()on each object in the game loop. + * InFlxObjectthis function handles Integrating the objects motion + * based on the velocity and acceleration settings, and tracking/clearing thetouchingflags. + */ + override public function postUpdate():Void + { + if(moves) + updateMotion(); + + wasTouching=touching; + touching=NONE; + } + + /** + * Internal function for updating the position and speed of this object. + * Useful for cases when you need to update this but are buried down in too many supers. + * Does a slightly fancier-than-normal Integration to help with higher fidelity framerate-independenct motion. + */ + private function updateMotion():Void + { + var delta:Float; + var velocityDelta:Float; + + velocityDelta=(FlxU.computeVelocity(angularVelocity,angularAcceleration,angularDrag,maxAngular)- angularVelocity)/2; + angularVelocity +=velocityDelta; + angle +=angularVelocity*FlxG.elapsed; + angularVelocity +=velocityDelta; + + velocityDelta=(FlxU.computeVelocity(velocity.x,acceleration.x,drag.x,maxVelocity.x)- velocity.x)/2; + velocity.x +=velocityDelta; + delta=velocity.x*FlxG.elapsed; + velocity.x +=velocityDelta; + x +=delta; + + velocityDelta=(FlxU.computeVelocity(velocity.y,acceleration.y,drag.y,maxVelocity.y)- velocity.y)/2; + velocity.y +=velocityDelta; + delta=velocity.y*FlxG.elapsed; + velocity.y +=velocityDelta; + y +=delta; + } + + /** + * Rarely called, and in this case just increments the visible objects count and callsdrawDebug()if necessary. + */ + override public function draw():Void + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(i0)?0.0000001:-0.0000001)); + boundingBoxY=Std.int(boundingBoxY +((boundingBoxY>0)?0.0000001:-0.0000001)); + var boundingBoxWidth:Int=(width !=Std.int(width))?width:width-1; + var boundingBoxHeight:Int=(height !=Std.int(height))?height:height-1; + + //fill static graphics object with square shape + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + gfx.moveTo(boundingBoxX,boundingBoxY); + var boundingBoxColor:Int; + if(allowCollisions) + { + if(allowCollisions !=ANY) + boundingBoxColor=FlxG.PINK; + if(immovable) + boundingBoxColor=FlxG.GREEN; + else + boundingBoxColor=FlxG.RED; + } + else + boundingBoxColor=FlxG.BLUE; + gfx.lineStyle(1,boundingBoxColor,0.5); + gfx.lineTo(boundingBoxX+boundingBoxWidth,boundingBoxY); + gfx.lineTo(boundingBoxX+boundingBoxWidth,boundingBoxY+boundingBoxHeight); + gfx.lineTo(boundingBoxX,boundingBoxY+boundingBoxHeight); + gfx.lineTo(boundingBoxX,boundingBoxY); + + //draw graphics shape to camera buffer + Camera.buffer.draw(FlxG.flashGfxSprite); + } + + /** + * Call this function to give this object a path to follow. + * If the path does not have at least one node in it, this function + * will log a warning message and return. + * + * @param Path TheFlxPathyou want this object to follow. + * @param Speed How fast to travel along the path in pixels per second. + * @param Mode Optional, controls the behavior of the object following the path using the path behavior constants. Can use multiple flags at once, for example PATH_YOYO|PATH_HORIZONTAL_ONLY will make an object move back and forth along the X axis of the path only. + * @param AutoRotate Automatically point the object toward the next node. Assumes the graphic is pointing upward. Default behavior is false, or no automatic rotation. + */ + public function followPath(Path:FlxPath,Speed:Float=100,Mode:Int=PATH_FORWARD,AutoRotate:Bool=false):Void + { + if(Path.nodes.length<=0) + { + FlxG.log("WARNING:Paths need at least one node in them to be followed."); + return; + } + + path=Path; + pathSpeed=FlxU.abs(Speed); + _pathMode=Mode; + _pathRotate=AutoRotate; + + //get starting node + if((_pathMode==PATH_BACKWARD)||(_pathMode==PATH_LOOP_BACKWARD)) + { + _pathNodeIndex=path.nodes.length-1; + _pathInc=-1; + } + else + { + _pathNodeIndex=0; + _pathInc=1; + } + } + + /** + * Tells this object to stop following the path its on. + * + * @param DestroyPath Tells this function whether to call destroy on the path object. Default value is false. + */ + public function stopFollowingPath(DestroyPath:Bool=false):Void + { + pathSpeed=0; + if(DestroyPath &&(path !=null)) + { + path.destroy(); + path=null; + } + } + + /** + * Internal function that decides what node in the path to aim for next based on the behavior flags. + * + * @return The node(aFlxPointobject)we are aiming for next. + */ + private function advancePath(Snap:Bool=true):FlxPoint + { + if(Snap) + { + var oldNode:FlxPoint=path.nodes[_pathNodeIndex]; + if(oldNode !=null) + { + if((_pathMode & PATH_VERTICAL_ONLY)==0) + x=oldNode.x - width*0.5; + if((_pathMode & PATH_HORIZONTAL_ONLY)==0) + y=oldNode.y - height*0.5; + } + } + + _pathNodeIndex +=_pathInc; + + if((_pathMode & PATH_BACKWARD)>0) + { + if(_pathNodeIndex<0) + { + _pathNodeIndex=0; + pathSpeed=0; + } + } + else if((_pathMode & PATH_LOOP_FORWARD)>0) + { + if(_pathNodeIndex>=path.nodes.length) + _pathNodeIndex=0; + } + else if((_pathMode & PATH_LOOP_BACKWARD)>0) + { + if(_pathNodeIndex<0) + { + _pathNodeIndex=path.nodes.length-1; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + } + } + else if((_pathMode & PATH_YOYO)>0) + { + if(_pathInc>0) + { + if(_pathNodeIndex>=path.nodes.length) + { + _pathNodeIndex=path.nodes.length-2; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + _pathInc=-_pathInc; + } + } + else if(_pathNodeIndex<0) + { + _pathNodeIndex=1; + if(_pathNodeIndex>=path.nodes.length) + _pathNodeIndex=path.nodes.length-1; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + _pathInc=-_pathInc; + } + } + else + { + if(_pathNodeIndex>=path.nodes.length) + { + _pathNodeIndex=path.nodes.length-1; + pathSpeed=0; + } + } + + return path.nodes[_pathNodeIndex]; + } + + /** + * Internal function for moving the object along the path. + * Generally this function is called automatically bypreUpdate(). + * The first half of the function decides if the object can advance to the next node in the path, + * while the second half handles actually picking a velocity toward the next node. + */ + private function updatePathMotion():Void + { + //first check if we need to be pointing at the next node yet + _point.x=x + width*0.5; + _point.y=y + height*0.5; + var node:FlxPoint=path.nodes[_pathNodeIndex]; + var deltaX:Float=node.x - _point.x; + var deltaY:Float=node.y - _point.y; + + var horizontalOnly:Bool=(_pathMode & PATH_HORIZONTAL_ONLY)>0; + var verticalOnly:Bool=(_pathMode & PATH_VERTICAL_ONLY)>0; + + if(horizontalOnly) + { + if(((deltaX>0)?deltaX:-deltaX)0)?deltaY:-deltaY)FlxObjectoverlaps thisFlxObjectorFlxGroup. + * If the group has a LOT of things in it, it might be faster to useFlxG.overlaps(). + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + public function overlaps(ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + //bug? + while(ix)&&(object.xy)&&(object.y_point.x)&&(objectScreenPos.x<_point.x + width)&& + (objectScreenPos.y + object.height>_point.y)&&(objectScreenPos.y<_point.y + height); + } + + /** + * Checks to see if thisFlxObjectwere located at the given position, would it overlap theFlxObjectorFlxGroup? + * This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size Into account. + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param X The X position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param Y The Y position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + public function overlapsAt(X:Float,Y:Float,ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iX)&&(object.xY)&&(object.y0)?0.0000001:-0.0000001; + _point.y +=(_point.y>0)?0.0000001:-0.0000001; + return (objectScreenPos.x + object.width>_point.x)&&(objectScreenPos.x<_point.x + width)&& + (objectScreenPos.y + object.height>_point.y)&&(objectScreenPos.y<_point.y + height); + } + + /** + * Checks to see if a point in 2D world space overlaps thisFlxObjectobject. + * + * @param Point The point in world space you want to check. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + public function overlapsPoint(Point:FlxPoint,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(!InScreenSpace) + return(Point.x>x)&&(Point.xy)&&(Point.y_point.x)&&(X<_point.x+width)&&(Y>_point.y)&&(Y<_point.y+height); + } + + /** + * Check and see if this object is currently on screen. + * + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether the object is on screen or not. + */ + public function onScreen(Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point,Camera); + return(_point.x + width>0)&&(_point.x0)&&(_point.yFlxPointobject and assigns the post-scrolled X and Y values of this object to it. + * + * @return ThePointyou passed in, or a newPointif you didn't pass one, containing the screen X and Y position of this object. + */ + public function getScreenXY(Point:FlxPoint=null,Camera:FlxCamera=null):FlxPoint + { + if(Point==null) + Point=new FlxPoint(); + if(Camera==null) + Camera=FlxG.camera; + Point.x=x - Std.int(Camera.scroll.x*scrollFactor.x); + Point.y=y - Std.int(Camera.scroll.y*scrollFactor.y); + Point.x +=(Point.x>0)?0.0000001:-0.0000001; + Point.y +=(Point.y>0)?0.0000001:-0.0000001; + return Point; + } + + /** + * Tells this object to flicker, retro-style. + * Pass a negative value to flicker forever. + * + * @param Duration How many seconds to flicker for. + */ + public function flicker(Duration:Float=1):Void + { + _flickerTimer=Duration; + if(_flickerTimer==0) + _flicker=false; + } + + /** + * Check to see if the object is still flickering. + * + * @return Whether the object is flickering or not. + */ + public var flickering(get_flickering, set_flickering):Bool; + private function get_flickering():Bool + { + return _flickerTimer !=0; + } + + /** + * Whether the object collides or not. For more control over what directions + * the object will collide from, use collision constants(like LEFT, FLOOR, etc) + * to set the value of allowCollisions directly. + */ + public var solid(get_solid, set_solid):Bool; + private function get_solid():Bool + { + return(allowCollisions & ANY)>NONE; + } + + /** + * @private + */ + private function set_solid(Solid:Bool):Void + { + if(Solid) + allowCollisions=ANY; + else + allowCollisions=NONE; + } + + /** + * Retrieve the midpoint of this object in world coordinates. + * + * @Point Allows you to pass in an existingFlxPointobject if you're so inclined. Otherwise a new one is created. + * + * @return AFlxPointobject containing the midpoint of this object in world coordinates. + */ + public function getMidpoint(Point:FlxPoint=null):FlxPoint + { + if(Point==null) + Point=new FlxPoint(); + Point.x=x + width*0.5; + Point.y=y + height*0.5; + return Point; + } + + /** + * Handy function for reviving game objects. + * Resets their existence flags and position. + * + * @param X The new X position of this object. + * @param Y The new Y position of this object. + */ + public function reset(X:Float,Y:Float):Void + { + revive(); + touching=NONE; + wasTouching=NONE; + x=X; + y=Y; + last.x=x; + last.y=y; + velocity.x=0; + velocity.y=0; + } + + /** + * Handy function for checking if this object is touching a particular surface. + * For slightly better performance you can just &the value directly Intotouching. + * However, this method is good for readability and accessibility. + * + * @param Direction Any of the collision flags(e.g. LEFT, FLOOR, etc). + * + * @return Whether the object is touching an object in(any of)the specified direction(s)this frame. + */ + public function isTouching(Direction:Int):Bool + { + return(touching & Direction)>NONE; + } + + /** + * Handy function for checking if this object is just landed on a particular surface. + * + * @param Direction Any of the collision flags(e.g. LEFT, FLOOR, etc). + * + * @return Whether the object just landed on(any of)the specified surface(s)this frame. + */ + public function justTouched(Direction:Int):Bool + { + return((touching & Direction)>NONE)&&((wasTouching & Direction)<=NONE); + } + + /** + * Reduces the "health" variable of this sprite by the amount specified in Damage. + * Calls kill()if health drops to or below zero. + * + * @param Damage How much health to take away(use a negative number to give a health bonus). + */ + public function hurt(Damage:Float):Void + { + health=health - Damage; + if(health<=0) + kill(); + } + + /** + * The main collision resolution function in flixel. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated. + */ + static public function separate(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + var separatedX:Bool=separateX(Object1,Object2); + var separatedY:Bool=separateY(Object1,Object2); + return separatedX || separatedY; + } + + /** + * The X-axis component of the object separation process. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated along the X axis. + */ + static public function separateX(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + //can't separate two immovable objects + var obj1immovable:Bool=Object1.immovable; + var obj2immovable:Bool=Object2.immovable; + if(obj1immovable && obj2immovable) + return false; + + //If one of the objects is a tilemap, just pass it off. + if(Std.is(Object1, FlxTilemap)) + return(Object1 as FlxTilemap).overlapsWithCallback(Object2,separateX); + if(Std.is(Object2, FlxTilemap)) + return(Object2 as FlxTilemap).overlapsWithCallback(Object1,separateX,true); + + //First, get the two object deltas + var overlap:Float=0; + var obj1delta:Float=Object1.x - Dynamic1.last.x; + var obj2delta:Float=Object2.x - Dynamic2.last.x; + if(obj1delta !=obj2delta) + { + //Check if the X hulls actually overlap + var obj1deltaAbs:Float=(obj1delta>0)?obj1delta:-obj1delta; + var obj2deltaAbs:Float=(obj2delta>0)?obj2delta:-obj2delta; + var obj1rect:FlxRect=new FlxRect(Object1.x-((obj1delta>0)?obj1delta:0),Object1.last.y,Object1.width+((obj1delta>0)?obj1delta:-obj1delta),Object1.height); + var obj2rect:FlxRect=new FlxRect(Object2.x-((obj2delta>0)?obj2delta:0),Object2.last.y,Object2.width+((obj2delta>0)?obj2delta:-obj2delta),Object2.height); + if((obj1rect.x + obj1rect.width>obj2rect.x)&&(obj1rect.xobj2rect.y)&&(obj1rect.yobj2delta) + { + overlap=Object1.x + Dynamic1.width - Dynamic2.x; + if((overlap>maxOverlap)|| !(Object1.allowCollisions & RIGHT)|| !(Object2.allowCollisions & LEFT)) + overlap=0; + else + { + Object1.touching |=RIGHT; + Object2.touching |=LEFT; + } + } + else if(obj1deltamaxOverlap)|| !(Object1.allowCollisions & LEFT)|| !(Object2.allowCollisions & RIGHT)) + overlap=0; + else + { + Object1.touching |=LEFT; + Object2.touching |=RIGHT; + } + } + } + } + + //Then adjust their positions and velocities accordingly(if there was any overlap) + if(overlap !=0) + { + var obj1v:Float=Object1.velocity.x; + var obj2v:Float=Object2.velocity.x; + + if(!obj1immovable && !obj2immovable) + { + overlap *=0.5; + Object1.x=Object1.x - overlap; + Object2.x +=overlap; + + var obj1velocity:Float=Math.sqrt((obj2v * obj2v * Dynamic2.mass)/Object1.mass)*((obj2v>0)?1:-1); + var obj2velocity:Float=Math.sqrt((obj1v * obj1v * Dynamic1.mass)/Object2.mass)*((obj1v>0)?1:-1); + var average:Float=(obj1velocity + obj2velocity)*0.5; + obj1velocity -=average; + obj2velocity -=average; + Object1.velocity.x=average + obj1velocity * Dynamic1.elasticity; + Object2.velocity.x=average + obj2velocity * Dynamic2.elasticity; + } + else if(!obj1immovable) + { + Object1.x=Object1.x - overlap; + Object1.velocity.x=obj2v - obj1v*Object1.elasticity; + } + else if(!obj2immovable) + { + Object2.x +=overlap; + Object2.velocity.x=obj1v - obj2v*Object2.elasticity; + } + return true; + } + else + return false; + } + + /** + * The Y-axis component of the object separation process. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated along the Y axis. + */ + static public function separateY(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + //can't separate two immovable objects + var obj1immovable:Bool=Object1.immovable; + var obj2immovable:Bool=Object2.immovable; + if(obj1immovable && obj2immovable) + return false; + + //If one of the objects is a tilemap, just pass it off. + if(Std.is(Object1, FlxTilemap)) + return(Object1 as FlxTilemap).overlapsWithCallback(Object2,separateY); + if(Std.is(Object2, FlxTilemap)) + return(Object2 as FlxTilemap).overlapsWithCallback(Object1,separateY,true); + + //First, get the two object deltas + var overlap:Float=0; + var obj1delta:Float=Object1.y - Dynamic1.last.y; + var obj2delta:Float=Object2.y - Dynamic2.last.y; + if(obj1delta !=obj2delta) + { + //Check if the Y hulls actually overlap + var obj1deltaAbs:Float=(obj1delta>0)?obj1delta:-obj1delta; + var obj2deltaAbs:Float=(obj2delta>0)?obj2delta:-obj2delta; + var obj1rect:FlxRect=new FlxRect(Object1.x,Object1.y-((obj1delta>0)?obj1delta:0),Object1.width,Object1.height+obj1deltaAbs); + var obj2rect:FlxRect=new FlxRect(Object2.x,Object2.y-((obj2delta>0)?obj2delta:0),Object2.width,Object2.height+obj2deltaAbs); + if((obj1rect.x + obj1rect.width>obj2rect.x)&&(obj1rect.xobj2rect.y)&&(obj1rect.yobj2delta) + { + overlap=Object1.y + Dynamic1.height - Dynamic2.y; + if((overlap>maxOverlap)|| !(Object1.allowCollisions & DOWN)|| !(Object2.allowCollisions & UP)) + overlap=0; + else + { + Object1.touching |=DOWN; + Object2.touching |=UP; + } + } + else if(obj1deltamaxOverlap)|| !(Object1.allowCollisions & UP)|| !(Object2.allowCollisions & DOWN)) + overlap=0; + else + { + Object1.touching |=UP; + Object2.touching |=DOWN; + } + } + } + } + + //Then adjust their positions and velocities accordingly(if there was any overlap) + if(overlap !=0) + { + var obj1v:Float=Object1.velocity.y; + var obj2v:Float=Object2.velocity.y; + + if(!obj1immovable && !obj2immovable) + { + overlap *=0.5; + Object1.y=Object1.y - overlap; + Object2.y +=overlap; + + var obj1velocity:Float=Math.sqrt((obj2v * obj2v * Dynamic2.mass)/Object1.mass)*((obj2v>0)?1:-1); + var obj2velocity:Float=Math.sqrt((obj1v * obj1v * Dynamic1.mass)/Object2.mass)*((obj1v>0)?1:-1); + var average:Float=(obj1velocity + obj2velocity)*0.5; + obj1velocity -=average; + obj2velocity -=average; + Object1.velocity.y=average + obj1velocity * Dynamic1.elasticity; + Object2.velocity.y=average + obj2velocity * Dynamic2.elasticity; + } + else if(!obj1immovable) + { + Object1.y=Object1.y - overlap; + Object1.velocity.y=obj2v - obj1v*Object1.elasticity; + //This is special case code that handles cases like horizontal moving platforms you can ride + if(Object2.active && Dynamic2.moves &&(obj1delta>obj2delta)) + Object1.x +=Object2.x - Dynamic2.last.x; + } + else if(!obj2immovable) + { + Object2.y +=overlap; + Object2.velocity.y=obj1v - obj2v*Object2.elasticity; + //This is special case code that handles cases like horizontal moving platforms you can ride + if(Object1.active && Dynamic1.moves &&(obj1deltaFlxSpriteto have slightly more specialized behavior + * common to many game scenarios. You can override and extend this class + * just like you wouldFlxSprite. WhileFlxEmitter + * used to work with just any old sprite, it now requires a + *FlxParticlebased class. + * + * @author Adam Atomic + */ +class FlxParticle extends FlxSprite +{ + /** + * How long this particle lives before it disappears. + * NOTE:this is a maximum, not a minimum;the object + * could get recycled before its lifespan is up. + */ + public var lifespan:Float; + + /** + * Determines how quickly the particles come to rest on the ground. + * Only used if the particle has gravity-like acceleration applied. + * @default 500 + */ + public var friction:Float; + + /** + * Instantiate a new particle. LikeFlxSprite, all meaningful creation + * happens duringloadGraphic()ormakeGraphic()or whatever. + */ + public function new() + { + super(); + lifespan=0; + friction=500; + } + + /** + * The particle's main update logic. Basically it checks to see if it should + * be dead yet, and then has some special bounce behavior if there is some gravity on it. + */ + override public function update():Void + { + //lifespan behavior + if(lifespan<=0) + return; + lifespan -=FlxG.elapsed; + if(lifespan<=0) + kill(); + + //simpler bounce/spin behavior for now + if(touching) + { + if(angularVelocity !=0) + angularVelocity=-angularVelocity; + } + if(acceleration.y>0)//special behavior for particles with gravity + { + if(touching & FLOOR) + { + drag.x=friction; + + if(!(wasTouching & FLOOR)) + { + if(velocity.y<-elasticity*10) + { + if(angularVelocity !=0) + angularVelocity *=-elasticity; + } + else + { + velocity.y=0; + angularVelocity=0; + } + } + } + else + drag.x=0; + } + } + + /** + * Triggered whenever this object is launched by aFlxEmitter. + * You can override this to add custom behavior like a sound or AI or something. + */ + public function onEmit():Void + { + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxPath.hx b/AIR/intra/hsrc/org/flixel/FlxPath.hx new file mode 100644 index 0000000..52c0db9 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxPath.hx @@ -0,0 +1,280 @@ +package org.flixel; + +import flash.display.Graphics; + +import org.flixel.plugin.DebugPathDisplay; + +/** + * This is a simple path data container. Basically a list of points that + * aFlxObjectcan follow. Also has code for drawing debug visuals. + *FlxTilemap.findPath()returns a path object, but you can + * also just make your own, using theadd()functions below + * or by creating your own array of points. + * + * @author Adam Atomic + */ +class FlxPath +{ + /** + * The list ofFlxPoints that make up the path data. + */ + public var nodes:Array; + /** + * Specify a debug display color for the path. Default is white. + */ + public var debugColor:Int; + /** + * Specify a debug display scroll factor for the path. Default is(1,1). + * NOTE:does not affect world movement! Dynamic scroll factors take care of that. + */ + public var debugScrollFactor:FlxPoint; + /** + * Setting this to true will prevent the object from appearing + * when the visual debug mode in the debugger overlay is toggled on. + * @default false + */ + public var ignoreDrawDebug:Bool; + + /** + * Internal helper for keeping new variable instantiations under control. + */ + private var _point:FlxPoint; + + /** + * Instantiate a new path object. + * + * @param Nodes Optional, can specify all the points for the path up front if you want. + */ + public function new(Nodes:Array=null) + { + if(Nodes==null) + nodes=new Array(); + else + nodes=Nodes; + _point=new FlxPoint(); + debugScrollFactor=new FlxPoint(1.0,1.0); + debugColor=0xffffff; + ignoreDrawDebug=false; + + var debugPathDisplay:DebugPathDisplay=manager; + if(debugPathDisplay !=null) + debugPathDisplay.add(this); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + var debugPathDisplay:DebugPathDisplay=manager; + if(debugPathDisplay !=null) + debugPathDisplay.remove(this); + + debugScrollFactor=null; + _point=null; + nodes=null; + } + + /** + * Add a new node to the end of the path at the specified location. + * + * @param X X position of the new path point in world coordinates. + * @param Y Y position of the new path point in world coordinates. + */ + public function add(X:Float,Y:Float):Void + { + nodes.push(new FlxPoint(X,Y)); + } + + /** + * Add a new node to the path at the specified location and index within the path. + * + * @param X X position of the new path point in world coordinates. + * @param Y Y position of the new path point in world coordinates. + * @param Index Where within the list of path nodes to insert this new point. + */ + public function addAt(X:Float, Y:Float, Index:Int):Void + { + if(Index>nodes.length) + Index=nodes.length; + nodes.splice(Index,0,new FlxPoint(X,Y)); + } + + /** + * Sometimes its easier or faster to just pass a point object instead of separate X and Y coordinates. + * This also gives you the option of not creating a new node but actually adding that specific + *FlxPointobject to the path. This allows you to do neat things, like dynamic paths. + * + * @param Node The point in world coordinates you want to add to the path. + * @param AsReference Whether to add the point as a reference, or to create a new point with the specified values. + */ + public function addPoint(Node:FlxPoint,AsReference:Bool=false):Void + { + if(AsReference) + nodes.push(Node); + else + nodes.push(new FlxPoint(Node.x,Node.y)); + } + + /** + * Sometimes its easier or faster to just pass a point object instead of separate X and Y coordinates. + * This also gives you the option of not creating a new node but actually adding that specific + *FlxPointobject to the path. This allows you to do neat things, like dynamic paths. + * + * @param Node The point in world coordinates you want to add to the path. + * @param Index Where within the list of path nodes to insert this new point. + * @param AsReference Whether to add the point as a reference, or to create a new point with the specified values. + */ + public function addPointAt(Node:FlxPoint,Index:Int,AsReference:Bool=false):Void + { + if(Index>nodes.length) + Index=nodes.length; + if(AsReference) + nodes.splice(Index,0,Node); + else + nodes.splice(Index,0,new FlxPoint(Node.x,Node.y)); + } + + /** + * Remove a node from the path. + * NOTE:only works with points added by reference or with references fromnodesitself! + * + * @param Node The point object you want to remove from the path. + * + * @return The node that was excised. Returns null if the node was not found. + */ + public function remove(Node:FlxPoint):FlxPoint + { + var index:Int=nodes.indexOf(Node); + if(index>=0) + return nodes.splice(index,1)[0]; + else + return null; + } + + /** + * Remove a node from the path using the specified position in the list of path nodes. + * + * @param Index Where within the list of path nodes you want to remove a node. + * + * @return The node that was excised. Returns null if there were no nodes in the path. + */ + public function removeAt(Index:Int):FlxPoint + { + if(nodes.length<=0) + return null; + if(Index>=nodes.length) + Index=nodes.length-1; + return nodes.splice(Index,1)[0]; + } + + /** + * Get the first node in the list. + * + * @return The first node in the path. + */ + public function head():FlxPoint + { + if(nodes.length>0) + return nodes[0]; + return null; + } + + /** + * Get the last node in the list. + * + * @return The last node in the path. + */ + public function tail():FlxPoint + { + if(nodes.length>0) + return nodes[nodes.length-1]; + return null; + } + + /** + * While this doesn't overrideFlxBasic.drawDebug(), the behavior is very similar. + * Based on this path data, it draws a simple lines-and-boxes representation of the path + * if the visual debug mode was toggled in the debugger overlay. You can usedebugColor + * anddebugScrollFactorto control the path's appearance. + * + * @param Camera The camera object the path will draw to. + */ + public function drawDebug(Camera:FlxCamera=null):Void + { + if(nodes.length<=0) + return; + if(Camera==null) + Camera=FlxG.camera; + + //Set up our global flash graphics object to draw out the path + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + + //Then fill up the object with node and path graphics + var node:FlxPoint; + var nextNode:FlxPoint; + var i:Int=0; + var l:Int=nodes.length; + while(i0)?0.0000001:-0.0000001)); + _point.y=Std.int(_point.y +((_point.y>0)?0.0000001:-0.0000001)); + + //decide what color this node should be + var nodeSize:Int=2; + if((i==0)||(i==l-1)) + nodeSize *=2; + var nodeColor:Int=debugColor; + if(l>1) + { + if(i==0) + nodeColor=FlxG.GREEN; + else if(i==l-1) + nodeColor=FlxG.RED; + } + + //draw a box for the node + gfx.beginFill(nodeColor,0.5); + gfx.lineStyle(); + gfx.drawRect(_point.x-nodeSize*0.5,_point.y-nodeSize*0.5,nodeSize,nodeSize); + gfx.endFill(); + + //then find the next node in the path + var linealpha:Float=0.3; + if(i0)?0.0000001:-0.0000001)); + _point.y=Std.int(_point.y +((_point.y>0)?0.0000001:-0.0000001)); + gfx.lineTo(_point.x,_point.y); + + i++; + } + + //then stamp the path down onto the game buffer + Camera.buffer.draw(FlxG.flashGfxSprite); + } + + static public var manager(get_manager, null):DebugPathDisplay; + private function get_manager():DebugPathDisplay + { + return FlxG.getPlugin(DebugPathDisplay)as DebugPathDisplay; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxPoint.hx b/AIR/intra/hsrc/org/flixel/FlxPoint.hx new file mode 100644 index 0000000..eebc911 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxPoint.hx @@ -0,0 +1,101 @@ +package org.flixel; + +import flash.geom.Point; + +/** + * Stores a 2D floating point coordinate. + * + * @author Adam Atomic + */ +class FlxPoint +{ + /** + * @default 0 + */ + public var x:Float; + /** + * @default 0 + */ + public var y:Float; + + /** + * Instantiate a new point object. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + */ + public function new(X:Float=0, Y:Float=0) + { + x=X; + y=Y; + } + + /** + * Instantiate a new point object. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + */ + public function make(X:Float=0, Y:Float=0):FlxPoint + { + x=X; + y=Y; + return this; + } + + /** + * Helper function, just copies the values from the specified point. + * + * @param Point AnyFlxPoint. + * + * @return A reference to itself. + */ + public function copyFrom(Point:FlxPoint):FlxPoint + { + x=Point.x; + y=Point.y; + return this; + } + + /** + * Helper function, just copies the values from this point to the specified point. + * + * @param Point AnyFlxPoint. + * + * @return A reference to the altered point parameter. + */ + public function copyTo(Point:FlxPoint):FlxPoint + { + Point.x=x; + Point.y=y; + return Point; + } + + /** + * Helper function, just copies the values from the specified Flash point. + * + * @param Point AnyPoint. + * + * @return A reference to itself. + */ + public function copyFromFlash(FlashPoint:Point):FlxPoint + { + x=FlashPoint.x; + y=FlashPoint.y; + return this; + } + + /** + * Helper function, just copies the values from this point to the specified Flash point. + * + * @param Point AnyPoint. + * + * @return A reference to the altered point parameter. + */ + public function copyToFlash(FlashPoint:Point):Point + { + FlashPoint.x=x; + FlashPoint.y=y; + return FlashPoint; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxRect.hx b/AIR/intra/hsrc/org/flixel/FlxRect.hx new file mode 100644 index 0000000..97f0981 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxRect.hx @@ -0,0 +1,175 @@ +package org.flixel; + +import flash.geom.Rectangle; + +/** + * Stores a rectangle. + * + * @author Adam Atomic + */ +class FlxRect +{ + /** + * @default 0 + */ + public var x:Float; + /** + * @default 0 + */ + public var y:Float; + /** + * @default 0 + */ + public var width:Float; + /** + * @default 0 + */ + public var height:Float; + + /** + * Instantiate a new rectangle. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + */ + public function new(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0) + { + x=X; + y=Y; + width=Width; + height=Height; + } + + /** + * The X coordinate of the left side of the rectangle. Read-only. + */ + public var left(get_left, null):Float; + private function get_left():Float + { + return x; + } + + /** + * The X coordinate of the right side of the rectangle. Read-only. + */ + public var right(get_right, null):Float; + private function get_right():Float + { + return x + width; + } + + /** + * The Y coordinate of the top of the rectangle. Read-only. + */ + public var top(get_top, null):Float; + private function get_top():Float + { + return y; + } + + /** + * The Y coordinate of the bottom of the rectangle. Read-only. + */ + public var bottom(get_bottom, null):Float; + private function get_bottom():Float + { + return y + height; + } + + /** + * Instantiate a new rectangle. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + * + * @return A reference to itself. + */ + public function make(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0):FlxRect + { + x=X; + y=Y; + width=Width; + height=Height; + return this; + } + + /** + * Helper function, just copies the values from the specified rectangle. + * + * @param Rect AnyFlxRect. + * + * @return A reference to itself. + */ + public function copyFrom(Rect:FlxRect):FlxRect + { + x=Rect.x; + y=Rect.y; + width=Rect.width; + height=Rect.height; + return this; + } + + /** + * Helper function, just copies the values from this rectangle to the specified rectangle. + * + * @param Point AnyFlxRect. + * + * @return A reference to the altered rectangle parameter. + */ + public function copyTo(Rect:FlxRect):FlxRect + { + Rect.x=x; + Rect.y=y; + Rect.width=width; + Rect.height=height; + return Rect; + } + + /** + * Helper function, just copies the values from the specified Flash rectangle. + * + * @param FlashRect AnyRectangle. + * + * @return A reference to itself. + */ + public function copyFromFlash(FlashRect:Rectangle):FlxRect + { + x=FlashRect.x; + y=FlashRect.y; + width=FlashRect.width; + height=FlashRect.height; + return this; + } + + /** + * Helper function, just copies the values from this rectangle to the specified Flash rectangle. + * + * @param Point AnyRectangle. + * + * @return A reference to the altered rectangle parameter. + */ + public function copyToFlash(FlashRect:Rectangle):Rectangle + { + FlashRect.x=x; + FlashRect.y=y; + FlashRect.width=width; + FlashRect.height=height; + return FlashRect; + } + + /** + * Checks to see if someFlxRectobject overlaps thisFlxRectobject. + * + * @param Rect The rectangle being tested. + * + * @return Whether or not the two rectangles overlap. + */ + public function overlaps(Rect:FlxRect):Bool + { + return(Rect.x + Rect.width>x)&&(Rect.xy)&&(Rect.yflush()anddestroy()on your save file. + * Will correctly handle storage size popups and all that good stuff. + * If you don't want to save your changes first, just calldestroy()instead. + * + * @param MinFileSize If you need X amount of space for your save, specify it here. + * @param OnComplete This callback will be triggered when the data is written successfully. + * + * @return The result of result of theflush()call(see below for more details). + */ + public function close(MinFileSize:Int=0,OnComplete:Function=null):Bool + { + _closeRequested=true; + return flush(MinFileSize,OnComplete); + } + + /** + * Writes the local shared object to disk immediately. Leaves the object open in memory. + * + * @param MinFileSize If you need X amount of space for your save, specify it here. + * @param OnComplete This callback will be triggered when the data is written successfully. + * + * @return Whether or not the data was written immediately. False could be an error OR a storage request popup. + */ + public function flush(MinFileSize:Int=0,OnComplete:Function=null):Bool + { + if(!checkBinding()) + return false; + _onComplete=OnComplete; + var result:String=null; + try { result=_sharedObject.flush(MinFileSize);} + catch(e:Dynamic){ return onDone(ERROR);} + if(result==SharedObjectFlushStatus.PENDING) + _sharedObject.addEventListener(NetStatusEvent.NET_STATUS,onFlushStatus); + return onDone((result==SharedObjectFlushStatus.FLUSHED)?SUCCESS:PENDING); + } + + /** + * Erases everything stored in the local shared object. + * Data is immediately erased and the object is saved that way, + * so use with caution! + * + * @return Returns false if the save object is not bound yet. + */ + public function erase():Bool + { + if(!checkBinding()) + return false; + _sharedObject.clear(); + return true; + } + + /** + * Event handler for special case storage requests. + * + * @param E Flash net status event. + */ + private function onFlushStatus(E:NetStatusEvent):Void + { + _sharedObject.removeEventListener(NetStatusEvent.NET_STATUS,onFlushStatus); + onDone((E.info.code=="SharedObject.Flush.Success")?SUCCESS:ERROR); + } + + /** + * Event handler for special case storage requests. + * Handles logging of errors and calling of callback. + * + * @param Result One of the result codes(PENDING, ERROR, or SUCCESS). + * + * @return Whether the operation was a success or not. + */ + private function onDone(Result:Int):Bool + { + switch(Result) + { + case PENDING: + FlxG.log("FLIXEL:FlxSave is requesting extra storage space."); + break; + case ERROR: + FlxG.log("ERROR:There was a problem flushing\nthe shared object data from FlxSave."); + break; + default: + break; + } + if(_onComplete !=null) + _onComplete(Result==SUCCESS); + if(_closeRequested) + destroy(); + return Result==SUCCESS; + } + + /** + * Handy utility function for checking and warning if the shared object is bound yet or not. + * + * @return Whether the shared object was bound yet. + */ + private function checkBinding():Bool + { + if(_sharedObject==null) + { + FlxG.log("FLIXEL:You must call FlxSave.bind()\nbefore you can read or write data."); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxSound.hx b/AIR/intra/hsrc/org/flixel/FlxSound.hx new file mode 100644 index 0000000..c9651d2 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxSound.hx @@ -0,0 +1,508 @@ +package org.flixel; + +import flash.events.Event; +import flash.media.Sound; +import flash.media.SoundChannel; +import flash.media.SoundTransform; +import flash.net.URLRequest; + +import flash.events.SampleDataEvent; +import flash.utils.ByteArray; + + +/** + * This is the universal flixel sound object, used for streaming, music, and sound effects. + * + * EMBEDDED SEAMLESS LOOPING MODIFICATION BY MAX "GETI" CAHILL. + */ +class FlxSound extends FlxObject +{ + /** + * Whether or not this sound should be automatically destroyed when you switch states. + */ + public var survive:Bool; + /** + * Whether the sound is currently playing or not. + */ + public var playing:Bool; + /** + * The ID3 song name. Defaults to null. Currently only works for streamed sounds. + */ + public var name:String; + /** + * The ID3 artist name. Defaults to null. Currently only works for streamed sounds. + */ + public var artist:String; + public var fixed:Bool; + /* + * A bunch of looping variables follow. + */ + protected var MAGIC_DELAY:Float=2766.0; //THE MAGIC NUMBER + protected var bufferSize:Int=4096; //this gives stable playback + private var samplesTotal:Int=0; //this _must_ be known about the song to be looped + public var loop_start:Int=0; + private var samplesPosition:Int=0; //helper for reading the sound + + private var _streaming:Bool; //whether we're streaming the audio or not + + /* + * The default FlxSound variables + */ + + private var _init:Bool; + public var _sound:Sound; + private var _in:Sound; + public var _channel:SoundChannel; + private var _transform:SoundTransform; + public var _position:Float; + private var _volume:Float; + private var _volumeAdjust:Float; + private var _looped:Bool; + private var _core:FlxObject; + private var _radius:Float; + private var _pan:Bool; + private var _fadeOutTimer:Float; + private var _fadeOutTotal:Float; + private var _pauseOnFadeOut:Bool; + private var _fadeInTimer:Float; + private var _fadeInTotal:Float; + private var _point2:FlxPoint; + + + /** + * The FlxSound constructor gets all the variables initialized, but NOT ready to play a sound yet. + */ + public function new() + { + + super(); + _point2=new FlxPoint(); + _transform=new SoundTransform(); + init(); + fixed=true;//no movement usually + } + + /** + * An Internal function for clearing all the variables used by sounds. + */ + private function init():Void + { + _transform.pan=0; + _sound=null; + _in=null; + _position=0; + _volume=1.0; + _volumeAdjust=1.0; + _looped=false; + _core=null; + _radius=0; + _pan=false; + _fadeOutTimer=0; + _fadeOutTotal=0; + _pauseOnFadeOut=false; + _fadeInTimer=0; + _fadeInTotal=0; + active=false; + visible=false; + solid=false; + playing=false; + name=null; + artist=null; + } + + /** + * One of two main setup functions for sounds, this function loads a sound from an embedded MP3. + * + * @param EmbeddedSound An embedded Class object representing an MP3 file. + * @param Looped Whether or not this sound should loop endlessly. + * @param totalSamples If looped is true, the number of samples is needed. + * + * @return ThisFlxSoundinstance(nice for chaining stuff together, if you're Into that). + */ + public function loadEmbedded(EmbeddedSound:Class, Looped:Bool=false, totalSamples:Int=0, _loop_start:Int=0):FlxSound + { + stop(); + init(); + if(Looped) + { + _in=new EmbeddedSound; + _sound=new Sound(); + _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleData); + samplesTotal=totalSamples - MAGIC_DELAY;//prevents any delay at the end of the track as well. + loop_start=_loop_start; + } + else _sound=new EmbeddedSound; + //NOTE:can't pull ID3 info from embedded sound currently + _streaming=false; + _looped=Looped; + updateTransform(); + active=true; + return this; + } + + /** + * One of two main setup functions for sounds, this function loads a sound from a URL. + * + * @param EmbeddedSound A string representing the URL of the MP3 file you want to play. + * @param Looped Whether or not this sound should loop endlessly. + * + * @return ThisFlxSoundinstance(nice for chaining stuff together, if you're Into that). + */ + public function loadStream(SoundURL:String, Looped:Bool=false):FlxSound + { + stop(); + init(); + _sound=new Sound(); + _sound.addEventListener(Event.ID3, gotID3); + _sound.load(new URLRequest(SoundURL)); + _streaming=true; + _looped=Looped; + updateTransform(); + active=true; + return this; + } + + /** + * Call this function if you want this sound's volume to change + * based on distance from a particular FlxCore object. + * + * @param X The X position of the sound. + * @param Y The Y position of the sound. + * @param Core The object you want to track. + * @param Radius The maximum distance this sound can travel. + * + * @return This FlxSound instance(nice for chaining stuff together, if you're Into that). + */ + public function proximity(X:Float,Y:Float,Core:FlxObject,Radius:Float,Pan:Bool=true):FlxSound + { + x=X; + y=Y; + _core=Core; + _radius=Radius; + _pan=Pan; + return this; + } + + /** + * Call this function to play the sound. + */ + public function play():Void + { + volume=FlxG.volume; + if(_position<0) + return; + if(_looped) + { + if(!_streaming) + { + if(_channel==null) + + _channel=_sound.play(0,9999,_transform); + if(_channel==null) + active=false; + } + else + { + if(_position==0) + { + if(_channel==null) + _channel=_sound.play(0,9999,_transform); + if(_channel==null) + active=false; + } + else + { + _channel=_sound.play(_position,0,_transform); + if(_channel==null) + active=false; + else + _channel.addEventListener(Event.SOUND_COMPLETE, looped); + } + } + } + else + { + if(_position==0) + { + if(_channel==null) + { + _channel=_sound.play(0,0,_transform); + if(_channel==null) + active=false; + else + _channel.addEventListener(Event.SOUND_COMPLETE, stopped); + } + } + else + { + _channel=_sound.play(_position,0,_transform); + if(_channel==null) + active=false; + } + } + playing=(_channel !=null); + _position=0; + } + + /** + * Call this function to pause this sound. + */ + public function pause():Void + { + if(_channel==null) + { + _position=-1; + return; + } + _position=_channel.position; + _channel.stop(); + if(_looped) + { + while(_position>=_sound.length) + _position -=_sound.length; + } + _channel=null; + playing=false; + } + + /** + * Call this function to stop this sound. + */ + public function stop():Void + { + _position=0; + if(_channel !=null) + { + _channel.stop(); + stopped(); + } + } + + /** + * Call this function to make this sound fade out over a certain time Interval. + * + * @param Seconds The amount of time the fade out operation should take. + * @param PauseInstead Tells the sound to pause on fadeout, instead of stopping. + */ + public function fadeOut(Seconds:Float,PauseInstead:Bool=false):Void + { + _pauseOnFadeOut=PauseInstead; + _fadeInTimer=0; + _fadeOutTimer=Seconds; + _fadeOutTotal=_fadeOutTimer; + } + + /** + * Call this function to make a sound fade in over a certain + * time Interval(callsplay()automatically). + * + * @param Seconds The amount of time the fade-in operation should take. + */ + public function fadeIn(Seconds:Float):Void + { + _fadeOutTimer=0; + _fadeInTimer=Seconds; + _fadeInTotal=_fadeInTimer; + play(); + } + + /** + * Setvolumeto a value between 0 and 1 to change how this sound is. + */ + public var volume(get_volume, set_volume):Float; + private function get_volume():Float + { + return _volume; + } + + /** + * @private + */ + private function set_volume(Volume:Float):Void + { + _volume=Volume; + if(_volume<0) + _volume=0; + else if(_volume>1) + _volume=1; + updateTransform(); + } + + /** + * Internal function that performs the actual logical updates to the sound object. + * Doesn't do much except optional proximity and fade calculations. + */ + private function updateSound():Void + { + if(_position !=0) + return; + + var radial:Float=1.0; + var fade:Float=1.0; + + //Distance-based volume control + if(_core !=null) + { + var _point:FlxPoint=new FlxPoint(); + var _point2:FlxPoint=new FlxPoint(); + _core.getScreenXY(_point); + getScreenXY(_point2); + var dx:Float=_point.x - _point2.x; + var dy:Float=_point.y - _point2.y; + radial=(_radius - Math.sqrt(dx*dx + dy*dy))/_radius; + if(radial<0)radial=0; + if(radial>1)radial=1; + + if(_pan) + { + var d:Float=-dx/_radius; + if(d<-1)d=-1; + else if(d>1)d=1; + _transform.pan=d; + } + } + + //Cross-fading volume control + if(_fadeOutTimer>0) + { + _fadeOutTimer -=FlxG.elapsed; + if(_fadeOutTimer<=0) + { + if(_pauseOnFadeOut) + pause(); + else + stop(); + } + fade=_fadeOutTimer/_fadeOutTotal; + if(fade<0)fade=0; + } + else if(_fadeInTimer>0) + { + _fadeInTimer -=FlxG.elapsed; + fade=_fadeInTimer/_fadeInTotal; + if(fade<0)fade=0; + fade=1 - fade; + } + + _volumeAdjust=radial*fade; + updateTransform(); + } + + /** + * The basic game loop update function. Just callsupdateSound(). + */ + override public function update():Void + { + super.update(); + updateSound(); + } + + /** + * The basic class destructor, stops the music and removes any leftover events. + */ + override public function destroy():Void + { + if(active) + stop(); + } + + /** + * An Internal function used to help organize and change the volume of the sound. + */ + private function updateTransform():Void + { + //_transform.volume=FlxG.getMuteValue()*FlxG.volume*_volume*_volumeAdjust; + _transform.volume=FlxG.volume*_volume*_volumeAdjust; + if(_channel !=null) + _channel.soundTransform=_transform; + } + + /** + * An Internal helper function used to help Flash resume playing a looped sound. + * + * @param event AnEventobject. + */ + private function looped(event:Event=null):Void + { + if(_channel==null) + return; + _channel.removeEventListener(Event.SOUND_COMPLETE,looped); + _channel=null; + play(); + } + + /** + * An Internal helper function used to help Flash clean up and re-use finished sounds. + * + * @param event AnEventobject. + */ + private function stopped(event:Event=null):Void + { + if(!_looped) + _channel.removeEventListener(Event.SOUND_COMPLETE,stopped); + else + _channel.removeEventListener(Event.SOUND_COMPLETE,looped); + _channel=null; + active=false; + playing=false; + } + + /** + * Internal event handler for ID3 info(i.e. fetching the song name). + * + * @param event AnEventobject. + */ + private function gotID3(event:Event=null):Void + { + FlxG.log("got ID3 info!"); + if(_sound.id3.songName.length>0) + name=_sound.id3.songName; + if(_sound.id3.artist.length>0) + artist=_sound.id3.artist; + _sound.removeEventListener(Event.ID3, gotID3); + } + + //this is just forwarding the event and bufferSize to the extraction function. + private function sampleData(event:SampleDataEvent):Void + { + extract(event.data, bufferSize); + } + + /** + * This methods extracts audio data from the mp3 and wraps it automatically with respect to encoder delay + * + * @param target The ByteArray where to write the audio data + * @param length The amount of samples to be read + */ + private function extract(target:ByteArray, length:Int):Void + { + if(samplesTotal==0)return; + while(0samplesTotal) + { + var read:Int=samplesTotal - samplesPosition; + + _in.extract(target, read, samplesPosition + MAGIC_DELAY); + + samplesPosition +=read; + + length -=read; + } + else + { + _in.extract(target, length, samplesPosition + MAGIC_DELAY); + + samplesPosition +=length; + + length=0; + } + + if(samplesPosition==samplesTotal)// WE ARE AT THE END OF THE LOOP>WRAP + { + samplesPosition=loop_start; + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxSprite.hx b/AIR/intra/hsrc/org/flixel/FlxSprite.hx new file mode 100644 index 0000000..4d59a8c --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxSprite.hx @@ -0,0 +1,1060 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.geom.ColorTransform; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.ByteArray; +import flash.utils.describeType; +import global.Registry; +import helper.Parabola_Thing; + +import org.flixel.system.FlxAnim; + +/** + * The main "game object" class, the sprite is aFlxObject + * with a bunch of graphics options and abilities, like animation and stamping. + * + * @author Adam Atomic + */ +class FlxSprite extends FlxObject +{ + //[Embed(source="data/default.png")] private var ImgDefault:Class; + + /** + * WARNING:The origin of the sprite will default to its center. + * If you change this, the visuals and the collisions will likely be + * pretty out-of-sync if you do any rotation. + */ + public var origin:FlxPoint; + /** + * Positive x moves graphic left. Positive y moves graphic up. + */ + public var offset:FlxPoint; + + /** + * Change the size of your sprite's graphic. + * NOTE:Scale doesn't currently affect collisions automatically, + * you will need to adjust the width, height and offset manually. + * WARNING:scaling sprites decreases rendering performance for this sprite by a factor of 10x! + */ + public var scale:FlxPoint; + /** + * Blending modes, just like Photoshop or whatever. + * E.g. "multiply", "screen", etc. + * @default null + */ + public var blend:String; + /** + * Controls whether the object is smoothed when rotated, affects performance. + * @default false + */ + public var antialiasing:Bool; + /** + * Whether the current animation has finished its first(or only)loop. + */ + public var finished:Bool; + /** + * The width of the actual graphic or image being displayed(not necessarily the game object/bounding box). + * NOTE:Edit at your own risk!! This is Intended to be read-only. + */ + public var frameWidth:Int; + /** + * The height of the actual graphic or image being displayed(not necessarily the game object/bounding box). + * NOTE:Edit at your own risk!! This is Intended to be read-only. + */ + public var frameHeight:Int; + /** + * The total number of frames in this image. WARNING:assumes each row in the sprite sheet is full! + */ + public var frames:Int; + /** + * The actual FlashBitmapDataobject representing the current display state of the sprite. + */ + public var framePixels:BitmapData; + + // stuff i added + /** + * The current "pushdown" of the drawn frame. Used for example, making something rise out of the ground. + */ + public var framePixels_y_push:Int=0; + + public var gx:Int=0; + public var gy:Int=0; + + /** + * Whether or not this sprite should have tile callbacks. + */ + + public var has_tile_callbacks:Bool=true; + + //end stuff i aded + /** + * Set this flag to true to force the sprite to update during the draw()call. + * NOTE:Rarely if ever necessary, most sprite operations will flip this flag automatically. + */ + public var dirty:Bool; + + /** + * Internal, stores all the animations that were added to this sprite. + */ + public var _animations:Array; + /** + * Internal, keeps track of whether the sprite was loaded with support for automatic reverse/mirroring. + */ + private var _flipped:Int; + /** + * Internal, keeps track of the current animation being played. + */ + public var _curAnim:FlxAnim; + /** + * Internal, keeps track of the current frame of animation. + * This is NOT an index Into the tile sheet, but the frame number in the animation object. + */ + public var _curFrame:Int; + /** + * Internal, keeps track of the current index Into the tile sheet based on animation or rotation. + */ + public var _curIndex:Int; + /** + * Internal, used to time each frame of animation. + */ + private var _frameTimer:Float; + /** + * Internal tracker for the animation callback. Default is null. + * If assigned, will be called each time the current frame changes. + * A function that has 3 parameters:a string name, a Int frame number, and a Int frame index. + */ + private var _callback:Function; + /** + * Internal tracker for what direction the sprite is currently facing, used with Flash getter/setter. + */ + private var _facing:Int; + /** + * Internal tracker for opacity, used with Flash getter/setter. + */ + private var _alpha:Float; + /** + * Internal tracker for color tint, used with Flash getter/setter. + */ + private var _color:Int; + /** + * Internal tracker for how many frames of "baked" rotation there are(if any). + */ + private var _bakedRotation:Float; + /** + * Internal, stores the entire source graphic(not the current displayed animation frame), used with Flash getter/setter. + */ + private var _pixels:BitmapData; + + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashPoint:Point; + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashRect:Rectangle; + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashRect2:Rectangle; + /** + * Internal, reused frequently during drawing and animating. Always contains(0,0). + */ + private var _flashPointZero:Point; + /** + * Internal, helps with animation, caching and drawing. + */ + private var _colorTransform:ColorTransform; + /** + * Internal, helps with animation, caching and drawing. + */ + private var _matrix:Matrix; + + /** + * Used in EventScripts::rotate_... + */ + public var rotate_angle:Float=0; + + public var parabola_thing:Parabola_Thing; + public var my_shadow:FlxSprite; + public var sfx:Dynamic={ }; + + public static inline var HURT_SOUND_NAME:String="generic_hurt"; + + + /** + * Creates a white 8x8 squareFlxSpriteat the specified position. + * Optionally can load a simple, one-frame graphic instead. + * + * @param X The initial X position of the sprite. + * @param Y The initial Y position of the sprite. + * @param SimpleGraphic The graphic you want to display(OPTIONAL - for simple stuff only, do NOT use for animated images!). + */ + public function new(X:Float=0,Y:Float=0,SimpleGraphic:Class=null) + { + super(X,Y); + _flashPoint=new Point(); + _flashRect=new Rectangle(); + _flashRect2=new Rectangle(); + _flashPointZero=new Point(); + offset=new FlxPoint(); + origin=new FlxPoint(); + + scale=new FlxPoint(1.0,1.0); + _alpha=1; + _color=0x00ffffff; + blend=null; + antialiasing=false; + cameras=null; + + finished=false; + _facing=RIGHT; + _animations=new Array(); + _flipped=0; + _curAnim=null; + _curFrame=0; + _curIndex=0; + _frameTimer=0; + + _matrix=new Matrix(); + _callback=null; + + if(SimpleGraphic==null) + SimpleGraphic=ImgDefault; + loadGraphic(SimpleGraphic); + + add_sfx(HURT_SOUND_NAME, Registry.sound_data.broom_hit); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + if(_animations !=null) + { + var a:FlxAnim; + var i:Int=0; + var l:Int=_animations.length; + while(i>1; + else + _flipped=0; + if(Width==0) + { + if(Animated) + Width=_pixels.height; + else if(_flipped>0) + Width=_pixels.width*0.5; + else + Width=_pixels.width; + } + width=frameWidth=Width; + if(Height==0) + { + if(Animated) + Height=width; + else + Height=_pixels.height; + } + height=frameHeight=Height; + resetHelpers(); + return this; + } + + /** + * Create a pre-rotated sprite sheet from a simple sprite. + * This can make a huge difference in graphical performance! + * + * @param Graphic The image you want to rotate and stamp. + * @param Rotations The number of rotation frames the final sprite should have. For small sprites this can be quite a large number(360 even)without any problems. + * @param Frame If the Graphic has a single row of square animation frames on it, you can specify which of the frames you want to use here. Default is -1, or "use whole graphic." + * @param AntiAliasing Whether to use high quality rotations when creating the graphic. Default is false. + * @param AutoBuffer Whether to automatically increase the image size to accomodate rotated corners. Default is false. Will create frames that are 150% larger on each axis than the original frame or graphic. + * + * @return This FlxSprite instance(nice for chaining stuff together, if you're Into that). + */ + public function loadRotatedGraphic(Graphic:Class, Rotations:Int=16, Frame:Int=-1, AntiAliasing:Bool=false, AutoBuffer:Bool=false):FlxSprite + { + //Create the brush and canvas + var rows:Int=Math.sqrt(Rotations); + var brush:BitmapData=FlxG.addBitmap(Graphic); + if(Frame>=0) + { + //Using just a segment of the graphic - find the right bit here + var full:BitmapData=brush; + brush=new BitmapData(full.height,full.height); + var rx:Int=Frame*brush.width; + var ry:Int=0; + var fw:Int=full.width; + if(rx>=fw) + { + ry=uint(rx/fw)*brush.height; + rx %=fw; + } + _flashRect.x=rx; + _flashRect.y=ry; + _flashRect.width=brush.width; + _flashRect.height=brush.height; + brush.copyPixels(full,_flashRect,_flashPointZero); + } + + var max:Int=brush.width; + if(brush.height>max) + max=brush.height; + if(AutoBuffer) + max *=1.5; + var columns:Int=FlxU.ceil(Rotations/rows); + width=max*columns; + height=max*rows; + var key:String=Std.string(Graphic)+ ":" + Frame + ":" + width + "x" + height; + var skipGen:Bool=FlxG.checkBitmapCache(key); + _pixels=FlxG.createBitmap(width, height, 0, true, key); + width=frameWidth=_pixels.width; + height=frameHeight=_pixels.height; + _bakedRotation=360/Rotations; + + //Generate a new sheet if necessary, then fix up the width and height + if(!skipGen) + { + var row:Int=0; + var column:Int; + var bakedAngle:Float=0; + var halfBrushWidth:Int=brush.width*0.5; + var halfBrushHeight:Int=brush.height*0.5; + var midpointX:Int=max*0.5; + var midpointY:Int=max*0.5; + while(row0)?0.0000001:-0.0000001; + _point.y +=(_point.y>0)?0.0000001:-0.0000001; + if(((angle==0)||(_bakedRotation>0))&&(scale.x==1)&&(scale.y==1)&&(blend==null)) + { //Simple render + _flashPoint.x=_point.x; + _flashPoint.y=_point.y; + camera.buffer.copyPixels(framePixels,_flashRect,_flashPoint,null,null,true); + } + else + { //Advanced render + _matrix.identity(); + _matrix.translate(-origin.x,-origin.y); + _matrix.scale(scale.x,scale.y); + if((angle !=0)&&(_bakedRotation<=0)) + _matrix.rotate(angle * 0.017453293); + _matrix.translate(_point.x+origin.x,_point.y+origin.y); + camera.buffer.draw(framePixels,_matrix,null,blend,null,antialiasing); + } + _VISIBLECOUNT++; + if(FlxG.visualDebug && !ignoreDrawDebug) + drawDebug(camera); + } + } + + /** + * This function draws or stamps oneFlxSpriteonto another. + * This function is NOT Intended to replacedraw()! + * + * @param Brush The image you want to use as a brush or stamp or pen or whatever. + * @param X The X coordinate of the brush's top left corner on this sprite. + * @param Y They Y coordinate of the brush's top left corner on this sprite. + */ + public function stamp(Brush:FlxSprite,X:Int=0,Y:Int=0):Void + { + Brush.drawFrame(); + var bitmapData:BitmapData=Brush.framePixels; + + //Simple draw + if(((Brush.angle==0)||(Brush._bakedRotation>0))&&(Brush.scale.x==1)&&(Brush.scale.y==1)&&(Brush.blend==null)) + { + _flashPoint.x=X; + _flashPoint.y=Y; + _flashRect2.width=bitmapData.width; + _flashRect2.height=bitmapData.height; + _pixels.copyPixels(bitmapData,_flashRect2,_flashPoint,null,null,true); + _flashRect2.width=_pixels.width; + _flashRect2.height=_pixels.height; + calcFrame(); + return; + } + + //Advanced draw + _matrix.identity(); + _matrix.translate(-Brush.origin.x,-Brush.origin.y); + _matrix.scale(Brush.scale.x,Brush.scale.y); + if(Brush.angle !=0) + _matrix.rotate(Brush.angle * 0.017453293); + _matrix.translate(X+Brush.origin.x,Y+Brush.origin.y); + _pixels.draw(bitmapData,_matrix,null,Brush.blend,null,Brush.antialiasing); + calcFrame(); + } + + /** + * This function draws a line on this sprite from position X1,Y1 + * to position X2,Y2 with the specified color. + * + * @param StartX X coordinate of the line's start point. + * @param StartY Y coordinate of the line's start point. + * @param EndX X coordinate of the line's end point. + * @param EndY Y coordinate of the line's end point. + * @param Color The line's color. + * @param Thickness How thick the line is in pixels(default value is 1). + */ + public function drawLine(StartX:Float,StartY:Float,EndX:Float,EndY:Float,Color:Int,Thickness:Int=1):Void + { + //Draw line + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + gfx.moveTo(StartX,StartY); + var alphaComponent:Float=Std.parseFloat((Color>>24)& 0xFF)/ 255; + if(alphaComponent<=0) + alphaComponent=1; + gfx.lineStyle(Thickness,Color,alphaComponent); + gfx.lineTo(EndX,EndY); + + //Cache line to bitmap + _pixels.draw(FlxG.flashGfxSprite); + dirty=true; + } + + /** + * Fills this sprite's graphic with a specific color. + * + * @param Color The color with which to fill the graphic, format 0xAARRGGBB. + */ + public function fill(Color:Int):Void + { + _pixels.fillRect(_flashRect2,Color); + if(_pixels !=framePixels) + dirty=true; + } + + /** + * Internal function for updating the sprite's animation. + * Useful for cases when you need to update this but are buried down in too many supers. + * This function is called automatically byFlxSprite.postUpdate(). + */ + private function updateAnimation():Void + { + if(_bakedRotation>0) + { + var oldIndex:Int=_curIndex; + var angleHelper:Int=angle%360; + if(angleHelper<0) + angleHelper +=360; + _curIndex=angleHelper/_bakedRotation + 0.5; + if(oldIndex !=_curIndex) + dirty=true; + } + else if((_curAnim !=null)&&(_curAnim.delay>0)&&(_curAnim.looped || !finished)) + { + _frameTimer +=FlxG.elapsed; + while(_frameTimer>_curAnim.delay) + { + _frameTimer=_frameTimer - _curAnim.delay; + if(_curFrame==_curAnim.frames.length-1) + { + if(_curAnim.looped) + _curFrame=0; + finished=true; + } + else + _curFrame++; + _curIndex=_curAnim.frames[_curFrame]; + dirty=true; + } + } + + + if(dirty) + calcFrame(); + } + + /** + * Request(or force)that the sprite update the frame before rendering. + * Useful if you are doing procedural generation or other weirdness! + * + * @param Force Force the frame to redraw, even if its not flagged as necessary. + */ + public function drawFrame(Force:Bool=false):Void + { + if(Force || dirty) + calcFrame(); + } + + /** + * Adds a new animation to the sprite. + * + * @param Name What this animation should be called(e.g. "run"). + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3). + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40 fps). + * @param Looped Whether or not the animation is looped or just plays once. + */ + public function addAnimation(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true):Void + { + _animations.push(new FlxAnim(Name,Frames,FrameRate,Looped)); + } + + /** + * Pass in a function to be called whenever this sprite's animation changes. + * + * @param AnimationCallback A function that has 3 parameters:a string name, a Int frame number, and a Int frame index. + */ + public function addAnimationCallback(AnimationCallback:Function):Void + { + _callback=AnimationCallback; + } + + /** + * Plays an existing animation(e.g. "run"). + * If you call an animation that is already playing it will be ignored. + * + * @param AnimName The string name of the animation you want to play. + * @param Force Whether to force the animation to restart. + */ + public function play(AnimName:String,Force:Bool=false):Void + { + if(!Force &&(_curAnim !=null)&&(AnimName==_curAnim.name)&&(_curAnim.looped || !finished))return; + _curFrame=0; + _curIndex=0; + _frameTimer=0; + var i:Int=0; + // TODO this is null as dust playing unpoof? + var l:Int=_animations.length; + while(i=null; + if(FetchPositions) + positions=new Array(); + + var row:Int=0; + var column:Int; + var rows:Int=_pixels.height; + var columns:Int=_pixels.width; + while(rowpixelsto anyBitmapDataobject. + * Automatically adjust graphic size and render helpers. + */ + public var pixels(get_pixels, set_pixels):BitmapData; + private function get_pixels():BitmapData + { + return _pixels; + } + + /** + * @private + */ + private function set_pixels(Pixels:BitmapData):Void + { + _pixels=Pixels; + width=frameWidth=_pixels.width; + height=frameHeight=_pixels.height; + resetHelpers(); + } + + /** + * SetfacingusingFlxSprite.LEFT,RIGHT, + *UP, andDOWNto take advantage of + * flipped sprites and/or just track player orientation more easily. + */ + public var facing(get_facing, set_facing):Int; + private function get_facing():Int + { + return _facing; + } + + /** + * @private + */ + private function set_facing(Direction:Int):Void + { + if(_facing !=Direction) + dirty=true; + _facing=Direction; + + } + + /** + * Setalphato a number between 0 and 1 to change the opacity of the sprite. + */ + public var alpha(get_alpha, set_alpha):Float; + private function get_alpha():Float + { + return _alpha; + } + + /** + * @private + */ + private function set_alpha(Alpha:Float):Void + { + if(Alpha>1) + Alpha=1; + if(Alpha<0) + Alpha=0; + if(Alpha==_alpha) + return; + _alpha=Alpha; + if((_alpha !=1)||(_color !=0x00ffffff)) + _colorTransform=new ColorTransform((_color>>16)*0.00392,(_color>>8&0xff)*0.00392,(_color&0xff)*0.00392,_alpha); + else + _colorTransform=null; + dirty=true; + } + + /** + * Setcolorto a number in this format:0xRRGGBB. + *colorIGNORES ALPHA. To change the opacity usealpha. + * Tints the whole sprite to be this color(similar to OpenGL vertex colors). + */ + public var color(get_color, set_color):Int; + private function get_color():Int + { + return _color; + } + + /** + * @private + */ + private function set_color(Color:Int):Void + { + Color &=0x00ffffff; + if(_color==Color) + return; + _color=Color; + if((_alpha !=1)||(_color !=0x00ffffff)) + _colorTransform=new ColorTransform((_color>>16)*0.00392,(_color>>8&0xff)*0.00392,(_color&0xff)*0.00392,_alpha); + else + _colorTransform=null; + dirty=true; + } + + /** + * Tell the sprite to change to a specific frame of animation. + * + * @param Frame The frame you want to display. + */ + public var frame(get_frame, set_frame):Int; + private function get_frame():Int + { + return _curIndex; + } + + /** + * @private + */ + private function set_frame(Frame:Int):Void + { + + _curAnim=null; + _curIndex=Frame; + dirty=true; + } + + /** + * Check and see if this object is currently on screen. + * Differs fromFlxObject's implementation + * in that it takes the actual graphic Into account, + * not just the hitbox or bounding box or whatever. + * + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether the object is on screen or not. + */ + override public function onScreen(Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point, Camera); + _point.x=_point.x - offset.x; + _point.y=_point.y - offset.y; + + if(((angle==0)||(_bakedRotation>0))&&(scale.x==1)&&(scale.y==1)) + return((_point.x + frameWidth>0)&&(_point.x0)&&(_point.y0)?scale.x:-scale.x; + var absScaleY:Float=(scale.y>0)?scale.y:-scale.y; + var radius:Float=Math.sqrt(halfWidth*halfWidth+halfHeight*halfHeight)*((absScaleX>=absScaleY)?absScaleX:absScaleY); + _point.x +=halfWidth; + _point.y +=halfHeight; + return((_point.x + radius>0)&&(_point.x - radius0)&&(_point.y - radiusFlxSpriteobject's current displayed pixels. + * This check is ALWAYS made in screen space, and always takes scroll factors Into account. + * + * @param Point The point in world space you want to check. + * @param Mask Used in the pixel hit test to determine what counts as solid. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + public function pixelsOverlapPoint(Point:FlxPoint,Mask:Int=0xFF,Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point,Camera); + _point.x=_point.x - offset.x; + _point.y=_point.y - offset.y; + _flashPoint.x=(Point.x - Camera.scroll.x)- _point.x; + _flashPoint.y=(Point.y - Camera.scroll.y)- _point.y; + return framePixels.hitTest(_flashPointZero,Mask,_flashPoint); + } + + /** + * Internal function to update the current animation frame. + */ + private function calcFrame():Void + { + var indexX:Int=_curIndex*frameWidth; + var indexY:Int=0; + + //Handle sprite sheets + var widthHelper:Int=_flipped?_flipped:_pixels.width; + if(indexX>=widthHelper) + { + indexY=uint(indexX/widthHelper)*frameHeight; + indexX %=widthHelper; + } + + //handle reversed sprites + if(_flipped &&(_facing==LEFT)) + indexX=(_flipped<<1)-indexX-frameWidth; + + //Update display bitmap + _flashRect.x=indexX; + _flashRect.y=indexY; + + if(framePixels_y_push !=0){ + /* blank the current frame */ + for(i in 0..._flashRect.height){ + for(j in 0..._flashRect.width){ + framePixels.setPixel32(j, i, 0x00000000); + } + } + if(framePixels_y_push>0){ + //Move the area to be copied + _flashRect.height -=framePixels_y_push; + _flashPointZero.y +=framePixels_y_push; + framePixels.copyPixels(_pixels, _flashRect, _flashPointZero); + //Make that area normal again + _flashRect.height +=framePixels_y_push; + _flashPointZero.y -=framePixels_y_push; + } + } else { + framePixels.copyPixels(_pixels, _flashRect, _flashPointZero); + } + + _flashRect.x=_flashRect.y=0; + if(_colorTransform !=null) + framePixels.colorTransform(_flashRect,_colorTransform); + if(_callback !=null) + _callback(((_curAnim !=null)?(_curAnim.name):null),_curFrame,_curIndex); + dirty=false; + } + + /** + * Add a sound effect to this FlxSprite + * @param name The name of the sound effect + * @param sound_or_sound_group The reference to the sound or sound group + * @return true on success, false on failure + */ + public function add_sfx(name:String, sound_or_sound_group:Dynamic):Bool { + if(FlxU.getClassName(sound_or_sound_group, true)=="FlxGroup"){ + sfx[name]={ is_group:true, sound:sound_or_sound_group }; + } else if(FlxU.getClassName(sound_or_sound_group, true)=="FlxSound"){ + sfx[name]={ is_group:false, sound:sound_or_sound_group }; + } else { + return false; + } + return true; + } + + public function play_sfx(name:String,is_multi:Bool=false):Bool { + if(!sfx.hasOwnProperty(name)){ + FlxG.log("No such SFX \"" + name + "\""); + return false; + } + + var sound:Dynamic=sfx[name].sound; + + if(sfx[name].is_group){ + if(is_multi){ + Registry.sound_data.play_sound_group_randomly(sound); + } else { + Registry.sound_data.play_sound_group(sound); + } + } else { + sound.play(); + } + return true; + } + + public function stop_sfx(name:String):Bool { + if(!sfx.hasOwnProperty(name)){ + FlxG.log("No such SFX \"" + name + "\""); + return false; + } + var sound:Dynamic=sfx[name].sound; + + if(sfx[name].is_group){ + return false; + } else { + var g:FlxSound; + sound.stop(); + } + return true; + + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxState.hx b/AIR/intra/hsrc/org/flixel/FlxState.hx new file mode 100644 index 0000000..062076a --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxState.hx @@ -0,0 +1,24 @@ +package org.flixel; + +import org.flixel.system.FlxQuadTree; + +/** + * This is the basic game "state" object - e.g. in a simple game + * you might have a menu state and a play state. + * It is for all Intents and purpose a fancy FlxGroup. + * And really, it's not even that fancy. + * + * @author Adam Atomic + */ +class FlxState extends FlxGroup +{ + /** + * This function is called after the game engine successfully switches states. + * Override this function, NOT the constructor, to initialize or set up your game state. + * We do NOT recommend overriding the constructor, unless you want some crazy unpredictable things to happen! + */ + public function create():Void + { + + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxText.hx b/AIR/intra/hsrc/org/flixel/FlxText.hx new file mode 100644 index 0000000..76e783b --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxText.hx @@ -0,0 +1,305 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.text.TextField; +import flash.text.TextFormat; + +/** + * ExtendsFlxSpriteto support rendering text. + * Can tint, fade, rotate and scale just like a sprite. + * Doesn't really animate though, as far as I know. + * Also does nice pixel-perfect centering on pixel fonts + * as long as they are only one liners. + * + * @author Adam Atomic + */ +class FlxText extends FlxSprite +{ + /** + * Internal reference to a FlashTextFieldobject. + */ + private var _textField:TextField; + /** + * Whether the actual text field needs to be regenerated and stamped again. + * This is NOT the same thing asFlxSprite.dirty. + */ + private var _regen:Bool; + /** + * Internal tracker for the text shadow color, default is clear/transparent. + */ + private var _shadow:Int; + + /** + * Creates a newFlxTextobject at the specified position. + * + * @param X The X position of the text. + * @param Y The Y position of the text. + * @param Width The width of the text object(Std.is(height, determined) automatically). + * @param Text The actual text you would like to display initially. + * @param EmbeddedFont Whether this text field uses embedded fonts or nto + */ + public function new(X:Float, Y:Float, Width:Int, Text:String=null, EmbeddedFont:Bool=true) + { + super(X,Y); + makeGraphic(Width,1,0); + + if(Text==null) + Text=""; + _textField=new TextField(); + _textField.width=Width; + _textField.embedFonts=EmbeddedFont; + _textField.selectable=false; + _textField.sharpness=100; + _textField.multiline=true; + _textField.wordWrap=true; + _textField.text=Text; + var format:TextFormat=new TextFormat("system",8,0xffffff); + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + if(Text.length<=0) + _textField.height=1; + else + _textField.height=10; + + _regen=true; + _shadow=0; + allowCollisions=NONE; + calcFrame(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + _textField=null; + super.destroy(); + } + + /** + * You can use this if you have a lot of text parameters + * to set instead of the individual properties. + * + * @param Font The name of the font face for the text display. + * @param Size The size of the font(in pixels essentially). + * @param Color The color of the text in traditional flash 0xRRGGBB format. + * @param Alignment A string representing the desired alignment("left,"right" or "center"). + * @param ShadowColor A Int representing the desired text shadow color in flash 0xRRGGBB format. + * + * @return This FlxText instance(nice for chaining stuff together, if you're Into that). + */ + public function setFormat(Font:String=null,Size:Float=8,Color:Int=0xffffff,Alignment:String=null,ShadowColor:Int=0):FlxText + { + if(Font==null) + Font=""; + var format:TextFormat=dtfCopy(); + format.font=Font; + format.size=Size; + format.color=Color; + format.align=Alignment; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _shadow=ShadowColor; + _regen=true; + calcFrame(); + return this; + } + + /** + * The text being displayed. + */ + public var text(get_text, set_text):String; + private function get_text():String + { + return _textField.text; + } + + /** + * @private + */ + private function set_text(Text:String):Void + { + var ot:String=_textField.text; + _textField.text=Text; + if(_textField.text !=ot) + { + _regen=true; + calcFrame(); + } + } + + /** + * The size of the text being displayed. + */ + public var size(get_size, set_size):Float; + private function get_size():Float + { + return _textField.defaultTextFormat.size as Float; + } + + /** + * @private + */ + private function set_size(Size:Float):Void + { + var format:TextFormat=dtfCopy(); + format.size=Size; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The color of the text being displayed. + */ + override public var color(get_color, set_color):Int; + private function get_color():Int + { + return _textField.defaultTextFormat.color as Int; + } + + /** + * @private + */ + override private function set_color(Color:Int):Void + { + var format:TextFormat=dtfCopy(); + format.color=Color; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The font used for this text. + */ + public var font(get_font, set_font):String; + private function get_font():String + { + return _textField.defaultTextFormat.font; + } + + /** + * @private + */ + private function set_font(Font:String):Void + { + var format:TextFormat=dtfCopy(); + format.font=Font; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The alignment of the font("left", "right", or "center"). + */ + public var alignment(get_alignment, set_alignment):String; + private function get_alignment():String + { + return _textField.defaultTextFormat.align; + } + + /** + * @private + */ + private function set_alignment(Alignment:String):Void + { + var format:TextFormat=dtfCopy(); + format.align=Alignment; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + calcFrame(); + } + + /** + * The color of the text shadow in 0xAARRGGBB hex format. + */ + public var shadow(get_shadow, set_shadow):Int; + private function get_shadow():Int + { + return _shadow; + } + + /** + * @private + */ + private function set_shadow(Color:Int):Void + { + _shadow=Color; + calcFrame(); + } + + /** + * Internal function to update the current animation frame. + */ + override private function calcFrame():Void + { + if(_regen) + { + //Need to generate a new buffer to store the text graphic + var i:Int=0; + var nl:Int=_textField.numLines; + height=0; + while(i0)) + { + //Now that we've cleared a buffer, we need to actually render the text to it + var format:TextFormat=_textField.defaultTextFormat; + var formatAdjusted:TextFormat=format; + _matrix.identity(); + //If it's a single, centered line of text, we center it ourselves so it doesn't blur to hell + if((format.align=="center")&&(_textField.numLines==1)) + { + formatAdjusted=new TextFormat(format.font,format.size,format.color,null,null,null,null,null,"left"); + _textField.setTextFormat(formatAdjusted); + _matrix.translate(Math.floor((width - _textField.getLineMetrics(0).width)/2),0); + } + //Render a single pixel shadow beneath the text + if(_shadow>0) + { + _textField.setTextFormat(new TextFormat(formatAdjusted.font,formatAdjusted.size,_shadow,null,null,null,null,null,formatAdjusted.align)); + _matrix.translate(1,1); + _pixels.draw(_textField,_matrix,_colorTransform); + _matrix.translate(-1,-1); + _textField.setTextFormat(new TextFormat(formatAdjusted.font,formatAdjusted.size,formatAdjusted.color,null,null,null,null,null,formatAdjusted.align)); + } + //Actually draw the text onto the buffer + _pixels.draw(_textField,_matrix,_colorTransform); + _textField.setTextFormat(new TextFormat(format.font,format.size,format.color,null,null,null,null,null,format.align)); + } + + //Finally, update the visible pixels + if((framePixels==null)||(framePixels.width !=_pixels.width)||(framePixels.height !=_pixels.height)) + framePixels=new BitmapData(_pixels.width,_pixels.height,true,0); + framePixels.copyPixels(_pixels,_flashRect,_flashPointZero); + } + + /** + * A helper function for updating theTextFieldthat we use for rendering. + * + * @return A writable copy ofTextField.defaultTextFormat. + */ + private function dtfCopy():TextFormat + { + var defaultTextFormat:TextFormat=_textField.defaultTextFormat; + return new TextFormat(defaultTextFormat.font,defaultTextFormat.size,defaultTextFormat.color,defaultTextFormat.bold,defaultTextFormat.italic,defaultTextFormat.underline,defaultTextFormat.url,defaultTextFormat.target,defaultTextFormat.align); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxTileblock.hx b/AIR/intra/hsrc/org/flixel/FlxTileblock.hx new file mode 100644 index 0000000..854b978 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxTileblock.hx @@ -0,0 +1,94 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.geom.Rectangle; + +/** + * This is a basic "environment object" class, used to create simple walls and floors. + * It can be filled with a random selection of tiles to quickly add detail. + * + * @author Adam Atomic + */ +class FlxTileblock extends FlxSprite +{ + /** + * Creates a newFlxBlockobject with the specified position and size. + * + * @param X The X position of the block. + * @param Y The Y position of the block. + * @param Width The width of the block. + * @param Height The height of the block. + */ + public function new(X:Int,Y:Int,Width:Int,Height:Int) + { + super(X,Y); + makeGraphic(Width,Height,0,true); + active=false; + immovable=true; + } + + /** + * Fills the block with a randomly arranged selection of graphics from the image provided. + * + * @param TileGraphic The graphic class that contains the tiles that should fill this block. + * @param TileWidth The width of a single tile in the graphic. + * @param TileHeight The height of a single tile in the graphic. + * @param Empties The number of "empty" tiles to add to the auto-fill algorithm(e.g. 8 tiles + 4 empties=1/3 of block will be open holes). + */ + public function loadTiles(TileGraphic:Class,TileWidth:Int=0,TileHeight:Int=0,Empties:Int=0):FlxTileblock + { + if(TileGraphic==null) + return this; + + //First create a tile brush + var sprite:FlxSprite=new FlxSprite().loadGraphic(TileGraphic,true,false,TileWidth,TileHeight); + var spriteWidth:Int=sprite.width; + var spriteHeight:Int=sprite.height; + var total:Int=sprite.frames + Empties; + + //Then prep the "canvas" as it were(just doublechecking that the size is on tile boundaries) + var regen:Bool=false; + if(width % sprite.width !=0) + { + width=uint(width/spriteWidth+1)*spriteWidth; + regen=true; + } + if(height % sprite.height !=0) + { + height=uint(height/spriteHeight+1)*spriteHeight; + regen=true; + } + if(regen) + makeGraphic(width,height,0,true); + else + this.fill(0); + + //Stamp random tiles onto the canvas + var row:Int=0; + var column:Int; + var destinationX:Int; + var destinationY:Int=0; + var widthInTiles:Int=width/spriteWidth; + var heightInTiles:Int=height/spriteHeight; + while(rowEmpties) + { + sprite.randomFrame(); + sprite.drawFrame(); + stamp(sprite,destinationX,destinationY); + } + destinationX +=spriteWidth; + column++; + } + destinationY +=spriteHeight; + row++; + } + + return this; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxTilemap.hx b/AIR/intra/hsrc/org/flixel/FlxTilemap.hx new file mode 100644 index 0000000..f3f13a6 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxTilemap.hx @@ -0,0 +1,1509 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.system.FlxTile; +import org.flixel.system.FlxTilemapBuffer; + +/** + * This is a traditional tilemap display and collision class. + * It takes a string of comma-separated numbers and then associates + * those values with tiles from the sheet you pass in. + * It also includes some handy static parsers that can convert + * arrays or images Into strings that can be loaded. + * + * @author Adam Atomic + */ +class FlxTilemap extends FlxObject +{ + //[Embed(source="data/autotiles.png")] static public var ImgAuto:Class; + //[Embed(source="data/autotiles_alt.png")] static public var ImgAutoAlt:Class; + + /** + * No auto-tiling. + */ + static public static inline var OFF:Int=0; + /** + * Good for levels with thin walls that don'tile need Interior corner art. + */ + static public static inline var AUTO:Int=1; + /** + * Better for levels with thick walls that look better with Interior corner art. + */ + static public static inline var ALT:Int=2; + + /** + * Set this flag to use one of the 16-tile binary auto-tile algorithms(OFF, AUTO, or ALT). + */ + public var auto:Int; + + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var widthInTiles:Int; + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var heightInTiles:Int; + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var totalTiles:Int; + + /** + * Rendering helper, minimize new object instantiation on repetitive methods. + */ + private var _flashPoint:Point; + /** + * Rendering helper, minimize new object instantiation on repetitive methods. + */ + private var _flashRect:Rectangle; + + /** + * Internal reference to the bitmap data object that stores the original tile graphics. + */ + public var _tiles:BitmapData; + /** + * Internal list of buffers, one for camera, used for drawing the tilemaps. + */ + private var _buffers:Array; + /** + * Internal representation of the actual tile data, as a large 1D array of Integers. + */ + private var _data:Array; + /** + * Internal representation of rectangles, one for tile in the entire tilemap, used to speed up drawing. + */ + private var _rects:Array; + /** + * Internal, the width of a single tile. + */ + private var _tileWidth:Int; + /** + * Internal, the height of a single tile. + */ + private var _tileHeight:Int; + /** + * NOT ANYMORE! + * Internal collection of tile objects, one for type of tile in the map(NOTE one for every single tile in the whole map). + */ + public var _tileObjects:Array; + + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTileNotSolid:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTilePartial:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTileSolid:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugRect:Rectangle; + /** + * Internal flag for checking to see if we need to refresh + * the tilemap display to show or hide the bounding boxes. + */ + private var _lastVisualDebug:Bool; + /** + * Internal, used to sort of insert blank tiles in front of the tiles in the provided graphic. + */ + private var _startingIndex:Int; + + /** + * The tilemap constructor just initializes some basic variables. + */ + public function new() + { + super(); + auto=OFF; + widthInTiles=0; + heightInTiles=0; + totalTiles=0; + _buffers=new Array(); + _flashPoint=new Point(); + _flashRect=null; + _data=null; + _tileWidth=0; + _tileHeight=0; + _rects=null; + _tiles=null; + _tileObjects=null; + immovable=true; + cameras=null; + _debugTileNotSolid=null; + _debugTilePartial=null; + _debugTileSolid=null; + _debugRect=null; + _lastVisualDebug=FlxG.visualDebug; + _startingIndex=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + _flashPoint=null; + _flashRect=null; + _tiles=null; + var i:Int=0; + var l:Int=_tileObjects.length; + while(isetTileProperties(). + * + * @return A pointer this instance of FlxTilemap, for chaining as usual:) + */ + public function loadMap(MapData:String, TileGraphic:Class, TileWidth:Int=0, TileHeight:Int=0, AutoTile:Int=OFF, StartingIndex:Int=0, DrawIndex:Int=1, CollideIndex:Int=1):FlxTilemap + { + auto=AutoTile; + _startingIndex=StartingIndex; + + //Figure out the map dimensions based on the data string + var columns:Array; + var rows:Array=MapData.split("\n"); + heightInTiles=rows.length; + widthInTiles=0; + _data=new Array(); + var row:Int=0; + var column:Int; + while(rowOFF) + { + _startingIndex=1; + DrawIndex=1; + CollideIndex=1; + i=0; + while(iOFF) + l++; + _tileObjects=new Array(l); + var ac:Int; + while(i=DrawIndex),(i>=CollideIndex)?allowCollisions:NONE); + i++; + } + + //create debug tiles for rendering bounding boxes on demand + _debugTileNotSolid=makeDebugTile(FlxG.BLUE); + _debugTilePartial=makeDebugTile(FlxG.PINK); + _debugTileSolid=makeDebugTile(FlxG.GREEN); + _debugRect=new Rectangle(0,0,_tileWidth,_tileHeight); + + //Then go through and create the actual map + width=widthInTiles*_tileWidth; + height=heightInTiles*_tileHeight; + _rects=new Array(totalTiles); + i=0; + while(iFlxTilemapBufferyou are rendering to. + * @param Camera The relatedFlxCamera, mainly for scroll values. + */ + private function drawTilemap(Buffer:FlxTilemapBuffer,Camera:FlxCamera):Void + { + Buffer.fill(); + + //Copy tile images Into the tile buffer + _point.x=Std.int(Camera.scroll.x*scrollFactor.x)- x;//modified from getScreenXY() + _point.y=Std.int(Camera.scroll.y*scrollFactor.y)- y; + var screenXInTiles:Int=(_point.x +((_point.x>0)?0.0000001:-0.0000001))/_tileWidth; + var screenYInTiles:Int=(_point.y +((_point.y>0)?0.0000001:-0.0000001))/_tileHeight; + var screenRows:Int=Buffer.rows; + var screenColumns:Int=Buffer.columns; + + //Bound the upper left corner + if(screenXInTiles<0) + screenXInTiles=0; + if(screenXInTiles>widthInTiles-screenColumns) + screenXInTiles=widthInTiles-screenColumns; + if(screenYInTiles<0) + screenYInTiles=0; + if(screenYInTiles>heightInTiles-screenRows) + screenYInTiles=heightInTiles-screenRows; + + var rowIndex:Int=screenYInTiles*widthInTiles+screenXInTiles; + _flashPoint.y=0; + var row:Int=0; + var column:Int; + var columnIndex:Int; + var tile:FlxTile; + var debugTile:BitmapData; + while(row0)||(_point.y>0)||(_point.x + buffer.width0)?0.0000001:-0.0000001; + _flashPoint.y +=(_flashPoint.y>0)?0.0000001:-0.0000001; + buffer.draw(camera,_flashPoint); + _VISIBLECOUNT++; + } + } + + /** + * Sets a tilemap buffer to null so that the next draw call of this tilemap + * reinstantates it - useful for switching areas, resizing some map, without + * horrible weird problems. + * @param idx + * @return true if the buffer was reset, false if there is no such buffer + */ + public function null_buffer(idx:Int):Bool { + if(idx<_buffers.length){ + _buffers[idx]=null; + return true; + } + return false; + } + + /** + * Fetches the tilemap data array. + * + * @param Simple If true, returns the data as copy, as a series of 1s and 0s(useful for auto-tiling stuff). Default value is false, meaning it will return the actual data array(NOT a copy). + * + * @return An array the size of the tilemap full of Integers indicating tile placement. + */ + public function getData(Simple:Bool=false):Array + { + if(!Simple) + return _data; + + var i:Int=0; + var l:Int=_data.length; + var data:Array=new Array(l); + while(i0)?1:0; + i++; + } + return data; + } + + /** + * Set the dirty flag on all the tilemap buffers. + * Basically forces a reset of the drawn tilemaps, even if it wasn'tile necessary. + * + * @param Dirty Whether to flag the tilemap buffers as dirty or not. + */ + public function setDirty(Dirty:Bool=true):Void + { + var i:Int=0; + var l:Int=_buffers.length; + while(iFlxPathfrom the start to the end. If no path could be found, then a null reference is returned. + */ + public function findPath(Start:FlxPoint,End:FlxPoint,Simplify:Bool=true,RaySimplify:Bool=false):FlxPath + { + //figure out what tile we are starting and ending on. + var startIndex:Int=Std.int((Start.y-y)/_tileHeight)* widthInTiles + Std.int((Start.x-x)/_tileWidth); + var endIndex:Int=Std.int((End.y-y)/_tileHeight)* widthInTiles + Std.int((End.x-x)/_tileWidth); + + //check that the start and end are clear. + if(((_tileObjects[_data[startIndex]] as FlxTile).allowCollisions>0)|| + ((_tileObjects[_data[endIndex]] as FlxTile).allowCollisions>0)) + return null; + + //figure out how far each of the tiles is from the starting tile + var distances:Array=computePathDistance(startIndex,endIndex); + if(distances==null) + return null; + + //then count backward to find the shortest path. + var points:Array=new Array(); + walkPath(distances,endIndex,points); + + //reset the start and end points to be exact + var node:FlxPoint; + node=points[points.length-1] as FlxPoint; + node.x=Start.x; + node.y=Start.y; + node=points[0] as FlxPoint; + node.x=End.x; + node.y=End.y; + + //some simple path cleanup options + if(Simplify) + simplifyPath(points); + if(RaySimplify) + raySimplifyPath(points); + + //finally load the remaining points Into a new path object and return it + var path:FlxPath=new FlxPath(); + var i:Int=points.length - 1; + while(i>=0) + { + node=points[i--] as FlxPoint; + if(node !=null) + path.addPoint(node,true); + } + return path; + } + + /** + * Pathfinding helper function, strips out extra points on the same line. + * + * @param Points An array ofFlxPointnodes. + */ + private function simplifyPath(Points:Array):Void + { + var deltaPrevious:Float; + var deltaNext:Float; + var last:FlxPoint=Points[0]; + var node:FlxPoint; + var i:Int=1; + var l:Int=Points.length-1; + while(iFlxPointnodes. + */ + private function raySimplifyPath(Points:Array):Void + { + var source:FlxPoint=Points[0]; + var lastIndex:Int=-1; + var node:FlxPoint; + var i:Int=1; + var l:Int=Points.length; + while(i=0) + Points[lastIndex]=null; + } + else + source=Points[lastIndex]; + lastIndex=i-1; + } + } + + /** + * Pathfinding helper function, floods a grid with distance information until it finds the end point. + * NOTE:Currently this process does NOT use any kind of fancy heuristic! It's pretty brute. + * + * @param StartIndex The starting tile's map index. + * @param EndIndex The ending tile's map index. + * + * @return A FlashArrayofFlxPointnodes. If the end tile could not be found, then a nullArrayis returned instead. + */ + private function computePathDistance(StartIndex:Int, EndIndex:Int):Array + { + //Create a distance-based representation of the tilemap. + //All walls are flagged as -2, all open areas as -1. + var mapSize:Int=widthInTiles*heightInTiles; + var distances:Array=new Array(mapSize); + var i:Int=0; + while(i=[StartIndex]; + var current:Array; + var currentIndex:Int; + var left:Bool; + var right:Bool; + var up:Bool; + var down:Bool; + var currentLength:Int; + var foundEnd:Bool=false; + while(neighbors.length>0) + { + current=neighbors; + neighbors=new Array(); + + i=0; + currentLength=current.length; + while(i0; + right=currentIndex%widthInTiles0; + down=currentIndex/widthInTiles=-1)&&(distances[currentIndex+1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(right && down) + { + index=currentIndex + widthInTiles + 1; + if((distances[index]==-1)&&(distances[currentIndex+widthInTiles]>=-1)&&(distances[currentIndex+1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(left && down) + { + index=currentIndex + widthInTiles - 1; + if((distances[index]==-1)&&(distances[currentIndex+widthInTiles]>=-1)&&(distances[currentIndex-1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(up && left) + { + index=currentIndex - widthInTiles - 1; + if((distances[index]==-1)&&(distances[currentIndex-widthInTiles]>=-1)&&(distances[currentIndex-1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + } + distance++; + } + if(!foundEnd) + distances=null; + return distances; + } + + /** + * Pathfinding helper function, recursively walks the grid and finds a shortest path back to the start. + * + * @param Data A FlashArrayof distance information. + * @param Start The tile we're on in our walk backward. + * @param Points A FlashArrayofFlxPointnodes composing the path from the start to the end, compiled in reverse order. + */ + private function walkPath(Data:Array,Start:Int,Points:Array):Void + { + Points.push(new FlxPoint(x + Int(Start%widthInTiles)*_tileWidth + _tileWidth*0.5, y + Int(Start/widthInTiles)*_tileHeight + _tileHeight*0.5)); + if(Data[Start]==0) + return; + + //basic map bounds + var left:Bool=Start%widthInTiles>0; + var right:Bool=Start%widthInTiles0; + var down:Bool=Start/widthInTiles=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]FlxObjectoverlaps thisFlxObjectobject in world space. + * If the group has a LOT of things in it, it might be faster to useFlxG.overlaps(). + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param Object The object being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + override public function overlaps(ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iFlxObjectwere located at the given position, would it overlap theFlxObjectorFlxGroup? + * This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size Into account. + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param X The X position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param Y The Y position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + override public function overlapsAt(X:Float,Y:Float,ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iFlxObjectyou are checking for overlaps against. + * @param Callback An optional function that takes the form "myCallback(Object1:FlxObject,Object2:FlxObject)", where Dynamic1 is a FlxTile object, and Dynamic2 is the object passed in in the first parameter of this method. + * @param FlipCallbackParams Used to preserve A-B list ordering from FlxObject.separate()- returns the FlxTile object as the second parameter instead. + * @param Position Optional, specify a custom position for the tilemap(useful for overlapsAt()-type funcitonality). + * + * @return Whether there were overlaps, or if a callback was specified, whatever the return value of the callback was. + */ + public function overlapsWithCallback(Object:FlxObject,Callback:Function=null,FlipCallbackParams:Bool=false,Position:FlxPoint=null):Bool + { + var results:Bool=false; + + var X:Float=x; + var Y:Float=y; + if(Position !=null) + { + X=Position.x; + Y=Position.y; + } + + //Figure out what tiles we need to check against + var selectionX:Int=FlxU.floor((Object.x - X)/_tileWidth); + var selectionY:Int=FlxU.floor((Object.y - Y)/_tileHeight); + var selectionWidth:Int=selectionX +(FlxU.ceil(Object.width/_tileWidth))+ 1; + var selectionHeight:Int=selectionY + FlxU.ceil(Object.height/_tileHeight)+ 1; + + //Then bound these coordinates by the map edges + if(selectionX<0) + selectionX=0; + if(selectionY<0) + selectionY=0; + if(selectionWidth>widthInTiles) + selectionWidth=widthInTiles; + if(selectionHeight>heightInTiles) + selectionHeight=heightInTiles; + + //Then loop through this selection of tiles and call FlxObject.separate()accordingly + var rowStart:Int=selectionY*widthInTiles; + var row:Int=selectionY; + var column:Int; + var tile:FlxTile; + var overlapFound:Bool; + var deltaX:Float=X - last.x; + var deltaY:Float=Y - last.y; + while(rowtile.x)&&(Object.xtile.y)&&(Object.yFlxObjectobject. + * + * @param Point The point in world space you want to check. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + override public function overlapsPoint(Point:FlxPoint,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(!InScreenSpace) + return(_tileObjects[_data[uint(uint((Point.y-y)/_tileHeight)*widthInTiles +(Point.x-x)/_tileWidth)]] as FlxTile).allowCollisions>0; + + if(Camera==null) + Camera=FlxG.camera; + Point.x=Point.x - Camera.scroll.x; + Point.y=Point.y - Camera.scroll.y; + getScreenXY(_point,Camera); + return(_tileObjects[_data[uint(uint((Point.y-_point.y)/_tileHeight)*widthInTiles +(Point.x-_point.x)/_tileWidth)]] as FlxTile).allowCollisions>0; + } + + /** + * Check the value of a particular tile. + * + * @param X The X coordinate of the tile(in tiles, not pixels). + * @param Y The Y coordinate of the tile(in tiles, not pixels). + * + * @return A Int containing the value of the tile at this spot in the array. + */ + public function getTile(X:Int,Y:Int):Int + { + return _data[Y * widthInTiles + X] as Int; + } + + /** + * Get the value of a tile in the tilemap by index. + * + * @param Index The slot in the data array(Y * widthInTiles + X)where this tile is stored. + * + * @return A Int containing the value of the tile at this spot in the array. + */ + public function getTileByIndex(Index:Int):Int + { + return _data[Index] as Int; + } + + /** + * Returns a new FlashArrayfull of every map index of the requested tile type. + * + * @param Index The requested tile type. + * + * @return AnArraywith a list of all map indices of that tile type. + */ + public function getTileInstances(Index:Int):Array + { + var array:Array=null; + var i:Int=0; + var l:Int=widthInTiles * heightInTiles; + while(iArrayfull of every coordinate of the requested tile type. + * + * @param Index The requested tile type. + * @param Midpoint Whether to return the coordinates of the tile midpoint, or upper left corner. Default is true, return midpoint. + * + * @return AnArraywith a list of all the coordinates of that tile type. + */ + public function getTileCoords(Index:Int,Midpoint:Bool=true):Array + { + var array:Array=null; + + var point:FlxPoint; + var i:Int=0; + var l:Int=widthInTiles * heightInTiles; + while(i=widthInTiles)||(Y>=heightInTiles)) + return false; + return setTileByIndex(Y * widthInTiles + X,Tile,UpdateGraphics); + } + + /** + * Change the data and graphic of a tile in the tilemap. + * + * @param Index The slot in the data array(Y * widthInTiles + X)where this tile is stored. + * @param Tile The new Integer data you wish to inject. + * @param UpdateGraphics Whether the graphical representation of this tile should change. + * + * @return Whether or not the tile was actually changed. + */ + public function setTileByIndex(Index:Int,Tile:Int,UpdateGraphics:Bool=true):Bool + { + if(Index>=_data.length) + return false; + + var ok:Bool=true; + _data[Index]=Tile; + + if(!UpdateGraphics) + return ok; + + setDirty(); + + if(auto==OFF) + { + updateTile(Index); + return ok; + } + + //If this map is autotiled and it changes, locally update the arrangement + var i:Int; + var row:Int=Std.int(Index/widthInTiles)- 1; + var rowLength:Int=row + 3; + var column:Int=Index%widthInTiles - 1; + var columnHeight:Int=column + 3; + while(row=0)&&(row=0)&&(columnlavaCallback(Tile:FlxTile, Dynamic:FlxObject). + * @param CallbackFilter If you only want the callback to go off for certain classes or objects based on a certain class, set that class here. + * @param Range If you want this callback to work for a bunch of different tiles, input the range here. Default value is 1. + */ + public function setTileProperties(Tile:Int,AllowCollisions:Int=0x1111,Callback:Function=null,CallbackFilter:Class=null,Range:Int=1):Void + { + if(Range<=0) + Range=1; + var tile:FlxTile; + var i:Int=Tile; + var l:Int=Tile+Range; + while(iFlxRect. + * + * @param Bounds Optional, pass in a pre-existingFlxRectto prevent instantiation of a new object. + * + * @return AFlxRectcontaining the world coordinates and size of the entire tilemap. + */ + public function getBounds(Bounds:FlxRect=null):FlxRect + { + if(Bounds==null) + Bounds=new FlxRect(); + return Bounds.make(x,y,width,height); + } + + /** + * Shoots a ray from the start point to the end point. + * If/when it passes through a tile, it stores that point and returns false. + * + * @param Start The world coordinates of the start of the ray. + * @param End The world coordinates of the end of the ray. + * @param Result APointobject containing the first wall impact. + * @param Resolution Defaults to 1, meaning check every tile or so. Higher means more checks! + * @return Returns true if the ray made it from Start to End without hitting anything. Returns false and fills Result if a tile was hit. + */ + public function ray(Start:FlxPoint, End:FlxPoint, Result:FlxPoint=null, Resolution:Float=1):Bool + { + var step:Float=_tileWidth; + if(_tileHeight<_tileWidth) + step=_tileHeight; + step /=Resolution; + var deltaX:Float=End.x - Start.x; + var deltaY:Float=End.y - Start.y; + var distance:Float=Math.sqrt(deltaX*deltaX + deltaY*deltaY); + var steps:Int=Math.ceil(distance/step); + var stepX:Float=deltaX/steps; + var stepY:Float=deltaY/steps; + var curX:Float=Start.x - stepX - x; + var curY:Float=Start.y - stepY - y; + var tileX:Int; + var tileY:Int; + var i:Int=0; + while(iwidth)||(curY<0)||(curY>height)) + { + i++; + continue; + } + + tileX=curX/_tileWidth; + tileY=curY/_tileHeight; + if((_tileObjects[_data[tileY*widthInTiles+tileX]] as FlxTile).allowCollisions) + { + //Some basic helper stuff + tileX *=_tileWidth; + tileY *=_tileHeight; + var rx:Float=0; + var ry:Float=0; + var q:Float; + var lx:Float=curX-stepX; + var ly:Float=curY-stepY; + + //Figure out if it crosses the X boundary + q=tileX; + if(deltaX<0) + q +=_tileWidth; + rx=q; + ry=ly + stepY*((q-lx)/stepX); + if((ry>tileY)&&(rytileX)&&(rxFlxTilemap-friendly format. + */ + static public function arrayToCSV(Data:Array,Width:Int,Invert:Bool=false):String + { + var row:Int=0; + var column:Int; + var csv:String; + var Height:Int=Data.length / Width; + var index:Int; + while(rowBitmapDataobject to a comma-separated string. + * Black pixels are flagged as 'solid' by default, + * non-black pixels are set as non-colliding. + * Black pixels must be PURE BLACK. + * + * @param bitmapData A FlashBitmapDataobject, preferably black and white. + * @param Invert Load white pixels as solid instead. + * @param Scale Default is 1. Scale of 2 means each pixel forms a 2x2 block of tiles, and so on. + * @param ColorMap An array of color values(uint 0xAARRGGBB)in the order they're Intended to be assigned as indices + * + * @return A comma-separated string containing the level data in aFlxTilemap-friendly format. + */ + static public function bitmapToCSV(bitmapData:BitmapData,Invert:Bool=false,Scale:Int=1,ColorMap:Array=null):String + { + //Import and scale image if necessary + if(Scale>1) + { + var bd:BitmapData=bitmapData; + bitmapData=new BitmapData(bitmapData.width*Scale,bitmapData.height*Scale); + var mtx:Matrix=new Matrix(); + mtx.scale(Scale,Scale); + bitmapData.draw(bd,mtx); + } + + //Walk image and export pixel values + var row:Int=0; + var column:Int; + var pixel:Int; + var csv:String=""; + var bitmapWidth:Int=bitmapData.width; + var bitmapHeight:Int=bitmapData.height; + while(row0))||(!Invert &&(pixel==0))) + pixel=1; + else + pixel=0; + + //Write the result to the string + if(column==0) + { + if(row==0) + csv +=pixel; + else + csv +="\n"+pixel; + } + else + csv +=", "+pixel; + column++; + } + row++; + } + return csv; + } + + /** + * Converts a resource image file to a comma-separated string. + * Black pixels are flagged as 'solid' by default, + * non-black pixels are set as non-colliding. + * Black pixels must be PURE BLACK. + * + * @param ImageFile An embedded graphic, preferably black and white. + * @param Invert Load white pixels as solid instead. + * @param Scale Default is 1. Scale of 2 means each pixel forms a 2x2 block of tiles, and so on. + * + * @return A comma-separated string containing the level data in aFlxTilemap-friendly format. + */ + static public function imageToCSV(ImageFile:Class,Invert:Bool=false,Scale:Int=1):String + { + return bitmapToCSV((new ImageFile).bitmapData,Invert,Scale); + } + + /** + * An Internal function used by the binary auto-tilers. + * + * @param Index The index of the tile you want to analyze. + */ + private function autoTile(Index:Int):Void + { + if(_data[Index]==0) + return; + + _data[Index]=0; + if((Index-widthInTiles<0)||(_data[Index-widthInTiles]>0)) //UP + _data[Index] +=1; + if((Index%widthInTiles>=widthInTiles-1)||(_data[Index+1]>0)) //RIGHT + _data[Index] +=2; + if((Index+widthInTiles>=totalTiles)||(_data[Index+widthInTiles]>0))//DOWN + _data[Index] +=4; + if((Index%widthInTiles<=0)||(_data[Index-1]>0)) //LEFT + _data[Index] +=8; + if((auto==ALT)&&(_data[Index]==15)) //The alternate algo checks for Interior corners + { + if((Index%widthInTiles>0)&&(Index+widthInTiles0)&&(Index-widthInTiles>=0)&&(_data[Index-widthInTiles-1]<=0)) + _data[Index]=2; //TOP LEFT OPEN + if((Index%widthInTiles=0)&&(_data[Index-widthInTiles+1]<=0)) + _data[Index]=4; //TOP RIGHT OPEN + if((Index%widthInTiles=_tiles.width) + { + ry=uint(rx/_tiles.width)*_tileHeight; + rx %=_tiles.width; + } + _rects[Index]=(new Rectangle(rx,ry,_tileWidth,_tileHeight)); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxTimer.hx b/AIR/intra/hsrc/org/flixel/FlxTimer.hx new file mode 100644 index 0000000..287fc01 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxTimer.hx @@ -0,0 +1,171 @@ +package org.flixel; + +import org.flixel.plugin.TimerManager; + +/** + * A simple timer class, leveraging the new plugins system. + * Can be used with callbacks or by polling thefinishedflag. + * Not Intended to be added to a game state or group;the timer manager + * is responsible for actually calling update(), not the user. + * + * @author Adam Atomic + */ +class FlxTimer +{ + /** + * How much time the timer was set for. + */ + public var time:Float; + /** + * How many loops the timer was set for. + */ + public var loops:Int; + /** + * Pauses or checks the pause state of the timer. + */ + public var paused:Bool; + /** + * Check to see if the timer is finished. + */ + public var finished:Bool; + + /** + * Internal tracker for the time's-up callback function. + * Callback should be formed "onTimer(Timer:FlxTimer);" + */ + private var _callback:Function; + /** + * Internal tracker for the actual timer counting up. + */ + private var _timeCounter:Float; + /** + * Internal tracker for the loops counting up. + */ + private var _loopsCounter:Int; + + /** + * Instantiate the timer. Does not set or start the timer. + */ + public function new() + { + time=0; + loops=0; + _callback=null; + _timeCounter=0; + _loopsCounter=0; + + paused=false; + finished=false; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + stop(); + _callback=null; + } + + /** + * Called by the timer manager plugin to update the timer. + * If time runs out, the loop counter is advanced, the timer reset, and the callback called if it exists. + * If the timer runs out of loops, then the timer callsstop(). + * However, callbacks are called AFTERstop()is called. + */ + public function update():Void + { + _timeCounter +=FlxG.elapsed; + while((_timeCounter>=time)&& !paused && !finished) + { + _timeCounter -=time; + + _loopsCounter++; + if((loops>0)&&(_loopsCounter>=loops)) + stop(); + + if(_callback !=null) + _callback(this); + } + } + + /** + * Starts or resumes the timer. If this timer was paused, + * then all the parameters are ignored, and the timer is resumed. + * Adds the timer to the timer manager. + * + * @param Time How many seconds it takes for the timer to go off. + * @param Loops How many times the timer should go off. Default is 1, or "just count down once." + * @param Callback Optional, triggered whenever the time runs out, once for loop. Callback should be formed "onTimer(Timer:FlxTimer);" + * + * @return A reference to itself(handy for chaining or whatever). + */ + public function start(Time:Float=1,Loops:Int=1,Callback:Function=null):FlxTimer + { + var timerManager:TimerManager=manager; + if(timerManager !=null) + timerManager.add(this); + + if(paused) + { + paused=false; + return this; + } + + paused=false; + finished=false; + time=Time; + loops=Loops; + _callback=Callback; + _timeCounter=0; + _loopsCounter=0; + return this; + } + + /** + * Stops the timer and removes it from the timer manager. + */ + public function stop():Void + { + finished=true; + var timerManager:TimerManager=manager; + if(timerManager !=null) + timerManager.remove(this); + } + + /** + * Read-only:check how much time is left on the timer. + */ + public var timeLeft(get_timeLeft, null):Float; + private function get_timeLeft():Float + { + return time-_timeCounter; + } + + /** + * Read-only:check how many loops are left on the timer. + */ + public var loopsLeft(get_loopsLeft, null):Int; + private function get_loopsLeft():Int + { + return loops-_loopsCounter; + } + + /** + * Read-only:how far along the timer is, on a scale of 0.0 to 1.0. + */ + public var progress(get_progress, null):Float; + private function get_progress():Float + { + if(time>0) + return _timeCounter/time; + else + return 0; + } + + static public var manager(get_manager, null):TimerManager; + private function get_manager():TimerManager + { + return FlxG.getPlugin(TimerManager)as TimerManager; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/FlxU.hx b/AIR/intra/hsrc/org/flixel/FlxU.hx new file mode 100644 index 0000000..4527d1e --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/FlxU.hx @@ -0,0 +1,621 @@ +package org.flixel; + +import flash.net.URLRequest; +import flash.net.navigateToURL; +import flash.utils.getDefinitionByName; +import flash.utils.getQualifiedClassName; +import flash.utils.getTimer; + +class FlxU +{ + /** + * Opens a web page in a new tab or window. + * MUST be called from the UI thread or else badness. + * + * @param URL The address of the web page. + */ + static public function openURL(URL:String):Void + { + navigateToURL(new URLRequest(URL), "_blank"); + } + + /** + * Calculate the absolute value of a number. + * + * @param Value Any number. + * + * @return The absolute value of that number. + */ + static public function abs(Value:Float):Float + { + return(Value>0)?Value:-Value; + } + + /** + * Round down to the next whole number. E.g. floor(1.7)==1, and floor(-2.7)==-2. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function floor(Value:Float):Float + { + var number:Float=Std.int(Value); + return(Value>0)?(number):((number!=Value)?(number-1):(number)); + } + + /** + * Round up to the next whole number. E.g. ceil(1.3)==2, and ceil(-2.3)==-3. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function ceil(Value:Float):Float + { + var number:Float=Std.int(Value); + return(Value>0)?((number!=Value)?(number+1):(number)):(number); + } + + /** + * Round to the closest whole number. E.g. round(1.7)==2, and round(-2.3)==-2. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function round(Value:Float):Float + { + var number:Float=Std.int(Value+((Value>0)?0.5:-0.5)); + return(Value>0)?(number):((number!=Value)?(number-1):(number)); + } + + /** + * Figure out which number is smaller. + * + * @param Number1 Any number. + * @param Number2 Any number. + * + * @return The smaller of the two numbers. + */ + static public function min(Number1:Float,Number2:Float):Float + { + return(Number1<=Number2)?Number1:Float2; + } + + /** + * Figure out which number is larger. + * + * @param Number1 Any number. + * @param Number2 Any number. + * + * @return The larger of the two numbers. + */ + static public function max(Number1:Float,Number2:Float):Float + { + return(Number1>=Number2)?Number1:Float2; + } + + /** + * Bound a number by a minimum and maximum. + * Ensures that this number is no smaller than the minimum, + * and no larger than the maximum. + * + * @param Value Any number. + * @param Min Any number. + * @param Max Any number. + * + * @return The bounded value of the number. + */ + static public function bound(Value:Float,Min:Float,Max:Float):Float + { + var lowerBound:Float=(ValueMax)?Max:lowerBound; + } + + /** + * Generates a random number based on the seed provided. + * + * @param Seed A number between 0 and 1, used to generate a predictable random number(very optional). + * + * @return ANumberbetween 0 and 1. + */ + static public function srand(Seed:Float):Float + { + return((69621 * Std.int(Seed * 0x7FFFFFFF))% 0x7FFFFFFF)/ 0x7FFFFFFF; + } + + /** + * Shuffles the entries in an array Into a new random order. + *FlxG.shuffle()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.shuffle()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param A A FlashArrayobject containing...stuff. + * @param HowManyTimes How many swaps to perform during the shuffle operation. Good rule of thumb is 2-4 times as many objects are in the list. + * + * @return The same FlashArrayobject that you passed in in the first place. + */ + static public function shuffle(Objects:Array,HowManyTimes:Int):Array + { + var i:Int=0; + var index1:Int; + var index2:Int; + var object:Dynamic; + while(iFlxG.getRandom()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.getRandom()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param Objects A Flash array of objects. + * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. + * @param Length Optional restriction on the number of values you want to randomly select from. + * + * @return The random object that was selected. + */ + static public function getRandom(Objects:Array,StartIndex:Int=0,Length:Int=0):Dynamic + { + if(Objects !=null) + { + var l:Int=Length; + if((l==0)||(l>Objects.length - StartIndex)) + l=Objects.length - StartIndex; + if(l>0) + return Dynamics[StartIndex + Int(Math.random()*l)]; + } + return null; + } + + /** + * Just grabs the current "ticks" or time in milliseconds that has passed since Flash Player started up. + * Useful for finding out how long it takes to execute specific blocks of code. + * + * @return Auintto be passed toFlxU.endProfile(). + */ + static public function getTicks():Int + { + return getTimer(); + } + + /** + * Takes two "ticks" timestamps and formats them Into the number of seconds that passed as a String. + * Useful for logging, debugging, the watch window, or whatever else. + * + * @param StartTicks The first timestamp from the system. + * @param EndTicks The second timestamp from the system. + * + * @return AStringcontaining the formatted time elapsed information. + */ + static public function formatTicks(StartTicks:Int,EndTicks:Int):String + { + return((EndTicks-StartTicks)/1000)+"s" + } + + /** + * Generate a Flashuintcolor from RGBA components. + * + * @param Red The red component, between 0 and 255. + * @param Green The green component, between 0 and 255. + * @param Blue The blue component, between 0 and 255. + * @param Alpha How opaque the color should be, either between 0 and 1 or 0 and 255. + * + * @return The color as auint. + */ + static public function makeColor(Red:Int, Green:Int, Blue:Int, Alpha:Float=1.0):Int + { + return(((Alpha>1)?Alpha:(Alpha * 255))& 0xFF)<<24 |(Red & 0xFF)<<16 |(Green & 0xFF)<<8 |(Blue & 0xFF); + } + + /** + * Generate a Flashuintcolor from HSB components. + * + * @param Hue A number between 0 and 360, indicating position on a color strip or wheel. + * @param Saturation A number between 0 and 1, indicating how colorful or gray the color should be. 0 is gray, 1 is vibrant. + * @param Brightness A number between 0 and 1, indicating how bright the color should be. 0 is black, 1 is full bright. + * @param Alpha How opaque the color should be, either between 0 and 1 or 0 and 255. + * + * @return The color as auint. + */ + static public function makeColorFromHSB(Hue:Float,Saturation:Float,Brightness:Float,Alpha:Float=1.0):Int + { + var red:Float; + var green:Float; + var blue:Float; + if(Saturation==0.0) + { + red=Brightness; + green=Brightness; + blue=Brightness; + } + else + { + if(Hue==360) + Hue=0; + var slice:Int=Hue/60; + var hf:Float=Hue/60 - slice; + var aa:Float=Brightness*(1 - Saturation); + var bb:Float=Brightness*(1 - Saturation*hf); + var cc:Float=Brightness*(1 - Saturation*(1.0 - hf)); + switch(slice) + { + case 0:red=Brightness;green=cc;blue=aa;break; + case 1:red=bb;green=Brightness;blue=aa;break; + case 2:red=aa;green=Brightness;blue=cc;break; + case 3:red=aa;green=bb;blue=Brightness;break; + case 4:red=cc;green=aa;blue=Brightness;break; + case 5:red=Brightness;green=aa;blue=bb;break; + default:red=0;green=0; blue=0;break; + } + } + + return(((Alpha>1)?Alpha:(Alpha * 255))& 0xFF)<<24 | Int(red*255)<<16 | Int(green*255)<<8 | Int(blue*255); + } + + /** + * Loads an array with the RGBA values of a Flashuintcolor. + * RGB values are stored 0-255. Alpha is stored as a floating point number between 0 and 1. + * + * @param Color The color you want to break Into components. + * @param Results An optional parameter, allows you to use an array that already exists in memory to store the result. + * + * @return AnArrayobject containing the Red, Green, Blue and Alpha values of the given color. + */ + static public function getRGBA(Color:Int,Results:Array=null):Array + { + if(Results==null) + Results=new Array(); + Results[0]=(Color>>16)& 0xFF; + Results[1]=(Color>>8)& 0xFF; + Results[2]=Color & 0xFF; + Results[3]=Std.parseFloat((Color>>24)& 0xFF)/ 255; + return Results; + } + + /** + * Loads an array with the HSB values of a Flashuintcolor. + * Hue is a value between 0 and 360. Saturation, Brightness and Alpha + * are as floating point numbers between 0 and 1. + * + * @param Color The color you want to break Into components. + * @param Results An optional parameter, allows you to use an array that already exists in memory to store the result. + * + * @return AnArrayobject containing the Red, Green, Blue and Alpha values of the given color. + */ + static public function getHSB(Color:Int,Results:Array=null):Array + { + if(Results==null) + Results=new Array(); + + var red:Float=Std.parseFloat((Color>>16)& 0xFF)/ 255; + var green:Float=Std.parseFloat((Color>>8)& 0xFF)/ 255; + var blue:Float=Std.parseFloat((Color)& 0xFF)/ 255; + + var m:Float=(red>green)?red:green; + var dmax:Float=(m>blue)?m:blue; + m=(red>green)?green:red; + var dmin:Float=(m>blue)?blue:m; + var range:Float=dmax - dmin; + + Results[2]=dmax; + Results[1]=0; + Results[0]=0; + + if(dmax !=0) + Results[1]=range / dmax; + if(Results[1] !=0) + { + if(red==dmax) + Results[0]=(green - blue)/ range; + else if(green==dmax) + Results[0]=2 +(blue - red)/ range; + else if(blue==dmax) + Results[0]=4 +(red - green)/ range; + Results[0] *=60; + if(Results[0]<0) + Results[0] +=360; + } + + Results[3]=Std.parseFloat((Color>>24)& 0xFF)/ 255; + return Results; + } + + /** + * Format seconds as minutes with a colon, an optionally with milliseconds too. + * + * @param Seconds The number of seconds(for example, time remaining, time spent, etc). + * @param ShowMS Whether to show milliseconds after a "." as well. Default value is false. + * + * @return A nicely formattedString, like "1:03". + */ + static public function formatTime(Seconds:Float,ShowMS:Bool=false):String + { + var timeString:String=Std.int(Seconds/60)+ ":"; + var timeStringHelper:Int=Std.int(Seconds)%60; + if(timeStringHelper<10) + timeString +="0"; + timeString +=timeStringHelper; + if(ShowMS) + { + timeString +="."; + timeStringHelper=(Seconds-int(Seconds))*100; + if(timeStringHelper<10) + timeString +="0"; + timeString +=timeStringHelper; + } + return timeString; + } + + /** + * Generate a comma-separated string from an array. + * Especially useful for tracing or other debug output. + * + * @param AnyArray AnyArrayobject. + * + * @return A comma-separatedStringcontaining the.toString()output of each element in the array. + */ + static public function formatArray(AnyArray:Array):String + { + if((AnyArray==null)||(AnyArray.length<=0)) + return ""; + var string:String=AnyArray[0].toString(); + var i:Int=0; + var l:Int=AnyArray.length; + while(ivar results:String=FlxU.formatMoney(10,false); + * However, very handy for displaying large sums or decimal money values. + * + * @param Amount How much moneys(in dollars, or the equivalent "main" currency - i.e. not cents). + * @param ShowDecimal Whether to show the decimals/cents component. Default value is true. + * @param EnglishStyle Major quantities(thousands, millions, etc)separated by commas, and decimal by a period. Default value is true. + * + * @return A nicely formattedString. Does not include a dollar sign or anything! + */ + static public function formatMoney(Amount:Float,ShowDecimal:Bool=true,EnglishStyle:Bool=true):String + { + var helper:Int; + var amount:Int=Amount; + var string:String=""; + var comma:String=""; + var zeroes:String=""; + while(amount>0) + { + if((string.length>0)&& comma.length<=0) + { + if(EnglishStyle) + comma=","; + else + comma="."; + } + zeroes=""; + helper=amount - Std.int(amount/1000)*1000; + amount /=1000; + if(amount>0) + { + if(helper<100) + zeroes +="0"; + if(helper<10) + zeroes +="0"; + } + string=zeroes + helper + comma + string; + } + if(ShowDecimal) + { + amount=Std.int(Amount*100)-(int(Amount)*100); + string +=(EnglishStyle?".":",")+ amount; + if(amount<10) + string +="0"; + } + return string; + } + + /** + * Get theStringname of anyObject. + * + * @param Obj TheObjectobject in question. + * @param Simple Returns only the class name, not the package or packages. + * + * @return The name of theClassas aStringobject. + */ + static public function getClassName(Obj:Dynamic,Simple:Bool=false):String + { + var string:String=getQualifiedClassName(Obj); + string=string.replace("::","."); + if(Simple) + string=string.substr(string.lastIndexOf(".")+1); + return string; + } + + /** + * Check to see if two objects have the same class name. + * + * @param Object1 The first object you want to check. + * @param Object2 The second object you want to check. + * + * @return Whether they have the same class name or not. + */ + static public function compareClassNames(Object1:Dynamic,Object2:Dynamic):Bool + { + return getQualifiedClassName(Object1)==getQualifiedClassName(Object2); + } + + /** + * Look up aClassobject by its string name. + * + * @param Name TheStringname of theClassyou are Interested in. + * + * @return AClassobject. + */ + static public function getClass(Name:String):Class + { + return getDefinitionByName(Name)as Class; + } + + /** + * A tween-like function that takes a starting velocity + * and some other factors and returns an altered velocity. + * + * @param Velocity Any component of velocity(e.g. 20). + * @param Acceleration Rate at which the velocity is changing. + * @param Drag Really kind of a deceleration, this is how much the velocity changes if Acceleration is not set. + * @param Max An absolute value cap for the velocity. + * + * @return The altered Velocity value. + */ + static public function computeVelocity(Velocity:Float, Acceleration:Float=0, Drag:Float=0, Max:Float=10000):Float + { + if(Acceleration !=0) + Velocity +=Acceleration*FlxG.elapsed; + else if(Drag !=0) + { + var drag:Float=Drag*FlxG.elapsed; + if(Velocity - drag>0) + Velocity=Velocity - drag; + else if(Velocity + drag<0) + Velocity +=drag; + else + Velocity=0; + } + if((Velocity !=0)&&(Max !=10000)) + { + if(Velocity>Max) + Velocity=Max; + else if(Velocity<-Max) + Velocity=-Max; + } + return Velocity; + } + + //*** NOTE:THESE LAST THREE FUNCTIONS REQUIRE FLXPOINT ***// + + /** + * Rotates a point in 2D space around another point by the given angle. + * + * @param X The X coordinate of the point you want to rotate. + * @param Y The Y coordinate of the point you want to rotate. + * @param PivotX The X coordinate of the point you want to rotate around. + * @param PivotY The Y coordinate of the point you want to rotate around. + * @param Angle Rotate the point by this many degrees. + * @param Point OptionalFlxPointto store the results in. + * + * @return AFlxPointcontaining the coordinates of the rotated point. + */ + static public function rotatePoint(X:Float, Y:Float, PivotX:Float, PivotY:Float, Angle:Float,Point:FlxPoint=null):FlxPoint + { + var sin:Float=0; + var cos:Float=0; + var radians:Float=Angle * -0.017453293; + while(radians<-3.14159265) + radians +=6.28318531; + while(radians>3.14159265) + radians=radians - 6.28318531; + + if(radians<0) + { + sin=1.27323954 * radians + .405284735 * radians * radians; + if(sin<0) + sin=.225 *(sin *-sin - sin)+ sin; + else + sin=.225 *(sin * sin - sin)+ sin; + } + else + { + sin=1.27323954 * radians - 0.405284735 * radians * radians; + if(sin<0) + sin=.225 *(sin *-sin - sin)+ sin; + else + sin=.225 *(sin * sin - sin)+ sin; + } + + radians +=1.57079632; + if(radians>3.14159265) + radians=radians - 6.28318531; + if(radians<0) + { + cos=1.27323954 * radians + 0.405284735 * radians * radians; + if(cos<0) + cos=.225 *(cos *-cos - cos)+ cos; + else + cos=.225 *(cos * cos - cos)+ cos; + } + else + { + cos=1.27323954 * radians - 0.405284735 * radians * radians; + if(cos<0) + cos=.225 *(cos *-cos - cos)+ cos; + else + cos=.225 *(cos * cos - cos)+ cos; + } + var dx:Float=X - PivotX; + var dy:Float=PivotY + Y;//Y axis is inverted in flash, normally this would be a subtract operation + + if(Point==null) + Point=new FlxPoint(); + Point.x=PivotX + cos*dx - sin*dy; + Point.y=PivotY - sin * dx - cos * dy; + return Point; + }; + + /** + * Calculates the angle between two points. 0 degrees points straight up. + * + * @param Point1 The X coordinate of the point. + * @param Point2 The Y coordinate of the point. + * + * @return The angle in degrees, between -180 and 180. + */ + static public function getAngle(Point1:FlxPoint, Point2:FlxPoint):Float + { + var x:Float=Point2.x - Point1.x; + var y:Float=Point2.y - Point1.y; + if((x==0)&&(y==0)) + return 0; + var c1:Float=3.14159265 * 0.25; + var c2:Float=3 * c1; + var ay:Float=(y<0)?-y:y; + var angle:Float=0; + if(x>=0) + angle=c1 - c1 *((x - ay)/(x + ay)); + else + angle=c2 - c1 *((x + ay)/(ay - x)); + angle=((y<0)?-angle:angle)*57.2957796; + if(angle>90) + angle=angle - 270; + else + angle +=90; + return angle; + }; + + /** + * Calculate the distance between two points. + * + * @param Point1 AFlxPointobject referring to the first location. + * @param Point2 AFlxPointobject referring to the second location. + * + * @return The distance between the two points as a floating pointNumberobject. + */ + static public function getDistance(Point1:FlxPoint,Point2:FlxPoint):Float + { + var dx:Float=Point1.x - Point2.x; + var dy:Float=Point1.y - Point2.y; + return Math.sqrt(dx * dx + dy * dy); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/DebugPathDisplay.hx b/AIR/intra/hsrc/org/flixel/plugin/DebugPathDisplay.hx new file mode 100644 index 0000000..b83a090 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/DebugPathDisplay.hx @@ -0,0 +1,111 @@ +package org.flixel.plugin; + +import org.flixel.*; + +/** + * A simple manager for tracking and drawing FlxPath debug data to the screen. + * + * @author Adam Atomic + */ +class DebugPathDisplay extends FlxBasic +{ + private var _paths:Array; + + /** + * Instantiates a new debug path display manager. + */ + public function new() + { + _paths=new Array(); + active=false;//don't call update on this plugin + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + clear(); + _paths=null; + } + + /** + * Called byFlxG.drawPlugins()after the game state has been drawn. + * Cycles through cameras and callsdrawDebug()on each one. + */ + override public function draw():Void + { + if(!FlxG.visualDebug || ignoreDrawDebug) + return; + + if(cameras==null) + cameras=FlxG.cameras; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObject'sdrawDebug()functionality, + * this function callsdrawDebug()on eachFlxPathfor the specified camera. + * Very helpful for debugging! + * + * @param Camera WhichFlxCameraobject to draw the debug data to. + */ + override public function drawDebug(Camera:FlxCamera=null):Void + { + if(Camera==null) + Camera=FlxG.camera; + + var i:Int=_paths.length-1; + var path:FlxPath; + while(i>=0) + { + path=_paths[i--] as FlxPath; + if((path !=null)&& !path.ignoreDrawDebug) + path.drawDebug(Camera); + } + } + + /** + * Add a path to the path debug display manager. + * Usually called automatically byFlxPath's constructor. + * + * @param Path TheFlxPathyou want to add to the manager. + */ + public function add(Path:FlxPath):Void + { + _paths.push(Path); + } + + /** + * Remove a path from the path debug display manager. + * Usually called automatically byFlxPath'sdestroy()function. + * + * @param Path TheFlxPathyou want to remove from the manager. + */ + public function remove(Path:FlxPath):Void + { + var index:Int=_paths.indexOf(Path); + if(index>=0) + _paths.splice(index,1); + } + + /** + * Removes all the paths from the path debug display manager. + */ + public function clear():Void + { + var i:Int=_paths.length-1; + var path:FlxPath; + while(i>=0) + { + path=_paths[i--] as FlxPath; + if(path !=null) + path.destroy(); + } + _paths.length=0; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/TimerManager.hx b/AIR/intra/hsrc/org/flixel/plugin/TimerManager.hx new file mode 100644 index 0000000..26d892f --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/TimerManager.hx @@ -0,0 +1,87 @@ +package org.flixel.plugin; + +import org.flixel.*; + +/** + * A simple manager for tracking and updating game timer objects. + * + * @author Adam Atomic + */ +class TimerManager extends FlxBasic +{ + private var _timers:Array; + + /** + * Instantiates a new timer manager. + */ + public function new() + { + _timers=new Array(); + visible=false;//don't call draw on this plugin + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + clear(); + _timers=null; + } + + /** + * Called byFlxG.updatePlugins()before the game state has been updated. + * Cycles through timers and callsupdate()on each one. + */ + override public function update():Void + { + var i:Int=_timers.length-1; + var timer:FlxTimer; + while(i>=0) + { + timer=_timers[i--] as FlxTimer; + if((timer !=null)&& !timer.paused && !timer.finished &&(timer.time>0)) + timer.update(); + } + } + + /** + * Add a new timer to the timer manager. + * Usually called automatically byFlxTimer's constructor. + * + * @param Timer TheFlxTimeryou want to add to the manager. + */ + public function add(Timer:FlxTimer):Void + { + _timers.push(Timer); + } + + /** + * Remove a timer from the timer manager. + * Usually called automatically byFlxTimer'sstop()function. + * + * @param Timer TheFlxTimeryou want to remove from the manager. + */ + public function remove(Timer:FlxTimer):Void + { + var index:Int=_timers.indexOf(Timer); + if(index>=0) + _timers.splice(index,1); + } + + /** + * Removes all the timers from the timer manager. + */ + public function clear():Void + { + var i:Int=_timers.length-1; + var timer:FlxTimer; + while(i>=0) + { + timer=_timers[i--] as FlxTimer; + if(timer !=null) + timer.destroy(); + } + _timers.length=0; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/API/FlxKongregate.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/API/FlxKongregate.hx new file mode 100644 index 0000000..48799ec --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/API/FlxKongregate.hx @@ -0,0 +1,346 @@ +/** + * FlxKongregate + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - August 1st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.API +{ +import flash.display.DisplayObject; +import flash.display.Loader; +import flash.errors.IOError; +import flash.events.Event; +import flash.events.IOErrorEvent; +import flash.net.URLRequest; +import flash.system.Security; + +import org.flixel.*; + +/** + * Allows for easy access to the Kongregate API + * + * Todo:Add in the functions for Chat Integration - you can still use them via the FlxKongregate.api object. + */ +class FlxKongregate +{ + /** + * The Kongregate API object. You can make calls directly to this once the API has connected. + */ + public static var api:Dynamic; + + /** + * true if the API has loaded otherwise false. Loaded is not the same thing as connected, it just means it's ready for the connection. + */ + public static var hasLoaded:Bool=false; + + /** + * Is the game running locally in Shadow API mode(true)or from Kongregates servers(false) + */ + public static var isLocal:Bool=false; + + private static var shadowAPI:String="http://www.kongregate.com/flash/API_AS3_Local.swf"; + private static var apiLoader:Loader; + private static var loadCallback:Function; + + public function new() + { + } + + /** + * Loads the Kongregate API and if successful connects to the service. + * Note that your game must have access to Stage by this point. + * + * @param callback This function is called if the API loads successfully. Do not call any API function until this has happened. + */ + public static function init(callback:Function):Void + { + try + { + var parameters:Dynamic=FlxG.stage.loaderInfo.parameters; + } + catch(e:Dynamic) + { + throw new Dynamic("FlxKongregate:No access to FlxG.stage - only call this once your game has access to the display list"); + return; + } + + var apiPath:String; + + if(parameters.kongregate_api_path) + { + Security.allowDomain(parameters.kongregate_api_path); + apiPath=parameters.kongregate_api_path; + } + else + { + Security.allowDomain(shadowAPI); + apiPath=shadowAPI; + isLocal=true; + } + + loadCallback=callback; + + apiLoader=new Loader(); + apiLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, apiLoadComplete, false, 0, true); + apiLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, apiLoadError, false, 0, true); + apiLoader.load(new URLRequest(apiPath)); + + FlxG.stage.addChild(apiLoader); + } + + /** + * Remove the API from memory(when possible)and removes it from the display list also + */ + public static function disconnect():Void + { + api=null; + + hasLoaded=false; + + FlxG.stage.removeChild(apiLoader); + } + + private static function apiLoadComplete(event:Event):Void + { + api=event.target.content; + + hasLoaded=true; + + Security.allowDomain(api.loaderInfo.url); + + if(Std.is(loadCallback, Function)) + { + loadCallback.call(); + } + + } + + private static function apiLoadError(error:IOError):Void + { + trace("Error loading Kongregate API", error); + } + + /** + * Use the addLoadListener function to register an event listener which will be triggered when content of the specified type is loaded by the user. + * These MUST be set-up *before* you call FlxKongregate.connect() + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param contentType Type of content to listen for + * @param callback Function to call when content load request has been made + */ + public static function addLoadListener(contentType:String, callback:Function):Void + { + api.sharedContent.addLoadListener(contentType, callback); + } + + /** + * Register an event listener with the API. Useful for capturing guest to user login requests for example. + * See:http://www.kongregate.com/developer_center/docs/handling-guests + * + * @param contentType The event to listen for(i.e. "login") + * @param callback Funcation to call when this event is received + */ + public static function addEventListener(contentType:String, callback:Function):Void + { + api.services.addEventListener(contentType, callback); + } + + /** + * Connect to the Kongregate API. This should be called only after the init callback reports a succesful load of the API + */ + public static function connect():Void + { + if(hasLoaded) + { + api.services.connect(); + } + } + + /** + * The isGuest function can be called to determine if the player is currently signed Into Kongregate or not + */ + public static var isGuest(get_isGuest, null):Bool; + private function get_isGuest():Bool + { + return api.services.isGuest(); + } + + /** + * You can use the getUsername()function to retrieve the username of the current player. It will begin with Guest if the user is not signed in. + */ + public static var getUserName(get_getUserName, null):String; + private function get_getUserName():String + { + return api.services.getUsername(); + } + + /** + * You can use the getUserId()function to retrieve the unique user id of the current player. It will return 0 if the user is not signed in. + */ + public static var getUserId(get_getUserId, null):Float; + private function get_getUserId():Float + { + try + { + return api.services.getUserId(); + } + catch(e:Dynamic) + { + return 0; + } + + return 0; + } + + /** + * If you are using the Authentication API you can use the getGameAuthToken function to get the player's game authentication token. + */ + public static var getGameAuthToken(get_getGameAuthToken, null):String; + private function get_getGameAuthToken():String + { + return api.services.getGameAuthToken(); + } + + /** + * If the player is a guest, and you want to display the sign-in/registration UI to them you can use the showSignInBox function. + */ + public static function showSignInBox():Void + { + if(api.services.isGuest()) + { + api.services.showSignInBox(); + } + } + + /** + * This call works the same way as showSigninBox, but it focuses the registration form rather than the sign-in form. + */ + public static function showRegistrationBox():Void + { + if(api.services.isGuest()) + { + api.services.showRegistrationBox(); + } + } + + /** + * If a player is logged-in and you want to allow them to post a shout on their profile page, you may bring up the shout box, optionally populated with some initial content. + * + * @param message The optional initial content + */ + public static function showShoutBox(message:String=""):Void + { + if(api.services.isGuest()==false) + { + api.services.showShoutBox(message); + } + } + + /** + * If you need to resize your game's enclosing container, you may do so with resizeGame call. The enclosing iframe will resize around your game. + * Games may not be resized smaller than their initial dimensions. This call requires special permission from Kongregate to use. + * + * @param width New width(in pixels)of the container + * @param height New height(in pixels)of the container + */ + public static function resizeGame(width:Int, height:Int):Void + { + api.services.resizeGame(width, height); + } + + /** + * Submit a statistic to the Kongregate server. Make sure you have defined the stat before calling this. + * See the Kongregate API documentation for details. + * + * @param name The name of the statistic + * @param value The value to submit(will be converted to an Integer server-side) + */ + public static function submitStats(name:String, value:Float):Void + { + api.stats.submit(name, value); + } + + /** + * Bring up the "purchase items" dialog box by using the purchaseItems method on the microtransaction services object. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param items The array of item identifier strings or item/metadata objects. + * @param callback The callback function + */ + public static function purchaseItem(items:Array, callback:Function):Void + { + api.mtx.purchaseItems(items, callback); + } + + /** + * Request the inventory of any user. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param username The username to request inventory for, or null for the current player + * @param callback The callback function + */ + public static function requestUserItemList(username:String, callback:Function):Void + { + api.mtx.requestUserItemList(username, callback); + } + + /** + * Display the Kred purchasing Dialog. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param purchaseMethod The purchase method to display. Should be "offers" or "mobile" + */ + public static function showKredPurchaseDialog(purchaseMethod:String):Void + { + api.mtx.showKredPurchaseDialog(purchaseMethod); + } + + /** + * The browse function causes a list of shared content to appear in the user's browser. + * This will allow them to view, rate, or load shared content for your game. + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param contentType Type of content to browse + * @param sortOrder Optional constant specifying how to sort content(see API docs) + * @param label Optional, only browse content saved with the specified label + */ + public static function browseSharedContent(contentType:String, sortOrder:String=null, label:String=null):Void + { + api.sharedContent.browse(contentType, sortOrder, label); + } + + /** + * Use the save function to submit shared content on the Kongregate back-end. + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param type Type of content the user wishes to save, 12 characters max. + * @param content Value of content to be saved. We strongly recommend keeping these values under 100K. + * @param callback Function to call when save has finished. + * @param thumb Optional but highly recommended! Send us a DisplayObject that we will snapshotted and used as a thumbnail for the content. + * @param label Optional, label for sub-classing the shared content. + */ + public static function saveSharedContent(type:String, content:String, callback:Function, thumb:DisplayObject=null, label:String=null):Void + { + api.sharedContent.save(type, content, callback, thumb, label); + } + + /** + * Export a DisplayObject to be converted to a user avatar. It is highly recommended that avatars be at least 40 x 40px. + * See:http://www.kongregate.com/developer_center/docs/avatar-api + * + * @param avatar Can be null, but highly recommended that you send yourself. If null, we will snapshot the stage. + * @param callback Function to call when content load request has been made + */ + public static function submitAvatar(avatar:DisplayObject, callback:Function):Void + { + api.images.submitAvatar(avatar, callback); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx new file mode 100644 index 0000000..91c918c --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx @@ -0,0 +1,234 @@ +/** + * Bullet + * -- Part of the Flixel Power Tools set + * + * v1.2 Removed "id" and used the FlxSprite ID value instead + * v1.1 Updated to support fire callbacks, sounds, random variances and lifespan + * v1.0 First release + * + * @version 1.2 - October 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.BaseTypes +{ +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxMath; +import org.flixel.plugin.photonstorm.FlxVelocity; +import org.flixel.plugin.photonstorm.FlxWeapon; +import flash.utils.getTimer; + +class Bullet extends FlxSprite +{ + private var weapon:FlxWeapon; + + private var bulletSpeed:Int; + + // Acceleration or Velocity? + public var accelerates:Bool; + public var xAcceleration:Int; + public var yAcceleration:Int; + + public var rndFactorAngle:Int; + public var rndFactorSpeed:Int; + public var rndFactorLifeSpan:Int; + public var lifespan:Int; + public var launchTime:Int; + public var expiresTime:Int; + + private var animated:Bool; + + public function new(weapon:FlxWeapon, id:Int) + { + super(0, 0); + + this.weapon=weapon; + this.ID=id; + + // Safe defaults + accelerates=false; + animated=false; + bulletSpeed=0; + + exists=false; + } + + /** + * Adds a new animation to the sprite. + * + * @param Name What this animation should be called(e.g. "run"). + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3). + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40 fps). + * @param Looped Whether or not the animation is looped or just plays once. + */ + override public function addAnimation(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true):Void + { + super.addAnimation(Name, Frames, FrameRate, Looped); + + animated=true; + } + + public function fire(fromX:Int, fromY:Int, velX:Int, velY:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + acceleration.x=xAcceleration + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + acceleration.y=yAcceleration + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + } + else + { + velocity.x=velX + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + velocity.y=velY + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + } + + postFire(); + } + + public function fireAtMouse(fromX:Int, fromY:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsMouse(this, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsMouse(this, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireAtPosition(fromX:Int, fromY:Int, toX:Int, toY:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsPoint(this, new FlxPoint(toX, toY), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsPoint(this, new FlxPoint(toX, toY), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireAtTarget(fromX:Int, fromY:Int, target:FlxSprite, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsObject(this, target, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsObject(this, target, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireFromAngle(fromX:Int, fromY:Int, fireAngle:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + var newVelocity:FlxPoint=FlxVelocity.velocityFromAngle(fireAngle + FlxMath.rand(-weapon.rndFactorAngle, weapon.rndFactorAngle), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + + if(accelerates) + { + acceleration.x=newVelocity.x; + acceleration.y=newVelocity.y; + } + else + { + velocity.x=newVelocity.x; + velocity.y=newVelocity.y; + } + + postFire(); + } + + private function postFire():Void + { + if(animated) + { + play("fire"); + } + + if(weapon.bulletElasticity>0) + { + elasticity=weapon.bulletElasticity; + } + + exists=true; + + launchTime=getTimer(); + + if(weapon.bulletLifeSpan>0) + { + lifespan=weapon.bulletLifeSpan + FlxMath.rand(-weapon.rndFactorLifeSpan, weapon.rndFactorLifeSpan); + expiresTime=getTimer()+ lifespan; + } + + if(weapon.onFireCallback is Function) + { + weapon.onFireCallback.apply(); + } + + if(weapon.onFireSound) + { + weapon.onFireSound.play(); + } + } + + public var xGravity(null, set_xGravity):Int; + private function set_xGravity(gx:Int):Void + { + acceleration.x=gx; + } + + public var yGravity(null, set_yGravity):Int; + private function set_yGravity(gy:Int):Void + { + acceleration.y=gy; + } + + public var maxVelocityX(null, set_maxVelocityX):Int; + private function set_maxVelocityX(mx:Int):Void + { + maxVelocity.x=mx; + } + + public var maxVelocityY(null, set_maxVelocityY):Int; + private function set_maxVelocityY(my:Int):Void + { + maxVelocity.y=my; + } + + override public function update():Void + { + if(lifespan>0 && getTimer()>expiresTime) + { + kill(); + } + + if(FlxMath.pointInFlxRect(x, y, weapon.bounds)==false) + { + kill(); + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx new file mode 100644 index 0000000..bd5077a --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx @@ -0,0 +1,94 @@ +package org.flixel.plugin.photonstorm.BaseTypes +{ +import org.flixel.*; +import org.flixel.plugin.photonstorm.FlxExtendedSprite; + +class MouseSpring +{ + public var sprite:FlxExtendedSprite; + + /** + * The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @default 0.1 + */ + public var tension:Float=0.1; + + /** + * The friction applied to the spring as it moves + * @default 0.95 + */ + public var friction:Float=0.95; + + /** + * The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + * @default 0 + */ + public var gravity:Float=0; + + private var retainVelocity:Bool=false; + + private var vx:Float=0; + private var vy:Float=0; + + private var dx:Float=0; + private var dy:Float=0; + + private var ax:Float=0; + private var ay:Float=0; + + /** + * Adds a spring between the mouse and a Sprite. + * + * @param sprite The FlxExtendedSprite to which this spring is attached + * @param retainVelocity true to retain the velocity of the spring when the mouse is released, or false to clear it + * @param tension The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @param friction The friction applied to the spring as it moves + * @param gravity The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + */ + public function new(sprite:FlxExtendedSprite, retainVelocity:Bool=false, tension:Float=0.1, friction:Float=0.95, gravity:Float=0) + { + this.sprite=sprite; + this.retainVelocity=retainVelocity; + this.tension=tension; + this.friction=friction; + this.gravity=gravity; + } + + /** + * Updates the spring physics and repositions the sprite + */ + public function update():Void + { + dx=FlxG.mouse.x - sprite.springX; + dy=FlxG.mouse.y - sprite.springY; + + ax=dx * tension; + ay=dy * tension; + + vx +=ax; + vy +=ay; + + vy +=gravity; + vx *=friction; + vy *=friction; + + sprite.x +=vx; + sprite.y +=vy; + } + + /** + * Resets the Internal spring physics + */ + public function reset():Void + { + vx=0; + vy=0; + + dx=0; + dy=0; + + ax=0; + ay=0; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BaseFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BaseFX.hx new file mode 100644 index 0000000..085fe84 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BaseFX.hx @@ -0,0 +1,110 @@ +/** + * BaseFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Fixed some documentation + * v1.0 First release + * + * @version 1.1 - June 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.FlxSprite; +import flash.display.BitmapData; + +class BaseFX +{ + /** + * Set to false to stop this effect being updated by the FlxSpecialFX Plugin. Set to true to enable. + */ + public var active:Bool; + + /** + * The FlxSprite Into which the effect is drawn. Add this to your FlxState / FlxGroup to display the effect. + */ + public var sprite:FlxSprite; + + /** + * A scratch bitmapData used to build-up the effect before passing to sprite.pixels + */ + private var canvas:BitmapData; + + /** + * A snapshot of the sprite background before the effect is applied + */ + private var back:BitmapData; + + private var image:BitmapData; + private var sourceRef:FlxSprite; + private var updateFromSource:Bool; + private var clsRect:Rectangle; + private var clsPoint:Point; + private var clsColor:Int; + + // For staggered drawing updates + private var updateLimit:Int=0; + private var lastUpdate:Int=0; + private var ready:Bool=false; + + private var copyRect:Rectangle; + private var copyPoint:Point; + + public function new() + { + active=false; + } + + /** + * Starts the effect runnning + * + * @param delay How many "game updates" should pass between each update? If your game runs at 30fps a value of 0 means it will do 30 updates per second. A value of 1 means it will do 15 updates per second, etc. + */ + public function start(delay:Int=0):Void + { + updateLimit=delay; + lastUpdate=0; + ready=true; + } + + /** + * Pauses the effect from running. The draw function is still called each loop, but the pixel data is stopped from updating.
+ * To disable the SpecialFX Plugin from calling the FX at all set the "active" parameter to false. + */ + public function stop():Void + { + ready=false; + } + + public function destroy():Void + { + if(sprite) + { + sprite.kill(); + } + + if(canvas) + { + canvas.dispose(); + } + + if(back) + { + back.dispose(); + } + + if(image) + { + image.dispose(); + } + + sourceRef=null; + + active=false; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BlurFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BlurFX.hx new file mode 100644 index 0000000..3079576 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/BlurFX.hx @@ -0,0 +1,133 @@ +/** + * BlurFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - June 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import flash.filters.BlurFilter; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a blur effect + */ +class BlurFX extends BaseFX +{ + private var objects:Array; + private var blurFilter:BlurFilter; + + public function new() + { + } + + /** + * Creates a new BlurFX the given width/height in size.
+ * The blur X / Y / Quality parameters all control the strength of the effect.
+ * Add the resulting FlxSprite to your display to see the effect. + * + * @param width The width(in pixels)of the resulting FlxSprite containing the Blur effect + * @param height The height(in pixels)of the resulting FlxSprite containing the Blur effect + * @param blurX The amount of horizontal blur. + * @param blurY The amount of vertical blur. + * @param blurQuality The number of times to perform the blur. Default is 1(fastest, single pass)up to a maxium of 15(very VERY expensive!) + * + * @return An FlxSprite containing the updating blur effect + */ + public function create(width:Int, height:Int, blurX:Float, blurY:Float, blurQuality:Int=1):FlxSprite + { + sprite=new FlxSprite(0, 0).makeGraphic(width, height, 0x0, true); + + objects=new Array; + + blurFilter=new BlurFilter(blurX, blurY, blurQuality); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, width, height); + + return sprite; + } + + /** + * Adds an FlxSprite to the BlurFX. Every loop this sprite will be drawn to the FX and then blurred if the FlxSprite is both onScreen()and visible. + * + * @param source The FlxSprite to add to the blur effect + * @param autoRemove If true and the FlxSprite.exists value ever equals false then BlurFX will automatically remove it + */ + public function addSprite(source:FlxSprite, autoRemove:Bool=true):Void + { + objects.push({ sprite:source, autoRemove:autoRemove }); + + if(active==false) + { + active=true; + } + } + + /** + * Removes the FlxSprite from the effect + * + * @param source The FlxSprite to remove from the blur effect + */ + public function removeSprite(source:FlxSprite):Void + { + for(i in 0...objects.length) + { + if(objects[i].sprite==source) + { + objects.splice(i, 1); + break; + } + } + } + + public function draw():Void + { + if(ready) + { + // Write every object to the canvas + for(var obj:Dynamic in objects) + { + // Removal check + if(obj.sprite.exists==false) + { + removeSprite(obj.sprite); + } + else + { + if(obj.sprite.visible && obj.sprite.onScreen()) + { + sprite.stamp(obj.sprite, obj.sprite.x, obj.sprite.y); + } + } + } + + // We'll use the update timer to control how often the blur is run, not how often the objects are drawn + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + // Then blur it + sprite.pixels.applyFilter(sprite.pixels, copyRect, copyPoint, blurFilter); + + lastUpdate=0; + + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx new file mode 100644 index 0000000..9b99969 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx @@ -0,0 +1,249 @@ +/** + * CenterSlideFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Refactored main loop a little and added reverse function + * v1.0 First release + * + * @version 1.1 - June 13th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Makes an image expand or collapse from its center + */ +class CenterSlideFX extends BaseFX +{ + /** + * True when the effect has completed. False while the effect is running. + */ + public var complete:Bool; + + /** + * A function that is called once the effect is has finished running and is complete + */ + public var completeCallback:Function; + + private var pixels:Int; + private var direction:Int; + + private var sideA:Rectangle; + private var sideB:Rectangle; + private var pointA:Point; + private var pointB:Point; + + public static inline var REVEAL_VERTICAL:Int=0; + public static inline var REVEAL_HORIZONTAL:Int=1; + public static inline var HIDE_VERTICAL:Int=2; + public static inline var HIDE_HORIZONTAL:Int=3; + + public function new() + { + } + + /** + * Creates a new CenterSlide effect from the given FlxSprite. The original sprite remains unmodified.
+ * The resulting FlxSprite will take on the same width / height and x/y coordinates of the source FlxSprite. + * + * @param source The FlxSprite providing the image data for this effect. The resulting FlxSprite takes on the source width, height and x/y position. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromFlxSprite(source:FlxSprite, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create(source.pixels, source.x, source.y, direction, pixels, backgroundColor); + } + + /** + * Creates a new CenterSlide effect from the given Class(which must contain a Bitmap)usually from an Embedded bitmap. + * + * @param source The Class providing the bitmapData for this effect, usually from an Embedded bitmap. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromClass(source:Class, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create((new source).bitmapData, x, y, direction, pixels, backgroundColor); + } + + /** + * Creates a new CenterSlide effect from the given bitmapData. + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromBitmapData(source:BitmapData, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create(source, x, y, direction, pixels, backgroundColor); + } + + private function create(source:BitmapData, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(source.width, source.height, backgroundColor); + + canvas=new BitmapData(source.width, source.height, true, backgroundColor); + + image=source.clone(); + + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + clsColor=backgroundColor; + + this.direction=direction; + this.pixels=pixels; + + var midway:Int=Std.int(source.height / 2); + + switch(direction) + { + case REVEAL_VERTICAL: + sideA=new Rectangle(0, 0, source.width, pixels); + sideB=new Rectangle(0, source.height - pixels, source.width, pixels); + pointA=new Point(0, midway); + pointB=new Point(0, midway); + break; + + case REVEAL_HORIZONTAL: + midway=Std.int(source.width / 2); + sideA=new Rectangle(0, 0, pixels, source.height); + sideB=new Rectangle(source.width - pixels, 0, pixels, source.height); + pointA=new Point(midway, 0); + pointB=new Point(midway, 0); + break; + + case HIDE_VERTICAL: + canvas=image.clone(); + sprite.pixels=canvas; + sprite.dirty=true; + sideA=new Rectangle(0, 0, source.width, midway); + sideB=new Rectangle(0, midway, source.width, source.height - midway); + pointA=new Point(0, 0); + pointB=new Point(0, midway); + break; + + case HIDE_HORIZONTAL: + canvas=image.clone(); + sprite.pixels=canvas; + sprite.dirty=true; + midway=Std.int(source.width / 2); + sideA=new Rectangle(0, 0, midway, source.height); + sideB=new Rectangle(midway, 0, source.width - midway, source.height); + pointA=new Point(0, 0); + pointB=new Point(midway, 0); + break; + } + + active=true; + complete=false; + + return sprite; + } + + public function reverse():Void + { + if(direction==REVEAL_VERTICAL) + { + direction=HIDE_VERTICAL; + complete=false; + } + else if(direction==REVEAL_HORIZONTAL) + { + direction=HIDE_HORIZONTAL; + complete=false; + } + } + + public function draw():Void + { + if(ready && complete==false) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + canvas.fillRect(clsRect, clsColor); + canvas.copyPixels(image, sideA, pointA, null, null, true); + canvas.copyPixels(image, sideB, pointB, null, null, true); + + switch(direction) + { + case REVEAL_VERTICAL: + sideA.height +=pixels; + pointA.y -=pixels; + sideB.height +=pixels; + sideB.y -=pixels; + break; + + case REVEAL_HORIZONTAL: + sideA.width +=pixels; + pointA.x -=pixels; + sideB.width +=pixels; + sideB.x -=pixels; + break; + + case HIDE_VERTICAL: + sideA.height -=pixels; + pointA.y +=pixels; + sideB.height -=pixels; + sideB.y +=pixels; + break; + + case HIDE_HORIZONTAL: + sideA.width -=pixels; + pointA.x +=pixels; + sideB.width -=pixels; + sideB.x +=pixels; + break; + } + + // Are we finished? + if((direction==REVEAL_VERTICAL && pointA.y<0)||(direction==REVEAL_HORIZONTAL && pointA.x<0)) + { + canvas=image.clone(); + complete=true; + } + else if((direction==HIDE_VERTICAL && sideA.height<=0)||(direction==HIDE_HORIZONTAL && sideA.width<=0)) + { + canvas.fillRect(clsRect, clsColor); + complete=true; + } + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + + if(complete && completeCallback is Function) + { + completeCallback.call(); + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx new file mode 100644 index 0000000..1d8a1a2 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx @@ -0,0 +1,128 @@ +/** + * FloodFillFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Renamed - was "DropDown", but now a more accurate "flood fill" + * v1.0 First release + * + * @version 1.1 - May 31st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a flood fill effect FlxSprite, useful for bringing in images in cool ways + */ +class FloodFillFX extends BaseFX +{ + private var complete:Bool; + private var chunk:Int; + private var offset:Int; + private var dropDirection:Int; + private var dropRect:Rectangle; + private var dropPoint:Point; + private var dropY:Int; + + public function new() + { + } + + /** + * Creates a new Flood Fill effect from the given image + * + * @param source The source image bitmapData to use for the drop + * @param x The x coordinate to place the resulting effect sprite + * @param y The y coordinate to place the resulting effect sprite + * @param width The width of the resulting effet sprite. Doesn't have to match the source image + * @param height The height of the resulting effet sprite. Doesn't have to match the source image + * @param direction 0=Top to bottom. 1=Bottom to top. 2=Left to Right. 3=Right to Left. + * @param pixels How many pixels to drop per update(default 1) + * @param split Boolean(default false)- if split it will drop from opposite sides at the same time + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect ready to run in it + */ + public function create(source:FlxSprite, x:Int, y:Int, width:Int, height:Int, direction:Int=0, pixels:Int=1, split:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, backgroundColor); + + canvas=new BitmapData(width, height, true, backgroundColor); + + if(source.pixels.width !=width || source.pixels.height !=height) + { + image=new BitmapData(width, height, true, backgroundColor); + image.copyPixels(source.pixels, new Rectangle(0, 0, source.pixels.width, source.pixels.height), new Point(0, height - source.pixels.height)); + } + else + { + image=source.pixels; + } + + offset=pixels; + + dropDirection=direction; + dropRect=new Rectangle(0, canvas.height - offset, canvas.width, offset); + dropPoint=new Point(0, 0); + dropY=canvas.height; + + active=true; + + return sprite; + } + + public function draw():Void + { + if(ready && complete==false) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + canvas.lock(); + + switch(dropDirection) + { + // Dropping Down + case 0: + + // Get a pixel strip from the picture(starting at the bottom and working way up) + for(y in 0...dropY +=offset) + { + dropPoint.y=y; + canvas.copyPixels(image, dropRect, dropPoint); + } + + dropY -=offset; + + dropRect.y -=offset; + + if(dropY<=0) + { + complete=true; + } + + break; + } + + lastUpdate=0; + + canvas.unlock(); + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/GlitchFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/GlitchFX.hx new file mode 100644 index 0000000..5e88bda --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/GlitchFX.hx @@ -0,0 +1,119 @@ +/** + * GlitchFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.2 Fixed updateFromSource github issue #8(thanks CoderBrandon) + * v1.1 Added changeGlitchValues support + * v1.0 First release + * + * @version 1.2 - August 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a static / glitch / monitor-corruption style effect on an FlxSprite + * + * + * + * Add reduction from really high glitch value down to zero, will smooth the image Into place and look cool:) + * Add option to glitch vertically? + * + */ +class GlitchFX extends BaseFX +{ + private var glitchSize:Int; + private var glitchSkip:Int; + + public function new() + { + } + + public function createFromFlxSprite(source:FlxSprite, maxGlitch:Int, maxSkip:Int, autoUpdate:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(source.x, source.y).makeGraphic(source.width + maxGlitch, source.height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + image=source.pixels; + + updateFromSource=autoUpdate; + + if(updateFromSource) + { + sourceRef=source; + } + + glitchSize=maxGlitch; + glitchSkip=maxSkip; + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, image.width, 1); + + active=true; + + return sprite; + } + + public function changeGlitchValues(maxGlitch:Int, maxSkip:Int):Void + { + glitchSize=maxGlitch; + glitchSkip=maxSkip; + } + + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var rndSkip:Int=1 + Std.int(Math.random()* glitchSkip); + + copyRect.y=0; + copyPoint.y=0; + copyRect.height=rndSkip; + + for(y in 0...sprite.height +=rndSkip) + { + copyPoint.x=Std.int(Math.random()* glitchSize); + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=rndSkip; + copyPoint.y +=rndSkip; + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx new file mode 100644 index 0000000..bbb8e5b --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx @@ -0,0 +1,170 @@ +/** + * PlasmaFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.4 Moved to the new Special FX Plugins + * v1.3 Colours updated to include alpha values + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - May 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a plasma effect FlxSprite + */ + +class PlasmaFX extends BaseFX +{ + //private var pos1:Int; + //private var pos2:Int; + //private var pos3:Int; + //private var pos4:Int; + + public var pos1:Int; + public var pos2:Int; + public var pos3:Int; + public var pos4:Int; + public var depth:Int=128; + + private var tpos1:Int; + private var tpos2:Int; + private var tpos3:Int; + private var tpos4:Int; + + private var aSin:Array; + //private var previousColour:Int; + private var colours:Array; + private var step:Int=0; + private var span:Int; + + public function new():Void + { + } + + public function create(x:Int, y:Int, width:Int, height:Int, scaleX:Int=1, scaleY:Int=1):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + if(scaleX !=1 || scaleY !=1) + { + sprite.scale=new FlxPoint(scaleX, scaleY); + sprite.x +=width / scaleX; + sprite.y +=height / scaleY; + } + + canvas=new BitmapData(width, height, true, 0x0); + + colours=FlxColor.getHSVColorWheel(); + + //colours=FlxColor.getHSVColorWheel(140); // now supports alpha:) + //colours=FlxGradient.createGradientArray(1, 360, [0xff000000, 0xff000000, 0xff000000, 0x00000000, 0xff000000], 2); // Lovely black reveal for over an image + //colours=FlxGradient.createGradientArray(1, 360, [0xff0000FF, 0xff000000, 0xff8F107C, 0xff00FFFF, 0xff0000FF], 1);// lovely purple black blue thingy + + span=colours.length - 1; + + aSin=new Array(512); + + for(i in 0...512) + { + //var rad:Float=(i * 0.703125)* 0.0174532; + var rad:Float=(i * 0.703125)* 0.0174532; + + // Any power of 2! + // http://www.vaughns-1-pagers.com/computer/powers-of-2.htm + // 256, 512, 1024, 2048, 4096, 8192, 16384 + aSin[i]=Math.sin(rad)* 1024; + + //aSin[i]=Math.cos(rad)* 1024; + } + + active=true; + + tpos1=293; + tpos2=483; + tpos3=120; + tpos4=360; + + pos1=0; + pos2=5; + pos3=0; + pos4=0; + + return sprite; + } + + public function draw():Void + { + if(step<10) + { + //trace(step, tpos1, tpos2, tpos3, tpos4, pos1, pos2, pos3, pos4, index); + step++; + } + + tpos4=pos4; + tpos3=pos3; + + canvas.lock(); + + for(y in 0...canvas.height) + { + tpos1=pos1 + 5; + tpos2=pos2 + 3; + + //tpos1=pos1; + //tpos2=pos2; + + tpos2 &=511; + tpos3 &=511; + + for(x in 0...canvas.width) + { + tpos1 &=511; + tpos2 &=511; + + var x2:Int=aSin[tpos1] + aSin[tpos2] + aSin[tpos3] + aSin[tpos4]; + + //var index:Int=depth +(x2>>4); + var index:Int=depth +(x2>>4); + //p=(128 +(p>>4))& 255; + + + if(index<=0) + { + index +=span; + } + + if(index>=span) + { + index -=span; + } + + canvas.setPixel32(x, y, colours[index]); + + tpos1 +=5; + tpos2 +=3; + } + + tpos3 +=1; + tpos4 +=3; + } + + canvas.unlock(); + + sprite.pixels=canvas; + sprite.dirty=true; + + pos1 +=4; // horizontal shift + pos3 +=2; // vertical shift + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx new file mode 100644 index 0000000..679bd6c --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx @@ -0,0 +1,260 @@ +/** + * RainbowLineFX - A Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 Built Into the new FlxSpecialFX system + * + * @version 1.0 - May 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxGradient, FlxMath +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a Rainbow Line Effect - typically a rainbow sequence of color values passing through a 1px high line + */ +class RainbowLineFX extends BaseFX +{ + private var lineColors:Array; + private var maxColor:Int; + private var currentColor:Int; + private var fillRect:Rectangle; + private var speed:Int; + private var chunk:Int; + private var direction:Int; + private var setPixel:Bool; + + public function new() + { + } + + /** + * Creates a Color Line FlxSprite. + * + * @param x The x coordinate of the FlxSprite in game world pixels + * @param y The y coordinate of the FlxSprite in game world pixels + * @param width The width of the FlxSprite in pixels + * @param height The height of the FlxSprite in pixels + * @param colors An Array of color values used to create the line. If null(default)the HSV Color Wheel is used, giving a full spectrum rainbow effect + * @param colorWidth The width of the color range controls how much Interpolation occurs between each color in the colors array(default 360) + * @param colorSpeed The speed at which the Rainbow Line cycles through its colors(default 1) + * @param stepSize The size of each "chunk" of the Rainbow Line - use a higher value for a more retro look(default 1) + * @param fadeWidth If you want the Line to fade from fadeColor to the first color in the colors array, and then out again, set this value to the amount of transition you want(128 looks good) + * @param fadeColor The default fade color is black, but if you need to alpha it, or change for a different color, set it here + * + * @return An FlxSprite which automatically updates each draw()to cycle the colors through it + */ + public function create(x:Int, y:Int, width:Int, height:Int=1, colors:Array=null, colorWidth:Int=360, colorSpeed:Int=1, stepSize:Int=1, fadeWidth:Int=128, fadeColor:Int=0xff000000):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + canvas=new BitmapData(width, height, true, 0x0); + + if(Std.is(colors, Array)) + { + lineColors=FlxGradient.createGradientArray(1, colorWidth, colors); + } + else + { + lineColors=FlxColor.getHSVColorWheel(); + } + + currentColor=0; + maxColor=lineColors.length - 1; + + if(fadeWidth !=0) + { + var blackToFirst:Array=FlxGradient.createGradientArray(1, fadeWidth, [ fadeColor, fadeColor, fadeColor, lineColors[0] ]); + var lastToBlack:Array=FlxGradient.createGradientArray(1, fadeWidth, [ lineColors[maxColor], fadeColor, fadeColor, fadeColor, fadeColor ]); + + var fadingColours:Array=blackToFirst.concat(lineColors); + fadingColours=fadingColours.concat(lastToBlack); + + lineColors=fadingColours; + + maxColor=lineColors.length - 1; + } + + direction=0; + setPixel=false; + speed=colorSpeed; + chunk=stepSize; + fillRect=new Rectangle(0, 0, chunk, height); + + if(height==1 && chunk==1) + { + setPixel=true; + } + + active=true; + + return sprite; + } + + /** + * Change the colors cycling through the line by passing in a new array of color values + * + * @param colors An Array of color values used to create the line. If null(default)the HSV Color Wheel is used, giving a full spectrum rainbow effect + * @param colorWidth The width of the color range controls how much Interpolation occurs between each color in the colors array(default 360) + * @param resetCurrentColor If true the color pointer is returned to the start of the new color array, otherwise remains where it is + * @param fadeWidth If you want the Rainbow Line to fade from black to the first color in the colors array, and then out again, set this value to the amount of transition you want(128 looks good) + * @param fadeColor The default fade color is black, but if you need to alpha it, or change for a different color, set it here + */ + public function updateColors(colors:Array, colorWidth:Int=360, resetCurrentColor:Bool=false, fadeWidth:Int=128, fadeColor:Int=0xff000000):Void + { + if(Std.is(colors, Array)) + { + lineColors=FlxGradient.createGradientArray(1, colorWidth, colors); + } + else + { + lineColors=FlxColor.getHSVColorWheel(); + } + + maxColor=lineColors.length - 1; + + if(fadeWidth !=0) + { + var blackToFirst:Array=FlxGradient.createGradientArray(1, fadeWidth, [ 0xff000000, 0xff000000, 0xff000000, lineColors[0] ]); + var lastToBlack:Array=FlxGradient.createGradientArray(1, fadeWidth, [ lineColors[maxColor], 0xff000000, 0xff000000, 0xff000000, 0xff000000 ]); + + var fadingColours:Array=blackToFirst.concat(lineColors); + fadingColours=fadingColours.concat(lastToBlack); + + lineColors=fadingColours; + + maxColor=lineColors.length - 1; + } + + if(currentColor>maxColor || resetCurrentColor) + { + currentColor=0; + } + } + + /** + * Doesn't need to be called directly as it's called by the FlxSpecialFX Plugin.
+ * Set active to false if you wish to disable the effect.
+ * Pass the effect to FlxSpecialFX.erase()if you wish to destroy this effect. + */ + public function draw():Void + { + canvas.lock(); + + fillRect.x=0; + + for(x in 0...canvas.width=x + chunk) + { + var c:Int=FlxMath.wrapValue(currentColor + x, 1, maxColor); + + if(setPixel) + { + canvas.setPixel32(x, 0, lineColors[c]); + } + else + { + canvas.fillRect(fillRect, lineColors[c]); + fillRect.x +=chunk; + } + } + + canvas.unlock(); + + if(direction==0) + { + currentColor +=speed; + + if(currentColor>=maxColor) + { + currentColor=0; + } + } + else + { + currentColor -=speed; + + if(currentColor<0) + { + currentColor=maxColor; + } + } + + sprite.pixels=canvas; + sprite.dirty=true; + } + + /** + * Set the speed at which the Line cycles through its colors + */ + private function set_colorSpeed(value:Int):Void + { + if(value0) + { + canvas.fillRect(new Rectangle(0, 0, canvas.width, canvas.height), 0x0); + chunk=value; + + fillRect.x=0; + fillRect.width=chunk; + + if(value>1) + { + setPixel=false; + } + else + { + setPixel=true; + } + } + } + + /** + * The size of each "chunk" of the Line + */ + public var stepSize(get_stepSize, set_stepSize):Int; + private function get_stepSize():Int + { + return chunk; + } + + /** + * Changes the color cycle direction. + * + * @param newDirection 0=Colors cycle incrementally(line looks like it is moving to the left), 1=Colors decrement(line moves to the right) + */ + public function setDirection(newDirection:Int):Void + { + if(newDirection==0 || newDirection==1) + { + direction=newDirection; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RevealFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RevealFX.hx new file mode 100644 index 0000000..f130486 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/RevealFX.hx @@ -0,0 +1,113 @@ +/** + * RevealFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Added changeGlitchValues support + * v1.0 First release + * + * @version 1.1 - June 13th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a static / glitch / monitor-corruption style effect on an FlxSprite + * + * + * + * Add reduction from really high glitch value down to zero, will smooth the image Into place and look cool:) + * Add option to glitch vertically? + * + */ +class RevealFX extends BaseFX +{ + private var glitchSize:Int; + private var glitchSkip:Int; + + public function new() + { + } + + public function createFromFlxSprite(source:FlxSprite, maxGlitch:Int, maxSkip:Int, autoUpdate:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(source.x, source.y).makeGraphic(source.width + maxGlitch, source.height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + image=source.pixels; + + updateFromSource=autoUpdate; + + glitchSize=maxGlitch; + glitchSkip=maxSkip; + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, image.width, 1); + + active=true; + + return sprite; + } + + public function changeGlitchValues(maxGlitch:Int, maxSkip:Int):Void + { + glitchSize=maxGlitch; + glitchSkip=maxSkip; + } + + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var rndSkip:Int=1 + Std.int(Math.random()* glitchSkip); + + copyRect.y=0; + copyPoint.y=0; + copyRect.height=rndSkip; + + for(y in 0...sprite.height +=rndSkip) + { + copyPoint.x=Std.int(Math.random()* glitchSize); + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=rndSkip; + copyPoint.y +=rndSkip; + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx new file mode 100644 index 0000000..6e9157a --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx @@ -0,0 +1,329 @@ +/** + * SineWaveFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - May 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a sine-wave effect through an FlxSprite which can be applied vertically or horizontally + */ +class SineWaveFX extends BaseFX +{ + private var waveType:Int; + private var waveVertical:Bool; + private var waveLength:Int; + private var waveSize:Int; + private var waveFrequency:Float; + private var wavePixelChunk:Int; + private var waveData:Array; + private var waveDataCounter:Int=0; + private var waveLoopCallback:Function; + + public static inline var WAVETYPE_VERTICAL_SINE:Int=0; + public static inline var WAVETYPE_VERTICAL_COSINE:Int=1; + public static inline var WAVETYPE_HORIZONTAL_SINE:Int=2; + public static inline var WAVETYPE_HORIZONTAL_COSINE:Int=3; + + public function new() + { + } + + /** + * Creates a new SineWaveFX Effect from the given FlxSprite. The original sprite remains unmodified.
+ * The resulting FlxSprite will take on the same width / height and x/y coordinates of the source FlxSprite.
+ * For really cool effects you can SineWave an FlxSprite that is constantly updating(either through animation or an FX chain). + * + * @param source The FlxSprite providing the image data for this effect. The resulting FlxSprite takes on the source width, height, x/y positions and scrollfactor. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param updateFrame When this effect is created it takes a copy of the source image data and stores it. Set this to true to grab a new copy of the image data every frame. + * @param backgroundColor The background color(0xAARRGGBB format)to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromFlxSprite(source:FlxSprite, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, updateFrame:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create(source.pixels, source.x, source.y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=updateFrame; + + if(updateFromSource) + { + sourceRef=source; + } + + return result; + } + + /** + * Creates a new SineWaveFX Effect from the given Class(which must contain a Bitmap).
+ * If you need to update the source data at run-time then use createFromFlxSprite + * + * @param source The Class providing the bitmapData for this effect, usually from an Embedded bitmap. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromClass(source:Class, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create((new source).bitmapData, x, y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=false; + + return result; + } + + /** + * Creates a new SineWaveFX Effect from the given bitmapData.
+ * If you need to update the source data at run-time then use createFromFlxSprite + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromBitmapData(source:BitmapData, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create(source, x, y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=false; + + return result; + } + + /** + * Internal function fed from createFromFlxSprite / createFromClass / createFromBitmapData + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + private function create(source:BitmapData, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + if(type==WAVETYPE_VERTICAL_SINE || type==WAVETYPE_VERTICAL_COSINE) + { + waveVertical=true; + + if(pixelsPerChunk>=source.width) + { + throw new Dynamic("SineWaveFX:pixelsPerChunk cannot be>=source.width with WAVETYPE_VERTICAL"); + } + } + else if(type==WAVETYPE_HORIZONTAL_SINE || type==WAVETYPE_HORIZONTAL_COSINE) + { + waveVertical=false; + + if(pixelsPerChunk>=source.height) + { + throw new Dynamic("SineWaveFX:pixelsPerChunk cannot be>=source.height with WAVETYPE_HORIZONTAL"); + } + } + + updateWaveData(type, size, length, frequency, pixelsPerChunk); + + // The FlxSprite Into which the sine-wave effect is drawn + + if(waveVertical) + { + sprite=new FlxSprite(x, y).makeGraphic(source.width, source.height +(waveSize * 3), backgroundColor); + } + else + { + sprite=new FlxSprite(x, y).makeGraphic(source.width +(waveSize * 3), source.height, backgroundColor); + } + + // The scratch bitmapData where we prepare the final sine-waved image + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + // Our local copy of the sprite image data + image=source.clone(); + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + + if(waveVertical) + { + copyRect=new Rectangle(0, 0, wavePixelChunk, image.height); + } + else + { + copyRect=new Rectangle(0, 0, image.width, wavePixelChunk); + } + + active=true; + + return sprite; + } + + /** + * Update the SineWave data without modifying the source image being used.
+ * This call is fast enough that you can modify it in real-time. + * + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + */ + public function updateWaveData(type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1):Void + { + if(type>WAVETYPE_HORIZONTAL_COSINE) + { + throw new Dynamic("SineWaveFX:Invalid WAVETYPE"); + } + + if(FlxMath.isOdd(frequency)) + { + throw new Dynamic("SineWaveFX:frequency must be an even number"); + } + + waveType=type; + waveSize=uint(size * 0.5); + waveLength=uint(length / pixelsPerChunk); + waveFrequency=frequency; + wavePixelChunk=pixelsPerChunk; + waveData=FlxMath.sinCosGenerator(waveLength, waveSize, waveSize, waveFrequency); + + if(waveType==WAVETYPE_VERTICAL_COSINE || waveType==WAVETYPE_HORIZONTAL_COSINE) + { + waveData=FlxMath.getCosTable(); + } + } + + /** + * Use this to set a function to be called every time the wave has completed one full cycle.
+ * Set to null to remove any previous callback. + * + * @param callback The function to call every time the wave completes a full cycle(duration will vary based on waveLength) + */ + public function setLoopCompleteCallback(callback:Function):Void + { + waveLoopCallback=callback; + } + + /** + * Called by the FlxSpecialFX plugin. Should not be called directly. + */ + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var s:Int=0; + + copyRect.x=0; + copyRect.y=0; + + if(waveVertical) + { + for(x in 0...image.width +=wavePixelChunk) + { + copyPoint.x=x; + copyPoint.y=waveSize +(waveSize / 2)+ waveData[s]; + + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.x +=wavePixelChunk; + + s++; + } + } + else + { + for(y in 0...image.height +=wavePixelChunk) + { + copyPoint.x=waveSize +(waveSize / 2)+ waveData[s]; + copyPoint.y=y; + + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=wavePixelChunk; + + s++; + } + } + + // Cycle through the wave data - this is what causes the image to "undulate" + var t:Float=waveData.shift(); + waveData.push(t); + + waveDataCounter++; + + if(waveDataCounter==waveData.length) + { + waveDataCounter=0; + + if(Std.is(waveLoopCallback, Function)) + { + waveLoopCallback.call(); + } + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + + public function toString():String + { + var output:Array=[ "Type:" + waveType, "Size:" + waveSize, "Length:" + waveLength, "Frequency:" + waveFrequency, "Chunks:" + wavePixelChunk, "clsRect:" + clsRect ]; + + return output.join(","); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx new file mode 100644 index 0000000..da116fa --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx @@ -0,0 +1,283 @@ +/** + * StarfieldFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 StarField moved to the FX Plugin system + * v1.0 First release + * + * @version 1.1 - May 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.getTimer; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a 2D or 3D Star Field effect on an FlxSprite for use in your game. + */ +class StarfieldFX extends BaseFX +{ + /** + * In a 3D starfield this controls the X coordinate the stars emit from, can be updated in real-time! + */ + public var centerX:Int; + + /** + * In a 3D starfield this controls the Y coordinate the stars emit from, can be updated in real-time! + */ + public var centerY:Int; + + /** + * How much to shift on the X axis every update. Negative values move towards the left, positiive to the right. 2D Starfield only. Can also be set via setStarSpeed() + */ + public var starXOffset:Float=-1; + + /** + * How much to shift on the Y axis every update. Negative values move up, positiive values move down. 2D Starfield only. Can also be set via setStarSpeed() + */ + public var starYOffset:Float=0; + + private var stars:Array; + private var starfieldType:Int; + + private var backgroundColor:Int=0xff000000; + + private var updateSpeed:Int; + private var tick:Int; + + private var depthColours:Array; + + public static inline var STARFIELD_TYPE_2D:Int=1; + public static inline var STARFIELD_TYPE_3D:Int=2; + + public function new() + { + } + + /** + * Create a new StarField + * + * @param x X coordinate of the starfield sprite + * @param y Y coordinate of the starfield sprite + * @param width The width of the starfield + * @param height The height of the starfield + * @param quantity The number of stars in the starfield(default 200) + * @param type Type of starfield. Either STARFIELD_TYPE_2D(default, stars move horizontally)or STARFIELD_TYPE_3D(stars flow out from the center) + * @param updateInterval How many ms should pass before the next starfield update(default 20) + */ + public function create(x:Int, y:Int, width:Int, height:Int, quantity:Int=200, type:Int=1, updateInterval:Int=20):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + starfieldType=type; + + updateSpeed=speed; + + // Stars come from the middle of the starfield in 3D mode + centerX=width>>1; + centerY=height>>1; + + clsRect=new Rectangle(0, 0, width, height); + clsPoint=new Point; + clsColor=backgroundColor; + + stars=new Array(); + + for(i in 0...quantity) + { + var star:Dynamic=new Dynamic; + + star.index=i; + star.x=Std.int(Math.random()* width); + star.y=Std.int(Math.random()* height); + star.d=1; + + if(type==STARFIELD_TYPE_2D) + { + star.speed=1 + Std.int(Math.random()* 5); + } + else + { + star.speed=Math.random(); + } + + star.r=Math.random()* Math.PI * 2; + star.alpha=0; + + stars.push(star); + } + + // Colours array + if(type==STARFIELD_TYPE_2D) + { + depthColours=FlxGradient.createGradientArray(1, 5, [0xff585858, 0xffF4F4F4]); + } + else + { + depthColours=FlxGradient.createGradientArray(1, 300, [0xff292929, 0xffffffff]); + } + + active=true; + + return sprite; + } + + /** + * Change the background color in the format 0xAARRGGBB of the starfield.
+ * Supports alpha, so if you want a transparent background just pass 0x00 as the color. + * + * @param backgroundColor + */ + public function setBackgroundColor(backgroundColor:Int):Void + { + clsColor=backgroundColor; + } + + /** + * Change the number of layers(depth)and colors used for layer of the starfield. Change happens immediately. + * + * @param depth Number of depths(for a 2D starfield the default is 5) + * @param lowestColor The color given to the stars furthest away from the camera(i.e. the slowest stars), typically the darker colour + * @param highestColor The color given to the stars cloest to the camera(i.e. the fastest stars), typically the brighter colour + */ + public function setStarDepthColors(depth:Int, lowestColor:Int=0xff585858, highestColor:Int=0xffF4F4F4):Void + { + // Depth is the same, we just need to update the gradient then + depthColours=FlxGradient.createGradientArray(1, depth, [lowestColor, highestColor]); + + // Run through the stars array, making sure the depths are all within range + for(var star:Dynamic in stars) + { + star.speed=1 + Std.int(Math.random()* depth); + } + } + + /** + * Sets the direction and speed of the 2D starfield(doesn't apply to 3D)
+ * You can combine both X and Y together to make the stars move on a diagnol + * + * @param xShift How much to shift on the X axis every update. Negative values move towards the left, positiive to the right + * @param yShift How much to shift on the Y axis every update. Negative values move up, positiive values move down + */ + public function setStarSpeed(xShift:Float, yShift:Float):Void + { + starXOffset=xShift; + starYOffset=yShift; + } + + /** + * The current update speed + */ + public var speed(get_speed, set_speed):Int; + private function get_speed():Int + { + return updateSpeed; + } + + /** + * Change the tick Interval on which the update runs. By default the starfield updates once every 20ms. Set to zero to disable totally. + */ + private function set_speed(newSpeed:Int):Void + { + updateSpeed=newSpeed; + } + + private function update2DStarfield():Void + { + for(var star:Dynamic in stars) + { + star.x +=(starXOffset * star.speed); + star.y +=(starYOffset * star.speed); + + canvas.setPixel32(star.x, star.y, depthColours[star.speed - 1]); + + if(star.x>sprite.width) + { + star.x=0; + } + else if(star.x<0) + { + star.x=sprite.width; + } + + if(star.y>sprite.height) + { + star.y=0; + } + else if(star.y<0) + { + star.y=sprite.height; + } + } + } + + private function update3DStarfield():Void + { + for(var star:Dynamic in stars) + { + star.d *=1.1; + star.x=centerX +((Math.cos(star.r)* star.d)* star.speed); + star.y=centerY +((Math.sin(star.r)* star.d)* star.speed); + + star.alpha=star.d * 2; + + if(star.alpha>255) + { + star.alpha=255; + } + + canvas.setPixel32(star.x, star.y, 0xffffffff); + //canvas.setPixel32(star.x, star.y, FlxColor.getColor32(255, star.alpha, star.alpha, star.alpha)); + + if(star.x<0 || star.x>sprite.width || star.y<0 || star.y>sprite.height) + { + star.d=1; + star.r=Math.random()* Math.PI * 2; + star.x=0; + star.y=0; + star.speed=Math.random(); + star.alpha=0; + + stars[star.index]=star; + } + } + } + + public function draw():Void + { + if(getTimer()>tick) + { + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + if(starfieldType==STARFIELD_TYPE_2D) + { + update2DStarfield(); + } + else + { + update3DStarfield(); + } + + canvas.unlock(); + + sprite.pixels=canvas; + + if(updateSpeed>0) + { + tick=getTimer()+ updateSpeed; + } + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx new file mode 100644 index 0000000..19829e0 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx @@ -0,0 +1,304 @@ +/** + * WowCopperFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.4 - May 8th 2011 + * @link http://www.photonstorm.com + * @author Original by Mathew Nolan / Flashtro.com + * @author Ported with permission by Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.Matrix; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a WOW Copper effect FlxSprite + */ + +class WowCopperFX extends BaseFX +{ + private var colors:Array; + private var step:Int=0; + private var span:Int; + + + private var bmp_databg:BitmapData=new BitmapData(1 , 64 , false , 0x00000100); + //private var bmp_objbg:Bitmap=new Bitmap(bmp_databg , PixelSnapping.AUTO , false); + private var bg2:Sprite=new Sprite; + + private var amount:Int=8; + private var tab:Int=0; + private var del:Int=0; + private var max:Int=136; + + public function new():Void + { + } + + public function create(x:Int, y:Int, width:Int, height:Int):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + colors=[0x110011, + 0x220022, + 0x330033, + 0x440044, + 0x550055, + 0x660066, + 0x770077, + 0x880088, + 0x990099, + 0xaa00aa, + 0xbb00bb, + 0xcc00cc, + 0xdd00dd, + 0xee00ee, + 0xff00ff, + 0xff00ff, + 0xee00ee, + 0xdd00dd, + 0xcc00cc, + 0xbb00bb, + 0xaa00aa, + 0x990099, + 0x880088, + 0x770077, + 0x660066, + 0x550055, + 0x440044, + 0x330033, + 0x220022, + 0x110011, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x111100, + 0x222200, + 0x333300, + 0x444400, + 0x555500, + 0x666600, + 0x777700, + 0x888800, + 0x999900, + 0xaaaa00, + 0xbbbb00, + 0xcccc00, + 0xdddd00, + 0xeeee00, + 0xffff00, + 0xffff00, + 0xeeee00, + 0xdddd00, + 0xcccc00, + 0xbbbb00, + 0xaaaa00, + 0x999900, + 0x888800, + 0x777700, + 0x666600, + 0x555500, + 0x444400, + 0x333300, + 0x222200, + 0x111100, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x001111, + 0x002222, + 0x003333, + 0x004444, + 0x005555, + 0x006666, + 0x007777, + 0x008888, + 0x009999, + 0x00aaaa, + 0x00bbbb, + 0x00cccc, + 0x00dddd, + 0x00eeee, + 0x00ffff, + 0x00ffff, + 0x00eeee, + 0x00dddd, + 0x00cccc, + 0x00bbbb, + 0x00aaaa, + 0x009999, + 0x008888, + 0x007777, + 0x006666, + 0x005555, + 0x004444, + 0x003333, + 0x002222, + 0x001111, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x111111, + 0x222222, + 0x333333, + 0x444444, + 0x555555, + 0x666666, + 0x777777, + 0x888888, + 0x999999, + 0xaaaaaa, + 0xbbbbbb, + 0xcccccc, + 0xdddddd, + 0xeeeeee, + 0xffffff, + 0xffffff, + 0xeeeeee, + 0xdddddd, + 0xcccccc, + 0xbbbbbb, + 0xaaaaaa, + 0x999999, + 0x888888, + 0x777777, + 0x666666, + 0x555555, + 0x444444, + 0x333333, + 0x222222, + 0x111111, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001]; + + //canvas=new BitmapData(1, 64 , false , 0x00000100); + canvas=new BitmapData(width, height, true, 0x0); + + active=true; + + return sprite; + } + + public function draw():Void + { + if(step<10) + { + //trace(step, tpos1, tpos2, tpos3, tpos4, pos1, pos2, pos3, pos4, index); + step++; + } + + //canvas.setPixel(0, 31, colors[tab]); + bmp_databg.setPixel(0, 31, colors[tab]); + + del++; + + if(del>=2) + { + bmp_databg.scroll(0, -1); + tab++; + del=0; + } + + if(tab>=colors.length) + { + tab=0; + } + + bg2.graphics.clear(); + + var bbcb:Matrix=new Matrix; + + for(i in 0...max +=amount) + { + bg2.graphics.beginBitmapFill(bmp_databg, bbcb, true, false); + bg2.graphics.moveTo(0, i); + bg2.graphics.lineTo(0, i + amount); + bg2.graphics.lineTo(320, i + amount); + bg2.graphics.lineTo(320, i); + bg2.graphics.endFill(); + bbcb.translate(0, 7); + } + + canvas.draw(bg2); + + sprite.pixels=canvas; + sprite.dirty=true; + + /* + bmp_databg.setPixel(0,31,cols[tab]) + del++ + if(del>=2){ + bmp_databg.scroll(0,-1) + tab++ + del=0 + } + if(tab>=cols.length){ + tab=0 + } + bg2.graphics.clear() + var bbcb=new flash.geom.Matrix(); + for(i in 0...max=amount){ + + + + //m.ty=0 + + bg2.graphics.beginBitmapFill(bmp_databg, bbcb,true,false); + bg2.graphics.moveTo(0, i); + bg2.graphics.lineTo(0, i+amount); + bg2.graphics.lineTo(320, i+amount); + bg2.graphics.lineTo(320, i); + bg2.graphics.endFill(); + bbcb.translate(0,7) + + } + */ + + + //canvas.setPixel32(x, y, colours[index]); + + //sprite.pixels=canvas; + //sprite.dirty=true; + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBar.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBar.hx new file mode 100644 index 0000000..48d2e50 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBar.hx @@ -0,0 +1,658 @@ +/** + * FlxBar + * -- Part of the Flixel Power Tools set + * + * v1.6 Lots of bug fixes, more documentation, 2 new test cases, ability to set currentValue added + * v1.5 Fixed bug in "get percent" function that allows it to work with any value range + * v1.4 Added support for min/max callbacks and "kill on min" + * v1.3 Renamed from FlxHealthBar and made less specific / far more flexible + * v1.2 Fixed colour values for fill and gradient to include alpha + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - October 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +/** + * FlxBar is a quick and easy way to create a graphical bar which can + * be used as part of your UI/HUD, or positioned next to a sprite. It could represent + * a loader, progress or health bar. + */ +class FlxBar extends FlxSprite +{ + private var canvas:BitmapData; + + private var barType:Int; + private var barWidth:Int; + private var barHeight:Int; + + private var parent:Dynamic; + private var parentVariable:String; + + /** + * fixedPosition controls if the FlxBar sprite is at a fixed location on screen, or tracking its parent + */ + public var fixedPosition:Bool=true; + + /** + * The positionOffset controls how far offset the FlxBar is from the parent sprite(if at all) + */ + public var positionOffset:FlxPoint; + + /** + * The minimum value the bar can be(can never be>=max) + */ + private var min:Float; + + /** + * The maximum value the bar can be(can never be<=min) + */ + private var max:Float; + + /** + * How wide is the range of this bar?(max - min) + */ + private var range:Float; + + /** + * What 1% of the bar is equal to in terms of value(range / 100) + */ + private var pct:Float; + + /** + * The current value - must always be between min and max + */ + private var value:Float; + + /** + * How many pixels=1% of the bar(barWidth(or height)/ 100) + */ + public var pxPerPercent:Float; + + private var emptyCallback:Function; + private var emptyBar:BitmapData; + private var emptyBarRect:Rectangle; + private var emptyBarPoint:Point; + private var emptyKill:Bool; + private var zeroOffset:Point=new Point; + + private var filledCallback:Function; + private var filledBar:BitmapData; + private var filledBarRect:Rectangle; + private var filledBarPoint:Point; + + private var fillDirection:Int; + private var fillHorizontal:Bool; + + public static inline var FILL_LEFT_TO_RIGHT:Int=1; + public static inline var FILL_RIGHT_TO_LEFT:Int=2; + public static inline var FILL_TOP_TO_BOTTOM:Int=3; + public static inline var FILL_BOTTOM_TO_TOP:Int=4; + public static inline var FILL_HORIZONTAL_INSIDE_OUT:Int=5; + public static inline var FILL_HORIZONTAL_OUTSIDE_IN:Int=6; + public static inline var FILL_VERTICAL_INSIDE_OUT:Int=7; + public static inline var FILL_VERTICAL_OUTSIDE_IN:Int=8; + + private static inline var BAR_FILLED:Int=1; + private static inline var BAR_GRADIENT:Int=2; + private static inline var BAR_IMAGE:Int=3; + + /** + * Create a new FlxBar Dynamic + * + * @param x The x coordinate location of the resulting bar(in world pixels) + * @param y The y coordinate location of the resulting bar(in world pixels) + * @param direction One of the FlxBar.FILL_ constants(such as FILL_LEFT_TO_RIGHT, FILL_TOP_TO_BOTTOM etc) + * @param width The width of the bar in pixels + * @param height The height of the bar in pixels + * @param parentRef A reference to an object in your game that you wish the bar to track + * @param variable The variable of the object that is used to determine the bar position. For example if the parent was an FlxSprite this could be "health" to track the health value + * @param min The minimum value. I.e. for a progress bar this would be zero(nothing loaded yet) + * @param max The maximum value the bar can reach. I.e. for a progress bar this would typically be 100. + * @param border Include a 1px border around the bar?(if true it adds +2 to width and height to accommodate it) + */ + public function new(x:Int, y:Int, direction:Int=FILL_LEFT_TO_RIGHT, width:Int=100, height:Int=10, parentRef:Dynamic=null, variable:String="", min:Float=0, max:Float=100, border:Bool=false):Void + { + super(x, y); + + barWidth=width; + barHeight=height; + + if(border) + { + makeGraphic(barWidth + 2, barHeight + 2, 0xffffffff, true); + filledBarPoint=new Point(1, 1); + } + else + { + makeGraphic(barWidth, barHeight, 0xffffffff, true); + filledBarPoint=new Point(0, 0); + } + + canvas=new BitmapData(width, height, true, 0x0); + + if(parentRef) + { + parent=parentRef; + parentVariable=variable; + } + + setFillDirection(direction); + + setRange(min, max); + + createFilledBar(0xff005100, 0xff00F400, border); + + emptyKill=false; + } + + /** + * Track the parent FlxSprites x/y coordinates. For example if you wanted your sprite to have a floating health-bar above their head. + * If your health bar is 10px tall and you wanted it to appear above your sprite, then set offsetY to be -10 + * If you wanted it to appear below your sprite, and your sprite was 32px tall, then set offsetY to be 32. Same applies to offsetX. + * + * @param offsetX The offset on X in relation to the origin x/y of the parent + * @param offsetY The offset on Y in relation to the origin x/y of the parent + * @see stopTrackingParent + */ + public function trackParent(offsetX:Int, offsetY:Int):Void + { + fixedPosition=false; + + positionOffset=new FlxPoint(offsetX, offsetY); + + if(parent.scrollFactor) + { + scrollFactor.x=parent.scrollFactor.x; + scrollFactor.y=parent.scrollFactor.y; + } + } + + /** + * Sets a parent for this FlxBar. Instantly replaces any previously set parent and refreshes the bar. + * + * @param parentRef A reference to an object in your game that you wish the bar to track + * @param variable The variable of the object that is used to determine the bar position. For example if the parent was an FlxSprite this could be "health" to track the health value + * @param track If you wish the FlxBar to track the x/y coordinates of parent set to true(default false) + * @param offsetX The offset on X in relation to the origin x/y of the parent + * @param offsetY The offset on Y in relation to the origin x/y of the parent + */ + public function setParent(parentRef:Dynamic, variable:String, track:Bool=false, offsetX:Int=0, offsetY:Int=0):Void + { + parent=parentRef; + parentVariable=variable; + + if(track) + { + trackParent(offsetX, offsetY); + } + + updateValueFromParent(); + updateBar(); + } + + /** + * Tells the health bar to stop following the parent sprite. The given posX and posY values are where it will remain on-screen. + * + * @param posX X coordinate of the health bar now it's no longer tracking the parent sprite + * @param posY Y coordinate of the health bar now it's no longer tracking the parent sprite + */ + public function stopTrackingParent(posX:Int, posY:Int):Void + { + fixedPosition=true; + + x=posX; + y=posY; + } + + /** + * Sets callbacks which will be triggered when the value of this FlxBar reaches min or max.
+ * Functions will only be called once and not again until the value changes.
+ * Optionally the FlxBar can be killed if it reaches min, but if will fire the empty callback first(if set) + * + * @param onEmpty The function that is called if the value of this FlxBar reaches min + * @param onFilled The function that is called if the value of this FlxBar reaches max + * @param killOnEmpty If set it will call FlxBar.kill()if the value reaches min + */ + public function setCallbacks(onEmpty:Function, onFilled:Function, killOnEmpty:Bool=false):Void + { + if(Std.is(onEmpty, Function)) + { + emptyCallback=onEmpty; + } + + if(Std.is(onFilled, Function)) + { + filledCallback=onFilled; + } + + if(killOnEmpty) + { + emptyKill=true; + } + } + + /** + * If this FlxBar should be killed when its value reaches empty, set to true + */ + private function set_killOnEmpty(value:Bool):Void + { + emptyKill=value; + } + + public var killOnEmpty(get_killOnEmpty, set_killOnEmpty):Bool; + private function get_killOnEmpty():Bool + { + return emptyKill; + } + + /** + * Set the minimum and maximum allowed values for the FlxBar + * + * @param min The minimum value. I.e. for a progress bar this would be zero(nothing loaded yet) + * @param max The maximum value the bar can reach. I.e. for a progress bar this would typically be 100. + */ + public function setRange(min:Float, max:Float):Void + { + if(max<=min) + { + throw Dynamic("FlxBar:max cannot be less than or equal to min"); + return; + } + + this.min=min; + this.max=max; + + range=max - min; + + if(range<100) + { + pct=range / 100; + } + else + { + pct=range / 100; + } + + if(fillHorizontal) + { + pxPerPercent=barWidth / 100; + } + else + { + pxPerPercent=barHeight / 100; + } + + if(value) + { + if(value>max) + { + value=max; + } + + if(valuemax) + { + newValue=max; + } + + if(newValue0) + { + switch(fillDirection) + { + case FILL_LEFT_TO_RIGHT: + case FILL_TOP_TO_BOTTOM: + // Already handled above + break; + + case FILL_BOTTOM_TO_TOP: + filledBarRect.y=barHeight - filledBarRect.height; + filledBarPoint.y=barHeight - filledBarRect.height; + break; + + case FILL_RIGHT_TO_LEFT: + filledBarRect.x=barWidth - filledBarRect.width; + filledBarPoint.x=barWidth - filledBarRect.width; + break; + + case FILL_HORIZONTAL_INSIDE_OUT: + filledBarRect.x=Std.int((barWidth / 2)-(filledBarRect.width / 2)); + filledBarPoint.x=Std.int((barWidth / 2)-(filledBarRect.width / 2)); + break; + + case FILL_HORIZONTAL_OUTSIDE_IN: + filledBarRect.width=Std.int(100 - percent * pxPerPercent); + filledBarPoint.x=Std.int((barWidth - filledBarRect.width)/ 2); + break; + + case FILL_VERTICAL_INSIDE_OUT: + filledBarRect.y=Std.int((barHeight / 2)-(filledBarRect.height / 2)); + filledBarPoint.y=Std.int((barHeight / 2)-(filledBarRect.height / 2)); + break; + + case FILL_VERTICAL_OUTSIDE_IN: + filledBarRect.height=Std.int(100 - percent * pxPerPercent); + filledBarPoint.y=Std.int((barHeight- filledBarRect.height)/ 2); + break; + } + + canvas.copyPixels(filledBar, filledBarRect, filledBarPoint); + + } + + pixels=canvas; + } + + override public function update():Void + { + if(parent) + { + if(parent[parentVariable] !=value) + { + updateValueFromParent(); + updateBar(); + } + + if(fixedPosition==false) + { + x=parent.x + positionOffset.x; + y=parent.y + positionOffset.y; + } + } + } + + /** + * The percentage of how full the bar is(a value between 0 and 100) + */ + public var percent(get_percent, set_percent):Float; + private function get_percent():Float + { + if(value>max) + { + return 100; + } + + return Math.floor((value / range)* 100); + } + + /** + * Sets the percentage of how full the bar is(a value between 0 and 100). This changes FlxBar.currentValue + */ + private function set_percent(newPct:Float):Void + { + if(newPct>=0 && newPct<=100) + { + updateValue(pct * newPct); + + updateBar(); + } + } + + /** + * Set the current value of the bar(must be between min and max range) + */ + private function set_currentValue(newValue:Float):Void + { + updateValue(newValue); + + updateBar(); + } + + /** + * The current actual value of the bar + */ + public var currentValue(get_currentValue, set_currentValue):Float; + private function get_currentValue():Float + { + return value; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBitmapFont.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBitmapFont.hx new file mode 100644 index 0000000..900c338 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxBitmapFont.hx @@ -0,0 +1,503 @@ +/** + * FlxBitmapFont + * -- Part of the Flixel Power Tools set + * + * v1.4 Changed width/height to characterWidth/Height to avoid confusion and added setFixedWidth + * v1.3 Exposed character width / height values + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - June 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; + +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +class FlxBitmapFont extends FlxSprite +{ + /** + * Alignment of the text when multiLine=true or a fixedWidth is set. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + */ + public var align:String="left"; + + /** + * If set to true all carriage-returns in text will form new lines(see align). If false the font will only contain one single line of text(the default) + */ + public var multiLine:Bool=false; + + /** + * Automatically convert any text to upper case. Lots of old bitmap fonts only contain upper-case characters, so the default is true. + */ + public var autoUpperCase:Bool=true; + + /** + * Adds horizontal spacing between each character of the font, in pixels. Default is 0. + */ + public var customSpacingX:Int=0; + + /** + * Adds vertical spacing between each line of multi-line text, set in pixels. Default is 0. + */ + public var customSpacingY:Int=0; + + private var _text:String; + + /** + * Align each line of multi-line text to the left. + */ + public static inline var ALIGN_LEFT:String="left"; + + /** + * Align each line of multi-line text to the right. + */ + public static inline var ALIGN_RIGHT:String="right"; + + /** + * Align each line of multi-line text in the center. + */ + public static inline var ALIGN_CENTER:String="center"; + + /** + * Text Set 1=!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + */ + public static inline var TEXT_SET1:String=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; + + /** + * Text Set 2=!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET2:String=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 3=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + */ + public static inline var TEXT_SET3:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "; + + /** + * Text Set 4=ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 + */ + public static inline var TEXT_SET4:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"; + + /** + * Text Set 5=ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/()'!?-*:0123456789 + */ + public static inline var TEXT_SET5:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/()'!?-*:0123456789"; + + /** + * Text Set 6=ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' + */ + public static inline var TEXT_SET6:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' "; + + /** + * Text Set 7=AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39 + */ + public static inline var TEXT_SET7:String="AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39"; + + /** + * Text Set 8=0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET8:String="0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 9=ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?! + */ + public static inline var TEXT_SET9:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?!"; + + /** + * Text Set 10=ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET10:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 11=ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789 + */ + public static inline var TEXT_SET11:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789"; + + /** + * Internval values. All set in the constructor. They should not be changed after that point. + */ + private var fontSet:BitmapData; + private var offsetX:Int; + private var offsetY:Int; + public var characterWidth:Int; + public var characterHeight:Int; + private var characterSpacingX:Int; + private var characterSpacingY:Int; + private var characterPerRow:Int; + private var grabData:Array + private var fixedWidth:Int=0; + public var drop_shadow:Bool=false; + /** + * Loads 'font' and prepares it for use by future calls to .text + * + * @param font The font set graphic class(as defined by your embed) + * @param characterWidth The width of each character in the font set. + * @param characterHeight The height of each character in the font set. + * @param chars The characters used in the font set, in display order. You can use the TEXT_SET consts for common font set arrangements. + * @param charsPerRow The number of characters per row in the font set. + * @param xSpacing If the characters in the font set have horizontal spacing between them set the required amount here. + * @param ySpacing If the characters in the font set have vertical spacing between them set the required amount here + * @param xOffset If the font set doesn't start at the top left of the given image, specify the X coordinate offset here. + * @param yOffset If the font set doesn't start at the top left of the given image, specify the Y coordinate offset here. + */ + public function new(font:Class, characterWidth:Int, characterHeight:Int, chars:String, charsPerRow:Int, xSpacing:Int=0, ySpacing:Int=0, xOffset:Int=0, yOffset:Int=0):Void + { + // Take a copy of the font for Internal use + fontSet=(new font).bitmapData; + + this.characterWidth=characterWidth; + this.characterHeight=characterHeight; + characterSpacingX=xSpacing; + characterSpacingY=ySpacing; + characterPerRow=charsPerRow; + offsetX=xOffset; + offsetY=yOffset; + + grabData=new Array(); + + // Now generate our rects for faster copyPixels later on + var currentX:Int=offsetX; + var currentY:Int=offsetY; + var r:Int=0; + + for(c in 0...chars.length) + { + // The rect is hooked to the ASCII value of the character + grabData[chars.charCodeAt(c)]=new Rectangle(currentX, currentY, characterWidth, characterHeight); + + r++; + + if(r==characterPerRow) + { + r=0; + currentX=offsetX; + currentY +=characterHeight + characterSpacingY; + } + else + { + currentX +=characterWidth + characterSpacingX; + } + } + } + + + override public function draw():Void + { + + if(drop_shadow==true){ + var old:Int=color; + + y++; + color=0x000000; + super.draw(); + color=old; + y--; + } + + super.draw(); + + } + /** + * Set this value to update the text in this sprite. Carriage returns are automatically stripped out if multiLine is false. Text is converted to upper case if autoUpperCase is true. + * + * @return void + */ + private function set_text(content:String):Void + { + var newText:String; + + if(autoUpperCase) + { + newText=content.toUpperCase(); + } + else + { + newText=content; + } + + // Smart update:Only change the bitmap data if the string has changed + if(newText !=_text) + { + _text=newText; + + removeUnsupportedCharacters(multiLine); + + buildBitmapFontText(); + } + } + + /** + * If you need this FlxSprite to have a fixed width and custom alignment you can set the width here.
+ * If text is wider than the width specified it will be cropped off. + * + * @param width Width in pixels of this FlxBitmapFont. Set to zero to disable and re-enable automatic resizing. + * @param lineAlignment Align the text within this width. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + */ + public function setFixedWidth(width:Int, lineAlignment:String="left"):Void + { + fixedWidth=width; + align=lineAlignment; + } + + public var text(get_text, set_text):String; + private function get_text():String + { + return _text; + } + + /** + * A helper function that quickly sets lots of variables at once, and then updates the text. + * + * @param content The text of this sprite + * @param multiLines Set to true if you want to support carriage-returns in the text and create a multi-line sprite instead of a single line(Std.is(default, false)). + * @param characterSpacing To add horizontal spacing between each character specify the amount in pixels(default 0). + * @param lineSpacing To add vertical spacing between each line of text, set the amount in pixels(default 0). + * @param lineAlignment Align each line of multi-line text. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + * @param allowLowerCase Lots of bitmap font sets only include upper-case characters, if yours needs to support lower case then set this to true. + */ + public function setText(content:String, multiLines:Bool=false, characterSpacing:Int=0, lineSpacing:Int=0, lineAlignment:String="left", allowLowerCase:Bool=false):Void + { + customSpacingX=characterSpacing; + customSpacingY=lineSpacing; + align=lineAlignment; + multiLine=multiLines; + + if(allowLowerCase) + { + autoUpperCase=false; + } + else + { + autoUpperCase=true; + } + + if(content.length>0) + { + text=content; + } + } + + /** + * Updates the BitmapData of the Sprite with the text + * + * @return void + */ + private function buildBitmapFontText():Void + { + var temp:BitmapData; + var cx:Int=0; + var cy:Int=0; + + if(multiLine) + { + var lines:Array=_text.split("\n"); + + if(fixedWidth>0) + { + temp=new BitmapData(fixedWidth,(lines.length *(characterHeight + customSpacingY))- customSpacingY, true, 0xf); + } + else + { + temp=new BitmapData(getLongestLine()*(characterWidth + customSpacingX),(lines.length *(characterHeight + customSpacingY))- customSpacingY, true, 0xf); + } + + // Loop through each line of text + for(i in 0...lines.length) + { + // This line of text is held in lines[i] - need to work out the alignment + switch(align) + { + case ALIGN_LEFT: + cx=0; + break; + + case ALIGN_RIGHT: + cx=temp.width -(lines[i].length *(characterWidth + customSpacingX)); + break; + + case ALIGN_CENTER: + cx=(temp.width / 2)-((lines[i].length *(characterWidth + customSpacingX))/ 2); + cx +=customSpacingX / 2; + break; + } + + // Sanity checks + if(cx<0) + { + cx=0; + } + + pasteLine(temp, lines[i], cx, cy, customSpacingX); + + cy +=characterHeight + customSpacingY; + } + } + else + { + if(fixedWidth>0) + { + temp=new BitmapData(fixedWidth, characterHeight, true, 0xf); + } + else + { + temp=new BitmapData(_text.length *(characterWidth + customSpacingX), characterHeight, true, 0xf); + } + + switch(align) + { + case ALIGN_LEFT: + cx=0; + break; + + case ALIGN_RIGHT: + cx=temp.width -(_text.length *(characterWidth + customSpacingX)); + break; + + case ALIGN_CENTER: + cx=(temp.width / 2)-((_text.length *(characterWidth + customSpacingX))/ 2); + cx +=customSpacingX / 2; + break; + } + + pasteLine(temp, _text, cx, 0, customSpacingX); + } + + pixels=temp; + } + + /** + * Returns a single character from the font set as an FlxSprite. + * + * @param char The character you wish to have returned. + * + * @return AnFlxSpritecontaining a single character from the font set. + */ + public function getCharacter(char:String):FlxSprite + { + var output:FlxSprite=new FlxSprite(); + + var temp:BitmapData=new BitmapData(characterWidth, characterHeight, true, 0xf); + + if(grabData[char.charCodeAt(0)] is Rectangle && char.charCodeAt(0)!=32) + { + temp.copyPixels(fontSet, grabData[char.charCodeAt(0)], new Point(0, 0)); + } + + output.pixels=temp; + + return output; + } + + /** + * Returns a single character from the font set as bitmapData + * + * @param char The character you wish to have returned. + * + * @return bitmapDatacontaining a single character from the font set. + */ + public function getCharacterAsBitmapData(char:String):BitmapData + { + var temp:BitmapData=new BitmapData(characterWidth, characterHeight, true, 0xf); + + //if(grabData[char.charCodeAt(0)] is Rectangle && char.charCodeAt(0)!=32) + if(grabData[char.charCodeAt(0)] is Rectangle) + { + temp.copyPixels(fontSet, grabData[char.charCodeAt(0)], new Point(0, 0)); + } + + return temp; + } + + /** + * Internal function that takes a single line of text(2nd parameter)and pastes it Into the BitmapData at the given coordinates. + * Used by getLine and getMultiLine + * + * @param output The BitmapData that the text will be drawn onto + * @param line The single line of text to paste + * @param x The x coordinate + * @param y + * @param customSpacingX + */ + private function pasteLine(output:BitmapData, line:String, x:Int=0, y:Int=0, customSpacingX:Int=0):Void + { + for(c in 0...line.length) + { + // If it's a space then there is no point copying, so leave a blank space + if(line.charAt(c)==" ") + { + x +=characterWidth + customSpacingX; + } + else + { + // If the character doesn't exist in the font then we don't want a blank space, we just want to skip it + if(grabData[line.charCodeAt(c)] is Rectangle) + { + output.copyPixels(fontSet, grabData[line.charCodeAt(c)], new Point(x, y)); + + x +=characterWidth + customSpacingX; + + if(x>output.width) + { + break; + } + } + } + } + } + + /** + * Works out the longest line of text in _text and returns its length + * + * @return A value + */ + private function getLongestLine():Int + { + var longestLine:Int=0; + + if(_text.length>0) + { + var lines:Array=_text.split("\n"); + + for(i in 0...lines.length) + { + if(lines[i].length>longestLine) + { + longestLine=lines[i].length; + } + } + } + + return longestLine; + } + + /** + * Internal helper function that removes all unsupported characters from the _text String, leaving only characters contained in the font set. + * + * @param stripCR Should it strip carriage returns as well?(default=true) + * + * @return A clean version of the string + */ + private function removeUnsupportedCharacters(stripCR:Bool=true):String + { + var newString:String=""; + for(c in 0..._text.length) + { + if(grabData[_text.charCodeAt(c)] is Rectangle || _text.charCodeAt(c)==32 ||(stripCR==false && _text.charAt(c)=="\n")) + { + newString=newString.concat(_text.charAt(c)); + } else if(_text.charAt(c)!="\r" && _text.charAt(c)!="\n" && _text.charAt(c)!="\t"){ + //trace(_text); + trace("Unsupported character:" + _text.charAt(c)); + } + } + + return newString; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxButtonPlus.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxButtonPlus.hx new file mode 100644 index 0000000..d9d55e8 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxButtonPlus.hx @@ -0,0 +1,500 @@ +/** + * FlxButtonPlus + * -- Part of the Flixel Power Tools set + * + * v1.5 Added setOnClickCallback + * v1.4 Added scrollFactor to button and swapped to using mouseInFlxRect so buttons in scrolling worlds work + * v1.3 Updated gradient colour values to include alpha + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.5 - August 3rd 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm; + +import flash.events.MouseEvent; + +import org.flixel.*; + +/** + * A simple button class that calls a function when clicked by the mouse. + */ +class FlxButtonPlus extends FlxGroup +{ + static public var NORMAL:Int=0; + static public var HIGHLIGHT:Int=1; + static public var PRESSED:Int=2; + + /** + * Set this to true if you want this button to function even while the game is paused. + */ + public var pauseProof:Bool; + /** + * Shows the current state of the button. + */ + private var _status:Int; + /** + * This function is called when the button is clicked. + */ + private var _onClick:Function; + /** + * Tracks whether or not the button is currently pressed. + */ + private var _pressed:Bool; + /** + * Whether or not the button has initialized itself yet. + */ + private var _initialized:Bool; + + + + // Flixel Power Tools Modification from here down + + public var buttonNormal:FlxExtendedSprite; + public var buttonHighlight:FlxExtendedSprite; + + public var textNormal:FlxText; + public var textHighlight:FlxText; + + /** + * The parameters passed to the _onClick function when the button is clicked + */ + private var onClickParams:Array; + + /** + * This function is called when the button is hovered over + */ + private var enterCallback:Function; + + /** + * The parameters passed to the enterCallback function when the button is hovered over + */ + private var enterCallbackParams:Array; + + /** + * This function is called when the mouse leaves a hovered button(but didn't click) + */ + private var leaveCallback:Function; + + /** + * The parameters passed to the leaveCallback function when the hovered button is left + */ + private var leaveCallbackParams:Array; + + /** + * The 1px thick border color that is drawn around this button + */ + public var borderColor:Int=0xffffffff; + + /** + * The color gradient of the button in its in-active(not hovered over)state + */ + public var offColor:Array=[0xff008000, 0xff00FF00]; + + /** + * The color gradient of the button in its hovered state + */ + public var onColor:Array=[0xff800000, 0xffff0000]; + + private var _x:Int; + private var _y:Int; + public var width:Int; + public var height:Int; + + /** + * Creates a newFlxButtonobject with a gray background + * and a callback function on the UI thread. + * + * @param X The X position of the button. + * @param Y The Y position of the button. + * @param Callback The function to call whenever the button is clicked. + * @param Params An optional array of parameters that will be passed to the Callback function + * @param Label Text to display on the button + * @param Width The width of the button. + * @param Height The height of the button. + */ + public function new(X:Int, Y:Int, Callback:Function, Params:Array=null, Label:String=null, Width:Int=100, Height:Int=20):Void + { + super(4); + + _x=X; + _y=Y; + width=Width; + height=Height; + _onClick=Callback; + + buttonNormal=new FlxExtendedSprite(X, Y); + buttonNormal.makeGraphic(Width, Height, borderColor); + buttonNormal.stamp(FlxGradient.createGradientFlxSprite(Width - 2, Height - 2, offColor), 1, 1); + buttonNormal.solid=false; + buttonNormal.scrollFactor.x=0; + buttonNormal.scrollFactor.y=0; + + buttonHighlight=new FlxExtendedSprite(X, Y); + buttonHighlight.makeGraphic(Width, Height, borderColor); + buttonHighlight.stamp(FlxGradient.createGradientFlxSprite(Width - 2, Height - 2, onColor), 1, 1); + buttonHighlight.solid=false; + buttonHighlight.visible=false; + buttonHighlight.scrollFactor.x=0; + buttonHighlight.scrollFactor.y=0; + + + add(buttonNormal); + add(buttonHighlight); + + if(Label !=null) + { + textNormal=new FlxText(X, Y + 3, Width, Label); + textNormal.setFormat(null, 8, 0xffffffff, "center", 0xff000000); + + textHighlight=new FlxText(X, Y + 3, Width, Label); + textHighlight.setFormat(null, 8, 0xffffffff, "center", 0xff000000); + + add(textNormal); + add(textHighlight); + } + + _status=NORMAL; + _pressed=false; + _initialized=false; + pauseProof=false; + + if(Params) + { + onClickParams=Params; + } + } + + public var x(null, set_x):Int; + private function set_x(newX:Int):Void + { + _x=newX; + + buttonNormal.x=_x; + buttonHighlight.x=_x; + + if(textNormal) + { + textNormal.x=_x; + textHighlight.x=_x; + } + } + + public function get x():Int + { + return _x; + } + + public var y(null, set_y):Int; + private function set_y(newY:Int):Void + { + _y=newY; + + buttonNormal.y=_y; + buttonHighlight.y=_y; + + if(textNormal) + { + textNormal.y=_y; + textHighlight.y=_y; + } + } + + public function get y():Int + { + return _y; + } + + //public function set scrollFactor(value:Float):Void + //{ + //buttonNormal; + //buttonHighlight; + //textNormal; + //textHighlight; + //} + + override public function preUpdate():Void + { + super.preUpdate(); + + if(!_initialized) + { + if(FlxG.stage !=null) + { + FlxG.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + _initialized=true; + } + } + } + + /** + * If you wish to replace the two buttons(normal and hovered-over)with FlxSprites, then pass them here.
+ * Note:The pixel data is extract from the passed FlxSprites and assigned locally, it doesn't actually use the sprites
+ * or keep a reference to them. + * + * @param normal The FlxSprite to use when the button is in-active(not hovered over) + * @param highlight The FlxSprite to use when the button is hovered-over by the mouse + */ + public function loadGraphic(normal:FlxSprite, highlight:FlxSprite):Void + { + buttonNormal.pixels=normal.pixels; + buttonHighlight.pixels=highlight.pixels; + + width=buttonNormal.width; + height=buttonNormal.height; + + if(_pressed) + { + buttonNormal.visible=false; + } + else + { + buttonHighlight.visible=false; + } + } + + /** + * Called by the game loop automatically, handles mouseover and click detection. + */ + override public function update():Void + { + updateButton();//Basic button logic + } + + /** + * Basic button update logic + */ + private function updateButton():Void + { + var prevStatus:Int=_status; + + if(FlxG.mouse.visible) + { + if(buttonNormal.cameras==null) + { + buttonNormal.cameras=FlxG.cameras; + } + + var c:FlxCamera; + var i:Int=0; + var l:Int=buttonNormal.cameras.length; + var offAll:Bool=true; + + while(iFlxU.openURL()). + */ + private function onMouseUp(event:MouseEvent):Void + { + if(exists && visible && active &&(_status==PRESSED)&&(_onClick !=null)&&(pauseProof || !FlxG.paused)) + { + _onClick.apply(null, onClickParams); + } + } + + /** + * If you want to change the color of this button in its in-active(not hovered over)state, then pass a new array of color values + * + * @param colors + */ + public function updateInactiveButtonColors(colors:Array):Void + { + offColor=colors; + + buttonNormal.stamp(FlxGradient.createGradientFlxSprite(width - 2, height - 2, offColor), 1, 1); + } + + /** + * If you want to change the color of this button in its active(hovered over)state, then pass a new array of color values + * + * @param colors + */ + public function updateActiveButtonColors(colors:Array):Void + { + onColor=colors; + + buttonHighlight.stamp(FlxGradient.createGradientFlxSprite(width - 2, height - 2, onColor), 1, 1); + } + + /** + * If this button has text, set this to change the value + */ + public var text(null, set_text):String; + private function set_text(value:String):Void + { + if(textNormal && textNormal.text !=value) + { + textNormal.text=value; + textHighlight.text=value; + } + } + + /** + * Center this button(on the X axis)Uses FlxG.width / 2 - button width / 2 to achieve this.
+ * Doesn't take Into consideration scrolling + */ + public function screenCenter():Void + { + buttonNormal.x=(FlxG.width / 2)-(width / 2); + buttonHighlight.x=(FlxG.width / 2)-(width / 2); + + if(textNormal) + { + textNormal.x=buttonNormal.x; + textHighlight.x=buttonHighlight.x; + } + } + + /** + * Sets a callback function for when this button is rolled-over with the mouse + * + * @param callback The function to call, will be called once when the mouse enters + * @param params An optional array of parameters to pass to the function + */ + public function setMouseOverCallback(callback:Function, params:Array=null):Void + { + enterCallback=callback; + + enterCallbackParams=params; + } + + /** + * Sets a callback function for when the mouse rolls-out of this button + * + * @param callback The function to call, will be called once when the mouse leaves the button + * @param params An optional array of parameters to pass to the function + */ + public function setMouseOutCallback(callback:Function, params:Array=null):Void + { + leaveCallback=callback; + + leaveCallbackParams=params; + } + + /** + * Sets a callback function for when the mouse clicks on this button + * + * @param callback The function to call whenever the button is clicked. + * @param params An optional array of parameters that will be passed to the Callback function + */ + public function setOnClickCallback(callback:Function, params:Array=null):Void + { + _onClick=callback; + + if(params) + { + onClickParams=params; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCollision.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCollision.hx new file mode 100644 index 0000000..f0dfae6 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCollision.hx @@ -0,0 +1,210 @@ +/** + * FlxCollision + * -- Part of the Flixel Power Tools set + * + * v1.6 Fixed bug in pixelPerfectCheck that stopped non-square rotated objects from colliding properly(thanks to joon on the flixel forums for spotting) + * v1.5 Added createCameraWall + * v1.4 Added pixelPerfectPointCheck() + * v1.3 Update fixes bug where it wouldn't accurately perform collision on AutoBuffered rotated sprites, or sprites with offsets + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - October 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.ColorTransform; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.display.BlendMode; + +import org.flixel.*; + +class FlxCollision +{ + public static var debug:BitmapData=new BitmapData(1, 1, false); + + public static var CAMERA_WALL_OUTSIDE:Int=0; + public static var CAMERA_WALL_INSIDE:Int=1; + + public function new() + { + } + + /** + * A Pixel Perfect Collision check between two FlxSprites. + * It will do a bounds check first, and if that passes it will run a pixel perfect match on the Intersecting area. + * Works with rotated, scaled and animated sprites. + * + * @param contact The first FlxSprite to test against + * @param target The second FlxSprite to test again, sprite order is irrelevant + * @param alphaTolerance The tolerance value above which alpha pixels are included. Default to 255(must be fully opaque for collision). + * @param camera If the collision is taking place in a camera other than FlxG.camera(the default/current)then pass it here + * + * @return Boolean True if the sprites collide, false if not + */ + public static function pixelPerfectCheck(contact:FlxSprite, target:FlxSprite, alphaTolerance:Int=255, camera:FlxCamera=null):Bool + { + var pointA:Point=new Point; + var pointB:Point=new Point; + + if(camera) + { + pointA.x=contact.x - Std.int(camera.scroll.x * contact.scrollFactor.x)- contact.offset.x; + pointA.y=contact.y - Std.int(camera.scroll.y * contact.scrollFactor.y)- contact.offset.y; + + pointB.x=target.x - Std.int(camera.scroll.x * target.scrollFactor.x)- target.offset.x; + pointB.y=target.y - Std.int(camera.scroll.y * target.scrollFactor.y)- target.offset.y; + } + else + { + pointA.x=contact.x - Std.int(FlxG.camera.scroll.x * contact.scrollFactor.x)- contact.offset.x; + pointA.y=contact.y - Std.int(FlxG.camera.scroll.y * contact.scrollFactor.y)- contact.offset.y; + + pointB.x=target.x - Std.int(FlxG.camera.scroll.x * target.scrollFactor.x)- target.offset.x; + pointB.y=target.y - Std.int(FlxG.camera.scroll.y * target.scrollFactor.y)- target.offset.y; + } + + var boundsA:Rectangle=new Rectangle(pointA.x, pointA.y, contact.framePixels.width, contact.framePixels.height); + var boundsB:Rectangle=new Rectangle(pointB.x, pointB.y, target.framePixels.width, target.framePixels.height); + + var Intersect:Rectangle=boundsA.intersection(boundsB); + + if(intersect.isEmpty()|| Intersect.width==0 || Intersect.height==0) + { + return false; + } + + // Normalise the values or it'll break the BitmapData creation below + intersect.x=Math.floor(intersect.x); + intersect.y=Math.floor(intersect.y); + intersect.width=Math.ceil(intersect.width); + intersect.height=Math.ceil(intersect.height); + + if(intersect.isEmpty()) + { + return false; + } + + // Thanks to Chris Underwood for helping with the translate logic:) + + var matrixA:Matrix=new Matrix; + matrixA.translate(-(intersect.x - boundsA.x), -(intersect.y - boundsA.y)); + + var matrixB:Matrix=new Matrix; + matrixB.translate(-(intersect.x - boundsB.x), -(intersect.y - boundsB.y)); + + var testA:BitmapData=contact.framePixels; + var testB:BitmapData=target.framePixels; + var overlapArea:BitmapData=new BitmapData(intersect.width, Intersect.height, false); + + overlapArea.draw(testA, matrixA, new ColorTransform(1, 1, 1, 1, 255, -255, -255, alphaTolerance), BlendMode.NORMAL); + overlapArea.draw(testB, matrixB, new ColorTransform(1, 1, 1, 1, 255, 255, 255, alphaTolerance), BlendMode.DIFFERENCE); + + // Developers:If you'd like to see how this works, display it in your game somewhere. Or you can comment it out to save a tiny bit of performance + debug=overlapArea; + + var overlap:Rectangle=overlapArea.getColorBoundsRect(0xffffffff, 0xff00ffff); + overlap.offset(intersect.x, Intersect.y); + + if(overlap.isEmpty()) + { + return false; + } + else + { + return true; + } + } + + /** + * A Pixel Perfect Collision check between a given x/y coordinate and an FlxSprite
+ * + * @param pointX The x coordinate of the point given in local space(relative to the FlxSprite, not game world coordinates) + * @param pointY The y coordinate of the point given in local space(relative to the FlxSprite, not game world coordinates) + * @param target The FlxSprite to check the point against + * @param alphaTolerance The alpha tolerance level above which pixels are counted as colliding. Default to 255(must be fully transparent for collision) + * + * @return Boolean True if the x/y point collides with the FlxSprite, false if not + */ + public static function pixelPerfectPointCheck(pointX:Int, pointY:Int, target:FlxSprite, alphaTolerance:Int=255):Bool + { + // Intersect check + if(FlxMath.pointInCoordinates(pointX, pointY, target.x, target.y, target.framePixels.width, target.framePixels.height)==false) + { + return false; + } + + // How deep is pointX/Y within the rect? + var test:BitmapData=target.framePixels; + + if(FlxColor.getAlpha(test.getPixel32(pointX - target.x, pointY - target.y))>=alphaTolerance) + { + return true; + } + else + { + return false; + } + } + + /** + * Creates a "wall" around the given camera which can be used for FlxSprite collision + * + * @param camera The FlxCamera to use for the wall bounds(can be FlxG.camera for the current one) + * @param placement CAMERA_WALL_OUTSIDE or CAMERA_WALL_INSIDE + * @param thickness The thickness of the wall in pixels + * @param adjustWorldBounds Adjust the FlxG.worldBounds based on the wall(true)or leave alone(false) + * + * @return FlxGroup The 4 FlxTileblocks that are created are placed Into this FlxGroup which should be added to your State + */ + public static function createCameraWall(camera:FlxCamera, placement:Int, thickness:Int, adjustWorldBounds:Bool=false):FlxGroup + { + var left:FlxTileblock; + var right:FlxTileblock; + var top:FlxTileblock; + var bottom:FlxTileblock; + + switch(placement) + { + case CAMERA_WALL_OUTSIDE: + left=new FlxTileblock(camera.x - thickness, camera.y + thickness, thickness, camera.height -(thickness * 2)); + right=new FlxTileblock(camera.x + camera.width, camera.y + thickness, thickness, camera.height -(thickness * 2)); + top=new FlxTileblock(camera.x - thickness, camera.y - thickness, camera.width + thickness * 2, thickness); + bottom=new FlxTileblock(camera.x - thickness, camera.height, camera.width + thickness * 2, thickness); + + if(adjustWorldBounds) + { + FlxG.worldBounds=new FlxRect(camera.x - thickness, camera.y - thickness, camera.width + thickness * 2, camera.height + thickness * 2); + } + break; + + case CAMERA_WALL_INSIDE: + left=new FlxTileblock(camera.x, camera.y + thickness, thickness, camera.height -(thickness * 2)); + right=new FlxTileblock(camera.x + camera.width - thickness, camera.y + thickness, thickness, camera.height -(thickness * 2)); + top=new FlxTileblock(camera.x, camera.y, camera.width, thickness); + bottom=new FlxTileblock(camera.x, camera.height - thickness, camera.width, thickness); + + if(adjustWorldBounds) + { + FlxG.worldBounds=new FlxRect(camera.x, camera.y, camera.width, camera.height); + } + break; + } + + var result:FlxGroup=new FlxGroup(4); + + result.add(left); + result.add(right); + result.add(top); + result.add(bottom); + + return result; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxColor.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxColor.hx new file mode 100644 index 0000000..bb81f93 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxColor.hx @@ -0,0 +1,534 @@ +/** + * FlxColor + * -- Part of the Flixel Power Tools set + * + * v1.5 Added RGBtoWebString + * v1.4 getHSVColorWheel now supports an alpha value per color + * v1.3 Added getAlphaFloat + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.5 - August 4th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Depends upon FlxMath +*/ + +package org.flixel.plugin.photonstorm; + +import org.flixel.*; + +/** + *FlxColoris a set of fast color manipulation and color harmony methods.
+ * Can be used for creating gradient maps or general color translation / conversion. + */ +class FlxColor +{ + public function new() + { + } + + /** + * Get HSV color wheel values in an array which will be 360 elements in size + * + * @param alpha Alpha value for color of the color wheel, between 0(transparent)and 255(opaque) + * + * @return Array + */ + public static function getHSVColorWheel(alpha:Int=255):Array + { + var colors:Array=new Array(); + + for(c in 0...359) + { + colors[c]=HSVtoRGB(c, 1.0, 1.0, alpha); + } + + return colors; + } + + /** + * Returns a Complementary Color Harmony for the given color. + *

A complementary hue is one directly opposite the color given on the color wheel

+ *

Value returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * + * @return 0xAARRGGBB format color value + */ + public static function getComplementHarmony(color:Int):Int + { + var hsv:Dynamic=RGBtoHSV(color); + + var opposite:Int=FlxMath.wrapValue(hsv.hue, 180, 359); + + return HSVtoRGB(opposite, 1.0, 1.0); + } + + /** + * Returns an Analogous Color Harmony for the given color. + *

An Analogous harmony are hues adjacent to each other on the color wheel

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * @param threshold Control how adjacent the colors will be(default +- 30 degrees) + * + * @return Object containing 3 properties:color1(the original color), color2(the warmer analogous color)and color3(the colder analogous color) + */ + public static function getAnalogousHarmony(color:Int, threshold:Int=30):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + if(threshold>359 || threshold<0) + { + throw Dynamic("FlxColor Warning:Invalid threshold given to getAnalogousHarmony()"); + } + + var warmer:Int=FlxMath.wrapValue(hsv.hue, 359 - threshold, 359); + var colder:Int=FlxMath.wrapValue(hsv.hue, threshold, 359); + + return { color1:color, color2:HSVtoRGB(warmer, 1.0, 1.0), color3:HSVtoRGB(colder, 1.0, 1.0), hue1:hsv.hue, hue2:warmer, hue3:colder } + } + + /** + * Returns an Split Complement Color Harmony for the given color. + *

A Split Complement harmony are the two hues on either side of the color's Complement

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * @param threshold Control how adjacent the colors will be to the Complement(default +- 30 degrees) + * + * @return Object containing 3 properties:color1(the original color), color2(the warmer analogous color)and color3(the colder analogous color) + */ + public static function getSplitComplementHarmony(color:Int, threshold:Int=30):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + if(threshold>=359 || threshold<=0) + { + throw Dynamic("FlxColor Warning:Invalid threshold given to getSplitComplementHarmony()"); + } + + var opposite:Int=FlxMath.wrapValue(hsv.hue, 180, 359); + + var warmer:Int=FlxMath.wrapValue(hsv.hue, opposite - threshold, 359); + var colder:Int=FlxMath.wrapValue(hsv.hue, opposite + threshold, 359); + + FlxG.log("hue:" + hsv.hue + " opposite:" + opposite + " warmer:" + warmer + " colder:" + colder); + + //return { color1:color, color2:HSVtoRGB(warmer, 1.0, 1.0), color3:HSVtoRGB(colder, 1.0, 1.0), hue1:hsv.hue, hue2:warmer, hue3:colder } + + return { color1:color, color2:HSVtoRGB(warmer, hsv.saturation, hsv.value), color3:HSVtoRGB(colder, hsv.saturation, hsv.value), hue1:hsv.hue, hue2:warmer, hue3:colder } + } + + /** + * Returns a Triadic Color Harmony for the given color. + *

A Triadic harmony are 3 hues equidistant from each other on the color wheel

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * + * @return Object containing 3 properties:color1(the original color), color2 and color3(the equidistant colors) + */ + public static function getTriadicHarmony(color:Int):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + var triadic1:Int=FlxMath.wrapValue(hsv.hue, 120, 359); + var triadic2:Int=FlxMath.wrapValue(triadic1, 120, 359); + + return { color1:color, color2:HSVtoRGB(triadic1, 1.0, 1.0), color3:HSVtoRGB(triadic2, 1.0, 1.0)} + } + + /** + * Returns a String containing handy information about the given color including String hex value, + * RGB format information and HSL information. Each section starts on a newline, 3 lines in total. + * + * @param color A color value in the format 0xAARRGGBB + * + * @return String containing the 3 lines of information + */ + public static function getColorInfo(color:Int):String + { + var argb:Dynamic=getRGB(color); + var hsl:Dynamic=RGBtoHSV(color); + + // Hex format + var result:String=RGBtoHexString(color)+ "\n"; + + // RGB format + result=result.concat("Alpha:" + argb.alpha + " Red:" + argb.red + " Green:" + argb.green + " Blue:" + argb.blue)+ "\n"; + + // HSL info + result=result.concat("Hue:" + hsl.hue + " Saturation:" + hsl.saturation + " Lightnes:" + hsl.lightness); + + return result; + } + + /** + * Return a String representation of the color in the format 0xAARRGGBB + * + * @param color The color to get the String representation for + * + * @return A string of length 10 characters in the format 0xAARRGGBB + */ + public static function RGBtoHexString(color:Int):String + { + var argb:Dynamic=getRGB(color); + + return "0x" + colorToHexString(argb.alpha)+ colorToHexString(argb.red)+ colorToHexString(argb.green)+ colorToHexString(argb.blue); + } + + /** + * Return a String representation of the color in the format #RRGGBB + * + * @param color The color to get the String representation for + * + * @return A string of length 10 characters in the format 0xAARRGGBB + */ + public static function RGBtoWebString(color:Int):String + { + var argb:Dynamic=getRGB(color); + + return "#" + colorToHexString(argb.red)+ colorToHexString(argb.green)+ colorToHexString(argb.blue); + } + + /** + * Return a String containing a hex representation of the given color + * + * @param color The color channel to get the hex value for, must be a value between 0 and 255) + * + * @return A string of length 2 characters, i.e. 255=FF, 0=00 + */ + public static function colorToHexString(color:Int):String + { + var digits:String="0123456789ABCDEF"; + + var lsd:Float=color % 16; + var msd:Float=(color - lsd)/ 16; + + var hexified:String=digits.charAt(msd)+ digits.charAt(lsd); + + return hexified; + } + + /** + * Convert a HSV(hue, saturation, lightness)color space value to an RGB color + * + * @param h Hue degree, between 0 and 359 + * @param s Saturation, between 0.0(grey)and 1.0 + * @param v Value, between 0.0(black)and 1.0 + * @param alpha Alpha value to set per color(between 0 and 255) + * + * @return 32-bit ARGB color value(0xAARRGGBB) + */ + public static function HSVtoRGB(h:Float, s:Float, v:Float, alpha:Int=255):Int + { + var result:Int; + + if(s==0.0) + { + result=getColor32(alpha, v * 255, v * 255, v * 255); + } + else + { + h=h / 60.0; + var f:Float=h - Std.int(h); + var p:Float=v *(1.0 - s); + var q:Float=v *(1.0 - s * f); + var t:Float=v *(1.0 - s *(1.0 - f)); + + switch(int(h)) + { + case 0: + result=getColor32(alpha, v * 255, t * 255, p * 255); + break; + + case 1: + result=getColor32(alpha, q * 255, v * 255, p * 255); + break; + + case 2: + result=getColor32(alpha, p * 255, v * 255, t * 255); + break; + + case 3: + result=getColor32(alpha, p * 255, q * 255, v * 255); + break; + + case 4: + result=getColor32(alpha, t * 255, p * 255, v * 255); + break; + + case 5: + result=getColor32(alpha, v * 255, p * 255, q * 255); + break; + + default: + FlxG.log("FlxColor Dynamic:HSVtoRGB:Unknown color"); + } + } + + return result; + } + + /** + * Convert an RGB color value to an object containing the HSV color space values:Hue, Saturation and Lightness + * + * @param color In format 0xRRGGBB + * + * @return Object with the properties hue(from 0 to 360), saturation(from 0 to 1.0)and lightness(from 0 to 1.0, also available under .value) + */ + public static function RGBtoHSV(color:Int):Dynamic + { + var rgb:Dynamic=getRGB(color); + + var red:Float=rgb.red / 255; + var green:Float=rgb.green / 255; + var blue:Float=rgb.blue / 255; + + var min:Float=Math.min(red, green, blue); + var max:Float=Math.max(red, green, blue); + var delta:Float=max - min; + var lightness:Float=(max + min)/ 2; + var hue:Float; + var saturation:Float; + + // Grey color, no chroma + if(delta==0) + { + hue=0; + saturation=0; + } + else + { + if(lightness<0.5) + { + saturation=delta /(max + min); + } + else + { + saturation=delta /(2 - max - min); + } + + var delta_r:Float=(((max - red)/ 6)+(delta / 2))/ delta; + var delta_g:Float=(((max - green)/ 6)+(delta / 2))/ delta; + var delta_b:Float=(((max - blue)/ 6)+(delta / 2))/ delta; + + if(red==max) + { + hue=delta_b - delta_g; + } + else if(green==max) + { + hue=(1 / 3)+ delta_r - delta_b; + } + else if(blue==max) + { + hue=(2 / 3)+ delta_g - delta_r; + } + + if(hue<0) + { + hue +=1; + } + + if(hue>1) + { + hue -=1; + } + } + + // Keep the value with 0 to 359 + hue *=360; + hue=Math.round(hue); + + // Testing + //saturation *=100; + //lightness *=100; + + return { hue:hue, saturation:saturation, lightness:lightness, value:lightness }; + } + + + + + + + + + public static function InterpolateColor(color1:Int, color2:Int, steps:Int, currentStep:Int, alpha:Int=255):Int + { + var src1:Dynamic=getRGB(color1); + var src2:Dynamic=getRGB(color2); + + var r:Int=(((src2.red - src1.red)* currentStep)/ steps)+ src1.red; + var g:Int=(((src2.green - src1.green)* currentStep)/ steps)+ src1.green; + var b:Int=(((src2.blue - src1.blue)* currentStep)/ steps)+ src1.blue; + + return getColor32(alpha, r, g, b); + } + + public static function InterpolateColorWithRGB(color:Int, r2:Int, g2:Int, b2:Int, steps:Int, currentStep:Int):Int + { + var src:Dynamic=getRGB(color); + + var r:Int=(((r2 - src.red)* currentStep)/ steps)+ src.red; + var g:Int=(((g2 - src.green)* currentStep)/ steps)+ src.green; + var b:Int=(((b2 - src.blue)* currentStep)/ steps)+ src.blue; + + return getColor24(r, g, b); + } + + public static function InterpolateRGB(r1:Int, g1:Int, b1:Int, r2:Int, g2:Int, b2:Int, steps:Int, currentStep:Int):Int + { + var r:Int=(((r2 - r1)* currentStep)/ steps)+ r1; + var g:Int=(((g2 - g1)* currentStep)/ steps)+ g1; + var b:Int=(((b2 - b1)* currentStep)/ steps)+ b1; + + return getColor24(r, g, b); + } + + /** + * Returns a random color value between black and white + *

Set the min value to start each channel from the given offset.

+ *

Set the max value to restrict the maximum color used per channel

+ * + * @param min The lowest value to use for the color + * @param max The highest value to use for the color + * @param alpha The alpha value of the returning color(default 255=fully opaque) + * + * @return 32-bit color value with alpha + */ + public static function getRandomColor(min:Int=0, max:Int=255, alpha:Int=255):Int + { + // Sanity checks + if(max>255) + { + FlxG.log("FlxColor Warning:getRandomColor - max value too high"); + return getColor24(255, 255, 255); + } + + if(min>max) + { + FlxG.log("FlxColor Warning:getRandomColor - min value higher than max"); + return getColor24(255, 255, 255); + } + + var red:Int=min + Std.int(Math.random()*(max - min)); + var green:Int=min + Std.int(Math.random()*(max - min)); + var blue:Int=min + Std.int(Math.random()*(max - min)); + + return getColor32(alpha, red, green, blue); + } + + /** + * Given an alpha and 3 color values this will return an Integer representation of it + * + * @param alpha The Alpha value(between 0 and 255) + * @param red The Red channel value(between 0 and 255) + * @param green The Green channel value(between 0 and 255) + * @param blue The Blue channel value(between 0 and 255) + * + * @return A native color value Integer(format:0xAARRGGBB) + */ + public static function getColor32(alpha:Int, red:Int, green:Int, blue:Int):Int + { + return alpha<<24 | red<<16 | green<<8 | blue; + } + + /** + * Given 3 color values this will return an Integer representation of it + * + * @param red The Red channel value(between 0 and 255) + * @param green The Green channel value(between 0 and 255) + * @param blue The Blue channel value(between 0 and 255) + * + * @return A native color value Integer(format:0xRRGGBB) + */ + public static function getColor24(red:Int, green:Int, blue:Int):Int + { + return red<<16 | green<<8 | blue; + } + + /** + * Return the component parts of a color as an Dynamic with the properties alpha, red, green, blue + * + *

Alpha will only be set if it exist in the given color(0xAARRGGBB)

+ * + * @param color in RGB(0xRRGGBB)or ARGB format(0xAARRGGBB) + * + * @return Dynamic with properties:alpha, red, green, blue + */ + public static function getRGB(color:Int):Dynamic + { + var alpha:Int=color>>>24; + var red:Int=color>>16 & 0xFF; + var green:Int=color>>8 & 0xFF; + var blue:Int=color & 0xFF; + + return { alpha:alpha, red:red, green:green, blue:blue }; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Alpha component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Alpha component of the color, will be between 0 and 255(0 being no Alpha, 255 full Alpha) + */ + public static function getAlpha(color:Int):Int + { + return color>>>24; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Alpha component as a value between 0 and 1 + * + * @param color In the format 0xAARRGGBB + * + * @return The Alpha component of the color, will be between 0 and 1(0 being no Alpha(opaque), 1 full Alpha(transparent)) + */ + public static function getAlphaFloat(color:Int):Float + { + var f:Int=color>>>24; + + return f / 255; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Red component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Red component of the color, will be between 0 and 255(0 being no color, 255 full Red) + */ + public static function getRed(color:Int):Int + { + return color>>16 & 0xFF; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Green component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Green component of the color, will be between 0 and 255(0 being no color, 255 full Green) + */ + public static function getGreen(color:Int):Int + { + return color>>8 & 0xFF; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Blue component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Blue component of the color, will be between 0 and 255(0 being no color, 255 full Blue) + */ + public static function getBlue(color:Int):Int + { + return color & 0xFF; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControl.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControl.hx new file mode 100644 index 0000000..5180512 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControl.hx @@ -0,0 +1,178 @@ +/** + * FlxControl + * -- Part of the Flixel Power Tools set + * + * v1.1 Fixed and added documentation + * v1.0 First release + * + * @version 1.1 - July 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.utils.Dictionary; +import org.flixel.*; + +class FlxControl extends FlxBasic +{ + // Quick references + public static var player1:FlxControlHandler; + public static var player2:FlxControlHandler; + public static var player3:FlxControlHandler; + public static var player4:FlxControlHandler; + + // Additional control handlers + private static var members:Dictionary=new Dictionary(true); + + public function new() + { + } + + /** + * Creates a new FlxControlHandler. You can have as many FlxControlHandlers as you like, but you usually only have one per player. The first handler you make + * will be assigned to the FlxControl.player1 var. The 2nd to FlxControl.player2 and so on for player3 and player4. Beyond this you need to keep a reference to the + * handler yourself. + * + * @param source The FlxSprite you want this class to control. It can only control one FlxSprite at once. + * @param movementType Set to either MOVEMENT_INSTANT or MOVEMENT_ACCELERATES + * @param stoppingType Set to STOPPING_INSTANT, STOPPING_DECELERATES or STOPPING_NEVER + * @param updateFacing If true it sets the FlxSprite.facing value to the direction pressed(default false) + * @param enableArrowKeys If true it will enable all arrow keys(default)- see setCursorControl for more fine-grained control + * + * @return The new FlxControlHandler + */ + public static function create(source:FlxSprite, movementType:Int, stoppingType:Int, player:Int=1, updateFacing:Bool=false, enableArrowKeys:Bool=true):FlxControlHandler + { + var result:FlxControlHandler; + + if(player==1) + { + player1=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player1]=player1; + result=player1; + } + else if(player==2) + { + player2=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player2]=player2; + result=player2; + } + else if(player==3) + { + player3=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player3]=player3; + result=player3; + } + else if(player==4) + { + player4=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player4]=player4; + result=player4; + } + else + { + var newControlHandler:FlxControlHandler=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[newControlHandler]=newControlHandler; + result=newControlHandler; + } + + return result; + } + + /** + * Removes an FlxControlHandler + * + * @param source The FlxControlHandler to delete + * @return Boolean true if the FlxControlHandler was removed, otherwise false. + */ + public static function remove(source:FlxControlHandler):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FlxControlHandlers.
+ * This is called automatically if this plugin is ever destroyed. + */ + public static function clear():Void + { + for(var handler:FlxControlHandler in members) + { + delete members[handler]; + } + } + + /** + * Starts updating the given FlxControlHandler, enabling keyboard actions for it. If no FlxControlHandler is given it starts updating all FlxControlHandlers currently added.
+ * Updating is enabled by default, but this can be used to re-start it if you have stopped it via stop().
+ * + * @param source The FlxControlHandler to start updating on. If left as null it will start updating all handlers. + */ + public static function start(source:FlxControlHandler=null):Void + { + if(source) + { + members[source].enabled=true; + } + else + { + for(var handler:FlxControlHandler in members) + { + handler.enabled=true; + } + } + } + + /** + * Stops updating the given FlxControlHandler. If no FlxControlHandler is given it stops updating all FlxControlHandlers currently added.
+ * Updating is enabled by default, but this can be used to stop it, for example if you paused your game(see start()to restart it again).
+ * + * @param source The FlxControlHandler to stop updating. If left as null it will stop updating all handlers. + */ + public static function stop(source:FlxControlHandler=null):Void + { + if(source) + { + members[source].enabled=false; + } + else + { + for(var handler:FlxControlHandler in members) + { + handler.enabled=false; + } + } + } + + /** + * Runs update on all currently active FlxControlHandlers + */ + override public function draw():Void + { + for(var handler:FlxControlHandler in members) + { + if(handler.enabled==true) + { + handler.update(); + } + } + } + + /** + * Runs when this plugin is destroyed + */ + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControlHandler.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControlHandler.hx new file mode 100644 index 0000000..32dee47 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxControlHandler.hx @@ -0,0 +1,1423 @@ +/** + * FlxControlHandler + * -- Part of the Flixel Power Tools set + * + * v1.8 Added isPressedUp/Down/Left/Right handlers + * v1.7 Modified update function so gravity is applied constantly + * v1.6 Thrust and Reverse complete, final few rotation bugs solved. Sounds hooked in for fire, jump, walk and thrust + * v1.5 Full support for rotation with min/max angle limits + * v1.4 Fixed bug in runFire causing fireRate to be ignored + * v1.3 Major refactoring and lots of new enhancements + * v1.2 First real version deployed to dev + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.8 - August 16th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Rectangle; +import org.flixel.*; +import flash.utils.getTimer; + +/** + * Makes controlling an FlxSprite with the keyboard a LOT easier and quicker to set-up!
+ * Sometimes it's hard to know what values to set, especially if you want gravity, jumping, sliding, etc.
+ * This class helps sort that - and adds some cool extra functionality too:) + * + * TODO + * ---- + * Allow to bind Fire Button to FlxWeapon + * Allow to enable multiple key sets. So cursors and WASD together + * Hot Keys + * Binding of sound effects to keys(seperate from setSounds? as those are event based) + * If moving diagonally compensate speed parameter(times x,y velocities by 0.707 or cos/sin(45)) + * Specify animation frames to play based on velocity + * Variable gravity(based on height, the higher the stronger the effect) + */ +class FlxControlHandler +{ + // Used by the FlxControl plugin + public var enabled:Bool=false; + + private var entity:FlxSprite=null; + + private var bounds:Rectangle; + + private var up:Bool; + private var down:Bool; + private var left:Bool; + private var right:Bool; + private var fire:Bool; + private var altFire:Bool; + private var jump:Bool; + private var altJump:Bool; + private var xFacing:Bool; + private var yFacing:Bool; + private var rotateAntiClockwise:Bool; + private var rotateClockwise:Bool; + + private var upMoveSpeed:Int; + private var downMoveSpeed:Int; + private var leftMoveSpeed:Int; + private var rightMoveSpeed:Int; + private var thrustSpeed:Int; + private var reverseSpeed:Int; + + // Rotation + private var thrustEnabled:Bool; + private var reverseEnabled:Bool; + private var isRotating:Bool; + private var antiClockwiseRotationSpeed:Float; + private var clockwiseRotationSpeed:Float; + private var enforceAngleLimits:Bool; + private var minAngle:Int; + private var maxAngle:Int; + private var capAngularVelocity:Bool; + + private var xSpeedAdjust:Float=0; + private var ySpeedAdjust:Float=0; + + private var gravityX:Int=0; + private var gravityY:Int=0; + + private var fireRate:Int; // The ms delay between firing when the key is held down + private var nextFireTime:Int; // The Internal time when they can next fire + private var lastFiredTime:Int; // The Internal time of when when they last fired + private var fireKeyMode:Int; // The fire key mode + private var fireCallback:Function; // A function to call every time they fire + + private var jumpHeight:Int; // The pixel height amount they jump(drag and gravity also both influence this) + private var jumpRate:Int; // The ms delay between jumping when the key is held down + private var jumpKeyMode:Int; // The jump key mode + private var nextJumpTime:Int; // The Internal time when they can next jump + private var lastJumpTime:Int; // The Internal time of when when they last jumped + private var jumpFromFallTime:Int; // A short window of opportunity for them to jump having just fallen off the edge of a surface + private var extraSurfaceTime:Int; // Internal time of when they last collided with a valid jumpSurface + private var jumpSurface:Int; // The surfaces from FlxObject they can jump from(i.e. FlxObject.FLOOR) + private var jumpCallback:Function; // A function to call every time they jump + + private var movement:Int; + private var stopping:Int; + private var rotation:Int; + private var rotationStopping:Int; + private var capVelocity:Bool; + + private var hotkeys:Array; // TODO + + private var upKey:String; + private var downKey:String; + private var leftKey:String; + private var rightKey:String; + private var fireKey:String; + private var altFireKey:String; // TODO + private var jumpKey:String; + private var altJumpKey:String; // TODO + private var antiClockwiseKey:String; + private var clockwiseKey:String; + private var thrustKey:String; + private var reverseKey:String; + + // Sounds + private var jumpSound:FlxSound=null; + private var fireSound:FlxSound=null; + private var walkSound:FlxSound=null; + private var thrustSound:FlxSound=null; + + // Helpers + public var isPressedUp:Bool=false; + public var isPressedDown:Bool=false; + public var isPressedLeft:Bool=false; + public var isPressedRight:Bool=false; + + /** + * The "Instant" Movement Type means the sprite will move at maximum speed instantly, and will not "accelerate"(or speed-up)before reaching that speed. + */ + public static inline var MOVEMENT_INSTANT:Int=0; + /** + * The "Accelerates" Movement Type means the sprite will accelerate until it reaches maximum speed. + */ + public static inline var MOVEMENT_ACCELERATES:Int=1; + /** + * The "Instant" Stopping Type means the sprite will stop immediately when no direction keys are being pressed, there will be no deceleration. + */ + public static inline var STOPPING_INSTANT:Int=0; + /** + * The "Decelerates" Stopping Type means the sprite will start decelerating when no direction keys are being pressed. Deceleration continues until the speed reaches zero. + */ + public static inline var STOPPING_DECELERATES:Int=1; + /** + * The "Never" Stopping Type means the sprite will never decelerate, any speed built up will be carried on and never reduce. + */ + public static inline var STOPPING_NEVER:Int=2; + + /** + * The "Instant" Movement Type means the sprite will rotate at maximum speed instantly, and will not "accelerate"(or speed-up)before reaching that speed. + */ + public static inline var ROTATION_INSTANT:Int=0; + /** + * The "Accelerates" Rotaton Type means the sprite will accelerate until it reaches maximum rotation speed. + */ + public static inline var ROTATION_ACCELERATES:Int=1; + /** + * The "Instant" Stopping Type means the sprite will stop rotating immediately when no rotation keys are being pressed, there will be no deceleration. + */ + public static inline var ROTATION_STOPPING_INSTANT:Int=0; + /** + * The "Decelerates" Stopping Type means the sprite will start decelerating when no rotation keys are being pressed. Deceleration continues until rotation speed reaches zero. + */ + public static inline var ROTATION_STOPPING_DECELERATES:Int=1; + /** + * The "Never" Stopping Type means the sprite will never decelerate, any speed built up will be carried on and never reduce. + */ + public static inline var ROTATION_STOPPING_NEVER:Int=2; + + /** + * This keymode fires for as long as the key is held down + */ + public static inline var KEYMODE_PRESSED:Int=0; + + /** + * This keyboard fires when the key has just been pressed down, and not again until it is released and re-pressed + */ + public static inline var KEYMODE_JUST_DOWN:Int=1; + + /** + * This keyboard fires only when the key has been pressed and then released again + */ + public static inline var KEYMODE_RELEASED:Int=2; + + /** + * Sets the FlxSprite to be controlled by this class, and defines the initial movement and stopping types.
+ * After creating an instance of this class you should call setMovementSpeed, and one of the enableXControl functions if you need more than basic cursors. + * + * @param source The FlxSprite you want this class to control. It can only control one FlxSprite at once. + * @param movementType Set to either MOVEMENT_INSTANT or MOVEMENT_ACCELERATES + * @param stoppingType Set to STOPPING_INSTANT, STOPPING_DECELERATES or STOPPING_NEVER + * @param updateFacing If true it sets the FlxSprite.facing value to the direction pressed(default false) + * @param enableArrowKeys If true it will enable all arrow keys(default)- see setCursorControl for more fine-grained control + * + * @see setMovementSpeed + */ + public function new(source:FlxSprite, movementType:Int, stoppingType:Int, updateFacing:Bool=false, enableArrowKeys:Bool=true) + { + entity=source; + + movement=movementType; + stopping=stoppingType; + + xFacing=updateFacing; + yFacing=updateFacing; + + up=false; + down=false; + left=false; + right=false; + + thrustEnabled=false; + isRotating=false; + enforceAngleLimits=false; + rotation=ROTATION_INSTANT; + rotationStopping=ROTATION_STOPPING_INSTANT; + + if(enableArrowKeys) + { + setCursorControl(); + } + + enabled=true; + } + + /** + * Set the speed at which the sprite will move when a direction key is pressed.
+ * All values are given in pixels per second. So an xSpeed of 100 would move the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ * + * If you need different speed values for left/right or up/down then use setAdvancedMovementSpeed + * + * @param xSpeed The speed in pixels per second in which the sprite will move/accelerate horizontally + * @param ySpeed The speed in pixels per second in which the sprite will move/accelerate vertically + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + * @param xDeceleration A deceleration speed in pixels per second to apply to the sprites horizontal movement(default 0) + * @param yDeceleration A deceleration speed in pixels per second to apply to the sprites vertical movement(default 0) + */ + public function setMovementSpeed(xSpeed:Int, ySpeed:Int, xSpeedMax:Int, ySpeedMax:Int, xDeceleration:Int=0, yDeceleration:Int=0):Void + { + leftMoveSpeed=-xSpeed; + rightMoveSpeed=xSpeed; + upMoveSpeed=-ySpeed; + downMoveSpeed=ySpeed; + + setMaximumSpeed(xSpeedMax, ySpeedMax); + setDeceleration(xDeceleration, yDeceleration); + } + + /** + * If you know you need the same value for the acceleration, maximum speeds and(optionally)deceleration then this is a quick way to set them. + * + * @param speed The speed in pixels per second in which the sprite will move/accelerate/decelerate + * @param acceleration If true it will set the speed value as the deceleration value(default)false will leave deceleration disabled + */ + public function setStandardSpeed(speed:Int, acceleration:Bool=true):Void + { + if(acceleration) + { + setMovementSpeed(speed, speed, speed, speed, speed, speed); + } + else + { + setMovementSpeed(speed, speed, speed, speed); + } + } + + /** + * Set the speed at which the sprite will move when a direction key is pressed.
+ * All values are given in pixels per second. So an xSpeed of 100 would move the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ * + * If you don't need different speed values for every direction on its own then use setMovementSpeed + * + * @param leftSpeed The speed in pixels per second in which the sprite will move/accelerate to the left + * @param rightSpeed The speed in pixels per second in which the sprite will move/accelerate to the right + * @param upSpeed The speed in pixels per second in which the sprite will move/accelerate up + * @param downSpeed The speed in pixels per second in which the sprite will move/accelerate down + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + * @param xDeceleration Deceleration speed in pixels per second to apply to the sprites horizontal movement(default 0) + * @param yDeceleration Deceleration speed in pixels per second to apply to the sprites vertical movement(default 0) + */ + public function setAdvancedMovementSpeed(leftSpeed:Int, rightSpeed:Int, upSpeed:Int, downSpeed:Int, xSpeedMax:Int, ySpeedMax:Int, xDeceleration:Int=0, yDeceleration:Int=0):Void + { + leftMoveSpeed=-leftSpeed; + rightMoveSpeed=rightSpeed; + upMoveSpeed=-upSpeed; + downMoveSpeed=downSpeed; + + setMaximumSpeed(xSpeedMax, ySpeedMax); + setDeceleration(xDeceleration, yDeceleration); + } + + /** + * Set the speed at which the sprite will rotate when a direction key is pressed.
+ * Use this in combination with setMovementSpeed to create a Thrust like movement system.
+ * All values are given in pixels per second. So an xSpeed of 100 would rotate the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ */ + public function setRotationSpeed(antiClockwiseSpeed:Float, clockwiseSpeed:Float, speedMax:Float, deceleration:Float):Void + { + antiClockwiseRotationSpeed=-antiClockwiseSpeed; + clockwiseRotationSpeed=clockwiseSpeed; + + setRotationKeys(); + setMaximumRotationSpeed(speedMax); + setRotationDeceleration(deceleration); + } + + /** + * + * + * @param rotationType + * @param stoppingType + */ + public function setRotationType(rotationType:Int, stoppingType:Int):Void + { + rotation=rotationType; + rotationStopping=stoppingType; + } + + /** + * Sets the maximum speed(in pixels per second)that the FlxSprite can rotate.
+ * When the FlxSprite is accelerating(movement type MOVEMENT_ACCELERATES)its speed won't increase above this value.
+ * However Flixel allows the velocity of an FlxSprite to be set to anything. So if you'd like to check the value and restrain it, then enable "limitVelocity". + * + * @param speed The maximum speed in pixels per second in which the sprite can rotate + * @param limitVelocity If true the angular velocity of the FlxSprite will be checked and kept within the limit. If false it can be set to anything. + */ + public function setMaximumRotationSpeed(speed:Float, limitVelocity:Bool=true):Void + { + entity.maxAngular=speed; + + capAngularVelocity=limitVelocity; + } + + /** + * Deceleration is a speed(in pixels per second)that is applied to the sprite if stopping type is "DECELERATES" and if no rotation is taking place.
+ * The velocity of the sprite will be reduced until it reaches zero. + * + * @param speed The speed in pixels per second at which the sprite will have its angular rotation speed decreased + */ + public function setRotationDeceleration(speed:Float):Void + { + entity.angularDrag=speed; + } + + /** + * Set minimum and maximum angle limits that the Sprite won't be able to rotate beyond.
+ * Values must be between -180 and +180. 0 is pointing right, 90 down, 180 left, -90 up. + * + * @param minimumAngle Minimum angle below which the sprite cannot rotate(must be -180 or above) + * @param maximumAngle Maximum angle above which the sprite cannot rotate(must be 180 or below) + */ + public function setRotationLimits(minimumAngle:Int, maximumAngle:Int):Void + { + if(minimumAngle>maximumAngle || minimumAngle<-180 || maximumAngle>180) + { + throw new Dynamic("FlxControlHandler setRotationLimits:Invalid Minimum / Maximum angle"); + } + else + { + enforceAngleLimits=true; + minAngle=minimumAngle; + maxAngle=maximumAngle; + } + } + + /** + * Disables rotation limits set in place by setRotationLimits() + */ + public function disableRotationLimits():Void + { + enforceAngleLimits=false; + } + + /** + * Set which keys will rotate the sprite. The speed of rotation is set in setRotationSpeed. + * + * @param leftRight Use the LEFT and RIGHT arrow keys for anti-clockwise and clockwise rotation respectively. + * @param upDown Use the UP and DOWN arrow keys for anti-clockwise and clockwise rotation respectively. + * @param customAntiClockwise The String value of your own key to use for anti-clockwise rotation(as taken from org.flixel.system.input.Keyboard) + * @param customClockwise The String value of your own key to use for clockwise rotation(as taken from org.flixel.system.input.Keyboard) + */ + public function setRotationKeys(leftRight:Bool=true, upDown:Bool=false, customAntiClockwise:String="", customClockwise:String=""):Void + { + isRotating=true; + rotateAntiClockwise=true; + rotateClockwise=true; + antiClockwiseKey="LEFT"; + clockwiseKey="RIGHT"; + + if(upDown==true) + { + antiClockwiseKey="UP"; + clockwiseKey="DOWN"; + } + + if(customAntiClockwise !="" && customClockwise !="") + { + antiClockwiseKey=customAntiClockwise; + clockwiseKey=customClockwise; + } + } + + /** + * If you want to enable a Thrust like motion for your sprite use this to set the speed and keys.
+ * This is usually used in conjunction with Rotation and it will over-ride anything already defined in setMovementSpeed. + * + * @param thrustKey Specify the key Std.string(as taken from org.flixel.system.input.Keyboard)to use for the Thrust action + * @param thrustSpeed The speed in pixels per second which the sprite will move. Acceleration or Instant movement is determined by the Movement Type. + * @param reverseKey If you want to be able to reverse, set the key string as taken from org.flixel.system.input.Keyboard(defaults to null). + * @param reverseSpeed The speed in pixels per second which the sprite will reverse. Acceleration or Instant movement is determined by the Movement Type. + */ + public function setThrust(thrustKey:String, thrustSpeed:Float, reverseKey:String=null, reverseSpeed:Float=0):Void + { + thrustEnabled=false; + reverseEnabled=false; + + if(thrustKey) + { + this.thrustKey=thrustKey; + this.thrustSpeed=thrustSpeed; + thrustEnabled=true; + } + + if(reverseKey) + { + this.reverseKey=reverseKey; + this.reverseSpeed=reverseSpeed; + reverseEnabled=true; + } + } + + /** + * Sets the maximum speed(in pixels per second)that the FlxSprite can move. You can set the horizontal and vertical speeds independantly.
+ * When the FlxSprite is accelerating(movement type MOVEMENT_ACCELERATES)its speed won't increase above this value.
+ * However Flixel allows the velocity of an FlxSprite to be set to anything. So if you'd like to check the value and restrain it, then enable "limitVelocity". + * + * @param xSpeed The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeed The maximum speed in pixels per second in which the sprite can move vertically + * @param limitVelocity If true the velocity of the FlxSprite will be checked and kept within the limit. If false it can be set to anything. + */ + public function setMaximumSpeed(xSpeed:Int, ySpeed:Int, limitVelocity:Bool=true):Void + { + entity.maxVelocity.x=xSpeed; + entity.maxVelocity.y=ySpeed; + + capVelocity=limitVelocity; + } + + /** + * Deceleration is a speed(in pixels per second)that is applied to the sprite if stopping type is "DECELERATES" and if no acceleration is taking place.
+ * The velocity of the sprite will be reduced until it reaches zero, and can be configured separately per axis. + * + * @param xSpeed The speed in pixels per second at which the sprite will have its horizontal speed decreased + * @param ySpeed The speed in pixels per second at which the sprite will have its vertical speed decreased + */ + public function setDeceleration(xSpeed:Int, ySpeed:Int):Void + { + entity.drag.x=xSpeed; + entity.drag.y=ySpeed; + } + + /** + * Gravity can be applied to the sprite, pulling it in any direction.
+ * Gravity is given in pixels per second and is applied as acceleration. The speed the sprite reaches under gravity will never exceed the Maximum Movement Speeds set.
+ * If you don't want gravity for a specific direction pass a value of zero. + * + * @param xForce A positive value applies gravity dragging the sprite to the right. A negative value drags the sprite to the left. Zero disables horizontal gravity. + * @param yForce A positive value applies gravity dragging the sprite down. A negative value drags the sprite up. Zero disables vertical gravity. + */ + public function setGravity(xForce:Int, yForce:Int):Void + { + gravityX=xForce; + gravityY=yForce; + + entity.acceleration.x=gravityX; + entity.acceleration.y=gravityY; + } + + /** + * Switches the gravity applied to the sprite. If gravity was +400 Y(pulling them down)this will swap it to -400 Y(pulling them up)
+ * To reset call flipGravity again + */ + public function flipGravity():Void + { + if(gravityX && gravityX !=0) + { + gravityX=-gravityX; + entity.acceleration.x=gravityX; + } + + if(gravityY && gravityY !=0) + { + gravityY=-gravityY; + entity.acceleration.y=gravityY; + } + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function speedUp(xFactor:Float, yFactor:Float):Void + { + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function slowDown(xFactor:Float, yFactor:Float):Void + { + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function resetSpeeds(resetX:Bool=true, resetY:Bool=true):Void + { + if(resetX) + { + xSpeedAdjust=0; + } + + if(resetY) + { + ySpeedAdjust=0; + } + } + + /** + * Creates a new Hot Key, which can be bound to any function you specify(such as "swap weapon", "quit", etc) + * + * @param key The key to use as the hot key(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL", "Q", etc) + * @param callback The function to call when the key is pressed + * @param keymode The keymode that will trigger the callback, either KEYMODE_PRESSED, KEYMODE_JUST_DOWN or KEYMODE_RELEASED + */ + public function addHotKey(key:String, callback:Function, keymode:Int):Void + { + + } + + /** + * Removes a previously defined hot key + * + * @param key The key to use as the hot key(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL", "Q", etc) + * @return true if the key was found and removed, false if the key couldn't be found + */ + public function removeHotKey(key:String):Bool + { + return true; + } + + /** + * Set sound effects for the movement events jumping, firing, walking and thrust. + * + * @param jump The FlxSound to play when the user jumps + * @param fire The FlxSound to play when the user fires + * @param walk The FlxSound to play when the user walks + * @param thrust The FlxSound to play when the user thrusts + */ + public function setSounds(jump:FlxSound=null, fire:FlxSound=null, walk:FlxSound=null, thrust:FlxSound=null):Void + { + if(jump) + { + jumpSound=jump; + } + + if(fire) + { + fireSound=fire; + } + + if(walk) + { + walkSound=walk; + } + + if(thrust) + { + thrustSound=thrust; + } + } + + /** + * Enable a fire button + * + * @param key The key to use as the fire button(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL") + * @param keymode The FlxControlHandler KEYMODE value(KEYMODE_PRESSED, KEYMODE_JUST_DOWN, KEYMODE_RELEASED) + * @param repeatDelay Time delay in ms between which the fire action can repeat(0 means instant, 250 would allow it to fire approx. 4 times per second) + * @param callback A user defined function to call when it fires + * @param altKey Specify an alternative fire key that works AS WELL AS the primary fire key(TODO) + */ + public function setFireButton(key:String, keymode:Int, repeatDelay:Int, callback:Function, altKey:String=""):Void + { + fireKey=key; + fireKeyMode=keymode; + fireRate=repeatDelay; + fireCallback=callback; + + if(altKey !="") + { + altFireKey=altKey; + } + + fire=true; + } + + /** + * Enable a jump button + * + * @param key The key to use as the jump button(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL") + * @param keymode The FlxControlHandler KEYMODE value(KEYMODE_PRESSED, KEYMODE_JUST_DOWN, KEYMODE_RELEASED) + * @param height The height in pixels/sec that the Sprite will attempt to jump(gravity and acceleration can influence this actual height obtained) + * @param surface A bitwise combination of all valid surfaces the Sprite can jump off(from FlxObject, such as FlxObject.FLOOR) + * @param repeatDelay Time delay in ms between which the jumping can repeat(250 would be 4 times per second) + * @param jumpFromFall A time in ms that allows the Sprite to still jump even if it's just fallen off a platform, if still within ths time limit + * @param callback A user defined function to call when the Sprite jumps + * @param altKey Specify an alternative jump key that works AS WELL AS the primary jump key(TODO) + */ + public function setJumpButton(key:String, keymode:Int, height:Int, surface:Int, repeatDelay:Int=250, jumpFromFall:Int=0, callback:Function=null, altKey:String=""):Void + { + jumpKey=key; + jumpKeyMode=keymode; + jumpHeight=height; + jumpSurface=surface; + jumpRate=repeatDelay; + jumpFromFallTime=jumpFromFall; + jumpCallback=callback; + + if(altKey !="") + { + altJumpKey=altKey; + } + + jump=true; + } + + /** + * Limits the sprite to only be allowed within this rectangle. If its x/y coordinates go outside it will be repositioned back inside.
+ * Coordinates should be given in GAME WORLD pixel values(not screen value, although often they are the two same things) + * + * @param x The x coordinate of the top left corner of the area(in game world pixels) + * @param y The y coordinate of the top left corner of the area(in game world pixels) + * @param width The width of the area(in pixels) + * @param height The height of the area(in pixels) + */ + public function setBounds(x:Int, y:Int, width:Int, height:Int):Void + { + bounds=new Rectangle(x, y, width, height); + } + + /** + * Clears any previously set sprite bounds + */ + public function removeBounds():Void + { + bounds=null; + } + + private function moveUp():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(upKey)) + { + move=true; + isPressedUp=true; + + if(yFacing) + { + entity.facing=FlxObject.UP; + } + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.y=upMoveSpeed; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.y=upMoveSpeed; + } + + if(bounds && entity.ybounds.bottom) + { + entity.y=bounds.bottom; + } + + } + + return move; + } + + private function moveLeft():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(leftKey)) + { + move=true; + isPressedLeft=true; + + if(xFacing) + { + entity.facing=FlxObject.LEFT; + } + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=leftMoveSpeed; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=leftMoveSpeed; + } + + if(bounds && entity.xbounds.right) + { + entity.x=bounds.right; + } + } + + return move; + } + + private function moveAntiClockwise():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(antiClockwiseKey)) + { + move=true; + + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=antiClockwiseRotationSpeed; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=antiClockwiseRotationSpeed; + } + + // - Not quite there yet given the way Flixel can rotate to any valid Int angle! + if(enforceAngleLimits) + { + //entity.angle=FlxMath.angleLimit(entity.angle, minAngle, maxAngle); + } + } + + return move; + } + + private function moveClockwise():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(clockwiseKey)) + { + move=true; + + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=clockwiseRotationSpeed; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=clockwiseRotationSpeed; + } + + // - Not quite there yet given the way Flixel can rotate to any valid Int angle! + if(enforceAngleLimits) + { + //entity.angle=FlxMath.angleLimit(entity.angle, minAngle, maxAngle); + } + } + + return move; + } + + private function moveThrust():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(thrustKey)) + { + move=true; + + var motion:FlxPoint=FlxVelocity.velocityFromAngle(entity.angle, thrustSpeed); + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=motion.x; + entity.velocity.y=motion.y; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=motion.x; + entity.acceleration.y=motion.y; + } + + if(bounds && entity.x0) + { + if(getTimer()>nextFireTime) + { + lastFiredTime=getTimer(); + + fireCallback.call(); + + fired=true; + + nextFireTime=lastFiredTime + fireRate; + } + } + else + { + lastFiredTime=getTimer(); + + fireCallback.call(); + + fired=true; + } + } + + if(fired && fireSound) + { + fireSound.play(true); + } + + return fired; + } + + private function runJump():Bool + { + var jumped:Bool=false; + + // This should be called regardless if they've pressed jump or not + if(entity.isTouching(jumpSurface)) + { + extraSurfaceTime=getTimer()+ jumpFromFallTime; + } + + if((jumpKeyMode==KEYMODE_PRESSED && FlxG.keys.pressed(jumpKey))||(jumpKeyMode==KEYMODE_JUST_DOWN && FlxG.keys.justPressed(jumpKey))||(jumpKeyMode==KEYMODE_RELEASED && FlxG.keys.justReleased(jumpKey))) + { + // Sprite not touching a valid jump surface + if(entity.isTouching(jumpSurface)==false) + { + // They've run out of time to jump + if(getTimer()>extraSurfaceTime) + { + return jumped; + } + else + { + // Still within the fall-jump window of time, but have jumped recently + if(lastJumpTime>(extraSurfaceTime - jumpFromFallTime)) + { + return jumped; + } + } + + // If there is a jump repeat rate set and we're still less than it then return + if(getTimer()0) + { + // Gravity is pulling them down to earth, so they are jumping up(negative) + entity.velocity.y=-jumpHeight; + } + else + { + // Gravity is pulling them up, so they are jumping down(positive) + entity.velocity.y=jumpHeight; + } + + if(Std.is(jumpCallback, Function)) + { + jumpCallback.call(); + } + + lastJumpTime=getTimer(); + nextJumpTime=lastJumpTime + jumpRate; + + jumped=true; + } + + if(jumped && jumpSound) + { + jumpSound.play(true); + } + + return jumped; + } + + /** + * Called by the FlxControl plugin + */ + public function update():Void + { + if(entity==null) + { + return; + } + + // Reset the helper booleans + isPressedUp=false; + isPressedDown=false; + isPressedLeft=false; + isPressedRight=false; + + if(stopping==STOPPING_INSTANT) + { + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=0; + entity.velocity.y=0; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=0; + entity.acceleration.y=0; + } + } + else if(stopping==STOPPING_DECELERATES) + { + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=0; + entity.velocity.y=0; + } + else if(movement==MOVEMENT_ACCELERATES) + { + // By default these are zero anyway, so it's safe to set like this + entity.acceleration.x=gravityX; + entity.acceleration.y=gravityY; + } + } + + // Rotation + if(isRotating) + { + if(rotationStopping==ROTATION_STOPPING_INSTANT) + { + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=0; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=0; + } + } + else if(rotationStopping==ROTATION_STOPPING_DECELERATES) + { + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=0; + } + } + + var hasRotatedAntiClockwise:Bool=false; + var hasRotatedClockwise:Bool=false; + + hasRotatedAntiClockwise=moveAntiClockwise(); + + if(hasRotatedAntiClockwise==false) + { + hasRotatedClockwise=moveClockwise(); + } + + if(rotationStopping==ROTATION_STOPPING_DECELERATES) + { + if(rotation==ROTATION_ACCELERATES && hasRotatedAntiClockwise==false && hasRotatedClockwise==false) + { + entity.angularAcceleration=0; + } + } + + // If they have got instant stopping with acceleration and are NOT pressing a key, then stop the rotation. Otherwise we let it carry on + if(rotationStopping==ROTATION_STOPPING_INSTANT && rotation==ROTATION_ACCELERATES && hasRotatedAntiClockwise==false && hasRotatedClockwise==false) + { + entity.angularVelocity=0; + entity.angularAcceleration=0; + } + } + + // Thrust + if(thrustEnabled || reverseEnabled) + { + var moved:Bool=false; + + if(thrustEnabled) + { + moved=moveThrust(); + } + + if(moved==false && reverseEnabled) + { + moved=moveReverse(); + } + } + else + { + var movedX:Bool=false; + var movedY:Bool=false; + + if(up) + { + movedY=moveUp(); + } + + if(down && movedY==false) + { + movedY=moveDown(); + } + + if(left) + { + movedX=moveLeft(); + } + + if(right && movedX==false) + { + movedX=moveRight(); + } + } + + if(fire) + { + runFire(); + } + + if(jump) + { + runJump(); + } + + if(capVelocity) + { + if(entity.velocity.x>entity.maxVelocity.x) + { + entity.velocity.x=entity.maxVelocity.x; + } + + if(entity.velocity.y>entity.maxVelocity.y) + { + entity.velocity.y=entity.maxVelocity.y; + } + } + + if(walkSound) + { + if((movement==MOVEMENT_INSTANT && entity.velocity.x !=0)||(movement==MOVEMENT_ACCELERATES && entity.acceleration.x !=0)) + { + walkSound.play(false); + } + else + { + walkSound.stop(); + } + } + } + + /** + * Sets Custom Key controls. Useful if none of the pre-defined sets work. All String values should be taken from org.flixel.system.input.Keyboard + * Pass a blank(empty)String to disable that key from being checked. + * + * @param customUpKey The String to use for the Up key. + * @param customDownKey The String to use for the Down key. + * @param customLeftKey The String to use for the Left key. + * @param customRightKey The String to use for the Right key. + */ + public function setCustomKeys(customUpKey:String, customDownKey:String, customLeftKey:String, customRightKey:String):Void + { + if(customUpKey !="") + { + up=true; + upKey=customUpKey; + } + + if(customDownKey !="") + { + down=true; + downKey=customDownKey; + } + + if(customLeftKey !="") + { + left=true; + leftKey=customLeftKey; + } + + if(customRightKey !="") + { + right=true; + rightKey=customRightKey; + } + } + + /** + * Enables Cursor/Arrow Key controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the UP key + * @param allowDown Enable the DOWN key + * @param allowLeft Enable the LEFT key + * @param allowRight Enable the RIGHT key + */ + public function setCursorControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="UP"; + downKey="DOWN"; + leftKey="LEFT"; + rightKey="RIGHT"; + } + + /** + * Enables WASD controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(W)key + * @param allowDown Enable the down(S)key + * @param allowLeft Enable the left(A)key + * @param allowRight Enable the right(D)key + */ + public function setWASDControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="W"; + downKey="S"; + leftKey="A"; + rightKey="D"; + } + + /** + * Enables ESDF(home row)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(E)key + * @param allowDown Enable the down(D)key + * @param allowLeft Enable the left(S)key + * @param allowRight Enable the right(F)key + */ + public function setESDFControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="E"; + downKey="D"; + leftKey="S"; + rightKey="F"; + } + + /** + * Enables IJKL(right-sided or secondary player)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(I)key + * @param allowDown Enable the down(K)key + * @param allowLeft Enable the left(J)key + * @param allowRight Enable the right(L)key + */ + public function setIJKLControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="I"; + downKey="K"; + leftKey="J"; + rightKey="L"; + } + + /** + * Enables HJKL(Rogue / Net-Hack)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(K)key + * @param allowDown Enable the down(J)key + * @param allowLeft Enable the left(H)key + * @param allowRight Enable the right(L)key + */ + public function setHJKLControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="K"; + downKey="J"; + leftKey="H"; + rightKey="L"; + } + + /** + * Enables ZQSD(Azerty keyboard)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(Z)key + * @param allowDown Enable the down(Q)key + * @param allowLeft Enable the left(S)key + * @param allowRight Enable the right(D)key + */ + public function setZQSDControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="Z"; + downKey="S"; + leftKey="Q"; + rightKey="D"; + } + + /** + * Enables Dvoark Simplified Controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(COMMA)key + * @param allowDown Enable the down(A)key + * @param allowLeft Enable the left(O)key + * @param allowRight Enable the right(E)key + */ + public function setDvorakSimplifiedControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="COMMA"; + downKey="O"; + leftKey="A"; + rightKey="E"; + } + + /** + * Enables Numpad(left-handed)Controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(NUMPADEIGHT)key + * @param allowDown Enable the down(NUMPADTWO)key + * @param allowLeft Enable the left(NUMPADFOUR)key + * @param allowRight Enable the right(NUMPADSIX)key + */ + public function setNumpadControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="NUMPADEIGHT"; + downKey="NUMPADTWO"; + leftKey="NUMPADFOUR"; + rightKey="NUMPADSIX"; + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCoreUtils.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCoreUtils.hx new file mode 100644 index 0000000..21b15b6 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxCoreUtils.hx @@ -0,0 +1,70 @@ +/** + * FlxCoreUtils + * -- Part of the Flixel Power Tools set + * + * v1.1 Added get mouseIndex and gameContainer + * v1.0 First release with copyObject + * + * @version 1.1 - August 4th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Sprite; +import flash.utils.ByteArray; +import org.flixel.*; + +class FlxCoreUtils +{ + + public function new() + { + } + + /** + * Performs a complete object deep-copy and returns a duplicate(not a reference) + * + * @param value The object you want copied + * @return A copy of this object + */ + public static function copyObject(value:Dynamic):Dynamic + { + var buffer:ByteArray=new ByteArray(); + buffer.writeObject(value); + buffer.position=0; + var result:Dynamic=buffer.readObject(); + return result; + } + + /** + * Returns the Display List index of the mouse pointer + */ + public static var mouseIndex(get_mouseIndex, null):Int; + private function get_mouseIndex():Int + { + var mouseIndex:Int=-1; + + try + { + mouseIndex=FlxG.camera.getContainerSprite().parent.numChildren - 4; + } + catch(e:Dynamic) + { + //trace + } + + return mouseIndex; + } + + /** + * Returns the Sprite that FlxGame extends(which contains the cameras, mouse, etc) + */ + public static var gameContainer(get_gameContainer, null):Sprite; + private function get_gameContainer():Sprite + { + return Sprite(FlxG.camera.getContainerSprite().parent); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDelay.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDelay.hx new file mode 100644 index 0000000..f382920 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDelay.hx @@ -0,0 +1,163 @@ +/** + * FlxDelay + * -- Part of the Flixel Power Tools set + * + * v1.4 Modified abort so it no longer runs the stop callback(thanks to Cambrian-Man) + * v1.3 Added secondsElapsed and secondsRemaining and some more documentation + * v1.2 Added callback support + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - July 31st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Sprite; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.utils.getTimer; + +import org.flixel.*; + +/** + * A useful timer that can be used to trigger events after certain amounts of time are up. + * Uses getTimer so is low on resources and avoids using Flash events. + * Also takes Into consideration the Pause state of your game. + * If your game pauses, when it starts again the timer notices and adjusts the expires time accordingly. + */ + +class FlxDelay extends Sprite +{ + /** + * true if the timer is currently running, otherwise false + */ + public var isRunning:Bool; + + /** + * If you wish to call a function once the timer completes, set it here + */ + public var callback:Function; + + /** + * The duration of the Delay in milliseconds + */ + public var duration:Int; + + private var started:Int; + private var expires:Int; + private var pauseStarted:Int; + private var pausedTimerRunning:Bool; + private var complete:Bool; + + /** + * Create a new timer which will run for the given amount of ms(1000=1 second real time) + * + * @param runFor The duration of this timer in ms. Call start()to set it going. + */ + public function new(runFor:Int) + { + duration=runFor; + } + + /** + * Starts the timer running + */ + public function start():Void + { + started=getTimer(); + expires=started + duration; + isRunning=true; + complete=false; + + pauseStarted=0; + pausedTimerRunning=false; + + addEventListener(Event.ENTER_FRAME, update, false, 0, true); + } + + /** + * Has the timer finished? + */ + public var hasExpired(get_hasExpired, null):Bool; + private function get_hasExpired():Bool + { + return complete; + } + + /** + * Restart the timer using the new duration + * + * @param newDuration The duration of this timer in ms. + */ + public function reset(newDuration:Int):Void + { + duration=newDuration; + + start(); + } + + /** + * The amount of seconds that have elapsed since the timer was started + */ + public var secondsElapsed(get_secondsElapsed, null):Int; + private function get_secondsElapsed():Int + { + return Std.int((getTimer()- started)/ 1000); + } + + /** + * The amount of seconds that are remaining until the timer completes + */ + public var secondsRemaining(get_secondsRemaining, null):Int; + private function get_secondsRemaining():Int + { + return Std.int((expires - getTimer())/ 1000); + } + + private function update(event:Event):Void + { + // Has the game been paused? + if(pausedTimerRunning==true && FlxG.paused==false) + { + pausedTimerRunning=false; + + // Add the time the game was paused for onto the expires timer + expires +=(getTimer()- pauseStarted); + } + else if(FlxG.paused==true && pausedTimerRunning==false) + { + pauseStarted=getTimer(); + pausedTimerRunning=true; + } + + if(isRunning && pausedTimerRunning==false && getTimer()>expires) + { + stop(); + } + } + + /** + * Abors a currently active timer without firing any callbacks(if set) + */ + public function abort():Void + { + stop(false); + } + + private function stop(runCallback:Bool=true):Void + { + removeEventListener(Event.ENTER_FRAME, update); + + isRunning=false; + complete=true; + + if(Std.is(callback, Function) && runCallback==true) + { + callback.call(); + } + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDisplay.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDisplay.hx new file mode 100644 index 0000000..abebbe3 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxDisplay.hx @@ -0,0 +1,181 @@ +/** + * FlxDisplay + * -- Part of the Flixel Power Tools set + * + * v1.3 Added "screenWrap", "alphaMask" and "alphaMaskFlxSprite" methods + * v1.2 Added "space" method + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.3 - June 15th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +class FlxDisplay +{ + + public function new() + { + } + + public function pad():Void + { + // Pad the sprite out with empty pixels left/right/above/below it + } + + public function flip():Void + { + // mirror / reverse? + // Flip image data horizontally / vertically without changing the angle + } + + /** + * Takes two source images(typically from Embedded bitmaps)and puts the resulting image Into the output FlxSprite.
+ * Note:It assumes the source and mask are the same size. Different sizes may result in undesired results.
+ * It works by copying the source image(your picture)into the output sprite. Then it removes all areas of it that do not
+ * have an alpha color value in the mask image. So if you draw a big black circle in your mask with a transparent edge, you'll
+ * get a circular image appear. Look at the mask PNG files in the assets/pics folder for examples. + * + * @param source The source image. Typically the one with the image / picture / texture in it. + * @param mask The mask to apply. Remember the non-alpha zero areas are the parts that will display. + * @param output The FlxSprite you wish the resulting image to be placed in(will adjust width/height of image) + * + * @return The output FlxSprite for those that like chaining + */ + public static function alphaMask(source:Class, mask:Class, output:FlxSprite):FlxSprite + { + var data:BitmapData=(new source).bitmapData; + + data.copyChannel((new mask).bitmapData, new Rectangle(0, 0, data.width, data.height), new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + + output.pixels=data; + + return output; + } + + /** + * Takes the image data from two FlxSprites and puts the resulting image Into the output FlxSprite.
+ * Note:It assumes the source and mask are the same size. Different sizes may result in undesired results.
+ * It works by copying the source image(your picture)into the output sprite. Then it removes all areas of it that do not
+ * have an alpha color value in the mask image. So if you draw a big black circle in your mask with a transparent edge, you'll
+ * get a circular image appear. Look at the mask PNG files in the assets/pics folder for examples. + * + * @param source The source FlxSprite. Typically the one with the image / picture / texture in it. + * @param mask The FlxSprite containing the mask to apply. Remember the non-alpha zero areas are the parts that will display. + * @param output The FlxSprite you wish the resulting image to be placed in(will adjust width/height of image) + * + * @return The output FlxSprite for those that like chaining + */ + public static function alphaMaskFlxSprite(source:FlxSprite, mask:FlxSprite, output:FlxSprite):FlxSprite + { + var data:BitmapData=source.pixels; + + data.copyChannel(mask.pixels, new Rectangle(0, 0, source.width, source.height), new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + + output.pixels=data; + + return output; + } + + /** + * Checks the x/y coordinates of the source FlxSprite and keeps them within the area of 0, 0, FlxG.width, FlxG.height(i.e. wraps it around the screen) + * + * @param source The FlxSprite to keep within the screen + */ + public static function screenWrap(source:FlxSprite):Void + { + if(source.x<0) + { + source.x=FlxG.width; + } + else if(source.x>FlxG.width) + { + source.x=0; + } + + if(source.y<0) + { + source.y=FlxG.height; + } + else if(source.y>FlxG.height) + { + source.y=0; + } + } + + /** + * Takes the bitmapData from the given source FlxSprite and rotates it 90 degrees clockwise.
+ * Can be useful if you need to control a sprite under rotation but it isn't drawn facing right.
+ * This change overwrites FlxSprite.pixels, but will not work with animated sprites. + * + * @param source The FlxSprite who's image data you wish to rotate clockwise + */ + public static function rotateClockwise(source:FlxSprite):Void + { + } + + /** + * Aligns a set of FlxSprites so there is equal spacing between them + * + * @param sprites An Array of FlxSprites + * @param startX The base X coordinate to start the spacing from + * @param startY The base Y coordinate to start the spacing from + * @param horizontalSpacing The amount of pixels between each sprite horizontally(default 0) + * @param verticalSpacing The amount of pixels between each sprite vertically(default 0) + * @param spaceFromBounds If set to true the h/v spacing values will be added to the width/height of the sprite, if false it will ignore this + */ + public static function space(sprites:Array, startX:Int, startY:Int, horizontalSpacing:Int=0, verticalSpacing:Int=0, spaceFromBounds:Bool=false):Void + { + var prevWidth:Int=0; + var prevHeight:Int=0; + + for(i in 0...sprites.length) + { + var sprite:FlxSprite=sprites[i]; + + if(spaceFromBounds) + { + sprite.x=startX + prevWidth +(i * horizontalSpacing); + sprite.y=startY + prevHeight +(i * verticalSpacing); + } + else + { + sprite.x=startX +(i * horizontalSpacing); + sprite.y=startY +(i * verticalSpacing); + } + } + } + + /** + * Centers the given FlxSprite on the screen, either by the X axis, Y axis, or both + * + * @param source The FlxSprite to center + * @param xAxis Boolean true if you want it centered on X(i.e. in the middle of the screen) + * @param yAxis Boolean true if you want it centered on Y + * + * @return The FlxSprite for chaining + */ + public static function screenCenter(source:FlxSprite, xAxis:Bool=true, yAxis:Bool=false):FlxSprite + { + if(xAxis) + { + source.x=(FlxG.width / 2)-(source.width / 2); + } + + if(yAxis) + { + source.y=(FlxG.height / 2)-(source.height / 2); + } + + return source; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExplode.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExplode.hx new file mode 100644 index 0000000..e5355cf --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExplode.hx @@ -0,0 +1,15 @@ +package org.flixel.plugin.photonstorm +{ +/** + * ... + * @author Richard Davey + */ +class FlxExplode +{ + + public function new() + { + + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx new file mode 100644 index 0000000..49c2ab1 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx @@ -0,0 +1,889 @@ +/** + * FlxExtendedSprite + * -- Part of the Flixel Power Tools set + * + * v1.4 Added MouseSpring, plugin checks and all the missing documentation + * v1.3 Added Gravity, Friction and Tolerance support + * v1.2 Now works fully with FlxMouseControl to be completely clickable and draggable! + * v1.1 Added "setMouseDrag" and "mouse over" states + * v1.0 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - July 29th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import org.flixel.plugin.photonstorm.BaseTypes.MouseSpring; + +/** + * An enhanced FlxSprite that is capable of receiving mouse clicks, being dragged and thrown, mouse springs, gravity and other useful things + */ +class FlxExtendedSprite extends FlxSprite +{ + /** + * Used by FlxMouseControl when multiple sprites overlap and register clicks, and you need to determine which sprite has priority + */ + public var priorityID:Int; + + /** + * If the mouse currently pressed down on this sprite? + * @default false + */ + public var isPressed:Bool=false; + + /** + * Is this sprite allowed to be clicked? + * @default false + */ + public var clickable:Bool=false; + private var clickOnRelease:Bool=false; + private var clickPixelPerfect:Bool=false; + private var clickPixelPerfectAlpha:Int; + private var clickCounter:Int; + + /** + * Function called when the mouse is pressed down on this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mousePressedCallback:Function; + + /** + * Function called when the mouse is released from this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseReleasedCallback:Function; + + /** + * Is this sprite allowed to be thrown? + * @default false + */ + public var throwable:Bool=false; + private var throwXFactor:Int; + private var throwYFactor:Int; + + /** + * Does this sprite have gravity applied to it? + * @default false + */ + public var hasGravity:Bool=false; + + /** + * The x axis gravity influence + */ + public var gravityX:Int; + + /** + * The y axis gravity influence + */ + public var gravityY:Int; + + /** + * Determines how quickly the Sprite come to rest on the walls if the sprite has x gravity enabled + * @default 500 + */ + public var frictionX:Float; + + /** + * Determines how quickly the Sprite come to rest on the ground if the sprite has y gravity enabled + * @default 500 + */ + public var frictionY:Float; + + /** + * If the velocity.x of this sprite falls between zero and this amount, then the sprite will come to a halt(have velocity.x set to zero) + */ + public var toleranceX:Float; + + /** + * If the velocity.y of this sprite falls between zero and this amount, then the sprite will come to a halt(have velocity.y set to zero) + */ + public var toleranceY:Float; + + /** + * Is this sprite being dragged by the mouse or not? + * @default false + */ + public var isDragged:Bool=false; + + /** + * Is this sprite allowed to be dragged by the mouse? true=yes, false=no + * @default false + */ + public var draggable:Bool=false; + private var dragPixelPerfect:Bool=false; + private var dragPixelPerfectAlpha:Int; + private var dragOffsetX:Int; + private var dragOffsetY:Int; + private var dragFromPoint:Bool; + private var allowHorizontalDrag:Bool=true; + private var allowVerticalDrag:Bool=true; + + /** + * Function called when the mouse starts to drag this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseStartDragCallback:Function; + + /** + * Function called when the mouse stops dragging this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseStopDragCallback:Function; + + /** + * An FlxRect region of the game world within which the sprite is restricted during mouse drag + * @default null + */ + public var boundsRect:FlxRect=null; + + /** + * An FlxSprite the bounds of which this sprite is restricted during mouse drag + * @default null + */ + public var boundsSprite:FlxSprite=null; + + private var snapOnDrag:Bool=false; + private var snapOnRelease:Bool=false; + private var snapX:Int; + private var snapY:Int; + + /** + * Is this sprite using a mouse spring? + * @default false + */ + public var hasMouseSpring:Bool=false; + + /** + * Will the Mouse Spring be active always(false)or only when pressed(true) + * @default true + */ + public var springOnPressed:Bool=true; + + /** + * The MouseSpring object which is used to tie this sprite to the mouse + */ + public var mouseSpring:MouseSpring; + + /** + * By default the spring attaches to the top left of the sprite. To change this location provide an x offset(in pixels) + */ + public var springOffsetX:Int; + + /** + * By default the spring attaches to the top left of the sprite. To change this location provide a y offset(in pixels) + */ + public var springOffsetY:Int; + + /** + * Creates a white 8x8 squareFlxExtendedSpriteat the specified position. + * Optionally can load a simple, one-frame graphic instead. + * + * @param X The initial X position of the sprite. + * @param Y The initial Y position of the sprite. + * @param SimpleGraphic The graphic you want to display(OPTIONAL - for simple stuff only, do NOT use for animated images!). + */ + public function new(X:Float=0, Y:Float=0, SimpleGraphic:Class=null) + { + super(X, Y, SimpleGraphic); + } + + /** + * Allow this Sprite to receive mouse clicks, the total number of times this sprite is clicked is stored in this.clicks
+ * You can add callbacks via mousePressedCallback and mouseReleasedCallback + * + * @param onRelease Register the click when the mouse is pressed down(false)or when it's released(true). Note that callbacks still fire regardless of this setting. + * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. + * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed(default 255) + */ + public function enableMouseClicks(onRelease:Bool, pixelPerfect:Bool=false, alphaThreshold:Int=255):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseClicks called but FlxMouseControl plugin not activated"); + } + + clickable=true; + + clickOnRelease=onRelease; + clickPixelPerfect=pixelPerfect; + clickPixelPerfectAlpha=alphaThreshold; + clickCounter=0; + } + + /** + * Stops this sprite from checking for mouse clicks and clears any set callbacks + */ + public function disableMouseClicks():Void + { + clickable=false; + mousePressedCallback=null; + mouseReleasedCallback=null; + } + + /** + * Returns the number of times this sprite has been clicked(can be reset by setting clicks to zero) + */ + public var clicks(get_clicks, set_clicks):Int; + private function get_clicks():Int + { + return clickCounter; + } + + /** + * Sets the number of clicks this item has received. Usually you'd only set it to zero. + */ + private function set_clicks(i:Int):Void + { + clickCounter=i; + } + + /** + * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback + * + * @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. + * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. + * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed(default 255) + * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere + * @param boundsSprite If you want to restrict the drag of this sprite to within the bounding box of another sprite, pass it here + */ + public function enableMouseDrag(lockCenter:Bool=false, pixelPerfect:Bool=false, alphaThreshold:Int=255, boundsRect:FlxRect=null, boundsSprite:FlxSprite=null):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseDrag called but FlxMouseControl plugin not activated"); + } + + draggable=true; + + dragFromPoint=lockCenter; + dragPixelPerfect=pixelPerfect; + dragPixelPerfectAlpha=alphaThreshold; + + if(boundsRect) + { + this.boundsRect=boundsRect; + } + + if(boundsSprite) + { + this.boundsSprite=boundsSprite; + } + } + + /** + * Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks. + */ + public function disableMouseDrag():Void + { + if(isDragged) + { + FlxMouseControl.dragTarget=null; + FlxMouseControl.isDragging=false; + } + + isDragged=false; + draggable=false; + + mouseStartDragCallback=null; + mouseStopDragCallback=null; + } + + /** + * Restricts this sprite to drag movement only on the given axis. Note:If both are set to false the sprite will never move! + * + * @param allowHorizontal To enable the sprite to be dragged horizontally set to true, otherwise false + * @param allowVertical To enable the sprite to be dragged vertically set to true, otherwise false + */ + public function setDragLock(allowHorizontal:Bool=true, allowVertical:Bool=true):Void + { + allowHorizontalDrag=allowHorizontal; + allowVerticalDrag=allowVertical; + } + + /** + * Make this Sprite throwable by the mouse. The sprite is thrown only when the mouse button is released. + * + * @param xFactor The sprites velocity is set to FlxMouseControl.speedX * xFactor. Try a value around 50+ + * @param yFactor The sprites velocity is set to FlxMouseControl.speedY * yFactor. Try a value around 50+ + */ + public function enableMouseThrow(xFactor:Int, yFactor:Int):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseThrow called but FlxMouseControl plugin not activated"); + } + + throwable=true; + throwXFactor=xFactor; + throwYFactor=yFactor; + + if(clickable==false && draggable==false) + { + clickable=true; + } + } + + /** + * Stops this sprite from being able to be thrown. If it currently has velocity this is NOT removed from it. + */ + public function disableMouseThrow():Void + { + throwable=false; + } + + /** + * Make this Sprite snap to the given grid either during drag or when it's released. + * For example 16x16 as the snapX and snapY would make the sprite snap to every 16 pixels. + * + * @param snapX The width of the grid cell in pixels + * @param snapY The height of the grid cell in pixels + * @param onDrag If true the sprite will snap to the grid while being dragged + * @param onRelease If true the sprite will snap to the grid when released + */ + public function enableMouseSnap(snapX:Int, snapY:Int, onDrag:Bool=true, onRelease:Bool=false):Void + { + snapOnDrag=onDrag; + snapOnRelease=onRelease; + this.snapX=snapX; + this.snapY=snapY; + } + + /** + * Stops the sprite from snapping to a grid during drag or release. + */ + public function disableMouseSnap():Void + { + snapOnDrag=false; + snapOnRelease=false; + } + + /** + * Adds a simple spring between the mouse and this Sprite. The spring can be activated either when the mouse is pressed(default), or enabled all the time. + * Note that nearly always the Spring will over-ride any other motion setting the sprite has(like velocity or gravity) + * + * @param onPressed true if the spring should only be active when the mouse is pressed down on this sprite + * @param retainVelocity true to retain the velocity of the spring when the mouse is released, or false to clear it + * @param tension The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @param friction The friction applied to the spring as it moves + * @param gravity The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + * + * @return The MouseSpring object if you wish to perform further chaining on it. Also available via FlxExtendedSprite.mouseSpring + */ + public function enableMouseSpring(onPressed:Bool=true, retainVelocity:Bool=false, tension:Float=0.1, friction:Float=0.95, gravity:Float=0):MouseSpring + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseSpring called but FlxMouseControl plugin not activated"); + } + + hasMouseSpring=true; + springOnPressed=onPressed; + + if(mouseSpring==null) + { + mouseSpring=new MouseSpring(this, retainVelocity, tension, friction, gravity); + } + else + { + mouseSpring.tension=tension; + mouseSpring.friction=friction; + mouseSpring.gravity=gravity; + } + + if(clickable==false && draggable==false) + { + clickable=true; + } + + return mouseSpring; + } + + /** + * Stops the sprite to mouse spring from being active + */ + public function disableMouseSpring():Void + { + hasMouseSpring=false; + + mouseSpring=null; + } + + /** + * The spring x coordinate in game world space. Consists of sprite.x + springOffsetX + */ + public var springX(get_springX, set_springX):Int; + private function get_springX():Int + { + return x + springOffsetX; + } + + /** + * The spring y coordinate in game world space. Consists of sprite.y + springOffsetY + */ + public var springY(get_springY, set_springY):Int; + private function get_springY():Int + { + return y + springOffsetY; + } + + /** + * Core update loop + */ + override public function update():Void + { + if(draggable && isDragged) + { + updateDrag(); + } + + if(isPressed==false && FlxG.mouse.justPressed()) + { + checkForClick(); + } + + if(hasGravity) + { + updateGravity(); + } + + if(hasMouseSpring) + { + if(springOnPressed==false) + { + mouseSpring.update(); + } + else + { + if(isPressed==true) + { + mouseSpring.update(); + } + else + { + mouseSpring.reset(); + } + } + } + + super.update(); + } + + /** + * Called by update, applies friction if the sprite has gravity to stop jittery motion when slowing down + */ + private function updateGravity():Void + { + // A sprite can have horizontal and/or vertical gravity in each direction(positiive / negative) + + // First let's check the x movement + + if(velocity.x !=0) + { + if(acceleration.x<0) + { + // Gravity is pulling them left + if(touching & WALL) + { + drag.y=frictionY; + + if((wasTouching & WALL)==false) + { + if(velocity.x0) + { + // Gravity is pulling them right + if(touching & WALL) + { + // Stop them sliding like on ice + drag.y=frictionY; + + if((wasTouching & WALL)==false) + { + if(velocity.x>-toleranceX) + { + //trace("(right)velocity.x", velocity.x, "stopped via tolerance break", toleranceX); + velocity.x=0; + } + } + } + else + { + drag.y=0; + } + } + } + + // Now check the y movement + + if(velocity.y !=0) + { + if(acceleration.y<0) + { + // Gravity is pulling them up(Std.is(velocity, negative)) + if(touching & CEILING) + { + drag.x=frictionX; + + if((wasTouching & CEILING)==false) + { + if(velocity.y0) + { + // Gravity is pulling them down(Std.is(velocity, positive)) + if(touching & FLOOR) + { + // Stop them sliding like on ice + drag.x=frictionX; + + if((wasTouching & FLOOR)==false) + { + if(velocity.y>-toleranceY) + { + //trace("(down)velocity.y", velocity.y, "stopped via tolerance break", toleranceY); + velocity.y=0; + } + } + } + else + { + drag.x=0; + } + } + } + } + + /** + * Updates the Mouse Drag on this Sprite. + */ + private function updateDrag():Void + { + //FlxG.mouse.getWorldPosition(null, tempPoint); + + if(allowHorizontalDrag) + { + x=Std.int(FlxG.mouse.x)- dragOffsetX; + } + + if(allowVerticalDrag) + { + y=Std.int(FlxG.mouse.y)- dragOffsetY; + } + + if(boundsRect) + { + checkBoundsRect(); + } + + if(boundsSprite) + { + checkBoundsSprite(); + } + + if(snapOnDrag) + { + x=Std.int(Math.floor(x / snapX)* snapX); + y=Std.int(Math.floor(y / snapY)* snapY); + } + } + + /** + * Checks if the mouse is over this sprite and pressed, then does a pixel perfect check if needed and adds it to the FlxMouseControl check stack + */ + private function checkForClick():Void + { + if(mouseOver && FlxG.mouse.justPressed()) + { + // If we don't need a pixel perfect check, then don't bother running one! By this point we know the mouse is over the sprite already + if(clickPixelPerfect==false && dragPixelPerfect==false) + { + FlxMouseControl.addToStack(this); + return; + } + + if(clickPixelPerfect && FlxCollision.pixelPerfectPointCheck(FlxG.mouse.x, FlxG.mouse.y, this, clickPixelPerfectAlpha)) + { + FlxMouseControl.addToStack(this); + return; + } + + if(dragPixelPerfect && FlxCollision.pixelPerfectPointCheck(FlxG.mouse.x, FlxG.mouse.y, this, dragPixelPerfectAlpha)) + { + FlxMouseControl.addToStack(this); + return; + } + } + } + + /** + * Called by FlxMouseControl when this sprite is clicked. Should not usually be called directly. + */ + public function mousePressedHandler():Void + { + isPressed=true; + + if(clickable && clickOnRelease==false) + { + clickCounter++; + } + + if(Std.is(mousePressedCallback, Function)) + { + mousePressedCallback.apply(null, [ this, mouseX, mouseY ]); + } + } + + /** + * Called by FlxMouseControl when this sprite is released from a click. Should not usually be called directly. + */ + public function mouseReleasedHandler():Void + { + isPressed=false; + + if(isDragged) + { + stopDrag(); + } + + if(clickable && clickOnRelease==true) + { + clickCounter++; + } + + if(throwable) + { + velocity.x=FlxMouseControl.speedX * throwXFactor; + velocity.y=FlxMouseControl.speedY * throwYFactor; + } + + if(Std.is(mouseReleasedCallback, Function)) + { + mouseReleasedCallback.apply(null, [ this, mouseX, mouseY ]); + } + } + + /** + * Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly. + */ + public function startDrag():Void + { + isDragged=true; + + if(dragFromPoint==false) + { + dragOffsetX=Std.int(FlxG.mouse.x)- x; + dragOffsetY=Std.int(FlxG.mouse.y)- y; + } + else + { + // Move the sprite to the middle of the mouse + dragOffsetX=(frameWidth / 2); + dragOffsetY=(frameHeight / 2); + } + } + + /** + * Bounds Rect check for the sprite drag + */ + private function checkBoundsRect():Void + { + if(xboundsRect.right) + { + x=boundsRect.right - width; + } + + if(yboundsRect.bottom) + { + y=boundsRect.bottom - height; + } + } + + /** + * Parent Sprite Bounds check for the sprite drag + */ + private function checkBoundsSprite():Void + { + if(x(boundsSprite.x + boundsSprite.width)) + { + x=(boundsSprite.x + boundsSprite.width)- width; + } + + if(y(boundsSprite.y + boundsSprite.height)) + { + y=(boundsSprite.y + boundsSprite.height)- height; + } + } + + /** + * Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly. + */ + public function stopDrag():Void + { + isDragged=false; + + if(snapOnRelease) + { + x=Std.int(Math.floor(x / snapX)* snapX); + y=Std.int(Math.floor(y / snapY)* snapY); + } + } + + /** + * Gravity can be applied to the sprite, pulling it in any direction. Gravity is given in pixels per second and is applied as acceleration. + * If you don't want gravity for a specific direction pass a value of zero. To cancel it entirely pass both values as zero. + * + * @param gravityX A positive value applies gravity dragging the sprite to the right. A negative value drags the sprite to the left. Zero disables horizontal gravity. + * @param gravityY A positive value applies gravity dragging the sprite down. A negative value drags the sprite up. Zero disables vertical gravity. + * @param frictionX The amount of friction applied to the sprite if it hits a wall. Allows it to come to a stop without constantly jittering. + * @param frictionY The amount of friction applied to the sprite if it hits the floor/roof. Allows it to come to a stop without constantly jittering. + * @param toleranceX If the velocity.x of the sprite falls between 0 and +- this value, it is set to stop(velocity.x=0) + * @param toleranceY If the velocity.y of the sprite falls between 0 and +- this value, it is set to stop(velocity.y=0) + */ + public function setGravity(gravityX:Int, gravityY:Int, frictionX:Float=500, frictionY:Float=500, toleranceX:Float=10, toleranceY:Float=10):Void + { + hasGravity=true; + + this.gravityX=gravityX; + this.gravityY=gravityY; + + this.frictionX=frictionX; + this.frictionY=frictionY; + + this.toleranceX=toleranceX; + this.toleranceY=toleranceY; + + if(gravityX==0 && gravityY==0) + { + hasGravity=false; + } + + acceleration.x=gravityX; + acceleration.y=gravityY; + } + + /** + * Switches the gravity applied to the sprite. If gravity was +400 Y(pulling them down)this will swap it to -400 Y(pulling them up)
+ * To reset call flipGravity again + */ + public function flipGravity():Void + { + if(gravityX && gravityX !=0) + { + gravityX=-gravityX; + acceleration.x=gravityX; + } + + if(gravityY && gravityY !=0) + { + gravityY=-gravityY; + acceleration.y=gravityY; + } + } + + /** + * Returns an FlxPoint consisting of this sprites world x/y coordinates + */ + public var point(get_point, set_point):FlxPoint; + private function get_point():FlxPoint + { + return _point; + } + + private function set_point(p:FlxPoint):Void + { + _point=p; + } + + /** + * Return true if the mouse is over this Sprite, otherwise false. Only takes the Sprites bounding box Into consideration and does not check if there + * are other sprites potentially on-top of this one. Check the value of this.isPressed if you need to know if the mouse is currently clicked on this sprite. + */ + public var mouseOver(get_mouseOver, null):Bool; + private function get_mouseOver():Bool + { + return FlxMath.pointInCoordinates(FlxG.mouse.x, FlxG.mouse.y, x, y, width, height); + } + + /** + * Returns how many horizontal pixels the mouse pointer is inside this sprite from the top left corner. Returns -1 if outside. + */ + public var mouseX(get_mouseX, null):Int; + private function get_mouseX():Int + { + if(mouseOver) + { + return FlxG.mouse.x - x; + } + + return -1; + } + + /** + * Returns how many vertical pixels the mouse pointer is inside this sprite from the top left corner. Returns -1 if outside. + */ + public var mouseY(get_mouseY, null):Int; + private function get_mouseY():Int + { + if(mouseOver) + { + return FlxG.mouse.y - y; + } + + return -1; + } + + /** + * Returns an FlxRect consisting of the bounds of this Sprite. + */ + public var rect(get_rect, null):FlxRect; + private function get_rect():FlxRect + { + _rect.x=x; + _rect.y=y; + _rect.width=width; + _rect.height=height; + + return _rect; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlectrum.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlectrum.hx new file mode 100644 index 0000000..1f36029 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlectrum.hx @@ -0,0 +1,702 @@ +/** + * Flectrum version 1.0 by Christian Corti - Jiggled around a bit to work with Flixel by Richard Davey, 29th July 2011 + * Neoart, Costa Rica + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package org.flixel.plugin.photonstorm; + +import flash.display.*; +import flash.events.*; +import flash.geom.*; +import flash.utils.*; +import flash.utils.getTimer; +import neoart.flectrum.SoundEx; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +class FlxFlectrum extends FlxGroup +{ + public static inline var UP:String="up"; + public static inline var LEFT:String="left"; + public static inline var DOWN:String="down"; + public static inline var RIGHT:String="right"; + + public static inline var METER:String="meter"; + //public static var DECAY:String="decay";// currently broken + public static inline var PEAKS:String="peaks"; + + public var backgroundBeat:Bool; + + public var back:FlxSprite; + public var front:FlxSprite; + + private var currentPeak:Int; + private var lastPeak:Int; + + private var canvas:Sprite; + private var timer:Timer; + private var meter:BitmapData; + private var background:Bitmap; + private var foreground:Bitmap; + private var buffer:BitmapData; + private var input:BitmapData; + private var output:BitmapData; + + private var levels:Array; + private var spectrum:Array; + private var destPoint:Point; + private var sourceRect:Rectangle; + private var sectionWidth:Int; + private var sectionHeight:Int; + private var realHeight:Int; + + private var m_soundEx:SoundEx; + private var m_direction:String=UP; + private var m_mode:String=PEAKS; + private var m_columns:Int; + private var m_columnSize:Int=10; + private var m_columnSpacing:Int=2; + private var m_rows:Int; + private var m_rowSize:Int=3; + private var m_rowSpacing:Int=1; + private var m_showBackground:Bool=true; + private var m_backgroundAlpha:Float=0.2; + private var m_decay:Float=0.02; + private var m_decayAlpha:Int=0xd0000000; + private var m_peaksAlpha:Int=0xff000000; + + private var m_colors:Array=[0xff3939, 0xffb320, 0xfff820, 0x50d020]; + private var m_alphas:Array=[1, 1, 1, 1]; + private var m_ratios:Array=[20, 105, 145, 250]; + + public function new() + { + super(2); + } + + public function init(x:Int, y:Int, soundEx:SoundEx, columns:Int=15, columnSize:Int=10, columnSpacing:Int=0, rows:Int=32, rowSize:Int=3, rowSpacing:Int=0):Void + { + this.soundEx=soundEx; + + m_columns=columns; + m_columnSize=columnSize; + m_columnSpacing=columnSpacing; + + m_rows=rows; + m_rowSize=rowSize; + m_rowSpacing=rowSpacing; + + front=new FlxSprite().makeGraphic(1, 1, 0x0); + front.solid=false; + + back=new FlxSprite().makeGraphic(1, 1, 0x0); + back.solid=false; + back.visible=false; + + this.x=x; + this.y=y; + + canvas=new Sprite; + background=new Bitmap(null, "always", true); + foreground=new Bitmap(null, "always", true); + levels=new Array; + spectrum=new Array; + destPoint=new Point(); + sourceRect=new Rectangle(); + + currentPeak=0; + lastPeak=0; + + timer=new Timer(45); + timer.addEventListener(TimerEvent.TIMER, peaksHandler); + reset(); + + add(back); + add(front); + } + + public function useBitmap(image:Class):Void + { + meter=Bitmap(new image).bitmapData.clone(); + clone(); + } + + public function useDraw():Void + { + meter.dispose(); + meter=null; + drawDisplay(); + } + + private function reset():Void + { + timer.reset(); + levels.length=m_columns; + for(i in 0...m_columnsi) + levels[i]=0; + + background.alpha=m_backgroundAlpha; + background.rotation=0; + background.x=0; + background.y=0; + foreground.rotation=0; + foreground.x=0; + foreground.y=0; + if(meter) + clone(); + else + drawDisplay(); + } + + public var x(null, set_x):Int; + private function set_x(x:Int):Void + { + back.x=x; + front.x=x; + } + + public function get x():Int + { + return front.x; + } + + public var y(null, set_y):Int; + private function set_y(y:Int):Void + { + back.y=y; + front.y=y; + } + + public function get y():Int + { + return front.y; + } + + private function start():Void + { + if(!soundEx) + return; + timer.reset(); + timer.start(); + } + + private function clone():Void + { + sectionWidth=meter.width + m_columnSpacing; + sectionHeight=m_rowSize + m_rowSpacing; + realHeight=meter.height + m_rowSpacing; + + var h:Int=meter.height, i:Int, w:Int=m_columns * sectionWidth - m_columnSpacing; + + output=new BitmapData(w, h, true, 0); + buffer=output.clone(); + output.lock(); + destPoint.x=0; + + for(i=0;i0) + { + sourceRect.width=w; + sourceRect.height=m_rowSpacing; + sourceRect.y=h - sectionHeight; + + for(i=0;it) + t=levels[i]; + + m_soundEx.removeEventListener(Event.SOUND_COMPLETE, stopHandler); + m_soundEx.removeEventListener(SoundEx.SOUND_STOP, stopHandler); + m_soundEx.addEventListener(SoundEx.SOUND_START, startHandler); + + timer.reset(); + timer.repeatCount=Std.int(t / m_decay)+ 1; + timer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); + timer.start(); + } + + private function completeHandler(e:Event):Void + { + if(backgroundBeat) + background.alpha=m_backgroundAlpha; + timer.reset(); + timer.removeEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); + } + + private function meterHandler(e:TimerEvent):Void + { + var h:Int, i:Int; + spectrum=m_soundEx.getStereoAdd(m_columns); + buffer.fillRect(buffer.rect, 0); + sourceRect.x=0; + + for(i=0;ilevels[i]) + levels[i]=a; + h=Std.int(levels[i] * m_rows)* sectionHeight; + sourceRect.height=h; + sourceRect.y=realHeight - h; + buffer.fillRect(sourceRect, m_peaksAlpha); + sourceRect.x +=sectionWidth; + levels[i] -=m_decay; + } + output.copyPixels(input, input.rect, destPoint, buffer, null, true); + output.unlock(); + if(backgroundBeat) + background.alpha=m_soundEx.peak; + e.updateAfterEvent(); + } + + private function peaksHandler(e:TimerEvent):Void + { + var a:Float, h:Int, i:Int; + spectrum=m_soundEx.getStereoAdd(m_columns); + buffer.fillRect(buffer.rect, 0); + sourceRect.x=0; + + for(i=0;ilevels[i]) + { + levels[i]=a; + } + else + { + h=Std.int(levels[i] * m_rows)* sectionHeight; + sourceRect.y=realHeight - h; + } + + sourceRect.height=m_rowSize; + buffer.fillRect(sourceRect, m_peaksAlpha); + sourceRect.x +=sectionWidth; + levels[i] -=m_decay; + } + + output.copyPixels(input, input.rect, destPoint, buffer); + + if(backgroundBeat) + { + background.alpha=m_soundEx.peak; + } + + currentPeak=getTimer(); + + e.updateAfterEvent(); + } + + override public function update():Void + { + // Avoids doing this every single frame, rather only when the meter has peaked + if(currentPeak>lastPeak) + { + lastPeak=currentPeak; + + if(foreground) + { + front.pixels=foreground.bitmapData; + front.alpha=foreground.alpha; + } + + if(background) + { + back.pixels=background.bitmapData; + back.alpha=background.alpha; + } + } + + super.update(); + } + + public var soundEx(get_soundEx, set_soundEx):SoundEx; + private function get_soundEx():SoundEx + { + return m_soundEx; + } + + private function set_soundEx(value:SoundEx):Void + { + if(m_soundEx) + m_soundEx.removeEventListener(SoundEx.SOUND_START, startHandler); + m_soundEx=value; + value.addEventListener(SoundEx.SOUND_START, startHandler); + } + + public var direction(get_direction, set_direction):String; + private function get_direction():String + { + return m_direction; + } + + private function set_direction(value:String):Void + { + if(value==m_direction || !FlxFlectrum[value.toUpperCase()]) + return; + + switch(value) + { + case UP: + front.angle=0; + break; + case LEFT: + front.angle=270; + break; + case DOWN: + front.angle=180; + break; + case RIGHT: + front.angle=90; + break; + } + + back.angle=front.angle; + m_direction=value; + } + + public var mode(get_mode, set_mode):String; + private function get_mode():String + { + return m_mode; + } + + private function set_mode(value:String):Void + { + if(value==m_mode || !FlxFlectrum[value.toUpperCase()]) + return; + timer.removeEventListener(TimerEvent.TIMER, this[m_mode + "Handler"]); + timer.addEventListener(TimerEvent.TIMER, this[value + "Handler"]); + m_mode=value; + } + + public var delay(get_delay, set_delay):Int; + private function get_delay():Int + { + return timer.delay; + } + + private function set_delay(value:Int):Void + { + timer.delay=value; + } + + public var columns(get_columns, set_columns):Int; + private function get_columns():Int + { + return m_columns; + } + + private function set_columns(value:Int):Void + { + if(value==m_columns) + return; + if(value<2) + value=2; + else if(value>256) + value=256; + m_columns=value; + reset(); + } + + public var columnSize(get_columnSize, set_columnSize):Int; + private function get_columnSize():Int + { + return m_columnSize; + } + + private function set_columnSize(value:Int):Void + { + if(value==m_columnSize) + return; + if(value<1) + value=1; + m_columnSize=value; + reset(); + } + + public var columnSpacing(get_columnSpacing, set_columnSpacing):Int; + private function get_columnSpacing():Int + { + return m_columnSpacing; + } + + private function set_columnSpacing(value:Int):Void + { + if(value==m_columnSpacing) + return; + m_columnSpacing=value; + reset(); + } + + public var rows(get_rows, set_rows):Int; + private function get_rows():Int + { + return m_rows; + } + + private function set_rows(value:Int):Void + { + if(value==m_rows) + return; + if(value<3) + value=3; + m_rows=value; + reset(); + } + + public var rowSize(get_rowSize, set_rowSize):Int; + private function get_rowSize():Int + { + return m_rowSize; + } + + private function set_rowSize(value:Int):Void + { + if(value==m_rowSize) + return; + if(value<1) + value=1; + m_rowSize=value; + reset(); + } + + public var rowSpacing(get_rowSpacing, set_rowSpacing):Int; + private function get_rowSpacing():Int + { + return m_rowSpacing; + } + + private function set_rowSpacing(value:Int):Void + { + if(value==m_rowSpacing) + return; + m_rowSpacing=value; + reset(); + } + + public var showBackground(get_showBackground, set_showBackground):Bool; + private function get_showBackground():Bool + { + return m_showBackground; + } + + private function set_showBackground(value:Bool):Void + { + if(value) + { + back.visible=true; + } + else + { + back.visible=false; + } + + if(value==m_showBackground) + return; + m_showBackground=value; + reset(); + } + + public var backgroundAlpha(get_backgroundAlpha, set_backgroundAlpha):Float; + private function get_backgroundAlpha():Float + { + return m_backgroundAlpha; + } + + private function set_backgroundAlpha(value:Float):Void + { + background.alpha=m_backgroundAlpha=value; + } + + public var decay(get_decay, set_decay):Float; + private function get_decay():Float + { + return m_decay; + } + + private function set_decay(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_decay=value; + } + + public var decay(get_decay, set_decay):Float; + private function get_decayAlpha():Float + { + return m_decayAlpha / 255; + } + + private function set_decayAlpha(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_decayAlpha=Std.int(value * 255)<<24; + } + + public var peaksAlpha(get_peaksAlpha, set_peaksAlpha):Float; + private function get_peaksAlpha():Float + { + return m_peaksAlpha / 255; + } + + private function set_peaksAlpha(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_peaksAlpha=Std.int(value * 255)<<24; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlod.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlod.hx new file mode 100644 index 0000000..5f04c82 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxFlod.hx @@ -0,0 +1,254 @@ +/** + * FlxFlod + * -- Part of the Flixel Power Tools set + * + * v1.3 Added full FlxFlectrum support + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.3 - July 29th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import neoart.flectrum.Flectrum; +import neoart.flectrum.SoundEx; +import org.flixel.*; +import neoart.flod.*; + +import flash.utils.ByteArray; +import flash.media.SoundTransform; + +/** + * FlxFlod adds support for the Flod AS3 Replay library by Christian Corti.
+ * Flod is an incredibly powerful library allowing you to play tracker music from the Amiga / ST / PC(SoundTracker, ProTracker, etc)
+ * More information about Flod can be found here:http://www.photonstorm.com/flod

+ * + * This class works without modifying flixel, however the mute/volume/pause/resume commands won't be hooked Into flixel.
+ * You can either use a patched version of Flixel which is provided in this repository:
+ * flash-game-dev-tips\Flixel Versions\Flixel v2.43 Patch 1.0 + *
+ * Or you can patch FlxG manually by doing the following:

+ * + * 1)Addimport com.photonstorm.flixel.FlxFlod;at the top of FlxG.as:
+ * 2)Find the functionstatic public var mute(null, set_mute):Bool; + static var mute(null, set_mute):Bool; + private function set_mute(Mute:Bool):Voidand add this line at the end of it:FlxFlod.mute=Mute;
+ * 3)Find the functionstatic public var volume(null, set_volume):Float; + static var volume(null, set_volume):Float; + private function set_volume(Volume:Float):Voidand add this line at the end of it:FlxFlod.volume=Volume;
+ * 4)Find the functionstatic private function pauseSounds():Voidand add this line at the end of it:FlxFlod.pause();
+ * 5)Find the functionstatic private function playSounds():Voidand add this line at the end of it:FlxFlod.resume();

+ * + * Flixel will now be patched so that any music playing via FlxFlod responds to the global flixel mute, volume and pause controls + */ + +class FlxFlod +{ + private static var processor:ModProcessor; + private static var modStream:ByteArray; + private static var soundform:SoundTransform=new SoundTransform(); + + private static var fadeTimer:FlxDelay; + + private static var callbackHooksCreated:Bool=false; + + private static var sound:SoundEx=new SoundEx; + public static var flectrum:FlxFlectrum; + + /** + * Starts playback of a tracker module + * + * @param toon The music to play + * + * @return Boolean true if playback started successfully, false if not + */ + public static function playMod(toon:Class):Bool + { + stopMod(); + + modStream=new toon()as ByteArray; + + processor=new ModProcessor(); + + if(processor.load(modStream)) + { + processor.loopSong=true; + processor.stereo=0; + processor.play(sound); + + if(processor.soundChannel) + { + soundform.volume=FlxG.volume; + processor.soundChannel.soundTransform=soundform; + } + + if(callbackHooksCreated==false) + { + FlxG.volumeHandler=updateVolume; + callbackHooksCreated=true; + } + + return true; + + } + else + { + return false; + } + } + + /** + * Creates a Flectrum(VU Meter / Spectrum Analyser) + * + * @param x The x position of the flectrum in game world coordinates + * @param y The y position of the flectrum in game world coordinates + * @param meter A graphic to use for the meter(bar)of the flectrum. Default null uses a solid fill rectangle. + * @param showBackground Display an alpha background behind the meters + * @param backgroundBeat Makes the alpha background pulsate in time to the music + * @param columns The number of columns in the flectrum + * @param columnSize The width of each column in pixels - if you use your own meter graphic this value is ignored + * @param columnSpacing The spacing in pixels between each column(meter)of the flectrum + * @param rows The number of rows in the flectrum + * @param rowSize The height of each row. Overall flectrum height is rowSize + rowSpacing * rows - if you use your own meter graphic this value is ignored + * @param rowSpacing The spacing in pixels between each row of the flectrum - if you use your own meter graphic this value is ignored + * + * @return The FlxFlectrum instance for further modification. Also available via FlxFlod.flectrum + */ + public static function createFlectrum(x:Int, y:Int, meter:Class=null, showBackground:Bool=false, backgroundBeat:Bool=false, columns:Int=15, columnSize:Int=10, columnSpacing:Int=0, rows:Int=32, rowSize:Int=3, rowSpacing:Int=0):FlxFlectrum + { + flectrum=new FlxFlectrum(); + + flectrum.init(x, y, sound, columns, columnSize, columnSpacing, rows, rowSize, rowSpacing); + + if(meter) + { + flectrum.useBitmap(meter); + } + + flectrum.showBackground=showBackground; + flectrum.backgroundBeat=backgroundBeat; + + return flectrum; + } + + /** + * Pauses playback of this module, if started + */ + public static function pause():Void + { + if(processor) + { + processor.pause(); + } + } + + /** + * Resumes playback of this module if paused + */ + public static function resume():Void + { + if(processor) + { + processor.resume(); + } + } + + /** + * Stops playback of this module, if started + */ + public static function stopMod():Void + { + if(processor) + { + processor.stop(); + } + } + + /** + * Toggles playback mute + */ + public static var mute(null, set_mute):Bool; + private function set_mute(Mute:Bool):Void + { + if(processor) + { + if(Mute) + { + if(processor.soundChannel) + { + soundform.volume=0; + processor.soundChannel.soundTransform=soundform; + } + } + else + { + if(processor.soundChannel) + { + soundform.volume=FlxG.volume; + processor.soundChannel.soundTransform=soundform; + } + } + } + } + + /** + * Called by FlxG when the volume is adjusted in-game + * + * @param Volume + */ + public static function updateVolume(Volume:Float):Void + { + volume=Volume; + } + + /** + * Sets the playback volume directly(usually controlled by FlxG.volume) + */ + public static var volume(null, set_volume):Float; + private function set_volume(Volume:Float):Void + { + if(processor) + { + if(processor.soundChannel) + { + soundform.volume=Volume; + processor.soundChannel.soundTransform=soundform; + } + } + } + + /** + * Is a tune already playing? + */ + public static var isPlaying(get_isPlaying, set_isPlaying):Bool; + private function get_isPlaying():Bool + { + if(processor) + { + return processor.isPlaying; + } + else + { + return false; + } + } + + /** + * Is a tune paused? + */ + public static var isPaused(get_isPaused, set_isPaused):Bool; + private function get_isPaused():Bool + { + if(processor) + { + return processor.isPaused; + } + else + { + return false; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGradient.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGradient.hx new file mode 100644 index 0000000..023e4cd --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGradient.hx @@ -0,0 +1,251 @@ +/** + * FlxGradient + * -- Part of the Flixel Power Tools set + * + * v1.6 Fixed bug where gradients with chunk sizes>1 would ignore alpha values + * v1.5 Alpha values used in the gradient map + * v1.4 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - May 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +import flash.display.Bitmap; +import flash.geom.Matrix; +import flash.display.BitmapData; +import flash.display.Shape; +import flash.display.GradientType; +import flash.display.SpreadMethod; +import flash.display.InterpolationMethod; + +/** + * Adds a set of color gradient creation / rendering functions + */ +class FlxGradient +{ + + public function new() + { + } + + public static function createGradientMatrix(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90):Dynamic + { + var gradientMatrix:Matrix=new Matrix(); + + // Rotation(in radians)that the gradient is rotated + var rot:Float=FlxMath.asRadians(rotation); + + // Last 2 values=horizontal and vertical shift(in pixels) + if(chunkSize==1) + { + gradientMatrix.createGradientBox(width, height, rot, 0, 0); + } + else + { + gradientMatrix.createGradientBox(width, height / chunkSize, rot, 0, 0); + } + + // Create the alpha and ratio arrays + + var alpha:Array=new Array(); + + for(ai in 0...colors.length) + { + alpha.push(FlxColor.getAlphaFloat(colors[ai])); + } + + var ratio:Array=new Array(); + + if(colors.length==2) + { + ratio[0]=0; + ratio[1]=255; + } + else + { + // Spread value + var spread:Int=255 /(colors.length - 1); + + ratio.push(0); + + for(var ri:Int=1;ri=new Array(); + + for(y in 0...data.height) + { + result.push(data.getPixel32(0, y)); + } + + return result; + } + + /** + * Creates an FlxSprite of the given width/height with a colour gradient flowing through it. + * + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * + * @return An FlxSprite containing your gradient(if valid parameters given!) + */ + public static function createGradientFlxSprite(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):FlxSprite + { + var data:BitmapData=createGradientBitmapData(width, height, colors, chunkSize, rotation, Interpolate); + + var dest:FlxSprite=new FlxSprite().makeGraphic(width, height); + + dest.pixels=data; + + return dest; + } + + public static function createGradientBitmapData(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):BitmapData + { + // Sanity checks + if(width<1) + { + width=1; + } + + if(height<1) + { + height=1; + } + + var gradient:Dynamic=createGradientMatrix(width, height, colors, chunkSize, rotation); + + var s:Shape=new Shape(); + + if(interpolate) + { + s.graphics.beginGradientFill(GradientType.LINEAR, colors, gradient.alpha, gradient.ratio, gradient.matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0); + } + else + { + s.graphics.beginGradientFill(GradientType.LINEAR, colors, gradient.alpha, gradient.ratio, gradient.matrix, SpreadMethod.PAD, InterpolationMethod.LINEAR_RGB, 0); + } + + if(chunkSize==1) + { + s.graphics.drawRect(0, 0, width, height); + } + else + { + s.graphics.drawRect(0, 0, width, height / chunkSize); + } + + var data:BitmapData=new BitmapData(width, height, true, 0x0); + + if(chunkSize==1) + { + data.draw(s); + } + else + { + var tempBitmap:Bitmap=new Bitmap(new BitmapData(width, height / chunkSize, true, 0x0)); + tempBitmap.bitmapData.draw(s); + tempBitmap.scaleY=chunkSize; + + var sM:Matrix=new Matrix(); + sM.scale(tempBitmap.scaleX, tempBitmap.scaleY); + + data.draw(tempBitmap, sM); + } + + return data; + } + + /** + * Creates a new gradient and overlays that on-top of the given FlxSprite at the destX/destY coordinates(default 0,0)
+ * Use low alpha values in the colours to have the gradient overlay and not destroy the image below + * + * @param dest The FlxSprite to overlay the gradient onto + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param destX The X offset the gradient is drawn at(default 0) + * @param destY The Y offset the gradient is drawn at(default 0) + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * @return The composited FlxSprite(for chaining, if you need) + */ + public static function overlayGradientOnFlxSprite(dest:FlxSprite, width:Int, height:Int, colors:Array, destX:Int=0, destY:Int=0, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):FlxSprite + { + if(width>dest.width) + { + width=dest.width; + } + + if(height>dest.height) + { + height=dest.height; + } + + var source:FlxSprite=createGradientFlxSprite(width, height, colors, chunkSize, rotation, Interpolate); + + dest.stamp(source, destX, destY); + + return dest; + } + + /** + * Creates a new gradient and overlays that on-top of the given BitmapData at the destX/destY coordinates(default 0,0)
+ * Use low alpha values in the colours to have the gradient overlay and not destroy the image below + * + * @param dest The BitmapData to overlay the gradient onto + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param destX The X offset the gradient is drawn at(default 0) + * @param destY The Y offset the gradient is drawn at(default 0) + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * @return The composited BitmapData + */ + public static function overlayGradientOnBitmapData(dest:BitmapData, width:Int, height:Int, colors:Array, destX:Int=0, destY:Int=0, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):BitmapData + { + if(width>dest.width) + { + width=dest.width; + } + + if(height>dest.height) + { + height=dest.height; + } + + var source:BitmapData=createGradientBitmapData(width, height, colors, chunkSize, rotation, Interpolate); + + dest.copyPixels(source, new Rectangle(0, 0, source.width, source.height), new Point(destX, destY), null, null, true); + + return dest; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGridOverlay.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGridOverlay.hx new file mode 100644 index 0000000..d80b8d5 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxGridOverlay.hx @@ -0,0 +1,186 @@ +/** + * FlxGridOverlay + * -- Part of the Flixel Power Tools set + * + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.1 - April 23rd 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +class FlxGridOverlay +{ + public function new() + { + } + + /** + * Creates an FlxSprite of the given width and height filled with a checkerboard pattern.
+ * Each grid cell is the specified width and height, and alternates between two colors.
+ * If alternate is true each row of the pattern will be offset, for a proper checkerboard style. If false each row will be the same colour, creating a striped-pattern effect.
+ * So to create an 8x8 grid you'd call create(8,8) + * + * @param cellWidth The grid cell width + * @param cellHeight The grid cell height + * @param width The width of the FlxSprite. If -1 it will be the size of the game(FlxG.width) + * @param height The height of the FlxSprite. If -1 it will be the size of the game(FlxG.height) + * @param addLegend TODO + * @param alternate Should the pattern alternate on each new row? Default true=checkerboard effect. False=vertical stripes + * @param color1 The first fill colour in 0xAARRGGBB format + * @param color2 The second fill colour in 0xAARRGGBB format + * + * @return FlxSprite of given width/height + */ + public static function create(cellWidth:Int, cellHeight:Int, width:Int=-1, height:Int=-1, addLegend:Bool=false, alternate:Bool=true, color1:Int=0xffe7e6e6, color2:Int=0xffd9d5d5):FlxSprite + { + if(width==-1) + { + width=FlxG.width; + } + + if(height==-1) + { + height=FlxG.height; + } + + if(width + * Each grid cell is the specified width and height, and alternates between two colors.
+ * If alternate is true each row of the pattern will be offset, for a proper checkerboard style. If false each row will be the same colour, creating a striped-pattern effect.
+ * So to create an 8x8 grid you'd call create(8,8, + * + * @param source The FlxSprite you wish to draw the grid on-top of. This updates its pixels value, not just the current frame(don't use animated sprites!) + * @param cellWidth The grid cell width + * @param cellHeight The grid cell height + * @param width The width of the FlxSprite. If -1 it will be the size of the game(FlxG.width) + * @param height The height of the FlxSprite. If -1 it will be the size of the game(FlxG.height) + * @param addLegend TODO + * @param alternate Should the pattern alternate on each new row? Default true=checkerboard effect. False=vertical stripes + * @param color1 The first fill colour in 0xAARRGGBB format + * @param color2 The second fill colour in 0xAARRGGBB format + * + * @return The modified source FlxSprite + */ + public static function overlay(source:FlxSprite, cellWidth:Int, cellHeight:Int, width:Int=-1, height:Int=-1, addLegend:Bool=false, alternate:Bool=true, color1:Int=0x88e7e6e6, color2:Int=0x88d9d5d5):FlxSprite + { + if(width==-1) + { + width=FlxG.width; + } + + if(height==-1) + { + height=FlxG.height; + } + + if(widthsource.width) + { + throw Dynamic("cellWidth larger than FlxSprites width"); + return source; + } + + if(cellHeight>source.height) + { + throw Dynamic("cellHeight larger than FlxSprites height"); + return source; + } + + if(source.width0 && lastColor==rowColor && alternate) + { + (lastColor==color1)? lastColor=color2:lastColor=color1; + } + else if(y>0 && lastColor !=rowColor && alternate==false) + { + (lastColor==color2)? lastColor=color1:lastColor=color2; + } + + for(x in 0...width +=cellWidth) + { + if(x==0) + { + rowColor=lastColor; + } + + grid.fillRect(new Rectangle(x, y, cellWidth, cellHeight), lastColor); + + if(lastColor==color1) + { + lastColor=color2; + } + else + { + lastColor=color1; + } + } + } + + return grid; + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx new file mode 100644 index 0000000..827f1c8 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx @@ -0,0 +1,33 @@ +package org.flixel.plugin.photonstorm +{ +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import flash.utils.getTimer; + +class FlxLinkedGroup extends FlxGroup +{ + //private var queue + + + public function new(MaxSize:Int=0) + { + super(MaxSize); + } + + public function addX(newX:Int):Void + { + for(var s:FlxSprite in members) + { + s.x +=newX; + } + } + + public function angle(newX:Int):Void + { + for(var s:FlxSprite in members) + { + s.angle +=newX; + } + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMath.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMath.hx new file mode 100644 index 0000000..bd29d36 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMath.hx @@ -0,0 +1,609 @@ +/** + * FlxMath + * -- Part of the Flixel Power Tools set + * + * v1.7 Added mouseInFlxRect + * v1.6 Added wrapAngle, angleLimit and more documentation + * v1.5 Added pointInCoordinates, pointInFlxRect and pointInRectangle + * v1.4 Updated for the Flixel 2.5 Plugin system + * + * @version 1.7 - June 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Rectangle; + +import org.flixel.*; + +/** + * Adds a set of fast Math functions and extends a few commonly used ones + */ +class FlxMath +{ + public static var getrandmax:Int=int.MAX_VALUE; + private static var mr:Int=0; + private static var cosTable:Array=new Array; + private static var sinTable:Array=new Array; + + private static var coefficient1:Float=Math.PI / 4; + private static inline var RADTODEG:Float=180 / Math.PI; + private static inline var DEGTORAD:Float=Math.PI / 180; + + public function new() + { + } + + /** + * Returns true if the given x/y coordinate is within the given rectangular block + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rectX The X value of the region to test within + * @param rectY The Y value of the region to test within + * @param rectWidth The width of the region to test within + * @param rectHeight The height of the region to test within + * + * @return true if pointX/pointY is within the region, otherwise false + */ + public static function pointInCoordinates(pointX:Int, pointY:Int, rectX:Int, rectY:Int, rectWidth:Int, rectHeight:Int):Bool + { + if(pointX>=rectX && pointX<=(rectX + rectWidth)) + { + if(pointY>=rectY && pointY<=(rectY + rectHeight)) + { + return true; + } + } + + return false; + } + + /** + * Returns true if the given x/y coordinate is within the given rectangular block + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rect The FlxRect to test within + * @return true if pointX/pointY is within the FlxRect, otherwise false + */ + public static function pointInFlxRect(pointX:Int, pointY:Int, rect:FlxRect):Bool + { + if(pointX>=rect.x && pointX<=rect.right && pointY>=rect.y && pointY<=rect.bottom) + { + return true; + } + + return false; + } + + /** + * Returns true if the mouse world x/y coordinate are within the given rectangular block + * + * @param useWorldCoords If true the world x/y coordinates of the mouse will be used, otherwise screen x/y + * @param rect The FlxRect to test within. If this is null for any reason this function always returns true. + * + * @return true if mouse is within the FlxRect, otherwise false + */ + public static function mouseInFlxRect(useWorldCoords:Bool, rect:FlxRect):Bool + { + if(rect==null) + { + return true; + } + + if(useWorldCoords) + { + return pointInFlxRect(FlxG.mouse.x, FlxG.mouse.y, rect); + } + else + { + return pointInFlxRect(FlxG.mouse.screenX, FlxG.mouse.screenY, rect); + } + } + + /** + * Returns true if the given x/y coordinate is within the Rectangle + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rect The Rectangle to test within + * @return true if pointX/pointY is within the Rectangle, otherwise false + */ + public static function pointInRectangle(pointX:Int, pointY:Int, rect:Rectangle):Bool + { + if(pointX>=rect.x && pointX<=rect.right && pointY>=rect.y && pointY<=rect.bottom) + { + return true; + } + + return false; + } + + /** + * A faster(but much less accurate)version of Math.atan2(). For close range / loose comparisons this works very well, + * but avoid for long-distance or high accuracy simulations. + * Based on:http://blog.gamingyourway.com/PermaLink,guid,78341247-3344-4a7a-acb2-c742742edbb1.aspx + *

+ * Computes and returns the angle of the point y/x in radians, when measured counterclockwise from a circle's x axis + *(where 0,0 represents the center of the circle). The return value is between positive pi and negative pi. + * Note that the first parameter to atan2 is always the y coordinate. + *

+ * @param y The y coordinate of the point + * @param x The x coordinate of the point + * @return The angle of the point x/y in radians + */ + public static function atan2(y:Float, x:Float):Float + { + var absY:Float=y; + var coefficient2:Float=3 * coefficient1; + var r:Float; + var angle:Float; + + if(absY<0) + { + absY=-absY; + } + + if(x>=0) + { + r=(x - absY)/(x + absY); + angle=coefficient1 - coefficient1 * r; + } + else + { + r=(x + absY)/(absY - x); + angle=coefficient2 - coefficient1 * r; + } + + return y<0 ? -angle:angle; + } + + /** + * Generate a sine and cosine table simultaneously and extremely quickly. Based on research by Franky of scene.at + *

+ * The parameters allow you to specify the length, amplitude and frequency of the wave. Once you have called this function + * you should get the results via getSinTable()and getCosTable(). This generator is fast enough to be used in real-time. + *

+ * @param length The length of the wave + * @param sinAmplitude The amplitude to apply to the sine table(default 1.0)if you need values between say -+ 125 then give 125 as the value + * @param cosAmplitude The amplitude to apply to the cosine table(default 1.0)if you need values between say -+ 125 then give 125 as the value + * @param frequency The frequency of the sine and cosine table data + * @return Returns the sine table + * @see getSinTable + * @see getCosTable + */ + public static function sinCosGenerator(length:Int, sinAmplitude:Float=1.0, cosAmplitude:Float=1.0, frequency:Float=1.0):Array + { + var sin:Float=sinAmplitude; + var cos:Float=cosAmplitude; + var frq:Float=frequency * Math.PI / length; + + cosTable=new Array(); + sinTable=new Array(); + + for(c in 0...length) + { + cos -=sin * frq; + sin +=cos * frq; + + cosTable[c]=cos; + sinTable[c]=sin; + } + + return sinTable; + } + + /** + * Returns the sine table generated by sinCosGenerator(), or an empty array object if not yet populated + * @return Array of sine wave data + * @see sinCosGenerator + */ + public static function getSinTable():Array + { + return sinTable; + } + + /** + * Returns the cosine table generated by sinCosGenerator(), or an empty array object if not yet populated + * @return Array of cosine wave data + * @see sinCosGenerator + */ + public static function getCosTable():Array + { + return cosTable; + } + + /** + * A faster version of Math.sqrt + *

+ * Computes and returns the square root of the specified number. + *

+ * @link http://osflash.org/as3_speed_optimizations#as3_speed_tests + * @param val A number greater than or equal to 0 + * @return If the parameter val is greater than or equal to zero, a number;otherwise NaN(not a number). + */ + public static function sqrt(val:Float):Float + { + if(isNaN(val)) + { + return NaN; + } + + var thresh:Float=0.002; + var b:Float=val * 0.25; + var a:Float; + var c:Float; + + if(val==0) + { + return 0; + } + + do { + c=val / b; + b=(b + c)* 0.5; + a=b - c; + if(a<0)a=-a; + } + while(a>thresh); + + return b; + } + + /** + * Generates a small random number between 0 and 65535 very quickly + *

+ * Generates a small random number between 0 and 65535 using an extremely fast cyclical generator, + * with an even spread of numbers. After the 65536th call to this function the value resets. + *

+ * @return A pseudo random value between 0 and 65536 inclusive. + */ + public static function miniRand():Int + { + var result:Int=mr; + + result++; + result *=75; + result %=65537; + result--; + + mr++; + + if(mr==65536) + { + mr=0; + } + + return result; + } + + /** + * Generate a random Integer + *

+ * If called without the optional min, max arguments rand()returns a peudo-random Integer between 0 and getrandmax(). + * If you want a random number between 5 and 15, for example,(inclusive)use rand(5, 15) + * Parameter order is insignificant, the return will always be between the lowest and highest value. + *

+ * @param min The lowest value to return(default:0) + * @param max The highest value to return(default:getrandmax) + * @param excludes An Array of Integers that will NOT be returned(default:null) + * @return A pseudo-random value between min(or 0)and max(or getrandmax, inclusive) + */ + public static function rand(min:Float=NaN, max:Float=NaN, excludes:Array=null):Int + { + if(isNaN(min)) + { + min=0; + } + + if(isNaN(max)) + { + max=getrandmax; + } + + if(min==max) + { + return min; + } + + if(excludes !=null) + { + // Sort the exclusion array + excludes.sort(Array.NUMERIC); + + var result:Int; + + do { + if(min=0); + + return result; + } + else + { + // Reverse check + if(min + * If called without the optional min, max arguments rand()returns a peudo-random float between 0 and getrandmax(). + * If you want a random number between 5 and 15, for example,(inclusive)use rand(5, 15) + * Parameter order is insignificant, the return will always be between the lowest and highest value. + *

+ * @param min The lowest value to return(default:0) + * @param max The highest value to return(default:getrandmax) + * @return A pseudo random value between min(or 0)and max(or getrandmax, inclusive) + */ + public static function randFloat(min:Float=NaN, max:Float=NaN):Float + { + if(isNaN(min)) + { + min=0; + } + + if(isNaN(max)) + { + max=getrandmax; + } + + if(min==max) + { + return min; + } + else if(min + * Returns true or false based on the chance value(default 50%). For example if you wanted a player to have a 30% chance + * of getting a bonus, call chanceRoll(30)- true means the chance passed, false means it failed. + *

+ * @param chance The chance of receiving the value. Should be given as a Int between 0 and 100(effectively 0% to 100%) + * @return true if the roll passed, or false + */ + public static function chanceRoll(chance:Int=50):Bool + { + if(chance<=0) + { + return false; + } + else if(chance>=100) + { + return true; + } + else + { + if(Math.random()* 100>=chance) + { + return false; + } + else + { + return true; + } + } + } + + /** + * Adds the given amount to the value, but never lets the value go over the specified maximum + * + * @param value The value to add the amount to + * @param amount The amount to add to the value + * @param max The maximum the value is allowed to be + * @return The new value + */ + public static function maxAdd(value:Int, amount:Int, max:Int):Int + { + value +=amount; + + if(value>max) + { + value=max; + } + + return value; + } + + /** + * Adds value to amount and ensures that the result always stays between 0 and max, by wrapping the value around. + *

Values must be positive Integers, and are passed through Math.abs

+ * + * @param value The value to add the amount to + * @param amount The amount to add to the value + * @param max The maximum the value is allowed to be + * @return The wrapped value + */ + public static function wrapValue(value:Int, amount:Int, max:Int):Int + { + var diff:Int; + + value=Math.abs(value); + amount=Math.abs(amount); + max=Math.abs(max); + + diff=(value + amount)% max; + + return diff; + } + + /** + * Finds the length of the given vector + * + * @param dx + * @param dy + * + * @return + */ + public static function vectorLength(dx:Float, dy:Float):Float + { + return Math.sqrt(dx * dx + dy * dy); + } + + /** + * Finds the dot product value of two vectors + * + * @param ax Vector X + * @param ay Vector Y + * @param bx Vector X + * @param by Vector Y + * + * @return Dot product + */ + public static function dotProduct(ax:Float, ay:Float, bx:Float, by:Float):Float + { + return ax * bx + ay * by; + } + + /** + * Randomly returns either a 1 or -1 + * + * @return 1 or -1 + */ + public static function randomSign():Float + { + return(Math.random()>0.5)? 1:-1; + } + + /** + * Returns true if the number given is odd. + * + * @param n The number to check + * + * @return True if the given number is odd. False if the given number is even. + */ + public static function isOdd(n:Float):Bool + { + if(n & 1) + { + return true; + } + else + { + return false; + } + } + + /** + * Returns true if the number given is even. + * + * @param n The number to check + * + * @return True if the given number is even. False if the given number is odd. + */ + public static function isEven(n:Float):Bool + { + if(n & 1) + { + return false; + } + else + { + return true; + } + } + + /** + * Keeps an angle value between -180 and +180
+ * Should be called whenever the angle is updated on the FlxSprite to stop it from going insane. + * + * @param angle The angle value to check + * + * @return The new angle value, returns the same as the input angle if it was within bounds + */ + public static function wrapAngle(angle:Float):Int + { + var result:Int=Std.int(angle); + + if(angle>180) + { + result=-180; + } + else if(angle<-180) + { + result=180; + } + + return result; + } + + /** + * Keeps an angle value between the given min and max values + * + * @param angle The angle value to check. Must be between -180 and +180 + * @param min The minimum angle that is allowed(must be -180 or greater) + * @param max The maximum angle that is allowed(must be 180 or less) + * + * @return The new angle value, returns the same as the input angle if it was within bounds + */ + public static function angleLimit(angle:Int, min:Int, max:Int):Int + { + var result:Int=angle; + + if(angle>max) + { + result=max; + } + else if(angle + * Converts the radians value Into degrees and returns + *

+ * @param radians The value in radians + * @return Float Degrees + */ + public static function asDegrees(radians:Float):Float + { + return radians * RADTODEG; + } + + /** + * Converts a Degrees value Into a Radian + *

+ * Converts the degrees value Into radians and returns + *

+ * @param degrees The value in degrees + * @return Float Radians + */ + public static function asRadians(degrees:Float):Float + { + return degrees * DEGTORAD; + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMouseControl.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMouseControl.hx new file mode 100644 index 0000000..3d75e97 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxMouseControl.hx @@ -0,0 +1,270 @@ +/** + * FlxMouseControl + * -- Part of the Flixel Power Tools set + * + * v1.2 Added Mouse Zone, Mouse Speed and refactored addToStack process + * v1.1 Moved to a native plugin + * v1.0 First release + * + * @version 1.2 - July 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; + +class FlxMouseControl extends FlxBasic +{ + /** + * Use withsort()to sort in ascending order. + */ + public static inline var ASCENDING:Int=-1; + + /** + * Use withsort()to sort in descending order. + */ + public static inline var DESCENDING:Int=1; + + /** + * The value that the FlxExtendedSprites are sorted by before deciding which is "on-top" for click select + */ + public static var sortIndex:String="y"; + + /** + * The sorting order. If the sortIndex is "y" and the order is ASCENDING then a sprite with a Y value of 200 would be "on-top" of one with a Y value of 100. + */ + public static var sortOrder:Int=ASCENDING; + + /** + * Is the mouse currently dragging a sprite? If you have just clicked but NOT yet moved the mouse then this might return false. + */ + public static var isDragging:Bool=false; + + /** + * The FlxExtendedSprite that is currently being dragged, if any. + */ + public static var dragTarget:FlxExtendedSprite; + + /** + * The FlxExtendedSprite that currently has the mouse button pressed on it + */ + public static var clickTarget:FlxExtendedSprite; + private static var clickStack:Array=new Array; + private static var clickCoords:FlxPoint; + private static var hasClickTarget:Bool=false; + + private static var oldX:Int; + private static var oldY:Int; + + /** + * The speed the mouse is moving on the X axis in pixels per frame + */ + public static var speedX:Int; + + /** + * The speed the mouse is moving on the Y axis in pixels per frame + */ + public static var speedY:Int; + + /** + * The mouse can be set to only be active within a specific FlxRect region of the game world. + * If outside this FlxRect no clicks, drags or throws will be processed. + * If the mouse leaves this region while still dragging then the sprite is automatically dropped and its release handler is called. + * Set the FlxRect to null to disable the zone. + */ + public static var mouseZone:FlxRect; + + /** + * Instead of using a mouseZone(Std.is(which, calculated) in world coordinates)you can limit the mouse to the FlxG.camera.deadzone area instead. + * If set to true the mouse will use the camera deadzone. If false(or the deadzone is null)no check will take place. + * Note that this takes priority over the mouseZone above. If the mouseZone and deadzone are set, the deadzone is used. + */ + public static var linkToDeadZone:Bool=false; + + public function new() + { + } + + /** + * Adds the given FlxExtendedSprite to the stack of potential sprites that were clicked, the stack is then sorted and the final sprite is selected from that + * + * @param item The FlxExtendedSprite that was clicked by the mouse + */ + public static function addToStack(item:FlxExtendedSprite):Void + { + if(Std.is(mouseZone, FlxRect)) + { + if(FlxMath.pointInFlxRect(FlxG.mouse.x, FlxG.mouse.y, mouseZone)==true) + { + clickStack.push(item); + } + } + else + { + clickStack.push(item); + } + } + + /** + * Main Update Loop - checks mouse status and updates FlxExtendedSprites accordingly + */ + override public function update():Void + { + // Update mouse speed + speedX=FlxG.mouse.screenX - oldX; + speedY=FlxG.mouse.screenY - oldY; + + oldX=FlxG.mouse.screenX; + oldY=FlxG.mouse.screenY; + + // Is the mouse currently pressed down on a target? + if(hasClickTarget) + { + if(FlxG.mouse.pressed()) + { + // Has the mouse moved? If so then we're candidate for a drag + if(isDragging==false && clickTarget.draggable &&(clickCoords.x !=FlxG.mouse.x || clickCoords.y !=FlxG.mouse.y)) + { + // Drag on + isDragging=true; + + dragTarget=clickTarget; + + dragTarget.startDrag(); + } + } + else + { + releaseMouse(); + } + + if(linkToDeadZone) + { + if(FlxMath.mouseInFlxRect(false, FlxG.camera.deadzone)==false) + { + releaseMouse(); + } + } + else if(FlxMath.mouseInFlxRect(true, mouseZone)==false) + { + // Is a mouse zone enabled? In which case check if we're still in it + releaseMouse(); + } + } + else + { + // No target, but is the mouse down? + + if(FlxG.mouse.justPressed()) + { + clickStack.length=0; + } + + // If you are wondering how the brand new array can have anything in it by now, it's because FlxExtendedSprite + // adds itself to the clickStack + + if(FlxG.mouse.pressed()&& clickStack.length>0) + { + assignClickedSprite(); + } + } + } + + /** + * Internal function used to release the click / drag targets and reset the mouse state + */ + private function releaseMouse():Void + { + // Mouse is no longer down, so tell the click target it's free - this will also stop dragging if happening + clickTarget.mouseReleasedHandler(); + + hasClickTarget=false; + clickTarget=null; + + isDragging=false; + dragTarget=null; + } + + /** + * Once the clickStack is created this sorts it and then picks the sprite with the highest priority(based on sortIndex and sortOrder) + */ + private function assignClickedSprite():Void + { + // If there is more than one potential target then sort them + if(clickStack.length>1) + { + clickStack.sort(sortHandler); + } + + clickTarget=clickStack.pop(); + + clickCoords=clickTarget.point; + + hasClickTarget=true; + + clickTarget.mousePressedHandler(); + + clickStack.length=0; + } + + /** + * Helper function for the sort process. + * + * @param item1 The first object being sorted. + * @param item2 The second object being sorted. + * + * @return An Integer value:-1(item1 before item2), 0(same), or 1(item1 after item2) + */ + private function sortHandler(item1:FlxExtendedSprite, item2:FlxExtendedSprite):Int + { + if(item1[sortIndex]item2[sortIndex]) + { + return -sortOrder; + } + + return 0; + } + + /** + * Removes all references to any click / drag targets and resets this class + */ + public static function clear():Void + { + hasClickTarget=false; + + if(clickTarget) + { + clickTarget.mouseReleasedHandler(); + } + + clickTarget=null; + + isDragging=false; + + if(dragTarget) + { + dragTarget.stopDrag(); + } + + speedX=0; + speedY=0; + dragTarget=null; + mouseZone=null; + linkToDeadZone=false; + } + + /** + * Runs when this plugin is destroyed + */ + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxPowerTools.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxPowerTools.hx new file mode 100644 index 0000000..c3dd1f5 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxPowerTools.hx @@ -0,0 +1,23 @@ +/** + * Flixel Power Tools + * + * Version information and constants the other classes in this package can reference + * + * @version 1.9 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +class FlxPowerTools +{ + public static inline var LIBRARY_NAME:String="flixel power tools"; + public static inline var LIBRARY_MAJOR_VERSION:Int=1; + public static inline var LIBRARY_MINOR_VERSION:Int=9; + + public function new() + { + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScreenGrab.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScreenGrab.hx new file mode 100644 index 0000000..1584a47 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScreenGrab.hx @@ -0,0 +1,178 @@ +/** + * FlxScreenGrab + * -- Part of the Flixel Power Tools set + * + * v1.0 Updated for the Flixel 2.5 Plugin system + * + * @version 1.0 - April 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import flash.geom.Rectangle; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Matrix; +import flash.net.FileReference; +import flash.utils.ByteArray; +import flash.utils.getTimer; + +/** + * Captures a screen grab of the game and stores it locally, optionally saving as a PNG. + */ +class FlxScreenGrab extends FlxBasic +{ + public static var screenshot:Bitmap; + private static var hotkey:String=""; + private static var autoSave:Bool=false; + private static var autoHideMouse:Bool=false; + private static var region:Rectangle; + + public function new() + { + } + + /** + * Defines the region of the screen that should be captured. If you need it to be a fixed location then use this.
+ * If you want to grab the whole SWF size, you don't need to set this as that is the default.
+ * Remember that if your game is running in a zoom mode>1 you need to account for this here. + * + * @param x The x coordinate(in Flash display space, not Flixel game world) + * @param y The y coordinate(in Flash display space, not Flixel game world) + * @param width The width of the grab region + * @param height The height of the grab region + */ + public static function defineCaptureRegion(x:Int, y:Int, width:Int, height:Int):Void + { + region=new Rectangle(x, y, width, height); + } + + /** + * Clears a previously defined capture region + */ + public static function clearCaptureRegion():Void + { + region=null; + } + + /** + * Specify which key will capture a screen shot. Use the String value of the key in the same way FlxG.keys does(so "F1" for example)
+ * Optionally save the image to a file immediately. This uses the file systems "Save as" dialog window and pauses your game during the process.
+ * + * @param key String The key you press to capture the screen(i.e. "F1", "SPACE", etc - see system.input.Keyboard.as source for reference) + * @param saveToFile Boolean If set to true it will immediately encodes the grab to a PNG and open a "Save As" dialog window when the hotkey is pressed + * @param hideMouse Boolean If set to true the mouse will be hidden before capture and displayed afterwards when the hotkey is pressed + */ + public static function defineHotKey(key:String, saveToFile:Bool=false, hideMouse:Bool=false):Void + { + hotkey=key; + autoSave=saveToFile; + autoHideMouse=hideMouse; + } + + /** + * Clears a previously defined hotkey + */ + public static function clearHotKey():Void + { + hotkey=""; + autoSave=false; + autoHideMouse=false; + } + + /** + * Takes a screen grab immediately of the given region or a previously defined region + * + * @param captureRegion A Rectangle area to capture. This over-rides that set by "defineCaptureRegion". If neither are set the full SWF size is used. + * @param saveToFile Boolean If set to true it will immediately encode the grab to a PNG and open a "Save As" dialog window + * @param hideMouse Boolean If set to true the mouse will be hidden before capture and displayed again afterwards + * @return Bitmap The screen grab as a Flash Bitmap image + */ + public static function grab(captureRegion:Rectangle=null, saveToFile:Bool=false, hideMouse:Bool=false):Bitmap + { + var bounds:Rectangle; + + if(captureRegion) + { + bounds=new Rectangle(captureRegion.x, captureRegion.y, captureRegion.width, captureRegion.height); + } + else if(region) + { + bounds=new Rectangle(region.x, region.y, region.width, region.height); + } + else + { + bounds=new Rectangle(0, 0, FlxG.stage.stageWidth, FlxG.stage.stageHeight); + } + + var theBitmap:Bitmap=new Bitmap(new BitmapData(bounds.width, bounds.height, true, 0x0)); + + var m:Matrix=new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y); + + if(autoHideMouse || hideMouse) + { + FlxG.mouse.hide(); + } + + theBitmap.bitmapData.draw(FlxG.stage, m); + + if(autoHideMouse || hideMouse) + { + FlxG.mouse.show(); + } + + screenshot=theBitmap; + + if(saveToFile || autoSave) + { + save(); + } + + return theBitmap; + } + + private static function save(filename:String=""):Void + { + if(screenshot.bitmapData==null) + { + return; + } + + var png:ByteArray=PNGEncoder.encode(screenshot.bitmapData); + + var file:FileReference=new FileReference(); + + if(filename=="") + { + filename="grab" + getTimer().toString()+ ".png"; + } + else if(filename.substr(-4)!=".png") + { + filename=filename.concat(".png"); + } + + file.save(png, filename); + } + + override public function update():Void + { + if(hotkey !="") + { + if(FlxG.keys.justReleased(hotkey)) + { + trace("key pressed"); + grab(); + } + } + } + + override public function destroy():Void + { + clearCaptureRegion(); + clearHotKey(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollZone.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollZone.hx new file mode 100644 index 0000000..4d39c3d --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollZone.hx @@ -0,0 +1,257 @@ +/** + * FlxScrollZone + * -- Part of the Flixel Power Tools set + * + * v1.4 Added "clearRegion" support for when you use Sprites with transparency and renamed parameter to onlyScrollOnscreen + * v1.3 Swapped plugin update for draw, now smoother / faster in some fps cases + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - May 16th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm. My thanks to Ralph Hauwert for help with this. +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import org.flixel.*; + +/** + * FlxScrollZone allows you to scroll the content of an FlxSprites bitmapData in any direction you like. + */ +class FlxScrollZone extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + private static var zeroPoint:Point=new Point; + + public function new() + { + } + + /** + * Add an FlxSprite to the Scroll Manager, setting up one scrolling region.
+ * To add extra scrolling regions on the same sprite use addZone() + * + * @param source The FlxSprite to apply the scroll to + * @param region The region, specified as a Rectangle, of the FlxSprite that you wish to scroll + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param onlyScrollOnscreen Only update this FlxSprite if visible onScreen(default true)Saves performance by not scrolling offscreen sprites, but this isn't always desirable + * @param clearRegion Set to true if you want to clear the scrolling area of the FlxSprite with a 100% transparent fill before applying the scroll texture(default false) + * @see createZone + */ + public static function add(source:FlxSprite, region:Rectangle, distanceX:Float, distanceY:Float, onlyScrollOnscreen:Bool=true, clearRegion:Bool=false):Void + { + if(members[source]) + { + throw Dynamic("FlxSprite already exists in FlxScrollZone, use addZone to add a new scrolling region to an already added FlxSprite"); + } + + var data:Dynamic=new Dynamic(); + + data.source=source; + data.scrolling=true; + data.onlyScrollOnscreen=onlyScrollOnscreen; + data.zones=new Array; + + members[source]=data; + + createZone(source, region, distanceX, distanceY, clearRegion); + } + + /** + * Creates a new scrolling region to an FlxSprite already in the Scroll Manager(see add())
+ * + * @param source The FlxSprite to apply the scroll to + * @param region The region, specified as a Rectangle, of the FlxSprite that you wish to scroll + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param clearRegion Set to true if you want to fill the scroll region of the FlxSprite with a 100% transparent fill before scrolling it(default false) + */ + public static function createZone(source:FlxSprite, region:Rectangle, distanceX:Float, distanceY:Float, clearRegion:Bool=false):Void + { + var texture:BitmapData=new BitmapData(region.width, region.height, true, 0x00000000); + texture.copyPixels(source.framePixels, region, zeroPoint, null, null, true); + + var data:Dynamic=new Dynamic(); + + data.buffer=new Sprite; + data.texture=texture; + data.region=region; + data.clearRegion=clearRegion; + data.distanceX=distanceX; + data.distanceY=distanceY; + data.scrollMatrix=new Matrix(); + data.drawMatrix=new Matrix(1, 0, 0, 1, region.x, region.y); + + members[source].zones.push(data); + } + + /** + * Sets the draw Matrix for the given FlxSprite scroll zone
+ * Warning:Modify this at your own risk! + * + * @param source The FlxSprite to set the draw matrix on + * @param matrix The Matrix to use during the scroll update draw + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + * @return Matrix The draw matrix used in the scroll update + */ + public static function updateDrawMatrix(source:FlxSprite, matrix:Matrix, zone:Int=0):Void + { + members[source].zones[zone].drawMatrix=matrix; + } + + /** + * Returns the draw Matrix for the given FlxSprite scroll zone + * + * @param source The FlxSprite to get the draw matrix from + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + * @return Matrix The draw matrix used in the scroll update + */ + public static function getDrawMatrix(source:FlxSprite, zone:Int=0):Matrix + { + return members[source].zones[zone].drawMatrix; + } + + /** + * Removes an FlxSprite and all of its scrolling zones. Note that it doesn't restore the sprite bitmapData. + * + * @param source The FlxSprite to remove all scrolling zones for. + * @return Boolean true if the FlxSprite was removed, otherwise false. + */ + public static function remove(source:FlxSprite):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FlxSprites, and all of their scrolling zones.
+ * This is called automatically if the plugin is ever destroyed. + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + delete members[obj.source]; + } + } + + /** + * Update the distance in pixels to scroll on the X axis. + * + * @param source The FlxSprite to apply the scroll to + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + */ + public static function updateX(source:FlxSprite, distanceX:Float, zone:Int=0):Void + { + members[source].zones[zone].distanceX=distanceX; + } + + /** + * Update the distance in pixels to scroll on the X axis. + * + * @param source The FlxSprite to apply the scroll to + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + */ + public static function updateY(source:FlxSprite, distanceY:Float, zone:Int=0):Void + { + members[source].zones[zone].distanceY=distanceY; + } + + /** + * Starts scrolling on the given FlxSprite. If no FlxSprite is given it starts scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to re-start it if you have stopped it via stopScrolling.
+ * + * @param source The FlxSprite to start scrolling on. If left as null it will start scrolling on all sprites. + */ + public static function startScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=true; + } + } + } + + /** + * Stops scrolling on the given FlxSprite. If no FlxSprite is given it stops scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to stop it.
+ * + * @param source The FlxSprite to stop scrolling on. If left as null it will stop scrolling on all sprites. + */ + public static function stopScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=false; + } + } + } + + override public function draw():Void + { + for(var obj:Dynamic in members) + { + if((obj.onlyScrollOnscreen==true && obj.source.onScreen())&& obj.scrolling==true && obj.source.exists) + { + scroll(obj); + } + } + } + + private function scroll(data:Dynamic):Void + { + // Loop through the scroll zones defined in this object + for(var zone:Dynamic in data.zones) + { + zone.scrollMatrix.tx +=zone.distanceX; + zone.scrollMatrix.ty +=zone.distanceY; + + zone.buffer.graphics.clear(); + zone.buffer.graphics.beginBitmapFill(zone.texture, zone.scrollMatrix, true, false); + zone.buffer.graphics.drawRect(0, 0, zone.region.width, zone.region.height); + zone.buffer.graphics.endFill(); + + if(zone.clearRegion) + { + data.source.pixels.fillRect(zone.region, 0x0); + } + + data.source.pixels.draw(zone.buffer, zone.drawMatrix); + } + + data.source.dirty=true; + } + + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollingText.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollingText.hx new file mode 100644 index 0000000..cedc389 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxScrollingText.hx @@ -0,0 +1,310 @@ +/** + * FlxScrollingText + * -- Part of the Flixel Power Tools set + * + * v1.0 First version released + * + * @version 1.0 - May 5th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import flash.utils.getTimer; + +import org.flixel.*; + +/** + * FlxScrollingText takes an FlxBitmapFont object and creates a horizontally scrolling FlxSprite from it + */ +class FlxScrollingText extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + private static var zeroPoint:Point=new Point; + + public function new() + { + } + + /** + * Adds an FlxBitmapFont to the Scrolling Text Manager and returns an FlxSprite which contains the text scroller in it.
+ * The FlxSprite will automatically update itself via this plugin, but can be treated as a normal FlxSprite in all other regards
+ * re:positioning, collision, rotation, etc. + * + * @param bitmapFont A pre-prepared FlxBitmapFont object(see the Test Suite examples for details on how this works) + * @param region A Rectangle that defines the size of the scrolling FlxSprite. The sprite will be placed at region.x/y and be region.width/height in size. + * @param pixels The number of pixels to scroll per step. For a smooth(but slow)scroll use low values. Keep the value proportional to the font width, so if the font width is 16 use a value like 1, 2, 4 or 8. + * @param steps How many steps should pass before the text is next scrolled? Default 0 means every step we scroll. Higher values slow things down. + * @param text The default text for your scrolling message. Can be changed in real-time via the addText method. + * @param onlyScrollOnscreen Only update the text scroller when this FlxSprite is visible on-screen? Default true. + * @param loopOnWrap When the scroller reaches the end of the given "text" should it wrap to the start? Default true. If false it will clear the screen then set itself to not update. + * + * @return An FlxSprite of size region.width/height, positioned at region.x/y, that auto-updates its contents while this plugin runs + */ + public static function add(bitmapFont:FlxBitmapFont, region:Rectangle, pixels:Int=1, steps:Int=0, text:String="FLIXEL ROCKS!", onlyScrollOnscreen:Bool=true, loopOnWrap:Bool=true):FlxSprite + { + var data:Dynamic=new Dynamic; + + // Sanity checks + if(pixels>bitmapFont.characterWidth) + { + pixels=bitmapFont.characterWidth; + } + + if(pixels==0) + { + pixels=1; + } + + if(text=="") + { + text=" "; + } + + data.bitmapFont=bitmapFont; + data.bitmapChar=FlxBitmapFont(data.bitmapFont).getCharacterAsBitmapData(text.charAt(0)); + data.charWidth=bitmapFont.characterWidth; + data.charHeight=bitmapFont.characterHeight; + data.shiftRect=new Rectangle(pixels, 0, region.width - pixels, region.height); + data.bufferRect=new Rectangle(0, 0, region.width, region.height); + data.slice=new Rectangle(0, 0, pixels, data.charHeight); + data.endPoint=new Point(region.width - pixels, 0); + data.x=0; + + data.sprite=new FlxSprite(region.x, region.y).makeGraphic(region.width, region.height, 0x0, true); + data.buffer=new BitmapData(region.width, region.height, true, 0x0); + + data.region=region; + data.step=steps; + data.maxStep=steps; + data.pixels=pixels; + data.clearCount=0; + data.clearDistance=region.width - pixels; + + data.text=text; + data.currentChar=0; + data.maxChar=text.length; + + data.wrap=loopOnWrap; + data.complete=false; + data.scrolling=true; + data.onScreenScroller=onlyScrollOnscreen; + + scroll(data); + + members[data.sprite]=data; + + return data.sprite; + } + + /** + * Adds or replaces the text in the given Text Scroller.
+ * Can be called while the scroller is still active. + * + * @param source The FlxSprite Text Scroller you wish to update(must have been added to FlxScrollingText via a call to add() + * @param text The text to add or update to the Scroller + * @param overwrite If true the given text will fully replace the previous scroller text. If false it will be appended to the end(default) + */ + public static function addText(source:FlxSprite, text:String, overwrite:Bool=false):Void + { + if(overwrite) + { + members[source].text=text; + } + else + { + members[source].text=Std.string(members[source].text).concat(text); + } + + members[source].maxChar=members[source].text.length; + } + + override public function draw():Void + { + for(var obj:Dynamic in members) + { + if(obj &&(obj.onScreenScroller==true && obj.sprite.onScreen())&& obj.scrolling==true && obj.sprite.exists) + { + scroll(obj); + } + } + } + + private static function scroll(data:Dynamic):Void + { + // Have we reached enough steps? + + if(data.maxStep>0 &&(data.step=data.charWidth) + { + // Get the next character + data.currentChar++; + + if(data.currentChar>data.maxChar) + { + // At the end of the text + if(data.wrap) + { + data.currentChar=0; + } + else + { + data.complete=true; + data.clearCount=0; + } + } + + if(data.complete==false) + { + data.bitmapChar=FlxBitmapFont(data.bitmapFont).getCharacterAsBitmapData(String(data.text).charAt(data.currentChar)); + data.x=0; + } + } + + if(data.complete==false) + { + data.slice.x=data.x; + } + } + else + { + data.clearCount +=data.pixels; + + // It's all over now + if(data.clearCount>=data.clearDistance) + { + // No point updating something that has since left the screen + data.scrolling=false; + } + } + + data.sprite.pixels=data.buffer.clone(); + data.sprite.dirty=true; + } + + /** + * Removes all FlxSprites
+ * This is called automatically if the plugin is destroyed, but should be called manually by you if you change States
+ * as all the FlxSprites will be destroyed by Flixel otherwise + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + delete members[obj.sprite]; + } + } + + /** + * Starts scrolling on the given FlxSprite. If no FlxSprite is given it starts scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to re-start it if you have stopped it via stopScrolling.
+ * + * @param source The FlxSprite to start scrolling on. If left as null it will start scrolling on all sprites. + */ + public static function startScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=true; + } + } + } + + /** + * Stops scrolling on the given FlxSprite. If no FlxSprite is given it stops scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to stop it.
+ * + * @param source The FlxSprite to stop scrolling on. If left as null it will stop scrolling on all sprites. + */ + public static function stopScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=false; + } + } + } + + /** + * Checks to see if the given FlxSprite is a Scrolling Text, and is actively scrolling or not
+ * Note:If the text is set to only scroll when on-screen, but if off-screen when this is called, it will still return true. + * + * @param source The FlxSprite to check for scrolling on. + * @return Boolean true is the FlxSprite was found and is scrolling, otherwise false + */ + public static function isScrolling(source:FlxSprite):Bool + { + if(members[source]) + { + return members[source].scrolling; + } + + return false; + } + + /** + * Removes an FlxSprite from the Text Scroller. Note that it doesn't restore the sprite bitmapData. + * + * @param source The FlxSprite to remove scrolling for. + * @return Boolean true if the FlxSprite was removed, otherwise false. + */ + public static function remove(source:FlxSprite):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxSpecialFX.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxSpecialFX.hx new file mode 100644 index 0000000..4f335a6 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxSpecialFX.hx @@ -0,0 +1,308 @@ +/** + * FlxSpecialFX + * -- Part of the Flixel Power Tools set + * + * v1.6 Added WowCopperFX + * v1.5 Added RevealFX + * v1.4 Added BlurFX and CenterSlideFX + * v1.3 Renamed DropDown to FloodFill + * v1.2 Added GlitchFX and StarfieldFX + * v1.1 Added SineWaveFX + * v1.0 First release of the new FlxSpecialFX system + * + * @version 1.6 - September 19th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.utils.Dictionary; +import org.flixel.*; +import org.flixel.plugin.photonstorm.FX.BlurFX; +import org.flixel.plugin.photonstorm.FX.CenterSlideFX; +import org.flixel.plugin.photonstorm.FX.FloodFillFX; +import org.flixel.plugin.photonstorm.FX.GlitchFX; +import org.flixel.plugin.photonstorm.FX.PlasmaFX; +import org.flixel.plugin.photonstorm.FX.RainbowLineFX; +import org.flixel.plugin.photonstorm.FX.RevealFX; +import org.flixel.plugin.photonstorm.FX.SineWaveFX; +import org.flixel.plugin.photonstorm.FX.StarfieldFX; +import org.flixel.plugin.photonstorm.FX.WowCopperFX; + +/** + * FlxSpecialFX is a single point of access to all of the FX Plugins available in the Flixel Power Tools + */ +class FlxSpecialFX extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + + public function new() + { + } + + // THE SPECIAL FX PLUGINS AVAILABLE + + /** + * Creates a Plama field Effect + * + * @return PlasmaFX + */ + public static function plasma():PlasmaFX + { + var temp:PlasmaFX=new PlasmaFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Rainbow Line Effect + * + * @return RainbowLineFX + */ + public static function rainbowLine():RainbowLineFX + { + var temp:RainbowLineFX=new RainbowLineFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Flood Fill Effect + * + * @return FloodFillFX + */ + public static function floodFill():FloodFillFX + { + var temp:FloodFillFX=new FloodFillFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Sine Wave Down Effect + * + * @return SineWaveFX + */ + public static function sineWave():SineWaveFX + { + var temp:SineWaveFX=new SineWaveFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Glitch Effect + * + * @return GlitchFX + */ + public static function glitch():GlitchFX + { + var temp:GlitchFX=new GlitchFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a 2D or 3D Starfield Effect + * + * @return StarfieldFX + */ + public static function starfield():StarfieldFX + { + var temp:StarfieldFX=new StarfieldFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Blur Effect + * + * @return BlurFX + */ + public static function blur():BlurFX + { + var temp:BlurFX=new BlurFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Center Slide Effect + * + * @return CenterSlideFX + */ + public static function centerSlide():CenterSlideFX + { + var temp:CenterSlideFX=new CenterSlideFX + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Reveal Effect + * + * @return RevealFX + */ + public static function reveal():RevealFX + { + var temp:RevealFX=new RevealFX + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a WOW Copper Effect + * + * @return WowCopperFX + */ + public static function wowCopper():WowCopperFX + { + var temp:WowCopperFX=new WowCopperFX + + members[temp]=temp; + + return members[temp]; + } + + + + + + // GLOBAL FUNCTIONS + + /** + * Starts the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to run. If null it will start all currently added FX Plugins + */ + public static function startFX(source:Class=null):Void + { + if(source) + { + members[source].active=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.active=true; + } + } + } + + /** + * Stops the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to stop. If null it will stop all currently added FX Plugins + */ + public static function stopFX(source:Class=null):Void + { + if(source) + { + members[source].active=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.active=false; + } + } + } + + /** + * Returns the active state of the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to run. If null it will start all currently added FX Plugins + * @return Boolean true if the FX Plugin is active, false if not + */ + public static function isActive(source:Class):Bool + { + if(members[source]) + { + return members[source].active; + } + + return false; + } + + /** + * Called automatically by Flixels Plugin handler + */ + override public function draw():Void + { + if(FlxG.paused) + { + return; + } + + for(var obj:Dynamic in members) + { + if(obj.active) + { + obj.draw(); + } + } + } + + /** + * Removes a FX Plugin from the Special FX Handler + * + * @param source The FX Plugin to remove + * @return Boolean true if the plugin was removed, otherwise false. + */ + public static function remove(source:Dynamic):Bool + { + if(members[source]) + { + members[source].destroy(); + + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FX Plugins
+ * This is called automatically if the plugin is destroyed, but should be called manually by you if you change States + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + remove(obj); + } + } + + /** + * Destroys all FX Plugins currently added and then destroys this instance of the FlxSpecialFX Plugin + */ + override public function destroy():Void + { + clear(); + } + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxVelocity.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxVelocity.hx new file mode 100644 index 0000000..c6f93ae --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxVelocity.hx @@ -0,0 +1,364 @@ +/** + * FlxVelocity + * -- Part of the Flixel Power Tools set + * + * v1.6 New method:velocityFromFacing + * v1.5 New methods:velocityFromAngle, accelerateTowardsObject, accelerateTowardsMouse, accelerateTowardsPoint + * v1.4 New methods:moveTowardsPoint, distanceToPoint, angleBetweenPoint + * v1.3 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - August 15th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Depends on FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.accessibility.Accessibility; +import org.flixel.*; + +class FlxVelocity +{ + + public function new() + { + } + + /** + * Sets the source FlxSprite x/y velocity so it will move directly towards the destination FlxSprite at the speed given(in pixels per second)
+ * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * If you need the object to accelerate, see accelerateTowardsObject()instead + * Note:Doesn't take Into account acceleration, maxVelocity or drag(if you set drag or acceleration too high this object may not move at all) + * + * @param source The FlxSprite on which the velocity will be set + * @param dest The FlxSprite where the source object will move to + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsObject(source:FlxSprite, dest:FlxSprite, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetween(source, dest); + + if(maxTime>0) + { + var d:Int=distanceBetween(source, dest); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the destination FlxSprite at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsObject()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param dest The FlxSprite where the source object will move towards + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsObject(source:FlxSprite, dest:FlxSprite, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetween(source, dest); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Move the given FlxSprite towards the mouse pointer coordinates at a steady velocity + * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * + * @param source The FlxSprite to move + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsMouse(source:FlxSprite, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetweenMouse(source); + + if(maxTime>0) + { + var d:Int=distanceToMouse(source); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the mouse coordinates at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsMouse()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsMouse(source:FlxSprite, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetweenMouse(source); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Sets the x/y velocity on the source FlxSprite so it will move towards the target coordinates at the speed given(in pixels per second)
+ * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * + * @param source The FlxSprite to move + * @param target The FlxPoint coordinates to move the source FlxSprite towards + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsPoint(source:FlxSprite, target:FlxPoint, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetweenPoint(source, target); + + if(maxTime>0) + { + var d:Int=distanceToPoint(source, target); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the target coordinates at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsPoint()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param target The FlxPoint coordinates to move the source FlxSprite towards + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsPoint(source:FlxSprite, target:FlxPoint, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetweenPoint(source, target); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Find the distance(in pixels, rounded)between two FlxSprites, taking their origin Into account + * + * @param a The first FlxSprite + * @param b The second FlxSprite + * @return int Distance(in pixels) + */ + public static function distanceBetween(a:FlxSprite, b:FlxSprite):Int + { + var dx:Float=(a.x + a.origin.x)-(b.x + b.origin.x); + var dy:Float=(a.y + a.origin.y)-(b.y + b.origin.y); + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the distance(in pixels, rounded)from an FlxSprite to the given FlxPoint, taking the source origin Into account + * + * @param a The first FlxSprite + * @param target The FlxPoint + * @return int Distance(in pixels) + */ + public static function distanceToPoint(a:FlxSprite, target:FlxPoint):Int + { + var dx:Float=(a.x + a.origin.x)-(target.x); + var dy:Float=(a.y + a.origin.y)-(target.y); + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the distance(in pixels, rounded)from the object x/y and the mouse x/y + * + * @param a The FlxSprite to test against + * @return int The distance between the given sprite and the mouse coordinates + */ + public static function distanceToMouse(a:FlxSprite):Int + { + var dx:Float=(a.x + a.origin.x)- FlxG.mouse.screenX; + var dy:Float=(a.y + a.origin.y)- FlxG.mouse.screenY; + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the angle(in radians)between an FlxSprite and an FlxPoint. The source sprite takes its x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxSprite to test from + * @param target The FlxPoint to angle the FlxSprite towards + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetweenPoint(a:FlxSprite, target:FlxPoint, asDegrees:Bool=false):Float + { + var dx:Float=(target.x)-(a.x + a.origin.x); + var dy:Float=(target.y)-(a.y + a.origin.y); + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + /** + * Find the angle(in radians)between the two FlxSprite, taking their x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxSprite to test from + * @param b The FlxSprite to test to + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetween(a:FlxSprite, b:FlxSprite, asDegrees:Bool=false):Float + { + var dx:Float=(b.x + b.origin.x)-(a.x + a.origin.x); + var dy:Float=(b.y + b.origin.y)-(a.y + a.origin.y); + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + /** + * Given the angle and speed calculate the velocity and return it as an FlxPoint + * + * @param angle The angle(in degrees)calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * @param speed The speed it will move, in pixels per second sq + * + * @return An FlxPoint where FlxPoint.x contains the velocity x value and FlxPoint.y contains the velocity y value + */ + public static function velocityFromAngle(angle:Int, speed:Int):FlxPoint + { + var a:Float=FlxMath.asRadians(angle); + + var result:FlxPoint=new FlxPoint; + + result.x=Std.int(Math.cos(a)* speed); + result.y=Std.int(Math.sin(a)* speed); + + return result; + } + + /** + * Given the FlxSprite and speed calculate the velocity and return it as an FlxPoint based on the direction the sprite is facing + * + * @param parent The FlxSprite to get the facing value from + * @param speed The speed it will move, in pixels per second sq + * + * @return An FlxPoint where FlxPoint.x contains the velocity x value and FlxPoint.y contains the velocity y value + */ + public static function velocityFromFacing(parent:FlxSprite, speed:Int):FlxPoint + { + var a:Float; + + if(parent.facing==FlxObject.LEFT) + { + a=FlxMath.asRadians(180); + } + else if(parent.facing==FlxObject.RIGHT) + { + a=FlxMath.asRadians(0); + } + else if(parent.facing==FlxObject.UP) + { + a=FlxMath.asRadians(-90); + } + else if(parent.facing==FlxObject.DOWN) + { + a=FlxMath.asRadians(90); + } + + var result:FlxPoint=new FlxPoint; + + result.x=Std.int(Math.cos(a)* speed); + result.y=Std.int(Math.sin(a)* speed); + + return result; + } + + /** + * Find the angle(in radians)between an FlxSprite and the mouse, taking their x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxObject to test from + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetweenMouse(a:FlxSprite, asDegrees:Bool=false):Float + { + // In order to get the angle between the object and mouse, we need the objects screen coordinates(rather than world coordinates) + var p:FlxPoint=a.getScreenXY(); + + var dx:Float=FlxG.mouse.screenX - p.x; + var dy:Float=FlxG.mouse.screenY - p.y; + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxWeapon.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxWeapon.hx new file mode 100644 index 0000000..642fdee --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/FlxWeapon.hx @@ -0,0 +1,690 @@ +/** + * FlxWeapon + * -- Part of the Flixel Power Tools set + * + * v1.3 Added bullet elasticity and bulletsFired counter + * v1.2 Added useParentDirection boolean + * v1.1 Added pre-fire, fire and post-fire callbacks and sound support, rnd factors, boolean returns and currentBullet + * v1.0 First release + * + * @version 1.3 - October 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import flash.utils.getTimer; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; +import org.flixel.plugin.photonstorm.FlxVelocity; + +/** + * TODO + * ---- + * + * Angled bullets + * Baked Rotation support for angled bullets + * Bullet death styles(particle effects) + * Bullet trails - blur FX style and Missile Command "draw lines" style?(could be another FX plugin) + * Homing Missiles + * Bullet uses random sprite from sprite sheet(for rainbow style bullets), or cycles through them in sequence? + * Some Weapon base classes like shotgun, lazer, etc? + */ + +class FlxWeapon +{ + /** + * Internal name for this weapon(i.e. "pulse rifle") + */ + public var name:String; + + /** + * The FlxGroup Into which all the bullets for this weapon are drawn. This should be added to your display and collision checked against it. + */ + public var group:FlxGroup; + + // Bullet values + public var bounds:FlxRect; + + private var bulletSpeed:Int; + private var rotateToAngle:Bool; + + // When firing from a fixed position(i.e. Missile Command) + private var fireFromPosition:Bool; + private var fireX:Int; + private var fireY:Int; + + private var lastFired:Int=0; + private var nextFire:Int=0; + private var fireRate:Int=0; + + // When firing from a parent sprites position(i.e. Space Invaders) + private var fireFromParent:Bool; + private var parent:Dynamic; + private var parentXVariable:String; + private var parentYVariable:String; + private var positionOffset:FlxPoint; + private var directionFromParent:Bool; + private var angleFromParent:Bool; + + private var velocity:FlxPoint; + + public var multiShot:Int=0; + + public var bulletLifeSpan:Int=0; + public var bulletElasticity:Float=0; + + public var rndFactorAngle:Int=0; + public var rndFactorLifeSpan:Int=0; + public var rndFactorSpeed:Int=0; + public var rndFactorPosition:FlxPoint=new FlxPoint; + + /** + * A reference to the Bullet that was fired + */ + public var currentBullet:Bullet; + + // Callbacks + public var onPreFireCallback:Function; + public var onFireCallback:Function; + public var onPostFireCallback:Function; + + // Sounds + public var onPreFireSound:FlxSound; + public var onFireSound:FlxSound; + public var onPostFireSound:FlxSound; + + // Quick firing direction angle constants + public static inline var BULLET_UP:Int=-90; + public static inline var BULLET_DOWN:Int=90; + public static inline var BULLET_LEFT:Int=180; + public static inline var BULLET_RIGHT:Int=0; + public static inline var BULLET_NORTH_EAST:Int=-45; + public static inline var BULLET_NORTH_WEST:Int=-135; + public static inline var BULLET_SOUTH_EAST:Int=45; + public static inline var BULLET_SOUTH_WEST:Int=135; + + /** + * Keeps a tally of how many bullets have been fired by this weapon + */ + public var bulletsFired:Int=0; + + + private var currentMagazine:Int; + //private var currentBullet:Int; + private var magazineCount:Int; + private var bulletsPerMagazine:Int; + private var magazineSwapDelay:Int; + private var magazineSwapCallback:Function; + private var magazineSwapSound:FlxSound; + + private static inline var FIRE:Int=0; + private static inline var FIRE_AT_MOUSE:Int=1; + private static inline var FIRE_AT_POSITION:Int=2; + private static inline var FIRE_AT_TARGET:Int=3; + private static inline var FIRE_FROM_ANGLE:Int=4; + private static inline var FIRE_FROM_PARENT_ANGLE:Int=5; + + /** + * Creates the FlxWeapon class which will fire your bullets.
+ * You should call one of the makeBullet functions to visually create the bullets.
+ * Then either use setDirection with fire()or one of the fireAt functions to launch them. + * + * @param name The name of your weapon(i.e. "lazer" or "shotgun"). For your Internal reference really, but could be displayed in-game. + * @param parentRef If this weapon belongs to a parent sprite, specify it here(bullets will fire from the sprites x/y vars as defined below). + * @param xVariable The x axis variable of the parent to use when firing. Typically "x", but could be "screenX" or any public getter that exposes the x coordinate. + * @param yVariable The y axis variable of the parent to use when firing. Typically "y", but could be "screenY" or any public getter that exposes the y coordinate. + */ + public function new(name:String, parentRef:Dynamic=null, xVariable:String="x", yVariable:String="y") + { + this.name=name; + + bounds=new FlxRect(0, 0, FlxG.width, FlxG.height); + + positionOffset=new FlxPoint; + + velocity=new FlxPoint; + + if(parentRef) + { + setParent(parentRef, xVariable, yVariable); + } + } + + /** + * Makes a pixel bullet sprite(rather than an image). You can set the width/height and color of the bullet. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param width The width(in pixels)of the bullets + * @param height The height(in pixels)of the bullets + * @param color The color of the bullets. Must be given in 0xAARRGGBB format + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function makePixelBullet(quantity:Int, width:Int=2, height:Int=2, color:Int=0xffffffff, offsetX:Int=0, offsetY:Int=0):Void + { + group=new FlxGroup(quantity); + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + tempBullet.makeGraphic(width, height, color); + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Makes a bullet sprite from the given image. It will use the width/height of the image. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param image The image used to create the bullet from + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param autoRotate When true the bullet sprite will rotate to match the angle of the parent sprite. Call fireFromParentAngle or fromFromAngle to fire it using an angle as the velocity. + * @param frame If the image has a single row of square animation frames on it, you can specify which of the frames you want to use here. Default is -1, or "use whole graphic" + * @param rotations The number of rotation frames the final sprite should have. For small sprites this can be quite a large number(360 even)without any problems. + * @param antiAliasing Whether to use high quality rotations when creating the graphic. Default is false. + * @param autoBuffer Whether to automatically increase the image size to accomodate rotated corners. Default is false. Will create frames that are 150% larger on each axis than the original frame or graphic. + */ + public function makeImageBullet(quantity:Int, image:Class, offsetX:Int=0, offsetY:Int=0, autoRotate:Bool=false, rotations:Int=16, frame:Int=-1, antiAliasing:Bool=false, autoBuffer:Bool=false):Void + { + group=new FlxGroup(quantity); + + rotateToAngle=autoRotate; + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + if(autoRotate) + { + tempBullet.loadRotatedGraphic(image, rotations, frame, antiAliasing, autoBuffer); + } + else + { + tempBullet.loadGraphic(image); + } + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Makes an animated bullet from the image and frame data given. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param imageSequence The image used to created the animated bullet from + * @param frameWidth The width of each frame in the animation + * @param frameHeight The height of each frame in the animation + * @param frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3) + * @param frameRate The speed in frames per second that the animation should play at(e.g. 40 fps) + * @param looped Whether or not the animation is looped or just plays once + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function makeAnimatedBullet(quantity:Int, imageSequence:Class, frameWidth:Int, frameHeight:Int, frames:Array, frameRate:Int, looped:Bool, offsetX:Int=0, offsetY:Int=0):Void + { + group=new FlxGroup(quantity); + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + tempBullet.loadGraphic(imageSequence, true, false, frameWidth, frameHeight); + + tempBullet.addAnimation("fire", frames, frameRate, looped); + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Internal function that handles the actual firing of the bullets + * + * @param method + * @param x + * @param y + * @param target + * @return true if a bullet was fired or false if one wasn't available. The bullet last fired is stored in FlxWeapon.prevBullet + */ + private function runFire(method:Int, x:Int=0, y:Int=0, target:FlxSprite=null, angle:Int=0):Bool + { + if(fireRate>0 &&(getTimer() + * If set this over-rides a call to setParent(which causes the Weapon to fire from the parents x/y position) + * + * @param x The x coordinate(in game world pixels)to fire from + * @param y The y coordinate(in game world pixels)to fire from + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function setFiringPosition(x:Int, y:Int, offsetX:Int=0, offsetY:Int=0):Void + { + fireFromPosition=true; + fireX=x; + fireY=y; + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * The speed in pixels/sec(sq)that the bullet travels at when fired via fireAtMouse, fireAtPosition or fireAtTarget. + * You can update this value in real-time, should you need to speed-up or slow-down your bullets(i.e. collecting a power-up) + * + * @param speed The speed it will move, in pixels per second(sq) + */ + public function setBulletSpeed(speed:Int):Void + { + bulletSpeed=speed; + } + + /** + * The speed in pixels/sec(sq)that the bullet travels at when fired via fireAtMouse, fireAtPosition or fireAtTarget. + * + * @return The speed the bullet moves at, in pixels per second(sq) + */ + public function getBulletSpeed():Int + { + return bulletSpeed; + } + + /** + * Sets the firing rate of the Weapon. By default there is no rate, as it can be controlled by FlxControl.setFireButton. + * However if you are firing using the mouse you may wish to set a firing rate. + * + * @param rate The delay in milliseconds(ms)between which each bullet is fired, set to zero to clear + */ + public function setFireRate(rate:Int):Void + { + fireRate=rate; + } + + /** + * When a bullet goes outside of this bounds it will be automatically killed, freeing it up for firing again. + * - Needs testing with a scrolling map(when not using single screen display) + * + * @param bounds An FlxRect area. Inside this area the bullet should be considered alive, once outside it will be killed. + */ + public function setBulletBounds(bounds:FlxRect):Void + { + this.bounds=bounds; + } + + /** + * Set the direction the bullet will travel when fired. + * You can use one of the consts such as BULLET_UP, BULLET_DOWN or BULLET_NORTH_EAST to set the angle easily. + * Speed should be given in pixels/sec(sq)and is the speed at which the bullet travels when fired. + * + * @param angle The angle of the bullet. In clockwise positive direction:Right=0, Down=90, Left=180, Up=-90. You can use one of the consts such as BULLET_UP, etc + * @param speed The speed it will move, in pixels per second(sq) + */ + public function setBulletDirection(angle:Int, speed:Int):Void + { + velocity=FlxVelocity.velocityFromAngle(angle, speed); + } + + /** + * Sets gravity on all currently created bullets
+ * This will update ALL bullets, even those currently "in flight", so be careful about when you call this! + * + * @param xForce A positive value applies gravity dragging the bullet to the right. A negative value drags the bullet to the left. Zero disables horizontal gravity. + * @param yforce A positive value applies gravity dragging the bullet down. A negative value drags the bullet up. Zero disables vertical gravity. + */ + public function setBulletGravity(xForce:Int, yForce:Int):Void + { + group.setAll("xGravity", xForce); + group.setAll("yGravity", yForce); + } + + /** + * If you'd like your bullets to accelerate to their top speed rather than be launched already at it, then set the acceleration value here. + * If you've previously set the acceleration then setting it to zero will cancel the effect. + * This will update ALL bullets, even those currently "in flight", so be careful about when you call this! + * + * @param xAcceleration Acceleration speed in pixels per second to apply to the sprites horizontal movement, set to zero to cancel. Negative values move left, positive move right. + * @param yAcceleration Acceleration speed in pixels per second to apply to the sprites vertical movement, set to zero to cancel. Negative values move up, positive move down. + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public function setBulletAcceleration(xAcceleration:Int, yAcceleration:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + if(xAcceleration==0 && yAcceleration==0) + { + group.setAll("accelerates", false); + } + else + { + group.setAll("accelerates", true); + group.setAll("xAcceleration", xAcceleration); + group.setAll("yAcceleration", yAcceleration); + group.setAll("maxVelocityX", xSpeedMax); + group.setAll("maxVelocityY", ySpeedMax); + } + } + + /** + * When the bullet is fired from a parent(or fixed position)it will do so from their x/y coordinate.
+ * Often you need to align a bullet with the sprite, i.e. to make it look like it came out of the "nose" of a space ship.
+ * Use this offset x/y value to achieve that effect. + * + * @param offsetX The x coordinate offset to add to the launch location(positive or negative) + * @param offsetY The y coordinate offset to add to the launch location(positive or negative) + */ + public function setBulletOffset(offsetX:Int, offsetY:Int):Void + { + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Give the bullet a random factor to its angle, speed, position or lifespan when fired. Can create a nice "scatter gun" effect. + * + * @param randomAngle The +- value applied to the angle when fired. For example 20 means the bullet can fire up to 20 degrees under or over its angle when fired. + * @param randomSpeed The +- value applied to the bullet speed when fired. For example 10 means the bullet speed varies by +- 10px/sec + * @param randomPosition The +- values applied to the x/y coordinates the bullet is fired from. + * @param randomLifeSpan The +- values applied to the life span of the bullet. + */ + public function setBulletRandomFactor(randomAngle:Int=0, randomSpeed:Int=0, randomPosition:FlxPoint=null, randomLifeSpan:Int=0):Void + { + rndFactorAngle=randomAngle; + rndFactorSpeed=randomSpeed; + + if(randomPosition !=null) + { + rndFactorPosition=randomPosition; + } + + rndFactorLifeSpan=randomLifeSpan; + } + + /** + * If the bullet should have a fixed life span use this function to set it. + * The bullet will be killed once it passes this lifespan(if still alive and in bounds) + * + * @param lifespan The lifespan of the bullet in ms, calculated when the bullet is fired. Set to zero to disable bullet lifespan. + */ + public function setBulletLifeSpan(lifespan:Int):Void + { + bulletLifeSpan=lifespan; + } + + /** + * The elasticity of the fired bullet controls how much it rebounds off collision surfaces. + * + * @param elasticity The elasticity of the bullet between 0 and 1(0 being no rebound, 1 being 100% force rebound). Set to zero to disable. + */ + public function setBulletElasticity(elasticity:Float):Void + { + bulletElasticity=elasticity; + } + + /** + * Internal function that returns the next available bullet from the pool(if any) + * + * @return A bullet + */ + private function getFreeBullet():Bullet + { + var result:Bullet=null; + + if(group==null || group.length==0) + { + throw new Dynamic("Weapon.as cannot fire a bullet until one has been created via a call to makePixelBullet or makeImageBullet"); + return null; + } + + for(var bullet:Bullet in group.members) + { + if(bullet.exists==false) + { + result=bullet; + break; + } + } + + return result; + } + + /** + * Sets a pre-fire callback function and sound. These are played immediately before the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setPreFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onPreFireCallback=callback; + onPreFireSound=sound; + } + + /** + * Sets a fire callback function and sound. These are played immediately as the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onFireCallback=callback; + onFireSound=sound; + } + + /** + * Sets a post-fire callback function and sound. These are played immediately after the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setPostFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onPostFireCallback=callback; + onPostFireSound=sound; + } + + // TODO + public function TODOcreateBulletPattern(pattern:Array):Void + { + // Launches this many bullets + } + + + public function update():Void + { + // ??? + } + +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/plugin/photonstorm/PNGEncoder.hx b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/PNGEncoder.hx new file mode 100644 index 0000000..6e74151 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/plugin/photonstorm/PNGEncoder.hx @@ -0,0 +1,140 @@ +/* + Copyright(c)2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR + PROFITS;OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING + NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package org.flixel.plugin.photonstorm; + +import flash.geom.*; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.utils.ByteArray; + +/** + * Class that converts BitmapData Into a valid PNG + */ +class PNGEncoder +{ + /** + * Created a PNG image from the specified BitmapData + * + * @param image The BitmapData that will be converted Into the PNG format. + * @return a ByteArray representing the PNG encoded image data. + * @langversion ActionScript 3.0 + * @playerversion Flash 9.0 + * @tiptext + */ + public static function encode(img:BitmapData):ByteArray { + // Create output byte array + var png:ByteArray=new ByteArray(); + // Write PNG signature + png.writeUnsignedInt(0x89504e47); + png.writeUnsignedInt(0x0D0A1A0A); + // Build IHDR chunk + var IHDR:ByteArray=new ByteArray(); + IHDR.writeInt(img.width); + IHDR.writeInt(img.height); + IHDR.writeUnsignedInt(0x08060000);// 32bit RGBA + IHDR.writeByte(0); + writeChunk(png,0x49484452,IHDR); + // Build IDAT chunk + var IDAT:ByteArray=new ByteArray(); + for(i in 0...img.height){ + // no filter + IDAT.writeByte(0); + var p:Int; + var j:Int; + if(!img.transparent){ + for(j=0;j>>24))); + } + } + } + IDAT.compress(); + writeChunk(png,0x49444154,IDAT); + // Build IEND chunk + writeChunk(png,0x49454E44,null); + // return PNG + return png; + } + + private static var crcTable:Array; + private static var crcTableComputed:Bool=false; + + private static function writeChunk(png:ByteArray, + type:Int, data:ByteArray):Void { + if(!crcTableComputed){ + crcTableComputed=true; + crcTable=[]; + var c:Int; + for(n in 0...256){ + c=n; + for(k in 0...8){ + if(c & 1){ + c=uint(uint(0xedb88320)^ + uint(c>>>1)); + } else { + c=uint(c>>>1); + } + } + crcTable[n]=c; + } + } + var len:Int=0; + if(data !=null){ + len=data.length; + } + png.writeUnsignedInt(len); + var p:Int=png.position; + png.writeUnsignedInt(type); + if(data !=null){ + png.writeBytes(data); + } + var e:Int=png.position; + png.position=p; + c=0xffffffff; + for(var i:Int=0;i<(e-p);i++){ + c=uint(crcTable[ + (c ^ png.readUnsignedByte())& + uint(0xff)] ^ Int(c>>>8)); + } + c=uint(c^uint(0xffffffff)); + png.position=e; + png.writeUnsignedInt(c); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxAnim.hx b/AIR/intra/hsrc/org/flixel/system/FlxAnim.hx new file mode 100644 index 0000000..0a447bd --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxAnim.hx @@ -0,0 +1,52 @@ +package org.flixel.system; + +/** + * Just a helper structure for the FlxSprite animation system. + * + * @author Adam Atomic + */ +class FlxAnim +{ + /** + * String name of the animation(e.g. "walk") + */ + public var name:String; + /** + * Seconds between frames(basically the framerate) + */ + public var delay:Float; + /** + * A list of frames stored asuintobjects + */ + public var frames:Array; + /** + * Whether or not the animation is looped + */ + public var looped:Bool; + + /** + * Constructor + * + * @param Name What this animation should be called(e.g. "run") + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3) + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40) + * @param Looped Whether or not the animation is looped or just plays once + */ + public function new(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true) + { + name=Name; + delay=0; + if(FrameRate>0) + delay=1.0/FrameRate; + frames=Frames; + looped=Looped; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + frames=null; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxDebugger.hx b/AIR/intra/hsrc/org/flixel/system/FlxDebugger.hx new file mode 100644 index 0000000..b4ff0b7 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxDebugger.hx @@ -0,0 +1,233 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxG; +import org.flixel.system.debug.Log; +import org.flixel.system.debug.Perf; +import org.flixel.system.debug.VCR; +import org.flixel.system.debug.Vis; +import org.flixel.system.debug.Watch; + +/** + * Container for the new debugger overlay. + * Most of the functionality is in the debug folder widgets, + * but this class instantiates the widgets and handles their basic formatting and arrangement. + */ +class FlxDebugger extends Sprite +{ + /** + * Container for the performance monitor widget. + */ + public var perf:Perf; + /** + * Container for the trace output widget. + */ + public var log:Log; + /** + * Container for the watch window widget. + */ + public var watch:Watch; + /** + * Container for the record, stop and play buttons. + */ + public var vcr:VCR; + /** + * Container for the visual debug mode toggle. + */ + public var vis:Vis; + /** + * Whether the mouse is currently over one of the debugger windows or not. + */ + public var hasMouse:Bool; + + /** + * Internal, tracks what debugger window layout user has currently selected. + */ + private var _layout:Int; + /** + * Internal, stores width and height of the Flash Player window. + */ + private var _screen:Point; + /** + * Internal, used to space out windows from the edges. + */ + private var _gutter:Int; + + /** + * Instantiates the debugger overlay. + * + * @param Width The width of the screen. + * @param Height The height of the screen. + */ + public function new(Width:Float,Height:Float) + { + super(); + visible=false; + hasMouse=false; + _screen=new Point(Width,Height); + + addChild(new Bitmap(new BitmapData(Width,15,true,0x7f000000))); + + var txt:TextField=new TextField(); + txt.x=2; + txt.width=160; + txt.height=16; + txt.selectable=false; + txt.multiline=false; + txt.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + var str:String=FlxG.getLibraryName(); + if(FlxG.debug) + str +=" [debug]"; + else + str +=" [release]"; + txt.text=str; + addChild(txt); + + _gutter=8; + var screenBounds:Rectangle=new Rectangle(_gutter,15+_gutter/2,_screen.x-_gutter*2,_screen.y-_gutter*1.5-15); + + log=new Log("log",0,0,true,screenBounds); + addChild(log); + + watch=new Watch("watch",0,0,true,screenBounds); + addChild(watch); + + perf=new Perf("stats",0,0,false,screenBounds); + addChild(perf); + + vcr=new VCR(); + vcr.x=(Width - vcr.width/2)/2; + vcr.y=2; + addChild(vcr); + + vis=new Vis(); + vis.x=Width-vis.width - 4; + vis.y=2; + addChild(vis); + + setLayout(FlxG.DEBUGGER_STANDARD); + + //Should help with fake mouse focus type behavior + addEventListener(MouseEvent.MOUSE_OVER,onMouseOver); + addEventListener(MouseEvent.MOUSE_OUT,onMouseOut); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _screen=null; + removeChild(log); + log.destroy(); + log=null; + removeChild(watch); + watch.destroy(); + watch=null; + removeChild(perf); + perf.destroy(); + perf=null; + removeChild(vcr); + vcr.destroy(); + vcr=null; + removeChild(vis); + vis.destroy(); + vis=null; + + removeEventListener(MouseEvent.MOUSE_OVER,onMouseOver); + removeEventListener(MouseEvent.MOUSE_OUT,onMouseOut); + } + + /** + * Mouse handler that helps with fake "mouse focus" type behavior. + * + * @param E Flash mouse event. + */ + private function onMouseOver(E:MouseEvent=null):Void + { + hasMouse=true; + } + + /** + * Mouse handler that helps with fake "mouse focus" type behavior. + * + * @param E Flash mouse event. + */ + private function onMouseOut(E:MouseEvent=null):Void + { + hasMouse=false; + } + + /** + * Rearrange the debugger windows using one of the constants specified in FlxG. + * + * @param Layout The layout style for the debugger windows, e.g.FlxG.DEBUGGER_MICRO. + */ + public function setLayout(Layout:Int):Void + { + _layout=Layout; + resetLayout(); + } + + /** + * Forces the debugger windows to reset to the last specified layout. + * The default layout isFlxG.DEBUGGER_STANDARD. + */ + public function resetLayout():Void + { + switch(_layout) + { + case FlxG.DEBUGGER_MICRO: + log.resize(_screen.x/4,68); + log.reposition(0,_screen.y); + watch.resize(_screen.x/4,68); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_BIG: + log.resize((_screen.x-_gutter*3)/2,_screen.y/2); + log.reposition(0,_screen.y); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/2); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_TOP: + log.resize((_screen.x-_gutter*3)/2,_screen.y/4); + log.reposition(0,0); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/4); + watch.reposition(_screen.x,0); + perf.reposition(_screen.x,_screen.y); + break; + case FlxG.DEBUGGER_LEFT: + log.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + log.reposition(0,0); + watch.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + watch.reposition(0,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_RIGHT: + log.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + log.reposition(_screen.x,0); + watch.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + watch.reposition(_screen.x,_screen.y); + perf.reposition(0,0); + break; + case FlxG.DEBUGGER_STANDARD: + default: + log.resize((_screen.x-_gutter*3)/2,_screen.y/4); + log.reposition(0,_screen.y); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/4); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxList.hx b/AIR/intra/hsrc/org/flixel/system/FlxList.hx new file mode 100644 index 0000000..84bf898 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxList.hx @@ -0,0 +1,48 @@ +package org.flixel.system; + +import org.flixel.FlxG; +import org.flixel.FlxObject; + +/** + * A miniature linked list class. + * Useful for optimizing time-critical or highly repetitive tasks! + * SeeFlxQuadTreefor how to use it, IF YOU DARE. + */ +class FlxList +{ + /** + * Stores a reference to aFlxObject. + */ + public var object:FlxObject; + /** + * Stores a reference to the next link in the list. + */ + public var next:FlxList; + + /** + * A pool to prevent repeatednewcalls. + */ + static public var listPool:DynamicPool=new DynamicPool(FlxList); + + /** + * Creates a new link, and setsobjectandnexttonull. + */ + public function new() + { + object=null; + next=null; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + object=null; + if(next !=null) + next.destroy(); + next=null; + + listPool.disposeObject(this); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxPreloader.hx b/AIR/intra/hsrc/org/flixel/system/FlxPreloader.hx new file mode 100644 index 0000000..0bc6999 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxPreloader.hx @@ -0,0 +1,215 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.DisplayObject; +import flash.display.MovieClip; +import flash.display.Sprite; +import flash.display.StageAlign; +import flash.display.StageScaleMode; +import flash.events.Event; +import flash.events.MouseEvent; +import flash.net.URLRequest; +import flash.net.navigateToURL; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.getDefinitionByName; +import flash.utils.getTimer; + +import org.flixel.FlxG; + +/** + * This class handles the 8-bit style preloader. + */ +class FlxPreloader extends MovieClip +{ + //[Embed(source="../data/logo.png")] private var ImgLogo:Class; + //[Embed(source="../data/logo_corners.png")] private var ImgLogoCorners:Class; + //[Embed(source="../data/logo_light.png")] private var ImgLogoLight:Class; + + //[Embed(source="../../../res/title/intraisloading.png")] private var Is_loading:Class; + /** + * @private + */ + private var _init:Bool; + /** + * @private + */ + private var _buffer:Sprite; + /** + * @private + */ + private var _bmpBar:Bitmap; + private var _overlay:Bitmap; + /** + * Useful for storing "real" stage width if you're scaling your preloader graphics. + */ + private var _width:Int; + /** + * Useful for storing "real" stage height if you're scaling your preloader graphics. + */ + private var _height:Int; + + /** + * @private + */ + private var _min:Int; + + /** + * This should always be the name of your main project/document class(e.g. GravityHook). + */ + public var className:String; + /** + * Set this to your game's URL to use built-in site-locking. + */ + public var myURL:String; + /** + * Change this if you want the flixel logo to show for more or less time. Default value is 0 seconds. + */ + public var minDisplayTime:Float; + + /** + * Constructor + */ + public function new() + { + minDisplayTime=0.5; + + stop(); + stage.scaleMode=StageScaleMode.NO_SCALE; + stage.align=StageAlign.TOP_LEFT; + + //Check if we are on debug or release mode and set _DEBUG accordingly + try + { + throw new Dynamic("Setting global debug flag..."); + } + catch(E:Dynamic) + { + var re:RegExp=/\[.*:[0-9]+\]/; + FlxG.debug=re.test(E.getStackTrace()); + } + + var tmp:Bitmap; + if(!FlxG.debug &&(myURL !=null)&&(root.loaderInfo.url.indexOf(myURL)<0)) + if((myURL !=null)&&(root.loaderInfo.url.indexOf(myURL)<0)) + { + tmp=new Bitmap(new BitmapData(stage.stageWidth,stage.stageHeight,true,0xFFFFFFFF)); + addChild(tmp); + + var format:TextFormat=new TextFormat(); + format.color=0x000000; + format.size=16; + format.align="center"; + format.bold=true; + format.font="system"; + + var textField:TextField=new TextField(); + textField.width=tmp.width-16; + textField.height=tmp.height-16; + textField.y=8; + textField.multiline=true; + textField.wordWrap=true; + textField.embedFonts=true; + textField.defaultTextFormat=format; + textField.text="Hi there! It looks like somebody copied this game without my permission. Just click anywhere, or copy-paste this URL Into your browser.\n\n"+myURL+"\n\nto play the game at my site. Thanks, and have fun!"; + addChild(textField); + + textField.addEventListener(MouseEvent.CLICK,goToMyURL); + tmp.addEventListener(MouseEvent.CLICK,goToMyURL); + return; + } + this._init=false; + addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + private function goToMyURL(event:MouseEvent=null):Void + { + navigateToURL(new URLRequest("http://"+myURL)); + } + + private function onEnterFrame(event:Event):Void + { + if(!this._init) + { + if((stage.stageWidth<=0)||(stage.stageHeight<=0)) + return; + create(); + this._init=true; + } + graphics.clear(); + var time:Int=getTimer(); + if((framesLoaded>=totalFrames)&&(time>_min)) + { + removeEventListener(Event.ENTER_FRAME, onEnterFrame); + + nextFrame(); + var mainClass:Class=Class(getDefinitionByName(className)); + if(mainClass) + { + var app:Dynamic=new mainClass(); + Preloader.display=cast(app, DisplayObject); + addChild(app as DisplayObject); + } + destroy(); + } + else + { + var percent:Float=root.loaderInfo.bytesLoaded/root.loaderInfo.bytesTotal; + if((_min>0)&&(percent>time/_min)) + percent=time/_min; + update(percent); + } + } + + /** + * Override this to create your own preloader objects. + * Highly recommended you also override update()! + */ + private function create():Void + { + _min=0; + //if(!FlxG.debug) + if(1) + _min=minDisplayTime*1000; + _buffer=new Sprite(); + _buffer.scaleX=2; + _buffer.scaleY=2; + addChild(_buffer); + _width=stage.stageWidth/_buffer.scaleX; + _height=stage.stageHeight/_buffer.scaleY; + _buffer.addChild(new Bitmap(new BitmapData(_width,_height,false,0x000000))); + _bmpBar=new Bitmap(new BitmapData(1,7,false,0xffffff)); + _bmpBar.x=4; + _bmpBar.y=_height-80; + _buffer.addChild(_bmpBar); + var is_loading_thing:Bitmap=new Is_loading(); + is_loading_thing.scaleX=is_loading_thing.scaleY=0.5; + is_loading_thing.x=2; + is_loading_thing.y=80; + + _overlay=new Bitmap(new BitmapData(160, 180, true, 0xff000000)); + _overlay.alpha=0; + //_buffer.addChild(is_loading_thing); + _buffer.addChild(_overlay); + } + + private function destroy():Void + { + removeChild(_buffer); + _buffer=null; + _bmpBar=null; + } + + /** + * Override this function to manually update the preloader. + * + * @param Percent How much of the program has loaded. + */ + private function update(Percent:Float):Void + { + _bmpBar.scaleX=Percent*(_width-8); + _overlay.alpha=Percent; + + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxQuadTree.hx b/AIR/intra/hsrc/org/flixel/system/FlxQuadTree.hx new file mode 100644 index 0000000..95a1fdc --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxQuadTree.hx @@ -0,0 +1,612 @@ +package org.flixel.system; + +import org.flixel.FlxBasic; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxRect; + +/** + * A fairly generic quad tree structure for rapid overlap checks. + * FlxQuadTree is also configured for single or dual list operation. + * You can add items either to its A list or its B list. + * When you do an overlap check, you can compare the A list to itself, + * or the A list against the B list. Handy for different things! + */ +class FlxQuadTree extends FlxRect +{ + public function new(){ + + } + /** + * Flag for specifying that you want to add an object to the A list. + */ + static public static inline var A_LIST:Int=0; + /** + * Flag for specifying that you want to add an object to the B list. + */ + static public static inline var B_LIST:Int=1; + + /** + * Controls the granularity of the quad tree. Default is 6(decent performance on large and small worlds). + */ + static public var divisions:Int; + + /** + * Whether this branch of the tree can be subdivided or not. + */ + private var _canSubdivide:Bool; + + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _headA:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _tailA:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _headB:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _tailB:FlxList; + + /** + * Internal, governs and assists with the formation of the tree. + */ + static private var _min:Int; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _northWestTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _northEastTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _southEastTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _southWestTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _leftEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _rightEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _topEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _bottomEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _halfWidth:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _halfHeight:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _midpointX:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _midpointY:Float; + + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _object:FlxObject; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectLeftEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectTopEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectRightEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectBottomEdge:Float; + + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _list:Int; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _useBothLists:Bool; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _processingCallback:Function; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _notifyCallback:Function; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _iterator:FlxList; + + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullX:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullY:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullWidth:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullHeight:Float; + + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullX:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullY:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullWidth:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullHeight:Float; + /** + * A pool to prevent repeatednewcalls. + */ + static public var quadTreePool:DynamicPool=new DynamicPool(FlxQuadTree); + + private var _listPool:DynamicPool; + /** + * Instantiate a new Quad Tree node. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of this node. + * @param Height Desired height of this node. + * @param Parent The parent branch or node. Pass null to create a root. + */ + public function init(X:Float, Y:Float, Width:Float, Height:Float, Parent:FlxQuadTree=null):Void + { + _listPool=FlxList.listPool; + + make(X,Y,Width,Height); + _headA=_tailA=_listPool.getNew(); + _headB=_tailB=_listPool.getNew(); + + //Copy the parent's children(if there are any) + if(Parent !=null) + { + var iterator:FlxList; + var ot:FlxList; + if(Parent._headA.object !=null) + { + iterator=Parent._headA; + while(iterator !=null) + { + if(_tailA.object !=null) + { + ot=_tailA; + _tailA=_listPool.getNew(); + ot.next=_tailA; + } + _tailA.object=iterator.object; + iterator=iterator.next; + } + } + if(Parent._headB.object !=null) + { + iterator=Parent._headB; + while(iterator !=null) + { + if(_tailB.object !=null) + { + ot=_tailB; + _tailB=_listPool.getNew(); + ot.next=_tailB; + } + _tailB.object=iterator.object; + iterator=iterator.next; + } + } + } + else + _min=(width + height)/(2*divisions); + _canSubdivide=(width>_min)||(height>_min); + + //Set up comparison/sort helpers + _northWestTree=null; + _northEastTree=null; + _southEastTree=null; + _southWestTree=null; + _leftEdge=x; + _rightEdge=x+width; + _halfWidth=width/2; + _midpointX=_leftEdge+_halfWidth; + _topEdge=y; + _bottomEdge=y+height; + _halfHeight=height/2; + _midpointY=_topEdge+_halfHeight; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _headA.destroy(); + _headA=null; + //_tailA.destroy(); + _tailA=null; + _headB.destroy(); + _headB=null; + //_tailB.destroy(); + _tailB=null; + + if(_northWestTree !=null) + _northWestTree.destroy(); + _northWestTree=null; + if(_northEastTree !=null) + _northEastTree.destroy(); + _northEastTree=null; + if(_southEastTree !=null) + _southEastTree.destroy(); + _southEastTree=null; + if(_southWestTree !=null) + _southWestTree.destroy(); + _southWestTree=null; + + _object=null; + _processingCallback=null; + _notifyCallback=null; + + quadTreePool.disposeObject(this); + } + + /** + * Load objects and/or groups Into the quad tree, and register notify and processing callbacks. + * + * @param DynamicOrGroup1 Any object that is or extends FlxObject or FlxGroup. + * @param DynamicOrGroup2 Any object that is or extends FlxObject or FlxGroup. If null, the first parameter will be checked against itself. + * @param NotifyCallback A function with the formmyFunction(Object1:FlxObject,Object2:FlxObject):Voidthat is called whenever two objects are found to overlap in world space, and either no ProcessCallback is specified, or the ProcessCallback returns true. + * @param ProcessCallback A function with the formmyFunction(Object1:FlxObject,Object2:FlxObject):Boolthat is called whenever two objects are found to overlap in world space. The NotifyCallback is only called if this function returns true. See FlxObject.separate(). + */ + public function load(ObjectOrGroup1:FlxBasic, DynamicOrGroup2:FlxBasic=null, NotifyCallback:Function=null, ProcessCallback:Function=null):Void + { + add(ObjectOrGroup1, A_LIST); + if(ObjectOrGroup2 !=null) + { + add(ObjectOrGroup2, B_LIST); + _useBothLists=true; + } + else + _useBothLists=false; + _notifyCallback=NotifyCallback; + _processingCallback=ProcessCallback; + } + + /** + * Call this function to add an object to the root of the tree. + * This function will recursively add all group members, but + * not the groups themselves. + * + * @param ObjectOrGroup FlxObjects are just added, FlxGroups are recursed and their applicable members added accordingly. + * @param List Auintflag indicating the list to which you want to add the objects. Options areA_LISTandB_LIST. + */ + public function add(ObjectOrGroup:FlxBasic, List:Int):Void + { + _list=List; + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var i:Int=0; + var basic:FlxBasic; + var members:Array=(ObjectOrGroup as FlxGroup).members; + var l:Int=(ObjectOrGroup as FlxGroup).length; + while(i=_objectLeftEdge)&&(_rightEdge<=_objectRightEdge)&&(_topEdge>=_objectTopEdge)&&(_bottomEdge<=_objectBottomEdge))) + { + addToList(); + return; + } + + //See if the selected object fits completely inside any of the quadrants + if((_objectLeftEdge>_leftEdge)&&(_objectRightEdge<_midpointX)) + { + if((_objectTopEdge>_topEdge)&&(_objectBottomEdge<_midpointY)) + { + if(_northWestTree==null) + { + _northWestTree=quadTreePool.getNew(); + _northWestTree.init(_leftEdge, _topEdge, _halfWidth, _halfHeight, this); + } + _northWestTree.addObject(); + return; + } + if((_objectTopEdge>_midpointY)&&(_objectBottomEdge<_bottomEdge)) + { + if(_southWestTree==null) + { + _southWestTree=quadTreePool.getNew(); + _southWestTree.init(_leftEdge, _midpointY, _halfWidth, _halfHeight, this); + } + _southWestTree.addObject(); + return; + } + } + if((_objectLeftEdge>_midpointX)&&(_objectRightEdge<_rightEdge)) + { + if((_objectTopEdge>_topEdge)&&(_objectBottomEdge<_midpointY)) + { + if(_northEastTree==null) + { + _northEastTree=quadTreePool.getNew(); + _northEastTree.init(_midpointX, _topEdge, _halfWidth, _halfHeight, this); + } + _northEastTree.addObject(); + return; + } + if((_objectTopEdge>_midpointY)&&(_objectBottomEdge<_bottomEdge)) + { + if(_southEastTree==null) + { + _southEastTree=quadTreePool.getNew(); + _southEastTree.init(_midpointX, _midpointY, _halfWidth, _halfHeight, this); + } + _southEastTree.addObject(); + return; + } + } + + //If it wasn't completely contained we have to check out the partial overlaps + if((_objectRightEdge>_leftEdge)&&(_objectLeftEdge<_midpointX)&&(_objectBottomEdge>_topEdge)&&(_objectTopEdge<_midpointY)) + { + if(_northWestTree==null) + { + _northWestTree=quadTreePool.getNew(); + _northWestTree.init(_leftEdge, _topEdge, _halfWidth, _halfHeight, this); + } + _northWestTree.addObject(); + } + if((_objectRightEdge>_midpointX)&&(_objectLeftEdge<_rightEdge)&&(_objectBottomEdge>_topEdge)&&(_objectTopEdge<_midpointY)) + { + if(_northEastTree==null) + { + _northEastTree=quadTreePool.getNew(); + _northEastTree.init(_midpointX, _topEdge, _halfWidth, _halfHeight, this); + } + _northEastTree.addObject(); + } + if((_objectRightEdge>_midpointX)&&(_objectLeftEdge<_rightEdge)&&(_objectBottomEdge>_midpointY)&&(_objectTopEdge<_bottomEdge)) + { + if(_southEastTree==null) + { + _southEastTree=quadTreePool.getNew(); + _southEastTree.init(_midpointX, _midpointY, _halfWidth, _halfHeight, this); + } + _southEastTree.addObject(); + } + if((_objectRightEdge>_leftEdge)&&(_objectLeftEdge<_midpointX)&&(_objectBottomEdge>_midpointY)&&(_objectTopEdge<_bottomEdge)) + { + if(_southWestTree==null) + { + _southWestTree=quadTreePool.getNew(); + _southWestTree.init(_leftEdge, _midpointY, _halfWidth, _halfHeight, this); + } + _southWestTree.addObject(); + } + } + + /** + * Internal function for recursively adding objects to leaf lists. + */ + private function addToList():Void + { + var ot:FlxList; + if(_list==A_LIST) + { + if(_tailA.object !=null) + { + ot=_tailA; + _tailA=_listPool.getNew(); + ot.next=_tailA; + } + _tailA.object=_object; + } + else + { + if(_tailB.object !=null) + { + ot=_tailB; + _tailB=_listPool.getNew(); + ot.next=_tailB; + } + _tailB.object=_object; + } + if(!_canSubdivide) + return; + if(_northWestTree !=null) + _northWestTree.addToList(); + if(_northEastTree !=null) + _northEastTree.addToList(); + if(_southEastTree !=null) + _southEastTree.addToList(); + if(_southWestTree !=null) + _southWestTree.addToList(); + } + + /** + *FlxQuadTree's other main function. Call this after adding objects + * usingFlxQuadTree.load()to compare the objects that you loaded. + * + * @return Whether or not any overlaps were found. + */ + public function execute():Bool + { + var overlapProcessed:Bool=false; + var iterator:FlxList; + + if(_headA.object !=null) + { + iterator=_headA; + while(iterator !=null) + { + _object=iterator.object; + if(_useBothLists) + _iterator=_headB; + else + _iterator=iterator.next; + if( _object.exists &&(_object.allowCollisions>0)&& + (_iterator !=null)&&(_iterator.object !=null)&& + _iterator.object.exists &&overlapNode()) + { + overlapProcessed=true; + } + iterator=iterator.next; + } + } + + //Advance through the tree by calling overlap on each child + if((_northWestTree !=null)&& _northWestTree.execute()) + overlapProcessed=true; + if((_northEastTree !=null)&& _northEastTree.execute()) + overlapProcessed=true; + if((_southEastTree !=null)&& _southEastTree.execute()) + overlapProcessed=true; + if((_southWestTree !=null)&& _southWestTree.execute()) + overlapProcessed=true; + + return overlapProcessed; + } + + /** + * An Internal function for comparing an object against the contents of a node. + * + * @return Whether or not any overlaps were found. + */ + private function overlapNode():Bool + { + //Walk the list and check for overlaps + var overlapProcessed:Bool=false; + var checkObject:FlxObject; + while(_iterator !=null) + { + if(!_object.exists ||(_object.allowCollisions<=0)) + break; + + checkObject=_iterator.object; + if((_object===checkObject)|| !checkObject.exists ||(checkObject.allowCollisions<=0)) + { + _iterator=_iterator.next; + continue; + } + + //calculate bulk hull for _object + _objectHullX=(_object.x<_object.last.x)?_object.x:_object.last.x; + _objectHullY=(_object.y<_object.last.y)?_object.y:_object.last.y; + _objectHullWidth=_object.x - _object.last.x; + _objectHullWidth=_object.width +((_objectHullWidth>0)?_objectHullWidth:-_objectHullWidth); + _objectHullHeight=_object.y - _object.last.y; + _objectHullHeight=_object.height +((_objectHullHeight>0)?_objectHullHeight:-_objectHullHeight); + + //calculate bulk hull for checkObject + _checkObjectHullX=(checkObject.x0)?_checkObjectHullWidth:-_checkObjectHullWidth); + _checkObjectHullHeight=checkObject.y - checkObject.last.y; + _checkObjectHullHeight=checkObject.height +((_checkObjectHullHeight>0)?_checkObjectHullHeight:-_checkObjectHullHeight); + + //check for Intersection of the two hulls + if( (_objectHullX + _objectHullWidth>_checkObjectHullX)&& + (_objectHullX<_checkObjectHullX + _checkObjectHullWidth)&& + (_objectHullY + _objectHullHeight>_checkObjectHullY)&& + (_objectHullY<_checkObjectHullY + _checkObjectHullHeight)) + { + //Execute callback functions if they exist + if((_processingCallback==null)|| _processingCallback(_object,checkObject)) + overlapProcessed=true; + if(overlapProcessed &&(_notifyCallback !=null)) + _notifyCallback(_object,checkObject); + } + _iterator=_iterator.next; + } + + return overlapProcessed; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxReplay.hx b/AIR/intra/hsrc/org/flixel/system/FlxReplay.hx new file mode 100644 index 0000000..a074487 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxReplay.hx @@ -0,0 +1,201 @@ +package org.flixel.system; + +import org.flixel.FlxG; +import org.flixel.system.replay.FrameRecord; +import org.flixel.system.replay.MouseRecord; + +/** + * The replay object both records and replays game recordings, + * as well as handle saving and loading replays to and from files. + * Gameplay recordings are essentially a list of keyboard and mouse inputs, + * but since Flixel is fairly deterministic, we can use these to play back + * recordings of gameplay with a decent amount of fidelity. + * + * @author Adam Atomic + */ +class FlxReplay +{ + /** + * The random number generator seed value for this recording. + */ + public var seed:Float; + /** + * The current frame for this recording. + */ + public var frame:Int; + /** + * The number of frames in this recording. + */ + public var frameCount:Int; + /** + * Whether the replay has finished playing or not. + */ + public var finished:Bool; + + /** + * Internal container for all the frames in this replay. + */ + private var _frames:Array; + /** + * Internal tracker for max number of frames we can fit before growing the_framesagain. + */ + private var _capacity:Int; + /** + * Internal helper variable for keeping track of where we are in_framesduring recording or replay. + */ + private var _marker:Int; + + /** + * Instantiate a new replay object. Doesn't actually do much until you call create()or load(). + */ + public function new() + { + seed=0; + frame=0; + frameCount=0; + finished=false; + _frames=null; + _capacity=0; + _marker=0; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + if(_frames==null) + return; + var i:Int=frameCount-1; + while(i>=0) + (_frames[i--] as FrameRecord).destroy(); + _frames=null; + } + + /** + * Create a new gameplay recording. Requires the current random number generator seed. + * + * @param Seed The current seed from the random number generator. + */ + public function create(Seed:Float):Void + { + destroy(); + init(); + seed=Seed; + rewind(); + } + + /** + * Load replay data from aStringobject. + * Strings can come from embedded assets or external + * files loaded through the debugger overlay. + * + * @param FileContents AStringobject containing a gameplay recording. + */ + public function load(FileContents:String):Void + { + init(); + + var lines:Array=FileContents.split("\n"); + + seed=Std.parseFloat(lines[0]); + + var line:String; + var i:Int=1; + var l:Int=lines.length; + while(i3) + { + _frames[frameCount++]=new FrameRecord().load(line); + if(frameCount>=_capacity) + { + _capacity *=2; + _frames.length=_capacity; + } + } + } + + rewind(); + } + + /** + * Common initialization terms used by bothcreate()andload()to set up the replay object. + */ + private function init():Void + { + _capacity=100; + _frames=new Array(_capacity); + frameCount=0; + } + + /** + * Save the current recording data off to aStringobject. + * Basically goes through and callsFrameRecord.save()on each frame in the replay. + * + * return The gameplay recording in simple ASCII format. + */ + public function save():String + { + if(frameCount<=0) + return null; + var output:String=seed+"\n"; + var i:Int=0; + while(i=FlxG.keys.record(); + var mouseRecord:MouseRecord=FlxG.mouse.record(); + if((keysRecord==null)&&(mouseRecord==null)) + { + frame++; + return; + } + _frames[frameCount++]=new FrameRecord().create(frame++,keysRecord,mouseRecord); + if(frameCount>=_capacity) + { + _capacity *=2; + _frames.length=_capacity; + } + } + + /** + * Get the current frame record data and load it Into the input managers. + */ + public function playNextFrame():Void + { + FlxG.resetInput(); + + if(_marker>=frameCount) + { + finished=true; + return; + } + if((_frames[_marker] as FrameRecord).frame !=frame++) + return; + + var fr:FrameRecord=_frames[_marker++]; + if(fr.keys !=null) + FlxG.keys.playback(fr.keys); + if(fr.mouse !=null) + FlxG.mouse.playback(fr.mouse); + } + + /** + * Reset the replay back to the first frame. + */ + public function rewind():Void + { + _marker=0; + frame=0; + finished=false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxTile.hx b/AIR/intra/hsrc/org/flixel/system/FlxTile.hx new file mode 100644 index 0000000..283c7fa --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxTile.hx @@ -0,0 +1,80 @@ +package org.flixel.system; + +import org.flixel.FlxObject; +import org.flixel.FlxTilemap; + +/** + * A simple helper object forFlxTilemapthat helps expand collision opportunities and control. + * You can useFlxTilemap.setTileProperties()to alter the collision properties and + * callback functions and filters for this object to do things like one-way tiles or whatever. + * + * @author Adam Atomic + */ +class FlxTile extends FlxObject +{ + /** + * This function is called whenever an object hits a tile of this type. + * This function should take the formmyFunction(Tile:FlxTile,Object:FlxObject):Void. + * Defaults to null, set throughFlxTilemap.setTileProperties(). + */ + public var callback:Function; + /** + * Each tile can store its own filter class for their callback functions. + * That is, the callback will only be triggered if an object with a class + * type matching the filter touched it. + * Defaults to null, set throughFlxTilemap.setTileProperties(). + */ + public var filter:Class; + /** + * A reference to the tilemap this tile object belongs to. + */ + public var tilemap:FlxTilemap; + /** + * The index of this tile type in the core map data. + * For example, if your map only has 16 kinds of tiles in it, + * this number is usually between 0 and 15. + */ + public var index:Int; + /** + * The current map index of this tile object at this moment. + * You can think of tile objects as moving around the tilemap helping with collisions. + * This value is only reliable and useful if used from the callback function. + */ + public var mapIndex:Int; + + /** + * Instantiate this new tile object. This is usually called fromFlxTilemap.loadMap(). + * + * @param Tilemap A reference to the tilemap object creating the tile. + * @param Index The actual core map data index for this tile type. + * @param Width The width of the tile. + * @param Height The height of the tile. + * @param Visible Whether the tile is visible or not. + * @param AllowCollisions The collision flags for the object. By default this value is ANY or NONE depending on the parameters sent to loadMap(). + */ + public function new(Tilemap:FlxTilemap, Index:Int, Width:Float, Height:Float, Visible:Bool, AllowCollisions:Int) + { + super(0, 0, Width, Height); + immovable=true; + moves=false; + callback=null; + filter=null; + + tilemap=Tilemap; + index=Index; + visible=Visible; + allowCollisions=AllowCollisions; + + mapIndex=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + callback=null; + tilemap=null; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxTilemapBuffer.hx b/AIR/intra/hsrc/org/flixel/system/FlxTilemapBuffer.hx new file mode 100644 index 0000000..a07fc5b --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxTilemapBuffer.hx @@ -0,0 +1,120 @@ +package org.flixel.system; + +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxU; + +/** + * A helper object to keep tilemap drawing performance decent across the new multi-camera system. + * Pretty much don't even have to think about this class unless you are doing some crazy hacking. + * + * @author Adam Atomic + */ +class FlxTilemapBuffer +{ + /** + * The current X position of the buffer. + */ + public var x:Float; + /** + * The current Y position of the buffer. + */ + public var y:Float; + /** + * The width of the buffer(usually just a few tiles wider than the camera). + */ + public var width:Float; + /** + * The height of the buffer(usually just a few tiles taller than the camera). + */ + public var height:Float; + /** + * Whether the buffer needs to be redrawn. + */ + public var dirty:Bool; + /** + * How many rows of tiles fit in this buffer. + */ + public var rows:Int; + /** + * How many columns of tiles fit in this buffer. + */ + public var columns:Int; + + private var _pixels:BitmapData; + private var _flashRect:Rectangle; + + /** + * Instantiates a new camera-specific buffer for storing the visual tilemap data. + * + * @param TileWidth The width of the tiles in this tilemap. + * @param TileHeight The height of the tiles in this tilemap. + * @param WidthInTiles How many tiles wide the tilemap is. + * @param HeightInTiles How many tiles tall the tilemap is. + * @param Camera Which camera this buffer relates to. + */ + public function new(TileWidth:Float,TileHeight:Float,WidthInTiles:Int,HeightInTiles:Int,Camera:FlxCamera=null) + { + if(Camera==null) + Camera=FlxG.camera; + + columns=FlxU.ceil(Camera.width/TileWidth)+1; + if(columns>WidthInTiles) + columns=WidthInTiles; + rows=FlxU.ceil(Camera.height/TileHeight)+1; + if(rows>HeightInTiles) + rows=HeightInTiles; + + _pixels=new BitmapData(columns*TileWidth,rows*TileHeight,true,0); + width=_pixels.width; + height=_pixels.height; + _flashRect=new Rectangle(0,0,width,height); + dirty=true; + } + + + /** + * Clean up memory. + */ + public function destroy():Void + { + _pixels=null; + } + + /** + * Fill the buffer with the specified color. + * Default value is transparent. + * + * @param Color What color to fill with, in 0xAARRGGBB hex format. + */ + public function fill(Color:Int=0):Void + { + _pixels.fillRect(_flashRect,Color); + } + + /** + * Read-only, nab the actual bufferBitmapDataobject. + * + * @return The buffer bitmap data. + */ + public var pixels(get_pixels, null):BitmapData; + private function get_pixels():BitmapData + { + return _pixels; + } + + /** + * Just stamps this buffer onto the specified camera at the specified location. + * + * @param Camera Which camera to draw the buffer onto. + * @param FlashPoint Where to draw the buffer at in camera coordinates. + */ + public function draw(Camera:FlxCamera,FlashPoint:Point):Void + { + Camera.buffer.copyPixels(_pixels,_flashRect,FlashPoint,null,null,true); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/FlxWindow.hx b/AIR/intra/hsrc/org/flixel/system/FlxWindow.hx new file mode 100644 index 0000000..9ac6e25 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/FlxWindow.hx @@ -0,0 +1,327 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.MouseEvent; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxU; + +/** + * A generic, Flash-based window class, created for use inFlxDebugger. + * + * @author Adam Atomic + */ +class FlxWindow extends Sprite +{ + //[Embed(source="../data/handle.png")] private var ImgHandle:Class; + + /** + * Minimum allowed X and Y dimensions for this window. + */ + public var minSize:Point; + /** + * Maximum allowed X and Y dimensions for this window. + */ + public var maxSize:Point; + + /** + * Width of the window. Using Sprite.width is super unreliable for some reason! + */ + private var _width:Int; + /** + * Height of the window. Using Sprite.height is super unreliable for some reason! + */ + private var _height:Int; + /** + * Controls where the window is allowed to be positioned. + */ + private var _bounds:Rectangle; + + /** + * Window display element. + */ + private var _background:Bitmap; + /** + * Window display element. + */ + private var _header:Bitmap; + /** + * Window display element. + */ + private var _shadow:Bitmap; + /** + * Window display element. + */ + private var _title:TextField; + /** + * Window display element. + */ + private var _handle:Bitmap; + + /** + * Helper for Interaction. + */ + private var _overHeader:Bool; + /** + * Helper for Interaction. + */ + private var _overHandle:Bool; + /** + * Helper for Interaction. + */ + private var _drag:Point; + /** + * Helper for Interaction. + */ + private var _dragging:Bool; + /** + * Helper for Interaction. + */ + private var _resizing:Bool; + /** + * Helper for Interaction. + */ + private var _resizable:Bool; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String,Width:Float,Height:Float,Resizable:Bool=true,Bounds:Rectangle=null,BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(); + _width=Width; + _height=Height; + _bounds=Bounds; + minSize=new Point(50,30); + if(_bounds !=null) + maxSize=new Point(_bounds.width,_bounds.height); + else + maxSize=new Point(Number.MAX_VALUE,Number.MAX_VALUE); + _drag=new Point(); + _resizable=Resizable; + + _shadow=new Bitmap(new BitmapData(1,2,true,0xff000000)); + addChild(_shadow); + _background=new Bitmap(new BitmapData(1,1,true,BGColor)); + _background.y=15; + addChild(_background); + _header=new Bitmap(new BitmapData(1,15,true,TopColor)); + addChild(_header); + + _title=new TextField(); + _title.x=2; + _title.height=16; + _title.selectable=false; + _title.multiline=false; + _title.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + _title.text=Title; + addChild(_title); + + if(_resizable) + { + _handle=new ImgHandle(); + addChild(_handle); + } + + if((_width !=0)||(_height !=0)) + updateSize(); + bound(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + minSize=null; + maxSize=null; + _bounds=null; + removeChild(_shadow); + _shadow=null; + removeChild(_background); + _background=null; + removeChild(_header); + _header=null; + removeChild(_title); + _title=null; + if(_handle !=null) + removeChild(_handle); + _handle=null; + _drag=null; + } + + /** + * Resize the window. Subject to pre-specified minimums, maximums, and bounding rectangles. + * + * @param Width How wide to make the window. + * @param Height How tall to make the window. + */ + public function resize(Width:Float,Height:Float):Void + { + _width=Width; + _height=Height; + updateSize(); + } + + /** + * Change the position of the window. Subject to pre-specified bounding rectangles. + * + * @param X Desired X position of top left corner of the window. + * @param Y Desired Y position of top left corner of the window. + */ + public function reposition(X:Float,Y:Float):Void + { + x=X; + y=Y; + bound(); + } + + //***EVENT HANDLERS***// + + /** + * Used to set up basic mouse listeners. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * Mouse movement handler. Figures out if mouse is over handle or header bar or what. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(_dragging)//user is moving the window around + { + _overHeader=true; + reposition(parent.mouseX - _drag.x, parent.mouseY - _drag.y); + } + else if(_resizing) + { + _overHandle=true; + resize(mouseX - _drag.x, mouseY - _drag.y); + } + else if((mouseX>=0)&&(mouseX<=_width)&&(mouseY>=0)&&(mouseY<=_height)) + { //not dragging, mouse is over the window + _overHeader=(mouseX<=_header.width)&&(mouseY<=_header.height); + if(_resizable) + _overHandle=(mouseX>=_width - _handle.width)&&(mouseY>=_height - _handle.height); + } + else + { //not dragging, mouse is NOT over window + _overHandle=_overHeader=false; + } + + updateGUI(); + } + + /** + * Figure out if window is being repositioned(clicked on header)or resized(clicked on handle). + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + if(_overHeader) + { + _dragging=true; + _drag.x=mouseX; + _drag.y=mouseY; + } + else if(_overHandle) + { + _resizing=true; + _drag.x=_width-mouseX; + _drag.y=_height-mouseY; + } + } + + /** + * User let go of header bar or handler(or nothing), so turn off drag and resize behaviors. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + _dragging=false; + _resizing=false; + } + + //***MISC GUI MGMT STUFF***// + + /** + * Keep the window within the pre-specified bounding rectangle. + */ + private function bound():Void + { + if(_bounds !=null) + { + x=FlxU.bound(x,_bounds.left,_bounds.right-_width); + y=FlxU.bound(y,_bounds.top,_bounds.bottom-_height); + } + } + + /** + * Update the Flash shapes to match the new size, and reposition the header, shadow, and handle accordingly. + */ + private function updateSize():Void + { + _width=FlxU.bound(_width,minSize.x,maxSize.x); + _height=FlxU.bound(_height,minSize.y,maxSize.y); + + _header.scaleX=_width; + _background.scaleX=_width; + _background.scaleY=_height-15; + _shadow.scaleX=_width; + _shadow.y=_height; + _title.width=_width-4; + if(_resizable) + { + _handle.x=_width-_handle.width; + _handle.y=_height-_handle.height; + } + } + + /** + * Figure out if the header or handle are highlighted. + */ + private function updateGUI():Void + { + if(_overHeader || _overHandle) + { + if(_title.alpha !=1.0) + _title.alpha=1.0; + } + else + { + if(_title.alpha !=0.65) + _title.alpha=0.65; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/ObjectPool.hx b/AIR/intra/hsrc/org/flixel/system/ObjectPool.hx new file mode 100644 index 0000000..c21e19b --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/ObjectPool.hx @@ -0,0 +1,32 @@ +package org.flixel.system +{ +/** + * ... + * @author moly + */ +internal class DynamicPool +{ + private var _objects:Array; + private var _objectClass:Class; + + public function DynamicPool(ObjectClass:Class) + { + _objectClass=ObjectClass; + _objects=new Array(); + } + + public function getNew():Dynamic + { + var object:Dynamic=null; + if(_objects.length>0) + object=_objects.pop(); + else + object=new _objectClass(); + return object; + } + + public function disposeObject(OldObject:Dynamic):Void + { + _objects.push(OldObject); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/debug/Log.hx b/AIR/intra/hsrc/org/flixel/system/debug/Log.hx new file mode 100644 index 0000000..f6805a4 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/debug/Log.hx @@ -0,0 +1,91 @@ +package org.flixel.system.debug; + +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; +import org.flixel.system.FlxWindow; + +/** + * A simple trace output window for use in the debugger overlay. + * + * @author Adam Atomic + */ +class Log extends FlxWindow +{ + static protected var MAX_LOG_LINES:Int=200; + + private var _text:TextField; + private var _lines:Array; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + + _text=new TextField(); + _text.x=2; + _text.y=15; + _text.multiline=true; + _text.wordWrap=true; + _text.selectable=true; + _text.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + addChild(_text); + + _lines=new Array(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_text); + _text=null; + _lines=null; + super.destroy(); + } + + /** + * Adds a new line to the log window. + * + * @param Text The line you want to add to the log window. + */ + public function add(Text:String):Void + { + if(_lines.length<=0) + _text.text=""; + _lines.push(Text); + if(_lines.length>MAX_LOG_LINES) + { + _lines.shift(); + var newText:String=""; + for(i in 0..._lines.length) + newText +=_lines[i]+"\n"; + _text.text=newText; + } + else + _text.appendText(Text+"\n"); + _text.scrollV=_text.height; + } + + /** + * Adjusts the width and height of the text field accordingly. + */ + override private function updateSize():Void + { + super.updateSize(); + + _text.width=_width-10; + _text.height=_height-15; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/debug/Perf.hx b/AIR/intra/hsrc/org/flixel/system/debug/Perf.hx new file mode 100644 index 0000000..6ccdfe2 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/debug/Perf.hx @@ -0,0 +1,209 @@ +package org.flixel.system.debug; + +import flash.geom.Rectangle; +import flash.system.System; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.getTimer; + +import org.flixel.FlxG; +import org.flixel.system.FlxWindow; + +/** + * A simple performance monitor widget, for use in the debugger overlay. + * + * @author Adam Atomic + */ +class Perf extends FlxWindow +{ + private var _text:TextField; + + private var _lastTime:Int; + private var _updateTimer:Int; + + private var _flixelUpdate:Array; + private var _flixelUpdateMarker:Int; + private var _flixelDraw:Array; + private var _flixelDrawMarker:Int; + private var _flash:Array; + private var _flashMarker:Int; + private var _activeObject:Array; + private var _objectMarker:Int; + private var _visibleObject:Array; + private var _visibleObjectMarker:Int; + + /** + * Creates flashPlayerFramerate new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with flashPlayerFramerate drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + resize(90,66); + + _lastTime=0; + _updateTimer=0; + + _text=new TextField(); + _text.width=_width; + _text.x=2; + _text.y=15; + _text.multiline=true; + _text.wordWrap=true; + _text.selectable=true; + _text.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + addChild(_text); + + _flixelUpdate=new Array(32); + _flixelUpdateMarker=0; + _flixelDraw=new Array(32); + _flixelDrawMarker=0; + _flash=new Array(32); + _flashMarker=0; + _activeObject=new Array(32); + _objectMarker=0; + _visibleObject=new Array(32); + _visibleObjectMarker=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_text); + _text=null; + _flixelUpdate=null; + _flixelDraw=null; + _flash=null; + _activeObject=null; + _visibleObject=null; + super.destroy(); + } + + /** + * Called each frame, but really only updates once every second or so, to save on performance. + * Takes all the data in the accumulators and parses it Into useful performance data. + */ + public function update():Void + { + var time:Int=getTimer(); + var elapsed:Int=time - _lastTime; + var updateEvery:Int=500; + if(elapsed>updateEvery) + elapsed=updateEvery; + _lastTime=time; + + _updateTimer +=elapsed; + if(_updateTimer>updateEvery) + { + var i:Int; + var output:String=""; + + var flashPlayerFramerate:Float=0; + i=0; + while(i<_flashMarker) + flashPlayerFramerate +=_flash[i++]; + flashPlayerFramerate /=_flashMarker; + output +=uint(1/(flashPlayerFramerate/1000))+ "/" + FlxG.flashFramerate + "fps\n"; + + output +=Std.parseFloat((System.totalMemory * 0.000000954).toFixed(2))+ "MB\n"; + + var updateTime:Int=0; + i=0; + while(i<_flixelUpdateMarker) + updateTime +=_flixelUpdate[i++]; + + var activeCount:Int=0; + var te:Int=0; + i=0; + while(i<_objectMarker) + { + activeCount +=_activeObject[i]; + visibleCount +=_visibleObject[i++]; + } + activeCount /=_objectMarker; + + output +="U:" + activeCount + " " + Int(updateTime/_flixelDrawMarker)+ "ms\n"; + + var drawTime:Int=0; + i=0; + while(i<_flixelDrawMarker) + drawTime +=_flixelDraw[i++]; + + var visibleCount:Int=0; + i=0; + while(i<_visibleObjectMarker) + visibleCount +=_visibleObject[i++]; + visibleCount /=_visibleObjectMarker; + + output +="D:" + visibleCount + " " + Int(drawTime/_flixelDrawMarker)+ "ms"; + + _text.text=output; + + _flixelUpdateMarker=0; + _flixelDrawMarker=0; + _flashMarker=0; + _objectMarker=0; + _visibleObjectMarker=0; + _updateTimer -=updateEvery; + } + } + + /** + * Keep track of how long updates take. + * + * @param Time How long this update took. + */ + public function flixelUpdate(Time:Int):Void + { + _flixelUpdate[_flixelUpdateMarker++]=Time; + } + + /** + * Keep track of how long renders take. + * + * @param Time How long this render took. + */ + public function flixelDraw(Time:Int):Void + { + _flixelDraw[_flixelDrawMarker++]=Time; + } + + /** + * Keep track of how long the Flash player and browser take. + * + * @param Time How long Flash/browser took. + */ + public function flash(Time:Int):Void + { + _flash[_flashMarker++]=Time; + } + + /** + * Keep track of how many objects were updated. + * + * @param Count How many objects were updated. + */ + public function activeObjects(Count:Int):Void + { + _activeObject[_objectMarker++]=Count; + } + + /** + * Keep track of how many objects were updated. + * + * @param Count How many objects were updated. + */ + public function visibleObjects(Count:Int):Void + { + _visibleObject[_visibleObjectMarker++]=Count; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/debug/VCR.hx b/AIR/intra/hsrc/org/flixel/system/debug/VCR.hx new file mode 100644 index 0000000..c3fc70f --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/debug/VCR.hx @@ -0,0 +1,599 @@ +package org.flixel.system.debug; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.IOErrorEvent; +import flash.events.MouseEvent; +import flash.net.FileFilter; +import flash.net.FileReference; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.ByteArray; + +import org.flixel.FlxG; +import org.flixel.FlxU; +import org.flixel.system.FlxReplay; +import org.flixel.system.replay.FrameRecord; +import org.flixel.system.replay.MouseRecord; + +/** + * This class contains the record, stop, play, and step 1 frame buttons seen on the top edge of the debugger overlay. + * + * @author Adam Atomic + */ +class VCR extends Sprite +{ + //[Embed(source="../../data/vcr/open.png")] private var ImgOpen:Class; + //[Embed(source="../../data/vcr/record_off.png")] private var ImgRecordOff:Class; + //[Embed(source="../../data/vcr/record_on.png")] private var ImgRecordOn:Class; + //[Embed(source="../../data/vcr/stop.png")] private var ImgStop:Class; + //[Embed(source="../../data/vcr/flixel.png")] private var ImgFlixel:Class; + //[Embed(source="../../data/vcr/restart.png")] private var ImgRestart:Class; + //[Embed(source="../../data/vcr/pause.png")] private var ImgPause:Class; + //[Embed(source="../../data/vcr/play.png")] private var ImgPlay:Class; + //[Embed(source="../../data/vcr/step.png")] private var ImgStep:Class; + + static protected var FILE_TYPES:Array=[new FileFilter("Flixel Game Recording", "*.fgr")]; + static protected var DEFAULT_FILE_NAME:String="replay.fgr"; + + /** + * Whether the debugger has been paused. + */ + public var paused:Bool; + /** + * Whether a "1 frame step forward" was requested. + */ + public var stepRequested:Bool; + + private var _open:Bitmap; + private var _recordOff:Bitmap; + private var _recordOn:Bitmap; + private var _stop:Bitmap; + private var _flixel:Bitmap; + private var _restart:Bitmap; + private var _pause:Bitmap; + private var _play:Bitmap; + private var _step:Bitmap; + + private var _overOpen:Bool; + private var _overRecord:Bool; + private var _overRestart:Bool; + private var _overPause:Bool; + private var _overStep:Bool; + + private var _pressingOpen:Bool; + private var _pressingRecord:Bool; + private var _pressingRestart:Bool; + private var _pressingPause:Bool; + private var _pressingStep:Bool; + + private var _file:FileReference; + + private var _runtimeDisplay:TextField; + private var _runtime:Int; + + /** + * Creates the "VCR" control panel for debugger pausing, stepping, and recording. + */ + public function new() + { + super(); + + var spacing:Int=7; + + _open=new ImgOpen(); + addChild(_open); + + _recordOff=new ImgRecordOff(); + _recordOff.x=_open.x + _open.width + spacing; + addChild(_recordOff); + + _recordOn=new ImgRecordOn(); + _recordOn.x=_recordOff.x; + _recordOn.visible=false; + addChild(_recordOn); + + _stop=new ImgStop(); + _stop.x=_recordOff.x; + _stop.visible=false; + addChild(_stop); + + _flixel=new ImgFlixel(); + _flixel.x=_recordOff.x + _recordOff.width + spacing; + addChild(_flixel); + + _restart=new ImgRestart(); + _restart.x=_flixel.x + _flixel.width + spacing; + addChild(_restart); + + _pause=new ImgPause(); + _pause.x=_restart.x + _restart.width + spacing; + addChild(_pause); + + _play=new ImgPlay(); + _play.x=_pause.x; + _play.visible=false; + addChild(_play); + + _step=new ImgStep(); + _step.x=_pause.x + _pause.width + spacing; + addChild(_step); + + _runtimeDisplay=new TextField(); + _runtimeDisplay.width=width; + _runtimeDisplay.x=width; + _runtimeDisplay.y=-2; + _runtimeDisplay.multiline=false; + _runtimeDisplay.wordWrap=false; + _runtimeDisplay.selectable=false; + _runtimeDisplay.defaultTextFormat=new TextFormat("Courier",12,0xffffff,null,null,null,null,null,"center"); + _runtimeDisplay.visible=false; + addChild(_runtimeDisplay); + _runtime=0; + + stepRequested=false; + _file=null; + + unpress(); + checkOver(); + updateGUI(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _file=null; + + removeChild(_open); + _open=null; + removeChild(_recordOff); + _recordOff=null; + removeChild(_recordOn); + _recordOn=null; + removeChild(_stop); + _stop=null; + removeChild(_flixel); + _flixel=null; + removeChild(_restart); + _restart=null; + removeChild(_pause); + _pause=null; + removeChild(_play); + _play=null; + removeChild(_step); + _step=null; + + parent.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * Usually called by FlxGame when a requested recording has begun. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function recording():Void + { + _stop.visible=false; + _recordOff.visible=false; + _recordOn.visible=true; + } + + /** + * Usually called by FlxGame when a replay has been stopped. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function stopped():Void + { + _stop.visible=false; + _recordOn.visible=false; + _recordOff.visible=true; + } + + /** + * Usually called by FlxGame when a requested replay has begun. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function playing():Void + { + _recordOff.visible=false; + _recordOn.visible=false; + _stop.visible=true; + } + + /** + * Just updates the VCR GUI so the runtime displays roughly the right thing. + */ + public function updateRuntime(Time:Int):Void + { + _runtime +=Time; + _runtimeDisplay.text=FlxU.formatTime(_runtime/1000,true); + if(!_runtimeDisplay.visible) + _runtimeDisplay.visible=true; + } + + //*** ACTUAL BUTTON BEHAVIORS ***// + + /** + * Called when the "open file" button is pressed. + * Opens the file dialog and registers event handlers for the file dialog. + */ + public function onOpen():Void + { + _file=new FileReference(); + _file.addEventListener(Event.SELECT, onOpenSelect); + _file.addEventListener(Event.CANCEL, onOpenCancel); + _file.browse(FILE_TYPES); + } + + /** + * Called when a file is picked from the file dialog. + * Attempts to load the file and registers file loading event handlers. + * + * @param E Flash event. + */ + private function onOpenSelect(E:Event=null):Void + { + _file.removeEventListener(Event.SELECT, onOpenSelect); + _file.removeEventListener(Event.CANCEL, onOpenCancel); + + _file.addEventListener(Event.COMPLETE, onOpenComplete); + _file.addEventListener(IOErrorEvent.IO_ERROR, onOpenError); + _file.load(); + } + + /** + * Called when a file is opened successfully. + * If there's stuff inside, then the contents are loaded Into a new replay. + * + * @param E Flash Event. + */ + private function onOpenComplete(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onOpenComplete); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onOpenError); + + //Turn the file Into a giant string + var fileContents:String=null; + var data:ByteArray=_file.data; + if(data !=null) + fileContents=data.readUTFBytes(data.bytesAvailable); + _file=null; + if((fileContents==null)||(fileContents.length<=0)) + { + FlxG.log("ERROR:Empty flixel gameplay record."); + return; + } + + FlxG.loadReplay(fileContents); + } + + /** + * Called if the open file dialog is canceled. + * + * @param E Flash Event. + */ + private function onOpenCancel(E:Event=null):Void + { + _file.removeEventListener(Event.SELECT, onOpenSelect); + _file.removeEventListener(Event.CANCEL, onOpenCancel); + _file=null; + } + + /** + * Called if there is a file open error. + * + * @param E Flash Event. + */ + private function onOpenError(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onOpenComplete); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onOpenError); + _file=null; + FlxG.log("ERROR:Unable to open flixel gameplay record."); + } + + /** + * Called when the user presses the white record button. + * If Alt is pressed, the current state is reset, and a new recording is requested. + * If Alt is NOT pressed, the game is reset, and a new recording is requested. + * + * @param StandardMode Whether to reset the whole game, or just thisFlxState. StandardMode==false is useful for recording demos or attract modes. + */ + public function onRecord(StandardMode:Bool=false):Void + { + if(_play.visible) + onPlay(); + FlxG.recordReplay(StandardMode); + } + + /** + * Called when the user presses the red record button. + * Stops the current recording, opens the save file dialog, and registers event handlers. + */ + public function stopRecording():Void + { + var data:String=FlxG.stopRecording(); + if((data !=null)&&(data.length>0)) + { + _file=new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL,onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, DEFAULT_FILE_NAME); + } + } + + /** + * Called when the file is saved successfully. + * + * @param E Flash Event. + */ + private function onSaveComplete(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + FlxG.log("FLIXEL:successfully saved flixel gameplay record."); + } + + /** + * Called when the save file dialog is cancelled. + * + * @param E Flash Event. + */ + private function onSaveCancel(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + } + + /** + * Called if there is an error while saving the gameplay recording. + * + * @param E Flash Event. + */ + private function onSaveError(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + FlxG.log("ERROR:problem saving flixel gameplay record."); + } + + /** + * Called when the user presses the stop button. + * Stops the current replay. + */ + public function onStop():Void + { + FlxG.stopReplay(); + } + + /** + * Called when the user presses the Rewind-looking button. + * If Alt is pressed, the entire game is reset. + * If Alt is NOT pressed, only the current state is reset. + * The GUI is updated accordingly. + * + * @param StandardMode Whether to reset the current game(==true), or just the current state. Just resetting the current state can be very handy for debugging. + */ + public function onRestart(StandardMode:Bool=false):Void + { + if(FlxG.reloadReplay(StandardMode)) + { + _recordOff.visible=false; + _recordOn.visible=false; + _stop.visible=true; + } + } + + /** + * Called when the user presses the Pause button. + * This is different from user-defined pause behavior, or focus lost behavior. + * Does NOT pause music playback!! + */ + public function onPause():Void + { + paused=true; + _pause.visible=false; + _play.visible=true; + } + + /** + * Called when the user presses the Play button. + * This is different from user-defined unpause behavior, or focus gained behavior. + */ + public function onPlay():Void + { + paused=false; + _play.visible=false; + _pause.visible=true; + } + + /** + * Called when the user presses the fast-forward-looking button. + * Requests a 1-frame step forward in the game loop. + */ + public function onStep():Void + { + if(!paused) + onPause(); + stepRequested=true; + } + + //***EVENT HANDLERS***// + + /** + * Just sets up basic mouse listeners, a la FlxWindow. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + parent.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * If the mouse moves, check to see if any buttons should be highlighted. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(!checkOver()) + unpress(); + updateGUI(); + } + + /** + * If the mouse is pressed down, check to see if the user started pressing down a specific button. + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + unpress(); + if(_overOpen) + _pressingOpen=true; + if(_overRecord) + _pressingRecord=true; + if(_overRestart) + _pressingRestart=true; + if(_overPause) + _pressingPause=true; + if(_overStep) + _pressingStep=true; + } + + /** + * If the mouse is released, check to see if it was released over a button that was pressed. + * If it was, take the appropriate action based on button state and visibility. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + if(_overOpen && _pressingOpen) + onOpen(); + else if(_overRecord && _pressingRecord) + { + if(_stop.visible) + onStop(); + else if(_recordOn.visible) + stopRecording(); + else + onRecord(!E.altKey); + } + else if(_overRestart && _pressingRestart) + onRestart(!E.altKey); + else if(_overPause && _pressingPause) + { + if(_play.visible) + onPlay(); + else + onPause(); + } + else if(_overStep && _pressingStep) + onStep(); + + unpress(); + checkOver(); + updateGUI(); + } + + //***MISC GUI MGMT STUFF***// + + /** + * This function checks to see what button the mouse is currently over. + * Has some special behavior based on whether a recording is happening or not. + * + * @return Whether the mouse was over any buttons or not. + */ + private function checkOver():Bool + { + _overOpen=_overRecord=_overRestart=_overPause=_overStep=false; + if((mouseX<0)||(mouseX>width)||(mouseY<0)||(mouseY>15)) + return false; + if((mouseX>=_recordOff.x)&&(mouseX<=_recordOff.x + _recordOff.width)) + _overRecord=true; + if(!_recordOn.visible && !_overRecord) + { + if((mouseX>=_open.x)&&(mouseX<=_open.x + _open.width)) + _overOpen=true; + else if((mouseX>=_restart.x)&&(mouseX<=_restart.x + _restart.width)) + _overRestart=true; + else if((mouseX>=_pause.x)&&(mouseX<=_pause.x + _pause.width)) + _overPause=true; + else if((mouseX>=_step.x)&&(mouseX<=_step.x + _step.width)) + _overStep=true; + } + return true; + } + + /** + * Sets all the pressed state variables for the buttons to false. + */ + private function unpress():Void + { + _pressingOpen=false; + _pressingRecord=false; + _pressingRestart=false; + _pressingPause=false; + _pressingStep=false; + } + + /** + * Figures out what buttons to highlight based on the _overWhatever and _pressingWhatever variables. + */ + private function updateGUI():Void + { + if(_recordOn.visible) + { + _open.alpha=_restart.alpha=_pause.alpha=_step.alpha=0.35; + _recordOn.alpha=1.0; + return; + } + + if(_overOpen &&(_open.alpha !=1.0)) + _open.alpha=1.0; + else if(!_overOpen &&(_open.alpha !=0.8)) + _open.alpha=0.8; + + if(_overRecord &&(_recordOff.alpha !=1.0)) + _recordOff.alpha=_recordOn.alpha=_stop.alpha=1.0; + else if(!_overRecord &&(_recordOff.alpha !=0.8)) + _recordOff.alpha=_recordOn.alpha=_stop.alpha=0.8; + + if(_overRestart &&(_restart.alpha !=1.0)) + _restart.alpha=1.0; + else if(!_overRestart &&(_restart.alpha !=0.8)) + _restart.alpha=0.8; + + if(_overPause &&(_pause.alpha !=1.0)) + _pause.alpha=_play.alpha=1.0; + else if(!_overPause &&(_pause.alpha !=0.8)) + _pause.alpha=_play.alpha=0.8; + + if(_overStep &&(_step.alpha !=1.0)) + _step.alpha=1.0; + else if(!_overStep &&(_step.alpha !=0.8)) + _step.alpha=0.8; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/debug/Vis.hx b/AIR/intra/hsrc/org/flixel/system/debug/Vis.hx new file mode 100644 index 0000000..ac852d5 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/debug/Vis.hx @@ -0,0 +1,170 @@ +package org.flixel.system.debug; + +import flash.display.Bitmap; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.MouseEvent; + +import org.flixel.FlxG; + +/** + * This control panel has all the visual debugger toggles in it, in the debugger overlay. + * Currently there is only one toggle that flips on all the visual debug settings. + * This panel is heavily based on the VCR panel. + * + * @author Adam Atomic + */ +class Vis extends Sprite +{ + //[Embed(source="../../data/vis/bounds.png")] private var ImgBounds:Class; + + private var _bounds:Bitmap; + private var _overBounds:Bool; + private var _pressingBounds:Bool; + + /** + * Instantiate the visual debugger panel. + */ + public function new() + { + super(); + + var spacing:Int=7; + + _bounds=new ImgBounds(); + addChild(_bounds); + + unpress(); + checkOver(); + updateGUI(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + removeChild(_bounds); + _bounds=null; + + parent.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + //***ACTUAL BUTTON BEHAVIORS***// + + /** + * Called when the bounding box toggle is pressed. + */ + public function onBounds():Void + { + FlxG.visualDebug=!FlxG.visualDebug; + } + + //***EVENT HANDLERS***// + + /** + * Just sets up basic mouse listeners, a la FlxWindow. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + parent.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * If the mouse moves, check to see if any buttons should be highlighted. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(!checkOver()) + unpress(); + updateGUI(); + } + + /** + * If the mouse is pressed down, check to see if the user started pressing down a specific button. + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + unpress(); + if(_overBounds) + _pressingBounds=true; + } + + /** + * If the mouse is released, check to see if it was released over a button that was pressed. + * If it was, take the appropriate action based on button state and visibility. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + if(_overBounds && _pressingBounds) + onBounds(); + unpress(); + checkOver(); + updateGUI(); + } + + //***MISC GUI MGMT STUFF***// + + /** + * This function checks to see what button the mouse is currently over. + * Has some special behavior based on whether a recording is happening or not. + * + * @return Whether the mouse was over any buttons or not. + */ + private function checkOver():Bool + { + _overBounds=false; + if((mouseX<0)||(mouseX>width)||(mouseY<0)||(mouseY>height)) + return false; + if((mouseX>_bounds.x)||(mouseX<_bounds.x + _bounds.width)) + _overBounds=true; + return true; + } + + /** + * Sets all the pressed state variables for the buttons to false. + */ + private function unpress():Void + { + _pressingBounds=false; + } + + /** + * Figures out what buttons to highlight based on the _overWhatever and _pressingWhatever variables. + */ + private function updateGUI():Void + { + if(FlxG.visualDebug) + { + if(_overBounds &&(_bounds.alpha !=1.0)) + _bounds.alpha=1.0; + else if(!_overBounds &&(_bounds.alpha !=0.9)) + _bounds.alpha=0.9; + } + else + { + if(_overBounds &&(_bounds.alpha !=0.6)) + _bounds.alpha=0.6; + else if(!_overBounds &&(_bounds.alpha !=0.5)) + _bounds.alpha=0.5; + } + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/debug/Watch.hx b/AIR/intra/hsrc/org/flixel/system/debug/Watch.hx new file mode 100644 index 0000000..064ebf4 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/debug/Watch.hx @@ -0,0 +1,213 @@ +package org.flixel.system.debug; + +import flash.display.Sprite; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxU; +import org.flixel.system.FlxWindow; + +/** + * A Visual Studio-style "watch" window, for use in the debugger overlay. + * Track the values of any public variable in real-time, and/or edit their values on the fly. + * + * @author Adam Atomic + */ +class Watch extends FlxWindow +{ + static protected var MAX_LOG_LINES:Int=1024; + static protected var LINE_HEIGHT:Int=15; + + /** + * Whether a watch entry is currently being edited or not. + */ + public var editing:Bool; + + private var _names:Sprite; + private var _values:Sprite; + private var _watching:Array; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + + _names=new Sprite(); + _names.x=2; + _names.y=15; + addChild(_names); + + _values=new Sprite(); + _values.x=2; + _values.y=15; + addChild(_values); + + _watching=new Array(); + + editing=false; + + removeAll(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_names); + _names=null; + removeChild(_values); + _values=null; + var i:Int=0; + var l:Int=_watching.length; + while(iObjectcontaining the variable you want to track, e.g. this or Player.velocity. + * @param VariableName TheStringname of the variable you want to track, e.g. "width" or "x". + * @param DisplayName OptionalStringthat can be displayed in the watch window instead of the basic class-name information. + */ + public function add(AnyObject:Dynamic,VariableName:String,DisplayName:String=null):Void + { + //Don't add repeats + var watchEntry:WatchEntry; + var i:Int=0; + var l:Int=_watching.length; + while(iObjectcontaining the variable you want to remove, e.g. this or Player.velocity. + * @param VariableName TheStringname of the variable you want to remove, e.g. "width" or "x". If left null, this will remove all variables of that object. + */ + public function remove(AnyObject:Dynamic,VariableName:String=null):Void + { + //splice out the requested object + var watchEntry:WatchEntry; + var i:Int=_watching.length-1; + while(i>=0) + { + watchEntry=_watching[i]; + if((watchEntry.object==AnyObject)&&((VariableName==null)||(watchEntry.field==VariableName))) + { + _watching.splice(i,1); + _names.removeChild(watchEntry.nameDisplay); + _values.removeChild(watchEntry.valueDisplay); + watchEntry.destroy(); + } + i--; + } + watchEntry=null; + + //reset the display heights of the remaining objects + i=0; + var l:Int=_watching.length; + while(iObjectbeing watched. + */ + public var object:Dynamic; + /** + * The member variable of that object. + */ + public var field:String; + /** + * A custom display name for this object, if there is any. + */ + public var custom:String; + /** + * The FlashTextFieldobject used to display this entry's name. + */ + public var nameDisplay:TextField; + /** + * The FlashTextFieldobject used to display and edit this entry's value. + */ + public var valueDisplay:TextField; + /** + * Whether the entry is currently being edited or not. + */ + public var editing:Bool; + /** + * The value of the field before it was edited. + */ + public var oldValue:Dynamic; + + private var _whiteText:TextFormat; + private var _blackText:TextFormat; + + /** + * Creates a new watch entry in the watch window. + * + * @param Y The initial height in the Watch window. + * @param NameWidth The initial width of the name field. + * @param ValueWidth The initial width of the value field. + * @param Obj TheObjectcontaining the variable we want to watch. + * @param Field The variable name we want to watch. + * @param Custom A custom display name(optional). + */ + public function new(Y:Float,NameWidth:Float,ValueWidth:Float,Obj:Dynamic,Field:String,Custom:String=null) + { + editing=false; + + object=Obj; + field=Field; + custom=Custom; + + _whiteText=new TextFormat("Courier",12,0xffffff); + _blackText=new TextFormat("Courier",12,0); + + nameDisplay=new TextField(); + nameDisplay.y=Y; + nameDisplay.multiline=false; + nameDisplay.selectable=true; + nameDisplay.defaultTextFormat=_whiteText; + + valueDisplay=new TextField(); + valueDisplay.y=Y; + valueDisplay.height=15; + valueDisplay.multiline=false; + valueDisplay.selectable=true; + valueDisplay.doubleClickEnabled=true; + valueDisplay.addEventListener(KeyboardEvent.KEY_UP,onKeyUp); + valueDisplay.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + valueDisplay.background=false; + valueDisplay.backgroundColor=0xffffff; + valueDisplay.defaultTextFormat=_whiteText; + + updateWidth(NameWidth,ValueWidth); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + object=null; + oldValue=null; + nameDisplay=null; + field=null; + custom=null; + valueDisplay.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + valueDisplay.removeEventListener(KeyboardEvent.KEY_UP,onKeyUp); + valueDisplay=null; + } + + /** + * Set the watch window Y height of the FlashTextFieldobjects. + */ + public function setY(Y:Float):Void + { + nameDisplay.y=Y; + valueDisplay.y=Y; + } + + /** + * Adjust the width of the FlashTextFieldobjects. + */ + public function updateWidth(NameWidth:Float,ValueWidth:Float):Void + { + nameDisplay.width=NameWidth; + valueDisplay.width=ValueWidth; + if(custom !=null) + nameDisplay.text=custom; + else + { + nameDisplay.text=""; + if(NameWidth>120) + nameDisplay.appendText(FlxU.getClassName(object,(NameWidth<240))+ "."); + nameDisplay.appendText(field); + } + } + + /** + * Update the variable value on display with the current in-game value. + */ + public function updateValue():Bool + { + if(editing) + return false; + valueDisplay.text=object[field].toString(); + return true; + } + + /** + * A watch entry was clicked, so flip Into edit mode for that entry. + * + * @param FlashEvent Flash mouse event. + */ + public function onMouseUp(FlashEvent:MouseEvent):Void + { + editing=true; + oldValue=object[field]; + valueDisplay.type=TextFieldType.INPUT; + valueDisplay.setTextFormat(_blackText); + valueDisplay.background=true; + + } + + /** + * Check to see if Enter, Tab or Escape were just released. + * Enter or Tab submit the change, and Escape cancels it. + * + * @param FlashEvent Flash keyboard event. + */ + public function onKeyUp(FlashEvent:KeyboardEvent):Void + { + if((FlashEvent.keyCode==13)||(FlashEvent.keyCode==9)||(FlashEvent.keyCode==27))//enter or tab or escape + { + if(FlashEvent.keyCode==27) + cancel(); + else + submit(); + } + } + + /** + * Cancel the current edits and stop editing. + */ + public function cancel():Void + { + valueDisplay.text=oldValue.toString(); + doneEditing(); + } + + /** + * Submit the current edits and stop editing. + */ + public function submit():Void + { + object[field]=valueDisplay.text; + doneEditing(); + } + + /** + * Helper function, switches the text field back to display mode. + */ + private function doneEditing():Void + { + valueDisplay.type=TextFieldType.DYNAMIC; + valueDisplay.setTextFormat(_whiteText); + valueDisplay.defaultTextFormat=_whiteText; + valueDisplay.background=false; + editing=false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/input/Input.hx b/AIR/intra/hsrc/org/flixel/system/input/Input.hx new file mode 100644 index 0000000..ac82baa --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/input/Input.hx @@ -0,0 +1,189 @@ +package org.flixel.system.input; + +/** + * Basic input class that manages the fast-access Bools and detailed key-state tracking. + * Keyboard extends this with actual specific key data. + * + * @author Adam Atomic + */ +class Input +{ + /** + * @private + */ + public var _lookup:Dynamic; + /** + * @private + */ + public var _map:Array; + /** + * @private + */ + internal var _total:Int=258; + + /** + * Constructor + */ + public function new() + { + _lookup=new Dynamic(); + _map=new Array(_total); + } + + /** + * Updates the key states(for tracking just pressed, just released, etc). + */ + public function update():Void + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if(o==null)continue; + if((o.last==-1)&&(o.current==-1))o.current=0; + else if((o.last==2)&&(o.current==2))o.current=1; + o.last=o.current; + } + } + + /** + * Resets all the keys. + */ + public function reset():Void + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if(o==null)continue; + this[o.name]=false; + o.current=0; + o.last=0; + } + } + + /** + * Check to see if this key is pressed. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key is pressed + */ + public function pressed(Key:String):Bool { return this[Key];} + + /** + * Check to see if this key was just pressed. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key was just pressed + */ + public function justPressed(Key:String):Bool { return _map[_lookup[Key]].current==2;} + + /** + * Check to see if this key is just released. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key is just released. + */ + public function justReleased(Key:String):Bool { return _map[_lookup[Key]].current==-1;} + + /** + * If any keys are not "released"(0), + * this function will return an array indicating + * which keys are pressed and what state they are in. + * + * @return An array of key state data. Null if there is no data. + */ + public function record():Array + { + var data:Array=null; + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if((o==null)||(o.current==0)) + continue; + if(data==null) + data=new Array(); + data.push({code:i-1,value:o.current}); + } + return data; + } + + /** + * Part of the keystroke recording system. + * Takes data about key presses and sets it Into array. + * + * @param Record Array of data about key states. + */ + public function playback(Record:Array):Void + { + var i:Int=0; + var l:Int=Record.length; + var o:Dynamic; + var o2:Dynamic; + while(i0) + this[o2.name]=true; + } + } + + /** + * Look up the key code for any given string name of the key or button. + * + * @param KeyName TheStringname of the key. + * + * @return The key code for that key. + */ + public function getKeyCode(KeyName:String):Int + { + return _lookup[KeyName]; + } + + /** + * Check to see if any keys are pressed right now. + * + * @return Whether any keys are currently pressed. + */ + public function any():Bool + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if((o !=null)&&(o.current>0)) + return true; + } + return false; + } + + /** + * An Internal helper function used to build the key array. + * + * @param KeyName String name of the key(e.g. "LEFT" or "A") + * @param KeyCode The numeric Flash code for this key. + */ + private function addKey(KeyName:String,KeyCode:Int):Void + { + _lookup[KeyName]=KeyCode; + _map[KeyCode]={ name:KeyName, current:0, last:0 }; + } + + public function getKeyName(KeyCode:Int):String { + return _map[KeyCode]["name"]; + } + /** + * Clean up memory. + */ + public function destroy():Void + { + _lookup=null; + _map=null; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/input/Keyboard.hx b/AIR/intra/hsrc/org/flixel/system/input/Keyboard.hx new file mode 100644 index 0000000..dc9e9c1 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/input/Keyboard.hx @@ -0,0 +1,210 @@ +package org.flixel.system.input; + +import flash.events.KeyboardEvent; + +/** + * Keeps track of what keys are pressed and how with handy booleans or strings. + * + * @author Adam Atomic + */ +class Keyboard extends Input +{ + public var ESCAPE:Bool; + public var F1:Bool; + public var F2:Bool; + public var F3:Bool; + public var F4:Bool; + public var F5:Bool; + public var F6:Bool; + public var F7:Bool; + public var F8:Bool; + public var F9:Bool; + public var F10:Bool; + public var F11:Bool; + public var F12:Bool; + public var ONE:Bool; + public var TWO:Bool; + public var THREE:Bool; + public var FOUR:Bool; + public var FIVE:Bool; + public var SIX:Bool; + public var SEVEN:Bool; + public var EIGHT:Bool; + public var NINE:Bool; + public var ZERO:Bool; + public var NUMPADONE:Bool; + public var NUMPADTWO:Bool; + public var NUMPADTHREE:Bool; + public var NUMPADFOUR:Bool; + public var NUMPADFIVE:Bool; + public var NUMPADSIX:Bool; + public var NUMPADSEVEN:Bool; + public var NUMPADEIGHT:Bool; + public var NUMPADNINE:Bool; + public var NUMPADZERO:Bool; + public var PAGEUP:Bool; + public var PAGEDOWN:Bool; + public var HOME:Bool; + public var END:Bool; + public var INSERT:Bool; + public var MINUS:Bool; + public var NUMPADMINUS:Bool; + public var PLUS:Bool; + public var NUMPADPLUS:Bool; + public var DELETE:Bool; + public var BACKSPACE:Bool; + public var TAB:Bool; + public var Q:Bool; + public var W:Bool; + public var E:Bool; + public var R:Bool; + public var T:Bool; + public var Y:Bool; + public var U:Bool; + public var I:Bool; + public var O:Bool; + public var P:Bool; + public var LBRACKET:Bool; + public var RBRACKET:Bool; + public var BACKSLASH:Bool; + public var CAPSLOCK:Bool; + public var A:Bool; + public var S:Bool; + public var D:Bool; + public var F:Bool; + public var G:Bool; + public var H:Bool; + public var J:Bool; + public var K:Bool; + public var L:Bool; + public var SEMICOLON:Bool; + public var QUOTE:Bool; + public var ENTER:Bool; + public var SHIFT:Bool; + public var Z:Bool; + public var X:Bool; + public var C:Bool; + public var V:Bool; + public var B:Bool; + public var N:Bool; + public var M:Bool; + public var COMMA:Bool; + public var PERIOD:Bool; + public var NUMPADPERIOD:Bool; + public var SLASH:Bool; + public var NUMPADSLASH:Bool; + public var CONTROL:Bool; + public var ALT:Bool; + public var SPACE:Bool; + public var UP:Bool; + public var DOWN:Bool; + public var LEFT:Bool; + public var RIGHT:Bool; + + public function new() + { + var i:Int; + + //LETTERS + i=65; + while(i<=90) + addKey(String.fromCharCode(i),i++); + + //NUMBERS + i=48; + addKey("ZERO",i++); + addKey("ONE",i++); + addKey("TWO",i++); + addKey("THREE",i++); + addKey("FOUR",i++); + addKey("FIVE",i++); + addKey("SIX",i++); + addKey("SEVEN",i++); + addKey("EIGHT",i++); + addKey("NINE",i++); + i=96; + addKey("NUMPADZERO",i++); + addKey("NUMPADONE",i++); + addKey("NUMPADTWO",i++); + addKey("NUMPADTHREE",i++); + addKey("NUMPADFOUR",i++); + addKey("NUMPADFIVE",i++); + addKey("NUMPADSIX",i++); + addKey("NUMPADSEVEN",i++); + addKey("NUMPADEIGHT",i++); + addKey("NUMPADNINE",i++); + addKey("PAGEUP", 33); + addKey("PAGEDOWN", 34); + addKey("HOME", 36); + addKey("END", 35); + addKey("INSERT", 45); + //FUNCTION KEYS + i=1; + while(i<=12) + addKey("F"+i,111+(i++)); + + //SPECIAL KEYS + PUNCTUATION + addKey("ESCAPE",27); + addKey("MINUS",189); + addKey("NUMPADMINUS",109); + addKey("PLUS",187); + addKey("NUMPADPLUS",107); + addKey("DELETE",46); + addKey("BACKSPACE",8); + addKey("LBRACKET",219); + addKey("RBRACKET",221); + addKey("BACKSLASH",220); + addKey("CAPSLOCK",20); + addKey("SEMICOLON",186); + addKey("QUOTE",222); + addKey("ENTER",13); + addKey("SHIFT",16); + addKey("COMMA",188); + addKey("PERIOD",190); + addKey("NUMPADPERIOD",110); + addKey("SLASH",191); + addKey("NUMPADSLASH",191); + addKey("CONTROL",17); + addKey("ALT",18); + addKey("SPACE",32); + addKey("UP",38); + addKey("DOWN",40); + addKey("LEFT",37); + addKey("RIGHT",39); + addKey("TAB",9); + } + + /** + * Event handler so FlxGame can toggle keys. + * + * @param FlashEvent AKeyboardEventobject. + */ + public function handleKeyDown(FlashEvent:KeyboardEvent):Void + { + var object:Dynamic=null; + object=_map[FlashEvent.keyCode]; + if(object==null){ + return; + } + if(object.current>0)object.current=1; + else object.current=2; + this[object.name]=true; + } + + /** + * Event handler so FlxGame can toggle keys. + * + * @param FlashEvent AKeyboardEventobject. + */ + public function handleKeyUp(FlashEvent:KeyboardEvent):Void + { + var object:Dynamic=null; + object=_map[FlashEvent.keyCode]; + if(object==null){ + return; + } + if(object.current>0)object.current=-1; + else object.current=0; + this[object.name]=false; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/input/Mouse.hx b/AIR/intra/hsrc/org/flixel/system/input/Mouse.hx new file mode 100644 index 0000000..4488ebe --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/input/Mouse.hx @@ -0,0 +1,338 @@ +package org.flixel.system.input; + +import flash.display.Bitmap; +import flash.display.Sprite; +import flash.events.MouseEvent; + +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxU; +import org.flixel.system.replay.MouseRecord; + +/** + * This class helps contain and track the mouse pointer in your game. + * Automatically accounts for parallax scrolling, etc. + * + * @author Adam Atomic + */ +class Mouse extends FlxPoint +{ + //[Embed(source="../../data/cursor.png")] private var ImgDefaultCursor:Class; + + /** + * Current "delta" value of mouse wheel. If the wheel was just scrolled up, it will have a positive value. If it was just scrolled down, it will have a negative value. If it wasn't just scroll this frame, it will be 0. + */ + public var wheel:Int; + /** + * Current X position of the mouse pointer on the screen. + */ + public var screenX:Int; + /** + * Current Y position of the mouse pointer on the screen. + */ + public var screenY:Int; + + /** + * Helper variable for tracking whether the mouse was just pressed or just released. + */ + private var _current:Int; + /** + * Helper variable for tracking whether the mouse was just pressed or just released. + */ + private var _last:Int; + /** + * A display container for the mouse cursor. + * This container is a child of FlxGame and sits at the right "height". + */ + private var _cursorContainer:Sprite; + /** + * This is just a reference to the current cursor image, if there is one. + */ + private var _cursor:Bitmap; + /** + * Helper variables for recording purposes. + */ + private var _lastX:Int; + private var _lastY:Int; + private var _lastWheel:Int; + private var _point:FlxPoint; + private var _globalScreenPosition:FlxPoint; + + /** + * Constructor. + */ + public function new(CursorContainer:Sprite) + { + super(); + _cursorContainer=CursorContainer; + _lastX=screenX=0; + _lastY=screenY=0; + _lastWheel=wheel=0; + _current=0; + _last=0; + _cursor=null; + _point=new FlxPoint(); + _globalScreenPosition=new FlxPoint(); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _cursorContainer=null; + _cursor=null; + _point=null; + _globalScreenPosition=null; + } + + /** + * Either show an existing cursor or load a new one. + * + * @param Graphic The image you want to use for the cursor. + * @param Scale Change the size of the cursor. Default=1, or native size. 2=cast(2x, big), 0.5=half size, etc. + * @param XOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + * @param YOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + */ + public function show(Graphic:Class=null,Scale:Float=1,XOffset:Int=0,YOffset:Int=0):Void + { + _cursorContainer.visible=true; + if(Graphic !=null) + load(Graphic,Scale,XOffset,YOffset); + else if(_cursor==null) + load(); + } + + /** + * Hides the mouse cursor + */ + public function hide():Void + { + _cursorContainer.visible=false; + } + + /** + * Read only, check visibility of mouse cursor. + */ + public var visible(get_visible, null):Bool; + private function get_visible():Bool + { + return _cursorContainer.visible; + } + + /** + * Load a new mouse cursor graphic + * + * @param Graphic The image you want to use for the cursor. + * @param Scale Change the size of the cursor. + * @param XOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + * @param YOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + */ + public function load(Graphic:Class=null,Scale:Float=1,XOffset:Int=0,YOffset:Int=0):Void + { + if(_cursor !=null) + _cursorContainer.removeChild(_cursor); + + if(Graphic==null) + Graphic=ImgDefaultCursor; + _cursor=new Graphic(); + _cursor.x=XOffset; + _cursor.y=YOffset; + _cursor.scaleX=Scale; + _cursor.scaleY=Scale; + + _cursorContainer.addChild(_cursor); + } + + /** + * Unload the current cursor graphic. If the current cursor is visible, + * then the default system cursor is loaded up to replace the old one. + */ + public function unload():Void + { + if(_cursor !=null) + { + if(_cursorContainer.visible) + load(); + else + { + _cursorContainer.removeChild(_cursor) + _cursor=null; + } + } + } + + /** + * Called by the Internal game loop to update the mouse pointer's position in the game world. + * Also updates the just pressed/just released flags. + * + * @param X The current X position of the mouse in the window. + * @param Y The current Y position of the mouse in the window. + * @param XScroll The amount the game world has scrolled horizontally. + * @param YScroll The amount the game world has scrolled vertically. + */ + public function update(X:Int,Y:Int):Void + { + _globalScreenPosition.x=X; + _globalScreenPosition.y=Y; + updateCursor(); + if((_last==-1)&&(_current==-1)) + _current=0; + else if((_last==2)&&(_current==2)) + _current=1; + _last=_current; + } + + /** + * Internal function for helping to update the mouse cursor and world coordinates. + */ + private function updateCursor():Void + { + //actually position the flixel mouse cursor graphic + _cursorContainer.x=_globalScreenPosition.x; + _cursorContainer.y=_globalScreenPosition.y; + + //update the x, y, screenX, and screenY variables based on the default camera. + //This is basically a combination of getWorldPosition()and getScreenPosition() + var camera:FlxCamera=FlxG.camera; + screenX=(_globalScreenPosition.x - camera.x)/camera.zoom; + screenY=(_globalScreenPosition.y - camera.y)/camera.zoom; + x=screenX + camera.scroll.x; + y=screenY + camera.scroll.y; + } + + /** + * Fetch the world position of the mouse on any given camera. + * NOTE:Mouse.x and Mouse.y also store the world position of the mouse cursor on the main camera. + * + * @param Camera If unspecified, first/main global camera is used instead. + * @param Point An existing point object to store the results(if you don't want a new one created). + * + * @return The mouse's location in world space. + */ + public function getWorldPosition(Camera:FlxCamera=null,Point:FlxPoint=null):FlxPoint + { + if(Camera==null) + Camera=FlxG.camera; + if(Point==null) + Point=new FlxPoint(); + getScreenPosition(Camera,_point); + Point.x=_point.x + Camera.scroll.x; + Point.y=_point.y + Camera.scroll.y; + return Point; + } + + /** + * Fetch the screen position of the mouse on any given camera. + * NOTE:Mouse.screenX and Mouse.screenY also store the screen position of the mouse cursor on the main camera. + * + * @param Camera If unspecified, first/main global camera is used instead. + * @param Point An existing point object to store the results(if you don't want a new one created). + * + * @return The mouse's location in screen space. + */ + public function getScreenPosition(Camera:FlxCamera=null,Point:FlxPoint=null):FlxPoint + { + if(Camera==null) + Camera=FlxG.camera; + if(Point==null) + Point=new FlxPoint(); + Point.x=(_globalScreenPosition.x - Camera.x)/Camera.zoom; + Point.y=(_globalScreenPosition.y - Camera.y)/Camera.zoom; + return Point; + } + + /** + * Resets the just pressed/just released flags and sets mouse to not pressed. + */ + public function reset():Void + { + _current=0; + _last=0; + } + + /** + * Check to see if the mouse is pressed. + * + * @return Whether the mouse is pressed. + */ + public function pressed():Bool { return _current>0;} + + /** + * Check to see if the mouse was just pressed. + * + * @return Whether the mouse was just pressed. + */ + public function justPressed():Bool { return _current==2;} + + /** + * Check to see if the mouse was just released. + * + * @return Whether the mouse was just released. + */ + public function justReleased():Bool { return _current==-1;} + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseDown(FlashEvent:MouseEvent):Void + { + if(_current>0)_current=1; + else _current=2; + } + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseUp(FlashEvent:MouseEvent):Void + { + if(_current>0)_current=-1; + else _current=0; + } + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseWheel(FlashEvent:MouseEvent):Void + { + wheel=FlashEvent.delta; + } + + /** + * If the mouse changed state or is pressed, return that info now + * + * @return An array of key state data. Null if there is no data. + */ + public function record():MouseRecord + { + if((_lastX==_globalScreenPosition.x)&&(_lastY==_globalScreenPosition.y)&&(_current==0)&&(_lastWheel==wheel)) + return null; + _lastX=_globalScreenPosition.x; + _lastY=_globalScreenPosition.y; + _lastWheel=wheel; + return new MouseRecord(_lastX,_lastY,_current,_lastWheel); + } + + /** + * Part of the keystroke recording system. + * Takes data about key presses and sets it Into array. + * + * @param KeyStates Array of data about key states. + */ + public function playback(Record:MouseRecord):Void + { + _current=Record.button; + wheel=Record.wheel; + _globalScreenPosition.x=Record.x; + _globalScreenPosition.y=Record.y; + updateCursor(); + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/replay/FrameRecord.hx b/AIR/intra/hsrc/org/flixel/system/replay/FrameRecord.hx new file mode 100644 index 0000000..8653f2a --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/replay/FrameRecord.hx @@ -0,0 +1,142 @@ +package org.flixel.system.replay; + + +/** + * Helper class for the new replay system. Represents all the game inputs for one "frame" or "step" of the game loop. + * + * @author Adam Atomic + */ +class FrameRecord +{ + /** + * Which frame of the game loop this record is from or for. + */ + public var frame:Int; + /** + * An array of simple Integer pairs referring to what key is pressed, and what state its in. + */ + public var keys:Array; + /** + * A container for the 4 mouse state Integers. + */ + public var mouse:MouseRecord; + + /** + * Instantiate array new frame record. + */ + public function new() + { + frame=0; + keys=null; + mouse=null; + } + + /** + * Load this frame record with input data from the input managers. + * + * @param Frame What frame it is. + * @param Keys Keyboard data from the keyboard manager. + * @param Mouse Mouse data from the mouse manager. + * + * @return A reference to thisFrameRecordobject. + * + */ + public function create(Frame:Float,Keys:Array=null,Mouse:MouseRecord=null):FrameRecord + { + frame=Frame; + keys=Keys; + mouse=Mouse; + return this; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + keys=null; + mouse=null; + } + + /** + * Save the frame record data to array simple ASCII string. + * + * @return AStringobject containing the relevant frame record data. + */ + public function save():String + { + var output:String=frame+"k"; + + if(keys !=null) + { + var object:Dynamic; + var i:Int=0; + var l:Int=keys.length; + while(i0) + output +=","; + object=keys[i++]; + output +=object.code+":"+object.value; + } + } + + output +="m"; + if(mouse !=null) + output +=mouse.x + "," + mouse.y + "," + mouse.button + "," + mouse.wheel; + + return output; + } + + /** + * Load the frame record data from array simple ASCII string. + * + * @param Data AStringobject containing the relevant frame record data. + */ + public function load(Data:String):FrameRecord + { + var i:Int; + var l:Int; + + //get frame number + var array:Array=Data.split("k"); + frame=Std.int(array[0] as String); + + //split up keyboard and mouse data + array=(array[1] as String).split("m"); + var keyData:String=array[0]; + var mouseData:String=array[1]; + + //parse keyboard data + if(keyData.length>0) + { + //get keystroke data pairs + array=keyData.split(","); + + //go through each data pair and enter it Into this frame's key state + var keyPair:Array; + i=0; + l=array.length; + while(i0) + { + array=mouseData.split(","); + if(array.length>=4) + mouse=new MouseRecord(int(array[0] as String),int(array[1] as String),int(array[2] as String),int(array[3] as String)); + } + + return this; + } +} \ No newline at end of file diff --git a/AIR/intra/hsrc/org/flixel/system/replay/MouseRecord.hx b/AIR/intra/hsrc/org/flixel/system/replay/MouseRecord.hx new file mode 100644 index 0000000..bf5d1c6 --- /dev/null +++ b/AIR/intra/hsrc/org/flixel/system/replay/MouseRecord.hx @@ -0,0 +1,42 @@ +package org.flixel.system.replay; + +/** + * A helper class for the frame records, part of the replay/demo/recording system. + * + * @author Adam Atomic + */ +class MouseRecord +{ + /** + * The main X value of the mouse in screen space. + */ + public var x:Int; + /** + * The main Y value of the mouse in screen space. + */ + public var y:Int; + /** + * The state of the left mouse button. + */ + public var button:Int; + /** + * The state of the mouse wheel. + */ + public var wheel:Int; + + /** + * Instantiate a new mouse input record. + * + * @param X The main X value of the mouse in screen space. + * @param Y The main Y value of the mouse in screen space. + * @param Button The state of the left mouse button. + * @param Wheel The state of the mouse wheel. + */ + public function new(X:Int,Y:Int,Button:Int,Wheel:Int) + { + x=X; + y=Y; + button=Button; + wheel=Wheel; + } +} \ No newline at end of file diff --git a/intra/mPackageApp.bat b/AIR/intra/mPackageApp.bat similarity index 100% rename from intra/mPackageApp.bat rename to AIR/intra/mPackageApp.bat diff --git a/intra/mRun.bat b/AIR/intra/mRun.bat similarity index 100% rename from intra/mRun.bat rename to AIR/intra/mRun.bat diff --git a/intra/obj/Intra-AIRConfig.old b/AIR/intra/obj/Intra-AIRConfig.old similarity index 100% rename from intra/obj/Intra-AIRConfig.old rename to AIR/intra/obj/Intra-AIRConfig.old diff --git a/intra/obj/Intra-AIRConfig.xml b/AIR/intra/obj/Intra-AIRConfig.xml similarity index 100% rename from intra/obj/Intra-AIRConfig.xml rename to AIR/intra/obj/Intra-AIRConfig.xml diff --git a/intra/src/Intra.as b/AIR/intra/src/Intra.as similarity index 100% rename from intra/src/Intra.as rename to AIR/intra/src/Intra.as diff --git a/intra/src/Main.as b/AIR/intra/src/Main.as similarity index 100% rename from intra/src/Main.as rename to AIR/intra/src/Main.as diff --git a/intra/src/Preloader.as b/AIR/intra/src/Preloader.as similarity index 100% rename from intra/src/Preloader.as rename to AIR/intra/src/Preloader.as diff --git a/intra/src/Save.as b/AIR/intra/src/Save.as similarity index 100% rename from intra/src/Save.as rename to AIR/intra/src/Save.as diff --git a/intra/src/awerwer/com.zip b/AIR/intra/src/awerwer/com.zip similarity index 100% rename from intra/src/awerwer/com.zip rename to AIR/intra/src/awerwer/com.zip diff --git a/intra/src/awerwer/com/FRESteamWorksLibLinux.swc b/AIR/intra/src/awerwer/com/FRESteamWorksLibLinux.swc similarity index 100% rename from intra/src/awerwer/com/FRESteamWorksLibLinux.swc rename to AIR/intra/src/awerwer/com/FRESteamWorksLibLinux.swc diff --git a/intra/src/awerwer/com/FRESteamWorksTest.as b/AIR/intra/src/awerwer/com/FRESteamWorksTest.as similarity index 100% rename from intra/src/awerwer/com/FRESteamWorksTest.as rename to AIR/intra/src/awerwer/com/FRESteamWorksTest.as diff --git a/intra/src/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.as b/AIR/intra/src/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.as similarity index 100% rename from intra/src/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.as rename to AIR/intra/src/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.as diff --git a/intra/src/awerwer/com/amanitadesign/steam/Assets/descriptor.xml b/AIR/intra/src/awerwer/com/amanitadesign/steam/Assets/descriptor.xml similarity index 100% rename from intra/src/awerwer/com/amanitadesign/steam/Assets/descriptor.xml rename to AIR/intra/src/awerwer/com/amanitadesign/steam/Assets/descriptor.xml diff --git a/intra/src/awerwer/com/amanitadesign/steam/FRESteamWorks.as b/AIR/intra/src/awerwer/com/amanitadesign/steam/FRESteamWorks.as similarity index 100% rename from intra/src/awerwer/com/amanitadesign/steam/FRESteamWorks.as rename to AIR/intra/src/awerwer/com/amanitadesign/steam/FRESteamWorks.as diff --git a/intra/src/awerwer/com/amanitadesign/steam/SteamConstants.as b/AIR/intra/src/awerwer/com/amanitadesign/steam/SteamConstants.as similarity index 100% rename from intra/src/awerwer/com/amanitadesign/steam/SteamConstants.as rename to AIR/intra/src/awerwer/com/amanitadesign/steam/SteamConstants.as diff --git a/intra/src/awerwer/com/amanitadesign/steam/SteamEvent.as b/AIR/intra/src/awerwer/com/amanitadesign/steam/SteamEvent.as similarity index 100% rename from intra/src/awerwer/com/amanitadesign/steam/SteamEvent.as rename to AIR/intra/src/awerwer/com/amanitadesign/steam/SteamEvent.as diff --git a/intra/src/buildmap.py b/AIR/intra/src/buildmap.py similarity index 100% rename from intra/src/buildmap.py rename to AIR/intra/src/buildmap.py diff --git a/intra/src/ca/wegetsignal/nativeextensions/MacJoystick.as b/AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystick.as similarity index 100% rename from intra/src/ca/wegetsignal/nativeextensions/MacJoystick.as rename to AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystick.as diff --git a/intra/src/ca/wegetsignal/nativeextensions/MacJoystickEvent.as b/AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystickEvent.as similarity index 100% rename from intra/src/ca/wegetsignal/nativeextensions/MacJoystickEvent.as rename to AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystickEvent.as diff --git a/intra/src/ca/wegetsignal/nativeextensions/MacJoystickManager.as b/AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystickManager.as similarity index 100% rename from intra/src/ca/wegetsignal/nativeextensions/MacJoystickManager.as rename to AIR/intra/src/ca/wegetsignal/nativeextensions/MacJoystickManager.as diff --git a/intra/src/com/FRESteamWorksLibLinux.swc b/AIR/intra/src/com/FRESteamWorksLibLinux.swc similarity index 100% rename from intra/src/com/FRESteamWorksLibLinux.swc rename to AIR/intra/src/com/FRESteamWorksLibLinux.swc diff --git a/intra/src/com/FRESteamWorksTest.as b/AIR/intra/src/com/FRESteamWorksTest.as similarity index 100% rename from intra/src/com/FRESteamWorksTest.as rename to AIR/intra/src/com/FRESteamWorksTest.as diff --git a/intra/src/com/amanitadesign/steam/Assets/FRESteamWorkswin.as b/AIR/intra/src/com/amanitadesign/steam/Assets/FRESteamWorkswin.as similarity index 100% rename from intra/src/com/amanitadesign/steam/Assets/FRESteamWorkswin.as rename to AIR/intra/src/com/amanitadesign/steam/Assets/FRESteamWorkswin.as diff --git a/intra/src/com/amanitadesign/steam/Assets/descriptor.xml b/AIR/intra/src/com/amanitadesign/steam/Assets/descriptor.xml similarity index 100% rename from intra/src/com/amanitadesign/steam/Assets/descriptor.xml rename to AIR/intra/src/com/amanitadesign/steam/Assets/descriptor.xml diff --git a/intra/src/com/amanitadesign/steam/FRESteamWorks.as b/AIR/intra/src/com/amanitadesign/steam/FRESteamWorks.as similarity index 100% rename from intra/src/com/amanitadesign/steam/FRESteamWorks.as rename to AIR/intra/src/com/amanitadesign/steam/FRESteamWorks.as diff --git a/intra/src/com/amanitadesign/steam/SteamConstants.as b/AIR/intra/src/com/amanitadesign/steam/SteamConstants.as similarity index 100% rename from intra/src/com/amanitadesign/steam/SteamConstants.as rename to AIR/intra/src/com/amanitadesign/steam/SteamConstants.as diff --git a/intra/src/com/amanitadesign/steam/SteamEvent.as b/AIR/intra/src/com/amanitadesign/steam/SteamEvent.as similarity index 100% rename from intra/src/com/amanitadesign/steam/SteamEvent.as rename to AIR/intra/src/com/amanitadesign/steam/SteamEvent.as diff --git a/intra/src/com/amanitadesign/steam/old/FRESteamWorks.as b/AIR/intra/src/com/amanitadesign/steam/old/FRESteamWorks.as similarity index 100% rename from intra/src/com/amanitadesign/steam/old/FRESteamWorks.as rename to AIR/intra/src/com/amanitadesign/steam/old/FRESteamWorks.as diff --git a/intra/src/com/amanitadesign/steam/old/SteamConstants.as b/AIR/intra/src/com/amanitadesign/steam/old/SteamConstants.as similarity index 100% rename from intra/src/com/amanitadesign/steam/old/SteamConstants.as rename to AIR/intra/src/com/amanitadesign/steam/old/SteamConstants.as diff --git a/intra/src/com/amanitadesign/steam/old/SteamEvent.as b/AIR/intra/src/com/amanitadesign/steam/old/SteamEvent.as similarity index 100% rename from intra/src/com/amanitadesign/steam/old/SteamEvent.as rename to AIR/intra/src/com/amanitadesign/steam/old/SteamEvent.as diff --git a/intra/src/csv/APARTMENT_BG.csv b/AIR/intra/src/csv/APARTMENT_BG.csv similarity index 100% rename from intra/src/csv/APARTMENT_BG.csv rename to AIR/intra/src/csv/APARTMENT_BG.csv diff --git a/intra/src/csv/APARTMENT_BG2.csv b/AIR/intra/src/csv/APARTMENT_BG2.csv similarity index 100% rename from intra/src/csv/APARTMENT_BG2.csv rename to AIR/intra/src/csv/APARTMENT_BG2.csv diff --git a/intra/src/csv/APARTMENT_FG.csv b/AIR/intra/src/csv/APARTMENT_FG.csv similarity index 100% rename from intra/src/csv/APARTMENT_FG.csv rename to AIR/intra/src/csv/APARTMENT_FG.csv diff --git a/intra/src/csv/BEACH_BG.csv b/AIR/intra/src/csv/BEACH_BG.csv similarity index 100% rename from intra/src/csv/BEACH_BG.csv rename to AIR/intra/src/csv/BEACH_BG.csv diff --git a/intra/src/csv/BEACH_BG2.csv b/AIR/intra/src/csv/BEACH_BG2.csv similarity index 100% rename from intra/src/csv/BEACH_BG2.csv rename to AIR/intra/src/csv/BEACH_BG2.csv diff --git a/intra/src/csv/BEACH_FG.csv b/AIR/intra/src/csv/BEACH_FG.csv similarity index 100% rename from intra/src/csv/BEACH_FG.csv rename to AIR/intra/src/csv/BEACH_FG.csv diff --git a/intra/src/csv/BEDROOM_BG.csv b/AIR/intra/src/csv/BEDROOM_BG.csv similarity index 100% rename from intra/src/csv/BEDROOM_BG.csv rename to AIR/intra/src/csv/BEDROOM_BG.csv diff --git a/intra/src/csv/BEDROOM_BG2.csv b/AIR/intra/src/csv/BEDROOM_BG2.csv similarity index 100% rename from intra/src/csv/BEDROOM_BG2.csv rename to AIR/intra/src/csv/BEDROOM_BG2.csv diff --git a/intra/src/csv/BEDROOM_FG.csv b/AIR/intra/src/csv/BEDROOM_FG.csv similarity index 100% rename from intra/src/csv/BEDROOM_FG.csv rename to AIR/intra/src/csv/BEDROOM_FG.csv diff --git a/intra/src/csv/BLANK_BG.csv b/AIR/intra/src/csv/BLANK_BG.csv similarity index 100% rename from intra/src/csv/BLANK_BG.csv rename to AIR/intra/src/csv/BLANK_BG.csv diff --git a/intra/src/csv/BLUE_BG.csv b/AIR/intra/src/csv/BLUE_BG.csv similarity index 100% rename from intra/src/csv/BLUE_BG.csv rename to AIR/intra/src/csv/BLUE_BG.csv diff --git a/intra/src/csv/BLUE_BG2.csv b/AIR/intra/src/csv/BLUE_BG2.csv similarity index 100% rename from intra/src/csv/BLUE_BG2.csv rename to AIR/intra/src/csv/BLUE_BG2.csv diff --git a/intra/src/csv/BLUE_FG.csv b/AIR/intra/src/csv/BLUE_FG.csv similarity index 100% rename from intra/src/csv/BLUE_FG.csv rename to AIR/intra/src/csv/BLUE_FG.csv diff --git a/intra/src/csv/CIRCUS_BG.csv b/AIR/intra/src/csv/CIRCUS_BG.csv similarity index 100% rename from intra/src/csv/CIRCUS_BG.csv rename to AIR/intra/src/csv/CIRCUS_BG.csv diff --git a/intra/src/csv/CIRCUS_BG2.csv b/AIR/intra/src/csv/CIRCUS_BG2.csv similarity index 100% rename from intra/src/csv/CIRCUS_BG2.csv rename to AIR/intra/src/csv/CIRCUS_BG2.csv diff --git a/intra/src/csv/CIRCUS_FG.csv b/AIR/intra/src/csv/CIRCUS_FG.csv similarity index 100% rename from intra/src/csv/CIRCUS_FG.csv rename to AIR/intra/src/csv/CIRCUS_FG.csv diff --git a/intra/src/csv/CLIFF_BG.csv b/AIR/intra/src/csv/CLIFF_BG.csv similarity index 100% rename from intra/src/csv/CLIFF_BG.csv rename to AIR/intra/src/csv/CLIFF_BG.csv diff --git a/intra/src/csv/CLIFF_BG2.csv b/AIR/intra/src/csv/CLIFF_BG2.csv similarity index 100% rename from intra/src/csv/CLIFF_BG2.csv rename to AIR/intra/src/csv/CLIFF_BG2.csv diff --git a/intra/src/csv/CROWD_BG.csv b/AIR/intra/src/csv/CROWD_BG.csv similarity index 100% rename from intra/src/csv/CROWD_BG.csv rename to AIR/intra/src/csv/CROWD_BG.csv diff --git a/intra/src/csv/CROWD_BG2.csv b/AIR/intra/src/csv/CROWD_BG2.csv similarity index 100% rename from intra/src/csv/CROWD_BG2.csv rename to AIR/intra/src/csv/CROWD_BG2.csv diff --git a/intra/src/csv/CROWD_FG.csv b/AIR/intra/src/csv/CROWD_FG.csv similarity index 100% rename from intra/src/csv/CROWD_FG.csv rename to AIR/intra/src/csv/CROWD_FG.csv diff --git a/intra/src/csv/DEBUG_BG.csv b/AIR/intra/src/csv/DEBUG_BG.csv similarity index 100% rename from intra/src/csv/DEBUG_BG.csv rename to AIR/intra/src/csv/DEBUG_BG.csv diff --git a/intra/src/csv/DEBUG_BG2.csv b/AIR/intra/src/csv/DEBUG_BG2.csv similarity index 100% rename from intra/src/csv/DEBUG_BG2.csv rename to AIR/intra/src/csv/DEBUG_BG2.csv diff --git a/intra/src/csv/DEBUG_FG.csv b/AIR/intra/src/csv/DEBUG_FG.csv similarity index 100% rename from intra/src/csv/DEBUG_FG.csv rename to AIR/intra/src/csv/DEBUG_FG.csv diff --git a/intra/src/csv/DRAWER_BG.csv b/AIR/intra/src/csv/DRAWER_BG.csv similarity index 100% rename from intra/src/csv/DRAWER_BG.csv rename to AIR/intra/src/csv/DRAWER_BG.csv diff --git a/intra/src/csv/DRAWER_BG2.csv b/AIR/intra/src/csv/DRAWER_BG2.csv similarity index 100% rename from intra/src/csv/DRAWER_BG2.csv rename to AIR/intra/src/csv/DRAWER_BG2.csv diff --git a/intra/src/csv/DRAWER_FG.csv b/AIR/intra/src/csv/DRAWER_FG.csv similarity index 100% rename from intra/src/csv/DRAWER_FG.csv rename to AIR/intra/src/csv/DRAWER_FG.csv diff --git a/intra/src/csv/FIELDS_BG.csv b/AIR/intra/src/csv/FIELDS_BG.csv similarity index 100% rename from intra/src/csv/FIELDS_BG.csv rename to AIR/intra/src/csv/FIELDS_BG.csv diff --git a/intra/src/csv/FIELDS_BG2.csv b/AIR/intra/src/csv/FIELDS_BG2.csv similarity index 100% rename from intra/src/csv/FIELDS_BG2.csv rename to AIR/intra/src/csv/FIELDS_BG2.csv diff --git a/intra/src/csv/FIELDS_FG.csv b/AIR/intra/src/csv/FIELDS_FG.csv similarity index 100% rename from intra/src/csv/FIELDS_FG.csv rename to AIR/intra/src/csv/FIELDS_FG.csv diff --git a/intra/src/csv/FOREST_BG.csv b/AIR/intra/src/csv/FOREST_BG.csv similarity index 100% rename from intra/src/csv/FOREST_BG.csv rename to AIR/intra/src/csv/FOREST_BG.csv diff --git a/intra/src/csv/FOREST_BG2.csv b/AIR/intra/src/csv/FOREST_BG2.csv similarity index 100% rename from intra/src/csv/FOREST_BG2.csv rename to AIR/intra/src/csv/FOREST_BG2.csv diff --git a/intra/src/csv/FOREST_FG.csv b/AIR/intra/src/csv/FOREST_FG.csv similarity index 100% rename from intra/src/csv/FOREST_FG.csv rename to AIR/intra/src/csv/FOREST_FG.csv diff --git a/intra/src/csv/GO_BG.csv b/AIR/intra/src/csv/GO_BG.csv similarity index 100% rename from intra/src/csv/GO_BG.csv rename to AIR/intra/src/csv/GO_BG.csv diff --git a/intra/src/csv/GO_BG2.csv b/AIR/intra/src/csv/GO_BG2.csv similarity index 100% rename from intra/src/csv/GO_BG2.csv rename to AIR/intra/src/csv/GO_BG2.csv diff --git a/intra/src/csv/GO_BG2_old.csv b/AIR/intra/src/csv/GO_BG2_old.csv similarity index 100% rename from intra/src/csv/GO_BG2_old.csv rename to AIR/intra/src/csv/GO_BG2_old.csv diff --git a/intra/src/csv/GO_FG.csv b/AIR/intra/src/csv/GO_FG.csv similarity index 100% rename from intra/src/csv/GO_FG.csv rename to AIR/intra/src/csv/GO_FG.csv diff --git a/intra/src/csv/HAPPY_BG.csv b/AIR/intra/src/csv/HAPPY_BG.csv similarity index 100% rename from intra/src/csv/HAPPY_BG.csv rename to AIR/intra/src/csv/HAPPY_BG.csv diff --git a/intra/src/csv/HAPPY_BG2.csv b/AIR/intra/src/csv/HAPPY_BG2.csv similarity index 100% rename from intra/src/csv/HAPPY_BG2.csv rename to AIR/intra/src/csv/HAPPY_BG2.csv diff --git a/intra/src/csv/HAPPY_FG.csv b/AIR/intra/src/csv/HAPPY_FG.csv similarity index 100% rename from intra/src/csv/HAPPY_FG.csv rename to AIR/intra/src/csv/HAPPY_FG.csv diff --git a/intra/src/csv/HOTEL_BG.csv b/AIR/intra/src/csv/HOTEL_BG.csv similarity index 100% rename from intra/src/csv/HOTEL_BG.csv rename to AIR/intra/src/csv/HOTEL_BG.csv diff --git a/intra/src/csv/HOTEL_BG2.csv b/AIR/intra/src/csv/HOTEL_BG2.csv similarity index 100% rename from intra/src/csv/HOTEL_BG2.csv rename to AIR/intra/src/csv/HOTEL_BG2.csv diff --git a/intra/src/csv/HOTEL_FG.csv b/AIR/intra/src/csv/HOTEL_FG.csv similarity index 100% rename from intra/src/csv/HOTEL_FG.csv rename to AIR/intra/src/csv/HOTEL_FG.csv diff --git a/intra/src/csv/Minimap_Apartment.csv b/AIR/intra/src/csv/Minimap_Apartment.csv similarity index 100% rename from intra/src/csv/Minimap_Apartment.csv rename to AIR/intra/src/csv/Minimap_Apartment.csv diff --git a/intra/src/csv/Minimap_Beach.csv b/AIR/intra/src/csv/Minimap_Beach.csv similarity index 100% rename from intra/src/csv/Minimap_Beach.csv rename to AIR/intra/src/csv/Minimap_Beach.csv diff --git a/intra/src/csv/Minimap_Bedroom.csv b/AIR/intra/src/csv/Minimap_Bedroom.csv similarity index 100% rename from intra/src/csv/Minimap_Bedroom.csv rename to AIR/intra/src/csv/Minimap_Bedroom.csv diff --git a/intra/src/csv/Minimap_Cell.csv b/AIR/intra/src/csv/Minimap_Cell.csv similarity index 100% rename from intra/src/csv/Minimap_Cell.csv rename to AIR/intra/src/csv/Minimap_Cell.csv diff --git a/intra/src/csv/Minimap_Circus.csv b/AIR/intra/src/csv/Minimap_Circus.csv similarity index 100% rename from intra/src/csv/Minimap_Circus.csv rename to AIR/intra/src/csv/Minimap_Circus.csv diff --git a/intra/src/csv/Minimap_Cliff.csv b/AIR/intra/src/csv/Minimap_Cliff.csv similarity index 100% rename from intra/src/csv/Minimap_Cliff.csv rename to AIR/intra/src/csv/Minimap_Cliff.csv diff --git a/intra/src/csv/Minimap_Crowd.csv b/AIR/intra/src/csv/Minimap_Crowd.csv similarity index 100% rename from intra/src/csv/Minimap_Crowd.csv rename to AIR/intra/src/csv/Minimap_Crowd.csv diff --git a/intra/src/csv/Minimap_Fields.csv b/AIR/intra/src/csv/Minimap_Fields.csv similarity index 100% rename from intra/src/csv/Minimap_Fields.csv rename to AIR/intra/src/csv/Minimap_Fields.csv diff --git a/intra/src/csv/Minimap_Forest.csv b/AIR/intra/src/csv/Minimap_Forest.csv similarity index 100% rename from intra/src/csv/Minimap_Forest.csv rename to AIR/intra/src/csv/Minimap_Forest.csv diff --git a/intra/src/csv/Minimap_Hotel.csv b/AIR/intra/src/csv/Minimap_Hotel.csv similarity index 100% rename from intra/src/csv/Minimap_Hotel.csv rename to AIR/intra/src/csv/Minimap_Hotel.csv diff --git a/intra/src/csv/Minimap_Overworld.csv b/AIR/intra/src/csv/Minimap_Overworld.csv similarity index 100% rename from intra/src/csv/Minimap_Overworld.csv rename to AIR/intra/src/csv/Minimap_Overworld.csv diff --git a/intra/src/csv/Minimap_Redcave.csv b/AIR/intra/src/csv/Minimap_Redcave.csv similarity index 100% rename from intra/src/csv/Minimap_Redcave.csv rename to AIR/intra/src/csv/Minimap_Redcave.csv diff --git a/intra/src/csv/Minimap_Redsea.csv b/AIR/intra/src/csv/Minimap_Redsea.csv similarity index 100% rename from intra/src/csv/Minimap_Redsea.csv rename to AIR/intra/src/csv/Minimap_Redsea.csv diff --git a/intra/src/csv/Minimap_Space.csv b/AIR/intra/src/csv/Minimap_Space.csv similarity index 100% rename from intra/src/csv/Minimap_Space.csv rename to AIR/intra/src/csv/Minimap_Space.csv diff --git a/intra/src/csv/Minimap_Street.csv b/AIR/intra/src/csv/Minimap_Street.csv similarity index 100% rename from intra/src/csv/Minimap_Street.csv rename to AIR/intra/src/csv/Minimap_Street.csv diff --git a/intra/src/csv/Minimap_Suburb.csv b/AIR/intra/src/csv/Minimap_Suburb.csv similarity index 100% rename from intra/src/csv/Minimap_Suburb.csv rename to AIR/intra/src/csv/Minimap_Suburb.csv diff --git a/intra/src/csv/Minimap_Terminal.csv b/AIR/intra/src/csv/Minimap_Terminal.csv similarity index 100% rename from intra/src/csv/Minimap_Terminal.csv rename to AIR/intra/src/csv/Minimap_Terminal.csv diff --git a/intra/src/csv/NEXUS_BG.csv b/AIR/intra/src/csv/NEXUS_BG.csv similarity index 100% rename from intra/src/csv/NEXUS_BG.csv rename to AIR/intra/src/csv/NEXUS_BG.csv diff --git a/intra/src/csv/NEXUS_BG2.csv b/AIR/intra/src/csv/NEXUS_BG2.csv similarity index 100% rename from intra/src/csv/NEXUS_BG2.csv rename to AIR/intra/src/csv/NEXUS_BG2.csv diff --git a/intra/src/csv/NEXUS_FG.csv b/AIR/intra/src/csv/NEXUS_FG.csv similarity index 100% rename from intra/src/csv/NEXUS_FG.csv rename to AIR/intra/src/csv/NEXUS_FG.csv diff --git a/intra/src/csv/OVERWORLD_BG.csv b/AIR/intra/src/csv/OVERWORLD_BG.csv similarity index 100% rename from intra/src/csv/OVERWORLD_BG.csv rename to AIR/intra/src/csv/OVERWORLD_BG.csv diff --git a/intra/src/csv/OVERWORLD_BG2.csv b/AIR/intra/src/csv/OVERWORLD_BG2.csv similarity index 100% rename from intra/src/csv/OVERWORLD_BG2.csv rename to AIR/intra/src/csv/OVERWORLD_BG2.csv diff --git a/intra/src/csv/OVERWORLD_FG.csv b/AIR/intra/src/csv/OVERWORLD_FG.csv similarity index 100% rename from intra/src/csv/OVERWORLD_FG.csv rename to AIR/intra/src/csv/OVERWORLD_FG.csv diff --git a/intra/src/csv/REDCAVE_BG.csv b/AIR/intra/src/csv/REDCAVE_BG.csv similarity index 100% rename from intra/src/csv/REDCAVE_BG.csv rename to AIR/intra/src/csv/REDCAVE_BG.csv diff --git a/intra/src/csv/REDCAVE_BG2.csv b/AIR/intra/src/csv/REDCAVE_BG2.csv similarity index 100% rename from intra/src/csv/REDCAVE_BG2.csv rename to AIR/intra/src/csv/REDCAVE_BG2.csv diff --git a/intra/src/csv/REDCAVE_FG.csv b/AIR/intra/src/csv/REDCAVE_FG.csv similarity index 100% rename from intra/src/csv/REDCAVE_FG.csv rename to AIR/intra/src/csv/REDCAVE_FG.csv diff --git a/intra/src/csv/REDSEA_BG.csv b/AIR/intra/src/csv/REDSEA_BG.csv similarity index 100% rename from intra/src/csv/REDSEA_BG.csv rename to AIR/intra/src/csv/REDSEA_BG.csv diff --git a/intra/src/csv/REDSEA_BG2.csv b/AIR/intra/src/csv/REDSEA_BG2.csv similarity index 100% rename from intra/src/csv/REDSEA_BG2.csv rename to AIR/intra/src/csv/REDSEA_BG2.csv diff --git a/intra/src/csv/REDSEA_FG.csv b/AIR/intra/src/csv/REDSEA_FG.csv similarity index 100% rename from intra/src/csv/REDSEA_FG.csv rename to AIR/intra/src/csv/REDSEA_FG.csv diff --git a/intra/src/csv/SPACE_BG.csv b/AIR/intra/src/csv/SPACE_BG.csv similarity index 100% rename from intra/src/csv/SPACE_BG.csv rename to AIR/intra/src/csv/SPACE_BG.csv diff --git a/intra/src/csv/SPACE_BG2.csv b/AIR/intra/src/csv/SPACE_BG2.csv similarity index 100% rename from intra/src/csv/SPACE_BG2.csv rename to AIR/intra/src/csv/SPACE_BG2.csv diff --git a/intra/src/csv/SPACE_FG.csv b/AIR/intra/src/csv/SPACE_FG.csv similarity index 100% rename from intra/src/csv/SPACE_FG.csv rename to AIR/intra/src/csv/SPACE_FG.csv diff --git a/intra/src/csv/STREET_BG.csv b/AIR/intra/src/csv/STREET_BG.csv similarity index 100% rename from intra/src/csv/STREET_BG.csv rename to AIR/intra/src/csv/STREET_BG.csv diff --git a/intra/src/csv/STREET_BG2.csv b/AIR/intra/src/csv/STREET_BG2.csv similarity index 100% rename from intra/src/csv/STREET_BG2.csv rename to AIR/intra/src/csv/STREET_BG2.csv diff --git a/intra/src/csv/STREET_FG.csv b/AIR/intra/src/csv/STREET_FG.csv similarity index 100% rename from intra/src/csv/STREET_FG.csv rename to AIR/intra/src/csv/STREET_FG.csv diff --git a/intra/src/csv/SUBURB_BG.csv b/AIR/intra/src/csv/SUBURB_BG.csv similarity index 100% rename from intra/src/csv/SUBURB_BG.csv rename to AIR/intra/src/csv/SUBURB_BG.csv diff --git a/intra/src/csv/SUBURB_BG2.csv b/AIR/intra/src/csv/SUBURB_BG2.csv similarity index 100% rename from intra/src/csv/SUBURB_BG2.csv rename to AIR/intra/src/csv/SUBURB_BG2.csv diff --git a/intra/src/csv/SUBURB_FG.csv b/AIR/intra/src/csv/SUBURB_FG.csv similarity index 100% rename from intra/src/csv/SUBURB_FG.csv rename to AIR/intra/src/csv/SUBURB_FG.csv diff --git a/intra/src/csv/TERMINAL_BG.csv b/AIR/intra/src/csv/TERMINAL_BG.csv similarity index 100% rename from intra/src/csv/TERMINAL_BG.csv rename to AIR/intra/src/csv/TERMINAL_BG.csv diff --git a/intra/src/csv/TERMINAL_BG2.csv b/AIR/intra/src/csv/TERMINAL_BG2.csv similarity index 100% rename from intra/src/csv/TERMINAL_BG2.csv rename to AIR/intra/src/csv/TERMINAL_BG2.csv diff --git a/intra/src/csv/TERMINAL_FG.csv b/AIR/intra/src/csv/TERMINAL_FG.csv similarity index 100% rename from intra/src/csv/TERMINAL_FG.csv rename to AIR/intra/src/csv/TERMINAL_FG.csv diff --git a/intra/src/csv/TRAIN_BG.csv b/AIR/intra/src/csv/TRAIN_BG.csv similarity index 100% rename from intra/src/csv/TRAIN_BG.csv rename to AIR/intra/src/csv/TRAIN_BG.csv diff --git a/intra/src/csv/TRAIN_BG2.csv b/AIR/intra/src/csv/TRAIN_BG2.csv similarity index 100% rename from intra/src/csv/TRAIN_BG2.csv rename to AIR/intra/src/csv/TRAIN_BG2.csv diff --git a/intra/src/csv/TRAIN_FG.csv b/AIR/intra/src/csv/TRAIN_FG.csv similarity index 100% rename from intra/src/csv/TRAIN_FG.csv rename to AIR/intra/src/csv/TRAIN_FG.csv diff --git a/intra/src/csv/WINDMILL_BG.csv b/AIR/intra/src/csv/WINDMILL_BG.csv similarity index 100% rename from intra/src/csv/WINDMILL_BG.csv rename to AIR/intra/src/csv/WINDMILL_BG.csv diff --git a/intra/src/csv/WINDMILL_BG2.csv b/AIR/intra/src/csv/WINDMILL_BG2.csv similarity index 100% rename from intra/src/csv/WINDMILL_BG2.csv rename to AIR/intra/src/csv/WINDMILL_BG2.csv diff --git a/intra/src/csv/WINDMILL_FG.csv b/AIR/intra/src/csv/WINDMILL_FG.csv similarity index 100% rename from intra/src/csv/WINDMILL_FG.csv rename to AIR/intra/src/csv/WINDMILL_FG.csv diff --git a/intra/src/data/CLASS_ID.as b/AIR/intra/src/data/CLASS_ID.as similarity index 100% rename from intra/src/data/CLASS_ID.as rename to AIR/intra/src/data/CLASS_ID.as diff --git a/intra/src/data/CSV_Data.as b/AIR/intra/src/data/CSV_Data.as similarity index 100% rename from intra/src/data/CSV_Data.as rename to AIR/intra/src/data/CSV_Data.as diff --git a/intra/src/data/Common_Sprites.as b/AIR/intra/src/data/Common_Sprites.as similarity index 100% rename from intra/src/data/Common_Sprites.as rename to AIR/intra/src/data/Common_Sprites.as diff --git a/intra/src/data/NPC_Data_EN.as b/AIR/intra/src/data/NPC_Data_EN.as similarity index 100% rename from intra/src/data/NPC_Data_EN.as rename to AIR/intra/src/data/NPC_Data_EN.as diff --git a/intra/src/data/NPC_Data_ES.as b/AIR/intra/src/data/NPC_Data_ES.as similarity index 100% rename from intra/src/data/NPC_Data_ES.as rename to AIR/intra/src/data/NPC_Data_ES.as diff --git a/intra/src/data/NPC_Data_IT.as b/AIR/intra/src/data/NPC_Data_IT.as similarity index 100% rename from intra/src/data/NPC_Data_IT.as rename to AIR/intra/src/data/NPC_Data_IT.as diff --git a/intra/src/data/NPC_Data_JP.as b/AIR/intra/src/data/NPC_Data_JP.as similarity index 100% rename from intra/src/data/NPC_Data_JP.as rename to AIR/intra/src/data/NPC_Data_JP.as diff --git a/intra/src/data/NPC_Data_KR.as b/AIR/intra/src/data/NPC_Data_KR.as similarity index 100% rename from intra/src/data/NPC_Data_KR.as rename to AIR/intra/src/data/NPC_Data_KR.as diff --git a/intra/src/data/NPC_Data_PT.as b/AIR/intra/src/data/NPC_Data_PT.as similarity index 100% rename from intra/src/data/NPC_Data_PT.as rename to AIR/intra/src/data/NPC_Data_PT.as diff --git a/intra/src/data/NPC_Data_ZHS.as b/AIR/intra/src/data/NPC_Data_ZHS.as similarity index 100% rename from intra/src/data/NPC_Data_ZHS.as rename to AIR/intra/src/data/NPC_Data_ZHS.as diff --git a/intra/src/data/SoundData.as b/AIR/intra/src/data/SoundData.as similarity index 100% rename from intra/src/data/SoundData.as rename to AIR/intra/src/data/SoundData.as diff --git a/intra/src/data/TileData.as b/AIR/intra/src/data/TileData.as similarity index 100% rename from intra/src/data/TileData.as rename to AIR/intra/src/data/TileData.as diff --git a/intra/src/data/dialogue_EN.txt b/AIR/intra/src/data/dialogue_EN.txt similarity index 100% rename from intra/src/data/dialogue_EN.txt rename to AIR/intra/src/data/dialogue_EN.txt diff --git a/intra/src/data/dialogue_ES.txt b/AIR/intra/src/data/dialogue_ES.txt similarity index 100% rename from intra/src/data/dialogue_ES.txt rename to AIR/intra/src/data/dialogue_ES.txt diff --git a/intra/src/data/dialogue_IT.txt b/AIR/intra/src/data/dialogue_IT.txt similarity index 100% rename from intra/src/data/dialogue_IT.txt rename to AIR/intra/src/data/dialogue_IT.txt diff --git a/intra/src/data/dialogue_ZHS.txt b/AIR/intra/src/data/dialogue_ZHS.txt similarity index 100% rename from intra/src/data/dialogue_ZHS.txt rename to AIR/intra/src/data/dialogue_ZHS.txt diff --git a/intra/src/data/dialogue_jp.txt b/AIR/intra/src/data/dialogue_jp.txt similarity index 100% rename from intra/src/data/dialogue_jp.txt rename to AIR/intra/src/data/dialogue_jp.txt diff --git a/intra/src/data/dialogue_pt-br.txt b/AIR/intra/src/data/dialogue_pt-br.txt similarity index 100% rename from intra/src/data/dialogue_pt-br.txt rename to AIR/intra/src/data/dialogue_pt-br.txt diff --git a/intra/src/data/gen_npc.py b/AIR/intra/src/data/gen_npc.py similarity index 100% rename from intra/src/data/gen_npc.py rename to AIR/intra/src/data/gen_npc.py diff --git a/intra/src/data/kr/dialogue_kr.py b/AIR/intra/src/data/kr/dialogue_kr.py similarity index 100% rename from intra/src/data/kr/dialogue_kr.py rename to AIR/intra/src/data/kr/dialogue_kr.py diff --git a/intra/src/data/kr/make_kr_npc_data.bat b/AIR/intra/src/data/kr/make_kr_npc_data.bat similarity index 100% rename from intra/src/data/kr/make_kr_npc_data.bat rename to AIR/intra/src/data/kr/make_kr_npc_data.bat diff --git a/intra/src/data/make_npc_data.bat b/AIR/intra/src/data/make_npc_data.bat similarity index 100% rename from intra/src/data/make_npc_data.bat rename to AIR/intra/src/data/make_npc_data.bat diff --git a/intra/src/entity/decoration/Eye_Light.as b/AIR/intra/src/entity/decoration/Eye_Light.as similarity index 100% rename from intra/src/entity/decoration/Eye_Light.as rename to AIR/intra/src/entity/decoration/Eye_Light.as diff --git a/intra/src/entity/decoration/Light.as b/AIR/intra/src/entity/decoration/Light.as similarity index 100% rename from intra/src/entity/decoration/Light.as rename to AIR/intra/src/entity/decoration/Light.as diff --git a/intra/src/entity/decoration/Map_Preview.as b/AIR/intra/src/entity/decoration/Map_Preview.as similarity index 100% rename from intra/src/entity/decoration/Map_Preview.as rename to AIR/intra/src/entity/decoration/Map_Preview.as diff --git a/intra/src/entity/decoration/Nonsolid.as b/AIR/intra/src/entity/decoration/Nonsolid.as similarity index 100% rename from intra/src/entity/decoration/Nonsolid.as rename to AIR/intra/src/entity/decoration/Nonsolid.as diff --git a/intra/src/entity/decoration/RetroEffect.as b/AIR/intra/src/entity/decoration/RetroEffect.as similarity index 100% rename from intra/src/entity/decoration/RetroEffect.as rename to AIR/intra/src/entity/decoration/RetroEffect.as diff --git a/intra/src/entity/decoration/Solid_Sprite.as b/AIR/intra/src/entity/decoration/Solid_Sprite.as similarity index 100% rename from intra/src/entity/decoration/Solid_Sprite.as rename to AIR/intra/src/entity/decoration/Solid_Sprite.as diff --git a/intra/src/entity/decoration/Water_Anim.as b/AIR/intra/src/entity/decoration/Water_Anim.as similarity index 100% rename from intra/src/entity/decoration/Water_Anim.as rename to AIR/intra/src/entity/decoration/Water_Anim.as diff --git a/intra/src/entity/enemy/apartment/Dash_Trap.as b/AIR/intra/src/entity/enemy/apartment/Dash_Trap.as similarity index 100% rename from intra/src/entity/enemy/apartment/Dash_Trap.as rename to AIR/intra/src/entity/enemy/apartment/Dash_Trap.as diff --git a/intra/src/entity/enemy/apartment/Gasguy.as b/AIR/intra/src/entity/enemy/apartment/Gasguy.as similarity index 100% rename from intra/src/entity/enemy/apartment/Gasguy.as rename to AIR/intra/src/entity/enemy/apartment/Gasguy.as diff --git a/intra/src/entity/enemy/apartment/Rat.as b/AIR/intra/src/entity/enemy/apartment/Rat.as similarity index 100% rename from intra/src/entity/enemy/apartment/Rat.as rename to AIR/intra/src/entity/enemy/apartment/Rat.as diff --git a/intra/src/entity/enemy/apartment/Silverfish.as b/AIR/intra/src/entity/enemy/apartment/Silverfish.as similarity index 100% rename from intra/src/entity/enemy/apartment/Silverfish.as rename to AIR/intra/src/entity/enemy/apartment/Silverfish.as diff --git a/intra/src/entity/enemy/apartment/Splitboss.as b/AIR/intra/src/entity/enemy/apartment/Splitboss.as similarity index 100% rename from intra/src/entity/enemy/apartment/Splitboss.as rename to AIR/intra/src/entity/enemy/apartment/Splitboss.as diff --git a/intra/src/entity/enemy/apartment/Teleguy.as b/AIR/intra/src/entity/enemy/apartment/Teleguy.as similarity index 100% rename from intra/src/entity/enemy/apartment/Teleguy.as rename to AIR/intra/src/entity/enemy/apartment/Teleguy.as diff --git a/intra/src/entity/enemy/bedroom/Annoyer.as b/AIR/intra/src/entity/enemy/bedroom/Annoyer.as similarity index 100% rename from intra/src/entity/enemy/bedroom/Annoyer.as rename to AIR/intra/src/entity/enemy/bedroom/Annoyer.as diff --git a/intra/src/entity/enemy/bedroom/Pew_Laser.as b/AIR/intra/src/entity/enemy/bedroom/Pew_Laser.as similarity index 100% rename from intra/src/entity/enemy/bedroom/Pew_Laser.as rename to AIR/intra/src/entity/enemy/bedroom/Pew_Laser.as diff --git a/intra/src/entity/enemy/bedroom/Shieldy.as b/AIR/intra/src/entity/enemy/bedroom/Shieldy.as similarity index 100% rename from intra/src/entity/enemy/bedroom/Shieldy.as rename to AIR/intra/src/entity/enemy/bedroom/Shieldy.as diff --git a/intra/src/entity/enemy/bedroom/Slime.as b/AIR/intra/src/entity/enemy/bedroom/Slime.as similarity index 100% rename from intra/src/entity/enemy/bedroom/Slime.as rename to AIR/intra/src/entity/enemy/bedroom/Slime.as diff --git a/intra/src/entity/enemy/bedroom/Sun_Guy.as b/AIR/intra/src/entity/enemy/bedroom/Sun_Guy.as similarity index 100% rename from intra/src/entity/enemy/bedroom/Sun_Guy.as rename to AIR/intra/src/entity/enemy/bedroom/Sun_Guy.as diff --git a/intra/src/entity/enemy/circus/Circus_Folks.as b/AIR/intra/src/entity/enemy/circus/Circus_Folks.as similarity index 100% rename from intra/src/entity/enemy/circus/Circus_Folks.as rename to AIR/intra/src/entity/enemy/circus/Circus_Folks.as diff --git a/intra/src/entity/enemy/circus/Contort.as b/AIR/intra/src/entity/enemy/circus/Contort.as similarity index 100% rename from intra/src/entity/enemy/circus/Contort.as rename to AIR/intra/src/entity/enemy/circus/Contort.as diff --git a/intra/src/entity/enemy/circus/Fire_Pillar.as b/AIR/intra/src/entity/enemy/circus/Fire_Pillar.as similarity index 100% rename from intra/src/entity/enemy/circus/Fire_Pillar.as rename to AIR/intra/src/entity/enemy/circus/Fire_Pillar.as diff --git a/intra/src/entity/enemy/circus/Lion.as b/AIR/intra/src/entity/enemy/circus/Lion.as similarity index 100% rename from intra/src/entity/enemy/circus/Lion.as rename to AIR/intra/src/entity/enemy/circus/Lion.as diff --git a/intra/src/entity/enemy/crowd/Dog.as b/AIR/intra/src/entity/enemy/crowd/Dog.as similarity index 100% rename from intra/src/entity/enemy/crowd/Dog.as rename to AIR/intra/src/entity/enemy/crowd/Dog.as diff --git a/intra/src/entity/enemy/crowd/Frog.as b/AIR/intra/src/entity/enemy/crowd/Frog.as similarity index 100% rename from intra/src/entity/enemy/crowd/Frog.as rename to AIR/intra/src/entity/enemy/crowd/Frog.as diff --git a/intra/src/entity/enemy/crowd/Person.as b/AIR/intra/src/entity/enemy/crowd/Person.as similarity index 100% rename from intra/src/entity/enemy/crowd/Person.as rename to AIR/intra/src/entity/enemy/crowd/Person.as diff --git a/intra/src/entity/enemy/crowd/Rotator.as b/AIR/intra/src/entity/enemy/crowd/Rotator.as similarity index 100% rename from intra/src/entity/enemy/crowd/Rotator.as rename to AIR/intra/src/entity/enemy/crowd/Rotator.as diff --git a/intra/src/entity/enemy/crowd/Spike_Roller.as b/AIR/intra/src/entity/enemy/crowd/Spike_Roller.as similarity index 100% rename from intra/src/entity/enemy/crowd/Spike_Roller.as rename to AIR/intra/src/entity/enemy/crowd/Spike_Roller.as diff --git a/intra/src/entity/enemy/crowd/WallBoss.as b/AIR/intra/src/entity/enemy/crowd/WallBoss.as similarity index 100% rename from intra/src/entity/enemy/crowd/WallBoss.as rename to AIR/intra/src/entity/enemy/crowd/WallBoss.as diff --git a/intra/src/entity/enemy/etc/Briar_Boss.as b/AIR/intra/src/entity/enemy/etc/Briar_Boss.as similarity index 100% rename from intra/src/entity/enemy/etc/Briar_Boss.as rename to AIR/intra/src/entity/enemy/etc/Briar_Boss.as diff --git a/intra/src/entity/enemy/etc/Chaser.as b/AIR/intra/src/entity/enemy/etc/Chaser.as similarity index 100% rename from intra/src/entity/enemy/etc/Chaser.as rename to AIR/intra/src/entity/enemy/etc/Chaser.as diff --git a/intra/src/entity/enemy/etc/ControlsDeity.as b/AIR/intra/src/entity/enemy/etc/ControlsDeity.as similarity index 100% rename from intra/src/entity/enemy/etc/ControlsDeity.as rename to AIR/intra/src/entity/enemy/etc/ControlsDeity.as diff --git a/intra/src/entity/enemy/etc/Follower_Bro.as b/AIR/intra/src/entity/enemy/etc/Follower_Bro.as similarity index 100% rename from intra/src/entity/enemy/etc/Follower_Bro.as rename to AIR/intra/src/entity/enemy/etc/Follower_Bro.as diff --git a/intra/src/entity/enemy/etc/Red_Walker.as b/AIR/intra/src/entity/enemy/etc/Red_Walker.as similarity index 100% rename from intra/src/entity/enemy/etc/Red_Walker.as rename to AIR/intra/src/entity/enemy/etc/Red_Walker.as diff --git a/intra/src/entity/enemy/etc/Sadbro.as b/AIR/intra/src/entity/enemy/etc/Sadbro.as similarity index 100% rename from intra/src/entity/enemy/etc/Sadbro.as rename to AIR/intra/src/entity/enemy/etc/Sadbro.as diff --git a/intra/src/entity/enemy/etc/Sage_Boss.as b/AIR/intra/src/entity/enemy/etc/Sage_Boss.as similarity index 100% rename from intra/src/entity/enemy/etc/Sage_Boss.as rename to AIR/intra/src/entity/enemy/etc/Sage_Boss.as diff --git a/intra/src/entity/enemy/etc/Space_Face.as b/AIR/intra/src/entity/enemy/etc/Space_Face.as similarity index 100% rename from intra/src/entity/enemy/etc/Space_Face.as rename to AIR/intra/src/entity/enemy/etc/Space_Face.as diff --git a/intra/src/entity/enemy/etc/Wall_Laser.as b/AIR/intra/src/entity/enemy/etc/Wall_Laser.as similarity index 100% rename from intra/src/entity/enemy/etc/Wall_Laser.as rename to AIR/intra/src/entity/enemy/etc/Wall_Laser.as diff --git a/intra/src/entity/enemy/hotel/Burst_Plant.as b/AIR/intra/src/entity/enemy/hotel/Burst_Plant.as similarity index 100% rename from intra/src/entity/enemy/hotel/Burst_Plant.as rename to AIR/intra/src/entity/enemy/hotel/Burst_Plant.as diff --git a/intra/src/entity/enemy/hotel/Dustmaid.as b/AIR/intra/src/entity/enemy/hotel/Dustmaid.as similarity index 100% rename from intra/src/entity/enemy/hotel/Dustmaid.as rename to AIR/intra/src/entity/enemy/hotel/Dustmaid.as diff --git a/intra/src/entity/enemy/hotel/Eye_Boss.as b/AIR/intra/src/entity/enemy/hotel/Eye_Boss.as similarity index 100% rename from intra/src/entity/enemy/hotel/Eye_Boss.as rename to AIR/intra/src/entity/enemy/hotel/Eye_Boss.as diff --git a/intra/src/entity/enemy/hotel/Steam_Pipe.as b/AIR/intra/src/entity/enemy/hotel/Steam_Pipe.as similarity index 100% rename from intra/src/entity/enemy/hotel/Steam_Pipe.as rename to AIR/intra/src/entity/enemy/hotel/Steam_Pipe.as diff --git a/intra/src/entity/enemy/redcave/Four_Shooter.as b/AIR/intra/src/entity/enemy/redcave/Four_Shooter.as similarity index 100% rename from intra/src/entity/enemy/redcave/Four_Shooter.as rename to AIR/intra/src/entity/enemy/redcave/Four_Shooter.as diff --git a/intra/src/entity/enemy/redcave/Mover.as b/AIR/intra/src/entity/enemy/redcave/Mover.as similarity index 100% rename from intra/src/entity/enemy/redcave/Mover.as rename to AIR/intra/src/entity/enemy/redcave/Mover.as diff --git a/intra/src/entity/enemy/redcave/On_Off_Laser.as b/AIR/intra/src/entity/enemy/redcave/On_Off_Laser.as similarity index 100% rename from intra/src/entity/enemy/redcave/On_Off_Laser.as rename to AIR/intra/src/entity/enemy/redcave/On_Off_Laser.as diff --git a/intra/src/entity/enemy/redcave/Red_Boss.as b/AIR/intra/src/entity/enemy/redcave/Red_Boss.as similarity index 100% rename from intra/src/entity/enemy/redcave/Red_Boss.as rename to AIR/intra/src/entity/enemy/redcave/Red_Boss.as diff --git a/intra/src/entity/enemy/redcave/Slasher.as b/AIR/intra/src/entity/enemy/redcave/Slasher.as similarity index 100% rename from intra/src/entity/enemy/redcave/Slasher.as rename to AIR/intra/src/entity/enemy/redcave/Slasher.as diff --git a/intra/src/entity/enemy/suburb/Suburb_Killer.as b/AIR/intra/src/entity/enemy/suburb/Suburb_Killer.as similarity index 100% rename from intra/src/entity/enemy/suburb/Suburb_Killer.as rename to AIR/intra/src/entity/enemy/suburb/Suburb_Killer.as diff --git a/intra/src/entity/enemy/suburb/Suburb_Walker.as b/AIR/intra/src/entity/enemy/suburb/Suburb_Walker.as similarity index 100% rename from intra/src/entity/enemy/suburb/Suburb_Walker.as rename to AIR/intra/src/entity/enemy/suburb/Suburb_Walker.as diff --git a/intra/src/entity/gadget/Big_Door.as b/AIR/intra/src/entity/gadget/Big_Door.as similarity index 100% rename from intra/src/entity/gadget/Big_Door.as rename to AIR/intra/src/entity/gadget/Big_Door.as diff --git a/intra/src/entity/gadget/Button.as b/AIR/intra/src/entity/gadget/Button.as similarity index 100% rename from intra/src/entity/gadget/Button.as rename to AIR/intra/src/entity/gadget/Button.as diff --git a/intra/src/entity/gadget/Challenge_Gate.as b/AIR/intra/src/entity/gadget/Challenge_Gate.as similarity index 100% rename from intra/src/entity/gadget/Challenge_Gate.as rename to AIR/intra/src/entity/gadget/Challenge_Gate.as diff --git a/intra/src/entity/gadget/Checkpoint.as b/AIR/intra/src/entity/gadget/Checkpoint.as similarity index 100% rename from intra/src/entity/gadget/Checkpoint.as rename to AIR/intra/src/entity/gadget/Checkpoint.as diff --git a/intra/src/entity/gadget/Console.as b/AIR/intra/src/entity/gadget/Console.as similarity index 100% rename from intra/src/entity/gadget/Console.as rename to AIR/intra/src/entity/gadget/Console.as diff --git a/intra/src/entity/gadget/CrackedTile.as b/AIR/intra/src/entity/gadget/CrackedTile.as similarity index 100% rename from intra/src/entity/gadget/CrackedTile.as rename to AIR/intra/src/entity/gadget/CrackedTile.as diff --git a/intra/src/entity/gadget/Dash_Pad.as b/AIR/intra/src/entity/gadget/Dash_Pad.as similarity index 100% rename from intra/src/entity/gadget/Dash_Pad.as rename to AIR/intra/src/entity/gadget/Dash_Pad.as diff --git a/intra/src/entity/gadget/Door.as b/AIR/intra/src/entity/gadget/Door.as similarity index 100% rename from intra/src/entity/gadget/Door.as rename to AIR/intra/src/entity/gadget/Door.as diff --git a/intra/src/entity/gadget/Dust.as b/AIR/intra/src/entity/gadget/Dust.as similarity index 100% rename from intra/src/entity/gadget/Dust.as rename to AIR/intra/src/entity/gadget/Dust.as diff --git a/intra/src/entity/gadget/Gate.as b/AIR/intra/src/entity/gadget/Gate.as similarity index 100% rename from intra/src/entity/gadget/Gate.as rename to AIR/intra/src/entity/gadget/Gate.as diff --git a/intra/src/entity/gadget/Go_Detector.as b/AIR/intra/src/entity/gadget/Go_Detector.as similarity index 100% rename from intra/src/entity/gadget/Go_Detector.as rename to AIR/intra/src/entity/gadget/Go_Detector.as diff --git a/intra/src/entity/gadget/Growth_Gate.as b/AIR/intra/src/entity/gadget/Growth_Gate.as similarity index 100% rename from intra/src/entity/gadget/Growth_Gate.as rename to AIR/intra/src/entity/gadget/Growth_Gate.as diff --git a/intra/src/entity/gadget/Hole.as b/AIR/intra/src/entity/gadget/Hole.as similarity index 100% rename from intra/src/entity/gadget/Hole.as rename to AIR/intra/src/entity/gadget/Hole.as diff --git a/intra/src/entity/gadget/Jump_Trigger.as b/AIR/intra/src/entity/gadget/Jump_Trigger.as similarity index 100% rename from intra/src/entity/gadget/Jump_Trigger.as rename to AIR/intra/src/entity/gadget/Jump_Trigger.as diff --git a/intra/src/entity/gadget/Key.as b/AIR/intra/src/entity/gadget/Key.as similarity index 100% rename from intra/src/entity/gadget/Key.as rename to AIR/intra/src/entity/gadget/Key.as diff --git a/intra/src/entity/gadget/KeyBlock.as b/AIR/intra/src/entity/gadget/KeyBlock.as similarity index 100% rename from intra/src/entity/gadget/KeyBlock.as rename to AIR/intra/src/entity/gadget/KeyBlock.as diff --git a/intra/src/entity/gadget/Pillar_Switch.as b/AIR/intra/src/entity/gadget/Pillar_Switch.as similarity index 100% rename from intra/src/entity/gadget/Pillar_Switch.as rename to AIR/intra/src/entity/gadget/Pillar_Switch.as diff --git a/intra/src/entity/gadget/Propelled.as b/AIR/intra/src/entity/gadget/Propelled.as similarity index 100% rename from intra/src/entity/gadget/Propelled.as rename to AIR/intra/src/entity/gadget/Propelled.as diff --git a/intra/src/entity/gadget/SinglePushBlock.as b/AIR/intra/src/entity/gadget/SinglePushBlock.as similarity index 100% rename from intra/src/entity/gadget/SinglePushBlock.as rename to AIR/intra/src/entity/gadget/SinglePushBlock.as diff --git a/intra/src/entity/gadget/Stop_Marker.as b/AIR/intra/src/entity/gadget/Stop_Marker.as similarity index 100% rename from intra/src/entity/gadget/Stop_Marker.as rename to AIR/intra/src/entity/gadget/Stop_Marker.as diff --git a/intra/src/entity/gadget/Switch_Pillar.as b/AIR/intra/src/entity/gadget/Switch_Pillar.as similarity index 100% rename from intra/src/entity/gadget/Switch_Pillar.as rename to AIR/intra/src/entity/gadget/Switch_Pillar.as diff --git a/intra/src/entity/gadget/Treasure.as b/AIR/intra/src/entity/gadget/Treasure.as similarity index 100% rename from intra/src/entity/gadget/Treasure.as rename to AIR/intra/src/entity/gadget/Treasure.as diff --git a/intra/src/entity/interactive/Black_Thing.as b/AIR/intra/src/entity/interactive/Black_Thing.as similarity index 100% rename from intra/src/entity/interactive/Black_Thing.as rename to AIR/intra/src/entity/interactive/Black_Thing.as diff --git a/intra/src/entity/interactive/Dungeon_Statue.as b/AIR/intra/src/entity/interactive/Dungeon_Statue.as similarity index 100% rename from intra/src/entity/interactive/Dungeon_Statue.as rename to AIR/intra/src/entity/interactive/Dungeon_Statue.as diff --git a/intra/src/entity/interactive/Elevator.as b/AIR/intra/src/entity/interactive/Elevator.as similarity index 100% rename from intra/src/entity/interactive/Elevator.as rename to AIR/intra/src/entity/interactive/Elevator.as diff --git a/intra/src/entity/interactive/Fisherman.as b/AIR/intra/src/entity/interactive/Fisherman.as similarity index 100% rename from intra/src/entity/interactive/Fisherman.as rename to AIR/intra/src/entity/interactive/Fisherman.as diff --git a/intra/src/entity/interactive/Health_Cicada.as b/AIR/intra/src/entity/interactive/Health_Cicada.as similarity index 100% rename from intra/src/entity/interactive/Health_Cicada.as rename to AIR/intra/src/entity/interactive/Health_Cicada.as diff --git a/intra/src/entity/interactive/NPC.as b/AIR/intra/src/entity/interactive/NPC.as similarity index 100% rename from intra/src/entity/interactive/NPC.as rename to AIR/intra/src/entity/interactive/NPC.as diff --git a/intra/src/entity/interactive/Red_Pillar.as b/AIR/intra/src/entity/interactive/Red_Pillar.as similarity index 100% rename from intra/src/entity/interactive/Red_Pillar.as rename to AIR/intra/src/entity/interactive/Red_Pillar.as diff --git a/intra/src/entity/interactive/Terminal_Gate.as b/AIR/intra/src/entity/interactive/Terminal_Gate.as similarity index 100% rename from intra/src/entity/interactive/Terminal_Gate.as rename to AIR/intra/src/entity/interactive/Terminal_Gate.as diff --git a/intra/src/entity/interactive/npc/Forest_NPC.as b/AIR/intra/src/entity/interactive/npc/Forest_NPC.as similarity index 100% rename from intra/src/entity/interactive/npc/Forest_NPC.as rename to AIR/intra/src/entity/interactive/npc/Forest_NPC.as diff --git a/intra/src/entity/interactive/npc/Happy_NPC.as b/AIR/intra/src/entity/interactive/npc/Happy_NPC.as similarity index 100% rename from intra/src/entity/interactive/npc/Happy_NPC.as rename to AIR/intra/src/entity/interactive/npc/Happy_NPC.as diff --git a/intra/src/entity/interactive/npc/Huge_Fucking_Stag.as b/AIR/intra/src/entity/interactive/npc/Huge_Fucking_Stag.as similarity index 100% rename from intra/src/entity/interactive/npc/Huge_Fucking_Stag.as rename to AIR/intra/src/entity/interactive/npc/Huge_Fucking_Stag.as diff --git a/intra/src/entity/interactive/npc/Mitra.as b/AIR/intra/src/entity/interactive/npc/Mitra.as similarity index 100% rename from intra/src/entity/interactive/npc/Mitra.as rename to AIR/intra/src/entity/interactive/npc/Mitra.as diff --git a/intra/src/entity/interactive/npc/Redsea_NPC.as b/AIR/intra/src/entity/interactive/npc/Redsea_NPC.as similarity index 100% rename from intra/src/entity/interactive/npc/Redsea_NPC.as rename to AIR/intra/src/entity/interactive/npc/Redsea_NPC.as diff --git a/intra/src/entity/interactive/npc/Sage.as b/AIR/intra/src/entity/interactive/npc/Sage.as similarity index 100% rename from intra/src/entity/interactive/npc/Sage.as rename to AIR/intra/src/entity/interactive/npc/Sage.as diff --git a/intra/src/entity/interactive/npc/Shadow_Briar.as b/AIR/intra/src/entity/interactive/npc/Shadow_Briar.as similarity index 100% rename from intra/src/entity/interactive/npc/Shadow_Briar.as rename to AIR/intra/src/entity/interactive/npc/Shadow_Briar.as diff --git a/intra/src/entity/interactive/npc/Space_NPC.as b/AIR/intra/src/entity/interactive/npc/Space_NPC.as similarity index 100% rename from intra/src/entity/interactive/npc/Space_NPC.as rename to AIR/intra/src/entity/interactive/npc/Space_NPC.as diff --git a/intra/src/entity/interactive/npc/Trade_NPC.as b/AIR/intra/src/entity/interactive/npc/Trade_NPC.as similarity index 100% rename from intra/src/entity/interactive/npc/Trade_NPC.as rename to AIR/intra/src/entity/interactive/npc/Trade_NPC.as diff --git a/intra/src/entity/player/Broom.as b/AIR/intra/src/entity/player/Broom.as similarity index 100% rename from intra/src/entity/player/Broom.as rename to AIR/intra/src/entity/player/Broom.as diff --git a/intra/src/entity/player/Foot_Overlay.as b/AIR/intra/src/entity/player/Foot_Overlay.as similarity index 100% rename from intra/src/entity/player/Foot_Overlay.as rename to AIR/intra/src/entity/player/Foot_Overlay.as diff --git a/intra/src/entity/player/HealthBar.as b/AIR/intra/src/entity/player/HealthBar.as similarity index 100% rename from intra/src/entity/player/HealthBar.as rename to AIR/intra/src/entity/player/HealthBar.as diff --git a/intra/src/entity/player/HealthPickup.as b/AIR/intra/src/entity/player/HealthPickup.as similarity index 100% rename from intra/src/entity/player/HealthPickup.as rename to AIR/intra/src/entity/player/HealthPickup.as diff --git a/intra/src/entity/player/Miniminimap.as b/AIR/intra/src/entity/player/Miniminimap.as similarity index 100% rename from intra/src/entity/player/Miniminimap.as rename to AIR/intra/src/entity/player/Miniminimap.as diff --git a/intra/src/entity/player/Player.as b/AIR/intra/src/entity/player/Player.as similarity index 100% rename from intra/src/entity/player/Player.as rename to AIR/intra/src/entity/player/Player.as diff --git a/intra/src/entity/player/Transformer.as b/AIR/intra/src/entity/player/Transformer.as similarity index 100% rename from intra/src/entity/player/Transformer.as rename to AIR/intra/src/entity/player/Transformer.as diff --git a/intra/src/extension/JoyQuery/Joystick.as b/AIR/intra/src/extension/JoyQuery/Joystick.as similarity index 100% rename from intra/src/extension/JoyQuery/Joystick.as rename to AIR/intra/src/extension/JoyQuery/Joystick.as diff --git a/intra/src/global/Keys.as b/AIR/intra/src/global/Keys.as similarity index 100% rename from intra/src/global/Keys.as rename to AIR/intra/src/global/Keys.as diff --git a/intra/src/global/Registry.as b/AIR/intra/src/global/Registry.as similarity index 100% rename from intra/src/global/Registry.as rename to AIR/intra/src/global/Registry.as diff --git a/intra/src/helper/ANEFix.as b/AIR/intra/src/helper/ANEFix.as similarity index 100% rename from intra/src/helper/ANEFix.as rename to AIR/intra/src/helper/ANEFix.as diff --git a/intra/src/helper/Achievements.as b/AIR/intra/src/helper/Achievements.as similarity index 100% rename from intra/src/helper/Achievements.as rename to AIR/intra/src/helper/Achievements.as diff --git a/intra/src/helper/Cutscene.as b/AIR/intra/src/helper/Cutscene.as similarity index 100% rename from intra/src/helper/Cutscene.as rename to AIR/intra/src/helper/Cutscene.as diff --git a/intra/src/helper/DH.as b/AIR/intra/src/helper/DH.as similarity index 100% rename from intra/src/helper/DH.as rename to AIR/intra/src/helper/DH.as diff --git a/intra/src/helper/EventScripts.as b/AIR/intra/src/helper/EventScripts.as similarity index 100% rename from intra/src/helper/EventScripts.as rename to AIR/intra/src/helper/EventScripts.as diff --git a/intra/src/helper/Joypad_Config_Group.as b/AIR/intra/src/helper/Joypad_Config_Group.as similarity index 100% rename from intra/src/helper/Joypad_Config_Group.as rename to AIR/intra/src/helper/Joypad_Config_Group.as diff --git a/intra/src/helper/Parabola_Thing.as b/AIR/intra/src/helper/Parabola_Thing.as similarity index 100% rename from intra/src/helper/Parabola_Thing.as rename to AIR/intra/src/helper/Parabola_Thing.as diff --git a/intra/src/helper/S_NPC.as b/AIR/intra/src/helper/S_NPC.as similarity index 100% rename from intra/src/helper/S_NPC.as rename to AIR/intra/src/helper/S_NPC.as diff --git a/intra/src/helper/ScreenFade.as b/AIR/intra/src/helper/ScreenFade.as similarity index 100% rename from intra/src/helper/ScreenFade.as rename to AIR/intra/src/helper/ScreenFade.as diff --git a/intra/src/helper/SpriteFactory.as b/AIR/intra/src/helper/SpriteFactory.as similarity index 100% rename from intra/src/helper/SpriteFactory.as rename to AIR/intra/src/helper/SpriteFactory.as diff --git a/intra/src/helper/SteamThing.as b/AIR/intra/src/helper/SteamThing.as similarity index 100% rename from intra/src/helper/SteamThing.as rename to AIR/intra/src/helper/SteamThing.as diff --git a/intra/src/helper/UI_Offsets.as b/AIR/intra/src/helper/UI_Offsets.as similarity index 100% rename from intra/src/helper/UI_Offsets.as rename to AIR/intra/src/helper/UI_Offsets.as diff --git a/intra/src/helper/invertRGB.pbj b/AIR/intra/src/helper/invertRGB.pbj similarity index 100% rename from intra/src/helper/invertRGB.pbj rename to AIR/intra/src/helper/invertRGB.pbj diff --git a/intra/src/helper/static.pbj b/AIR/intra/src/helper/static.pbj similarity index 100% rename from intra/src/helper/static.pbj rename to AIR/intra/src/helper/static.pbj diff --git a/intra/src/lua/Intra.lua b/AIR/intra/src/lua/Intra.lua similarity index 100% rename from intra/src/lua/Intra.lua rename to AIR/intra/src/lua/Intra.lua diff --git a/intra/src/lua/Intra_settings.lua b/AIR/intra/src/lua/Intra_settings.lua similarity index 100% rename from intra/src/lua/Intra_settings.lua rename to AIR/intra/src/lua/Intra_settings.lua diff --git a/intra/src/lua/csvTilemap.lua b/AIR/intra/src/lua/csvTilemap.lua similarity index 100% rename from intra/src/lua/csvTilemap.lua rename to AIR/intra/src/lua/csvTilemap.lua diff --git a/intra/src/lua/csvTilemap_settings.lua b/AIR/intra/src/lua/csvTilemap_settings.lua similarity index 100% rename from intra/src/lua/csvTilemap_settings.lua rename to AIR/intra/src/lua/csvTilemap_settings.lua diff --git a/intra/src/noairSave.as b/AIR/intra/src/noairSave.as similarity index 100% rename from intra/src/noairSave.as rename to AIR/intra/src/noairSave.as diff --git a/intra/src/org/flixel/AnoSprite.as b/AIR/intra/src/org/flixel/AnoSprite.as similarity index 100% rename from intra/src/org/flixel/AnoSprite.as rename to AIR/intra/src/org/flixel/AnoSprite.as diff --git a/intra/src/org/flixel/FlxBasic.as b/AIR/intra/src/org/flixel/FlxBasic.as similarity index 100% rename from intra/src/org/flixel/FlxBasic.as rename to AIR/intra/src/org/flixel/FlxBasic.as diff --git a/intra/src/org/flixel/FlxButton.as b/AIR/intra/src/org/flixel/FlxButton.as similarity index 100% rename from intra/src/org/flixel/FlxButton.as rename to AIR/intra/src/org/flixel/FlxButton.as diff --git a/intra/src/org/flixel/FlxCamera.as b/AIR/intra/src/org/flixel/FlxCamera.as similarity index 100% rename from intra/src/org/flixel/FlxCamera.as rename to AIR/intra/src/org/flixel/FlxCamera.as diff --git a/intra/src/org/flixel/FlxEmitter.as b/AIR/intra/src/org/flixel/FlxEmitter.as similarity index 100% rename from intra/src/org/flixel/FlxEmitter.as rename to AIR/intra/src/org/flixel/FlxEmitter.as diff --git a/intra/src/org/flixel/FlxG.as b/AIR/intra/src/org/flixel/FlxG.as similarity index 100% rename from intra/src/org/flixel/FlxG.as rename to AIR/intra/src/org/flixel/FlxG.as diff --git a/intra/src/org/flixel/FlxGame.as b/AIR/intra/src/org/flixel/FlxGame.as similarity index 100% rename from intra/src/org/flixel/FlxGame.as rename to AIR/intra/src/org/flixel/FlxGame.as diff --git a/intra/src/org/flixel/FlxGroup.as b/AIR/intra/src/org/flixel/FlxGroup.as similarity index 100% rename from intra/src/org/flixel/FlxGroup.as rename to AIR/intra/src/org/flixel/FlxGroup.as diff --git a/intra/src/org/flixel/FlxObject.as b/AIR/intra/src/org/flixel/FlxObject.as similarity index 100% rename from intra/src/org/flixel/FlxObject.as rename to AIR/intra/src/org/flixel/FlxObject.as diff --git a/intra/src/org/flixel/FlxParticle.as b/AIR/intra/src/org/flixel/FlxParticle.as similarity index 100% rename from intra/src/org/flixel/FlxParticle.as rename to AIR/intra/src/org/flixel/FlxParticle.as diff --git a/intra/src/org/flixel/FlxPath.as b/AIR/intra/src/org/flixel/FlxPath.as similarity index 100% rename from intra/src/org/flixel/FlxPath.as rename to AIR/intra/src/org/flixel/FlxPath.as diff --git a/intra/src/org/flixel/FlxPoint.as b/AIR/intra/src/org/flixel/FlxPoint.as similarity index 100% rename from intra/src/org/flixel/FlxPoint.as rename to AIR/intra/src/org/flixel/FlxPoint.as diff --git a/intra/src/org/flixel/FlxRect.as b/AIR/intra/src/org/flixel/FlxRect.as similarity index 100% rename from intra/src/org/flixel/FlxRect.as rename to AIR/intra/src/org/flixel/FlxRect.as diff --git a/intra/src/org/flixel/FlxSave.as b/AIR/intra/src/org/flixel/FlxSave.as similarity index 100% rename from intra/src/org/flixel/FlxSave.as rename to AIR/intra/src/org/flixel/FlxSave.as diff --git a/intra/src/org/flixel/FlxSound.as b/AIR/intra/src/org/flixel/FlxSound.as similarity index 100% rename from intra/src/org/flixel/FlxSound.as rename to AIR/intra/src/org/flixel/FlxSound.as diff --git a/intra/src/org/flixel/FlxSprite.as b/AIR/intra/src/org/flixel/FlxSprite.as similarity index 100% rename from intra/src/org/flixel/FlxSprite.as rename to AIR/intra/src/org/flixel/FlxSprite.as diff --git a/intra/src/org/flixel/FlxState.as b/AIR/intra/src/org/flixel/FlxState.as similarity index 100% rename from intra/src/org/flixel/FlxState.as rename to AIR/intra/src/org/flixel/FlxState.as diff --git a/intra/src/org/flixel/FlxText.as b/AIR/intra/src/org/flixel/FlxText.as similarity index 100% rename from intra/src/org/flixel/FlxText.as rename to AIR/intra/src/org/flixel/FlxText.as diff --git a/intra/src/org/flixel/FlxTileblock.as b/AIR/intra/src/org/flixel/FlxTileblock.as similarity index 100% rename from intra/src/org/flixel/FlxTileblock.as rename to AIR/intra/src/org/flixel/FlxTileblock.as diff --git a/intra/src/org/flixel/FlxTilemap.as b/AIR/intra/src/org/flixel/FlxTilemap.as similarity index 100% rename from intra/src/org/flixel/FlxTilemap.as rename to AIR/intra/src/org/flixel/FlxTilemap.as diff --git a/intra/src/org/flixel/FlxTimer.as b/AIR/intra/src/org/flixel/FlxTimer.as similarity index 100% rename from intra/src/org/flixel/FlxTimer.as rename to AIR/intra/src/org/flixel/FlxTimer.as diff --git a/intra/src/org/flixel/FlxU.as b/AIR/intra/src/org/flixel/FlxU.as similarity index 100% rename from intra/src/org/flixel/FlxU.as rename to AIR/intra/src/org/flixel/FlxU.as diff --git a/intra/src/org/flixel/data/autotiles.png b/AIR/intra/src/org/flixel/data/autotiles.png similarity index 100% rename from intra/src/org/flixel/data/autotiles.png rename to AIR/intra/src/org/flixel/data/autotiles.png diff --git a/intra/src/org/flixel/data/autotiles_alt.png b/AIR/intra/src/org/flixel/data/autotiles_alt.png similarity index 100% rename from intra/src/org/flixel/data/autotiles_alt.png rename to AIR/intra/src/org/flixel/data/autotiles_alt.png diff --git a/intra/src/org/flixel/data/beep.mp3 b/AIR/intra/src/org/flixel/data/beep.mp3 similarity index 100% rename from intra/src/org/flixel/data/beep.mp3 rename to AIR/intra/src/org/flixel/data/beep.mp3 diff --git a/intra/src/org/flixel/data/button.png b/AIR/intra/src/org/flixel/data/button.png similarity index 100% rename from intra/src/org/flixel/data/button.png rename to AIR/intra/src/org/flixel/data/button.png diff --git a/intra/src/org/flixel/data/cursor.png b/AIR/intra/src/org/flixel/data/cursor.png similarity index 100% rename from intra/src/org/flixel/data/cursor.png rename to AIR/intra/src/org/flixel/data/cursor.png diff --git a/intra/src/org/flixel/data/default.png b/AIR/intra/src/org/flixel/data/default.png similarity index 100% rename from intra/src/org/flixel/data/default.png rename to AIR/intra/src/org/flixel/data/default.png diff --git a/intra/src/org/flixel/data/handle.png b/AIR/intra/src/org/flixel/data/handle.png similarity index 100% rename from intra/src/org/flixel/data/handle.png rename to AIR/intra/src/org/flixel/data/handle.png diff --git a/intra/src/org/flixel/data/logo.png b/AIR/intra/src/org/flixel/data/logo.png similarity index 100% rename from intra/src/org/flixel/data/logo.png rename to AIR/intra/src/org/flixel/data/logo.png diff --git a/intra/src/org/flixel/data/logo_corners.png b/AIR/intra/src/org/flixel/data/logo_corners.png similarity index 100% rename from intra/src/org/flixel/data/logo_corners.png rename to AIR/intra/src/org/flixel/data/logo_corners.png diff --git a/intra/src/org/flixel/data/logo_light.png b/AIR/intra/src/org/flixel/data/logo_light.png similarity index 100% rename from intra/src/org/flixel/data/logo_light.png rename to AIR/intra/src/org/flixel/data/logo_light.png diff --git a/intra/src/org/flixel/data/nokiafc22.ttf b/AIR/intra/src/org/flixel/data/nokiafc22.ttf similarity index 100% rename from intra/src/org/flixel/data/nokiafc22.ttf rename to AIR/intra/src/org/flixel/data/nokiafc22.ttf diff --git a/intra/src/org/flixel/data/vcr/flixel.png b/AIR/intra/src/org/flixel/data/vcr/flixel.png similarity index 100% rename from intra/src/org/flixel/data/vcr/flixel.png rename to AIR/intra/src/org/flixel/data/vcr/flixel.png diff --git a/intra/src/org/flixel/data/vcr/open.png b/AIR/intra/src/org/flixel/data/vcr/open.png similarity index 100% rename from intra/src/org/flixel/data/vcr/open.png rename to AIR/intra/src/org/flixel/data/vcr/open.png diff --git a/intra/src/org/flixel/data/vcr/pause.png b/AIR/intra/src/org/flixel/data/vcr/pause.png similarity index 100% rename from intra/src/org/flixel/data/vcr/pause.png rename to AIR/intra/src/org/flixel/data/vcr/pause.png diff --git a/intra/src/org/flixel/data/vcr/play.png b/AIR/intra/src/org/flixel/data/vcr/play.png similarity index 100% rename from intra/src/org/flixel/data/vcr/play.png rename to AIR/intra/src/org/flixel/data/vcr/play.png diff --git a/intra/src/org/flixel/data/vcr/record_off.png b/AIR/intra/src/org/flixel/data/vcr/record_off.png similarity index 100% rename from intra/src/org/flixel/data/vcr/record_off.png rename to AIR/intra/src/org/flixel/data/vcr/record_off.png diff --git a/intra/src/org/flixel/data/vcr/record_on.png b/AIR/intra/src/org/flixel/data/vcr/record_on.png similarity index 100% rename from intra/src/org/flixel/data/vcr/record_on.png rename to AIR/intra/src/org/flixel/data/vcr/record_on.png diff --git a/intra/src/org/flixel/data/vcr/restart.png b/AIR/intra/src/org/flixel/data/vcr/restart.png similarity index 100% rename from intra/src/org/flixel/data/vcr/restart.png rename to AIR/intra/src/org/flixel/data/vcr/restart.png diff --git a/intra/src/org/flixel/data/vcr/step.png b/AIR/intra/src/org/flixel/data/vcr/step.png similarity index 100% rename from intra/src/org/flixel/data/vcr/step.png rename to AIR/intra/src/org/flixel/data/vcr/step.png diff --git a/intra/src/org/flixel/data/vcr/stop.png b/AIR/intra/src/org/flixel/data/vcr/stop.png similarity index 100% rename from intra/src/org/flixel/data/vcr/stop.png rename to AIR/intra/src/org/flixel/data/vcr/stop.png diff --git a/intra/src/org/flixel/data/vis/bounds.png b/AIR/intra/src/org/flixel/data/vis/bounds.png similarity index 100% rename from intra/src/org/flixel/data/vis/bounds.png rename to AIR/intra/src/org/flixel/data/vis/bounds.png diff --git a/intra/src/org/flixel/plugin/DebugPathDisplay.as b/AIR/intra/src/org/flixel/plugin/DebugPathDisplay.as similarity index 100% rename from intra/src/org/flixel/plugin/DebugPathDisplay.as rename to AIR/intra/src/org/flixel/plugin/DebugPathDisplay.as diff --git a/intra/src/org/flixel/plugin/TimerManager.as b/AIR/intra/src/org/flixel/plugin/TimerManager.as similarity index 100% rename from intra/src/org/flixel/plugin/TimerManager.as rename to AIR/intra/src/org/flixel/plugin/TimerManager.as diff --git a/intra/src/org/flixel/plugin/photonstorm/API/FlxKongregate.as b/AIR/intra/src/org/flixel/plugin/photonstorm/API/FlxKongregate.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/API/FlxKongregate.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/API/FlxKongregate.as diff --git a/intra/src/org/flixel/plugin/photonstorm/BaseTypes/Bullet.as b/AIR/intra/src/org/flixel/plugin/photonstorm/BaseTypes/Bullet.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/BaseTypes/Bullet.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/BaseTypes/Bullet.as diff --git a/intra/src/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.as b/AIR/intra/src/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/BaseFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/BaseFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/BaseFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/BaseFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/BlurFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/BlurFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/BlurFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/BlurFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/CenterSlideFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/CenterSlideFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/CenterSlideFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/CenterSlideFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/FloodFillFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/FloodFillFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/FloodFillFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/FloodFillFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/GlitchFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/GlitchFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/GlitchFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/GlitchFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/PlasmaFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/PlasmaFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/PlasmaFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/PlasmaFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/RainbowLineFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/RainbowLineFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/RainbowLineFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/RainbowLineFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/RevealFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/RevealFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/RevealFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/RevealFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/SineWaveFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/SineWaveFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/SineWaveFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/SineWaveFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/StarfieldFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/StarfieldFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/StarfieldFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/StarfieldFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FX/WowCopperFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FX/WowCopperFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FX/WowCopperFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FX/WowCopperFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxBar.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxBar.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxBar.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxBar.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxBitmapFont.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxBitmapFont.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxBitmapFont.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxBitmapFont.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxButtonPlus.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxButtonPlus.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxButtonPlus.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxButtonPlus.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxCollision.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxCollision.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxCollision.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxCollision.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxColor.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxColor.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxColor.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxColor.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxControl.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxControl.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxControl.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxControl.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxControlHandler.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxControlHandler.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxControlHandler.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxControlHandler.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxCoreUtils.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxCoreUtils.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxCoreUtils.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxCoreUtils.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxDelay.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxDelay.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxDelay.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxDelay.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxDisplay.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxDisplay.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxDisplay.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxDisplay.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxExplode.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxExplode.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxExplode.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxExplode.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxExtendedSprite.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxExtendedSprite.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxExtendedSprite.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxExtendedSprite.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxFlectrum.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxFlectrum.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxFlectrum.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxFlectrum.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxFlod.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxFlod.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxFlod.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxFlod.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxGradient.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxGradient.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxGradient.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxGradient.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxGridOverlay.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxGridOverlay.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxGridOverlay.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxGridOverlay.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxLinkedGroup.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxLinkedGroup.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxLinkedGroup.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxLinkedGroup.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxMath.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxMath.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxMath.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxMath.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxMouseControl.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxMouseControl.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxMouseControl.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxMouseControl.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxPowerTools.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxPowerTools.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxPowerTools.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxPowerTools.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxScreenGrab.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxScreenGrab.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxScreenGrab.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxScreenGrab.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxScrollZone.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxScrollZone.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxScrollZone.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxScrollZone.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxScrollingText.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxScrollingText.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxScrollingText.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxScrollingText.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxSpecialFX.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxSpecialFX.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxSpecialFX.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxSpecialFX.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxVelocity.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxVelocity.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxVelocity.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxVelocity.as diff --git a/intra/src/org/flixel/plugin/photonstorm/FlxWeapon.as b/AIR/intra/src/org/flixel/plugin/photonstorm/FlxWeapon.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/FlxWeapon.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/FlxWeapon.as diff --git a/intra/src/org/flixel/plugin/photonstorm/PNGEncoder.as b/AIR/intra/src/org/flixel/plugin/photonstorm/PNGEncoder.as similarity index 100% rename from intra/src/org/flixel/plugin/photonstorm/PNGEncoder.as rename to AIR/intra/src/org/flixel/plugin/photonstorm/PNGEncoder.as diff --git a/intra/src/org/flixel/system/FlxAnim.as b/AIR/intra/src/org/flixel/system/FlxAnim.as similarity index 100% rename from intra/src/org/flixel/system/FlxAnim.as rename to AIR/intra/src/org/flixel/system/FlxAnim.as diff --git a/intra/src/org/flixel/system/FlxDebugger.as b/AIR/intra/src/org/flixel/system/FlxDebugger.as similarity index 100% rename from intra/src/org/flixel/system/FlxDebugger.as rename to AIR/intra/src/org/flixel/system/FlxDebugger.as diff --git a/intra/src/org/flixel/system/FlxList.as b/AIR/intra/src/org/flixel/system/FlxList.as similarity index 100% rename from intra/src/org/flixel/system/FlxList.as rename to AIR/intra/src/org/flixel/system/FlxList.as diff --git a/intra/src/org/flixel/system/FlxPreloader.as b/AIR/intra/src/org/flixel/system/FlxPreloader.as similarity index 100% rename from intra/src/org/flixel/system/FlxPreloader.as rename to AIR/intra/src/org/flixel/system/FlxPreloader.as diff --git a/intra/src/org/flixel/system/FlxQuadTree.as b/AIR/intra/src/org/flixel/system/FlxQuadTree.as similarity index 100% rename from intra/src/org/flixel/system/FlxQuadTree.as rename to AIR/intra/src/org/flixel/system/FlxQuadTree.as diff --git a/intra/src/org/flixel/system/FlxReplay.as b/AIR/intra/src/org/flixel/system/FlxReplay.as similarity index 100% rename from intra/src/org/flixel/system/FlxReplay.as rename to AIR/intra/src/org/flixel/system/FlxReplay.as diff --git a/intra/src/org/flixel/system/FlxTile.as b/AIR/intra/src/org/flixel/system/FlxTile.as similarity index 100% rename from intra/src/org/flixel/system/FlxTile.as rename to AIR/intra/src/org/flixel/system/FlxTile.as diff --git a/intra/src/org/flixel/system/FlxTilemapBuffer.as b/AIR/intra/src/org/flixel/system/FlxTilemapBuffer.as similarity index 100% rename from intra/src/org/flixel/system/FlxTilemapBuffer.as rename to AIR/intra/src/org/flixel/system/FlxTilemapBuffer.as diff --git a/intra/src/org/flixel/system/FlxWindow.as b/AIR/intra/src/org/flixel/system/FlxWindow.as similarity index 100% rename from intra/src/org/flixel/system/FlxWindow.as rename to AIR/intra/src/org/flixel/system/FlxWindow.as diff --git a/intra/src/org/flixel/system/ObjectPool.as b/AIR/intra/src/org/flixel/system/ObjectPool.as similarity index 100% rename from intra/src/org/flixel/system/ObjectPool.as rename to AIR/intra/src/org/flixel/system/ObjectPool.as diff --git a/intra/src/org/flixel/system/debug/Log.as b/AIR/intra/src/org/flixel/system/debug/Log.as similarity index 100% rename from intra/src/org/flixel/system/debug/Log.as rename to AIR/intra/src/org/flixel/system/debug/Log.as diff --git a/intra/src/org/flixel/system/debug/Perf.as b/AIR/intra/src/org/flixel/system/debug/Perf.as similarity index 100% rename from intra/src/org/flixel/system/debug/Perf.as rename to AIR/intra/src/org/flixel/system/debug/Perf.as diff --git a/intra/src/org/flixel/system/debug/VCR.as b/AIR/intra/src/org/flixel/system/debug/VCR.as similarity index 100% rename from intra/src/org/flixel/system/debug/VCR.as rename to AIR/intra/src/org/flixel/system/debug/VCR.as diff --git a/intra/src/org/flixel/system/debug/Vis.as b/AIR/intra/src/org/flixel/system/debug/Vis.as similarity index 100% rename from intra/src/org/flixel/system/debug/Vis.as rename to AIR/intra/src/org/flixel/system/debug/Vis.as diff --git a/intra/src/org/flixel/system/debug/Watch.as b/AIR/intra/src/org/flixel/system/debug/Watch.as similarity index 100% rename from intra/src/org/flixel/system/debug/Watch.as rename to AIR/intra/src/org/flixel/system/debug/Watch.as diff --git a/intra/src/org/flixel/system/debug/WatchEntry.as b/AIR/intra/src/org/flixel/system/debug/WatchEntry.as similarity index 100% rename from intra/src/org/flixel/system/debug/WatchEntry.as rename to AIR/intra/src/org/flixel/system/debug/WatchEntry.as diff --git a/intra/src/org/flixel/system/input/Input.as b/AIR/intra/src/org/flixel/system/input/Input.as similarity index 100% rename from intra/src/org/flixel/system/input/Input.as rename to AIR/intra/src/org/flixel/system/input/Input.as diff --git a/intra/src/org/flixel/system/input/Keyboard.as b/AIR/intra/src/org/flixel/system/input/Keyboard.as similarity index 100% rename from intra/src/org/flixel/system/input/Keyboard.as rename to AIR/intra/src/org/flixel/system/input/Keyboard.as diff --git a/intra/src/org/flixel/system/input/Mouse.as b/AIR/intra/src/org/flixel/system/input/Mouse.as similarity index 100% rename from intra/src/org/flixel/system/input/Mouse.as rename to AIR/intra/src/org/flixel/system/input/Mouse.as diff --git a/intra/src/org/flixel/system/replay/FrameRecord.as b/AIR/intra/src/org/flixel/system/replay/FrameRecord.as similarity index 100% rename from intra/src/org/flixel/system/replay/FrameRecord.as rename to AIR/intra/src/org/flixel/system/replay/FrameRecord.as diff --git a/intra/src/org/flixel/system/replay/MouseRecord.as b/AIR/intra/src/org/flixel/system/replay/MouseRecord.as similarity index 100% rename from intra/src/org/flixel/system/replay/MouseRecord.as rename to AIR/intra/src/org/flixel/system/replay/MouseRecord.as diff --git a/intra/src/states/ControlsState.as b/AIR/intra/src/states/ControlsState.as similarity index 100% rename from intra/src/states/ControlsState.as rename to AIR/intra/src/states/ControlsState.as diff --git a/intra/src/states/DialogueState.as b/AIR/intra/src/states/DialogueState.as similarity index 100% rename from intra/src/states/DialogueState.as rename to AIR/intra/src/states/DialogueState.as diff --git a/intra/src/states/EndingState.as b/AIR/intra/src/states/EndingState.as similarity index 100% rename from intra/src/states/EndingState.as rename to AIR/intra/src/states/EndingState.as diff --git a/intra/src/states/IntroScene.as b/AIR/intra/src/states/IntroScene.as similarity index 100% rename from intra/src/states/IntroScene.as rename to AIR/intra/src/states/IntroScene.as diff --git a/intra/src/states/MinimapState.as b/AIR/intra/src/states/MinimapState.as similarity index 100% rename from intra/src/states/MinimapState.as rename to AIR/intra/src/states/MinimapState.as diff --git a/intra/src/states/MobileConfig.as b/AIR/intra/src/states/MobileConfig.as similarity index 100% rename from intra/src/states/MobileConfig.as rename to AIR/intra/src/states/MobileConfig.as diff --git a/intra/src/states/PauseState.as b/AIR/intra/src/states/PauseState.as similarity index 100% rename from intra/src/states/PauseState.as rename to AIR/intra/src/states/PauseState.as diff --git a/intra/src/states/PlayState.as b/AIR/intra/src/states/PlayState.as similarity index 100% rename from intra/src/states/PlayState.as rename to AIR/intra/src/states/PlayState.as diff --git a/intra/src/states/PushableFlxState.as b/AIR/intra/src/states/PushableFlxState.as similarity index 100% rename from intra/src/states/PushableFlxState.as rename to AIR/intra/src/states/PushableFlxState.as diff --git a/intra/src/states/RoamState.as b/AIR/intra/src/states/RoamState.as similarity index 100% rename from intra/src/states/RoamState.as rename to AIR/intra/src/states/RoamState.as diff --git a/intra/src/states/TitleState.as b/AIR/intra/src/states/TitleState.as similarity index 100% rename from intra/src/states/TitleState.as rename to AIR/intra/src/states/TitleState.as diff --git a/intra/src/states/noairPauseState.as b/AIR/intra/src/states/noairPauseState.as similarity index 100% rename from intra/src/states/noairPauseState.as rename to AIR/intra/src/states/noairPauseState.as diff --git a/intra/src/xml/Intra.xml b/AIR/intra/src/xml/Intra.xml similarity index 100% rename from intra/src/xml/Intra.xml rename to AIR/intra/src/xml/Intra.xml diff --git a/intra/xml_app/application.xml b/AIR/intra/xml_app/application.xml similarity index 100% rename from intra/xml_app/application.xml rename to AIR/intra/xml_app/application.xml diff --git a/intra/xml_app/application_mac.xml b/AIR/intra/xml_app/application_mac.xml similarity index 100% rename from intra/xml_app/application_mac.xml rename to AIR/intra/xml_app/application_mac.xml diff --git a/intra/xml_app/mapplicationdroid.xml b/AIR/intra/xml_app/mapplicationdroid.xml similarity index 100% rename from intra/xml_app/mapplicationdroid.xml rename to AIR/intra/xml_app/mapplicationdroid.xml diff --git a/intra/Project.xml b/intra/Project.xml new file mode 100644 index 0000000..039da8b --- /dev/null +++ b/intra/Project.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/intra/src/res/font/11x12_ZHS.png b/intra/assets/images/font/11x12_ZHS.png similarity index 100% rename from intra/src/res/font/11x12_ZHS.png rename to intra/assets/images/font/11x12_ZHS.png diff --git a/intra/src/res/font/8x8-kr.png b/intra/assets/images/font/8x8-kr.png similarity index 100% rename from intra/src/res/font/8x8-kr.png rename to intra/assets/images/font/8x8-kr.png diff --git a/intra/src/res/font/es_white.png b/intra/assets/images/font/es_white.png similarity index 100% rename from intra/src/res/font/es_white.png rename to intra/assets/images/font/es_white.png diff --git a/intra/src/res/font/font-black-apple-7x8.png b/intra/assets/images/font/font-black-apple-7x8.png similarity index 100% rename from intra/src/res/font/font-black-apple-7x8.png rename to intra/assets/images/font/font-black-apple-7x8.png diff --git a/intra/src/res/font/font-black.png b/intra/assets/images/font/font-black.png similarity index 100% rename from intra/src/res/font/font-black.png rename to intra/assets/images/font/font-black.png diff --git a/intra/src/res/font/font-white-apple-7x8.png b/intra/assets/images/font/font-white-apple-7x8.png similarity index 100% rename from intra/src/res/font/font-white-apple-7x8.png rename to intra/assets/images/font/font-white-apple-7x8.png diff --git a/intra/src/res/font/jp_white.png b/intra/assets/images/font/jp_white.png similarity index 100% rename from intra/src/res/font/jp_white.png rename to intra/assets/images/font/jp_white.png diff --git a/intra/src/res/font/jp_white_test.png b/intra/assets/images/font/jp_white_test.png similarity index 100% rename from intra/src/res/font/jp_white_test.png rename to intra/assets/images/font/jp_white_test.png diff --git a/intra/src/res/font/kr_white.png b/intra/assets/images/font/kr_white.png similarity index 100% rename from intra/src/res/font/kr_white.png rename to intra/assets/images/font/kr_white.png diff --git a/intra/src/res/medals/boss.gif b/intra/assets/images/medals/boss.gif similarity index 100% rename from intra/src/res/medals/boss.gif rename to intra/assets/images/medals/boss.gif diff --git a/intra/src/res/medals/card.gif b/intra/assets/images/medals/card.gif similarity index 100% rename from intra/src/res/medals/card.gif rename to intra/assets/images/medals/card.gif diff --git a/intra/src/res/medals/cards.gif b/intra/assets/images/medals/cards.gif similarity index 100% rename from intra/src/res/medals/cards.gif rename to intra/assets/images/medals/cards.gif diff --git a/intra/src/res/medals/fields.jpg b/intra/assets/images/medals/fields.jpg similarity index 100% rename from intra/src/res/medals/fields.jpg rename to intra/assets/images/medals/fields.jpg diff --git a/intra/src/res/medals/greenlight.gif b/intra/assets/images/medals/greenlight.gif similarity index 100% rename from intra/src/res/medals/greenlight.gif rename to intra/assets/images/medals/greenlight.gif diff --git a/intra/src/res/medals/greenlight.jpg b/intra/assets/images/medals/greenlight.jpg similarity index 100% rename from intra/src/res/medals/greenlight.jpg rename to intra/assets/images/medals/greenlight.jpg diff --git a/intra/src/res/medals/health.gif b/intra/assets/images/medals/health.gif similarity index 100% rename from intra/src/res/medals/health.gif rename to intra/assets/images/medals/health.gif diff --git a/intra/src/res/medals/palyer.jpg b/intra/assets/images/medals/palyer.jpg similarity index 100% rename from intra/src/res/medals/palyer.jpg rename to intra/assets/images/medals/palyer.jpg diff --git a/intra/src/res/medals/secret.gif b/intra/assets/images/medals/secret.gif similarity index 100% rename from intra/src/res/medals/secret.gif rename to intra/assets/images/medals/secret.gif diff --git a/intra/src/res/sprites/animtiles/beach_anims.png b/intra/assets/images/sprites/animtiles/beach_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/beach_anims.png rename to intra/assets/images/sprites/animtiles/beach_anims.png diff --git a/intra/src/res/sprites/animtiles/cell_anims.png b/intra/assets/images/sprites/animtiles/cell_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/cell_anims.png rename to intra/assets/images/sprites/animtiles/cell_anims.png diff --git a/intra/src/res/sprites/animtiles/conveyer_anim_tiles.png b/intra/assets/images/sprites/animtiles/conveyer_anim_tiles.png similarity index 100% rename from intra/src/res/sprites/animtiles/conveyer_anim_tiles.png rename to intra/assets/images/sprites/animtiles/conveyer_anim_tiles.png diff --git a/intra/src/res/sprites/animtiles/fields_anims.png b/intra/assets/images/sprites/animtiles/fields_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/fields_anims.png rename to intra/assets/images/sprites/animtiles/fields_anims.png diff --git a/intra/src/res/sprites/animtiles/flame_anims.png b/intra/assets/images/sprites/animtiles/flame_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/flame_anims.png rename to intra/assets/images/sprites/animtiles/flame_anims.png diff --git a/intra/src/res/sprites/animtiles/forest_anims.png b/intra/assets/images/sprites/animtiles/forest_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/forest_anims.png rename to intra/assets/images/sprites/animtiles/forest_anims.png diff --git a/intra/src/res/sprites/animtiles/go_anims.png b/intra/assets/images/sprites/animtiles/go_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/go_anims.png rename to intra/assets/images/sprites/animtiles/go_anims.png diff --git a/intra/src/res/sprites/animtiles/happy_anims.png b/intra/assets/images/sprites/animtiles/happy_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/happy_anims.png rename to intra/assets/images/sprites/animtiles/happy_anims.png diff --git a/intra/src/res/sprites/animtiles/shoreline.png b/intra/assets/images/sprites/animtiles/shoreline.png similarity index 100% rename from intra/src/res/sprites/animtiles/shoreline.png rename to intra/assets/images/sprites/animtiles/shoreline.png diff --git a/intra/src/res/sprites/animtiles/shoreline_old.png b/intra/assets/images/sprites/animtiles/shoreline_old.png similarity index 100% rename from intra/src/res/sprites/animtiles/shoreline_old.png rename to intra/assets/images/sprites/animtiles/shoreline_old.png diff --git a/intra/src/res/sprites/animtiles/shoreline_old2.png b/intra/assets/images/sprites/animtiles/shoreline_old2.png similarity index 100% rename from intra/src/res/sprites/animtiles/shoreline_old2.png rename to intra/assets/images/sprites/animtiles/shoreline_old2.png diff --git a/intra/src/res/sprites/animtiles/suburbs_anims.png b/intra/assets/images/sprites/animtiles/suburbs_anims.png similarity index 100% rename from intra/src/res/sprites/animtiles/suburbs_anims.png rename to intra/assets/images/sprites/animtiles/suburbs_anims.png diff --git a/intra/src/res/sprites/animtiles/terminal.png b/intra/assets/images/sprites/animtiles/terminal.png similarity index 100% rename from intra/src/res/sprites/animtiles/terminal.png rename to intra/assets/images/sprites/animtiles/terminal.png diff --git a/intra/src/res/sprites/animtiles/torch_pillars.png b/intra/assets/images/sprites/animtiles/torch_pillars.png similarity index 100% rename from intra/src/res/sprites/animtiles/torch_pillars.png rename to intra/assets/images/sprites/animtiles/torch_pillars.png diff --git a/intra/src/res/sprites/animtiles/water_edges.png b/intra/assets/images/sprites/animtiles/water_edges.png similarity index 100% rename from intra/src/res/sprites/animtiles/water_edges.png rename to intra/assets/images/sprites/animtiles/water_edges.png diff --git a/intra/src/res/sprites/animtiles/windmill_drops.png b/intra/assets/images/sprites/animtiles/windmill_drops.png similarity index 100% rename from intra/src/res/sprites/animtiles/windmill_drops.png rename to intra/assets/images/sprites/animtiles/windmill_drops.png diff --git a/intra/src/res/sprites/broom_cell.png b/intra/assets/images/sprites/broom_cell.png similarity index 100% rename from intra/src/res/sprites/broom_cell.png rename to intra/assets/images/sprites/broom_cell.png diff --git a/intra/src/res/sprites/broom_reflection.png b/intra/assets/images/sprites/broom_reflection.png similarity index 100% rename from intra/src/res/sprites/broom_reflection.png rename to intra/assets/images/sprites/broom_reflection.png diff --git a/intra/src/res/sprites/dame/dame-buttons.png b/intra/assets/images/sprites/dame/dame-buttons.png similarity index 100% rename from intra/src/res/sprites/dame/dame-buttons.png rename to intra/assets/images/sprites/dame/dame-buttons.png diff --git a/intra/src/res/sprites/dame/dame-events.png b/intra/assets/images/sprites/dame/dame-events.png similarity index 100% rename from intra/src/res/sprites/dame/dame-events.png rename to intra/assets/images/sprites/dame/dame-events.png diff --git a/intra/src/res/sprites/dame/dame-gates.png b/intra/assets/images/sprites/dame/dame-gates.png similarity index 100% rename from intra/src/res/sprites/dame/dame-gates.png rename to intra/assets/images/sprites/dame/dame-gates.png diff --git a/intra/src/res/sprites/dame/dame-slime.png b/intra/assets/images/sprites/dame/dame-slime.png similarity index 100% rename from intra/src/res/sprites/dame/dame-slime.png rename to intra/assets/images/sprites/dame/dame-slime.png diff --git a/intra/src/res/sprites/dame/dame-switch-pillar.png b/intra/assets/images/sprites/dame/dame-switch-pillar.png similarity index 100% rename from intra/src/res/sprites/dame/dame-switch-pillar.png rename to intra/assets/images/sprites/dame/dame-switch-pillar.png diff --git a/intra/src/res/sprites/dame/dame-treasure-boxes.png b/intra/assets/images/sprites/dame/dame-treasure-boxes.png similarity index 100% rename from intra/src/res/sprites/dame/dame-treasure-boxes.png rename to intra/assets/images/sprites/dame/dame-treasure-boxes.png diff --git a/intra/src/res/sprites/dame/dame_circusfolk.png b/intra/assets/images/sprites/dame/dame_circusfolk.png similarity index 100% rename from intra/src/res/sprites/dame/dame_circusfolk.png rename to intra/assets/images/sprites/dame/dame_circusfolk.png diff --git a/intra/src/res/sprites/dame/dame_dog.png b/intra/assets/images/sprites/dame/dame_dog.png similarity index 100% rename from intra/src/res/sprites/dame/dame_dog.png rename to intra/assets/images/sprites/dame/dame_dog.png diff --git a/intra/src/res/sprites/dame/dame_frog.png b/intra/assets/images/sprites/dame/dame_frog.png similarity index 100% rename from intra/src/res/sprites/dame/dame_frog.png rename to intra/assets/images/sprites/dame/dame_frog.png diff --git a/intra/src/res/sprites/dame/dame_generic_npc.png b/intra/assets/images/sprites/dame/dame_generic_npc.png similarity index 100% rename from intra/src/res/sprites/dame/dame_generic_npc.png rename to intra/assets/images/sprites/dame/dame_generic_npc.png diff --git a/intra/src/res/sprites/dame/dame_jump_triggers.png b/intra/assets/images/sprites/dame/dame_jump_triggers.png similarity index 100% rename from intra/src/res/sprites/dame/dame_jump_triggers.png rename to intra/assets/images/sprites/dame/dame_jump_triggers.png diff --git a/intra/src/res/sprites/dame/dame_npc_mitra.png b/intra/assets/images/sprites/dame/dame_npc_mitra.png similarity index 100% rename from intra/src/res/sprites/dame/dame_npc_mitra.png rename to intra/assets/images/sprites/dame/dame_npc_mitra.png diff --git a/intra/src/res/sprites/dame/dame_npc_rock.png b/intra/assets/images/sprites/dame/dame_npc_rock.png similarity index 100% rename from intra/src/res/sprites/dame/dame_npc_rock.png rename to intra/assets/images/sprites/dame/dame_npc_rock.png diff --git a/intra/src/res/sprites/dame/dame_npc_sage.png b/intra/assets/images/sprites/dame/dame_npc_sage.png similarity index 100% rename from intra/src/res/sprites/dame/dame_npc_sage.png rename to intra/assets/images/sprites/dame/dame_npc_sage.png diff --git a/intra/src/res/sprites/dame/dame_npc_statue.png b/intra/assets/images/sprites/dame/dame_npc_statue.png similarity index 100% rename from intra/src/res/sprites/dame/dame_npc_statue.png rename to intra/assets/images/sprites/dame/dame_npc_statue.png diff --git a/intra/src/res/sprites/dame/dame_person.png b/intra/assets/images/sprites/dame/dame_person.png similarity index 100% rename from intra/src/res/sprites/dame/dame_person.png rename to intra/assets/images/sprites/dame/dame_person.png diff --git a/intra/src/res/sprites/dame/dame_red_pillars.png b/intra/assets/images/sprites/dame/dame_red_pillars.png similarity index 100% rename from intra/src/res/sprites/dame/dame_red_pillars.png rename to intra/assets/images/sprites/dame/dame_red_pillars.png diff --git a/intra/src/res/sprites/dame/dame_spike_rollers.png b/intra/assets/images/sprites/dame/dame_spike_rollers.png similarity index 100% rename from intra/src/res/sprites/dame/dame_spike_rollers.png rename to intra/assets/images/sprites/dame/dame_spike_rollers.png diff --git a/intra/src/res/sprites/dame/dame_spring_triggers.png b/intra/assets/images/sprites/dame/dame_spring_triggers.png similarity index 100% rename from intra/src/res/sprites/dame/dame_spring_triggers.png rename to intra/assets/images/sprites/dame/dame_spring_triggers.png diff --git a/intra/src/res/sprites/dame/dame_terminal_gate.png b/intra/assets/images/sprites/dame/dame_terminal_gate.png similarity index 100% rename from intra/src/res/sprites/dame/dame_terminal_gate.png rename to intra/assets/images/sprites/dame/dame_terminal_gate.png diff --git a/intra/src/res/sprites/dame/dame_trade_npc.png b/intra/assets/images/sprites/dame/dame_trade_npc.png similarity index 100% rename from intra/src/res/sprites/dame/dame_trade_npc.png rename to intra/assets/images/sprites/dame/dame_trade_npc.png diff --git a/intra/src/res/sprites/dame/dameblackthing.png b/intra/assets/images/sprites/dame/dameblackthing.png similarity index 100% rename from intra/src/res/sprites/dame/dameblackthing.png rename to intra/assets/images/sprites/dame/dameblackthing.png diff --git a/intra/src/res/sprites/dame/doorsfordame-whitedungeon.png b/intra/assets/images/sprites/dame/doorsfordame-whitedungeon.png similarity index 100% rename from intra/src/res/sprites/dame/doorsfordame-whitedungeon.png rename to intra/assets/images/sprites/dame/doorsfordame-whitedungeon.png diff --git a/intra/src/res/sprites/decoration/BLANK_BG.png b/intra/assets/images/sprites/decoration/BLANK_BG.png similarity index 100% rename from intra/src/res/sprites/decoration/BLANK_BG.png rename to intra/assets/images/sprites/decoration/BLANK_BG.png diff --git a/intra/src/res/sprites/decoration/SPACE_BG.png b/intra/assets/images/sprites/decoration/SPACE_BG.png similarity index 100% rename from intra/src/res/sprites/decoration/SPACE_BG.png rename to intra/assets/images/sprites/decoration/SPACE_BG.png diff --git a/intra/src/res/sprites/decoration/TREE.png b/intra/assets/images/sprites/decoration/TREE.png similarity index 100% rename from intra/src/res/sprites/decoration/TREE.png rename to intra/assets/images/sprites/decoration/TREE.png diff --git a/intra/src/res/sprites/decoration/briar_BG.png b/intra/assets/images/sprites/decoration/briar_BG.png similarity index 100% rename from intra/src/res/sprites/decoration/briar_BG.png rename to intra/assets/images/sprites/decoration/briar_BG.png diff --git a/intra/src/res/sprites/decoration/eyelight.png b/intra/assets/images/sprites/decoration/eyelight.png similarity index 100% rename from intra/src/res/sprites/decoration/eyelight.png rename to intra/assets/images/sprites/decoration/eyelight.png diff --git a/intra/src/res/sprites/decoration/grass_1.png b/intra/assets/images/sprites/decoration/grass_1.png similarity index 100% rename from intra/src/res/sprites/decoration/grass_1.png rename to intra/assets/images/sprites/decoration/grass_1.png diff --git a/intra/src/res/sprites/decoration/grass_REDSEA.png b/intra/assets/images/sprites/decoration/grass_REDSEA.png similarity index 100% rename from intra/src/res/sprites/decoration/grass_REDSEA.png rename to intra/assets/images/sprites/decoration/grass_REDSEA.png diff --git a/intra/src/res/sprites/decoration/nexus_bg.png b/intra/assets/images/sprites/decoration/nexus_bg.png similarity index 100% rename from intra/src/res/sprites/decoration/nexus_bg.png rename to intra/assets/images/sprites/decoration/nexus_bg.png diff --git a/intra/src/res/sprites/decoration/nexus_cardgem.png b/intra/assets/images/sprites/decoration/nexus_cardgem.png similarity index 100% rename from intra/src/res/sprites/decoration/nexus_cardgem.png rename to intra/assets/images/sprites/decoration/nexus_cardgem.png diff --git a/intra/src/res/sprites/decoration/nexus_door_preview_fade.png b/intra/assets/images/sprites/decoration/nexus_door_preview_fade.png similarity index 100% rename from intra/src/res/sprites/decoration/nexus_door_preview_fade.png rename to intra/assets/images/sprites/decoration/nexus_door_preview_fade.png diff --git a/intra/src/res/sprites/decoration/nexus_door_preview_overlay.png b/intra/assets/images/sprites/decoration/nexus_door_preview_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/nexus_door_preview_overlay.png rename to intra/assets/images/sprites/decoration/nexus_door_preview_overlay.png diff --git a/intra/src/res/sprites/decoration/nexus_door_preview_placeholder.png b/intra/assets/images/sprites/decoration/nexus_door_preview_placeholder.png similarity index 100% rename from intra/src/res/sprites/decoration/nexus_door_preview_placeholder.png rename to intra/assets/images/sprites/decoration/nexus_door_preview_placeholder.png diff --git a/intra/src/res/sprites/decoration/overlay_APARTMENT_water.png b/intra/assets/images/sprites/decoration/overlay_APARTMENT_water.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_APARTMENT_water.png rename to intra/assets/images/sprites/decoration/overlay_APARTMENT_water.png diff --git a/intra/src/res/sprites/decoration/overlay_FIELDS_grass.png b/intra/assets/images/sprites/decoration/overlay_FIELDS_grass.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_FIELDS_grass.png rename to intra/assets/images/sprites/decoration/overlay_FIELDS_grass.png diff --git a/intra/src/res/sprites/decoration/overlay_REDCAVE_water.png b/intra/assets/images/sprites/decoration/overlay_REDCAVE_water.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_REDCAVE_water.png rename to intra/assets/images/sprites/decoration/overlay_REDCAVE_water.png diff --git a/intra/src/res/sprites/decoration/overlay_REDSEA.png b/intra/assets/images/sprites/decoration/overlay_REDSEA.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_REDSEA.png rename to intra/assets/images/sprites/decoration/overlay_REDSEA.png diff --git a/intra/src/res/sprites/decoration/overlay_WINDMILL_water.png b/intra/assets/images/sprites/decoration/overlay_WINDMILL_water.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_WINDMILL_water.png rename to intra/assets/images/sprites/decoration/overlay_WINDMILL_water.png diff --git a/intra/src/res/sprites/decoration/overlay_water.png b/intra/assets/images/sprites/decoration/overlay_water.png similarity index 100% rename from intra/src/res/sprites/decoration/overlay_water.png rename to intra/assets/images/sprites/decoration/overlay_water.png diff --git a/intra/src/res/sprites/decoration/overlays/apartment_overlay.png b/intra/assets/images/sprites/decoration/overlays/apartment_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/apartment_overlay.png rename to intra/assets/images/sprites/decoration/overlays/apartment_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/beach_overlay.png b/intra/assets/images/sprites/decoration/overlays/beach_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/beach_overlay.png rename to intra/assets/images/sprites/decoration/overlays/beach_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/bedroom_overlay.png b/intra/assets/images/sprites/decoration/overlays/bedroom_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/bedroom_overlay.png rename to intra/assets/images/sprites/decoration/overlays/bedroom_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/blue_overlay.png b/intra/assets/images/sprites/decoration/overlays/blue_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/blue_overlay.png rename to intra/assets/images/sprites/decoration/overlays/blue_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/circus_overlay.png b/intra/assets/images/sprites/decoration/overlays/circus_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/circus_overlay.png rename to intra/assets/images/sprites/decoration/overlays/circus_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/cliff_overlay.png b/intra/assets/images/sprites/decoration/overlays/cliff_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/cliff_overlay.png rename to intra/assets/images/sprites/decoration/overlays/cliff_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/crowd_overlay.png b/intra/assets/images/sprites/decoration/overlays/crowd_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/crowd_overlay.png rename to intra/assets/images/sprites/decoration/overlays/crowd_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/debug_overlay.png b/intra/assets/images/sprites/decoration/overlays/debug_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/debug_overlay.png rename to intra/assets/images/sprites/decoration/overlays/debug_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/ending_overlay.png b/intra/assets/images/sprites/decoration/overlays/ending_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/ending_overlay.png rename to intra/assets/images/sprites/decoration/overlays/ending_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/forest_overlay.png b/intra/assets/images/sprites/decoration/overlays/forest_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/forest_overlay.png rename to intra/assets/images/sprites/decoration/overlays/forest_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/go_overlay - Copy.png b/intra/assets/images/sprites/decoration/overlays/go_overlay - Copy.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/go_overlay - Copy.png rename to intra/assets/images/sprites/decoration/overlays/go_overlay - Copy.png diff --git a/intra/src/res/sprites/decoration/overlays/go_overlay.png b/intra/assets/images/sprites/decoration/overlays/go_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/go_overlay.png rename to intra/assets/images/sprites/decoration/overlays/go_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/happy_blend.png b/intra/assets/images/sprites/decoration/overlays/happy_blend.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/happy_blend.png rename to intra/assets/images/sprites/decoration/overlays/happy_blend.png diff --git a/intra/src/res/sprites/decoration/overlays/happy_overlay.png b/intra/assets/images/sprites/decoration/overlays/happy_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/happy_overlay.png rename to intra/assets/images/sprites/decoration/overlays/happy_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/hotel_overlay.png b/intra/assets/images/sprites/decoration/overlays/hotel_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/hotel_overlay.png rename to intra/assets/images/sprites/decoration/overlays/hotel_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/hotel_roof_overlay.png b/intra/assets/images/sprites/decoration/overlays/hotel_roof_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/hotel_roof_overlay.png rename to intra/assets/images/sprites/decoration/overlays/hotel_roof_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/nexus_overlay.png b/intra/assets/images/sprites/decoration/overlays/nexus_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/nexus_overlay.png rename to intra/assets/images/sprites/decoration/overlays/nexus_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/redcave_overlay .png b/intra/assets/images/sprites/decoration/overlays/redcave_overlay .png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/redcave_overlay .png rename to intra/assets/images/sprites/decoration/overlays/redcave_overlay .png diff --git a/intra/src/res/sprites/decoration/overlays/redsea_overlay.png b/intra/assets/images/sprites/decoration/overlays/redsea_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/redsea_overlay.png rename to intra/assets/images/sprites/decoration/overlays/redsea_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/space_overlay.png b/intra/assets/images/sprites/decoration/overlays/space_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/space_overlay.png rename to intra/assets/images/sprites/decoration/overlays/space_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/street_overlay.png b/intra/assets/images/sprites/decoration/overlays/street_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/street_overlay.png rename to intra/assets/images/sprites/decoration/overlays/street_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/suburbs_overlay.png b/intra/assets/images/sprites/decoration/overlays/suburbs_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/suburbs_overlay.png rename to intra/assets/images/sprites/decoration/overlays/suburbs_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/suburbs_overlay_dark.png b/intra/assets/images/sprites/decoration/overlays/suburbs_overlay_dark.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/suburbs_overlay_dark.png rename to intra/assets/images/sprites/decoration/overlays/suburbs_overlay_dark.png diff --git a/intra/src/res/sprites/decoration/overlays/terminal_overlay.png b/intra/assets/images/sprites/decoration/overlays/terminal_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/terminal_overlay.png rename to intra/assets/images/sprites/decoration/overlays/terminal_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/windmill_overlay.png b/intra/assets/images/sprites/decoration/overlays/windmill_overlay.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/windmill_overlay.png rename to intra/assets/images/sprites/decoration/overlays/windmill_overlay.png diff --git a/intra/src/res/sprites/decoration/overlays/windmill_overlay2.png b/intra/assets/images/sprites/decoration/overlays/windmill_overlay2.png similarity index 100% rename from intra/src/res/sprites/decoration/overlays/windmill_overlay2.png rename to intra/assets/images/sprites/decoration/overlays/windmill_overlay2.png diff --git a/intra/src/res/sprites/decoration/palmtree.xcf b/intra/assets/images/sprites/decoration/palmtree.xcf similarity index 100% rename from intra/src/res/sprites/decoration/palmtree.xcf rename to intra/assets/images/sprites/decoration/palmtree.xcf diff --git a/intra/src/res/sprites/decoration/pixelation.png b/intra/assets/images/sprites/decoration/pixelation.png similarity index 100% rename from intra/src/res/sprites/decoration/pixelation.png rename to intra/assets/images/sprites/decoration/pixelation.png diff --git a/intra/src/res/sprites/decoration/player_overlay_foot_test.png b/intra/assets/images/sprites/decoration/player_overlay_foot_test.png similarity index 100% rename from intra/src/res/sprites/decoration/player_overlay_foot_test.png rename to intra/assets/images/sprites/decoration/player_overlay_foot_test.png diff --git a/intra/src/res/sprites/decoration/rail.png b/intra/assets/images/sprites/decoration/rail.png similarity index 100% rename from intra/src/res/sprites/decoration/rail.png rename to intra/assets/images/sprites/decoration/rail.png diff --git a/intra/src/res/sprites/decoration/rail_CROWD.png b/intra/assets/images/sprites/decoration/rail_CROWD.png similarity index 100% rename from intra/src/res/sprites/decoration/rail_CROWD.png rename to intra/assets/images/sprites/decoration/rail_CROWD.png diff --git a/intra/src/res/sprites/decoration/rail_NEXUS.png b/intra/assets/images/sprites/decoration/rail_NEXUS.png similarity index 100% rename from intra/src/res/sprites/decoration/rail_NEXUS.png rename to intra/assets/images/sprites/decoration/rail_NEXUS.png diff --git a/intra/src/res/sprites/decoration/red_cave_left.png b/intra/assets/images/sprites/decoration/red_cave_left.png similarity index 100% rename from intra/src/res/sprites/decoration/red_cave_left.png rename to intra/assets/images/sprites/decoration/red_cave_left.png diff --git a/intra/src/res/sprites/decoration/scanlineoverlay.png b/intra/assets/images/sprites/decoration/scanlineoverlay.png similarity index 100% rename from intra/src/res/sprites/decoration/scanlineoverlay.png rename to intra/assets/images/sprites/decoration/scanlineoverlay.png diff --git a/intra/src/res/sprites/decoration/scanlineoverlay.xcf b/intra/assets/images/sprites/decoration/scanlineoverlay.xcf similarity index 100% rename from intra/src/res/sprites/decoration/scanlineoverlay.xcf rename to intra/assets/images/sprites/decoration/scanlineoverlay.xcf diff --git a/intra/src/res/sprites/decoration/shadows/28x10_shadow.png b/intra/assets/images/sprites/decoration/shadows/28x10_shadow.png similarity index 100% rename from intra/src/res/sprites/decoration/shadows/28x10_shadow.png rename to intra/assets/images/sprites/decoration/shadows/28x10_shadow.png diff --git a/intra/src/res/sprites/decoration/shadows/8x8_shadow.png b/intra/assets/images/sprites/decoration/shadows/8x8_shadow.png similarity index 100% rename from intra/src/res/sprites/decoration/shadows/8x8_shadow.png rename to intra/assets/images/sprites/decoration/shadows/8x8_shadow.png diff --git a/intra/src/res/sprites/decoration/whirlpool.png b/intra/assets/images/sprites/decoration/whirlpool.png similarity index 100% rename from intra/src/res/sprites/decoration/whirlpool.png rename to intra/assets/images/sprites/decoration/whirlpool.png diff --git a/intra/src/res/sprites/decoration/whiteportal.png b/intra/assets/images/sprites/decoration/whiteportal.png similarity index 100% rename from intra/src/res/sprites/decoration/whiteportal.png rename to intra/assets/images/sprites/decoration/whiteportal.png diff --git a/intra/src/res/sprites/ending/cast.png b/intra/assets/images/sprites/ending/cast.png similarity index 100% rename from intra/src/res/sprites/ending/cast.png rename to intra/assets/images/sprites/ending/cast.png diff --git a/intra/src/res/sprites/ending/cast.xcf b/intra/assets/images/sprites/ending/cast.xcf similarity index 100% rename from intra/src/res/sprites/ending/cast.xcf rename to intra/assets/images/sprites/ending/cast.xcf diff --git a/intra/src/res/sprites/ending/go.png b/intra/assets/images/sprites/ending/go.png similarity index 100% rename from intra/src/res/sprites/ending/go.png rename to intra/assets/images/sprites/ending/go.png diff --git a/intra/src/res/sprites/ending/screenies.png b/intra/assets/images/sprites/ending/screenies.png similarity index 100% rename from intra/src/res/sprites/ending/screenies.png rename to intra/assets/images/sprites/ending/screenies.png diff --git a/intra/src/res/sprites/enemies/annoyer.png b/intra/assets/images/sprites/enemies/annoyer.png similarity index 100% rename from intra/src/res/sprites/enemies/annoyer.png rename to intra/assets/images/sprites/enemies/annoyer.png diff --git a/intra/src/res/sprites/enemies/apartment/dash_trap.png b/intra/assets/images/sprites/enemies/apartment/dash_trap.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/dash_trap.png rename to intra/assets/images/sprites/enemies/apartment/dash_trap.png diff --git a/intra/src/res/sprites/enemies/apartment/gas_guy.png b/intra/assets/images/sprites/enemies/apartment/gas_guy.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/gas_guy.png rename to intra/assets/images/sprites/enemies/apartment/gas_guy.png diff --git a/intra/src/res/sprites/enemies/apartment/gas_guy_cloud.png b/intra/assets/images/sprites/enemies/apartment/gas_guy_cloud.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/gas_guy_cloud.png rename to intra/assets/images/sprites/enemies/apartment/gas_guy_cloud.png diff --git a/intra/src/res/sprites/enemies/apartment/rat.png b/intra/assets/images/sprites/enemies/apartment/rat.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/rat.png rename to intra/assets/images/sprites/enemies/apartment/rat.png diff --git a/intra/src/res/sprites/enemies/apartment/silverfish.png b/intra/assets/images/sprites/enemies/apartment/silverfish.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/silverfish.png rename to intra/assets/images/sprites/enemies/apartment/silverfish.png diff --git a/intra/src/res/sprites/enemies/apartment/splitboss.png b/intra/assets/images/sprites/enemies/apartment/splitboss.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/splitboss.png rename to intra/assets/images/sprites/enemies/apartment/splitboss.png diff --git a/intra/src/res/sprites/enemies/apartment/splitboss_fireball.png b/intra/assets/images/sprites/enemies/apartment/splitboss_fireball.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/splitboss_fireball.png rename to intra/assets/images/sprites/enemies/apartment/splitboss_fireball.png diff --git a/intra/src/res/sprites/enemies/apartment/splitboss_old.png b/intra/assets/images/sprites/enemies/apartment/splitboss_old.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/splitboss_old.png rename to intra/assets/images/sprites/enemies/apartment/splitboss_old.png diff --git a/intra/src/res/sprites/enemies/apartment/teleport_guy.png b/intra/assets/images/sprites/enemies/apartment/teleport_guy.png similarity index 100% rename from intra/src/res/sprites/enemies/apartment/teleport_guy.png rename to intra/assets/images/sprites/enemies/apartment/teleport_guy.png diff --git a/intra/src/res/sprites/enemies/bedroom/slime_goo.png b/intra/assets/images/sprites/enemies/bedroom/slime_goo.png similarity index 100% rename from intra/src/res/sprites/enemies/bedroom/slime_goo.png rename to intra/assets/images/sprites/enemies/bedroom/slime_goo.png diff --git a/intra/src/res/sprites/enemies/circus/arthur.png b/intra/assets/images/sprites/enemies/circus/arthur.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/arthur.png rename to intra/assets/images/sprites/enemies/circus/arthur.png diff --git a/intra/src/res/sprites/enemies/circus/arthur_javiera.png b/intra/assets/images/sprites/enemies/circus/arthur_javiera.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/arthur_javiera.png rename to intra/assets/images/sprites/enemies/circus/arthur_javiera.png diff --git a/intra/src/res/sprites/enemies/circus/contort_big.png b/intra/assets/images/sprites/enemies/circus/contort_big.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/contort_big.png rename to intra/assets/images/sprites/enemies/circus/contort_big.png diff --git a/intra/src/res/sprites/enemies/circus/contort_small.png b/intra/assets/images/sprites/enemies/circus/contort_small.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/contort_small.png rename to intra/assets/images/sprites/enemies/circus/contort_small.png diff --git a/intra/src/res/sprites/enemies/circus/fire_pillar.png b/intra/assets/images/sprites/enemies/circus/fire_pillar.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/fire_pillar.png rename to intra/assets/images/sprites/enemies/circus/fire_pillar.png diff --git a/intra/src/res/sprites/enemies/circus/fire_pillar_base.png b/intra/assets/images/sprites/enemies/circus/fire_pillar_base.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/fire_pillar_base.png rename to intra/assets/images/sprites/enemies/circus/fire_pillar_base.png diff --git a/intra/src/res/sprites/enemies/circus/javiera.png b/intra/assets/images/sprites/enemies/circus/javiera.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/javiera.png rename to intra/assets/images/sprites/enemies/circus/javiera.png diff --git a/intra/src/res/sprites/enemies/circus/javiera_juggle.png b/intra/assets/images/sprites/enemies/circus/javiera_juggle.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/javiera_juggle.png rename to intra/assets/images/sprites/enemies/circus/javiera_juggle.png diff --git a/intra/src/res/sprites/enemies/circus/lion.png b/intra/assets/images/sprites/enemies/circus/lion.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/lion.png rename to intra/assets/images/sprites/enemies/circus/lion.png diff --git a/intra/src/res/sprites/enemies/circus/lion_fireballs.png b/intra/assets/images/sprites/enemies/circus/lion_fireballs.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/lion_fireballs.png rename to intra/assets/images/sprites/enemies/circus/lion_fireballs.png diff --git a/intra/src/res/sprites/enemies/circus/shockwave.png b/intra/assets/images/sprites/enemies/circus/shockwave.png similarity index 100% rename from intra/src/res/sprites/enemies/circus/shockwave.png rename to intra/assets/images/sprites/enemies/circus/shockwave.png diff --git a/intra/src/res/sprites/enemies/crowd/dog.png b/intra/assets/images/sprites/enemies/crowd/dog.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/dog.png rename to intra/assets/images/sprites/enemies/crowd/dog.png diff --git a/intra/src/res/sprites/enemies/crowd/f_rotator.png b/intra/assets/images/sprites/enemies/crowd/f_rotator.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_rotator.png rename to intra/assets/images/sprites/enemies/crowd/f_rotator.png diff --git a/intra/src/res/sprites/enemies/crowd/f_rotator_ball.png b/intra/assets/images/sprites/enemies/crowd/f_rotator_ball.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_rotator_ball.png rename to intra/assets/images/sprites/enemies/crowd/f_rotator_ball.png diff --git a/intra/src/res/sprites/enemies/crowd/f_wallboss_face.png b/intra/assets/images/sprites/enemies/crowd/f_wallboss_face.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_wallboss_face.png rename to intra/assets/images/sprites/enemies/crowd/f_wallboss_face.png diff --git a/intra/src/res/sprites/enemies/crowd/f_wallboss_face_old.png b/intra/assets/images/sprites/enemies/crowd/f_wallboss_face_old.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_wallboss_face_old.png rename to intra/assets/images/sprites/enemies/crowd/f_wallboss_face_old.png diff --git a/intra/src/res/sprites/enemies/crowd/f_wallboss_l_hand.png b/intra/assets/images/sprites/enemies/crowd/f_wallboss_l_hand.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_wallboss_l_hand.png rename to intra/assets/images/sprites/enemies/crowd/f_wallboss_l_hand.png diff --git a/intra/src/res/sprites/enemies/crowd/f_wallboss_l_hand_old.png b/intra/assets/images/sprites/enemies/crowd/f_wallboss_l_hand_old.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/f_wallboss_l_hand_old.png rename to intra/assets/images/sprites/enemies/crowd/f_wallboss_l_hand_old.png diff --git a/intra/src/res/sprites/enemies/crowd/frog.png b/intra/assets/images/sprites/enemies/crowd/frog.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/frog.png rename to intra/assets/images/sprites/enemies/crowd/frog.png diff --git a/intra/src/res/sprites/enemies/crowd/frog_bullet.png b/intra/assets/images/sprites/enemies/crowd/frog_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/frog_bullet.png rename to intra/assets/images/sprites/enemies/crowd/frog_bullet.png diff --git a/intra/src/res/sprites/enemies/crowd/person.png b/intra/assets/images/sprites/enemies/crowd/person.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/person.png rename to intra/assets/images/sprites/enemies/crowd/person.png diff --git a/intra/src/res/sprites/enemies/crowd/spike_roller.png b/intra/assets/images/sprites/enemies/crowd/spike_roller.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/spike_roller.png rename to intra/assets/images/sprites/enemies/crowd/spike_roller.png diff --git a/intra/src/res/sprites/enemies/crowd/spike_roller_horizontal.png b/intra/assets/images/sprites/enemies/crowd/spike_roller_horizontal.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/spike_roller_horizontal.png rename to intra/assets/images/sprites/enemies/crowd/spike_roller_horizontal.png diff --git a/intra/src/res/sprites/enemies/crowd/spike_roller_horizontal_shadow.png b/intra/assets/images/sprites/enemies/crowd/spike_roller_horizontal_shadow.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/spike_roller_horizontal_shadow.png rename to intra/assets/images/sprites/enemies/crowd/spike_roller_horizontal_shadow.png diff --git a/intra/src/res/sprites/enemies/crowd/spike_roller_shadow.png b/intra/assets/images/sprites/enemies/crowd/spike_roller_shadow.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/spike_roller_shadow.png rename to intra/assets/images/sprites/enemies/crowd/spike_roller_shadow.png diff --git a/intra/src/res/sprites/enemies/crowd/wallboss_bullet.png b/intra/assets/images/sprites/enemies/crowd/wallboss_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/wallboss_bullet.png rename to intra/assets/images/sprites/enemies/crowd/wallboss_bullet.png diff --git a/intra/src/res/sprites/enemies/crowd/wallboss_laser.png b/intra/assets/images/sprites/enemies/crowd/wallboss_laser.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/wallboss_laser.png rename to intra/assets/images/sprites/enemies/crowd/wallboss_laser.png diff --git a/intra/src/res/sprites/enemies/crowd/wallboss_wall.png b/intra/assets/images/sprites/enemies/crowd/wallboss_wall.png similarity index 100% rename from intra/src/res/sprites/enemies/crowd/wallboss_wall.png rename to intra/assets/images/sprites/enemies/crowd/wallboss_wall.png diff --git a/intra/src/res/sprites/enemies/enemy_explode_2.png b/intra/assets/images/sprites/enemies/enemy_explode_2.png similarity index 100% rename from intra/src/res/sprites/enemies/enemy_explode_2.png rename to intra/assets/images/sprites/enemies/enemy_explode_2.png diff --git a/intra/src/res/sprites/enemies/etc/briar_arm_left.png b/intra/assets/images/sprites/enemies/etc/briar_arm_left.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_arm_left.png rename to intra/assets/images/sprites/enemies/etc/briar_arm_left.png diff --git a/intra/src/res/sprites/enemies/etc/briar_arm_right.png b/intra/assets/images/sprites/enemies/etc/briar_arm_right.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_arm_right.png rename to intra/assets/images/sprites/enemies/etc/briar_arm_right.png diff --git a/intra/src/res/sprites/enemies/etc/briar_blue_thorn.png b/intra/assets/images/sprites/enemies/etc/briar_blue_thorn.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_blue_thorn.png rename to intra/assets/images/sprites/enemies/etc/briar_blue_thorn.png diff --git a/intra/src/res/sprites/enemies/etc/briar_blue_thorn_old.png b/intra/assets/images/sprites/enemies/etc/briar_blue_thorn_old.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_blue_thorn_old.png rename to intra/assets/images/sprites/enemies/etc/briar_blue_thorn_old.png diff --git a/intra/src/res/sprites/enemies/etc/briar_body.png b/intra/assets/images/sprites/enemies/etc/briar_body.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_body.png rename to intra/assets/images/sprites/enemies/etc/briar_body.png diff --git a/intra/src/res/sprites/enemies/etc/briar_core.png b/intra/assets/images/sprites/enemies/etc/briar_core.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_core.png rename to intra/assets/images/sprites/enemies/etc/briar_core.png diff --git a/intra/src/res/sprites/enemies/etc/briar_dust_explosion.png b/intra/assets/images/sprites/enemies/etc/briar_dust_explosion.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_dust_explosion.png rename to intra/assets/images/sprites/enemies/etc/briar_dust_explosion.png diff --git a/intra/src/res/sprites/enemies/etc/briar_fire_eye.png b/intra/assets/images/sprites/enemies/etc/briar_fire_eye.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_fire_eye.png rename to intra/assets/images/sprites/enemies/etc/briar_fire_eye.png diff --git a/intra/src/res/sprites/enemies/etc/briar_ground_thorn.png b/intra/assets/images/sprites/enemies/etc/briar_ground_thorn.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_ground_thorn.png rename to intra/assets/images/sprites/enemies/etc/briar_ground_thorn.png diff --git a/intra/src/res/sprites/enemies/etc/briar_happy_thorn.png b/intra/assets/images/sprites/enemies/etc/briar_happy_thorn.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_happy_thorn.png rename to intra/assets/images/sprites/enemies/etc/briar_happy_thorn.png diff --git a/intra/src/res/sprites/enemies/etc/briar_ice_crystal.png b/intra/assets/images/sprites/enemies/etc/briar_ice_crystal.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_ice_crystal.png rename to intra/assets/images/sprites/enemies/etc/briar_ice_crystal.png diff --git a/intra/src/res/sprites/enemies/etc/briar_ice_explosion.png b/intra/assets/images/sprites/enemies/etc/briar_ice_explosion.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_ice_explosion.png rename to intra/assets/images/sprites/enemies/etc/briar_ice_explosion.png diff --git a/intra/src/res/sprites/enemies/etc/briar_mist.png b/intra/assets/images/sprites/enemies/etc/briar_mist.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_mist.png rename to intra/assets/images/sprites/enemies/etc/briar_mist.png diff --git a/intra/src/res/sprites/enemies/etc/briar_overhang.png b/intra/assets/images/sprites/enemies/etc/briar_overhang.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_overhang.png rename to intra/assets/images/sprites/enemies/etc/briar_overhang.png diff --git a/intra/src/res/sprites/enemies/etc/briar_thorn_bullet.png b/intra/assets/images/sprites/enemies/etc/briar_thorn_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/briar_thorn_bullet.png rename to intra/assets/images/sprites/enemies/etc/briar_thorn_bullet.png diff --git a/intra/src/res/sprites/enemies/etc/chaser.png b/intra/assets/images/sprites/enemies/etc/chaser.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/chaser.png rename to intra/assets/images/sprites/enemies/etc/chaser.png diff --git a/intra/src/res/sprites/enemies/etc/sage_attacks.png b/intra/assets/images/sprites/enemies/etc/sage_attacks.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/sage_attacks.png rename to intra/assets/images/sprites/enemies/etc/sage_attacks.png diff --git a/intra/src/res/sprites/enemies/etc/sage_boss.png b/intra/assets/images/sprites/enemies/etc/sage_boss.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/sage_boss.png rename to intra/assets/images/sprites/enemies/etc/sage_boss.png diff --git a/intra/src/res/sprites/enemies/etc/sage_fight_long_dust.png b/intra/assets/images/sprites/enemies/etc/sage_fight_long_dust.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/sage_fight_long_dust.png rename to intra/assets/images/sprites/enemies/etc/sage_fight_long_dust.png diff --git a/intra/src/res/sprites/enemies/etc/space_face.png b/intra/assets/images/sprites/enemies/etc/space_face.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/space_face.png rename to intra/assets/images/sprites/enemies/etc/space_face.png diff --git a/intra/src/res/sprites/enemies/etc/space_face_eyes.png b/intra/assets/images/sprites/enemies/etc/space_face_eyes.png similarity index 100% rename from intra/src/res/sprites/enemies/etc/space_face_eyes.png rename to intra/assets/images/sprites/enemies/etc/space_face_eyes.png diff --git a/intra/src/res/sprites/enemies/four_shooter.png b/intra/assets/images/sprites/enemies/four_shooter.png similarity index 100% rename from intra/src/res/sprites/enemies/four_shooter.png rename to intra/assets/images/sprites/enemies/four_shooter.png diff --git a/intra/src/res/sprites/enemies/hotel/burst_plant.png b/intra/assets/images/sprites/enemies/hotel/burst_plant.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/burst_plant.png rename to intra/assets/images/sprites/enemies/hotel/burst_plant.png diff --git a/intra/src/res/sprites/enemies/hotel/burst_plant_bullet.png b/intra/assets/images/sprites/enemies/hotel/burst_plant_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/burst_plant_bullet.png rename to intra/assets/images/sprites/enemies/hotel/burst_plant_bullet.png diff --git a/intra/src/res/sprites/enemies/hotel/dustmaid.png b/intra/assets/images/sprites/enemies/hotel/dustmaid.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/dustmaid.png rename to intra/assets/images/sprites/enemies/hotel/dustmaid.png diff --git a/intra/src/res/sprites/enemies/hotel/eye_boss_bullet.png b/intra/assets/images/sprites/enemies/hotel/eye_boss_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/eye_boss_bullet.png rename to intra/assets/images/sprites/enemies/hotel/eye_boss_bullet.png diff --git a/intra/src/res/sprites/enemies/hotel/eye_boss_splash.png b/intra/assets/images/sprites/enemies/hotel/eye_boss_splash.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/eye_boss_splash.png rename to intra/assets/images/sprites/enemies/hotel/eye_boss_splash.png diff --git a/intra/src/res/sprites/enemies/hotel/eye_boss_water.png b/intra/assets/images/sprites/enemies/hotel/eye_boss_water.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/eye_boss_water.png rename to intra/assets/images/sprites/enemies/hotel/eye_boss_water.png diff --git a/intra/src/res/sprites/enemies/hotel/steam.png b/intra/assets/images/sprites/enemies/hotel/steam.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/steam.png rename to intra/assets/images/sprites/enemies/hotel/steam.png diff --git a/intra/src/res/sprites/enemies/hotel/steam_pipe.png b/intra/assets/images/sprites/enemies/hotel/steam_pipe.png similarity index 100% rename from intra/src/res/sprites/enemies/hotel/steam_pipe.png rename to intra/assets/images/sprites/enemies/hotel/steam_pipe.png diff --git a/intra/src/res/sprites/enemies/light_orb.png b/intra/assets/images/sprites/enemies/light_orb.png similarity index 100% rename from intra/src/res/sprites/enemies/light_orb.png rename to intra/assets/images/sprites/enemies/light_orb.png diff --git a/intra/src/res/sprites/enemies/mover.png b/intra/assets/images/sprites/enemies/mover.png similarity index 100% rename from intra/src/res/sprites/enemies/mover.png rename to intra/assets/images/sprites/enemies/mover.png diff --git a/intra/src/res/sprites/enemies/old_sprites/enemy_explode_1.png b/intra/assets/images/sprites/enemies/old_sprites/enemy_explode_1.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/enemy_explode_1.png rename to intra/assets/images/sprites/enemies/old_sprites/enemy_explode_1.png diff --git a/intra/src/res/sprites/enemies/old_sprites/old_annoyer.png b/intra/assets/images/sprites/enemies/old_sprites/old_annoyer.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/old_annoyer.png rename to intra/assets/images/sprites/enemies/old_sprites/old_annoyer.png diff --git a/intra/src/res/sprites/enemies/old_sprites/old_shieldy.png b/intra/assets/images/sprites/enemies/old_sprites/old_shieldy.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/old_shieldy.png rename to intra/assets/images/sprites/enemies/old_sprites/old_shieldy.png diff --git a/intra/src/res/sprites/enemies/old_sprites/old_slime.png b/intra/assets/images/sprites/enemies/old_sprites/old_slime.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/old_slime.png rename to intra/assets/images/sprites/enemies/old_sprites/old_slime.png diff --git a/intra/src/res/sprites/enemies/old_sprites/red_boss_old.png b/intra/assets/images/sprites/enemies/old_sprites/red_boss_old.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/red_boss_old.png rename to intra/assets/images/sprites/enemies/old_sprites/red_boss_old.png diff --git a/intra/src/res/sprites/enemies/old_sprites/redwalker_old.png b/intra/assets/images/sprites/enemies/old_sprites/redwalker_old.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/redwalker_old.png rename to intra/assets/images/sprites/enemies/old_sprites/redwalker_old.png diff --git a/intra/src/res/sprites/enemies/old_sprites/slime_old.png b/intra/assets/images/sprites/enemies/old_sprites/slime_old.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/slime_old.png rename to intra/assets/images/sprites/enemies/old_sprites/slime_old.png diff --git a/intra/src/res/sprites/enemies/old_sprites/sun_guy_old.png b/intra/assets/images/sprites/enemies/old_sprites/sun_guy_old.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/sun_guy_old.png rename to intra/assets/images/sprites/enemies/old_sprites/sun_guy_old.png diff --git a/intra/src/res/sprites/enemies/old_sprites/sun_guy_wave_old.png b/intra/assets/images/sprites/enemies/old_sprites/sun_guy_wave_old.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/sun_guy_wave_old.png rename to intra/assets/images/sprites/enemies/old_sprites/sun_guy_wave_old.png diff --git a/intra/src/res/sprites/enemies/old_sprites/wall_laser.png b/intra/assets/images/sprites/enemies/old_sprites/wall_laser.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/wall_laser.png rename to intra/assets/images/sprites/enemies/old_sprites/wall_laser.png diff --git a/intra/src/res/sprites/enemies/old_sprites/wall_laser_laser.png b/intra/assets/images/sprites/enemies/old_sprites/wall_laser_laser.png similarity index 100% rename from intra/src/res/sprites/enemies/old_sprites/wall_laser_laser.png rename to intra/assets/images/sprites/enemies/old_sprites/wall_laser_laser.png diff --git a/intra/src/res/sprites/enemies/on_off_laser.png b/intra/assets/images/sprites/enemies/on_off_laser.png similarity index 100% rename from intra/src/res/sprites/enemies/on_off_laser.png rename to intra/assets/images/sprites/enemies/on_off_laser.png diff --git a/intra/src/res/sprites/enemies/pew_laser.png b/intra/assets/images/sprites/enemies/pew_laser.png similarity index 100% rename from intra/src/res/sprites/enemies/pew_laser.png rename to intra/assets/images/sprites/enemies/pew_laser.png diff --git a/intra/src/res/sprites/enemies/pew_laser_bullet.png b/intra/assets/images/sprites/enemies/pew_laser_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/pew_laser_bullet.png rename to intra/assets/images/sprites/enemies/pew_laser_bullet.png diff --git a/intra/src/res/sprites/enemies/red_boss.png b/intra/assets/images/sprites/enemies/red_boss.png similarity index 100% rename from intra/src/res/sprites/enemies/red_boss.png rename to intra/assets/images/sprites/enemies/red_boss.png diff --git a/intra/src/res/sprites/enemies/redcave/f_four_shooter.png b/intra/assets/images/sprites/enemies/redcave/f_four_shooter.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_four_shooter.png rename to intra/assets/images/sprites/enemies/redcave/f_four_shooter.png diff --git a/intra/src/res/sprites/enemies/redcave/f_four_shooter_bullet.png b/intra/assets/images/sprites/enemies/redcave/f_four_shooter_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_four_shooter_bullet.png rename to intra/assets/images/sprites/enemies/redcave/f_four_shooter_bullet.png diff --git a/intra/src/res/sprites/enemies/redcave/f_mover.png b/intra/assets/images/sprites/enemies/redcave/f_mover.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_mover.png rename to intra/assets/images/sprites/enemies/redcave/f_mover.png diff --git a/intra/src/res/sprites/enemies/redcave/f_mover2.png b/intra/assets/images/sprites/enemies/redcave/f_mover2.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_mover2.png rename to intra/assets/images/sprites/enemies/redcave/f_mover2.png diff --git a/intra/src/res/sprites/enemies/redcave/f_mover_old.png b/intra/assets/images/sprites/enemies/redcave/f_mover_old.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_mover_old.png rename to intra/assets/images/sprites/enemies/redcave/f_mover_old.png diff --git a/intra/src/res/sprites/enemies/redcave/f_on_off_h.png b/intra/assets/images/sprites/enemies/redcave/f_on_off_h.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_on_off_h.png rename to intra/assets/images/sprites/enemies/redcave/f_on_off_h.png diff --git a/intra/src/res/sprites/enemies/redcave/f_on_off_v.png b/intra/assets/images/sprites/enemies/redcave/f_on_off_v.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_on_off_v.png rename to intra/assets/images/sprites/enemies/redcave/f_on_off_v.png diff --git a/intra/src/res/sprites/enemies/redcave/f_slasher.png b/intra/assets/images/sprites/enemies/redcave/f_slasher.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_slasher.png rename to intra/assets/images/sprites/enemies/redcave/f_slasher.png diff --git a/intra/src/res/sprites/enemies/redcave/f_slasher2.png b/intra/assets/images/sprites/enemies/redcave/f_slasher2.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_slasher2.png rename to intra/assets/images/sprites/enemies/redcave/f_slasher2.png diff --git a/intra/src/res/sprites/enemies/redcave/f_slasher_long.png b/intra/assets/images/sprites/enemies/redcave/f_slasher_long.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_slasher_long.png rename to intra/assets/images/sprites/enemies/redcave/f_slasher_long.png diff --git a/intra/src/res/sprites/enemies/redcave/f_slasher_old.png b/intra/assets/images/sprites/enemies/redcave/f_slasher_old.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_slasher_old.png rename to intra/assets/images/sprites/enemies/redcave/f_slasher_old.png diff --git a/intra/src/res/sprites/enemies/redcave/f_slasher_wide.png b/intra/assets/images/sprites/enemies/redcave/f_slasher_wide.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/f_slasher_wide.png rename to intra/assets/images/sprites/enemies/redcave/f_slasher_wide.png diff --git a/intra/src/res/sprites/enemies/redcave/on_off_shooter.png b/intra/assets/images/sprites/enemies/redcave/on_off_shooter.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/on_off_shooter.png rename to intra/assets/images/sprites/enemies/redcave/on_off_shooter.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_big_wave.png b/intra/assets/images/sprites/enemies/redcave/red_boss_big_wave.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_big_wave.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_big_wave.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_bullet.png b/intra/assets/images/sprites/enemies/redcave/red_boss_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_bullet.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_bullet.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_ripple.png b/intra/assets/images/sprites/enemies/redcave/red_boss_ripple.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_ripple.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_ripple.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_small_wave.png b/intra/assets/images/sprites/enemies/redcave/red_boss_small_wave.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_small_wave.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_small_wave.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_tentacle.png b/intra/assets/images/sprites/enemies/redcave/red_boss_tentacle.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_tentacle.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_tentacle.png diff --git a/intra/src/res/sprites/enemies/redcave/red_boss_warning.png b/intra/assets/images/sprites/enemies/redcave/red_boss_warning.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_boss_warning.png rename to intra/assets/images/sprites/enemies/redcave/red_boss_warning.png diff --git a/intra/src/res/sprites/enemies/redcave/red_pillar.png b/intra/assets/images/sprites/enemies/redcave/red_pillar.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_pillar.png rename to intra/assets/images/sprites/enemies/redcave/red_pillar.png diff --git a/intra/src/res/sprites/enemies/redcave/red_pillar_old.png b/intra/assets/images/sprites/enemies/redcave/red_pillar_old.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_pillar_old.png rename to intra/assets/images/sprites/enemies/redcave/red_pillar_old.png diff --git a/intra/src/res/sprites/enemies/redcave/red_pillar_ripple.png b/intra/assets/images/sprites/enemies/redcave/red_pillar_ripple.png similarity index 100% rename from intra/src/res/sprites/enemies/redcave/red_pillar_ripple.png rename to intra/assets/images/sprites/enemies/redcave/red_pillar_ripple.png diff --git a/intra/src/res/sprites/enemies/redwalker.png b/intra/assets/images/sprites/enemies/redwalker.png similarity index 100% rename from intra/src/res/sprites/enemies/redwalker.png rename to intra/assets/images/sprites/enemies/redwalker.png diff --git a/intra/src/res/sprites/enemies/shieldy.png b/intra/assets/images/sprites/enemies/shieldy.png similarity index 100% rename from intra/src/res/sprites/enemies/shieldy.png rename to intra/assets/images/sprites/enemies/shieldy.png diff --git a/intra/src/res/sprites/enemies/slasher.png b/intra/assets/images/sprites/enemies/slasher.png similarity index 100% rename from intra/src/res/sprites/enemies/slasher.png rename to intra/assets/images/sprites/enemies/slasher.png diff --git a/intra/src/res/sprites/enemies/slime.png b/intra/assets/images/sprites/enemies/slime.png similarity index 100% rename from intra/src/res/sprites/enemies/slime.png rename to intra/assets/images/sprites/enemies/slime.png diff --git a/intra/src/res/sprites/enemies/slime_bullet.png b/intra/assets/images/sprites/enemies/slime_bullet.png similarity index 100% rename from intra/src/res/sprites/enemies/slime_bullet.png rename to intra/assets/images/sprites/enemies/slime_bullet.png diff --git a/intra/src/res/sprites/enemies/suburb/suburb_killer.png b/intra/assets/images/sprites/enemies/suburb/suburb_killer.png similarity index 100% rename from intra/src/res/sprites/enemies/suburb/suburb_killer.png rename to intra/assets/images/sprites/enemies/suburb/suburb_killer.png diff --git a/intra/src/res/sprites/enemies/suburb/suburb_walker.png b/intra/assets/images/sprites/enemies/suburb/suburb_walker.png similarity index 100% rename from intra/src/res/sprites/enemies/suburb/suburb_walker.png rename to intra/assets/images/sprites/enemies/suburb/suburb_walker.png diff --git a/intra/src/res/sprites/enemies/sun_guy.png b/intra/assets/images/sprites/enemies/sun_guy.png similarity index 100% rename from intra/src/res/sprites/enemies/sun_guy.png rename to intra/assets/images/sprites/enemies/sun_guy.png diff --git a/intra/src/res/sprites/enemies/sun_guy_wave.png b/intra/assets/images/sprites/enemies/sun_guy_wave.png similarity index 100% rename from intra/src/res/sprites/enemies/sun_guy_wave.png rename to intra/assets/images/sprites/enemies/sun_guy_wave.png diff --git a/intra/src/res/sprites/enemies/twowalker.png b/intra/assets/images/sprites/enemies/twowalker.png similarity index 100% rename from intra/src/res/sprites/enemies/twowalker.png rename to intra/assets/images/sprites/enemies/twowalker.png diff --git a/intra/src/res/sprites/gadgets/big_door.png b/intra/assets/images/sprites/gadgets/big_door.png similarity index 100% rename from intra/src/res/sprites/gadgets/big_door.png rename to intra/assets/images/sprites/gadgets/big_door.png diff --git a/intra/src/res/sprites/gadgets/big_keys.png b/intra/assets/images/sprites/gadgets/big_keys.png similarity index 100% rename from intra/src/res/sprites/gadgets/big_keys.png rename to intra/assets/images/sprites/gadgets/big_keys.png diff --git a/intra/src/res/sprites/gadgets/biofilm.png b/intra/assets/images/sprites/gadgets/biofilm.png similarity index 100% rename from intra/src/res/sprites/gadgets/biofilm.png rename to intra/assets/images/sprites/gadgets/biofilm.png diff --git a/intra/src/res/sprites/gadgets/buttons.png b/intra/assets/images/sprites/gadgets/buttons.png similarity index 100% rename from intra/src/res/sprites/gadgets/buttons.png rename to intra/assets/images/sprites/gadgets/buttons.png diff --git a/intra/src/res/sprites/gadgets/challenge_gate.png b/intra/assets/images/sprites/gadgets/challenge_gate.png similarity index 100% rename from intra/src/res/sprites/gadgets/challenge_gate.png rename to intra/assets/images/sprites/gadgets/challenge_gate.png diff --git a/intra/src/res/sprites/gadgets/checkpoint.png b/intra/assets/images/sprites/gadgets/checkpoint.png similarity index 100% rename from intra/src/res/sprites/gadgets/checkpoint.png rename to intra/assets/images/sprites/gadgets/checkpoint.png diff --git a/intra/src/res/sprites/gadgets/console.png b/intra/assets/images/sprites/gadgets/console.png similarity index 100% rename from intra/src/res/sprites/gadgets/console.png rename to intra/assets/images/sprites/gadgets/console.png diff --git a/intra/src/res/sprites/gadgets/crackedtiles.png b/intra/assets/images/sprites/gadgets/crackedtiles.png similarity index 100% rename from intra/src/res/sprites/gadgets/crackedtiles.png rename to intra/assets/images/sprites/gadgets/crackedtiles.png diff --git a/intra/src/res/sprites/gadgets/dash_pads.png b/intra/assets/images/sprites/gadgets/dash_pads.png similarity index 100% rename from intra/src/res/sprites/gadgets/dash_pads.png rename to intra/assets/images/sprites/gadgets/dash_pads.png diff --git a/intra/src/res/sprites/gadgets/doors.png b/intra/assets/images/sprites/gadgets/doors.png similarity index 100% rename from intra/src/res/sprites/gadgets/doors.png rename to intra/assets/images/sprites/gadgets/doors.png diff --git a/intra/src/res/sprites/gadgets/dust.png b/intra/assets/images/sprites/gadgets/dust.png similarity index 100% rename from intra/src/res/sprites/gadgets/dust.png rename to intra/assets/images/sprites/gadgets/dust.png diff --git a/intra/src/res/sprites/gadgets/elevator.png b/intra/assets/images/sprites/gadgets/elevator.png similarity index 100% rename from intra/src/res/sprites/gadgets/elevator.png rename to intra/assets/images/sprites/gadgets/elevator.png diff --git a/intra/src/res/sprites/gadgets/gate_green.png b/intra/assets/images/sprites/gadgets/gate_green.png similarity index 100% rename from intra/src/res/sprites/gadgets/gate_green.png rename to intra/assets/images/sprites/gadgets/gate_green.png diff --git a/intra/src/res/sprites/gadgets/gates.png b/intra/assets/images/sprites/gadgets/gates.png similarity index 100% rename from intra/src/res/sprites/gadgets/gates.png rename to intra/assets/images/sprites/gadgets/gates.png diff --git a/intra/src/res/sprites/gadgets/growth_gate.png b/intra/assets/images/sprites/gadgets/growth_gate.png similarity index 100% rename from intra/src/res/sprites/gadgets/growth_gate.png rename to intra/assets/images/sprites/gadgets/growth_gate.png diff --git a/intra/src/res/sprites/gadgets/hole.png b/intra/assets/images/sprites/gadgets/hole.png similarity index 100% rename from intra/src/res/sprites/gadgets/hole.png rename to intra/assets/images/sprites/gadgets/hole.png diff --git a/intra/src/res/sprites/gadgets/key.png b/intra/assets/images/sprites/gadgets/key.png similarity index 100% rename from intra/src/res/sprites/gadgets/key.png rename to intra/assets/images/sprites/gadgets/key.png diff --git a/intra/src/res/sprites/gadgets/key_green.png b/intra/assets/images/sprites/gadgets/key_green.png similarity index 100% rename from intra/src/res/sprites/gadgets/key_green.png rename to intra/assets/images/sprites/gadgets/key_green.png diff --git a/intra/src/res/sprites/gadgets/key_sparkle.png b/intra/assets/images/sprites/gadgets/key_sparkle.png similarity index 100% rename from intra/src/res/sprites/gadgets/key_sparkle.png rename to intra/assets/images/sprites/gadgets/key_sparkle.png diff --git a/intra/src/res/sprites/gadgets/keyhole.png b/intra/assets/images/sprites/gadgets/keyhole.png similarity index 100% rename from intra/src/res/sprites/gadgets/keyhole.png rename to intra/assets/images/sprites/gadgets/keyhole.png diff --git a/intra/src/res/sprites/gadgets/moving_platform.png b/intra/assets/images/sprites/gadgets/moving_platform.png similarity index 100% rename from intra/src/res/sprites/gadgets/moving_platform.png rename to intra/assets/images/sprites/gadgets/moving_platform.png diff --git a/intra/src/res/sprites/gadgets/moving_platform_poof.png b/intra/assets/images/sprites/gadgets/moving_platform_poof.png similarity index 100% rename from intra/src/res/sprites/gadgets/moving_platform_poof.png rename to intra/assets/images/sprites/gadgets/moving_platform_poof.png diff --git a/intra/src/res/sprites/gadgets/nexus_door.png b/intra/assets/images/sprites/gadgets/nexus_door.png similarity index 100% rename from intra/src/res/sprites/gadgets/nexus_door.png rename to intra/assets/images/sprites/gadgets/nexus_door.png diff --git a/intra/src/res/sprites/gadgets/nexus_pad.png b/intra/assets/images/sprites/gadgets/nexus_pad.png similarity index 100% rename from intra/src/res/sprites/gadgets/nexus_pad.png rename to intra/assets/images/sprites/gadgets/nexus_pad.png diff --git a/intra/src/res/sprites/gadgets/pillar_switch.png b/intra/assets/images/sprites/gadgets/pillar_switch.png similarity index 100% rename from intra/src/res/sprites/gadgets/pillar_switch.png rename to intra/assets/images/sprites/gadgets/pillar_switch.png diff --git a/intra/src/res/sprites/gadgets/propelled.png b/intra/assets/images/sprites/gadgets/propelled.png similarity index 100% rename from intra/src/res/sprites/gadgets/propelled.png rename to intra/assets/images/sprites/gadgets/propelled.png diff --git a/intra/src/res/sprites/gadgets/pushyblocks.png b/intra/assets/images/sprites/gadgets/pushyblocks.png similarity index 100% rename from intra/src/res/sprites/gadgets/pushyblocks.png rename to intra/assets/images/sprites/gadgets/pushyblocks.png diff --git a/intra/src/res/sprites/gadgets/sludge.png b/intra/assets/images/sprites/gadgets/sludge.png similarity index 100% rename from intra/src/res/sprites/gadgets/sludge.png rename to intra/assets/images/sprites/gadgets/sludge.png diff --git a/intra/src/res/sprites/gadgets/solid_tile.png b/intra/assets/images/sprites/gadgets/solid_tile.png similarity index 100% rename from intra/src/res/sprites/gadgets/solid_tile.png rename to intra/assets/images/sprites/gadgets/solid_tile.png diff --git a/intra/src/res/sprites/gadgets/spring_pad.png b/intra/assets/images/sprites/gadgets/spring_pad.png similarity index 100% rename from intra/src/res/sprites/gadgets/spring_pad.png rename to intra/assets/images/sprites/gadgets/spring_pad.png diff --git a/intra/src/res/sprites/gadgets/stop_marker.png b/intra/assets/images/sprites/gadgets/stop_marker.png similarity index 100% rename from intra/src/res/sprites/gadgets/stop_marker.png rename to intra/assets/images/sprites/gadgets/stop_marker.png diff --git a/intra/src/res/sprites/gadgets/treasureboxes.png b/intra/assets/images/sprites/gadgets/treasureboxes.png similarity index 100% rename from intra/src/res/sprites/gadgets/treasureboxes.png rename to intra/assets/images/sprites/gadgets/treasureboxes.png diff --git a/intra/src/res/sprites/gadgets/whirlpool_door.png b/intra/assets/images/sprites/gadgets/whirlpool_door.png similarity index 100% rename from intra/src/res/sprites/gadgets/whirlpool_door.png rename to intra/assets/images/sprites/gadgets/whirlpool_door.png diff --git a/intra/src/res/sprites/gadgets/windmill_blade.png b/intra/assets/images/sprites/gadgets/windmill_blade.png similarity index 100% rename from intra/src/res/sprites/gadgets/windmill_blade.png rename to intra/assets/images/sprites/gadgets/windmill_blade.png diff --git a/intra/src/res/sprites/gadgets/windmill_inside.png b/intra/assets/images/sprites/gadgets/windmill_inside.png similarity index 100% rename from intra/src/res/sprites/gadgets/windmill_inside.png rename to intra/assets/images/sprites/gadgets/windmill_inside.png diff --git a/intra/src/res/sprites/gadgets/windmill_shell.png b/intra/assets/images/sprites/gadgets/windmill_shell.png similarity index 100% rename from intra/src/res/sprites/gadgets/windmill_shell.png rename to intra/assets/images/sprites/gadgets/windmill_shell.png diff --git a/intra/src/res/sprites/inventory/big_health_pickup.png b/intra/assets/images/sprites/inventory/big_health_pickup.png similarity index 100% rename from intra/src/res/sprites/inventory/big_health_pickup.png rename to intra/assets/images/sprites/inventory/big_health_pickup.png diff --git a/intra/src/res/sprites/inventory/broom-icon.png b/intra/assets/images/sprites/inventory/broom-icon.png similarity index 100% rename from intra/src/res/sprites/inventory/broom-icon.png rename to intra/assets/images/sprites/inventory/broom-icon.png diff --git a/intra/src/res/sprites/inventory/broom.png b/intra/assets/images/sprites/inventory/broom.png similarity index 100% rename from intra/src/res/sprites/inventory/broom.png rename to intra/assets/images/sprites/inventory/broom.png diff --git a/intra/src/res/sprites/inventory/broom_old.png b/intra/assets/images/sprites/inventory/broom_old.png similarity index 100% rename from intra/src/res/sprites/inventory/broom_old.png rename to intra/assets/images/sprites/inventory/broom_old.png diff --git a/intra/src/res/sprites/inventory/checkpoint_save_box.png b/intra/assets/images/sprites/inventory/checkpoint_save_box.png similarity index 100% rename from intra/src/res/sprites/inventory/checkpoint_save_box.png rename to intra/assets/images/sprites/inventory/checkpoint_save_box.png diff --git a/intra/src/res/sprites/inventory/controls.png b/intra/assets/images/sprites/inventory/controls.png similarity index 100% rename from intra/src/res/sprites/inventory/controls.png rename to intra/assets/images/sprites/inventory/controls.png diff --git a/intra/src/res/sprites/inventory/dohickies.png b/intra/assets/images/sprites/inventory/dohickies.png similarity index 100% rename from intra/src/res/sprites/inventory/dohickies.png rename to intra/assets/images/sprites/inventory/dohickies.png diff --git a/intra/src/res/sprites/inventory/header.png b/intra/assets/images/sprites/inventory/header.png similarity index 100% rename from intra/src/res/sprites/inventory/header.png rename to intra/assets/images/sprites/inventory/header.png diff --git a/intra/src/res/sprites/inventory/header.xcf b/intra/assets/images/sprites/inventory/header.xcf similarity index 100% rename from intra/src/res/sprites/inventory/header.xcf rename to intra/assets/images/sprites/inventory/header.xcf diff --git a/intra/src/res/sprites/inventory/header_old.png b/intra/assets/images/sprites/inventory/header_old.png similarity index 100% rename from intra/src/res/sprites/inventory/header_old.png rename to intra/assets/images/sprites/inventory/header_old.png diff --git a/intra/src/res/sprites/inventory/health_piece.png b/intra/assets/images/sprites/inventory/health_piece.png similarity index 100% rename from intra/src/res/sprites/inventory/health_piece.png rename to intra/assets/images/sprites/inventory/health_piece.png diff --git a/intra/src/res/sprites/inventory/inventory.png b/intra/assets/images/sprites/inventory/inventory.png similarity index 100% rename from intra/src/res/sprites/inventory/inventory.png rename to intra/assets/images/sprites/inventory/inventory.png diff --git a/intra/src/res/sprites/inventory/item_jump_shoes.png b/intra/assets/images/sprites/inventory/item_jump_shoes.png similarity index 100% rename from intra/src/res/sprites/inventory/item_jump_shoes.png rename to intra/assets/images/sprites/inventory/item_jump_shoes.png diff --git a/intra/src/res/sprites/inventory/item_long_attack.png b/intra/assets/images/sprites/inventory/item_long_attack.png similarity index 100% rename from intra/src/res/sprites/inventory/item_long_attack.png rename to intra/assets/images/sprites/inventory/item_long_attack.png diff --git a/intra/src/res/sprites/inventory/item_none.png b/intra/assets/images/sprites/inventory/item_none.png similarity index 100% rename from intra/src/res/sprites/inventory/item_none.png rename to intra/assets/images/sprites/inventory/item_none.png diff --git a/intra/src/res/sprites/inventory/item_tranformer.png b/intra/assets/images/sprites/inventory/item_tranformer.png similarity index 100% rename from intra/src/res/sprites/inventory/item_tranformer.png rename to intra/assets/images/sprites/inventory/item_tranformer.png diff --git a/intra/src/res/sprites/inventory/item_wide_attack.png b/intra/assets/images/sprites/inventory/item_wide_attack.png similarity index 100% rename from intra/src/res/sprites/inventory/item_wide_attack.png rename to intra/assets/images/sprites/inventory/item_wide_attack.png diff --git a/intra/src/res/sprites/inventory/keyitems.png b/intra/assets/images/sprites/inventory/keyitems.png similarity index 100% rename from intra/src/res/sprites/inventory/keyitems.png rename to intra/assets/images/sprites/inventory/keyitems.png diff --git a/intra/src/res/sprites/inventory/knife.png b/intra/assets/images/sprites/inventory/knife.png similarity index 100% rename from intra/src/res/sprites/inventory/knife.png rename to intra/assets/images/sprites/inventory/knife.png diff --git a/intra/src/res/sprites/inventory/life_cicada.png b/intra/assets/images/sprites/inventory/life_cicada.png similarity index 100% rename from intra/src/res/sprites/inventory/life_cicada.png rename to intra/assets/images/sprites/inventory/life_cicada.png diff --git a/intra/src/res/sprites/inventory/long_attack_h.png b/intra/assets/images/sprites/inventory/long_attack_h.png similarity index 100% rename from intra/src/res/sprites/inventory/long_attack_h.png rename to intra/assets/images/sprites/inventory/long_attack_h.png diff --git a/intra/src/res/sprites/inventory/long_attack_v.png b/intra/assets/images/sprites/inventory/long_attack_v.png similarity index 100% rename from intra/src/res/sprites/inventory/long_attack_v.png rename to intra/assets/images/sprites/inventory/long_attack_v.png diff --git a/intra/src/res/sprites/inventory/selector.png b/intra/assets/images/sprites/inventory/selector.png similarity index 100% rename from intra/src/res/sprites/inventory/selector.png rename to intra/assets/images/sprites/inventory/selector.png diff --git a/intra/src/res/sprites/inventory/settings-selector.png b/intra/assets/images/sprites/inventory/settings-selector.png similarity index 100% rename from intra/src/res/sprites/inventory/settings-selector.png rename to intra/assets/images/sprites/inventory/settings-selector.png diff --git a/intra/src/res/sprites/inventory/settings.png b/intra/assets/images/sprites/inventory/settings.png similarity index 100% rename from intra/src/res/sprites/inventory/settings.png rename to intra/assets/images/sprites/inventory/settings.png diff --git a/intra/src/res/sprites/inventory/small_health_pickup.png b/intra/assets/images/sprites/inventory/small_health_pickup.png similarity index 100% rename from intra/src/res/sprites/inventory/small_health_pickup.png rename to intra/assets/images/sprites/inventory/small_health_pickup.png diff --git a/intra/src/res/sprites/inventory/wide_attack_h.png b/intra/assets/images/sprites/inventory/wide_attack_h.png similarity index 100% rename from intra/src/res/sprites/inventory/wide_attack_h.png rename to intra/assets/images/sprites/inventory/wide_attack_h.png diff --git a/intra/src/res/sprites/inventory/wide_attack_v.png b/intra/assets/images/sprites/inventory/wide_attack_v.png similarity index 100% rename from intra/src/res/sprites/inventory/wide_attack_v.png rename to intra/assets/images/sprites/inventory/wide_attack_v.png diff --git a/intra/src/res/sprites/jplayer.png b/intra/assets/images/sprites/jplayer.png similarity index 100% rename from intra/src/res/sprites/jplayer.png rename to intra/assets/images/sprites/jplayer.png diff --git a/intra/src/res/sprites/jplayer_cell.png b/intra/assets/images/sprites/jplayer_cell.png similarity index 100% rename from intra/src/res/sprites/jplayer_cell.png rename to intra/assets/images/sprites/jplayer_cell.png diff --git a/intra/src/res/sprites/jplayer_reflection.png b/intra/assets/images/sprites/jplayer_reflection.png similarity index 100% rename from intra/src/res/sprites/jplayer_reflection.png rename to intra/assets/images/sprites/jplayer_reflection.png diff --git a/intra/src/res/sprites/light/5-frame-glow.png b/intra/assets/images/sprites/light/5-frame-glow.png similarity index 100% rename from intra/src/res/sprites/light/5-frame-glow.png rename to intra/assets/images/sprites/light/5-frame-glow.png diff --git a/intra/src/res/sprites/light/beach-screen-light.png b/intra/assets/images/sprites/light/beach-screen-light.png similarity index 100% rename from intra/src/res/sprites/light/beach-screen-light.png rename to intra/assets/images/sprites/light/beach-screen-light.png diff --git a/intra/src/res/sprites/light/cone-light.png b/intra/assets/images/sprites/light/cone-light.png similarity index 100% rename from intra/src/res/sprites/light/cone-light.png rename to intra/assets/images/sprites/light/cone-light.png diff --git a/intra/src/res/sprites/light/glow-light.png b/intra/assets/images/sprites/light/glow-light.png similarity index 100% rename from intra/src/res/sprites/light/glow-light.png rename to intra/assets/images/sprites/light/glow-light.png diff --git a/intra/src/res/sprites/map_even.png b/intra/assets/images/sprites/map_even.png similarity index 100% rename from intra/src/res/sprites/map_even.png rename to intra/assets/images/sprites/map_even.png diff --git a/intra/src/res/sprites/menu/arrow.png b/intra/assets/images/sprites/menu/arrow.png similarity index 100% rename from intra/src/res/sprites/menu/arrow.png rename to intra/assets/images/sprites/menu/arrow.png diff --git a/intra/src/res/sprites/menu/arrows.png b/intra/assets/images/sprites/menu/arrows.png similarity index 100% rename from intra/src/res/sprites/menu/arrows.png rename to intra/assets/images/sprites/menu/arrows.png diff --git a/intra/src/res/sprites/menu/autosave_icon.png b/intra/assets/images/sprites/menu/autosave_icon.png similarity index 100% rename from intra/src/res/sprites/menu/autosave_icon.png rename to intra/assets/images/sprites/menu/autosave_icon.png diff --git a/intra/src/res/sprites/menu/card_1.png b/intra/assets/images/sprites/menu/card_1.png similarity index 100% rename from intra/src/res/sprites/menu/card_1.png rename to intra/assets/images/sprites/menu/card_1.png diff --git a/intra/src/res/sprites/menu/card_empty.png b/intra/assets/images/sprites/menu/card_empty.png similarity index 100% rename from intra/src/res/sprites/menu/card_empty.png rename to intra/assets/images/sprites/menu/card_empty.png diff --git a/intra/src/res/sprites/menu/card_sheet.png b/intra/assets/images/sprites/menu/card_sheet.png similarity index 100% rename from intra/src/res/sprites/menu/card_sheet.png rename to intra/assets/images/sprites/menu/card_sheet.png diff --git a/intra/src/res/sprites/menu/cards_page example.png b/intra/assets/images/sprites/menu/cards_page example.png similarity index 100% rename from intra/src/res/sprites/menu/cards_page example.png rename to intra/assets/images/sprites/menu/cards_page example.png diff --git a/intra/src/res/sprites/menu/dialogue_blinky_box.png b/intra/assets/images/sprites/menu/dialogue_blinky_box.png similarity index 100% rename from intra/src/res/sprites/menu/dialogue_blinky_box.png rename to intra/assets/images/sprites/menu/dialogue_blinky_box.png diff --git a/intra/src/res/sprites/menu/dialogue_box.png b/intra/assets/images/sprites/menu/dialogue_box.png similarity index 100% rename from intra/src/res/sprites/menu/dialogue_box.png rename to intra/assets/images/sprites/menu/dialogue_box.png diff --git a/intra/src/res/sprites/menu/equipped_icon.png b/intra/assets/images/sprites/menu/equipped_icon.png similarity index 100% rename from intra/src/res/sprites/menu/equipped_icon.png rename to intra/assets/images/sprites/menu/equipped_icon.png diff --git a/intra/src/res/sprites/menu/long_icon.png b/intra/assets/images/sprites/menu/long_icon.png similarity index 100% rename from intra/src/res/sprites/menu/long_icon.png rename to intra/assets/images/sprites/menu/long_icon.png diff --git a/intra/src/res/sprites/menu/m_mobile_c.png b/intra/assets/images/sprites/menu/m_mobile_c.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_c.png rename to intra/assets/images/sprites/menu/m_mobile_c.png diff --git a/intra/src/res/sprites/menu/m_mobile_circle.png b/intra/assets/images/sprites/menu/m_mobile_circle.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_circle.png rename to intra/assets/images/sprites/menu/m_mobile_circle.png diff --git a/intra/src/res/sprites/menu/m_mobile_down.png b/intra/assets/images/sprites/menu/m_mobile_down.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_down.png rename to intra/assets/images/sprites/menu/m_mobile_down.png diff --git a/intra/src/res/sprites/menu/m_mobile_left.png b/intra/assets/images/sprites/menu/m_mobile_left.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_left.png rename to intra/assets/images/sprites/menu/m_mobile_left.png diff --git a/intra/src/res/sprites/menu/m_mobile_pause.png b/intra/assets/images/sprites/menu/m_mobile_pause.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_pause.png rename to intra/assets/images/sprites/menu/m_mobile_pause.png diff --git a/intra/src/res/sprites/menu/m_mobile_right.png b/intra/assets/images/sprites/menu/m_mobile_right.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_right.png rename to intra/assets/images/sprites/menu/m_mobile_right.png diff --git a/intra/src/res/sprites/menu/m_mobile_up.png b/intra/assets/images/sprites/menu/m_mobile_up.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_up.png rename to intra/assets/images/sprites/menu/m_mobile_up.png diff --git a/intra/src/res/sprites/menu/m_mobile_x.png b/intra/assets/images/sprites/menu/m_mobile_x.png similarity index 100% rename from intra/src/res/sprites/menu/m_mobile_x.png rename to intra/assets/images/sprites/menu/m_mobile_x.png diff --git a/intra/src/res/sprites/menu/menu_bg.png b/intra/assets/images/sprites/menu/menu_bg.png similarity index 100% rename from intra/src/res/sprites/menu/menu_bg.png rename to intra/assets/images/sprites/menu/menu_bg.png diff --git a/intra/src/res/sprites/menu/menu_select_active.png b/intra/assets/images/sprites/menu/menu_select_active.png similarity index 100% rename from intra/src/res/sprites/menu/menu_select_active.png rename to intra/assets/images/sprites/menu/menu_select_active.png diff --git a/intra/src/res/sprites/menu/menu_select_inactive.png b/intra/assets/images/sprites/menu/menu_select_inactive.png similarity index 100% rename from intra/src/res/sprites/menu/menu_select_inactive.png rename to intra/assets/images/sprites/menu/menu_select_inactive.png diff --git a/intra/src/res/sprites/menu/menudialogue_box.png b/intra/assets/images/sprites/menu/menudialogue_box.png similarity index 100% rename from intra/src/res/sprites/menu/menudialogue_box.png rename to intra/assets/images/sprites/menu/menudialogue_box.png diff --git a/intra/src/res/sprites/menu/none_icon.png b/intra/assets/images/sprites/menu/none_icon.png similarity index 100% rename from intra/src/res/sprites/menu/none_icon.png rename to intra/assets/images/sprites/menu/none_icon.png diff --git a/intra/src/res/sprites/menu/secret_trophies.png b/intra/assets/images/sprites/menu/secret_trophies.png similarity index 100% rename from intra/src/res/sprites/menu/secret_trophies.png rename to intra/assets/images/sprites/menu/secret_trophies.png diff --git a/intra/src/res/sprites/menu/transformer_icon.png b/intra/assets/images/sprites/menu/transformer_icon.png similarity index 100% rename from intra/src/res/sprites/menu/transformer_icon.png rename to intra/assets/images/sprites/menu/transformer_icon.png diff --git a/intra/src/res/sprites/menu/volume_bar.png b/intra/assets/images/sprites/menu/volume_bar.png similarity index 100% rename from intra/src/res/sprites/menu/volume_bar.png rename to intra/assets/images/sprites/menu/volume_bar.png diff --git a/intra/src/res/sprites/menu/wide_icon.png b/intra/assets/images/sprites/menu/wide_icon.png similarity index 100% rename from intra/src/res/sprites/menu/wide_icon.png rename to intra/assets/images/sprites/menu/wide_icon.png diff --git a/intra/src/res/sprites/mobile/button_c.png b/intra/assets/images/sprites/mobile/button_c.png similarity index 100% rename from intra/src/res/sprites/mobile/button_c.png rename to intra/assets/images/sprites/mobile/button_c.png diff --git a/intra/src/res/sprites/mobile/button_dpad.png b/intra/assets/images/sprites/mobile/button_dpad.png similarity index 100% rename from intra/src/res/sprites/mobile/button_dpad.png rename to intra/assets/images/sprites/mobile/button_dpad.png diff --git a/intra/src/res/sprites/mobile/button_menu.png b/intra/assets/images/sprites/mobile/button_menu.png similarity index 100% rename from intra/src/res/sprites/mobile/button_menu.png rename to intra/assets/images/sprites/mobile/button_menu.png diff --git a/intra/src/res/sprites/mobile/button_x.png b/intra/assets/images/sprites/mobile/button_x.png similarity index 100% rename from intra/src/res/sprites/mobile/button_x.png rename to intra/assets/images/sprites/mobile/button_x.png diff --git a/intra/src/res/sprites/mobile/dpad.png b/intra/assets/images/sprites/mobile/dpad.png similarity index 100% rename from intra/src/res/sprites/mobile/dpad.png rename to intra/assets/images/sprites/mobile/dpad.png diff --git a/intra/src/res/sprites/mobile/mobile_bg.png b/intra/assets/images/sprites/mobile/mobile_bg.png similarity index 100% rename from intra/src/res/sprites/mobile/mobile_bg.png rename to intra/assets/images/sprites/mobile/mobile_bg.png diff --git a/intra/src/res/sprites/mobile/screenedge_left.png b/intra/assets/images/sprites/mobile/screenedge_left.png similarity index 100% rename from intra/src/res/sprites/mobile/screenedge_left.png rename to intra/assets/images/sprites/mobile/screenedge_left.png diff --git a/intra/src/res/sprites/mobile/screenedge_right.png b/intra/assets/images/sprites/mobile/screenedge_right.png similarity index 100% rename from intra/src/res/sprites/mobile/screenedge_right.png rename to intra/assets/images/sprites/mobile/screenedge_right.png diff --git a/intra/src/res/sprites/mobile/thumb.png b/intra/assets/images/sprites/mobile/thumb.png similarity index 100% rename from intra/src/res/sprites/mobile/thumb.png rename to intra/assets/images/sprites/mobile/thumb.png diff --git a/intra/src/res/sprites/npcs/beach_npcs.png b/intra/assets/images/sprites/npcs/beach_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/beach_npcs.png rename to intra/assets/images/sprites/npcs/beach_npcs.png diff --git a/intra/src/res/sprites/npcs/big_statue.png b/intra/assets/images/sprites/npcs/big_statue.png similarity index 100% rename from intra/src/res/sprites/npcs/big_statue.png rename to intra/assets/images/sprites/npcs/big_statue.png diff --git a/intra/src/res/sprites/npcs/bike.png b/intra/assets/images/sprites/npcs/bike.png similarity index 100% rename from intra/src/res/sprites/npcs/bike.png rename to intra/assets/images/sprites/npcs/bike.png diff --git a/intra/src/res/sprites/npcs/biofilm.png b/intra/assets/images/sprites/npcs/biofilm.png similarity index 100% rename from intra/src/res/sprites/npcs/biofilm.png rename to intra/assets/images/sprites/npcs/biofilm.png diff --git a/intra/src/res/sprites/npcs/blue_npcs.png b/intra/assets/images/sprites/npcs/blue_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/blue_npcs.png rename to intra/assets/images/sprites/npcs/blue_npcs.png diff --git a/intra/src/res/sprites/npcs/briar.png b/intra/assets/images/sprites/npcs/briar.png similarity index 100% rename from intra/src/res/sprites/npcs/briar.png rename to intra/assets/images/sprites/npcs/briar.png diff --git a/intra/src/res/sprites/npcs/cell_bodies.png b/intra/assets/images/sprites/npcs/cell_bodies.png similarity index 100% rename from intra/src/res/sprites/npcs/cell_bodies.png rename to intra/assets/images/sprites/npcs/cell_bodies.png diff --git a/intra/src/res/sprites/npcs/cliffs_npcs.png b/intra/assets/images/sprites/npcs/cliffs_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/cliffs_npcs.png rename to intra/assets/images/sprites/npcs/cliffs_npcs.png diff --git a/intra/src/res/sprites/npcs/cube_kings.png b/intra/assets/images/sprites/npcs/cube_kings.png similarity index 100% rename from intra/src/res/sprites/npcs/cube_kings.png rename to intra/assets/images/sprites/npcs/cube_kings.png diff --git a/intra/src/res/sprites/npcs/cube_kings_old.png b/intra/assets/images/sprites/npcs/cube_kings_old.png similarity index 100% rename from intra/src/res/sprites/npcs/cube_kings_old.png rename to intra/assets/images/sprites/npcs/cube_kings_old.png diff --git a/intra/src/res/sprites/npcs/easter/dev_npcs.png b/intra/assets/images/sprites/npcs/easter/dev_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/easter/dev_npcs.png rename to intra/assets/images/sprites/npcs/easter/dev_npcs.png diff --git a/intra/src/res/sprites/npcs/easter/randoms.png b/intra/assets/images/sprites/npcs/easter/randoms.png similarity index 100% rename from intra/src/res/sprites/npcs/easter/randoms.png rename to intra/assets/images/sprites/npcs/easter/randoms.png diff --git a/intra/src/res/sprites/npcs/easter/smoke_red.png b/intra/assets/images/sprites/npcs/easter/smoke_red.png similarity index 100% rename from intra/src/res/sprites/npcs/easter/smoke_red.png rename to intra/assets/images/sprites/npcs/easter/smoke_red.png diff --git a/intra/src/res/sprites/npcs/fields_npcs.png b/intra/assets/images/sprites/npcs/fields_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/fields_npcs.png rename to intra/assets/images/sprites/npcs/fields_npcs.png diff --git a/intra/src/res/sprites/npcs/fisherman.png b/intra/assets/images/sprites/npcs/fisherman.png similarity index 100% rename from intra/src/res/sprites/npcs/fisherman.png rename to intra/assets/images/sprites/npcs/fisherman.png diff --git a/intra/src/res/sprites/npcs/follower_bro.png b/intra/assets/images/sprites/npcs/follower_bro.png similarity index 100% rename from intra/src/res/sprites/npcs/follower_bro.png rename to intra/assets/images/sprites/npcs/follower_bro.png diff --git a/intra/src/res/sprites/npcs/forest_npcs.png b/intra/assets/images/sprites/npcs/forest_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/forest_npcs.png rename to intra/assets/images/sprites/npcs/forest_npcs.png diff --git a/intra/src/res/sprites/npcs/forest_stag.png b/intra/assets/images/sprites/npcs/forest_stag.png similarity index 100% rename from intra/src/res/sprites/npcs/forest_stag.png rename to intra/assets/images/sprites/npcs/forest_stag.png diff --git a/intra/src/res/sprites/npcs/geoms.png b/intra/assets/images/sprites/npcs/geoms.png similarity index 100% rename from intra/src/res/sprites/npcs/geoms.png rename to intra/assets/images/sprites/npcs/geoms.png diff --git a/intra/src/res/sprites/npcs/hamster_wheel.png b/intra/assets/images/sprites/npcs/hamster_wheel.png similarity index 100% rename from intra/src/res/sprites/npcs/hamster_wheel.png rename to intra/assets/images/sprites/npcs/hamster_wheel.png diff --git a/intra/src/res/sprites/npcs/happy_npcs.png b/intra/assets/images/sprites/npcs/happy_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/happy_npcs.png rename to intra/assets/images/sprites/npcs/happy_npcs.png diff --git a/intra/src/res/sprites/npcs/hotel_npcs.png b/intra/assets/images/sprites/npcs/hotel_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/hotel_npcs.png rename to intra/assets/images/sprites/npcs/hotel_npcs.png diff --git a/intra/src/res/sprites/npcs/mitra.png b/intra/assets/images/sprites/npcs/mitra.png similarity index 100% rename from intra/src/res/sprites/npcs/mitra.png rename to intra/assets/images/sprites/npcs/mitra.png diff --git a/intra/src/res/sprites/npcs/mitra_bike.png b/intra/assets/images/sprites/npcs/mitra_bike.png similarity index 100% rename from intra/src/res/sprites/npcs/mitra_bike.png rename to intra/assets/images/sprites/npcs/mitra_bike.png diff --git a/intra/src/res/sprites/npcs/note_rock.png b/intra/assets/images/sprites/npcs/note_rock.png similarity index 100% rename from intra/src/res/sprites/npcs/note_rock.png rename to intra/assets/images/sprites/npcs/note_rock.png diff --git a/intra/src/res/sprites/npcs/npc.png b/intra/assets/images/sprites/npcs/npc.png similarity index 100% rename from intra/src/res/sprites/npcs/npc.png rename to intra/assets/images/sprites/npcs/npc.png diff --git a/intra/src/res/sprites/npcs/redsea_npcs.png b/intra/assets/images/sprites/npcs/redsea_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/redsea_npcs.png rename to intra/assets/images/sprites/npcs/redsea_npcs.png diff --git a/intra/src/res/sprites/npcs/sadman.png b/intra/assets/images/sprites/npcs/sadman.png similarity index 100% rename from intra/src/res/sprites/npcs/sadman.png rename to intra/assets/images/sprites/npcs/sadman.png diff --git a/intra/src/res/sprites/npcs/sage.png b/intra/assets/images/sprites/npcs/sage.png similarity index 100% rename from intra/src/res/sprites/npcs/sage.png rename to intra/assets/images/sprites/npcs/sage.png diff --git a/intra/src/res/sprites/npcs/sage_statue.png b/intra/assets/images/sprites/npcs/sage_statue.png similarity index 100% rename from intra/src/res/sprites/npcs/sage_statue.png rename to intra/assets/images/sprites/npcs/sage_statue.png diff --git a/intra/src/res/sprites/npcs/shadow_briar.png b/intra/assets/images/sprites/npcs/shadow_briar.png similarity index 100% rename from intra/src/res/sprites/npcs/shadow_briar.png rename to intra/assets/images/sprites/npcs/shadow_briar.png diff --git a/intra/src/res/sprites/npcs/snowman.png b/intra/assets/images/sprites/npcs/snowman.png similarity index 100% rename from intra/src/res/sprites/npcs/snowman.png rename to intra/assets/images/sprites/npcs/snowman.png diff --git a/intra/src/res/sprites/npcs/space_npcs.png b/intra/assets/images/sprites/npcs/space_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/space_npcs.png rename to intra/assets/images/sprites/npcs/space_npcs.png diff --git a/intra/src/res/sprites/npcs/suburb_killers.png b/intra/assets/images/sprites/npcs/suburb_killers.png similarity index 100% rename from intra/src/res/sprites/npcs/suburb_killers.png rename to intra/assets/images/sprites/npcs/suburb_killers.png diff --git a/intra/src/res/sprites/npcs/suburb_walkers.png b/intra/assets/images/sprites/npcs/suburb_walkers.png similarity index 100% rename from intra/src/res/sprites/npcs/suburb_walkers.png rename to intra/assets/images/sprites/npcs/suburb_walkers.png diff --git a/intra/src/res/sprites/npcs/trade_npcs.png b/intra/assets/images/sprites/npcs/trade_npcs.png similarity index 100% rename from intra/src/res/sprites/npcs/trade_npcs.png rename to intra/assets/images/sprites/npcs/trade_npcs.png diff --git a/intra/src/res/sprites/player_mobile_indicator.png b/intra/assets/images/sprites/player_mobile_indicator.png similarity index 100% rename from intra/src/res/sprites/player_mobile_indicator.png rename to intra/assets/images/sprites/player_mobile_indicator.png diff --git a/intra/src/res/sprites/redboss_alternate.png b/intra/assets/images/sprites/redboss_alternate.png similarity index 100% rename from intra/src/res/sprites/redboss_alternate.png rename to intra/assets/images/sprites/redboss_alternate.png diff --git a/intra/src/res/sprites/screen_config.png b/intra/assets/images/sprites/screen_config.png similarity index 100% rename from intra/src/res/sprites/screen_config.png rename to intra/assets/images/sprites/screen_config.png diff --git a/intra/src/res/sprites/young_player.png b/intra/assets/images/sprites/young_player.png similarity index 100% rename from intra/src/res/sprites/young_player.png rename to intra/assets/images/sprites/young_player.png diff --git a/intra/src/res/sprites/young_player_cell.png b/intra/assets/images/sprites/young_player_cell.png similarity index 100% rename from intra/src/res/sprites/young_player_cell.png rename to intra/assets/images/sprites/young_player_cell.png diff --git a/intra/src/res/sprites/young_player_reflection.png b/intra/assets/images/sprites/young_player_reflection.png similarity index 100% rename from intra/src/res/sprites/young_player_reflection.png rename to intra/assets/images/sprites/young_player_reflection.png diff --git a/intra/src/res/tilemaps/apartment_tilemap.png b/intra/assets/images/tilemaps/apartment_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/apartment_tilemap.png rename to intra/assets/images/tilemaps/apartment_tilemap.png diff --git a/intra/src/res/tilemaps/beach_tilemap.png b/intra/assets/images/tilemaps/beach_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/beach_tilemap.png rename to intra/assets/images/tilemaps/beach_tilemap.png diff --git a/intra/src/res/tilemaps/beach_tilemap_old.png b/intra/assets/images/tilemaps/beach_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/beach_tilemap_old.png rename to intra/assets/images/tilemaps/beach_tilemap_old.png diff --git a/intra/src/res/tilemaps/bed b/intra/assets/images/tilemaps/bed similarity index 100% rename from intra/src/res/tilemaps/bed rename to intra/assets/images/tilemaps/bed diff --git a/intra/src/res/tilemaps/bedroom_tilemap.png b/intra/assets/images/tilemaps/bedroom_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/bedroom_tilemap.png rename to intra/assets/images/tilemaps/bedroom_tilemap.png diff --git a/intra/src/res/tilemaps/blackwhite_tilemap.png b/intra/assets/images/tilemaps/blackwhite_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/blackwhite_tilemap.png rename to intra/assets/images/tilemaps/blackwhite_tilemap.png diff --git a/intra/src/res/tilemaps/blank_tiles.png b/intra/assets/images/tilemaps/blank_tiles.png similarity index 100% rename from intra/src/res/tilemaps/blank_tiles.png rename to intra/assets/images/tilemaps/blank_tiles.png diff --git a/intra/src/res/tilemaps/blue_tilemap.png b/intra/assets/images/tilemaps/blue_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/blue_tilemap.png rename to intra/assets/images/tilemaps/blue_tilemap.png diff --git a/intra/src/res/tilemaps/cell_tilemap.png b/intra/assets/images/tilemaps/cell_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/cell_tilemap.png rename to intra/assets/images/tilemaps/cell_tilemap.png diff --git a/intra/src/res/tilemaps/cell_tilemap_old.png b/intra/assets/images/tilemaps/cell_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/cell_tilemap_old.png rename to intra/assets/images/tilemaps/cell_tilemap_old.png diff --git a/intra/src/res/tilemaps/circus_tilemap.png b/intra/assets/images/tilemaps/circus_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/circus_tilemap.png rename to intra/assets/images/tilemaps/circus_tilemap.png diff --git a/intra/src/res/tilemaps/cliff_tilemap.png b/intra/assets/images/tilemaps/cliff_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/cliff_tilemap.png rename to intra/assets/images/tilemaps/cliff_tilemap.png diff --git a/intra/src/res/tilemaps/cliff_tilemap_old.png b/intra/assets/images/tilemaps/cliff_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/cliff_tilemap_old.png rename to intra/assets/images/tilemaps/cliff_tilemap_old.png diff --git a/intra/src/res/tilemaps/crowd_tilemap.png b/intra/assets/images/tilemaps/crowd_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/crowd_tilemap.png rename to intra/assets/images/tilemaps/crowd_tilemap.png diff --git a/intra/src/res/tilemaps/crowd_tilemap_old.png b/intra/assets/images/tilemaps/crowd_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/crowd_tilemap_old.png rename to intra/assets/images/tilemaps/crowd_tilemap_old.png diff --git a/intra/src/res/tilemaps/crowd_tilemap_old2.png b/intra/assets/images/tilemaps/crowd_tilemap_old2.png similarity index 100% rename from intra/src/res/tilemaps/crowd_tilemap_old2.png rename to intra/assets/images/tilemaps/crowd_tilemap_old2.png diff --git a/intra/src/res/tilemaps/fields_tilemap.png b/intra/assets/images/tilemaps/fields_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/fields_tilemap.png rename to intra/assets/images/tilemaps/fields_tilemap.png diff --git a/intra/src/res/tilemaps/fields_tilemap_old.png b/intra/assets/images/tilemaps/fields_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/fields_tilemap_old.png rename to intra/assets/images/tilemaps/fields_tilemap_old.png diff --git a/intra/src/res/tilemaps/fields_tilemap_old2.png b/intra/assets/images/tilemaps/fields_tilemap_old2.png similarity index 100% rename from intra/src/res/tilemaps/fields_tilemap_old2.png rename to intra/assets/images/tilemaps/fields_tilemap_old2.png diff --git a/intra/src/res/tilemaps/fields_tilemap_old3.png b/intra/assets/images/tilemaps/fields_tilemap_old3.png similarity index 100% rename from intra/src/res/tilemaps/fields_tilemap_old3.png rename to intra/assets/images/tilemaps/fields_tilemap_old3.png diff --git a/intra/src/res/tilemaps/forest_tilemap.png b/intra/assets/images/tilemaps/forest_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/forest_tilemap.png rename to intra/assets/images/tilemaps/forest_tilemap.png diff --git a/intra/src/res/tilemaps/go_tilemap.png b/intra/assets/images/tilemaps/go_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/go_tilemap.png rename to intra/assets/images/tilemaps/go_tilemap.png diff --git a/intra/src/res/tilemaps/happy_tilemap.png b/intra/assets/images/tilemaps/happy_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/happy_tilemap.png rename to intra/assets/images/tilemaps/happy_tilemap.png diff --git a/intra/src/res/tilemaps/hotel_tilemap.png b/intra/assets/images/tilemaps/hotel_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/hotel_tilemap.png rename to intra/assets/images/tilemaps/hotel_tilemap.png diff --git a/intra/src/res/tilemaps/mini_minimap_tiles.png b/intra/assets/images/tilemaps/mini_minimap_tiles.png similarity index 100% rename from intra/src/res/tilemaps/mini_minimap_tiles.png rename to intra/assets/images/tilemaps/mini_minimap_tiles.png diff --git a/intra/src/res/tilemaps/minimap_tiles.png b/intra/assets/images/tilemaps/minimap_tiles.png similarity index 100% rename from intra/src/res/tilemaps/minimap_tiles.png rename to intra/assets/images/tilemaps/minimap_tiles.png diff --git a/intra/src/res/tilemaps/mockup_tiles.png b/intra/assets/images/tilemaps/mockup_tiles.png similarity index 100% rename from intra/src/res/tilemaps/mockup_tiles.png rename to intra/assets/images/tilemaps/mockup_tiles.png diff --git a/intra/src/res/tilemaps/nexus_tilemap.png b/intra/assets/images/tilemaps/nexus_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/nexus_tilemap.png rename to intra/assets/images/tilemaps/nexus_tilemap.png diff --git a/intra/src/res/tilemaps/nexus_tilemap_old.png b/intra/assets/images/tilemaps/nexus_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/nexus_tilemap_old.png rename to intra/assets/images/tilemaps/nexus_tilemap_old.png diff --git a/intra/src/res/tilemaps/old/blank_tiles_old.png b/intra/assets/images/tilemaps/old/blank_tiles_old.png similarity index 100% rename from intra/src/res/tilemaps/old/blank_tiles_old.png rename to intra/assets/images/tilemaps/old/blank_tiles_old.png diff --git a/intra/src/res/tilemaps/old/old_beach_tilemap.png b/intra/assets/images/tilemaps/old/old_beach_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/old/old_beach_tilemap.png rename to intra/assets/images/tilemaps/old/old_beach_tilemap.png diff --git a/intra/src/res/tilemaps/old/old_bedroom_tilemap.png b/intra/assets/images/tilemaps/old/old_bedroom_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/old/old_bedroom_tilemap.png rename to intra/assets/images/tilemaps/old/old_bedroom_tilemap.png diff --git a/intra/src/res/tilemaps/old/overworld_tilemap.png b/intra/assets/images/tilemaps/old/overworld_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/old/overworld_tilemap.png rename to intra/assets/images/tilemaps/old/overworld_tilemap.png diff --git a/intra/src/res/tilemaps/old/overworld_tilemap_old.png b/intra/assets/images/tilemaps/old/overworld_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/old/overworld_tilemap_old.png rename to intra/assets/images/tilemaps/old/overworld_tilemap_old.png diff --git a/intra/src/res/tilemaps/old/street_tilemap_old.png b/intra/assets/images/tilemaps/old/street_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/old/street_tilemap_old.png rename to intra/assets/images/tilemaps/old/street_tilemap_old.png diff --git a/intra/src/res/tilemaps/overworld_tilemap.png b/intra/assets/images/tilemaps/overworld_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/overworld_tilemap.png rename to intra/assets/images/tilemaps/overworld_tilemap.png diff --git a/intra/src/res/tilemaps/overworld_tilemap.png.bak b/intra/assets/images/tilemaps/overworld_tilemap.png.bak similarity index 100% rename from intra/src/res/tilemaps/overworld_tilemap.png.bak rename to intra/assets/images/tilemaps/overworld_tilemap.png.bak diff --git a/intra/src/res/tilemaps/overworld_tilemap_dark.png b/intra/assets/images/tilemaps/overworld_tilemap_dark.png similarity index 100% rename from intra/src/res/tilemaps/overworld_tilemap_dark.png rename to intra/assets/images/tilemaps/overworld_tilemap_dark.png diff --git a/intra/src/res/tilemaps/overworld_tilemap_old.png b/intra/assets/images/tilemaps/overworld_tilemap_old.png similarity index 100% rename from intra/src/res/tilemaps/overworld_tilemap_old.png rename to intra/assets/images/tilemaps/overworld_tilemap_old.png diff --git a/intra/src/res/tilemaps/redcave_tiles.png b/intra/assets/images/tilemaps/redcave_tiles.png similarity index 100% rename from intra/src/res/tilemaps/redcave_tiles.png rename to intra/assets/images/tilemaps/redcave_tiles.png diff --git a/intra/src/res/tilemaps/redsea_tiles.png b/intra/assets/images/tilemaps/redsea_tiles.png similarity index 100% rename from intra/src/res/tilemaps/redsea_tiles.png rename to intra/assets/images/tilemaps/redsea_tiles.png diff --git a/intra/src/res/tilemaps/space_tilemap.png b/intra/assets/images/tilemaps/space_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/space_tilemap.png rename to intra/assets/images/tilemaps/space_tilemap.png diff --git a/intra/src/res/tilemaps/street_tilemap.png b/intra/assets/images/tilemaps/street_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/street_tilemap.png rename to intra/assets/images/tilemaps/street_tilemap.png diff --git a/intra/src/res/tilemaps/suburb_tilemap.png b/intra/assets/images/tilemaps/suburb_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/suburb_tilemap.png rename to intra/assets/images/tilemaps/suburb_tilemap.png diff --git a/intra/src/res/tilemaps/terminal_tilemap.png b/intra/assets/images/tilemaps/terminal_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/terminal_tilemap.png rename to intra/assets/images/tilemaps/terminal_tilemap.png diff --git a/intra/src/res/tilemaps/train_tiles.png b/intra/assets/images/tilemaps/train_tiles.png similarity index 100% rename from intra/src/res/tilemaps/train_tiles.png rename to intra/assets/images/tilemaps/train_tiles.png diff --git a/intra/src/res/tilemaps/windmill_tilemap.png b/intra/assets/images/tilemaps/windmill_tilemap.png similarity index 100% rename from intra/src/res/tilemaps/windmill_tilemap.png rename to intra/assets/images/tilemaps/windmill_tilemap.png diff --git a/intra/src/res/title/door.png b/intra/assets/images/title/door.png similarity index 100% rename from intra/src/res/title/door.png rename to intra/assets/images/title/door.png diff --git a/intra/src/res/title/door_glow.png b/intra/assets/images/title/door_glow.png similarity index 100% rename from intra/src/res/title/door_glow.png rename to intra/assets/images/title/door_glow.png diff --git a/intra/src/res/title/door_spinglow1.png b/intra/assets/images/title/door_spinglow1.png similarity index 100% rename from intra/src/res/title/door_spinglow1.png rename to intra/assets/images/title/door_spinglow1.png diff --git a/intra/src/res/title/door_spinglow2.png b/intra/assets/images/title/door_spinglow2.png similarity index 100% rename from intra/src/res/title/door_spinglow2.png rename to intra/assets/images/title/door_spinglow2.png diff --git a/intra/src/res/title/intraisloading.png b/intra/assets/images/title/intraisloading.png similarity index 100% rename from intra/src/res/title/intraisloading.png rename to intra/assets/images/title/intraisloading.png diff --git a/intra/src/res/title/press_enter.png b/intra/assets/images/title/press_enter.png similarity index 100% rename from intra/src/res/title/press_enter.png rename to intra/assets/images/title/press_enter.png diff --git a/intra/src/res/title/selector.png b/intra/assets/images/title/selector.png similarity index 100% rename from intra/src/res/title/selector.png rename to intra/assets/images/title/selector.png diff --git a/intra/src/res/title/title_bg.png b/intra/assets/images/title/title_bg.png similarity index 100% rename from intra/src/res/title/title_bg.png rename to intra/assets/images/title/title_bg.png diff --git a/intra/src/res/title/title_overlay1.png b/intra/assets/images/title/title_overlay1.png similarity index 100% rename from intra/src/res/title/title_overlay1.png rename to intra/assets/images/title/title_overlay1.png diff --git a/intra/src/res/title/title_overlay2.png b/intra/assets/images/title/title_overlay2.png similarity index 100% rename from intra/src/res/title/title_overlay2.png rename to intra/assets/images/title/title_overlay2.png diff --git a/intra/src/res/title/title_text.png b/intra/assets/images/title/title_text.png similarity index 100% rename from intra/src/res/title/title_text.png rename to intra/assets/images/title/title_text.png diff --git a/intra/src/res/title/title_text_white.png b/intra/assets/images/title/title_text_white.png similarity index 100% rename from intra/src/res/title/title_text_white.png rename to intra/assets/images/title/title_text_white.png diff --git a/intra/src/res/title/titlepicture.png b/intra/assets/images/title/titlepicture.png similarity index 100% rename from intra/src/res/title/titlepicture.png rename to intra/assets/images/title/titlepicture.png diff --git a/intra/src/res/title/titlepicture.xcf b/intra/assets/images/title/titlepicture.xcf similarity index 100% rename from intra/src/res/title/titlepicture.xcf rename to intra/assets/images/title/titlepicture.xcf diff --git a/mp3/OLD/gladys-esque.mp3 b/intra/assets/music/OLD/gladys-esque.mp3 similarity index 100% rename from mp3/OLD/gladys-esque.mp3 rename to intra/assets/music/OLD/gladys-esque.mp3 diff --git a/mp3/OLD/old-bedroom.mp3 b/intra/assets/music/OLD/old-bedroom.mp3 similarity index 100% rename from mp3/OLD/old-bedroom.mp3 rename to intra/assets/music/OLD/old-bedroom.mp3 diff --git a/mp3/OLD/old-boss.mp3 b/intra/assets/music/OLD/old-boss.mp3 similarity index 100% rename from mp3/OLD/old-boss.mp3 rename to intra/assets/music/OLD/old-boss.mp3 diff --git a/mp3/OLD/old-terminal.mp3 b/intra/assets/music/OLD/old-terminal.mp3 similarity index 100% rename from mp3/OLD/old-terminal.mp3 rename to intra/assets/music/OLD/old-terminal.mp3 diff --git a/mp3/OLD/old-white-palace.mp3 b/intra/assets/music/OLD/old-white-palace.mp3 similarity index 100% rename from mp3/OLD/old-white-palace.mp3 rename to intra/assets/music/OLD/old-white-palace.mp3 diff --git a/mp3/OLD/old_happy.mp3 b/intra/assets/music/OLD/old_happy.mp3 similarity index 100% rename from mp3/OLD/old_happy.mp3 rename to intra/assets/music/OLD/old_happy.mp3 diff --git a/mp3/OLD/older-terminal.mp3 b/intra/assets/music/OLD/older-terminal.mp3 similarity index 100% rename from mp3/OLD/older-terminal.mp3 rename to intra/assets/music/OLD/older-terminal.mp3 diff --git a/mp3/OLD/older-white-palace.mp3 b/intra/assets/music/OLD/older-white-palace.mp3 similarity index 100% rename from mp3/OLD/older-white-palace.mp3 rename to intra/assets/music/OLD/older-white-palace.mp3 diff --git a/mp3/anodyne_TRAILER_1.mp3 b/intra/assets/music/anodyne_TRAILER_1.mp3 similarity index 100% rename from mp3/anodyne_TRAILER_1.mp3 rename to intra/assets/music/anodyne_TRAILER_1.mp3 diff --git a/mp3/apartment-boss.mp3 b/intra/assets/music/apartment-boss.mp3 similarity index 100% rename from mp3/apartment-boss.mp3 rename to intra/assets/music/apartment-boss.mp3 diff --git a/mp3/apartment.mp3 b/intra/assets/music/apartment.mp3 similarity index 100% rename from mp3/apartment.mp3 rename to intra/assets/music/apartment.mp3 diff --git a/mp3/beach.mp3 b/intra/assets/music/beach.mp3 similarity index 100% rename from mp3/beach.mp3 rename to intra/assets/music/beach.mp3 diff --git a/mp3/bedroom-boss.mp3 b/intra/assets/music/bedroom-boss.mp3 similarity index 100% rename from mp3/bedroom-boss.mp3 rename to intra/assets/music/bedroom-boss.mp3 diff --git a/mp3/bedroom.mp3 b/intra/assets/music/bedroom.mp3 similarity index 100% rename from mp3/bedroom.mp3 rename to intra/assets/music/bedroom.mp3 diff --git a/mp3/blank.mp3 b/intra/assets/music/blank.mp3 similarity index 100% rename from mp3/blank.mp3 rename to intra/assets/music/blank.mp3 diff --git a/mp3/blue.mp3 b/intra/assets/music/blue.mp3 similarity index 100% rename from mp3/blue.mp3 rename to intra/assets/music/blue.mp3 diff --git a/mp3/boss.mp3 b/intra/assets/music/boss.mp3 similarity index 100% rename from mp3/boss.mp3 rename to intra/assets/music/boss.mp3 diff --git a/mp3/briar-fight.mp3 b/intra/assets/music/briar-fight.mp3 similarity index 100% rename from mp3/briar-fight.mp3 rename to intra/assets/music/briar-fight.mp3 diff --git a/mp3/cell.mp3 b/intra/assets/music/cell.mp3 similarity index 100% rename from mp3/cell.mp3 rename to intra/assets/music/cell.mp3 diff --git a/mp3/circus-boss.mp3 b/intra/assets/music/circus-boss.mp3 similarity index 100% rename from mp3/circus-boss.mp3 rename to intra/assets/music/circus-boss.mp3 diff --git a/mp3/circus.mp3 b/intra/assets/music/circus.mp3 similarity index 100% rename from mp3/circus.mp3 rename to intra/assets/music/circus.mp3 diff --git a/mp3/cliff.mp3 b/intra/assets/music/cliff.mp3 similarity index 100% rename from mp3/cliff.mp3 rename to intra/assets/music/cliff.mp3 diff --git a/mp3/crowd.mp3 b/intra/assets/music/crowd.mp3 similarity index 100% rename from mp3/crowd.mp3 rename to intra/assets/music/crowd.mp3 diff --git a/mp3/crowd_boss.mp3 b/intra/assets/music/crowd_boss.mp3 similarity index 100% rename from mp3/crowd_boss.mp3 rename to intra/assets/music/crowd_boss.mp3 diff --git a/mp3/ending.mp3 b/intra/assets/music/ending.mp3 similarity index 100% rename from mp3/ending.mp3 rename to intra/assets/music/ending.mp3 diff --git a/mp3/fields.mp3 b/intra/assets/music/fields.mp3 similarity index 100% rename from mp3/fields.mp3 rename to intra/assets/music/fields.mp3 diff --git a/mp3/forest.mp3 b/intra/assets/music/forest.mp3 similarity index 100% rename from mp3/forest.mp3 rename to intra/assets/music/forest.mp3 diff --git a/mp3/gameover.mp3 b/intra/assets/music/gameover.mp3 similarity index 100% rename from mp3/gameover.mp3 rename to intra/assets/music/gameover.mp3 diff --git a/mp3/go.mp3 b/intra/assets/music/go.mp3 similarity index 100% rename from mp3/go.mp3 rename to intra/assets/music/go.mp3 diff --git a/mp3/happy-init.mp3 b/intra/assets/music/happy-init.mp3 similarity index 100% rename from mp3/happy-init.mp3 rename to intra/assets/music/happy-init.mp3 diff --git a/mp3/happy.mp3 b/intra/assets/music/happy.mp3 similarity index 100% rename from mp3/happy.mp3 rename to intra/assets/music/happy.mp3 diff --git a/mp3/hotel-boss.mp3 b/intra/assets/music/hotel-boss.mp3 similarity index 100% rename from mp3/hotel-boss.mp3 rename to intra/assets/music/hotel-boss.mp3 diff --git a/mp3/hotel.mp3 b/intra/assets/music/hotel.mp3 similarity index 100% rename from mp3/hotel.mp3 rename to intra/assets/music/hotel.mp3 diff --git a/mp3/mitra.mp3 b/intra/assets/music/mitra.mp3 similarity index 100% rename from mp3/mitra.mp3 rename to intra/assets/music/mitra.mp3 diff --git a/mp3/nexus.mp3 b/intra/assets/music/nexus.mp3 similarity index 100% rename from mp3/nexus.mp3 rename to intra/assets/music/nexus.mp3 diff --git a/mp3/overworld.mp3 b/intra/assets/music/overworld.mp3 similarity index 100% rename from mp3/overworld.mp3 rename to intra/assets/music/overworld.mp3 diff --git a/mp3/pre_terminal.mp3 b/intra/assets/music/pre_terminal.mp3 similarity index 100% rename from mp3/pre_terminal.mp3 rename to intra/assets/music/pre_terminal.mp3 diff --git a/mp3/red_cave.mp3 b/intra/assets/music/red_cave.mp3 similarity index 100% rename from mp3/red_cave.mp3 rename to intra/assets/music/red_cave.mp3 diff --git a/mp3/red_sea.mp3 b/intra/assets/music/red_sea.mp3 similarity index 100% rename from mp3/red_sea.mp3 rename to intra/assets/music/red_sea.mp3 diff --git a/mp3/redcave-boss.mp3 b/intra/assets/music/redcave-boss.mp3 similarity index 100% rename from mp3/redcave-boss.mp3 rename to intra/assets/music/redcave-boss.mp3 diff --git a/mp3/roof.mp3 b/intra/assets/music/roof.mp3 similarity index 100% rename from mp3/roof.mp3 rename to intra/assets/music/roof.mp3 diff --git a/mp3/sacrificial.mp3 b/intra/assets/music/sacrificial.mp3 similarity index 100% rename from mp3/sacrificial.mp3 rename to intra/assets/music/sacrificial.mp3 diff --git a/mp3/sagefight.mp3 b/intra/assets/music/sagefight.mp3 similarity index 100% rename from mp3/sagefight.mp3 rename to intra/assets/music/sagefight.mp3 diff --git a/mp3/soft.mp3 b/intra/assets/music/soft.mp3 similarity index 100% rename from mp3/soft.mp3 rename to intra/assets/music/soft.mp3 diff --git a/mp3/space.mp3 b/intra/assets/music/space.mp3 similarity index 100% rename from mp3/space.mp3 rename to intra/assets/music/space.mp3 diff --git a/mp3/street.mp3 b/intra/assets/music/street.mp3 similarity index 100% rename from mp3/street.mp3 rename to intra/assets/music/street.mp3 diff --git a/mp3/suburb.mp3 b/intra/assets/music/suburb.mp3 similarity index 100% rename from mp3/suburb.mp3 rename to intra/assets/music/suburb.mp3 diff --git a/mp3/terminal.mp3 b/intra/assets/music/terminal.mp3 similarity index 100% rename from mp3/terminal.mp3 rename to intra/assets/music/terminal.mp3 diff --git a/mp3/title.mp3 b/intra/assets/music/title.mp3 similarity index 100% rename from mp3/title.mp3 rename to intra/assets/music/title.mp3 diff --git a/mp3/windmill.mp3 b/intra/assets/music/windmill.mp3 similarity index 100% rename from mp3/windmill.mp3 rename to intra/assets/music/windmill.mp3 diff --git a/sfx/4sht_pop.mp3 b/intra/assets/sounds/4sht_pop.mp3 similarity index 100% rename from sfx/4sht_pop.mp3 rename to intra/assets/sounds/4sht_pop.mp3 diff --git a/sfx/4sht_shoot.mp3 b/intra/assets/sounds/4sht_shoot.mp3 similarity index 100% rename from sfx/4sht_shoot.mp3 rename to intra/assets/sounds/4sht_shoot.mp3 diff --git a/sfx/big_door_locked.mp3 b/intra/assets/sounds/big_door_locked.mp3 similarity index 100% rename from sfx/big_door_locked.mp3 rename to intra/assets/sounds/big_door_locked.mp3 diff --git a/sfx/big_wave.mp3 b/intra/assets/sounds/big_wave.mp3 similarity index 100% rename from sfx/big_wave.mp3 rename to intra/assets/sounds/big_wave.mp3 diff --git a/sfx/briar_shine.mp3 b/intra/assets/sounds/briar_shine.mp3 similarity index 100% rename from sfx/briar_shine.mp3 rename to intra/assets/sounds/briar_shine.mp3 diff --git a/sfx/broom_hit.mp3 b/intra/assets/sounds/broom_hit.mp3 similarity index 100% rename from sfx/broom_hit.mp3 rename to intra/assets/sounds/broom_hit.mp3 diff --git a/sfx/bubble_1.mp3 b/intra/assets/sounds/bubble_1.mp3 similarity index 100% rename from sfx/bubble_1.mp3 rename to intra/assets/sounds/bubble_1.mp3 diff --git a/sfx/bubble_2.mp3 b/intra/assets/sounds/bubble_2.mp3 similarity index 100% rename from sfx/bubble_2.mp3 rename to intra/assets/sounds/bubble_2.mp3 diff --git a/sfx/bubble_3.mp3 b/intra/assets/sounds/bubble_3.mp3 similarity index 100% rename from sfx/bubble_3.mp3 rename to intra/assets/sounds/bubble_3.mp3 diff --git a/sfx/bubble_loop.mp3 b/intra/assets/sounds/bubble_loop.mp3 similarity index 100% rename from sfx/bubble_loop.mp3 rename to intra/assets/sounds/bubble_loop.mp3 diff --git a/sfx/bubble_triple.mp3 b/intra/assets/sounds/bubble_triple.mp3 similarity index 100% rename from sfx/bubble_triple.mp3 rename to intra/assets/sounds/bubble_triple.mp3 diff --git a/sfx/button_down.mp3 b/intra/assets/sounds/button_down.mp3 similarity index 100% rename from sfx/button_down.mp3 rename to intra/assets/sounds/button_down.mp3 diff --git a/sfx/button_up.mp3 b/intra/assets/sounds/button_up.mp3 similarity index 100% rename from sfx/button_up.mp3 rename to intra/assets/sounds/button_up.mp3 diff --git a/sfx/cicada_chirp.mp3 b/intra/assets/sounds/cicada_chirp.mp3 similarity index 100% rename from sfx/cicada_chirp.mp3 rename to intra/assets/sounds/cicada_chirp.mp3 diff --git a/sfx/cross2.mp3 b/intra/assets/sounds/cross2.mp3 similarity index 100% rename from sfx/cross2.mp3 rename to intra/assets/sounds/cross2.mp3 diff --git a/sfx/cross3.mp3 b/intra/assets/sounds/cross3.mp3 similarity index 100% rename from sfx/cross3.mp3 rename to intra/assets/sounds/cross3.mp3 diff --git a/sfx/cross4.mp3 b/intra/assets/sounds/cross4.mp3 similarity index 100% rename from sfx/cross4.mp3 rename to intra/assets/sounds/cross4.mp3 diff --git a/sfx/dash_pad_1.mp3 b/intra/assets/sounds/dash_pad_1.mp3 similarity index 100% rename from sfx/dash_pad_1.mp3 rename to intra/assets/sounds/dash_pad_1.mp3 diff --git a/sfx/dash_pad_2.mp3 b/intra/assets/sounds/dash_pad_2.mp3 similarity index 100% rename from sfx/dash_pad_2.mp3 rename to intra/assets/sounds/dash_pad_2.mp3 diff --git a/sfx/dialogue_blip.mp3 b/intra/assets/sounds/dialogue_blip.mp3 similarity index 100% rename from sfx/dialogue_blip.mp3 rename to intra/assets/sounds/dialogue_blip.mp3 diff --git a/sfx/dialogue_bloop.mp3 b/intra/assets/sounds/dialogue_bloop.mp3 similarity index 100% rename from sfx/dialogue_bloop.mp3 rename to intra/assets/sounds/dialogue_bloop.mp3 diff --git a/sfx/dog_bark.mp3 b/intra/assets/sounds/dog_bark.mp3 similarity index 100% rename from sfx/dog_bark.mp3 rename to intra/assets/sounds/dog_bark.mp3 diff --git a/sfx/dog_dash.mp3 b/intra/assets/sounds/dog_dash.mp3 similarity index 100% rename from sfx/dog_dash.mp3 rename to intra/assets/sounds/dog_dash.mp3 diff --git a/sfx/dust_explode.mp3 b/intra/assets/sounds/dust_explode.mp3 similarity index 100% rename from sfx/dust_explode.mp3 rename to intra/assets/sounds/dust_explode.mp3 diff --git a/sfx/dustmaid_alert.mp3 b/intra/assets/sounds/dustmaid_alert.mp3 similarity index 100% rename from sfx/dustmaid_alert.mp3 rename to intra/assets/sounds/dustmaid_alert.mp3 diff --git a/sfx/dustpoof.mp3 b/intra/assets/sounds/dustpoof.mp3 similarity index 100% rename from sfx/dustpoof.mp3 rename to intra/assets/sounds/dustpoof.mp3 diff --git a/sfx/elevator_close.mp3 b/intra/assets/sounds/elevator_close.mp3 similarity index 100% rename from sfx/elevator_close.mp3 rename to intra/assets/sounds/elevator_close.mp3 diff --git a/sfx/elevator_open.mp3 b/intra/assets/sounds/elevator_open.mp3 similarity index 100% rename from sfx/elevator_open.mp3 rename to intra/assets/sounds/elevator_open.mp3 diff --git a/sfx/enter_Door.mp3 b/intra/assets/sounds/enter_Door.mp3 similarity index 100% rename from sfx/enter_Door.mp3 rename to intra/assets/sounds/enter_Door.mp3 diff --git a/sfx/fall_1.mp3 b/intra/assets/sounds/fall_1.mp3 similarity index 100% rename from sfx/fall_1.mp3 rename to intra/assets/sounds/fall_1.mp3 diff --git a/sfx/fall_in_hole.mp3 b/intra/assets/sounds/fall_in_hole.mp3 similarity index 100% rename from sfx/fall_in_hole.mp3 rename to intra/assets/sounds/fall_in_hole.mp3 diff --git a/sfx/fireball.mp3 b/intra/assets/sounds/fireball.mp3 similarity index 100% rename from sfx/fireball.mp3 rename to intra/assets/sounds/fireball.mp3 diff --git a/sfx/flame_pillar.mp3 b/intra/assets/sounds/flame_pillar.mp3 similarity index 100% rename from sfx/flame_pillar.mp3 rename to intra/assets/sounds/flame_pillar.mp3 diff --git a/sfx/floor_crack.mp3 b/intra/assets/sounds/floor_crack.mp3 similarity index 100% rename from sfx/floor_crack.mp3 rename to intra/assets/sounds/floor_crack.mp3 diff --git a/sfx/gasguy_move.mp3 b/intra/assets/sounds/gasguy_move.mp3 similarity index 100% rename from sfx/gasguy_move.mp3 rename to intra/assets/sounds/gasguy_move.mp3 diff --git a/sfx/gasguy_shoot.mp3 b/intra/assets/sounds/gasguy_shoot.mp3 similarity index 100% rename from sfx/gasguy_shoot.mp3 rename to intra/assets/sounds/gasguy_shoot.mp3 diff --git a/sfx/get_small_health.mp3 b/intra/assets/sounds/get_small_health.mp3 similarity index 100% rename from sfx/get_small_health.mp3 rename to intra/assets/sounds/get_small_health.mp3 diff --git a/sfx/gettreasure.mp3 b/intra/assets/sounds/gettreasure.mp3 similarity index 100% rename from sfx/gettreasure.mp3 rename to intra/assets/sounds/gettreasure.mp3 diff --git a/sfx/hit_ground_1.mp3 b/intra/assets/sounds/hit_ground_1.mp3 similarity index 100% rename from sfx/hit_ground_1.mp3 rename to intra/assets/sounds/hit_ground_1.mp3 diff --git a/sfx/hit_slime.mp3 b/intra/assets/sounds/hit_slime.mp3 similarity index 100% rename from sfx/hit_slime.mp3 rename to intra/assets/sounds/hit_slime.mp3 diff --git a/sfx/hit_wall.mp3 b/intra/assets/sounds/hit_wall.mp3 similarity index 100% rename from sfx/hit_wall.mp3 rename to intra/assets/sounds/hit_wall.mp3 diff --git a/sfx/keyget.mp3 b/intra/assets/sounds/keyget.mp3 similarity index 100% rename from sfx/keyget.mp3 rename to intra/assets/sounds/keyget.mp3 diff --git a/sfx/ladder_step_1.mp3 b/intra/assets/sounds/ladder_step_1.mp3 similarity index 100% rename from sfx/ladder_step_1.mp3 rename to intra/assets/sounds/ladder_step_1.mp3 diff --git a/sfx/ladder_step_2.mp3 b/intra/assets/sounds/ladder_step_2.mp3 similarity index 100% rename from sfx/ladder_step_2.mp3 rename to intra/assets/sounds/ladder_step_2.mp3 diff --git a/sfx/laser-pew.mp3 b/intra/assets/sounds/laser-pew.mp3 similarity index 100% rename from sfx/laser-pew.mp3 rename to intra/assets/sounds/laser-pew.mp3 diff --git a/sfx/laser_charge.mp3 b/intra/assets/sounds/laser_charge.mp3 similarity index 100% rename from sfx/laser_charge.mp3 rename to intra/assets/sounds/laser_charge.mp3 diff --git a/sfx/laser_fire.mp3 b/intra/assets/sounds/laser_fire.mp3 similarity index 100% rename from sfx/laser_fire.mp3 rename to intra/assets/sounds/laser_fire.mp3 diff --git a/sfx/menu_move.mp3 b/intra/assets/sounds/menu_move.mp3 similarity index 100% rename from sfx/menu_move.mp3 rename to intra/assets/sounds/menu_move.mp3 diff --git a/sfx/menu_select.mp3 b/intra/assets/sounds/menu_select.mp3 similarity index 100% rename from sfx/menu_select.mp3 rename to intra/assets/sounds/menu_select.mp3 diff --git a/sfx/mover_die.mp3 b/intra/assets/sounds/mover_die.mp3 similarity index 100% rename from sfx/mover_die.mp3 rename to intra/assets/sounds/mover_die.mp3 diff --git a/sfx/mover_move.mp3 b/intra/assets/sounds/mover_move.mp3 similarity index 100% rename from sfx/mover_move.mp3 rename to intra/assets/sounds/mover_move.mp3 diff --git a/sfx/noise_step_1.mp3 b/intra/assets/sounds/noise_step_1.mp3 similarity index 100% rename from sfx/noise_step_1.mp3 rename to intra/assets/sounds/noise_step_1.mp3 diff --git a/sfx/on_off_laser_shoot.mp3 b/intra/assets/sounds/on_off_laser_shoot.mp3 similarity index 100% rename from sfx/on_off_laser_shoot.mp3 rename to intra/assets/sounds/on_off_laser_shoot.mp3 diff --git a/sfx/open.mp3 b/intra/assets/sounds/open.mp3 similarity index 100% rename from sfx/open.mp3 rename to intra/assets/sounds/open.mp3 diff --git a/sfx/pause_sound.mp3 b/intra/assets/sounds/pause_sound.mp3 similarity index 100% rename from sfx/pause_sound.mp3 rename to intra/assets/sounds/pause_sound.mp3 diff --git a/sfx/player_hit_1.mp3 b/intra/assets/sounds/player_hit_1.mp3 similarity index 100% rename from sfx/player_hit_1.mp3 rename to intra/assets/sounds/player_hit_1.mp3 diff --git a/sfx/player_jump_down.mp3 b/intra/assets/sounds/player_jump_down.mp3 similarity index 100% rename from sfx/player_jump_down.mp3 rename to intra/assets/sounds/player_jump_down.mp3 diff --git a/sfx/player_jump_up.mp3 b/intra/assets/sounds/player_jump_up.mp3 similarity index 100% rename from sfx/player_jump_up.mp3 rename to intra/assets/sounds/player_jump_up.mp3 diff --git a/sfx/puddle_down.mp3 b/intra/assets/sounds/puddle_down.mp3 similarity index 100% rename from sfx/puddle_down.mp3 rename to intra/assets/sounds/puddle_down.mp3 diff --git a/sfx/puddle_step.mp3 b/intra/assets/sounds/puddle_step.mp3 similarity index 100% rename from sfx/puddle_step.mp3 rename to intra/assets/sounds/puddle_step.mp3 diff --git a/sfx/puddle_up.mp3 b/intra/assets/sounds/puddle_up.mp3 similarity index 100% rename from sfx/puddle_up.mp3 rename to intra/assets/sounds/puddle_up.mp3 diff --git a/sfx/pushblock.mp3 b/intra/assets/sounds/pushblock.mp3 similarity index 100% rename from sfx/pushblock.mp3 rename to intra/assets/sounds/pushblock.mp3 diff --git a/sfx/rain.mp3 b/intra/assets/sounds/rain.mp3 similarity index 100% rename from sfx/rain.mp3 rename to intra/assets/sounds/rain.mp3 diff --git a/sfx/rat_move.mp3 b/intra/assets/sounds/rat_move.mp3 similarity index 100% rename from sfx/rat_move.mp3 rename to intra/assets/sounds/rat_move.mp3 diff --git a/sfx/red_cave_rise.mp3 b/intra/assets/sounds/red_cave_rise.mp3 similarity index 100% rename from sfx/red_cave_rise.mp3 rename to intra/assets/sounds/red_cave_rise.mp3 diff --git a/sfx/redboss_death.mp3 b/intra/assets/sounds/redboss_death.mp3 similarity index 100% rename from sfx/redboss_death.mp3 rename to intra/assets/sounds/redboss_death.mp3 diff --git a/sfx/redboss_moan.mp3 b/intra/assets/sounds/redboss_moan.mp3 similarity index 100% rename from sfx/redboss_moan.mp3 rename to intra/assets/sounds/redboss_moan.mp3 diff --git a/sfx/sb_ball_appear.mp3 b/intra/assets/sounds/sb_ball_appear.mp3 similarity index 100% rename from sfx/sb_ball_appear.mp3 rename to intra/assets/sounds/sb_ball_appear.mp3 diff --git a/sfx/sb_dash.mp3 b/intra/assets/sounds/sb_dash.mp3 similarity index 100% rename from sfx/sb_dash.mp3 rename to intra/assets/sounds/sb_dash.mp3 diff --git a/sfx/sb_hurt.mp3 b/intra/assets/sounds/sb_hurt.mp3 similarity index 100% rename from sfx/sb_hurt.mp3 rename to intra/assets/sounds/sb_hurt.mp3 diff --git a/sfx/sb_split.mp3 b/intra/assets/sounds/sb_split.mp3 similarity index 100% rename from sfx/sb_split.mp3 rename to intra/assets/sounds/sb_split.mp3 diff --git a/sfx/sf_move.mp3 b/intra/assets/sounds/sf_move.mp3 similarity index 100% rename from sfx/sf_move.mp3 rename to intra/assets/sounds/sf_move.mp3 diff --git a/sfx/shieldy-hit.mp3 b/intra/assets/sounds/shieldy-hit.mp3 similarity index 100% rename from sfx/shieldy-hit.mp3 rename to intra/assets/sounds/shieldy-hit.mp3 diff --git a/sfx/shieldy_ineffective.mp3 b/intra/assets/sounds/shieldy_ineffective.mp3 similarity index 100% rename from sfx/shieldy_ineffective.mp3 rename to intra/assets/sounds/shieldy_ineffective.mp3 diff --git a/sfx/slasher_atk.mp3 b/intra/assets/sounds/slasher_atk.mp3 similarity index 100% rename from sfx/slasher_atk.mp3 rename to intra/assets/sounds/slasher_atk.mp3 diff --git a/sfx/slime_shoot.mp3 b/intra/assets/sounds/slime_shoot.mp3 similarity index 100% rename from sfx/slime_shoot.mp3 rename to intra/assets/sounds/slime_shoot.mp3 diff --git a/sfx/slime_splash.mp3 b/intra/assets/sounds/slime_splash.mp3 similarity index 100% rename from sfx/slime_splash.mp3 rename to intra/assets/sounds/slime_splash.mp3 diff --git a/sfx/slime_walk.mp3 b/intra/assets/sounds/slime_walk.mp3 similarity index 100% rename from sfx/slime_walk.mp3 rename to intra/assets/sounds/slime_walk.mp3 diff --git a/sfx/small_wave.mp3 b/intra/assets/sounds/small_wave.mp3 similarity index 100% rename from sfx/small_wave.mp3 rename to intra/assets/sounds/small_wave.mp3 diff --git a/sfx/space.mp3 b/intra/assets/sounds/space.mp3 similarity index 100% rename from sfx/space.mp3 rename to intra/assets/sounds/space.mp3 diff --git a/sfx/sparkle_1.mp3 b/intra/assets/sounds/sparkle_1.mp3 similarity index 100% rename from sfx/sparkle_1.mp3 rename to intra/assets/sounds/sparkle_1.mp3 diff --git a/sfx/sparkle_2.mp3 b/intra/assets/sounds/sparkle_2.mp3 similarity index 100% rename from sfx/sparkle_2.mp3 rename to intra/assets/sounds/sparkle_2.mp3 diff --git a/sfx/sparkle_3.mp3 b/intra/assets/sounds/sparkle_3.mp3 similarity index 100% rename from sfx/sparkle_3.mp3 rename to intra/assets/sounds/sparkle_3.mp3 diff --git a/sfx/spring_bounce.mp3 b/intra/assets/sounds/spring_bounce.mp3 similarity index 100% rename from sfx/spring_bounce.mp3 rename to intra/assets/sounds/spring_bounce.mp3 diff --git a/sfx/stream.mp3 b/intra/assets/sounds/stream.mp3 similarity index 100% rename from sfx/stream.mp3 rename to intra/assets/sounds/stream.mp3 diff --git a/sfx/sun_guy_charge.mp3 b/intra/assets/sounds/sun_guy_charge.mp3 similarity index 100% rename from sfx/sun_guy_charge.mp3 rename to intra/assets/sounds/sun_guy_charge.mp3 diff --git a/sfx/sun_guy_death_long.mp3 b/intra/assets/sounds/sun_guy_death_long.mp3 similarity index 100% rename from sfx/sun_guy_death_long.mp3 rename to intra/assets/sounds/sun_guy_death_long.mp3 diff --git a/sfx/sun_guy_death_short.mp3 b/intra/assets/sounds/sun_guy_death_short.mp3 similarity index 100% rename from sfx/sun_guy_death_short.mp3 rename to intra/assets/sounds/sun_guy_death_short.mp3 diff --git a/sfx/sun_guy_scream.mp3 b/intra/assets/sounds/sun_guy_scream.mp3 similarity index 100% rename from sfx/sun_guy_scream.mp3 rename to intra/assets/sounds/sun_guy_scream.mp3 diff --git a/sfx/sun_guy_scream2.mp3 b/intra/assets/sounds/sun_guy_scream2.mp3 similarity index 100% rename from sfx/sun_guy_scream2.mp3 rename to intra/assets/sounds/sun_guy_scream2.mp3 diff --git a/sfx/swing_broom_1.mp3 b/intra/assets/sounds/swing_broom_1.mp3 similarity index 100% rename from sfx/swing_broom_1.mp3 rename to intra/assets/sounds/swing_broom_1.mp3 diff --git a/sfx/swing_broom_2.mp3 b/intra/assets/sounds/swing_broom_2.mp3 similarity index 100% rename from sfx/swing_broom_2.mp3 rename to intra/assets/sounds/swing_broom_2.mp3 diff --git a/sfx/swing_broom_3.mp3 b/intra/assets/sounds/swing_broom_3.mp3 similarity index 100% rename from sfx/swing_broom_3.mp3 rename to intra/assets/sounds/swing_broom_3.mp3 diff --git a/sfx/talk_1.mp3 b/intra/assets/sounds/talk_1.mp3 similarity index 100% rename from sfx/talk_1.mp3 rename to intra/assets/sounds/talk_1.mp3 diff --git a/sfx/talk_2.mp3 b/intra/assets/sounds/talk_2.mp3 similarity index 100% rename from sfx/talk_2.mp3 rename to intra/assets/sounds/talk_2.mp3 diff --git a/sfx/talk_3.mp3 b/intra/assets/sounds/talk_3.mp3 similarity index 100% rename from sfx/talk_3.mp3 rename to intra/assets/sounds/talk_3.mp3 diff --git a/sfx/talk_death.mp3 b/intra/assets/sounds/talk_death.mp3 similarity index 100% rename from sfx/talk_death.mp3 rename to intra/assets/sounds/talk_death.mp3 diff --git a/sfx/teleguy_down.mp3 b/intra/assets/sounds/teleguy_down.mp3 similarity index 100% rename from sfx/teleguy_down.mp3 rename to intra/assets/sounds/teleguy_down.mp3 diff --git a/sfx/teleguy_up.mp3 b/intra/assets/sounds/teleguy_up.mp3 similarity index 100% rename from sfx/teleguy_up.mp3 rename to intra/assets/sounds/teleguy_up.mp3 diff --git a/sfx/teleport_down.mp3 b/intra/assets/sounds/teleport_down.mp3 similarity index 100% rename from sfx/teleport_down.mp3 rename to intra/assets/sounds/teleport_down.mp3 diff --git a/sfx/teleport_up.mp3 b/intra/assets/sounds/teleport_up.mp3 similarity index 100% rename from sfx/teleport_up.mp3 rename to intra/assets/sounds/teleport_up.mp3 diff --git a/sfx/unlock.mp3 b/intra/assets/sounds/unlock.mp3 similarity index 100% rename from sfx/unlock.mp3 rename to intra/assets/sounds/unlock.mp3 diff --git a/sfx/water_step.mp3 b/intra/assets/sounds/water_step.mp3 similarity index 100% rename from sfx/water_step.mp3 rename to intra/assets/sounds/water_step.mp3 diff --git a/sfx/wavesandwind.mp3 b/intra/assets/sounds/wavesandwind.mp3 similarity index 100% rename from sfx/wavesandwind.mp3 rename to intra/assets/sounds/wavesandwind.mp3 diff --git a/sfx/wb_hit_ground.mp3 b/intra/assets/sounds/wb_hit_ground.mp3 similarity index 100% rename from sfx/wb_hit_ground.mp3 rename to intra/assets/sounds/wb_hit_ground.mp3 diff --git a/sfx/wb_moan.mp3 b/intra/assets/sounds/wb_moan.mp3 similarity index 100% rename from sfx/wb_moan.mp3 rename to intra/assets/sounds/wb_moan.mp3 diff --git a/sfx/wb_moan_2.mp3 b/intra/assets/sounds/wb_moan_2.mp3 similarity index 100% rename from sfx/wb_moan_2.mp3 rename to intra/assets/sounds/wb_moan_2.mp3 diff --git a/sfx/wb_shoot.mp3 b/intra/assets/sounds/wb_shoot.mp3 similarity index 100% rename from sfx/wb_shoot.mp3 rename to intra/assets/sounds/wb_shoot.mp3 diff --git a/sfx/wb_tap_ground.mp3 b/intra/assets/sounds/wb_tap_ground.mp3 similarity index 100% rename from sfx/wb_tap_ground.mp3 rename to intra/assets/sounds/wb_tap_ground.mp3 diff --git a/intra/bin/icons/1024.jpg b/intra/icons/1024.jpg similarity index 100% rename from intra/bin/icons/1024.jpg rename to intra/icons/1024.jpg diff --git a/intra/bin/icons/1024.png b/intra/icons/1024.png similarity index 100% rename from intra/bin/icons/1024.png rename to intra/icons/1024.png diff --git a/intra/bin/icons/114.png b/intra/icons/114.png similarity index 100% rename from intra/bin/icons/114.png rename to intra/icons/114.png diff --git a/intra/bin/icons/144.png b/intra/icons/144.png similarity index 100% rename from intra/bin/icons/144.png rename to intra/icons/144.png diff --git a/intra/bin/icons/22_29.png b/intra/icons/22_29.png similarity index 100% rename from intra/bin/icons/22_29.png rename to intra/icons/22_29.png diff --git a/intra/bin/icons/320.png b/intra/icons/320.png similarity index 100% rename from intra/bin/icons/320.png rename to intra/icons/320.png diff --git a/intra/bin/icons/44_58.png b/intra/icons/44_58.png similarity index 100% rename from intra/bin/icons/44_58.png rename to intra/icons/44_58.png diff --git a/intra/bin/icons/58.png b/intra/icons/58.png similarity index 100% rename from intra/bin/icons/58.png rename to intra/icons/58.png diff --git a/intra/bin/icons/64.png b/intra/icons/64.png similarity index 100% rename from intra/bin/icons/64.png rename to intra/icons/64.png diff --git a/intra/bin/icons/640.png b/intra/icons/640.png similarity index 100% rename from intra/bin/icons/640.png rename to intra/icons/640.png diff --git a/intra/bin/icons/72.png b/intra/icons/72.png similarity index 100% rename from intra/bin/icons/72.png rename to intra/icons/72.png diff --git a/intra/bin/icons/96.png b/intra/icons/96.png similarity index 100% rename from intra/bin/icons/96.png rename to intra/icons/96.png diff --git a/intra/bin/icons/IntraAIR128.png b/intra/icons/IntraAIR128.png similarity index 100% rename from intra/bin/icons/IntraAIR128.png rename to intra/icons/IntraAIR128.png diff --git a/intra/bin/icons/IntraAIR29.png b/intra/icons/IntraAIR29.png similarity index 100% rename from intra/bin/icons/IntraAIR29.png rename to intra/icons/IntraAIR29.png diff --git a/intra/bin/icons/IntraAIR32.png b/intra/icons/IntraAIR32.png similarity index 100% rename from intra/bin/icons/IntraAIR32.png rename to intra/icons/IntraAIR32.png diff --git a/intra/bin/icons/IntraAIR48.png b/intra/icons/IntraAIR48.png similarity index 100% rename from intra/bin/icons/IntraAIR48.png rename to intra/icons/IntraAIR48.png diff --git a/intra/bin/icons/IntraAIR512.png b/intra/icons/IntraAIR512.png similarity index 100% rename from intra/bin/icons/IntraAIR512.png rename to intra/icons/IntraAIR512.png diff --git a/intra/bin/icons/IntraAIR57.png b/intra/icons/IntraAIR57.png similarity index 100% rename from intra/bin/icons/IntraAIR57.png rename to intra/icons/IntraAIR57.png diff --git a/intra/bin/icons/ouya_icon.png b/intra/icons/ouya_icon.png similarity index 100% rename from intra/bin/icons/ouya_icon.png rename to intra/icons/ouya_icon.png diff --git a/intra/source/Intra.hx b/intra/source/Intra.hx new file mode 100644 index 0000000..d13ec15 --- /dev/null +++ b/intra/source/Intra.hx @@ -0,0 +1,1792 @@ +package; + +// import com.amanitadesign.steam.SteamEvent; +//import com.newgrounds.*; +// import com.newgrounds.components.MedalPopup; +import data.Common_Sprites; +import data.SoundData; +import entity.decoration.Light; +import entity.enemy.crowd.Person; +import entity.player.Player; +import extension.JoyQuery.Joystick; +import flash.desktop.NativeApplication; +import flash.desktop.NativeWindowIcon; +import flash.desktop.SystemIdleMode; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.display.StageAlign; +import flash.display.StageAspectRatio; +import flash.display.StageDisplayState; +import flash.display.StageOrientation; +import flash.display.StageScaleMode; +import flash.events.Event; +import flash.events.KeyboardEvent; +import flash.events.MouseEvent; +import flash.events.StageOrientationEvent; +import flash.events.TouchEvent; +import flash.events.TransformGestureEvent; +import flash.events.VideoEvent; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.media.AudioPlaybackMode; +import flash.media.SoundMixer; +import flash.system.Capabilities; +import flash.ui.Keyboard; +import flash.ui.Multitouch; +import flash.ui.MultitouchInputMode; +import flash.utils.ByteArray; +import flash.utils.describeType; +import flash.utils.Dictionary; +import global.*; +import helper.Achievements; +import helper.DH; +import helper.S_NPC; +import mx.managers.SystemManagerGlobals; +import org.flixel.*; +import states.*; +class Intra extends FlxGame { + + public static var Intraintra:Intra; + public static var scale_ctr:Int=0; + public var did_init_fullscreening:Bool=false; + private var full_scale_offset:Point=new Point(0, 0); + private var ratio:Float; + private var is_landscape:Bool=true; + + private var oriented_landscape:Bool=false; + private var oriented_portrait:Bool=false; + public static var frame_x_px:Int=8;// Extra pixels + public static var frame_y_px:Int=26; + public static var did_window_config:Bool=false; + + public static var is_release:Bool=false;// Makes the game in demo mode(I know, sorry) + public static var is_demo:Bool=false;// Set this for normal release version. + public static var is_melos:Bool=false;// Don't know what this does. + public static var is_test:Bool=false; + public static var is_web:Bool=false;// Newgrounds achievements/other things in menu + public static var is_air:Bool=false;// Joystick stuff off/on + public static var is_mobile:Bool=false;// Is this the mobile version + public static var is_ios:Bool=false; + public static var is_ouya:Bool=false; + + public static var IS_WINDOWS:Bool=false; + public static var IS_MAC:Bool=false; + public static var IS_LINUX:Bool=false; + + + public static var allow_fuck_it_mode:Bool=false; + private var did_init_window_fix:Bool=false; + + private var did_mobile_setup:Bool=false; + public static var mobile_is_rhand:Bool=true; + + public static var force_scale:Bool=false; + public static var scale_factor:Int=3; + public static inline var SCALE_TYPE_WINDOWED:Int=0; + public static inline var SCALE_TYPE_INT:Int=1; + public static inline var SCALE_TYPE_FIT:Int=2; + + // Hitboxes + public var no_zone:Rectangle=new Rectangle(1, 1, 1, 1); + public var up_sprite:Bitmap; + public var down_sprite:Bitmap; + public var left_sprite:Bitmap; + public var right_sprite:Bitmap; + + public var a1_sprite:Bitmap; + public var a2_sprite:Bitmap; + public var pause_sprite:Bitmap; + + public var MOBILE_DPAD_SCALE:Float=1; + public var MOBILE_ACTIONS_SCALE:Float=1; + public var MOBILE_PAUSE_SCALE:Float=1; + + + // Actual gui iimages + private static var icon_thumb:Bitmap; + private static var icon_dpad:Bitmap; + private static var icon_dpad_frame:Int=0; + private static var icon_pause:Bitmap; + private static var icon_c:Bitmap; + private static var icon_x:Bitmap; + private static var icon_menu:Bitmap; + private static var icon_x_frame:Int=-1; + private static var icon_c_frame:Int=-1; + private static var icon_menu_frame:Int=-1; + + public var mobile_bg:Bitmap; + public static var left_bar:Bitmap; + public static var right_bar:Bitmap; + public var move_point_id:Int=-1; + + + //[Embed(source="res/sprites/mobile/button_c.png")] public static inline var embed_mobile_c:Class; + //[Embed(source="res/sprites/mobile/button_x.png")] public static inline var embed_mobile_x:Class; + //[Embed(source="res/sprites/mobile/button_menu.png")] public static inline var embed_mobile_pause:Class; + //[Embed(source="res/sprites/mobile/button_dpad.png")] public static inline var embed_mobile_dpad:Class; + //[Embed(source="res/sprites/mobile/screenedge_left.png")] public static inline var embed_bar_left:Class; + //[Embed(source="res/sprites/mobile/screenedge_right.png")] public static inline var embed_bar_right:Class; + //[Embed(source="res/sprites/mobile/thumb.png")] public static inline var embed_thumb:Class; + + + // Holds entire bitmap data + private static var dpad_data:Bitmap; + private static var x_data:Bitmap; + private static var c_data:Bitmap; + private static var menu_data:Bitmap; + + private var t_up:Float=0; + private var tm_up:Float=0.2; + + public function new(){ + + for(i in 0...Registry.DOOR_INFO.length){ + Registry.DOOR_INFO[i]=new Array(); + + } + Registry.embed2saveXML(); + Registry.checkDoorInfo(); + Registry.sound_data=new SoundData(); + Common_Sprites.init(); + DH.init_dialogue_state(); + + Registry.CUR_HEALTH=Registry.MAX_HEALTH=6; + + Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; + + is_demo=true;// Lots of little flags of whether debug stuff works - set true for release + //is_release=true;// Prevents leaving FIELDS, make windmill red gate msg show up, makes "buy demo/greenlight" appear + //is_mobile=true;// Makes different config options show, pulls up the gui... + //is_web=true;// Should the config for air that freezes the game go away, also turns on NG medals + if(is_web){ + did_window_config=true; + } + + is_test=false;// Whether tutorial popups appear - false to make appear + allow_fuck_it_mode=false; + + //debug_mode(); + if(!is_demo){ + Registry.autosave_on=false;// !!!!!!! + did_init_fullscreening=true; + debug_mode(); + Registry.SAVE_NAME="ANODYNE_DEMO_SAVE_123"; + } + var ps:Class=make_play_or_roam_state(); + var active:Class; + + // Default values, may change with the Save.load()call + Registry.GE_States[Registry.GE_MOBILE_IS_RHAND]=true; + Registry.GE_States[Registry.GE_MOBILE_IS_XC]=true; + + if(is_demo){ + if(Save.load(true)){ + did_init_fullscreening=true;//recall settings + } // So we don't the screen config if the dirty flag is "y" + active=ps; + } else { + active=ps; + } + + if(Intra.IS_MAC){ + did_init_fullscreening=true; + } + + if(is_ouya){ + did_init_fullscreening=true; + did_window_config=true; + } + + mobile_is_rhand=Registry.GE_States[Registry.GE_MOBILE_IS_RHAND]; + + //NOTE THAT AUTOSAVING OVERWRITES STUFF WHEN TESTING + //Registry.FUCK_IT_MODE_ON=true; + super(160, 180, TitleState, 3); + //super(160, 180, IntroScene, 3); + //super(160, 180, EndingState, 3); + if(is_mobile){ + intraintra=this; + frame_x_px=frame_y_px=0; + } + + //Registry.CURRENT_MAP_NAME="SPACE"; + //Registry.ENTRANCE_PLAYER_X=160*3; + //Registry.ENTRANCE_PLAYER_Y=160 * 3; + // + //super(160, 180, active, 3, 60,30); + FlxG.volume=1; + + if(is_ouya){ + Registry.controls=new Array("UP", "DOWN", "LEFT", "RIGHT", "ENTER", "OUYA_A", "Z", "OUYA_START"); + Main.debugstring +="event listener added\n"; + NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handle_back_menu, false, 0, true); + } + + } + + private var win_joy_remove_timer:Float=1; + private var force_normalize:Bool=false; + private var t_normalize:Float=0; + private var ouya_init:Bool=false; + override private function update():Void + { + if(Intra.is_mobile && icon_thumb !=null){ + if(thumb_icon_timer>0){ + thumb_icon_timer -=FlxG.elapsed; + icon_thumb.alpha=0.9; + } else { + icon_thumb.alpha=0; + } + } + + if(Registry.FUCK_IT_MODE_ON){ + if(FlxG.keys.justPressed("L")){ + if(DH.language_type==DH.LANG_en){ + DH.set_language(DH.LANG_ja); + } else { + DH.set_language(DH.LANG_en); + } + } + } + if(FlxG.keys.justPressed("B")){ + backwards=!backwards; + trace(backwards); + } + //if(is_ouya){ + //if(stage !=null && !ouya_init){ + //ouya_init=true; + //joypad.init(stage); + //} + //if(joypad.attached_once==false){ + //if(GameInput.numDevices>0){ + //Main.debugstring +="forcing attach\n"; + //joypad.handleDeviceAttached(new GameInputEvent(GameInputEvent.DEVICE_ADDED, true, false, GameInput.getDeviceAt(0))); + // + //} + //} + //} + + + if(t_back_dim>0){ + t_back_dim -=FlxG.elapsed; + if(t_back_dim<0){ + stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE; + } + } + if(t_normalize>0){ + t_normalize -=FlxG.elapsed; + if(t_normalize<0){ + stage.displayState=StageDisplayState.NORMAL; + } + } + if(Registry.FUCK_IT_MODE_ON){ + update_fuck_it(); + } + + update_controller(); + + if(!is_mobile){ + update_not_mobile(); + } else { + if(activate_timer>0){ + activate_timer -=FlxG.elapsed; + if(activate_timer<0){ + handle_orientation_change(new StageOrientationEvent(StageOrientationEvent.ORIENTATION_CHANGE, false, false, null, stage.deviceOrientation)); + } + if(force_normalize){ + t_back_dim=3; + t_normalize=1; + force_normalize=false; + } + stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE; + } + + + if(!did_mobile_setup && stage !=null){ + did_mobile_setup=true; + + + if(stage.deviceOrientation==StageOrientation.ROTATED_LEFT || stage.deviceOrientation==StageOrientation.ROTATED_RIGHT || stage.orientation==StageOrientation.ROTATED_LEFT || stage.orientation==StageOrientation.ROTATED_RIGHT){ + oriented_landscape=true; + trace("Start in landscape"); + } else { + oriented_portrait=true; + trace("Start in portrait"); + } + + + if(Intra.is_ios){ + // Add for iOS + SoundMixer.audioPlaybackMode=AudioPlaybackMode.AMBIENT; + } else { + stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE; + Main.debugstring +=stage.stageWidth.toString()+ "." + stage.stageHeight.toString()+ "\n" + stage.fullScreenWidth.toString()+ "." + stage.fullScreenHeight.toString()+ "\n"; + activate_timer=1; + force_normalize=true; + } + Main.max_uo.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + if(Main.ui_offsets.save_array !=null){ + // have to enforce minimums to be tappable + if(Main.ui_offsets.scale_landscape_dpad<=0.85){ + Main.ui_offsets.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + } + } else { + Main.ui_offsets.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + } + NativeApplication.nativeApplication.systemIdleMode=SystemIdleMode.KEEP_AWAKE; + + var long_length:Int=stage.fullScreenWidth>stage.fullScreenHeight ? stage.fullScreenWidth:stage.fullScreenHeight; + mobile_bg=new Bitmap(new BitmapData(long_length + 100, long_length + 100, true, 0xff06101b)); + mobile_bg.x=mobile_bg.y=0; + stage.addChildAt(mobile_bg, 0); + position_ui(); + + // These don't need to be added to check for logical overlaps!! + //stage.addChild(up_sprite); + //stage.addChild(down_sprite); + //stage.addChild(left_sprite); + //stage.addChild(right_sprite); + //stage.addChild(pause_sprite); + //stage.addChild(a1_sprite); + //stage.addChild(a2_sprite); + // + // These are the graphics the player sees, but logically do nothing. + + set_dpad_frame(4); + set_button_frame(0); + set_button_frame(1); + set_button_frame(2); + + // + //stage.addEventListener(MouseEvent.MOUSE_MOVE, handle_touch_move); + //stage.addEventListener(MouseEvent.MOUSE_UP, handle_mouse_click); + //stage.addEventListener(MouseEvent.MOUSE_DOWN, handle_mouse_click); + stage.addEventListener(TouchEvent.TOUCH_MOVE, handle_touch_move); + stage.addEventListener(TouchEvent.TOUCH_BEGIN, handle_mouse_click); + stage.addEventListener(TouchEvent.TOUCH_END, handle_mouse_click); + + stage.addEventListener(Event.DEACTIVATE, handle_deactivate); + stage.addEventListener(Event.ACTIVATE, handle_activate); + stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, handle_orientation_change); + + if(!Intra.is_ios){ + NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handle_back_menu, false, 0, true); + } + //FlxG.mouse.show(); + + } + + if(stage !=null){ + if(oriented_landscape){ + if(x !=Main.ui_offsets.landscape_game.x){ + x=Main.ui_offsets.landscape_game.x; + y=Main.ui_offsets.landscape_game.y; + } + } else { + if(x !=Main.ui_offsets.portrait_game.x){ + x=Main.ui_offsets.portrait_game.x; + y=Main.ui_offsets.portrait_game.y; + } + } + } + } + super.update(); + } + + private var t_back_dim:Float=0; + public function handle_back_menu(event:KeyboardEvent):Void { + if(is_ouya){ + if(event.keyCode==Keyboard.BACK){ + Main.debugstring +="BACK\n"; + Keys.FORCE_ACTION_2=true; + event.stopImmediatePropagation(); + event.preventDefault(); + } else if(event.keyCode==Keyboard.MENU){ + Main.debugstring +="MENU\n"; + Registry.keywatch.JUST_PRESSED_PAUSE=true; + event.preventDefault(); + event.stopImmediatePropagation(); + } + return; + } + if(is_ios)return; + // only android.. + if(event.keyCode==Keyboard.BACK){ + t_back_dim=0.5; + stage.displayState=StageDisplayState.NORMAL; + Keys.FORCE_ACTION_2=true; + // Ask title or playstate to exit. + // They'll set their own timer, so mobile_okay will be true during that time + if(!Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK){ + event.preventDefault(); + event.stopImmediatePropagation(); + Registry.MOBILE_ASK_TO_EXIT_WITH_BACK=true; + trace("Requested to exit!"); + } else { + trace("Exiting!"); + NativeApplication.nativeApplication.exit(); + } + } else if(event.keyCode==Keyboard.MENU){ + Registry.keywatch.JUST_PRESSED_PAUSE=true; + event.preventDefault(); + event.stopImmediatePropagation(); + } + } + + // Set frame of dpad + public static function set_dpad_frame(frame:Int):Void { + if(frame>8 || frame==icon_dpad_frame)return; + + var w:Int=icon_dpad.width; + var h:Int=w; + var xoff:Int=w *(frame % 3); + var yoff:Int=w * Std.int(frame / 3); + + var r:Rectangle=new Rectangle(xoff, yoff, w, h); + var p:Point=new Point(0, 0); + icon_dpad.bitmapData.copyPixels(dpad_data.bitmapData, r, p); + icon_dpad_frame=frame; + + + r=null; + p=null; + } + + /** + * + * @param id 0 for x, 1, for c, 2, for pause , , ,, + * @param UP true=up frame + */ + public static function set_button_frame(id:Int, UP:Bool=true):Void { + + if(id==0){ + if(UP && icon_x_frame==0){ + return; + } else if(!UP && icon_x_frame==1){ + return; + } + } else if(id==1){ + if(UP && icon_c_frame==0){ + return; + } else if(!UP && icon_c_frame==1){ + return; + } + } else if(id==2){ + if(UP && icon_menu_frame==0){ + return; + } else if(!UP && icon_menu_frame==1){ + return; + } + } + + var w:Int;var h:Int;var xoff:Int;var yoff:Int; + var r:Rectangle; + var p:Point=new Point(0, 0); + xoff=0; + if(id==0){ + w=icon_x.width;h=icon_x.height; + if(false==UP)xoff=0; + r=new Rectangle(xoff, 0, w, h); + icon_x.bitmapData.copyPixels(x_data.bitmapData, r, p); + if(UP){ + icon_x_frame=0; + } else { + icon_x_frame=1; + } + } else if(id==1){ + w=icon_c.width;h=icon_c.height; + if(false==UP)xoff=0; + r=new Rectangle(xoff, 0, w, h); + icon_c.bitmapData.copyPixels(c_data.bitmapData, r, p); + if(UP){ + icon_c_frame=0; + } else { + icon_c_frame=1; + } + } else if(id==2){ + w=icon_pause.width;h=icon_pause.height; + if(false==UP)xoff=0; + r=new Rectangle(xoff, 0, w, h); + icon_pause.bitmapData.copyPixels(menu_data.bitmapData, r, p); + if(UP){ + icon_menu_frame=0; + } else { + icon_menu_frame=1; + } + } else if(id==3){ + w=icon_thumb.width;h=icon_thumb.height; + r=new Rectangle(0, 0, w, h); + icon_thumb.bitmapData.copyPixels(thumb_data.bitmapData, r, p); + } + + r=null; + p=null; + } + + //public function mobile_flip_handedness():Void { + //Registry.GE_States[Registry.GE_MOBILE_IS_RHAND]=!Registry.GE_States[Registry.GE_MOBILE_IS_RHAND]; + //Intra.mobile_is_rhand=Registry.GE_States[Registry.GE_MOBILE_IS_RHAND]; + //var big_off:Int=Math.max(up_sprite.x, Math.min(a2_sprite.x,a1_sprite.x)); + //if(up_sprite.x>a1_sprite.x){ + //a1_sprite.x +=big_off; + //a2_sprite.x +=big_off; + //pause_sprite.x +=big_off; + //left_sprite.x=up_sprite.x=down_sprite.x=0; + //right_sprite.x -=big_off; + //} else { + //a1_sprite.x -=big_off; + //a2_sprite.x -=big_off; + //pause_sprite.x=0; + //left_sprite.x=up_sprite.x=down_sprite.x=big_off; + //right_sprite.x +=big_off; + //} + //reposition_ui(); + //} + //public function mobile_flip_x_c():Void { + //Registry.GE_States[Registry.GE_MOBILE_IS_XC]=!Registry.GE_States[Registry.GE_MOBILE_IS_XC]; + //var old_x:Int=a1_sprite.x; + //a1_sprite.x=a2_sprite.x; + //a2_sprite.x=old_x; + // also flip The ICONS + //reposition_ui(); +// + //} + public function handle_deactivate(e:Event):Void { + SoundMixer.stopAll(); + } + + public var activate_timer:Float=0; + public function handle_activate(e:Event):Void { + if(Registry.sound_data !=null && Registry.sound_data.current_song !=null){ + Registry.sound_data.current_song.play(); + } + TitleState.restart_on_mobile_enter=true; + stage.displayState=StageDisplayState.NORMAL; + // Add a latency before we send the reorient event + activate_timer=1; + force_normalize=true; + } + + public function maybe_update_action_gui(x:Int,y:Int):Void { + if(inside(x, y, a1_sprite)){ + set_button_frame(1, false);// C!! FUCK + } else { + set_button_frame(1, true); + } + + if(inside(x, y, a2_sprite)){ + set_button_frame(0, false); + } else { + set_button_frame(0, true); + } + + if(inside(x, y, pause_sprite)){ + set_button_frame(2, false); + } else { + set_button_frame(2, true); + } + } + + public function turn_on_touch_only_listeners(on:Bool=false):Void { + if(on==true){ + Multitouch.inputMode=MultitouchInputMode.GESTURE; + stage.removeEventListener(TouchEvent.TOUCH_MOVE, handle_touch_move); + stage.removeEventListener(TouchEvent.TOUCH_BEGIN, handle_mouse_click); + stage.removeEventListener(TouchEvent.TOUCH_END, handle_mouse_click); + + stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE, handle_swipe); + stage.addEventListener(MouseEvent.MOUSE_MOVE, handle_touch_move); + stage.addEventListener(MouseEvent.MOUSE_UP, handle_mouse_click); + stage.addEventListener(MouseEvent.MOUSE_DOWN, handle_mouse_click); + } else { + Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; + stage.removeEventListener(TransformGestureEvent.GESTURE_SWIPE, handle_swipe); + stage.removeEventListener(MouseEvent.MOUSE_MOVE, handle_touch_move); + stage.removeEventListener(MouseEvent.MOUSE_UP, handle_mouse_click); + stage.removeEventListener(MouseEvent.MOUSE_DOWN, handle_mouse_click); + + stage.addEventListener(TouchEvent.TOUCH_MOVE, handle_touch_move); + stage.addEventListener(TouchEvent.TOUCH_BEGIN, handle_mouse_click); + stage.addEventListener(TouchEvent.TOUCH_END, handle_mouse_click); + } + + } + + public function handle_swipe(e:TransformGestureEvent):Void { + if(e.type==TransformGestureEvent.GESTURE_SWIPE){ + Keys.FORCE_ACTION_1=true; + } + } + + public var thumb_icon_timer:Float=0; + public function handle_touch_move(e:Dynamic):Void { + + var x:Int=e.stageX; + var y:Int=e.stageY; + + // For testing touch movemnet without using the phone + //if(1){ + //var mx:Float=icon_dpad.x +(icon_dpad.width / 2); + //var my:Float=icon_dpad.y +(icon_dpad.height / 2); + //Player.Player_mobile_angle=Math.atan2(my - y, x - mx); + //Player.Player_mobile_timer=1; + //thumb_icon_timer=0.25; + //icon_thumb.x=x - icon_thumb.width / 2; + //icon_thumb.y=y - icon_thumb.height / 2; + //return; + //} + + if(MobileConfig.in_progress){ + config_on_touch_move(x, y); + return; + } + // If this is a in-game-area-move id, try to move around the screen + //if(e.type==TouchEvent.TOUCH_MOVE){ + if(no_zone.contains(x, y)&& game_move_ids.indexOf(e.touchPointID)!=-1){ + //trace("NO ZONE!", x, y); + //Keys.FORCE_RIGHT=false; + //set_dpad_frame(4); + //return; + move_from_touching_game_area(x, y); + return; + + // otherwise if we're still in the array then don't move elsewhere + } else if(game_move_ids.indexOf(e.touchPointID)!=-1){ + return; + } + + // Don't let move events cancel movnig on the dpad + if(move_ids.indexOf(e.touchPointID)==-1){ + return; + if(inside(x, y, a1_sprite)|| inside(x, y, a2_sprite)|| inside(x, y, pause_sprite)){ + return; + } + } + //} else { + //if(no_zone.contains(x, y)){ + //move_from_touching_game_area(x, y); + //} else { + //Keys.FORCE_RIGHT=Keys.FORCE_LEFT=false; + //Keys.FORCE_UP=Keys.FORCE_DOWN=false; + //} + //return; + //} + var flags:Int=0x0; + if(inside(x, y, up_sprite)){ + flags |=8;// U + Keys.FORCE_UP=true; + Keys.FORCE_DOWN=false; + } else if(inside(x, y, down_sprite)){ + Keys.FORCE_UP=false; + flags |=2;// D + Keys.FORCE_DOWN=true; + } else { + Keys.FORCE_DOWN=Keys.FORCE_UP=false; + } + + if(inside(x, y, left_sprite)){ + flags |=1;// L + Keys.FORCE_LEFT=true; + Keys.FORCE_RIGHT=false; + } else if(inside(x, y, right_sprite)){ + flags |=4;// R + Keys.FORCE_RIGHT=true; + Keys.FORCE_LEFT=false; + } else { + Keys.FORCE_RIGHT=Keys.FORCE_LEFT=false; + } + + if(flags !=0){ + + if(actually_moved_ids.indexOf(e.touchPointID)==-1){ + actually_moved_ids.push(e.touchPointID); + } + var mx:Float=icon_dpad.x +(icon_dpad.width / 2); + var my:Float=icon_dpad.y +(icon_dpad.height / 2); + Player.Player_mobile_angle=Math.atan2(my - y, x - mx); + Player.Player_mobile_timer=1; + thumb_icon_timer=0.25; + icon_thumb.x=x - icon_thumb.width / 2; + icon_thumb.y=y - icon_thumb.height / 2; + } + // i guess this could be more straightforward if we change the image. + switch(flags){ + case 0:// none + set_dpad_frame(4); + break; + case 1: + set_dpad_frame(3); + break; + case 2: + set_dpad_frame(7); + break; + case 3: + set_dpad_frame(6); + break; + case 4: + set_dpad_frame(5); + break; + case 12: + set_dpad_frame(2); + break; + case 6: + set_dpad_frame(8); + break; + case 9: + set_dpad_frame(0); + break; + case 8: + set_dpad_frame(1); + break; + } + + } + + // f ucking FUCK + private function inside(x:Int, y:Int, s:Dynamic):Bool { + + if(x>=s.getRect(stage).x && x<=(s.getRect(stage).x + s.width)&& y>=s.getRect(stage).y && y<=(s.getRect(stage).y + s.height)){ + return true; + } + return false; + } + public static var allow_dpad_move:Bool=true; + public static var allow_game_move:Bool=true; + public function handle_mouse_click(e:Dynamic):Void { + if(Registry.keywatch==null)return; + + if(MobileConfig.in_progress){ + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==MouseEvent.MOUSE_DOWN){ + config_on_touch_down(e.stageX, e.stageY); + } else if(e.type==TouchEvent.TOUCH_END || e.type==MouseEvent.MOUSE_UP){ + config_on_touch_up(e.stageX, e.stageY); + } + return; + } + // If hitboxes of dpad and actions overlap and we're moving, + // Don't let a tap cancel movement + var ismoveid:Bool=false; + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==TouchEvent.TOUCH_END){ + ismoveid=move_ids.indexOf(e.touchPointID)!=-1; + } + + if(e.type==TouchEvent.TOUCH_BEGIN){ + if(TitleState.mobile_message_done==false){ + + if(oriented_landscape){ + var myrect:Rectangle=new Rectangle(Main.ui_offsets.landscape_game.x * Main.ui_offsets.scale_landscape_game + 480 * Main.ui_offsets.scale_landscape_game - 80 * 3 * Main.ui_offsets.scale_landscape_game, + + Main.ui_offsets.landscape_game.y * Main.ui_offsets.scale_landscape_game + 540 * Main.ui_offsets.scale_landscape_game - 40 * 3 * Main.ui_offsets.scale_landscape_game, 16 * 3 * Main.ui_offsets.scale_landscape_game, 16 * 3 * Main.ui_offsets.scale_landscape_game); + if(myrect.containsPoint(new Point(e.stageX,e.stageY))){ + backwards=!backwards; + FlxG.flash(0xffff0000, 0.5); + } + } else { + var scaleOK:Float=Main.ui_offsets.scale_portrait_game; + var myrect:Rectangle=new Rectangle(Main.ui_offsets.portrait_game.x * scaleOK + 480 * scaleOK - 80 * 3 * scaleOK, Main.ui_offsets.landscape_game.y * scaleOK + 540 * scaleOK - 40 * 3 * scaleOK, 16 * 3 * scaleOK, 16 * 3 * scaleOK); + if(myrect.containsPoint(new Point(e.stageX,e.stageY))){ + backwards=!backwards; + FlxG.flash(0xffff0000, 0.5); + } + } + + } + } + + if(inside(e.stageX, e.stageY, a1_sprite)){ + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==MouseEvent.MOUSE_DOWN){ + Keys.FORCE_ACTION_1=true; + return; + } + if(e.type==TouchEvent.TOUCH_END || e.type==MouseEvent.MOUSE_UP){ + if(!ismoveid){ + return; + }else if(ismoveid){ + Keys.FORCE_LEFT=false;Keys.FORCE_RIGHT=false;Keys.FORCE_UP=false;Keys.FORCE_DOWN=false; + set_dpad_frame(4); + } + } + } else if(inside(e.stageX, e.stageY, a2_sprite)){ + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==MouseEvent.MOUSE_DOWN){ + Keys.FORCE_ACTION_2=true; + return; + } + if(e.type==TouchEvent.TOUCH_END || e.type==MouseEvent.MOUSE_UP){ + if(!ismoveid){ + return; + }else if(ismoveid){ + Keys.FORCE_LEFT=false;Keys.FORCE_RIGHT=false;Keys.FORCE_UP=false;Keys.FORCE_DOWN=false; + set_dpad_frame(4); + } + } + } else if(inside(e.stageX, e.stageY, pause_sprite)){ + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==MouseEvent.MOUSE_DOWN){ + Registry.keywatch.JUST_PRESSED_PAUSE=true; + return; + } + if(e.type==TouchEvent.TOUCH_END || e.type==MouseEvent.MOUSE_UP){ + if(!ismoveid){ + return; + }else if(ismoveid){ + Keys.FORCE_LEFT=false;Keys.FORCE_RIGHT=false;Keys.FORCE_UP=false;Keys.FORCE_DOWN=false; + set_dpad_frame(4); + } + } + } + + if(e.type==TouchEvent.TOUCH_END){ + + // if the movement caused movement via the dpad + // then if it is released it should stop all movement + if(no_zone.contains(e.stageX,e.stageY)|| game_move_ids.indexOf(e.touchPointID)!=-1 || actually_moved_ids.indexOf(e.touchPointID)!=-1){ + Keys.FORCE_DOWN=Keys.FORCE_LEFT=Keys.FORCE_RIGHT=Keys.FORCE_UP=false; + } + if(inside(e.stageX, e.stageY, left_sprite)){ + Keys.FORCE_LEFT=false; + set_dpad_frame(4); + } else if(inside(e.stageX, e.stageY, right_sprite)){ + Keys.FORCE_RIGHT=false; + set_dpad_frame(4); + } + if(inside(e.stageX, e.stageY, up_sprite)){ + Keys.FORCE_UP=false; + set_dpad_frame(4); + } else if(inside(e.stageX, e.stageY, down_sprite)){ + Keys.FORCE_DOWN=false; + set_dpad_frame(4); + } + var abc:Int=0; + for(abc=0;abc<5;abc++){ + if(move_ids.indexOf(e.touchPointID)!=-1){ + move_ids.splice(move_ids.indexOf(e.touchPointID), 1); + } + if(game_move_ids.indexOf(e.touchPointID)!=-1){ + game_move_ids.splice(game_move_ids.indexOf(e.touchPointID), 1); + } + if(actually_moved_ids.indexOf(e.touchPointID)!=-1){ + actually_moved_ids.splice(actually_moved_ids.indexOf(e.touchPointID), 1); + } + + } + + return; + } + + + // Tapping - fire just-pressed event for menu, + // then also call handle_touch_move to start the player moving. + if(e.type==TouchEvent.TOUCH_BEGIN || e.type==MouseEvent.MOUSE_DOWN){ + var et:Dynamic=new Dynamic(); + + et["stageX"]=e.stageX; + et["stageY"]=e.stageY; + if(e.type==TouchEvent.TOUCH_BEGIN){ + et["touchPointID"]=e.touchPointID; + //test android with and then without + //et["type"]=TouchEvent.TOUCH_MOVE; + } + + // Any touch that doens't start in X/C/Pause should be "able" to become + var doreturn:Bool=false; + + if(e.type==MouseEvent.MOUSE_DOWN){ + if(no_zone.contains(e.stageX, e.stageY)){ + Keys.FORCE_ACTION_2=true; + } + } + + if(inside(e.stageX, e.stageY, left_sprite)){ + Registry.keywatch.SIG_JP_LEFT=true; + doreturn=true; + } else if(inside(e.stageX, e.stageY, right_sprite)){ + Registry.keywatch.SIG_JP_RIGHT=true; + doreturn=true; + } + + if(inside(e.stageX, e.stageY, up_sprite)){ + Registry.keywatch.SIG_JP_UP=true; + doreturn=true; + } else if(inside(e.stageX, e.stageY, down_sprite)){ + Registry.keywatch.SIG_JP_DOWN=true; + doreturn=true; + } + + // If it starts in nothing, then it can become a movement + if(e.type==TouchEvent.TOUCH_BEGIN){ + if(!no_zone.contains(e.stageX, e.stageY)){ + doreturn=true; + } + if(doreturn){ + if(allow_dpad_move){ + move_ids.push(e.touchPointID); + handle_touch_move(et); + } + et=null; + return; + } + if(allow_game_move && no_zone.contains(e.stageX, e.stageY)){ + move_ids.push(e.touchPointID); + game_move_ids.push(e.touchPointID); + move_from_touching_game_area(e.stageX, e.stageY); + } + } + et=null; + return; + } + } + public var move_ids:Array=new Array(); + public var game_move_ids:Array=new Array(); + public var actually_moved_ids:Array=new Array(); + public static function force_window(sclfctr:Int):Void { + force_scale=true; + scale_factor=sclfctr; + scale_ctr=0; + } + + public function resize():Void { + var ratio:Float; + var ssp:Int; + + if(NativeApplication.nativeApplication.activeWindow==null)return; + + if(!did_init_window_fix){ + did_init_window_fix=true; + NativeApplication.nativeApplication.activeWindow.width +=frame_x_px; + NativeApplication.nativeApplication.activeWindow.height +=frame_y_px; + } + + if(scale_factor<=0){ + scale_factor=3; + } + switch(scale_ctr){ + case 1://Windowed + + ratio=scale_factor / 3; + stage.displayState=StageDisplayState.NORMAL; + NativeApplication.nativeApplication.activeWindow.width=Std.int(480 * ratio)+ frame_x_px; + NativeApplication.nativeApplication.activeWindow.height=Std.int(540 * ratio)+ frame_y_px; + Preloader.display.scaleX=ratio; + Preloader.display.scaleY=ratio; + x=y=0; + + break; + case 2:// Fullscreen Integer scaling + ratio=scale_factor / 3; + // Don't scale past the size of screen + stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE; + Preloader.display.scaleX=ratio; + Preloader.display.scaleY=ratio; + ssp=(Capabilities.screenResolutionX -(480 * ratio))/ 2; + x=ssp / ratio; + ssp=(Capabilities.screenResolutionY -(540 * ratio))/ 2; + y=ssp / ratio; + full_scale_offset.x=x; + full_scale_offset.y=y; + + break; + case 3:// Stretched proportionaly(full screen) + stage.displayState=StageDisplayState.FULL_SCREEN_INTERACTIVE; + if(stage.fullScreenHeight>stage.fullScreenWidth){ + ratio=Capabilities.screenResolutionX / 480; + ssp=(Capabilities.screenResolutionY -(540 * ratio))/ 2; + x=0; + y=ssp / ratio; + is_landscape=false; + } else { + ratio=Capabilities.screenResolutionY / 540; + ssp=(Capabilities.screenResolutionX -(480 * ratio))/ 2;//Screen-space pixels to move to the right + x=ssp / ratio;// In stage-space, only move by enough pixels that will make everything look okay when it's scaled to screen space + y=0; + is_landscape=true; + } + Preloader.display.scaleX=Preloader.display.scaleY=ratio;// For some reason this scale value gets set or something if I do it earlier. oh well! + full_scale_offset.x=x; + full_scale_offset.y=y; + scale_ctr=0; + break; + } + } + public function debug_mode():Void { + Registry.inventory[0]=true;//broom + Registry.inventory[1]=true;// jump + Registry.inventory[2]=true;//transfomrer + Registry.inventory[4]=true;//widen + Registry.inventory[5]=true;//lengthe + Registry.inventory[6]=true; + Registry.inventory[7]=true; + Registry.inventory[8]=true; + //Registry.inventory[Registry.IDX_BOX]=true; + Registry.bound_item_1="BROOM"; + Registry.bound_item_2="JUMP"; + Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]=true; + Registry.CUR_HEALTH=12; + Registry.MAX_HEALTH=12; + } + + + + + + private static function make_play_or_roam_state():Class + { + Registry.set_is_playstate(Registry.CURRENT_MAP_NAME); + var state:Class; + if(Registry.is_playstate){ + state=cast(PlayState, Class); + } else { + state=cast(RoamState, Class); + } + return state; + } + + //private function reposition_ui():Void + //{ + //var dead_space_l:Int=left_sprite.x + left_sprite.width; + //var dead_space_w:Int=right_sprite.x -(left_sprite.x + left_sprite.width); + //var dead_space_h:Int=down_sprite.y -(up_sprite.y + up_sprite.height); + //var dead_space_top:Int=up_sprite.y + up_sprite.height; + // + // Center the circle icon in the dead spot. + ///*if(dead_space_w - icon_dpad.width<0){ + //icon_dpad.x=dead_space_l; + //} else { + //icon_dpad.x=dead_space_l +(dead_space_w - icon_dpad.width)/ 2; + //}*/ + //icon_dpad.x=dead_space_l +(dead_space_w - icon_dpad.width)/ 2; + //icon_dpad.y=(stage.stageHeight - 144)/ 2; + //icon_dpad.y=(stage.stageHeight -(icon_dpad.height))/ 2; + // + // + ///*if(dead_space_h - icon_dpad.height<0){ + //icon_dpad.y=dead_space_top; + //} else { + //icon_dpad.y=dead_space_top +(dead_space_h - icon_dpad.height)/ 2; + //}*/ + // + // Stick directions around it + // + //var W:Int=a1_sprite.width + a2_sprite.width;// well, in theory + // + //icon_x.y=a2_sprite.y +(a2_sprite.height - icon_x.height); + //icon_c.y=a2_sprite.y +(a2_sprite.height - icon_x.height); + //if(Registry.GE_States[Registry.GE_MOBILE_IS_XC]){ + //icon_x.x=a2_sprite.x + a2_sprite.width - icon_x.width - 15; + //icon_c.x=a1_sprite.x + 15; + //icon_x.x=a2_sprite.x +(((W/2)- icon_x.width)/ 2); + //icon_c.x=icon_x.x +(W / 2); + //} else { + //icon_c.x=a1_sprite.x +(((W / 2)- icon_x.width)/ 2); + //icon_x.x=icon_c.x +(W / 2); + //icon_x.x=a2_sprite.x + 15; + //icon_c.x=a1_sprite.x + a1_sprite.width - icon_c.width - 15; + //} + // + // If scaling is different, move them a bit more + // + // + //icon_pause.x=pause_sprite.x +(pause_sprite.width - icon_pause.width)/ 2; + //icon_pause.y=pause_sprite.y +(pause_sprite.height - icon_pause.height)/ 2; + //} + + public var addedBG:Bool=false; + private function update_not_mobile():Void + { + if(is_ouya){ + if(!did_mobile_setup){ + + if(stage !=null){ + + + + if(stage.fullScreenWidth>=stage.fullScreenHeight){ + ratio=Std.int(3 *(stage.fullScreenHeight / 540.0))/ 3.0; + + } else { + var maybe_x:Float=Std.int(3 *(stage.fullScreenWidth / 480.0))/ 3.0; + var maybe_y:Float=Std.int(3 *(stage.fullScreenHeight / 540.0))/ 3.0; + ratio=maybe_x0){ + trace("JOYPAD DETECTED!"); + Keys.has_joypad=true; + Keys.init_joypad(); + } else { + trace("NO JOYPAD DETECTED!"); + Main.joy.exists=false; + } + } + + // Handle controller connects/disconnects in Windows + win_joy_remove_timer -=FlxG.elapsed; + if(win_joy_remove_timer<0){ + win_joy_remove_timer=1.5; + if(Keys.has_joypad){ + if(Main.joy.getTotal()<1){ + trace("JOYPAD DISCONNECTED"); + Keys.has_joypad=false; + Keys.FORCE_PAUSE=true; + } + } else { + if(Main.joy.getTotal()>0){ + // Only re-activate controller if + // we've configured, to not confuse user + trace("JOYPAD RECONNECTED"); + if(Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]){ + Main.joy.exists=true; + } + } + } + } + } + + if(IS_MAC && Main.mac_joy_manager !=null){ + if(false==Keys.has_joypad && Main.macmanexists){ + if(Main.mac_joy_manager.numberOfJoysticks()>0 && Main.mac_joy_manager.joysticks[0] !=null){ + trace("JOYPAD DETECTED!"); + Keys.has_joypad=true; + Keys.init_joypad(); + } else { + trace("NO JOYPAD DETECTED!"); + Main.macmanexists=false; + } + } + + win_joy_remove_timer -=FlxG.elapsed; + if(win_joy_remove_timer<0){ + win_joy_remove_timer=1.5; + if(Keys.has_joypad){ + if(Main.mac_joy_manager.numberOfJoysticks()<1){ + trace("JOYPAD DISCONNECTED"); + Keys.has_joypad=false; + Keys.FORCE_PAUSE=true; + } + } else { + if(Main.mac_joy_manager.numberOfJoysticks()>0){ + // Only re-activate controller if + // we've configured, to not confuse user + trace("JOYPAD RECONNECTED"); + //if(Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]){ + for(fuckme in 0...Main.mac_joy_manager.joysticks.length){ + if(Main.mac_joy_manager.joysticks[fuckme] !=null){ + Main.mac_joy_manager.joysticks[0]=Main.mac_joy_manager.joysticks[fuckme]; + break; + } + } + Main.macmanexists=true; + //} + } + } + } + + } + } + + public function resize_mobile_game():Void { + + trace("resize Scale ctr", Intra.scale_ctr); + trace("fit:", Intra.SCALE_TYPE_FIT); + var l:Int; + var s:Int; + if(stage.stageWidth>stage.stageHeight){ + l=stage.stageWidth; + s=stage.stageHeight; + } else { + l=stage.stageHeight; + s=stage.stageWidth; + } + + + if(Intra.scale_ctr==Intra.SCALE_TYPE_FIT){ + if(oriented_portrait){ + Main.ui_offsets.scale_portrait_game=Math.min((2 * l / 3)/ 480.0, s / 480.0); + } else { + Main.ui_offsets.scale_landscape_game=s / 540.0; + } + } else { + if(oriented_portrait){ + Main.ui_offsets.scale_portrait_game=Std.int(3 * Math.min((2 * l / 3)/ 480.0, s / 480.0))/ 3.0; + } else { + Main.ui_offsets.scale_landscape_game=Std.int(3 *(s / 540.0))/ 3.0; + } + } + + if(oriented_portrait){ + Preloader.display.scaleY=Main.ui_offsets.scale_portrait_game; + Preloader.display.scaleX=Main.ui_offsets.scale_portrait_game; + Main.ui_offsets.portrait_game.x=(s - 480.0 * Main.ui_offsets.scale_portrait_game)/ 2; + Main.ui_offsets.portrait_game.x /=Main.ui_offsets.scale_portrait_game; + Main.ui_offsets.portrait_game.y=0; + } else { + Preloader.display.scaleY=Main.ui_offsets.scale_landscape_game; + Preloader.display.scaleX=Main.ui_offsets.scale_landscape_game; + Main.ui_offsets.landscape_game.x=(l - 480.0 * Main.ui_offsets.scale_landscape_game)/ 2; + Main.ui_offsets.landscape_game.x /=Main.ui_offsets.scale_landscape_game;// ??? + Main.ui_offsets.landscape_game.y=(s - 540.0 * Main.ui_offsets.scale_landscape_game)/ 2; + Main.ui_offsets.landscape_game.y /=Main.ui_offsets.scale_landscape_game; + } + set_no_zone(); + + position_bars(); + } + + private static var thumb_data:Bitmap; + private function position_ui():Void + { + dpad_data=new embed_mobile_dpad; + x_data=new embed_mobile_x; + c_data=new embed_mobile_c; + menu_data=new embed_mobile_pause; + thumb_data=new embed_thumb; + Main.ui_offsets.scale_landscape_c_a2=Main.max_uo.scale_landscape_c_a2; + + Main.ui_offsets.scale_landscape_x_a1=Main.max_uo.scale_landscape_x_a1; + Main.ui_offsets.scale_landscape_pause=Main.max_uo.scale_landscape_pause; + Main.ui_offsets.scale_landscape_dpad=Main.max_uo.scale_landscape_dpad; + Main.ui_offsets.scale_portrait_c_a2=Main.max_uo.scale_portrait_c_a2; + Main.ui_offsets.scale_portrait_x_a1=Main.max_uo.scale_portrait_x_a1; + Main.ui_offsets.scale_portrait_pause=Main.max_uo.scale_portrait_pause; + Main.ui_offsets.scale_portrait_dpad=Main.max_uo.scale_portrait_dpad; + + if(icon_c !=null){ + stage.removeChild(icon_c); + stage.removeChild(icon_pause); + stage.removeChild(icon_x); + stage.removeChild(icon_thumb); + stage.removeChild(icon_dpad); + } + + function scaleBitmapData(bitmapData:BitmapData, scale:Float):BitmapData { + scale=Math.abs(scale); + var width:Int=(bitmapData.width * scale)|| 1; + var height:Int=(bitmapData.height * scale)|| 1; + var transparent:Bool=true; + var result:BitmapData=new BitmapData(width, height, transparent,0x00000000); + var matrix:Matrix=new Matrix(); + matrix.scale(scale, scale); + result.draw(bitmapData, matrix); + return result; + } + if(oriented_landscape){ + Preloader.display.scaleY=Main.ui_offsets.scale_landscape_game; + Preloader.display.scaleX=Main.ui_offsets.scale_landscape_game; + dpad_data=new Bitmap(scaleBitmapData(dpad_data.bitmapData, Main.ui_offsets.scale_landscape_dpad)); + c_data=new Bitmap(scaleBitmapData(c_data.bitmapData, Main.ui_offsets.scale_landscape_c_a2)); + x_data=new Bitmap(scaleBitmapData(x_data.bitmapData, Main.ui_offsets.scale_landscape_x_a1)); + menu_data=new Bitmap(scaleBitmapData(menu_data.bitmapData, Main.ui_offsets.scale_landscape_pause)); + thumb_data=new Bitmap(scaleBitmapData(thumb_data.bitmapData, Main.ui_offsets.scale_landscape_dpad*1.5)); + + icon_dpad=new Bitmap(new BitmapData(144*Main.ui_offsets.scale_landscape_dpad, 144*Main.ui_offsets.scale_landscape_dpad)); + icon_c=new Bitmap(new BitmapData(48*Main.ui_offsets.scale_landscape_c_a2, 96*Main.ui_offsets.scale_landscape_c_a2)); + icon_x=new Bitmap(new BitmapData(48*Main.ui_offsets.scale_landscape_x_a1, 96*Main.ui_offsets.scale_landscape_x_a1)); + icon_pause=new Bitmap(new BitmapData(96 * Main.ui_offsets.scale_landscape_pause, 48 * Main.ui_offsets.scale_landscape_pause)); + icon_thumb=new Bitmap(new BitmapData((icon_dpad.width*1.5)/2,(icon_dpad.height*1.5)/2)); + + icon_dpad.x=Main.ui_offsets.landscape_dpad.x; + icon_dpad.y=Main.ui_offsets.landscape_dpad.y; + + icon_c.x=Main.ui_offsets.landscape_c_a2.x; + icon_c.y=Main.ui_offsets.landscape_c_a2.y; + + icon_x.x=Main.ui_offsets.landscape_x_a1.x; + icon_x.y=Main.ui_offsets.landscape_x_a1.y; + + icon_pause.x=Main.ui_offsets.landscape_pause.x; + icon_pause.y=Main.ui_offsets.landscape_pause.y; + } else { + Preloader.display.scaleY=Main.ui_offsets.scale_portrait_game; + Preloader.display.scaleX=Main.ui_offsets.scale_portrait_game; + dpad_data=new Bitmap(scaleBitmapData(dpad_data.bitmapData, Main.ui_offsets.scale_portrait_dpad)); + c_data=new Bitmap(scaleBitmapData(c_data.bitmapData, Main.ui_offsets.scale_portrait_c_a2)); + x_data=new Bitmap(scaleBitmapData(x_data.bitmapData, Main.ui_offsets.scale_portrait_x_a1)); + menu_data=new Bitmap(scaleBitmapData(menu_data.bitmapData, Main.ui_offsets.scale_portrait_pause)); + + thumb_data=new Bitmap(scaleBitmapData(thumb_data.bitmapData, Main.ui_offsets.scale_portrait_dpad*1.5)); + icon_dpad=new Bitmap(new BitmapData(144*Main.ui_offsets.scale_portrait_dpad, 144*Main.ui_offsets.scale_portrait_dpad)); + icon_c=new Bitmap(new BitmapData(48*Main.ui_offsets.scale_portrait_c_a2, 96*Main.ui_offsets.scale_portrait_c_a2)); + icon_x=new Bitmap(new BitmapData(48*Main.ui_offsets.scale_portrait_x_a1, 96*Main.ui_offsets.scale_portrait_x_a1)); + icon_pause=new Bitmap(new BitmapData(96*Main.ui_offsets.scale_portrait_pause, 48*Main.ui_offsets.scale_portrait_pause)); + icon_thumb=new Bitmap(new BitmapData((icon_dpad.width*1.5)/2,(icon_dpad.height*1.5)/2)); + + icon_dpad.x=Main.ui_offsets.portrait_dpad.x; + icon_dpad.y=Main.ui_offsets.portrait_dpad.y; + + icon_c.x=Main.ui_offsets.portrait_c_a2.x; + icon_c.y=Main.ui_offsets.portrait_c_a2.y; + + icon_x.x=Main.ui_offsets.portrait_x_a1.x; + icon_x.y=Main.ui_offsets.portrait_x_a1.y; + + icon_pause.x=Main.ui_offsets.portrait_pause.x; + icon_pause.y=Main.ui_offsets.portrait_pause.y; + } + + // okay fuck me + if(icon_pause.y + icon_pause.height>stage.stageHeight){ + var diffffff:Int=stage.stageHeight -(icon_pause.y + icon_pause.height); + icon_pause.y +=diffffff; + } + + stage.addChild(icon_c); + stage.addChild(icon_pause); + stage.addChild(icon_x); + stage.addChild(icon_dpad); + stage.addChild(icon_thumb); + + icon_c_frame=icon_dpad_frame=icon_x_frame=icon_menu_frame=-1; + icon_dpad.alpha=0.5; + icon_c.alpha=0.5; + icon_x.alpha=0.5; + icon_pause.alpha=0.5; + set_dpad_frame(4); + set_button_frame(0); + set_button_frame(1); + set_button_frame(2); + set_button_frame(3); + //icon_dpad.alpha=0.8; + + + set_hit_zones(); + + set_no_zone(); + + position_bars(); + resize_mobile_game(); + + } + + private var mc_in_something:Bool=false; + private var mc_moving_thing:Bitmap; + + private function config_on_touch_up(x:Int, y:Int):Void { + if(oriented_landscape){ + if(mc_moving_thing==icon_c){ + Main.ui_offsets.landscape_c_a2.x=mc_moving_thing.x; + Main.ui_offsets.landscape_c_a2.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_dpad){ + Main.ui_offsets.landscape_dpad.x=mc_moving_thing.x; + Main.ui_offsets.landscape_dpad.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_x){ + Main.ui_offsets.landscape_x_a1.x=mc_moving_thing.x; + Main.ui_offsets.landscape_x_a1.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_pause){ + Main.ui_offsets.landscape_pause.x=mc_moving_thing.x; + Main.ui_offsets.landscape_pause.y=mc_moving_thing.y; + } + } else { + if(mc_moving_thing==icon_c){ + Main.ui_offsets.portrait_c_a2.x=mc_moving_thing.x; + Main.ui_offsets.portrait_c_a2.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_dpad){ + Main.ui_offsets.portrait_dpad.x=mc_moving_thing.x; + Main.ui_offsets.portrait_dpad.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_x){ + Main.ui_offsets.portrait_x_a1.x=mc_moving_thing.x; + Main.ui_offsets.portrait_x_a1.y=mc_moving_thing.y; + } else if(mc_moving_thing==icon_pause){ + Main.ui_offsets.portrait_pause.x=mc_moving_thing.x; + Main.ui_offsets.portrait_pause.y=mc_moving_thing.y; + } + } + mc_moving_thing=null; + } + + private function config_on_touch_move(x:Int, y:Int):Void { + if(mc_moving_thing==null){ + return; + } + if(oriented_landscape){ + Registry.modified_mobile_landscape=true; + } else if(oriented_portrait){ + Registry.modified_mobile_portrait=true; + } + var l:Int=stage.stageWidth>=stage.stageHeight ? stage.stageWidth:stage.stageHeight; + var s:Int=stage.stageWidthl || new_y<0 || new_y + mc_moving_thing.height>s){ + return; + } + } else { + if(new_x<0 || new_x + mc_moving_thing.width>s || new_y<0 || new_y + mc_moving_thing.height>l){ + return; + } + } + mc_moving_thing.x=new_x; + mc_moving_thing.y=new_y; + } + + private function config_on_touch_down(x:Int, y:Int):Void { + if(inside(x, y, icon_c)){ + mc_moving_thing=icon_c; + } else if(inside(x, y, icon_dpad)){ + mc_moving_thing=icon_dpad; + } else if(inside(x, y, icon_pause)){ + mc_moving_thing=icon_pause; + } else if(inside(x, y, icon_x)){ + mc_moving_thing=icon_x; + } else if(no_zone.contains(x, y)){ + if(no_zone.intersects(icon_x.getRect(stage))|| no_zone.intersects(icon_c.getRect(stage))|| no_zone.intersects(icon_pause.getRect(stage))|| no_zone.intersects(icon_dpad.getRect(stage))){ + //Registry.sound_data.player_hit_1.play(); + //return; + } + set_hit_zones(); + MobileConfig.done=true; + } + + } + + private function set_hit_zones():Void + { + var w:Int=oriented_landscape ? Main.ui_offsets.scale_landscape_dpad * 144.0:Main.ui_offsets.scale_portrait_dpad * 144.0; + var h:Int=w; + var w_dpad_deadzone:Int=8 *(w / 144.0); + + // extra move scale + var ems:Float=2; + up_sprite=new Bitmap(new BitmapData(w, ems*0.8*(h - w_dpad_deadzone)/ 2,true, 0xaa990000)); + down_sprite=new Bitmap(new BitmapData(w,ems*0.8*(h - w_dpad_deadzone)/ 2, true, 0xaa990000)); + + left_sprite=new Bitmap(new BitmapData(ems*0.8*0.67*(w - w_dpad_deadzone)/2,h, true, 0x66009900)); + right_sprite=new Bitmap(new BitmapData(ems*0.8*0.67*(w - w_dpad_deadzone)/2,h, true, 0x66009900)); + a2_sprite=new Bitmap(new BitmapData(icon_x.width,icon_x.height,true, 0xaaff0000)); + a1_sprite=new Bitmap(new BitmapData(icon_c.width, icon_c.height, true, 0xaa00ff00)); + pause_sprite=new Bitmap(new BitmapData(icon_pause.width, icon_pause.height, true, 0xaa00ff00)); + + a2_sprite.x=icon_x.x;a2_sprite.y=icon_x.y; + a1_sprite.x=icon_c.x;a1_sprite.y=icon_c.y; + pause_sprite.x=icon_pause.x;pause_sprite.y=icon_pause.y; + + left_sprite.x=icon_dpad.x - left_sprite.width/4 - 2;left_sprite.y=icon_dpad.y; + up_sprite.x=icon_dpad.x;up_sprite.y=icon_dpad.y - 2 - up_sprite.height/2; + right_sprite.x=icon_dpad.x + 2 + icon_dpad.width -(3*right_sprite.width/4);right_sprite.y=icon_dpad.y; + down_sprite.x=icon_dpad.x;down_sprite.y=icon_dpad.y + 2 + icon_dpad.height - down_sprite.height/2; + } + + private function position_bars():Void + { + if(left_bar !=null){ + stage.removeChild(left_bar); + } + if(right_bar !=null){ + stage.removeChild(right_bar); + } + left_bar=new Bitmap(new BitmapData(4, no_zone.height + 2)); + right_bar=new Bitmap(new BitmapData(4, no_zone.height + 2)); + + var left_bar_data:Bitmap=new embed_bar_left; + var right_bar_data:Bitmap=new embed_bar_right; + + var r:Rectangle=new Rectangle(0, 0, 4, 2); + var p:Point=new Point(0, 0); + + while(p.y + 2<=left_bar.height){ + left_bar.bitmapData.copyPixels(left_bar_data.bitmapData,r,p) + p.y +=2; + } + p.y=0; + while(p.y + 2<=right_bar.height){ + right_bar.bitmapData.copyPixels(right_bar_data.bitmapData, r, p); + p.y +=2; + } + left_bar.x=no_zone.x - 4; + left_bar.y=right_bar.y=no_zone.y; + right_bar.x=(no_zone.x + no_zone.width); + stage.addChildAt(left_bar, 1); + stage.addChildAt(right_bar, 2); + } + + private function set_no_zone():Void + { + if(oriented_landscape){ + no_zone=new Rectangle(Main.ui_offsets.landscape_game.x * Main.ui_offsets.scale_landscape_game, Main.ui_offsets.landscape_game.y * Main.ui_offsets.scale_landscape_game, 480 * Main.ui_offsets.scale_landscape_game, 540 * Main.ui_offsets.scale_landscape_game); + } else { + no_zone=new Rectangle(Main.ui_offsets.portrait_game.x * Main.ui_offsets.scale_portrait_game, Main.ui_offsets.portrait_game.y * Main.ui_offsets.scale_portrait_game, 480 * Main.ui_offsets.scale_portrait_game, 540 * Main.ui_offsets.scale_portrait_game); + } + } + + private function move_from_touching_game_area(x:Int,y:Int):Void + { + Keys.FORCE_DOWN=Keys.FORCE_RIGHT=Keys.FORCE_LEFT=Keys.FORCE_UP=false; + var regx:Int=0;var regy:Int=0;// Relative to topleft corner of 10x10 game area + var xoff:Float=(x - no_zone.x);// relative to player, up-y is positive + xoff *=(1 / Preloader.display.scaleX); + xoff /=3; + regx=xoff; + xoff -=Registry.PLAYER_X; + var yoff:Float=((y - no_zone.y)); + yoff *=(1 / Preloader.display.scaleY); + yoff /=3; + yoff -=20; + regy=yoff; + yoff -=Registry.PLAYER_Y; + yoff *=-1; + if(Math.abs(xoff)<0.0001)xoff=0.0001; + var slope:Float=yoff / xoff; + + + if(Math.abs(yoff)<10 && Math.abs(xoff)<10){ + if(regx<=16){ + Keys.FORCE_LEFT=true; + return; + } else if(regx>=144){ + Keys.FORCE_RIGHT=true; + return; + } else if(regy<=16){ + Keys.FORCE_UP=true; + return; + } else if(regy>=144){ + Keys.FORCE_DOWN=true; + return; + } else { + Keys.FORCE_DOWN=Keys.FORCE_UP=Keys.FORCE_LEFT=Keys.FORCE_RIGHT=false; + return; + } + } + + if(xoff>=0 && yoff>=0){ // Quad 1 + if(slope<.56){ + Keys.FORCE_RIGHT=true; + } else if(slope<1.8){ + Keys.FORCE_RIGHT=true; + Keys.FORCE_UP=true; + } else { + Keys.FORCE_UP=true; + } + } else if(xoff<0 && yoff>=0){ + if(slope>-.56){ + Keys.FORCE_LEFT=true; + } else if(slope>-1.8){ + Keys.FORCE_LEFT=true; + Keys.FORCE_UP=true; + } else { + Keys.FORCE_UP=true; + } + } else if(xoff<0 && yoff<0){ + if(slope<.56){ + Keys.FORCE_LEFT=true; + } else if(slope<1.8){ + Keys.FORCE_LEFT=true; + Keys.FORCE_DOWN=true; + } else { + Keys.FORCE_DOWN=true; + } + } else { + if(slope>-.56){ + Keys.FORCE_RIGHT=true; + } else if(slope>-1.8){ + Keys.FORCE_RIGHT=true; + Keys.FORCE_DOWN=true; + } else { + Keys.FORCE_DOWN=true; + } + } + + } + + public function fuck():Void { + var d:String=stage.deviceOrientation; + + if(d.toLowerCase().indexOf("rotated")!=-1){ + + } + //StageOrientation. + } + + public static var backwards:Bool=false; + + // Landscape - suspend, phone is default portrait. Game turns Into portrait coords. + // Resume game in landscape, landscape event sometimes missed? + // hack:give a timer to reorient everything after resuming:) + public function handle_orientation_change(e:StageOrientationEvent, force:String=""):Void { + + var force_landscape:Bool=false; + var force_portrait:Bool=false; + if(force.indexOf("landscape")!=-1){ + force_landscape=true; + } else if(force.indexOf("portrait")!=-1){ + force_portrait=true; + } + + + + trace("orientation changed to:" + e.afterOrientation); + if((backwards && e.afterOrientation.toLowerCase().indexOf("rotated")==-1)||(!backwards && e.afterOrientation.toLowerCase().indexOf("rotated")!=-1)){ + oriented_portrait=false; + oriented_landscape=true; + //FlxG.flash(0xffff0000); + + Main.max_uo.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + if(Registry.modified_mobile_landscape==false){ + Main.ui_offsets.set_defaults(stage.stageWidth, stage.stageHeight, stage.fullScreenWidth, stage.fullScreenHeight, oriented_landscape, oriented_portrait); + } + position_ui(); + } else if(!force_landscape && !force_portrait && e.afterOrientation.toLowerCase().indexOf("unknown")!=-1){ + return; + } else { + oriented_landscape=false; + oriented_portrait=true; + //FlxG.flash(0xff00ff00); + Main.max_uo.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + if(Registry.modified_mobile_portrait==false){ + Main.ui_offsets.set_defaults(stage.stageWidth, stage.stageHeight,stage.fullScreenWidth,stage.fullScreenHeight,oriented_landscape,oriented_portrait); + } + position_ui(); + } + if(!Intra.is_ios){ + stage.displayState=StageDisplayState.NORMAL; + t_back_dim=0.5; + } + trace(stage.stageWidth, stage.stageHeight); + trace(stage.fullScreenWidth, stage.fullScreenHeight); + + position_bars(); + } + +} \ No newline at end of file diff --git a/intra/source/Main.hx b/intra/source/Main.hx new file mode 100644 index 0000000..57d034d --- /dev/null +++ b/intra/source/Main.hx @@ -0,0 +1,205 @@ +package; + +//import com.amanitadesign.steam.FRESteamWorks; +import helper.DH; +//import ca.wegetsignal.nativeextensions.MacJoystick; +//import ca.wegetsignal.nativeextensions.MacJoystickManager; +//import com.amanitadesign.steam.SteamEvent; +import extension.JoyQuery.Joystick; +import flash.desktop.NativeApplication; +import flash.display.Sprite; +import flash.display.Bitmap; +import flash.display.StageDisplayState; +import flash.media.AudioPlaybackMode;// Add for iOS +import flash.media.SoundMixer; +import flash.system.Capabilities; +import flash.utils.getTimer; +import global.Keys; +import global.Registry; +import helper.Achievements; +import helper.UI_Offsets; +import org.flixel.FlxGame; + +import flash.events.Event; +import flash.events.MouseEvent; +import flash.ui.Mouse; +import helper.ANEFix; + +//[Frame(factoryClass="Preloader")] +class Main extends Sprite +{ + + public static var joy:Joystick; + //public static var joy:Dynamic; + //public static var mac_joy_manager:MacJoystickManager; + public static var mac_joy_manager:Dynamic; + + + public static var macmanready:Bool=false; + public static var macmanexists:Bool=false; + //public static var fff:FRESteamWorks; + //public static var fff:Dynamic; + public static var pixel_overlay:Bitmap; + public static var fixedsteam:Bool=false; + public static var fixedjoy:Bool=false; + + public static var ui_offsets:UI_Offsets; + public static var max_uo:UI_Offsets; + public function new():Void + { + if(stage){ + init(); + } else { + addEventListener(Event.ADDED_TO_STAGE, init); + } + } + + private function init(event:Event=null):Void { + removeEventListener(Event.ADDED_TO_STAGE, init); + + Intra.is_air=true; + + if(NativeApplication.nativeApplication.applicationID.indexOf("ouya")!=-1){ + //game_input=new GameInput(); + //game_input.addEventListener(GameInputEvent.DEVICE_ADDED, handleDeviceAttached); + //game_input.addEventListener(GameInputEvent.DEVICE_REMOVED, handleDeviceRemoved); + //debugstring +=GameInput.isSupported.toString()+ "\n"; + } else if(NativeApplication.nativeApplication.applicationID.indexOf("humble")!=-1){ + Intra.is_mobile=true; + Intra.is_air=false; + Intra.is_ios=false; + //Intra.is_ios=true; + Achievements.DEBUG_TEXT +="humble\n"; + } else if(NativeApplication.nativeApplication.applicationID.indexOf("mobile")!=-1){ + Intra.is_mobile=true; + Intra.is_air=false; + Intra.is_ios=true; + Achievements.DEBUG_TEXT +="mobile\n"; + } + + if(Intra.is_ios){ + // ADd for ios + SoundMixer.audioPlaybackMode=AudioPlaybackMode.AMBIENT; + } + //Achievements.IS_KONG=true; + Achievements.IS_STEAM=false; + if(Intra.is_air){ + Achievements.DEBUG_TEXT +=Capabilities.os+"\n"; + if(Capabilities.os.indexOf("Windows")!=-1){ // WERE ON WINDOWS + joy=new Joystick(this, "joyquery.exe"); + joy.init(); + Intra.IS_WINDOWS=true; + Achievements.DEBUG_TEXT +="windows\n"; + } else if(Capabilities.os.indexOf("Mac")!=-1 && !Intra.is_mobile){ + + function onJoyFix(extensionID:String, success:Bool):Void { + if(success && !fixedjoy){ + trace("in OnJoyFix, success"); + Main.fixedjoy=true; + } else { + trace("in onJoyFix, fail"); + } + } + trace("ENTERING... FIXING JOYSTICK"); + ANEFix.fixANE("ca.wegetsignal.nativeextensions.MacJoyANE", onJoyFix); + Intra.IS_MAC=true; + } else { + Intra.IS_LINUX=true; + } + } + // Create steamworks object, references by load/save for cloud + if(Intra.IS_MAC){ + function onFix(extensionID:String, success:Bool):Void { + + if(success && !fixedsteam){ + trace("in onFix , succes"); + fixedsteam=true; + Achievements.init_steam(); + } else { + trace("in onfix, fail"); + } + } + trace("ENTERING...fIX STEAM"); + ANEFix.fixANE("com.amanitadesign.steam.FRESteamWorks", onFix,true); + } else { + trace("Initing steam from LINE 69"); + if(Intra.IS_WINDOWS){ + Achievements.init_steam(); + } else if(Intra.IS_LINUX){ + Achievements.init_steam(); + + } + } + ui_offsets=new UI_Offsets(); + max_uo=new UI_Offsets(); + + + + var game:Intra=new Intra(); + + // Initialize joypad shit + addChild(game); + + //addEventListener(MouseEvent.CLICK, on_click); + + + } + + + public static var debugstring:String="aa"; + /// lalala ok this is set up,now poll it every frame elsehwere and hook that up... + //private var active_id:String=""; + //private function handleDeviceAttached(event:GameInputEvent):Void { + //debugstring +="dev. " + event.device.id + " attached\n"; + //if(active_id==""){ + //game_input_device=event.device; + //GameInputControlName.initialize(game_input_device); + //active_id=event.device.id; + //game_input_device.enabled=true; + //debugstring +="enabled\n"; + //for(i in 0...game_input_device.numControls){ + //switch(game_input_device.getControlAt(i).name){ + //case GameInputControlName.DPAD_UP: + //debugstring +="\nu " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_UP]=i;break; + //case GameInputControlName.DPAD_DOWN: + //debugstring +="\nd " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_DOWN]=i;break; + //case GameInputControlName.DPAD_LEFT: + //debugstring +="\nl " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_LEFT]=i;break; + //case GameInputControlName.DPAD_RIGHT: + //debugstring +="\nr " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_RIGHT]=i;break; + //case GameInputControlName.BUTTON_O: + //debugstring +="\na2 " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_ACTION_2]=i;break; + //case GameInputControlName.BUTTON_U: + //debugstring +="\na1 " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_ACTION_1]=i;break; + //case GameInputControlName.BUTTON_START: + //debugstring +="\np " + game_input_device.getControlAt(i).minValue.toFixed(2)+ game_input_device.getControlAt(i).maxValue.toFixed(2); + //Registry.joybinds[Keys.IDX_PAUSE]=i;break; + //} + //} + //} + //} + // + //private function handleDeviceRemoved(event:GameInputEvent):Void { + //if(event.device.id==active_id){ + //active_id=""; + //game_input_device=null; + //} + // + // + //} + + //public function on_click(e:MouseEvent):Void { + //if(e.type==MouseEvent.CLICK){ + //FlxGame.HARD_PAUSED=!FlxGame.HARD_PAUSED; + //trace("nice"); + //} + //} + + +} diff --git a/intra/source/Preloader.hx b/intra/source/Preloader.hx new file mode 100644 index 0000000..2b728dc --- /dev/null +++ b/intra/source/Preloader.hx @@ -0,0 +1,21 @@ +package +{ +import flash.display.DisplayObject; +import flash.display.MovieClip; +import org.flixel.system.FlxPreloader; + +/** + * ... + * @author Seagaia + */ +//[SWF(width="480", height="540", backgroundColor="#06101a")] +class Preloader extends FlxPreloader +{ + public static var display:DisplayObject; + public function new() + { + className="Main"; + super(); + } + +} \ No newline at end of file diff --git a/intra/source/Save.hx b/intra/source/Save.hx new file mode 100644 index 0000000..c59600a --- /dev/null +++ b/intra/source/Save.hx @@ -0,0 +1,430 @@ +package +{ +import entity.gadget.Door; +import flash.events.IOErrorEvent; +import flash.filesystem.File; +import flash.filesystem.FileMode; +import flash.filesystem.FileStream; +import flash.geom.Point; +import flash.net.FileReference; +import flash.system.Capabilities; +import flash.utils.ByteArray; +import helper.Achievements; +import helper.DH; +import helper.S_NPC; +import org.flixel.FlxG; +import org.flixel.FlxSave; +import global.Registry; +import states.MinimapState; + +class Save { + + private static var _save:FlxSave; + private static var _load:FlxSave; + + /** + * Copy source to destination + * @param source + * @param destination + */ + private static function copy(source:Dynamic, destination:Dynamic):Void { + var ba:ByteArray=new ByteArray(); + ba.writeObject(source); + ba.position=0; + destination=ba.readObject(); + } + public static function save():Bool { + _save=new FlxSave(); + var canSave:Bool=_save.bind(Registry.SAVE_NAME); + if(canSave){ + _save.data.valid="yes"; + _save.data.READ_THIS_IF_MODIFYING="HEY! Be careful modifying this! Don't say I didn't warn you..."; + /* I 'new' these because otherwise we store references, it's possible the + * player saves the game, does stuff, quits, and the stuff done after + * the save is still reflected in the save...*/ + _save.data.stateful=new XML(Registry.statefulXML); + _save.data.stateless=new XML(Registry.statelessXML); + _save.data.joybinds=duplicate_array(new Array(), Registry.joybinds); + _save.data.controls=duplicate_array(new Array(), Registry.controls); + //respawn point for reloading the game + _save.data.bowlofcereal=Registry.death_count; + _save.data.squirrel=Registry.nr_growths; + _save.data.applegouda=duplicate_array(new Array(), Registry.inventory); + _save.data.spam=duplicate_array(new Array(), Registry.nr_keys); + _save.data.fffeeffe=Registry.bound_item_1; + _save.data.fkkekee=Registry.bound_item_2; + _save.data.effect=Registry.bound_effect; + _save.data.booklesporf=Registry.MAX_HEALTH; + _save.data.conga=Registry.CUR_HEALTH; + _save.data.playtime=Registry.playtime; + _save.data.fjfjejfwe=duplicate_array(new Array(), Registry.CUTSCENES_PLAYED); + _save.data.papertowel=Registry.Event_Nr_Red_Pillars_Broken; + //what "general events" have happened + _save.data.hooooops=duplicate_array(new Array(), Registry.GE_States); + //what "big doors" are open + _save.data.Big_Door_State=duplicate_array(new Array(), Registry.Big_Door_State); + _save.data.flamingo=duplicate_array(new Array(), Registry.Nexus_Door_State); + _save.data.minimap_strings=duplicate_array(new Array(), MinimapState.minimap_strings); + _save.data.autosave_on=Registry.autosave_on; + _save.data.rosemary=duplicate_array(new Array(), Registry.card_states); + _save.data.s_npc_states=duplicate_array(new Array(), S_NPC.states); + _save.data.scale_factor=Intra.scale_factor; + _save.data.scale_ctr=Intra.scale_ctr; + _save.data.verynices=duplicate_array(new Array(), Registry.achivement_state); + _save.data.dirty="y"; + _save.data.frame_x_px=Intra.frame_x_px; + _save.data.frame_y_px=Intra.frame_y_px; + _save.data.volume=FlxG.volume; + _save.data.ui_offsets=Main.ui_offsets.get_save_array(); + _save.data.mml=Registry.modified_mobile_landscape; + _save.data.mmp=Registry.modified_mobile_portrait; + _save.data.dpadonly=Intra.allow_dpad_move; + _save.data.gameonly=Intra.allow_game_move; + var ba:ByteArray=new ByteArray(); + ba.writeObject(Registry.checkpoint); + ba.position=0; + _save.data.aaaaaaaaaaa=ba.readObject(); + _save.data.curLang=DH.language_type; + + trace("Saving checkpoint:",_save.data.aaaaaaaaaaa.x, _save.data.aaaaaaaaaaa.y, _save.data.aaaaaaaaaaa.area); + + //var o:Dynamic=Registry.checkpoint; + //var o1:Dynamic=_save.data.checkpoint; + // Copy current dialogue state Into the save file + ba.clear(); + ba.writeObject(Registry.DIALOGUE_STATE); + ba.position=0; + + _save.data.aaaaaaaaaaaaaaaaaaaa=ba.readObject(); + } + if(canSave){ + if(Achievements.IS_STEAM && Achievements.Steamworks !=null && Achievements.Steamworks.isReady){ + if(false==Intra.IS_LINUX){ + Achievements.DEBUG_TEXT +="Cloud save..."; + if(Achievements.Steamworks.isCloudEnabledForApp()){ + + if(Achievements.writeFileToCloud(Registry.SAVE_NAME, _save.data)){ + Achievements.DEBUG_TEXT +="success\n"; + } else { + Achievements.DEBUG_TEXT +="failed\n(cloud on)\n"; + } + } else { + Achievements.DEBUG_TEXT +="failed\n(cloud off)\n"; + } + } + + + Achievements.Steamworks.setStatInt("item", Achievements.get_completion_rate()); + Achievements.DEBUG_TEXT +="item rate:" + Achievements.Steamworks.getStatInt("item").toString()+ "\n"; + } + + canSave=_save.close(500000); + trace("Writing to disk...success:", canSave); + if(canSave==false){ + canSave=_save.close(500000); + trace("Trying again after request...",canSave); + } + + + // Make backup + var iweawet:Int=2; + if(false==Intra.is_web && false==Intra.IS_LINUX && false==Intra.is_mobile && false==Intra.is_ouya){ + var f:File; + var of:File; + var fs:FileStream=new FileStream(); + var ofs:FileStream=new FileStream(); + f=new File(File.applicationStorageDirectory.nativePath + File.separator + "#SharedObjects" + File.separator + "Anodyne.swf" + File.separator + Registry.SAVE_NAME + ".sol"); + var fr:FileReference=new FileReference; + try { + f.copyTo(new File(File.userDirectory.nativePath + File.separator + ".Anodyne" + File.separator + Registry.SAVE_NAME + ".sol"), true); + } catch(error:IOErrorEvent){ + trace(" Dynamic copying file"); + } + + + + + //trace(f.nativePath); + //fs.open(f, FileMode.READ); + // + //of=new File(File.userDirectory.nativePath + File.separator + "Anodyne" + File.separator + Registry.SAVE_NAME+".sol"); + //ofs.open(of, FileMode.WRITE); + //var mysave:Dynamic= + // + //ba.position=0; + //var nrtowrite:Int=fs.bytesAvailable - fs.position; + //fs.readBytes(ba, 0, fs.bytesAvailable - fs.position); + //ba.position=0; + //ofs.writeBytes(ba, 0, nrtowrite); + // + //ofs.close(); + //fs.close(); + + + try { + f=new File(File.userDirectory.nativePath + File.separator + ".Anodyne" + File.separator + "README.txt"); + fs.open(f, FileMode.WRITE); + fs.writeObject("Hey, this is a backup save file because saves are loaded from temporary storage, possibly cleared by a browser. It gets copied to where saves are read from automatically, so you shouldn't have to worry about anything!"); + fs.close(); + + } catch(error:IOErrorEvent){ + trace(" Dynamic opening or closing or writing README file"); + } catch(sec_error:SecurityError){ + trace("eror with file permssions sry"); + } catch(something:Dynamic){ + trace("The fuck"); + } + + } + + } else { + trace("saving failed"); + } + return canSave; + + } + + public static function duplicate_array(next:Array, old:Array, ref:Array=null):Array { + if(ref !=null && old !=null){ + if(ref[0]===false){ + if(old.length=0 && _load.data.volume<=1){ + FlxG.volume=_load.data.volume; + } + + //copy(_load.data.checkpoint, Registry.checkpoint); + //var o1:Dynamic=_load.data.checkpoint; + //var o:Dynamic=Registry.checkpoint; + + // Copy dialogue from save file Into current dialogue state + var ba:ByteArray=new ByteArray(); + ba.writeObject(_load.data.aaaaaaaaaaa); + ba.position=0; + Registry.checkpoint=ba.readObject(); + trace("Loading checkpoint from disk:", Registry.checkpoint.x, Registry.checkpoint.y, Registry.checkpoint.area); + ba.clear(); + ba.writeObject(_load.data.aaaaaaaaaaaaaaaaaaaa); + ba.position=0; + Registry.DIALOGUE_STATE=ba.readObject(); + // If the game has new dialogue states, add them to the save file's. + DH.patch_dialogue_state(); + + } + else { canLoad=false;} + if(canLoad){ + canLoad=_load.close(500000); + trace("Closing loaded file...", canLoad); + } else { + trace("loading failed"); + } + return canLoad; + } + + public static function delete_save():Bool { + _save=new FlxSave(); + var canDelete:Bool=_save.bind(Registry.SAVE_NAME); + if(canDelete){ + trace("Deleting data"); + _save.data.valid="no"; + _save.data.scale_factor=0; + _save.data.scale_ctr=0; + if(Intra.is_mobile){ + _save.data.scale_ctr=Intra.SCALE_TYPE_FIT; + Intra.scale_ctr=Intra.SCALE_TYPE_FIT; + Main.ui_offsets.set_defaults(FlxG._game.stage.stageWidth, FlxG._game.stage.stageHeight, FlxG._game.stage.fullScreenWidth, FlxG._game.stage.fullScreenHeight); + var i:Intra=FlxG._game as Intra; + i.resize_mobile_game(); + Intra.allow_game_move=true; + Intra.allow_dpad_move=true; + } + + FlxG.volume=1; + + Registry.death_count=0; + Registry.controls=Registry.default_controls; + Registry.nr_growths=0; + Registry.bound_effect="none"; + Registry.bound_item_1=""; + Registry.bound_item_2=""; + Registry.playtime=0; + Registry.achivement_state=new Array( + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false + ); + Registry.nr_keys=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0); + Registry.inventory=new Array(false, false, false, false, false, false,false,false,false,false,false,false, false,false,false,false,false,false,false); + Registry.GE_States=new Array( + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false); + Registry.CUTSCENES_PLAYED=new Array(0, 0, 0, 0, 0, 0,0,0,0,0,0); + Registry.Event_Nr_Red_Pillars_Broken=0; + Registry.CUR_HEALTH=Registry.MAX_HEALTH=6; + Registry.Big_Door_State=new Array(false, false, false, false, false, false, false, false, false, false); + Registry.Nexus_Door_State=new Array(false, true, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false); + Registry.autosave_on=true; + Registry.card_states=new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + Registry.modified_mobile_portrait=Registry.modified_mobile_landscape=false; + S_NPC.states=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + // Reset the current dialogue state + DH.init_dialogue_state(); + // Delete visited array and current minimap state + MinimapState.save_delete_routine(); + + + } + if(canDelete){ + canDelete=_save.close(500000); + trace("Writing to disk...", canDelete); + } else { + trace("Reading save failed"); + } + return canDelete; + } + +} \ No newline at end of file diff --git a/intra/source/awerwer/com.zip b/intra/source/awerwer/com.zip new file mode 100644 index 0000000000000000000000000000000000000000..b7eaac27ab7cbbed83c411abb0571da9d103954c GIT binary patch literal 15264 zcmai*19&FOwyDM2*r| z_fG6*gSeF_ble9_D?O{e4snX@45#KVj6AA8;|V%L>TwVDRFY0sK#)N45oleVFiVn& zbNhwSfZ(uT!KjJJ+6KK4$lvszc(wq_%U>=*ip@+}XU?26`R+7YtwxGo6}qb3NvH#J z>SbOG4X32wEI1@pjbPgDFz(KzS9-Bf%OvEZ2w^rxC6+T1$s)2Lm}8cQL^Zga+N>@e zbtp*npwi{C53}T^RbSuQ5k6^CW`DRC)RWA@)2#^dFXAuz&32MSK%32)m&z;2CIe_b z3G}Oyc_-+fP6|t4>@{9-PV6x}Z%`oIx<8<}EVx6~C$6ITy(5I$gxA^r(HZ_~>Ckw4 z!NXofl;B_e#1#by=*$1z(q9!s6#r1Rs;z^iqpP_MoxWp(swJZqC;5sY0Al z*21b&5ctfOI5IB6BVH#?OnqH`6mYk<~TL=lA9qjD+anSwQ>ZIVohB~+4OFb~;r9bO(j!o&_%+<#BN5Sc9FhZ6ZGAn*v9S-=B%+6iad5mUscUga^h5SM8@C7ld#2n7O9EdV1`y zha81q`9NF9&gH8w&B>vhc(jT#E6ANkT}4kxg^@sCszFD<@2tGFvogqqRi4v%a6dUF%bR-j2xC5osD8qHFBqO9RY20WCyF$I= zPCX2AA_mY!DiQ+Z1{NcNzuIjU>R461Nmzovkh2n_6Q+{}_Vq*$3NLVg;Z(I?BOAIOCSlUH8A z1qIov%mIdCk_?f_hVVjx2V1s{?FmA8W?!xitWbGs1!*FN`)ODvi%@s7?Obl4hdtOP10-kGXoqB4@t&T2SklFz6sN`Bk^7cF)KmT|GP`$Q zFq5{jy&f+e%#b!AJ(>jat1_daeIK669QC?*^o$9n#Ein_07zVL%ZIYApj~r2k{!ck z;jk2;ZkkkKu+~7g+7xE+reLW6Du-x#xN^PBtd15j*i2bo+GITfZpFxD8O+tq+&l39 zm^IA6cR{P`AwEH9AfO})AfR90KS#lTj&XmDS^uzSzl_&?tsWU<7n?IK1rFjUy>8N-uPyDo zjLai&YTn3c5?Tik9xJ+UK!z`)8lM9W59J47lwl7;CzZ&K%TI#tPJcA(6ad8jh$9iK zQcWN1uyGZCqRME~sXsqf<)cibSSN96*&e!DIov*d-L`yugwT#7N6rrZti8i=l6`U_ zi2?5iB(4#J+#_}^>{;W~v>Z|M5RwG;-3_D4UX0@&I&XB!7=-k>Y&rXc9pp3|s4fAP z9^W0cjV*bW+#yLAPrqC@_%PESe8vrjF82!$0Ro4k==Nl%tI&wSSO=Q8i(I5-?9ZrJ z5{df?$m}FNs>Wyt=52G9z)Q|mU+BeiG*4Q93pLVF5TP`f6X) zsB?%}U5^LuoGs)I0a~^YZXBm&81j5-(&9-0oI1Ml`lz0Bf{0gXG3Mz_n^(GSMv9-u zt7Y64QR-{uf8T0lA9I#%MpI9{ zNbB`XB1&!I0Pu`)n5c^q|kz+8>Q!VVfNM!vOfR%rRJ%`Tp$>ZeQMF$co$uVC9f&msCC{~?zAZHv|PnQ z7FER6&eSW04<4%=#d(G`xjQh#KpD-;?QDwv0fIwqyb_cBdI2q16G53|q^k(-9DE0{ zi-ZMh`mWK{;FGO!RYfP3PRyRcJF!tD{6c?d&6w!osljxY4Kn+h3rSdAp|F@ABr^Jf z4i`oKX@R)?+FlMy&WP_?%4W6h$CTe_~sfA%`Db}GjT6lXL3ln6DVthd31 zx*m2^UV8*0G3YaY$Rs+ZUY!n%+Y+B)04u{TGnwoFYTm^uw2lQ3Wfi+qz-uHoSB8B*!p8s-+wW zolzW5Tx(vhZ`e0WGR9MnG5BTs%ZaoGI&M*t@WgQC<_fuHxBy{!&T=hCE%dV}t7xrzNYL1_y6jfDrVg+jWESC==oA$lesOA`hLAxab-k4+u-5O9!l841 zl7SNxCEXUeKZg}4z~nxiUF#o2VKoQ77cbY z!*UYEk=kTA8ICMAPwhvYfJ+{n%mk`J+QLUegoX*2>1x)2UPs$2g?eT_RoB#&Zzxwl zduG2X;BnRgX?c;4aQie%U9)A9^31va1wbg8(xc{uL>jdgVEjTMJZ))B&qlBnTlIW+ z8;=FC_3iGS=Z#>(vlia_E1|Pod52QyID5p9N$;Z;4^a96RM${)V4=9D{0=APWpEc%Wh;Q(eZm|7stt3Nc+H#RY?fqLQOzY3(4O+Qp%)+4{Q ztsfiB4mY|!aT7by34=G3IS3ew5BP%%qIfjICop8d`OV<#GncN?9pjM5HdR+NFj6 zP*=I%WaD}Pa~YOFO-mFw7JYIJN6nr)9{Q(%Y&H6nnH6qKH_1!)(aLM_Nz=@e4rE7C znK5h$TKwUs!BBdYW)r*O55b{+OBjBsH)6sY2@Fj7ZWS*y2Pvm`FZ6oGmtZ^EIxb}F zc#1AaCefRO>GXsc)Sw|D{y7Q*0m^8NmnpG*TJCdnB5_svrKSkb;Xr?-`(li~c57$`=M`&ARoo13Q%Tq&M`z|yvapNdDyYdZ=9;Rgl=5Tzf zGPGhEaU_0XhPg=^Q8YrLti6OYbq4A_RpFqI=MlKwZo!~mbk@sHo;VFo6qg6TT2;Of5?^1Z(n@|6E&9`@&=QpncE(MjLN z$??}jEFpG7riTG_plVq$U6Qo5yBYa|1lA|Q-aaT)C$*Bx3SPUZKA5!cQiU5>)&$dR zF2I+~dgkKc?u4UAXZ1TPztm8eKnWb9$bfMnhu3i6_mm${E>+276s8QB5m?U^bB;S2 zl>(4hnEEio$U)`klvWEdQqxuoh~n~06lk~HA0sEv=M!>NGeqigCDQmh@<_+XHV(O^ z7w#$9o-xhsH0>QuO|Ht4w6*D*5n28lN6(0;QqTqr!o*+p1PMr)Lx3Y8oFhxVb$v5W z!V6H#3or*KlpF&O*xKAA&D>Fnm{bqa%i6Eic50PmU9DutmnqXAQLx*L#k?u1lNmkM z_2tQ>Z9?mIx#RE%6TO%=)TQv#Jk-J$8tfKg$2z|{m*-Yc)ReGdVG@YyL3ehT`($e+ z8g#^`0GbKAy3>PjowUf;{cRE^!eTC#7F6b*c)F>>^o-hc&lBW-=E;BP2be9w0`He@ z0KZ-Vkp5r#5pglLar&hjFNJQ06$V5eP2HL}6ox*!T_r_MArz0?0+gBEp`m*NW~5l^ zVVe{B^}2zG-HUj975JsRV)YG?bA_ zoI#>xVG=z>4U8fTj606{yX6WGf;DQ*I<+|Ylx#nmv2&LE| zb#n!BzAEdZXKv}N4#JOB3nK8rCQl1L=(D!*tdbDrXCE<*Bb7J&SeQ|-DA%Ui4Ft1N z6ib^AQ|v&P1}_!LItlraO@T6@AVyoP83X#xNbv>!Jshl2TCo(K<-WMsufNyn+S;6c zbMW=W0E^zrk0_W?%l+)zTp%h|Rl1BE1$LXjq$bsC1M@0~A=%iY2g5T)Rms6+1Qymq zc`OA7eoS7AGNnRqzFFkVm0&{?Z*ign{tBm;*a*p1@eaL$L%u#h(WYwJLgXGX8an2l07WkR@Zi7u4|0{>0sjJ#)6NJpEuX7p~|d0dbTGzU^n_zx@S2{oOGwPVqC6Anb@&ZS%cxA zh}J5`N7%~V4QV9Ndpc{fZw<&YGl@*bSYCV;|GXiGJlZ7YSjQFYHJneR#N` z?*{GQQzg6bn(8!LPj1>mev@Or+jxJxM3)oQ-e%26>2vXH^Lj1Q)a3b<;F@S_SkzlHCB1<8hD|%IGT&3i`#_-6O&*g*|u}tt|ekUFn zTe8f?Vr)Y~PVH#T%dk4!5M#}e#uGVrL_W2;_PX3`! zZ%4{d8;G}dV;_KZnm6j-HIkc;91vhiT zc0)3vgT4h764b*ONhM^`1VcGUv$Y`B8adF7DeS{pAN8$dcdtAW&i|q_?aPl4np5i{ zrB4U^y127_Z}J{E-8*+~bW8=yE)>k4P~PxLSBF%2?2mW1&zDUa_gw^Gg-B)F%-FQ< zqndTq43MqJ!zhI9j~V?0)C(?yztGQE-EomUtMHK=DCrDeY3!AL-fdM8hNp`s1X z;Mr&g9yB;(epaozPVm9<>f$Y3k=kFgZnL5ILiKsyZ9`6VrJf>NRryTE+Rfy!W5|h~ zPY^wFekdL{HH0TBYxiH^H8GK%rdb5F>Q&N7t_E4FQxj8TFYV_ISnb7 z$7dtnQ`m& z>UN(Lh~uu$ZBG;Y{fcviA{9Q`u7uU(MBLFWj2_LE7H;E@8C<$N<6-LOx@XP#*j3HB zP%3HUD+B&dOhc1L{iZrcG-W0WE}))+E!LwA%Z^z{(r zb9IsPzI+^|s`>8W`HJ?t24~>0di5Gi3;1`ChiS!w(0Hr4G^;Vbr)6N46mg>Bpw!14Ju&cjFqLzTKJn z*lSAYTrV{A))S`*;7wuUzv+XN*5hHF?SzF$nWoHg(Oj)r$2@%#JvGPQP+EDFmA+TS z?^e`gW|NT&O3;bKmK#!9aYJk$^2DlgAc*c>h!}umD>B}{A=P6eih173JUvUhkL*NQIe)!p?!dc_UQQ~E|>ra_&PI>OHSZ3@#N zn}rxKs%<|FV`FXdI+Y3=>;TtqA^Yf8&#uza&_J_NiKIGglkrJMYm zFQY){=va7XC+tM6y>C@EzT5mW`;jlV;d^BGu=;A|s#f1Qp>F}!eq2dTlWu1#m5{TS zo<7Iiwh$@iVZFn_O&!zom0NPPEmcDD`88fr?^mtb&z{~|OE-rAS(d;Of|-(GdyET* zp}uKC7RR?H*5y0LHpiQrpWQNo87*3im9nvz85DW%q%5cN2<`-e5i;%&pR}(aD8ubX zIj=kfxPVskwRZ|Y)l{XB(@_ds)yxZ)-mUZ08{P%$_>e*OaVeDL$TRH7??1~23iu4> zqn=eX&h&CXFnWO3KlOw3WG)_33J6k4$IMB6FT-)aCj`&0*afVMjIB8|@tTs>P%s8g zr2o{h#QbKEs@g9Y)4E$~_6uEn z$^EC}9HB;DJPx{3I_RJTugpuJ?l0ROuX1Ef(l|*-4FTgY>pY>(5nz_7t~&CeBvO-G zCyBhdkfLv;w|$k$lake9Fy${l(n{CN--8DYDgrTtimANZzKwS4VEqj)q83*xuA&RhvEHtA+-8cLF;hN+Q{a1Qfu;+^dD8D$-1R*J4zp+HezcR4L3+rMw&W5VKuTJm;G%@tB7tGtlt$U}3Pk?IyJ4-uld!L<|&3!p2Xijz8 zCF>=rXct*e@z|t@9?{^fMtL{b)LVWvF?4W5FUaqQbIY_PJmuv!2YjT9 zBO5N}>aAVda>iZkH9v3T74PA=Lh*eFRO}Odg&%@|JW$UU+ze0QEbQ^mBl)9#qA8#> zn?7x_kkmCVH@O0QDnw2*;o3Y?p^0D$abJL;v$1Y0p~yZHKRyd*94!%`wNbBL25_RA zc*&-igQq+_3v=ItK=b3>n7QR*gR*j8nLr4azvdorNrgqcnTgroI?hLHh&3k)#8N&# zlqQyHYdsjv?C7+DFaesXA@5+i#SUfy?gzIlXc}|IRYZS{^S5 zIqbbdS3KV$<$PhM4_z@nu-22Si4tJhI5BMsmsF-W+i=_cM|aQfY{pI z96D)6fc_D)J@21PnGKw-iegB3xEwOc^dudtgmEcumeq%#Zsh1S`;D+vgHBDl<(?BgIbt3Br18U9ognnnNhkdg%`x$pf{0p#TOSBh5S} zywkpX9-gLAT8vD~fq<5RsK-LF31@wc^s$Id%e16rnAKJb^s{~nMej|2UElagPq23KCGe~>{Lqt?vV4{iBG54Uvo~`^1H-e`3~CUY zLY?n~dqBtoN9?1Dj#AN?%+l$p`Eq`n3ew|qNW-ka>N*x0-WleA*$BIo_63-!N%c}~L zS3*$9cjZ)Wd{gZL0W6_iU24al*$ts)pbL;PNqbIH@DrvQV8`2(aSAa4#M)Kge!7s1 zhR7ngkpZJ?ahmxjhrO2&&%db&up=Fsg3#sI*62 zR?b5u29rY9qweHpkd4;-sV*Bx86mOJRb?Z6w1_`cwCHMx7yGDaX!wGe%W2j51m5lC zu#2)_F8s3P2vDHeb2cWFujs~ zU`SLIUc8-_@9Ex7OEf-k=sI;VG>}$Y;kJvcF53C#;J3Z%zb^qsy_cb8bd%=Spa_St z|Bzm1Vul;L8dB{dN0+yuQi3*bZp&eacMVNT9d)*_{5ooW{%jaZ-vX?T6(>{NN&*xt zbH~iuq<4j};;n}Q?2mRAeQP~2&eB_17x+SV_C^3w#Pt3xk4?a|Z?y>)^#lkJm0uZRxs~+(C7D7o^v1>$RPtFgXmZPa#&B@kVytDPG1&`NzYVf19b(l zUTU6g6(sjsk2cxX>QTar;rPom*ZLO#9R3z1cjhFSc#>349Qc+_uN{l+{MZ{hcM6!@ z6rKQPk|MXwHrt?FPO`WSODizvonsgitxqb*3uM&h@S|V1SGiC({fu$bx=fDgbI6(N z*Lv>S2EwJdr&Xv1H{q7M#OJ%isur1P#oP`L>4sJVM*eLM_kC0$(<-Tvxma=FnNSQ} z3zs^;nnn?g1LaYAL@@9^h|3*(DH$qQ1r@Ib`iM0zc%mPgjNRj-@fve%IIPg{h(yK{ zC`Ib14`kislgfuO=R1e?OrSeKy#Kzm^QpQa%hIL+8Y7l=%qDT2`cGWHZ3V1erH4Ym zdL1A$bb2bqMG}?BjF_%7Wc{Oy^OoOaM-e=ZKxh+9Snng|w8M5D=OMS{6|+g6IFw!084-h7DJLc z`dff>!=j%2U9`7{xYDySlCX*#Eh;W!!iuhOVS)?uO9-oE-OF>+568}8N8SPPM2oqZ zglM_y6WKs!xG>IO1XTes98Li@R9Qr->47Ra-tM#!+S>5uegL1; zPho?z*R=758Mx8UoP4?nAY=*1NUTbIO(J;Lspu;68ibaCenMa=vBl&zrPvS*3!|mG z&JW92-t~<&u_}>Ax>thSu=jPS6b#EvhFr=4ETT2ED7(G7CycWvMr#qc(MX zxOHhfo5#+;9Daq)EppWtLi!xFCtw|)i^-i_G{0JkXXrb;WNJ>3%Xe%yjcE5<`ch*) zx%lm%_9)V0?!&)EAXtU313C)9N>mDFPA^^)t>PvzZ&eNDWs?(?9gxCDg}jX22T_7$ z4a{XIZ_m%5B<0nB@ng(fAngeCR^95@uY(LmtNd6?Kq*Se4E#fEbJ9RDJN9 zX-h4CJOW+L=+rx2kmVti8wv&3yMljUPWzk5id#qdx?7Lb+Mp@yCDYA8x8A(gqfI_A z06{mxzH9QdmGA0xYJ{Z9K@JP*J~w5FgrKypy{>iNe`hvN^m+@JqAWW8ob#eJ>2iTL z!B_A_j$IVWs9TGzerh?kJFE(pdk&r!dbi1FzO~pUn{<#ycQ+Zc?Q-Bf+@M2HqMPI3 ziaeaQ4Y4AQ)1g^M@U=i(qfO_aZpOm5k`H2Ri+WUHl3Pafjp zX32_IGjXOWPmpvGHA3x>#d7ES4kEr9!j8vuMU5j*_0~u-4m=XT#eO^1cCNCMNkZE^ z>Am;B| z#G^;P_$3ccyl^x>i{wC)F&W6*52<7*v=NLo@@u>l5V5p~#az)Y9< zzXkESo&7Qa{jNa=yI{__&e%`n&lPnUZ4K|oK&*>;H!ESgV8Vc6{-oDo*M?COR(-w0 zkY+EAl+g4{p|prpjN*d3z2_cjj?-+LV}DBpQLgVX{m$%$ZmEa9Fc+%{lnS9BKxYPy5L?LU?h~W?sq)3-aI;H$fMv`tEDr+o^f+2V zD)B=ZydqN>IRbwE2e%4YXwFSthEkBN(k=@9kvcL6%9=Z@Ev=G?dWsHUmn#RNxAkDy z$}?}mnQmFI55eGh6TRQ$UD{{wCr?;(VM?UGH@vry=HEX_vY_@bw8x!Zp!*Ypa#f@~ zCzRO+>l8ngLPLe?1e>rYs&bR;~Ed7(@k+Z$i(7A;BRVI`Hpz|iLg5wWFbR#WDm59v3jx}R$ywTR^O1i=^@CBZFUM2(>sz|2=dlL+gS zPSh6!c2udf5(c6_!M6wx7Qss1)NUl=u{67f$dM;v=KfGNl#EjL^N}Dq>}+wWQC)7s z+FOl%+LypUBr*KHH(VRA3R4 zKRj~l^?Y!DxgWW!?_z2cOST2}P@m@9t81LzRWIyMewR@=!aRXlYR=Be>Pukw^IMSnHY&vj{ukW)lZE8Nc9ZI zK+Ot$^t2xHRON?uDG)jL&BAl1vAgq*U+Yj?X`c-)2VUK;1_frM*9$iR8z@U>f#XV` zI@<`_oUiRw+e!`-$b1B&`YqKTF1QY2(fYM&W)p??-wXi?W)B9{YN6W|JoK!F5|X7GZ(HqpVt9kFM!uhM&eCy-3;XV( zW>{q~bvxps89ADi#!w{70cug~0<@+d~;}E ztd5s-LIJl-Mo$LDALrX_)$MT3OKo!p6PZaG$s09u?pr?Eua{dRwmk9_zb|gLo=Z`FOkrWcG2Ce_c69LoPpqa5S~w@b18CEZi>_F%e1F!mc?EsaO-H!v^BV>d z6SHUk*bayg47&yJzmZ$8i+!-Y@4!F#M1Hv60wPc2Kl%%zAh4bRhVeevZ+yq1H?|La z|FhX?QlKv=3cmpN@@pr(9}x)X??{P%Y<4OcJN~hOUZJ{SyUmX19R%nZ>}4%xUhQZL zMkywrMsGFKR0G!5krA}{;;W2uUvl* zo?V%G(UfZUc0OZM5n(ZAf#?vYCm`0GLbDr@`awV#Mj-}-zc<{a=yBS#>#de$CW89m zSy@O`;@N^2E{}YIdz+9yM$o=6n^}Mg%2Q<9?U;qe?zlE5R_%5ndlg*QK?Gz8{VCm~ z=&&5)%(J+}90@$rgsAxI4)X~MwtzG}av-k2SQLcosAq>D6Wubh)(Zzyw89I_l0!kb zZ`FN@h};H1osncNJo$@#??L141Dq-+(2-HuCT|2DdB@Y48LJf%(wZLnWKEUxM3@rk z@N<8L)VH6(9Q&_c%;~pqF)UF6flEHV0YMS8={Wek5KgJmnsHbdl12LJCV5v)&_~|* zh=ou;(LJ0)hyaE0dePNaUbm@B7O(!m08b=F|w;0F1jC=f}-5>dwa(pR5?tqk}r0v>$R@ z7f4i9^X)Tbt2d`9zA>kcPsl$XHNWJ!@?E$N-VE!xxn^0UPZc+#1)?58tCUWHi)8Tn zW=gaIBfR516K|qF-G#rb@*aN|*ZW*?aflV)jk{Yxgwo2b1PcvOp5DITfG?zM#%J|u z`sLUjF8v4kh<&ff?gPkdx3}()&1X*75wz2aA$>dE^*4UnJlD8^C4-x@@5)CAT@v%B zObBd5Jz=Vt68r53AXyJOmsaud&J@cRgqtn1)&qVY$^H1JXnzkO79+#CIXxkFu(Qy_X3p{ZuM8ii9Ym%A2a&kc z8VTg!2Yf?l2$rtWx@1=uGNsC?O9^+38LasyO06QErAKs8mW1q61QS2kpdy@6kM7UI zVx^vbUgVcUPc(Q$&vw>O4{}GIAv=+PDp)+F2wVtS6j+Qir}025zvRZtGd<~!=_95~ zb@SH{6IG%FX&d-=!3P?se1vK3XE{P8-rFehAdsDA(KM+Mwa}q@ezcQh@g~4B4barJ z_C4MzAPt7ZLPwT}FW3i4~G^xL>o~=)dU}8IP&V zboMh=ZSC5X_8=r(9ZFSK#D%p(rW`BDK8)a&B8J2FNANq+rHO}T!~ldaqK^IBa_qKT zvoktycU=N|VvZ|t7;a1|b%n$dC-Y#$uDs@@H^}z$Hs!z9Z^=p#d2^}u5L3{kA+2=y zsTGl1`5sIJ3lDArucjyd+(6Tp8< zF%q*sum4-F$Uwj6O7ttQKXUzNFu?DONer7m^ZZ->&HA13?_qJjGZg+;#$N#kzmqg) zc~AeS&EN8G;_syYKco-;AGHbjFQk73*8L6y5p(>rYJba1=r{MSJLJGt$ge#tp<0{Cw&|1E#7{lB|R{!Whi^;rC; z+W(sa`pov%lr<*njsC z`yCtot55!c{YSh0?lJZc9A?}%Y^(`jb;-Ys!r$_D+`rG#e#dz-{x7(H&Dnk@jU)_L jUZ76^R}TMWj{cT%lHd@(9uOedU!R{~KtL6&e_Z`PcM3vg literal 0 HcmV?d00001 diff --git a/intra/source/awerwer/com/FRESteamWorksLibLinux.swc b/intra/source/awerwer/com/FRESteamWorksLibLinux.swc new file mode 100644 index 0000000000000000000000000000000000000000..a4bfdd466193c470b0c7c7823948f9653d2c83a4 GIT binary patch literal 7423 zcmaKxRa6^lu(pBVZp9(E6nA%u6Wjv?mm;OOd$9loiWCSGcPNljytuoQLUAuvTnhi* zSN}fe;>@gB@Au8DnY;Ju(a`{)k|JULlWH~g3P}G6oPXY~&NlC@-v{t``8gmTQM}q$ zG}gyy;YUL9NB$<^?9Zf5HIxnjKL zVoD`oI+b$pSY=gx)M;FA*%@f~_Xx(g)f5evl2aA^Sh)Bq`s32K5L(Puc(##W5*|ws zXkzD2sl}bgZKh_cRQuSmbig0G^%00wq5tY}%7BffRW~)}ZzU+Kbnd<}*u}96?l~4d z2~p)JO;}lZ-~91x6Lmf4*IP7XE$wWeP2cSaGvLz zPG0I5;LmSYp4>EX$+JpWsV0NZU$y(_M*WGA((%$?EJ`5#$xN?NIVp>5qrf!rT?6e3 zwl1Z5TWWS1@lNIgxivm}&|22(aev3em@6>0y1yNdeEwj!-}EsZnnFWCXJ+vznkr}R z@Aev)={8k_f-&_eSwuA)aagFJ_s;ATMTHdwH?d#)ZG={V$8B;R+)3|EmCLPaOGbs3 z&$5^gN?<1kM87o&v*`uoZ6af^pjbw%ViYG31-8l8-(N|Rshf}peTR73cv?FTYz@wS zD8;D}$sNWULQ#XrMPRDgX&^hL{dtMZ?w4WL;o#s`mxnWRYnISQAT2V`Lkg9UUgH}F zC(;w{GyAKelgXnlm25;nzhb6MOQGhj=5@j!oa0Em{;h091A+uYBlw+1~ zYb4!9A5DSKo12agd;!9=st>yWN8n#uEO)$x(tk~SNY06jXq!>Rc$77 z?zUYw6d4r^bG&b;D{Wd7(5tF;uQoh0^j>7TmyoaW83D`l@LJnsf#cA}UDocigSn4U zcztBcKI!a$LG_kYw7wbRd!Ll7d92*)$rF~69X$*(ANGa&${S1Hk60+~_zWeiG|nP) zgv*8xm3tXhD@R9js1{W@QaQ&#&Ymj=5{bbvp6E9Uw=3Y|K+HF|?PwNYt&`7-2Fy)~$9%VF+(^$8A zGzjK~@nmFt_7#%!5~Uj@oADz}D5rf>YA_7b!5`U$3Js*@;^j&kaFu-0t6bTLY)AJi zS>#wXx^{7uNiHefBx$)2rBppA^CWksmZgyuBL!0DP|;CS)81u&L)t`1vB=?<6Cvg8&0S^ceQ$?YxbM3oi20x<@0RJIC;s;dpHf9ptgNPHk` z(I~G3eL;(jN-VAHnoL!|(DzZ~k=iV|CB+s8=QQ~f>(I0)Ohkwl25N?6HS=m?c1`e4 z5{g1}xbz=NJaIxt=9Hq)whJdHez@Hq|E7H70)}esW@?9IV0->Sd zkKjy|{ZX+9h=k7v|_F!lTw<@=4qLz527ixGg0wdF$F?+L6s559p1L{xAVmS`Ur( zaYaO?v&`uomU!;A$o#z{_Oy?0DsBF!Ci|<8;HfQ|8>c11O0UKZC}b*aJP2N7K8;s7 zkjG$aM&pB<(=zk<60jSQNd0h6_V!KtM&kF5$E|z%4CgyvSW;KKh3^H_TOvJUcVl%N zu1C}1FY>{3{*J;?sy!4mt(8zsWgMG5=nOf~nvvh-uDECgw>C3=Xw8K~Ifi1jCwxI# z9IM>gS{7~Bh^u6`&Id1~g5^0n4rXE=0#uM1!vhfz*o=@ylQ=%bU>al z|Hj4StZmP2E@Jl(z)}tK$<)x>FJE1ip}Ib>upDafp^^-ATDkN2*%|$KJWSX(l}b!^ zd5_CsBQ9ACK0hw(dGz0>n!;2N>D1)7i+4F>;^>f?x&B+5?E1Ogx%v6-U?-u@T&`=^ zC&`RX6!ft+Prk3$bkEz^^q_>;ecEeO;8EGa@X^vi+YqI*eD_9I^0uw)SO_cuX6Mo$ zYst?7jf|0!8un_3JP;v9r#yp)u6To##kggic)g$Kvc4X5%KD@o=UYJX{r~%^DM@3%TB^TGUJEmjRYeQN-ty{Z^qYp)o3VobyBPlL) z>NYYr`lqjFbsOv%H&Y>7#YElAJNQ&+@~H8-nF8m5k(SrF!G>!d=;pp$lGjGGByzRo zBG@tTgJmkkvoPk1y;5W-`G@jFpSq(fZ}&r7Qvx+x*tW&?V&B?VVk5c+5SGZ7g?Ae9 z5#4fj^!#7>AhfBWganoy3nn5UV&# zK%#p?06hwKYrHXb2DP{k_eLPc?h2_1+_QY}8j@MuY})qz(~kXs z1W=9nH3Sok5qy23&U9>$irtlMctRZuv%aUyw1UiheIg!vfdn9rc{DuHjR6~;crybc zR({d*9VSJ_el(;w`nl>yEhJpaAjuT{dsR!-F0Okr>2WVzftlZ1*n@h7V5Dl0g&ICSei!AQM}+yNh(C#(-8na3 zm}G32VT{LuwavMkM2F2eEe&>RPrt>}F6cRMKr+dgSUjq5Ky|0y`q@H`*l)X_e02CrS9)`JV{$`6H{9N?h+Mn>5j1J`vQ_3|w zg=)hV{jLR>j=!4?_goF|1Vg41?zTnuUqvbq=w7GZm_xsVBFnrDpQ7BjMECDSvf}HO zrPxSBze_{zat*Ji*r-OoQvp1sBX>E3dr)i?;GJs$g2#|v0k|kOYLF)>H-4h~&mw74 zZcqY(hmc-e!q2ETV$tvX08hh6FV^8e>Wy;rI}gCqDpDf4|1YE;0^Rj^=hT3wNu)5o z?gHHNB4kV6Rpt%o8rK1dUm}tyshbw6NIe}hCuWU_r0OD}NvrKgX3Uxd{Is|={OTaQ zmc1h}^ztS2t?1siw_8fl`C6WgJr58Xz%Od$t>~UXojj8sFCmcY*F%%MW$VjSG0*PI zYtLC!^ZKN8hh?(lbh2d`A~w)6KP4N_0W2ZiXgROssD&;ZV>iLns$Y{cgo8B!wv zo5iJHe+?1=iF6~)vRM<_UQjfGu(9Yeh7N)wRd)F$3N~~Dpp$I=26V-jSn)+FT8+^$ zC{3)j2Sa?L1#p%cQrDXjY3pK$A2ThMB$|qTBgf{K>G?cYkdST%yJ|CY4hLK;eNqVr zt(@~vU5ul}EWH+sJjTdx7UopC;jYolvPz0Tq@To#V4u*ABr8eABv0Bo7DXvI8aHyz zs1;UAuD}k8rtzpZ(L1;ad8n^8pmDP&k)Bpx1BnAG{}HS+oVb64@(icDg?Bmf7VY2J zt23O6e+2Igrypuh#8$y!UNG1!KQ|Msk8qEDdtjZ@=E9z3Xq@{v*K z=OZgEo%vt`CO7_>UHVYIvl*&mx<}*6_OK9dWc7;d%9iseoJ--Y24wcoc~XqL=L8qj zCdEy;#0YOyNUx=HEb}2km_M?u(HReRV$zXe00M?iUd5b(z9;-$isj zn-tdR7=yyGM+`rj)>;^SHfajO8>v}9=R88h`y5GpD=(_kb|-9h_Oxu$U8@LueZ<=7 zplxrB3Xk>-V>D$PrmlB_Gc#71uevM1JMVH<)tj9k@5V%eS7aMHi%wPDW8DzD8Qh;O zPmt2|k>C7G-oa>f;uok&0$rV)FcK5|*9PGX3SDIquW7tOOu)C0fCI2c-o{zJx(jbi?@~@S-ZqV99v;pe_r^|9W z=mzIAEdq7%lu4<`ppmZEy>2^_WyB{3ypk91Qdz3Y9w>V{A%@rv{um6WG{zCQve0Ul z{kHbq7JbnKjeCf?75z_;bt12(O+TX<^Vls?>y%M2T^g};NnUSt6_G$Y<|8sN3&;Kh zeO}LiQv_Nz{&JG@W5?O;bXDQ3Cn!Cu$PAP(z1j8ol^D&XvMO5)kQocOi7LjIS^gHNxWaCZLRy=ZvtRvrk zIYII5L31U7mGVw3viVKH+9`$$^Lx%&GqeuLZA4f*D3{T1tJI3>w6~lw5BY?a6~}h# zZ2sjmcm1)%m)w9XjY%g|T@rvpr+ONjTd?>GZ9lMyfWeCTNBTDB=9*#G*}{F7_I?n7 z(;5H0(VL(%;_cf7igf^vBVN~SZ~yMT)XmN=%AaPh&qE(?Lkxf29(Mqz17tA~u}A(v z)&;&V#Ag^T9l)B4XFg3Du`DU1;gue7tB5>Vz1=5W*yWJ-WJ>tWJKFtUhL7+R9?xf! zq)R5@$%1gNVYr&NYUX|mo=gHbXpf+b%PAf=@tb3)P|PH^8r=Y$`Z>j!mOo8_{R2nv zWPHKkKGvb&7wNKFZ>P{ReZ=-VBU&EW+7Rr?{B49BNgKHM`kgZmm-mxs-HH#=`(}0lWGJRTBz=RuvyD3*|PS z0!zUPCpdikGHx2l#f70{Wu?yi0Tj*Uzk}K5e5?N|9sisz>B2k^%0cs{I`*uw8fqs(aI4@7Z6^#AxVDyCn({v=J9yMDKrK9eN9T^@?)3 zD+=7Ua2nIJUp7!IhTU`Jx-P7;xrZNy@#mpy^4OPt9peN;m9=uVSGR)czEEw}Ax-LS zniLKq8UeQU1Y@1A}|z|oEX@+GCou4lU0h3CJ2pcNm+aeEnO$)1P zt&p`s!6AZ7Nz@ZJ)eQp}>t$8)y8CPmKU&*ZNvp>6uXrJz1^ZbF6c|66+1NFy+^coB zv{mjevEl7#Cu^$9Rn7V3Ww+U%j@iu~aP_)?96{5%TqxN0p|Bj;b%I_D)Dt?pEu*!h z&M>)s&n@SZs9y0~<*wp2z?F=AJHc@Z;i;Dl^9FuK2ew7;-(FLKRI5^H_IG|uw#nxV z`m3?1CrryKxroK(p}w-bV}pC@>{ZMT~s&F zl4F)Ha?Fffcw_%Xv0fpi;GFaLlf{-@h}KCRv);F0v1@TqW%}di&o(GBWKzM>dAO4= za-5f%9UslV_jAh4BOu$GtSHqaTDgy6e+S{ZWP_(`C|6lJl(?On@}Oh*ac6TLPO#BT6QK zk)|Rw>QizLAF(n^EFac{!}lX#9e40CxhiMq_XGji7Kn15UAzphvqi^%!uc3}UwZaD z>qejQg*ACQ{8dJbv!@wVA!2m275b&NDsMu^O?b9AH?OaA1$+GR7FFfepP+`gR5L{874O-9WN)YAHLec`4Yc2GCZ1Wd2)lfh(n0M#T&&&Vpt|%2L4(Fr78{kaXzko zy4z3|9O5{$TBIwT0Ai=?Nda2Kfx?A8erUTt3JE`JEFDHkp zt#O-N-6cz~DLDdo?eimgT7r!#>3$+lyw8RE!-7%g;k_t3-f8>i^_nk*)TY2%|J)K% z`~0OE3Sk)DN%nV(!I6QT)=mA&Rj`@bh7Ct&M>~ErfRq=b_Mom5)Z?Gb2@P~4iS|0$9u7_89r-l ze*2D|oixC{CJC4E_yv&F!RD%?fq_Z*;RDJU1rpNHKc(}3auQo>Z);Z%M;?DS*KbBz zUI;$I&V6J5;GyOn-p~AYv!6h%LNLBLI!aT^D5|g|=GgNyPU>_ystV^>9NW#1$6s9* z8VU6U39J673;~89O*`>2WR_|@%Q|TMN`9b zZ!434t%?^uFslQAoDJ*%>Sb(X2skK@Ff<9^$jLqK zxEc+KgibhUCn>&Li|`<;bFOf!HOyjDI8C$ao|j1gDi7S$osPNQy_Y?P|E=lodq>Xa z%Sfygtwi2>p747DyS=cPYQRg}L0pHQ_f?!q&ROCIWH~Gs_TR2U4kvX>>%Hji@9q9}VQ-0_U0OiN*%}x|_ z3v&W39Tp@T!A9=J2aY_~OH+&VHyiqWLLIG&gBK}#`53Ubr-W_yj-9pZ!d33*y_4hp z92?R#4%*jWuh>}krJN3Sa7FAa@o%<&cXZm4$h?2-R|@T33>GUHmYr|61)|@c2LDKN#|VFaG!F|6F9J aL_+$HFLgA~(Eq)P@=w11NBwC2{rx|Q1SXjP literal 0 HcmV?d00001 diff --git a/intra/source/awerwer/com/FRESteamWorksTest.hx b/intra/source/awerwer/com/FRESteamWorksTest.hx new file mode 100644 index 0000000..ee5248f --- /dev/null +++ b/intra/source/awerwer/com/FRESteamWorksTest.hx @@ -0,0 +1,115 @@ +package; + +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; + +import flash.display.SimpleButton; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.text.TextField; +import flash.utils.ByteArray; + +class FRESteamWorksTest extends Sprite +{ + public var Steamworks:FRESteamWorks=new FRESteamWorks(); + public var tf:TextField; + public function new() + { + tf=new TextField(); + tf.width=stage.stageWidth; + tf.height=stage.stageHeight; + addChild(tf); + + tf.addEventListener(MouseEvent.MOUSE_DOWN, onClick); + + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + + if(Steamworks.init()){ + log("STEAMWORKS API is available\n"); + + //comment.. current stats and achievement ids are from steam example app which is provided with their SDK + log("isAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.isAchievement("ACH_WIN_ONE_GAME")); + log("isAchievement('ACH_TRAVEL_FAR_SINGLE')=="+Steamworks.isAchievement("ACH_TRAVEL_FAR_SINGLE")); + log("setStatFloat('FeetTraveled')=="+Steamworks.setStatFloat('FeetTraveled', 21.3)); + log("setStatInt('NumGames', 2)=="+Steamworks.setStatInt('NumGames', 2)); + Steamworks.storeStats(); + log("getStatInt('NumGames')=="+Steamworks.getStatInt('NumGames')); + log("getStatFloat('FeetTraveled')=="+Steamworks.getStatFloat('FeetTraveled')); + + log("setCloudEnabledForApp(false)=="+Steamworks.setCloudEnabledForApp(false)); + log("setCloudEnabledForApp(true)=="+Steamworks.setCloudEnabledForApp(true)); + log("isCloudEnabledForApp()=="+Steamworks.isCloudEnabledForApp()); + log("getFileCount()=="+Steamworks.getFileCount()); + log("fileExists('test.txt')=="+Steamworks.fileExists('test.txt')); + + //comment.. writing to app with id 480 is somehow not working, but works with our real appId + log("writeFileToCloud('test.txt','hello steam')=="+writeFileToCloud('test.txt','hello steam')); + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + //----------- + + //Steamworks.requestStats(); + Steamworks.resetAllStats(true); + }else { + tf.appendText("STEAMWORKS API is NOT available\n"); + } + + } + private function log(value:String):Void{ + tf.appendText(value+"\n"); + tf.scrollV=tf.maxScrollV; + } + public function writeFileToCloud(fileName:String, data:String):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeUTFBytes(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public function readFileFromCloud(fileName:String):String { + var dataIn:ByteArray=new ByteArray(); + var result:String; + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + result=dataIn.readUTFBytes(dataIn.length); + } + return result; + } + + public function onClick(e:MouseEvent):Void{ + log("--click--"); + if(Steamworks.isReady){ + if(!Steamworks.isAchievement("ACH_WIN_ONE_GAME")){ + log("setAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.setAchievement("ACH_WIN_ONE_GAME")); + } else { + log("clearAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.clearAchievement("ACH_WIN_ONE_GAME")); + } + if(Steamworks.fileExists('test.txt')){ + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + log("Steamworks.fileDelete('test.txt')=="+Steamworks.fileDelete('test.txt')); + } else { + log("writeFileToCloud('test.txt','click')=="+writeFileToCloud('test.txt','click')); + } + //Steamworks.storeStats(); + } else { + log("not able to set achievement\n"); + } + } + + public function onSteamResponse(e:SteamEvent):Void{ + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + log("RESPONSE_OnUserStatsStored:"+e.response); + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + log("RESPONSE_OnUserStatsReceived:"+e.response); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + log("RESPONSE_OnAchievementStored:"+e.response); + break; + default: + log("STEAMresponse type:"+e.req_type+" response:"+e.response); + } + } +} \ No newline at end of file diff --git a/intra/source/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx b/intra/source/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx new file mode 100644 index 0000000..5e3cafe --- /dev/null +++ b/intra/source/awerwer/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx @@ -0,0 +1,170 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function getUserID():String + { + return _ExtensionContext.call("AIRSteam_GetUserID")as String; + } + + public function getPersonaName():String + { + return _ExtensionContext.call("AIRSteam_GetPersonaName")as String; + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool + { + return _ExtensionContext.call("AIRSteam_UseCrashHandler", appID, version, date, time)as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/intra/source/awerwer/com/amanitadesign/steam/Assets/descriptor.xml b/intra/source/awerwer/com/amanitadesign/steam/Assets/descriptor.xml new file mode 100644 index 0000000..33cd566 --- /dev/null +++ b/intra/source/awerwer/com/amanitadesign/steam/Assets/descriptor.xml @@ -0,0 +1,20 @@ + + com.amanitadesign.steam.FRESteamWorks + 0.0.1 + + + + FRESteamWorks.dll + ExtInitializer + ExtFinalizer + + + + + FRESteamWorks.framework + ExtInitializer + ExtFinalizer + + + + \ No newline at end of file diff --git a/intra/source/awerwer/com/amanitadesign/steam/FRESteamWorks.hx b/intra/source/awerwer/com/amanitadesign/steam/FRESteamWorks.hx new file mode 100644 index 0000000..1f3571c --- /dev/null +++ b/intra/source/awerwer/com/amanitadesign/steam/FRESteamWorks.hx @@ -0,0 +1,333 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by Ventero + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam { +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.IOErrorEvent; +import flash.events.ProgressEvent; +import flash.events.StatusEvent; +import flash.filesystem.File; +import flash.utils.ByteArray; +import flash.utils.IDataInput; +import flash.utils.IDataOutput; +import flash.utils.clearInterval; +import flash.utils.setInterval; +import helper.Achievements; + +class FRESteamWorks extends EventDispatcher { + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private static inline var PATH:String=".local/share/Steam/SteamApps/common/Anodyne/share/APIWrapper"; + + private var _file:File; + private var _process:NativeProcess; + private var _tm:Int; + private var _error:Bool=false; + + public var isReady:Bool=false; + + private static inline var AIRSteam_Init:Int=0; + private static inline var AIRSteam_RunCallbacks:Int=1; + private static inline var AIRSteam_RequestStats:Int=2; + private static inline var AIRSteam_SetAchievement:Int=3; + private static inline var AIRSteam_ClearAchievement:Int=4; + private static inline var AIRSteam_IsAchievement:Int=5; + private static inline var AIRSteam_GetStatInt:Int=6; + private static inline var AIRSteam_GetStatFloat:Int=7; + private static inline var AIRSteam_SetStatInt:Int=8; + private static inline var AIRSteam_SetStatFloat:Int=9; + private static inline var AIRSteam_StoreStats:Int=10; + private static inline var AIRSteam_ResetAllStats:Int=11; + private static inline var AIRSteam_GetFileCount:Int=12; + private static inline var AIRSteam_GetFileSize:Int=13; + private static inline var AIRSteam_FileExists:Int=14; + private static inline var AIRSteam_FileWrite:Int=15; + private static inline var AIRSteam_FileRead:Int=16; + private static inline var AIRSteam_FileDelete:Int=17; + private static inline var AIRSteam_IsCloudEnabledForApp:Int=18; + private static inline var AIRSteam_SetCloudEnabledForApp:Int=19; + private static inline var AIRSteam_GetUserID:Int=20; + private static inline var AIRSteam_GetPersonaName:Int=21; + private static inline var AIRSteam_UseCrashHandler:Int=22; + + public function new(target:IEventDispatcher=null){ + Achievements.DEBUG_TEXT +="making FRESteamworks\n"; + try { + _file=File.userDirectory.resolvePath(PATH); + Achievements.DEBUG_TEXT +="Found file at\n" + _file.nativePath +"\n"; + Achievements.DEBUG_TEXT +=_file.size.toString()+ " bytes\n"; + } catch(e:Dynamic){ + Achievements.DEBUG_TEXT +="COULDN'T FIND FILE"; + } + _process=new NativeProcess(); + _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, eventDispatched); + _process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, errorCallback); + super(target); + } + + public function dispose():Void { + if(_process.running){ + _process.closeInput(); + _process.exit(); + } + clearInterval(_tm); + isReady=false; + } + + private function startProcess():Void { + var startupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + startupInfo.executable=_file; + + _process.start(startupInfo); + } + + public function init():Bool { + Achievements.DEBUG_TEXT +="Sanity check...\n"; + if(_file==null || !_file.exists)return false; + Achievements.DEBUG_TEXT +="got file\n"; + startProcess(); + if(!_process.running){ + Achievements.DEBUG_TEXT +="Process not running\n"; + return false; + } + + if(!callWrapper(AIRSteam_Init))return false; + isReady=readBoolResponse(); + if(isReady)_tm=setInterval(runCallbacks, 100); + Achievements.DEBUG_TEXT +="ready? " + isReady.toString()+ "\n"; + return isReady; + } + + private function errorCallback(e:IOErrorEvent):Void { + _error=true; + // the process doesn't accept our input anymore, so just stop it + clearInterval(_tm); + + if(_process.running){ + try { + _process.closeInput(); + } catch(e:Dynamic){ + // no-op + } + + _process.exit(); + } + } + + private function callWrapper(funcName:Int, params:Array=null):Bool { + _error=false; + + if(!_process.running){ + Achievements.DEBUG_TEXT +="wrapper call fail\n"; + + return false; + } + + var stdin:IDataOutput=_process.standardInput; + stdin.writeUTFBytes(funcName + "\n"); + + if(params){ + for(i in 0...params.lengthi){ + if(params[i] is ByteArray){ + var length:Int=params[i].length; + // length + 1 for the added newline + stdin.writeUTFBytes(String(length + 1)+ "\n"); + stdin.writeBytes(params[i]); + stdin.writeUTFBytes("\n"); + } else { + stdin.writeUTFBytes(String(params[i])+ "\n"); + } + } + } + + return !_error; + } + + private function waitForData(output:IDataInput):Int { + while(!output.bytesAvailable){ + // wait + if(!_process.running)return 0; + } + + return output.bytesAvailable; + } + + private function readBoolResponse():Bool { + if(!_process.running)return false; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(1); + Achievements.DEBUG_TEXT +="bool resp:" + response.toString()+ "\n"; + return(response=="t"); + } + + private function readIntResponse():Int { + if(!_process.running)return 0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail); + return parseInt(response, 10); + } + + private function readFloatResponse():Float { + if(!_process.running)return 0.0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return parseFloat(response); + } + + private function readStringResponse():String { + if(!_process.running)return ""; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return response; + } + + private function eventDispatched(e:ProgressEvent):Void { + var stderr:IDataInput=_process.standardError; + var avail:Int=stderr.bytesAvailable; + var data:String=stderr.readUTFBytes(avail); + + var pattern:RegExp=/__event__<(\d+),(\d+)>/g; + var result:Dynamic; + while((result=pattern.exec(data))){ + var req_type:Int=new Std.int(result[1]); + var response:Int=new Std.int(result[2]); + var steamEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + dispatchEvent(steamEvent); + } + } + + public function requestStats():Bool { + if(!callWrapper(AIRSteam_RequestStats))return false; + return readBoolResponse(); + } + + public function runCallbacks():Bool { + if(!callWrapper(AIRSteam_RunCallbacks))return false; + return true; + } + + public function getUserID():String { + if(!callWrapper(AIRSteam_GetUserID))return ""; + return readStringResponse(); + } + + public function getPersonaName():String { + if(!callWrapper(AIRSteam_GetPersonaName))return ""; + return readStringResponse(); + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool { + if(!callWrapper(AIRSteam_UseCrashHandler, [appID, version, date, time]))return false; + return readBoolResponse(); + } + + public function setAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_SetAchievement, [id]))return false; + return readBoolResponse(); + } + + public function clearAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_ClearAchievement, [id]))return false; + return readBoolResponse(); + } + + public function isAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_IsAchievement, [id]))return false; + return readBoolResponse(); + } + + public function getStatInt(id:String):Int { + if(!callWrapper(AIRSteam_GetStatInt, [id]))return 0; + return readIntResponse(); + } + + public function getStatFloat(id:String):Float { + if(!callWrapper(AIRSteam_GetStatFloat, [id]))return 0.0; + return readFloatResponse(); + } + + public function setStatInt(id:String, value:Int):Bool { + if(!callWrapper(AIRSteam_SetStatInt, [id, value]))return false; + return readBoolResponse(); + } + + public function setStatFloat(id:String, value:Float):Bool { + if(!callWrapper(AIRSteam_SetStatFloat, [id, value]))return false; + return readBoolResponse(); + } + + public function storeStats():Bool { + if(!callWrapper(AIRSteam_StoreStats))return false; + return readBoolResponse(); + } + + public function resetAllStats(bAchievementsToo:Bool):Bool { + if(!callWrapper(AIRSteam_ResetAllStats, [bAchievementsToo]))return false; + return readBoolResponse(); + } + + public function getFileCount():Int { + if(!callWrapper(AIRSteam_GetFileCount))return 0; + return readIntResponse(); + } + + public function getFileSize(fileName:String):Int { + if(!callWrapper(AIRSteam_GetFileSize, [fileName]))return 0; + return readIntResponse(); + } + + public function fileExists(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileExists, [fileName]))return false; + return readBoolResponse(); + } + + public function fileWrite(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileWrite, [fileName, data]))return false; + return readBoolResponse(); + } + + public function fileRead(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileRead, [fileName]))return false; + + var success:Bool=readBoolResponse(); + if(success){ + var content:String=readStringResponse(); + data.writeUTFBytes(content); + data.position=0; + } + + return success; + } + + public function fileDelete(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileDelete, [fileName]))return false; + return readBoolResponse(); + } + + public function isCloudEnabledForApp():Bool { + if(!callWrapper(AIRSteam_IsCloudEnabledForApp))return false; + return readBoolResponse(); + } + + public function setCloudEnabledForApp(enabled:Bool):Bool { + if(!callWrapper(AIRSteam_SetCloudEnabledForApp, [enabled]))return false; + return readBoolResponse(); + } +} \ No newline at end of file diff --git a/intra/source/awerwer/com/amanitadesign/steam/SteamConstants.hx b/intra/source/awerwer/com/amanitadesign/steam/SteamConstants.hx new file mode 100644 index 0000000..f61bdea --- /dev/null +++ b/intra/source/awerwer/com/amanitadesign/steam/SteamConstants.hx @@ -0,0 +1,21 @@ +/* + * SteamConstants.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=0; + public static inline var RESPONSE_FAILED:Int=1; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; + public static inline var RESPONSE_OnGameOverlayActivated:Int=3; +} \ No newline at end of file diff --git a/intra/source/awerwer/com/amanitadesign/steam/SteamEvent.hx b/intra/source/awerwer/com/amanitadesign/steam/SteamEvent.hx new file mode 100644 index 0000000..279106f --- /dev/null +++ b/intra/source/awerwer/com/amanitadesign/steam/SteamEvent.hx @@ -0,0 +1,55 @@ +/* + * SteamEvent.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/intra/source/buildmap.py b/intra/source/buildmap.py new file mode 100644 index 0000000..8261bc5 --- /dev/null +++ b/intra/source/buildmap.py @@ -0,0 +1,256 @@ +#!/usr/bin/python +# +# www.josephlandry.com +# +# buildmap.py +# +# Builds map images from Anodyne game source files. +# +# Anodyne game: http://www.anodynegame.com/ +# +# The source folder should be in ./Anodyne/src/ +# The map images will be outputted to ./maps/ in PNG format. +# + +import os +import csv +from PIL import Image +from xml import sax + +def read_layer(filename): + f = open(filename, "rb") + map_reader = csv.reader(f, delimiter=",") + map = [] + for row in map_reader: + map.append(row) + f.close() + return map + + +def read_tileset(filename): + tilesetimage = Image.open(filename); + tilesetimage_xblocks = tilesetimage.size[0] / 16 + tilesetimage_yblocks = tilesetimage.size[1] / 16 + tileset = [] + for i in range(tilesetimage_yblocks): + for j in range(tilesetimage_xblocks): + tile = tilesetimage.crop((j * 16, i * 16, j * 16 + 16, i * 16 + 16)) + tileset.append(tile) + return tileset + +def paint_with_layer(image, layer, tileset): + y_blocks = len(layer) + x_blocks = len(layer[0]) + for i in range(y_blocks): + for j in range(x_blocks): + tile_index = int(layer[i][j]) + tile = tileset[tile_index] + if tile_index != 0: + image.paste(tile, (j * 16, i * 16, j * 16 + 16, i * 16 + 16), tile) + + +def generate_map_image(map): + layer = read_layer(map["layers"][0]) + tileset = read_tileset(map["tileset"]) + image = Image.new("RGB", (len(layer[0]) * 16, len(layer) * 16)) + paint_with_layer(image, layer, tileset) + for layerfile in map["layers"][1:]: + layer = read_layer(layerfile) + paint_with_layer(image, layer, tileset) + return image + +class RegistryHandler(sax.ContentHandler): + mapname = "" + registry = {} + def startElement(self, name, attrs): + if name == "root": + pass + elif name == "map": + self.mapname = attrs["name"] + if self.mapname not in self.registry.keys(): + self.registry[self.mapname] = {} + else: + if not(name in self.registry[self.mapname].keys()): + self.registry[self.mapname][name] = [] + self.registry[self.mapname][name].append({"x": attrs["x"], "y": attrs["y"], "frame": attrs["frame"]}) + def endElement(self, name): + pass + +def read_registry(): + parser = sax.make_parser() + handler = RegistryHandler() + parser.setContentHandler( handler ) + parser.parse( 'Anodyne/src/global/Registry_embedXML.dat') + return handler.registry + + + +mapfiles = [ + { + "world": "APARTMENT", + "tileset": "Anodyne/src/data/TileData__Apartment_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_APARTMENT_BG.dat", "Anodyne/src/data/CSV_Data_APARTMENT_BG2.dat", "Anodyne/src/data/CSV_Data_APARTMENT_FG.dat"] + }, + { + "world": "BEACH", + "tileset": "Anodyne/src/data/TileData__Beach_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_BEACH_BG.dat"] + }, + { + "world": "BEDROOM", + "tileset": "Anodyne/src/data/TileData__Bedroom_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_BEDROOM_BG.dat"] + }, + { + "world": "BLANK", + "tileset": "Anodyne/src/data/TileData_Blank_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_BLANK_BG.dat"] + }, + { + "world": "BLUE", + "tileset": "Anodyne/src/data/TileData_Blue_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_BLUE_BG.dat", "Anodyne/src/data/CSV_Data_BLUE_BG2.dat"] + }, + { + "world": "CELL", + "tileset": "Anodyne/src/data/TileData_Cell_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_CELL_BG.dat"] + }, + { + "world": "CIRCUS", + "tileset": "Anodyne/src/data/TileData__Circus_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_CIRCUS_BG.dat", "Anodyne/src/data/CSV_Data_CIRCUS_FG.dat"] + }, + { + "world": "CLIFF", + "tileset": "Anodyne/src/data/TileData_Cliff_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_CLIFF_BG.dat", "Anodyne/src/data/CSV_Data_CLIFF_BG2.dat"] + }, + { + "world": "CROWD", + "tileset": "Anodyne/src/data/TileData__Crowd_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_CROWD_BG.dat", "Anodyne/src/data/CSV_Data_CROWD_BG2.dat"] + }, + { + "world": "DEBUG", + "tileset": "Anodyne/src/data/TileData_Debug_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_DEBUG_BG.dat", "Anodyne/src/data/CSV_Data_DEBUG_BG2.dat", "Anodyne/src/data/CSV_Data_DEBUG_FG.dat"] + }, + { + "world": "DRAWER", + "tileset": "Anodyne/src/data/TileData_BlackWhite_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_DRAWER_BG.dat"] + }, + { + "world": "FIELDS", + "tileset": "Anodyne/src/data/TileData__Fields_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_FIELDS_BG.dat", "Anodyne/src/data/CSV_Data_FIELDS_FG.dat"] + }, + { + "world": "FOREST", + "tileset": "Anodyne/src/data/TileData_Forest_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_FOREST_BG.dat", "Anodyne/src/data/CSV_Data_FOREST_BG2.dat", "Anodyne/src/data/CSV_Data_FOREST_FG.dat"] + }, + { + "world": "GO", + "tileset": "Anodyne/src/data/TileData_Go_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_GO_BG.dat", "Anodyne/src/data/CSV_Data_GO_BG2.dat"] + }, + { + "world": "HAPPY", + "tileset": "Anodyne/src/data/TileData_Happy_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_HAPPY_BG.dat", "Anodyne/src/data/CSV_Data_HAPPY_BG2.dat"] + }, + { + "world": "HOTEL", + "tileset": "Anodyne/src/data/TileData__Hotel_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_HOTEL_BG.dat", "Anodyne/src/data/CSV_Data_HOTEL_BG2.dat", "Anodyne/src/data/CSV_Data_HOTEL_FG.dat"] + }, + { + "world": "NEXUS", + "tileset": "Anodyne/src/data/TileData__Nexus_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_NEXUS_BG.dat", "Anodyne/src/data/CSV_Data_NEXUS_FG.dat"] + }, + { + "world": "OVERWORLD", + "tileset": "Anodyne/src/data/TileData__Overworld_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_OVERWORLD_BG.dat", "Anodyne/src/data/CSV_Data_OVERWORLD_BG2.dat"] + }, + { + "world": "REDCAVE", + "tileset": "Anodyne/src/data/TileData_REDCAVE_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_REDCAVE_BG.dat", "Anodyne/src/data/CSV_Data_REDCAVE_BG2.dat"] + }, + { + "world": "REDSEA", + "tileset": "Anodyne/src/data/TileData_Red_Sea_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_REDSEA_BG.dat", "Anodyne/src/data/CSV_Data_REDSEA_FG.dat"] + }, + { + "world": "SPACE", + "tileset": "Anodyne/src/data/TileData_Space_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_SPACE_BG.dat", "Anodyne/src/data/CSV_Data_SPACE_BG2.dat", "Anodyne/src/data/CSV_Data_SPACE_FG.dat"] + }, + { + "world": "STREET", + "tileset": "Anodyne/src/data/TileData__Street_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_STREET_BG.dat", "Anodyne/src/data/CSV_Data_STREET_BG2.dat", "Anodyne/src/data/CSV_Data_STREET_FG.dat"] + }, + { + "world": "SUBURB", + "tileset": "Anodyne/src/data/TileData_Suburb_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_SUBURB_BG.dat"] + }, + { + "world": "TERMINAL", + "tileset": "Anodyne/src/data/TileData_Terminal_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_TERMINAL_BG.dat", "Anodyne/src/data/CSV_Data_TERMINAL_BG2.dat"] + }, + { + "world": "WINDMILL", + "tileset": "Anodyne/src/data/TileData__Windmill_Tiles.png", + "layers": ["Anodyne/src/data/CSV_Data_WINDMILL_BG.dat", "Anodyne/src/data/CSV_Data_WINDMILL_BG2.dat"] + } +] + +entities = { + "Treasure": { "image": "Anodyne/src/entity/gadget/Treasure_S_TREASURE_SPRITE.png", "tile_index": 1} +} + + +# build initial map images +maps = {} +for mapfile in mapfiles: + print "Processing: " + mapfile["world"] + map = generate_map_image(mapfile) + maps[mapfile["world"]] = map + + +# read registry XML file that contains entity information +registry = read_registry() +treasure_tiles = read_tileset("Anodyne/src/entity/gadget/Treasure_S_TREASURE_SPRITE.png"); + +# draw the supported entites on the maps +for worlds in registry.keys(): + print "Processing entities: " + worlds + if worlds in maps.keys(): + apartment = maps[worlds] + apartment_regs = registry[worlds] + if "Treasure" in apartment_regs.keys(): + treasures = apartment_regs["Treasure"] + for treasure in treasures: + x = int(treasure["x"]) + y = int(treasure["y"]) + apartment.paste(treasure_tiles[0], (x, y, x+16, y+16), treasure_tiles[0]) + + + + +# Make map directory and save images +if not os.path.exists("maps"): + os.makedirs("maps") + +for map in maps.keys(): + map_image = maps[map]; + print "Saving " + map + map_image.save("maps/" + map + ".png", "PNG") diff --git a/intra/source/ca/wegetsignal/nativeextensions/MacJoystick.hx b/intra/source/ca/wegetsignal/nativeextensions/MacJoystick.hx new file mode 100644 index 0000000..05a565c --- /dev/null +++ b/intra/source/ca/wegetsignal/nativeextensions/MacJoystick.hx @@ -0,0 +1,42 @@ +package ca.wegetsignal.nativeextensions; + +class MacJoystick +{ + public var id:Int=-1; + + public var axes:Array; + public var buttons:Array; + + public function new(id:Int,numAxes:Int,numButtons:Int) + { + this.id=id; + this.axes=new Array(numAxes); + this.buttons=new Array(numButtons); + } + + /** Returns the value for axis at index between -1 and 1 + * Returns 0 for invalid axis index queries */ + public function getAxis(index:Int=0):Float { + if(index<0 || index>=axes.length) + return 0; + return axes[index]; + } + + /** Returns true if the button is on, false if released. + * Returns false if button index is out of valid range */ + public function getButton(index:Int=0):Bool { + if(index<0 || index>=buttons.length) + return false; + return buttons[index]; + } + + private function updateAxes(params:Array):Void { + // first param is this joystick id.. or should be.. + if(params[0] !=id) + throw new Dynamic("Invalid joystick ID for Axes update"); + + for(i in 1...params.lengthi){ + axes[i-1]=Std.parseFloat(params[i]); + } + } +} \ No newline at end of file diff --git a/intra/source/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx b/intra/source/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx new file mode 100644 index 0000000..478f32b --- /dev/null +++ b/intra/source/ca/wegetsignal/nativeextensions/MacJoystickEvent.hx @@ -0,0 +1,26 @@ +package ca.wegetsignal.nativeextensions; + +import flash.events.Event; + +/** joystick property is the affected MacJoystick object + * elementIndex means the button index that was updated + * axes updates include all axes as a limitation of the IOKit HID Manager */ +class MacJoystickEvent extends Event +{ + public static const JOYSTICK_ADDED:String="JOYSTICK_ADDED", + JOYSTICK_REMOVED:String="JOYSTICK_REMOVED", + JOYSTICK_BUTTON_PUSHED:String="JOYSTICK_BUTTON_PUSHED", + JOYSTICK_BUTTON_RELEASED:String="JOYSTICK_BUTTON_RELEASED", + JOYSTICK_AXES_UPDATED:String="JOYSTICK_AXES_UPDATED"; + + public var joystick:MacJoystick; + public var elementIndex:Int; + + public function new(type:String,joystick:MacJoystick,elementIndex:Int=-1) + { + super(type); + + this.joystick=joystick; + this.elementIndex=elementIndex; + } +} \ No newline at end of file diff --git a/intra/source/ca/wegetsignal/nativeextensions/MacJoystickManager.hx b/intra/source/ca/wegetsignal/nativeextensions/MacJoystickManager.hx new file mode 100644 index 0000000..51c8094 --- /dev/null +++ b/intra/source/ca/wegetsignal/nativeextensions/MacJoystickManager.hx @@ -0,0 +1,76 @@ +package ca.wegetsignal.nativeextensions; + +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import global.Keys; + +class MacJoystickManager extends EventDispatcher +{ + private static inline var EXTENSION_ID:String="ca.wegetsignal.nativeextensions.MacJoyANE"; + + private var context:ExtensionContext; + private var numJoysticks:Int=0; + + public var joysticks:Array=[]; + + private static const JOYSTICK_ADDED:String="JOYSTICK_ADDED", + JOYSTICK_REMOVED:String="JOYSTICK_REMOVED", + JOYSTICK_BUTTON_PUSHED:String="JOYSTICK_BUTTON_PUSHED", + JOYSTICK_BUTTON_RELEASED:String="JOYSTICK_BUTTON_RELEASED", + JOYSTICK_AXES_UPDATED:String="JOYSTICK_AXES_UPDATED"; + + public function new() + { + super(); + + context=ExtensionContext.createExtensionContext(EXTENSION_ID,null); + context.addEventListener(StatusEvent.STATUS,onStatus); + context.call("initializeGamepads",null); + } + + public function numberOfJoysticks():Int { + return numJoysticks; + } + + private function onStatus(event:StatusEvent):Void + { + var params:Array=event.level.split(','); + var affectedJoystick:MacJoystick; + var elementIndex:Int=-1; + + switch(event.code){ + case JOYSTICK_ADDED: + // level is joystickID,numAxes,numButtons + affectedJoystick=new MacJoystick(int(params[0]),int(params[1]),int(params[2])); + joysticks[int(params[0])]=affectedJoystick; + numJoysticks++; + break; + case JOYSTICK_REMOVED: + affectedJoystick=joysticks[int(params[0])]; + joysticks[int(params[0])]=null; + numJoysticks--; + break; + case JOYSTICK_BUTTON_PUSHED: + // level is joystickID,buttonIndex + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.buttons[int(params[1])]=true; + elementIndex=Std.int(params[1]); + break; + case JOYSTICK_BUTTON_RELEASED: + // level is joystickID,buttonIndex + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.buttons[int(params[1])]=false; + elementIndex=Std.int(params[1]); + break; + case JOYSTICK_AXES_UPDATED: + // level is joystickID,[axes] + affectedJoystick=joysticks[int(params[0])] + affectedJoystick.updateAxes(params); + break; + } + + dispatchEvent(new MacJoystickEvent(event.code,affectedJoystick,elementIndex)); + } +} \ No newline at end of file diff --git a/intra/source/com/FRESteamWorksLibLinux.swc b/intra/source/com/FRESteamWorksLibLinux.swc new file mode 100644 index 0000000000000000000000000000000000000000..a4bfdd466193c470b0c7c7823948f9653d2c83a4 GIT binary patch literal 7423 zcmaKxRa6^lu(pBVZp9(E6nA%u6Wjv?mm;OOd$9loiWCSGcPNljytuoQLUAuvTnhi* zSN}fe;>@gB@Au8DnY;Ju(a`{)k|JULlWH~g3P}G6oPXY~&NlC@-v{t``8gmTQM}q$ zG}gyy;YUL9NB$<^?9Zf5HIxnjKL zVoD`oI+b$pSY=gx)M;FA*%@f~_Xx(g)f5evl2aA^Sh)Bq`s32K5L(Puc(##W5*|ws zXkzD2sl}bgZKh_cRQuSmbig0G^%00wq5tY}%7BffRW~)}ZzU+Kbnd<}*u}96?l~4d z2~p)JO;}lZ-~91x6Lmf4*IP7XE$wWeP2cSaGvLz zPG0I5;LmSYp4>EX$+JpWsV0NZU$y(_M*WGA((%$?EJ`5#$xN?NIVp>5qrf!rT?6e3 zwl1Z5TWWS1@lNIgxivm}&|22(aev3em@6>0y1yNdeEwj!-}EsZnnFWCXJ+vznkr}R z@Aev)={8k_f-&_eSwuA)aagFJ_s;ATMTHdwH?d#)ZG={V$8B;R+)3|EmCLPaOGbs3 z&$5^gN?<1kM87o&v*`uoZ6af^pjbw%ViYG31-8l8-(N|Rshf}peTR73cv?FTYz@wS zD8;D}$sNWULQ#XrMPRDgX&^hL{dtMZ?w4WL;o#s`mxnWRYnISQAT2V`Lkg9UUgH}F zC(;w{GyAKelgXnlm25;nzhb6MOQGhj=5@j!oa0Em{;h091A+uYBlw+1~ zYb4!9A5DSKo12agd;!9=st>yWN8n#uEO)$x(tk~SNY06jXq!>Rc$77 z?zUYw6d4r^bG&b;D{Wd7(5tF;uQoh0^j>7TmyoaW83D`l@LJnsf#cA}UDocigSn4U zcztBcKI!a$LG_kYw7wbRd!Ll7d92*)$rF~69X$*(ANGa&${S1Hk60+~_zWeiG|nP) zgv*8xm3tXhD@R9js1{W@QaQ&#&Ymj=5{bbvp6E9Uw=3Y|K+HF|?PwNYt&`7-2Fy)~$9%VF+(^$8A zGzjK~@nmFt_7#%!5~Uj@oADz}D5rf>YA_7b!5`U$3Js*@;^j&kaFu-0t6bTLY)AJi zS>#wXx^{7uNiHefBx$)2rBppA^CWksmZgyuBL!0DP|;CS)81u&L)t`1vB=?<6Cvg8&0S^ceQ$?YxbM3oi20x<@0RJIC;s;dpHf9ptgNPHk` z(I~G3eL;(jN-VAHnoL!|(DzZ~k=iV|CB+s8=QQ~f>(I0)Ohkwl25N?6HS=m?c1`e4 z5{g1}xbz=NJaIxt=9Hq)whJdHez@Hq|E7H70)}esW@?9IV0->Sd zkKjy|{ZX+9h=k7v|_F!lTw<@=4qLz527ixGg0wdF$F?+L6s559p1L{xAVmS`Ur( zaYaO?v&`uomU!;A$o#z{_Oy?0DsBF!Ci|<8;HfQ|8>c11O0UKZC}b*aJP2N7K8;s7 zkjG$aM&pB<(=zk<60jSQNd0h6_V!KtM&kF5$E|z%4CgyvSW;KKh3^H_TOvJUcVl%N zu1C}1FY>{3{*J;?sy!4mt(8zsWgMG5=nOf~nvvh-uDECgw>C3=Xw8K~Ifi1jCwxI# z9IM>gS{7~Bh^u6`&Id1~g5^0n4rXE=0#uM1!vhfz*o=@ylQ=%bU>al z|Hj4StZmP2E@Jl(z)}tK$<)x>FJE1ip}Ib>upDafp^^-ATDkN2*%|$KJWSX(l}b!^ zd5_CsBQ9ACK0hw(dGz0>n!;2N>D1)7i+4F>;^>f?x&B+5?E1Ogx%v6-U?-u@T&`=^ zC&`RX6!ft+Prk3$bkEz^^q_>;ecEeO;8EGa@X^vi+YqI*eD_9I^0uw)SO_cuX6Mo$ zYst?7jf|0!8un_3JP;v9r#yp)u6To##kggic)g$Kvc4X5%KD@o=UYJX{r~%^DM@3%TB^TGUJEmjRYeQN-ty{Z^qYp)o3VobyBPlL) z>NYYr`lqjFbsOv%H&Y>7#YElAJNQ&+@~H8-nF8m5k(SrF!G>!d=;pp$lGjGGByzRo zBG@tTgJmkkvoPk1y;5W-`G@jFpSq(fZ}&r7Qvx+x*tW&?V&B?VVk5c+5SGZ7g?Ae9 z5#4fj^!#7>AhfBWganoy3nn5UV&# zK%#p?06hwKYrHXb2DP{k_eLPc?h2_1+_QY}8j@MuY})qz(~kXs z1W=9nH3Sok5qy23&U9>$irtlMctRZuv%aUyw1UiheIg!vfdn9rc{DuHjR6~;crybc zR({d*9VSJ_el(;w`nl>yEhJpaAjuT{dsR!-F0Okr>2WVzftlZ1*n@h7V5Dl0g&ICSei!AQM}+yNh(C#(-8na3 zm}G32VT{LuwavMkM2F2eEe&>RPrt>}F6cRMKr+dgSUjq5Ky|0y`q@H`*l)X_e02CrS9)`JV{$`6H{9N?h+Mn>5j1J`vQ_3|w zg=)hV{jLR>j=!4?_goF|1Vg41?zTnuUqvbq=w7GZm_xsVBFnrDpQ7BjMECDSvf}HO zrPxSBze_{zat*Ji*r-OoQvp1sBX>E3dr)i?;GJs$g2#|v0k|kOYLF)>H-4h~&mw74 zZcqY(hmc-e!q2ETV$tvX08hh6FV^8e>Wy;rI}gCqDpDf4|1YE;0^Rj^=hT3wNu)5o z?gHHNB4kV6Rpt%o8rK1dUm}tyshbw6NIe}hCuWU_r0OD}NvrKgX3Uxd{Is|={OTaQ zmc1h}^ztS2t?1siw_8fl`C6WgJr58Xz%Od$t>~UXojj8sFCmcY*F%%MW$VjSG0*PI zYtLC!^ZKN8hh?(lbh2d`A~w)6KP4N_0W2ZiXgROssD&;ZV>iLns$Y{cgo8B!wv zo5iJHe+?1=iF6~)vRM<_UQjfGu(9Yeh7N)wRd)F$3N~~Dpp$I=26V-jSn)+FT8+^$ zC{3)j2Sa?L1#p%cQrDXjY3pK$A2ThMB$|qTBgf{K>G?cYkdST%yJ|CY4hLK;eNqVr zt(@~vU5ul}EWH+sJjTdx7UopC;jYolvPz0Tq@To#V4u*ABr8eABv0Bo7DXvI8aHyz zs1;UAuD}k8rtzpZ(L1;ad8n^8pmDP&k)Bpx1BnAG{}HS+oVb64@(icDg?Bmf7VY2J zt23O6e+2Igrypuh#8$y!UNG1!KQ|Msk8qEDdtjZ@=E9z3Xq@{v*K z=OZgEo%vt`CO7_>UHVYIvl*&mx<}*6_OK9dWc7;d%9iseoJ--Y24wcoc~XqL=L8qj zCdEy;#0YOyNUx=HEb}2km_M?u(HReRV$zXe00M?iUd5b(z9;-$isj zn-tdR7=yyGM+`rj)>;^SHfajO8>v}9=R88h`y5GpD=(_kb|-9h_Oxu$U8@LueZ<=7 zplxrB3Xk>-V>D$PrmlB_Gc#71uevM1JMVH<)tj9k@5V%eS7aMHi%wPDW8DzD8Qh;O zPmt2|k>C7G-oa>f;uok&0$rV)FcK5|*9PGX3SDIquW7tOOu)C0fCI2c-o{zJx(jbi?@~@S-ZqV99v;pe_r^|9W z=mzIAEdq7%lu4<`ppmZEy>2^_WyB{3ypk91Qdz3Y9w>V{A%@rv{um6WG{zCQve0Ul z{kHbq7JbnKjeCf?75z_;bt12(O+TX<^Vls?>y%M2T^g};NnUSt6_G$Y<|8sN3&;Kh zeO}LiQv_Nz{&JG@W5?O;bXDQ3Cn!Cu$PAP(z1j8ol^D&XvMO5)kQocOi7LjIS^gHNxWaCZLRy=ZvtRvrk zIYII5L31U7mGVw3viVKH+9`$$^Lx%&GqeuLZA4f*D3{T1tJI3>w6~lw5BY?a6~}h# zZ2sjmcm1)%m)w9XjY%g|T@rvpr+ONjTd?>GZ9lMyfWeCTNBTDB=9*#G*}{F7_I?n7 z(;5H0(VL(%;_cf7igf^vBVN~SZ~yMT)XmN=%AaPh&qE(?Lkxf29(Mqz17tA~u}A(v z)&;&V#Ag^T9l)B4XFg3Du`DU1;gue7tB5>Vz1=5W*yWJ-WJ>tWJKFtUhL7+R9?xf! zq)R5@$%1gNVYr&NYUX|mo=gHbXpf+b%PAf=@tb3)P|PH^8r=Y$`Z>j!mOo8_{R2nv zWPHKkKGvb&7wNKFZ>P{ReZ=-VBU&EW+7Rr?{B49BNgKHM`kgZmm-mxs-HH#=`(}0lWGJRTBz=RuvyD3*|PS z0!zUPCpdikGHx2l#f70{Wu?yi0Tj*Uzk}K5e5?N|9sisz>B2k^%0cs{I`*uw8fqs(aI4@7Z6^#AxVDyCn({v=J9yMDKrK9eN9T^@?)3 zD+=7Ua2nIJUp7!IhTU`Jx-P7;xrZNy@#mpy^4OPt9peN;m9=uVSGR)czEEw}Ax-LS zniLKq8UeQU1Y@1A}|z|oEX@+GCou4lU0h3CJ2pcNm+aeEnO$)1P zt&p`s!6AZ7Nz@ZJ)eQp}>t$8)y8CPmKU&*ZNvp>6uXrJz1^ZbF6c|66+1NFy+^coB zv{mjevEl7#Cu^$9Rn7V3Ww+U%j@iu~aP_)?96{5%TqxN0p|Bj;b%I_D)Dt?pEu*!h z&M>)s&n@SZs9y0~<*wp2z?F=AJHc@Z;i;Dl^9FuK2ew7;-(FLKRI5^H_IG|uw#nxV z`m3?1CrryKxroK(p}w-bV}pC@>{ZMT~s&F zl4F)Ha?Fffcw_%Xv0fpi;GFaLlf{-@h}KCRv);F0v1@TqW%}di&o(GBWKzM>dAO4= za-5f%9UslV_jAh4BOu$GtSHqaTDgy6e+S{ZWP_(`C|6lJl(?On@}Oh*ac6TLPO#BT6QK zk)|Rw>QizLAF(n^EFac{!}lX#9e40CxhiMq_XGji7Kn15UAzphvqi^%!uc3}UwZaD z>qejQg*ACQ{8dJbv!@wVA!2m275b&NDsMu^O?b9AH?OaA1$+GR7FFfepP+`gR5L{874O-9WN)YAHLec`4Yc2GCZ1Wd2)lfh(n0M#T&&&Vpt|%2L4(Fr78{kaXzko zy4z3|9O5{$TBIwT0Ai=?Nda2Kfx?A8erUTt3JE`JEFDHkp zt#O-N-6cz~DLDdo?eimgT7r!#>3$+lyw8RE!-7%g;k_t3-f8>i^_nk*)TY2%|J)K% z`~0OE3Sk)DN%nV(!I6QT)=mA&Rj`@bh7Ct&M>~ErfRq=b_Mom5)Z?Gb2@P~4iS|0$9u7_89r-l ze*2D|oixC{CJC4E_yv&F!RD%?fq_Z*;RDJU1rpNHKc(}3auQo>Z);Z%M;?DS*KbBz zUI;$I&V6J5;GyOn-p~AYv!6h%LNLBLI!aT^D5|g|=GgNyPU>_ystV^>9NW#1$6s9* z8VU6U39J673;~89O*`>2WR_|@%Q|TMN`9b zZ!434t%?^uFslQAoDJ*%>Sb(X2skK@Ff<9^$jLqK zxEc+KgibhUCn>&Li|`<;bFOf!HOyjDI8C$ao|j1gDi7S$osPNQy_Y?P|E=lodq>Xa z%Sfygtwi2>p747DyS=cPYQRg}L0pHQ_f?!q&ROCIWH~Gs_TR2U4kvX>>%Hji@9q9}VQ-0_U0OiN*%}x|_ z3v&W39Tp@T!A9=J2aY_~OH+&VHyiqWLLIG&gBK}#`53Ubr-W_yj-9pZ!d33*y_4hp z92?R#4%*jWuh>}krJN3Sa7FAa@o%<&cXZm4$h?2-R|@T33>GUHmYr|61)|@c2LDKN#|VFaG!F|6F9J aL_+$HFLgA~(Eq)P@=w11NBwC2{rx|Q1SXjP literal 0 HcmV?d00001 diff --git a/intra/source/com/FRESteamWorksTest.hx b/intra/source/com/FRESteamWorksTest.hx new file mode 100644 index 0000000..ee5248f --- /dev/null +++ b/intra/source/com/FRESteamWorksTest.hx @@ -0,0 +1,115 @@ +package; + +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; + +import flash.display.SimpleButton; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.text.TextField; +import flash.utils.ByteArray; + +class FRESteamWorksTest extends Sprite +{ + public var Steamworks:FRESteamWorks=new FRESteamWorks(); + public var tf:TextField; + public function new() + { + tf=new TextField(); + tf.width=stage.stageWidth; + tf.height=stage.stageHeight; + addChild(tf); + + tf.addEventListener(MouseEvent.MOUSE_DOWN, onClick); + + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + + if(Steamworks.init()){ + log("STEAMWORKS API is available\n"); + + //comment.. current stats and achievement ids are from steam example app which is provided with their SDK + log("isAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.isAchievement("ACH_WIN_ONE_GAME")); + log("isAchievement('ACH_TRAVEL_FAR_SINGLE')=="+Steamworks.isAchievement("ACH_TRAVEL_FAR_SINGLE")); + log("setStatFloat('FeetTraveled')=="+Steamworks.setStatFloat('FeetTraveled', 21.3)); + log("setStatInt('NumGames', 2)=="+Steamworks.setStatInt('NumGames', 2)); + Steamworks.storeStats(); + log("getStatInt('NumGames')=="+Steamworks.getStatInt('NumGames')); + log("getStatFloat('FeetTraveled')=="+Steamworks.getStatFloat('FeetTraveled')); + + log("setCloudEnabledForApp(false)=="+Steamworks.setCloudEnabledForApp(false)); + log("setCloudEnabledForApp(true)=="+Steamworks.setCloudEnabledForApp(true)); + log("isCloudEnabledForApp()=="+Steamworks.isCloudEnabledForApp()); + log("getFileCount()=="+Steamworks.getFileCount()); + log("fileExists('test.txt')=="+Steamworks.fileExists('test.txt')); + + //comment.. writing to app with id 480 is somehow not working, but works with our real appId + log("writeFileToCloud('test.txt','hello steam')=="+writeFileToCloud('test.txt','hello steam')); + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + //----------- + + //Steamworks.requestStats(); + Steamworks.resetAllStats(true); + }else { + tf.appendText("STEAMWORKS API is NOT available\n"); + } + + } + private function log(value:String):Void{ + tf.appendText(value+"\n"); + tf.scrollV=tf.maxScrollV; + } + public function writeFileToCloud(fileName:String, data:String):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeUTFBytes(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public function readFileFromCloud(fileName:String):String { + var dataIn:ByteArray=new ByteArray(); + var result:String; + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + result=dataIn.readUTFBytes(dataIn.length); + } + return result; + } + + public function onClick(e:MouseEvent):Void{ + log("--click--"); + if(Steamworks.isReady){ + if(!Steamworks.isAchievement("ACH_WIN_ONE_GAME")){ + log("setAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.setAchievement("ACH_WIN_ONE_GAME")); + } else { + log("clearAchievement('ACH_WIN_ONE_GAME')=="+Steamworks.clearAchievement("ACH_WIN_ONE_GAME")); + } + if(Steamworks.fileExists('test.txt')){ + log("readFileFromCloud('test.txt')=="+readFileFromCloud('test.txt')); + log("Steamworks.fileDelete('test.txt')=="+Steamworks.fileDelete('test.txt')); + } else { + log("writeFileToCloud('test.txt','click')=="+writeFileToCloud('test.txt','click')); + } + //Steamworks.storeStats(); + } else { + log("not able to set achievement\n"); + } + } + + public function onSteamResponse(e:SteamEvent):Void{ + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + log("RESPONSE_OnUserStatsStored:"+e.response); + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + log("RESPONSE_OnUserStatsReceived:"+e.response); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + log("RESPONSE_OnAchievementStored:"+e.response); + break; + default: + log("STEAMresponse type:"+e.req_type+" response:"+e.response); + } + } +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx b/intra/source/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx new file mode 100644 index 0000000..5e3cafe --- /dev/null +++ b/intra/source/com/amanitadesign/steam/Assets/FRESteamWorkswin.hx @@ -0,0 +1,170 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function getUserID():String + { + return _ExtensionContext.call("AIRSteam_GetUserID")as String; + } + + public function getPersonaName():String + { + return _ExtensionContext.call("AIRSteam_GetPersonaName")as String; + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool + { + return _ExtensionContext.call("AIRSteam_UseCrashHandler", appID, version, date, time)as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/Assets/descriptor.xml b/intra/source/com/amanitadesign/steam/Assets/descriptor.xml new file mode 100644 index 0000000..33cd566 --- /dev/null +++ b/intra/source/com/amanitadesign/steam/Assets/descriptor.xml @@ -0,0 +1,20 @@ + + com.amanitadesign.steam.FRESteamWorks + 0.0.1 + + + + FRESteamWorks.dll + ExtInitializer + ExtFinalizer + + + + + FRESteamWorks.framework + ExtInitializer + ExtFinalizer + + + + \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/FRESteamWorks.hx b/intra/source/com/amanitadesign/steam/FRESteamWorks.hx new file mode 100644 index 0000000..8dc8147 --- /dev/null +++ b/intra/source/com/amanitadesign/steam/FRESteamWorks.hx @@ -0,0 +1,335 @@ +/* + * FRESteamWorks.as + * This file is part of FRESteamWorks. + * + * Created by Ventero + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam { +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.IOErrorEvent; +import flash.events.ProgressEvent; +import flash.events.StatusEvent; +import flash.filesystem.File; +import flash.utils.ByteArray; +import flash.utils.IDataInput; +import flash.utils.IDataOutput; +import flash.utils.clearInterval; +import flash.utils.setInterval; +import helper.Achievements; + +class FRESteamWorks extends EventDispatcher { + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private static inline var PATH:String=".local/share/Steam/SteamApps/common/Anodyne/share/APIWrapper"; + + private var _file:File; + private var _process:NativeProcess; + private var _tm:Int; + private var _error:Bool=false; + + public var isReady:Bool=false; + + private static inline var AIRSteam_Init:Int=0; + private static inline var AIRSteam_RunCallbacks:Int=1; + private static inline var AIRSteam_RequestStats:Int=2; + private static inline var AIRSteam_SetAchievement:Int=3; + private static inline var AIRSteam_ClearAchievement:Int=4; + private static inline var AIRSteam_IsAchievement:Int=5; + private static inline var AIRSteam_GetStatInt:Int=6; + private static inline var AIRSteam_GetStatFloat:Int=7; + private static inline var AIRSteam_SetStatInt:Int=8; + private static inline var AIRSteam_SetStatFloat:Int=9; + private static inline var AIRSteam_StoreStats:Int=10; + private static inline var AIRSteam_ResetAllStats:Int=11; + private static inline var AIRSteam_GetFileCount:Int=12; + private static inline var AIRSteam_GetFileSize:Int=13; + private static inline var AIRSteam_FileExists:Int=14; + private static inline var AIRSteam_FileWrite:Int=15; + private static inline var AIRSteam_FileRead:Int=16; + private static inline var AIRSteam_FileDelete:Int=17; + private static inline var AIRSteam_IsCloudEnabledForApp:Int=18; + private static inline var AIRSteam_SetCloudEnabledForApp:Int=19; + private static inline var AIRSteam_GetUserID:Int=20; + private static inline var AIRSteam_GetPersonaName:Int=21; + private static inline var AIRSteam_UseCrashHandler:Int=22; + + public function new(target:IEventDispatcher=null){ + try { + _file=File.userDirectory.resolvePath(PATH); + Achievements.DEBUG_TEXT +="Found file at\n" + _file.nativePath +"\n"; + Achievements.DEBUG_TEXT +=_file.size.toString()+ " bytes\n"; + } catch(e:Dynamic){ + Achievements.DEBUG_TEXT +="COULDN'T FIND FILE"; + } + _process=new NativeProcess(); + _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, eventDispatched); + _process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, errorCallback); + super(target); + } + + public function dispose():Void { + if(_process.running){ + _process.closeInput(); + _process.exit(); + } + clearInterval(_tm); + isReady=false; + } + + private function startProcess():Void { + var startupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + startupInfo.executable=_file; + + _process.start(startupInfo); + } + + public function init():Bool { + trace("hi") + trace(Achievements.DEBUG_TEXT); + Achievements.DEBUG_TEXT +="Sanity check..."; + trace(Achievements.DEBUG_TEXT); + if(_file==null || !_file.exists)return false; + Achievements.DEBUG_TEXT +="got file\n"; + startProcess(); + if(!_process.running){ + Achievements.DEBUG_TEXT +="Process not running\n"; + return false; + } + + if(!callWrapper(AIRSteam_Init))return false; + isReady=readBoolResponse(); + if(isReady)_tm=setInterval(runCallbacks, 100); + Achievements.DEBUG_TEXT +="ready? " + isReady.toString()+ "\n"; + return isReady; + } + + private function errorCallback(e:IOErrorEvent):Void { + _error=true; + // the process doesn't accept our input anymore, so just stop it + clearInterval(_tm); + + if(_process.running){ + try { + _process.closeInput(); + } catch(e:Dynamic){ + // no-op + } + + _process.exit(); + } + } + + private function callWrapper(funcName:Int, params:Array=null):Bool { + _error=false; + + if(!_process.running){ + Achievements.DEBUG_TEXT +="wrapper call fail\n"; + + return false; + } + + var stdin:IDataOutput=_process.standardInput; + stdin.writeUTFBytes(funcName + "\n"); + + if(params){ + for(i in 0...params.lengthi){ + if(params[i] is ByteArray){ + var length:Int=params[i].length; + // length + 1 for the added newline + stdin.writeUTFBytes(String(length + 1)+ "\n"); + stdin.writeBytes(params[i]); + stdin.writeUTFBytes("\n"); + } else { + stdin.writeUTFBytes(String(params[i])+ "\n"); + } + } + } + + return !_error; + } + + private function waitForData(output:IDataInput):Int { + while(!output.bytesAvailable){ + // wait + if(!_process.running)return 0; + } + + return output.bytesAvailable; + } + + private function readBoolResponse():Bool { + if(!_process.running)return false; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(1); + Achievements.DEBUG_TEXT +="bool resp:" + response.toString()+ "\n"; + return(response=="t"); + } + + private function readIntResponse():Int { + if(!_process.running)return 0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail); + return parseInt(response, 10); + } + + private function readFloatResponse():Float { + if(!_process.running)return 0.0; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return parseFloat(response); + } + + private function readStringResponse():String { + if(!_process.running)return ""; + var stdout:IDataInput=_process.standardOutput; + var avail:Int=waitForData(stdout); + + var response:String=stdout.readUTFBytes(avail) + return response; + } + + private function eventDispatched(e:ProgressEvent):Void { + var stderr:IDataInput=_process.standardError; + var avail:Int=stderr.bytesAvailable; + var data:String=stderr.readUTFBytes(avail); + + var pattern:RegExp=/__event__<(\d+),(\d+)>/g; + var result:Dynamic; + while((result=pattern.exec(data))){ + var req_type:Int=new Std.int(result[1]); + var response:Int=new Std.int(result[2]); + var steamEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + dispatchEvent(steamEvent); + } + } + + public function requestStats():Bool { + if(!callWrapper(AIRSteam_RequestStats))return false; + return readBoolResponse(); + } + + public function runCallbacks():Bool { + if(!callWrapper(AIRSteam_RunCallbacks))return false; + return true; + } + + public function getUserID():String { + if(!callWrapper(AIRSteam_GetUserID))return ""; + return readStringResponse(); + } + + public function getPersonaName():String { + if(!callWrapper(AIRSteam_GetPersonaName))return ""; + return readStringResponse(); + } + + public function useCrashHandler(appID:Int, version:String, date:String, time:String):Bool { + if(!callWrapper(AIRSteam_UseCrashHandler, [appID, version, date, time]))return false; + return readBoolResponse(); + } + + public function setAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_SetAchievement, [id]))return false; + return readBoolResponse(); + } + + public function clearAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_ClearAchievement, [id]))return false; + return readBoolResponse(); + } + + public function isAchievement(id:String):Bool { + if(!callWrapper(AIRSteam_IsAchievement, [id]))return false; + return readBoolResponse(); + } + + public function getStatInt(id:String):Int { + if(!callWrapper(AIRSteam_GetStatInt, [id]))return 0; + return readIntResponse(); + } + + public function getStatFloat(id:String):Float { + if(!callWrapper(AIRSteam_GetStatFloat, [id]))return 0.0; + return readFloatResponse(); + } + + public function setStatInt(id:String, value:Int):Bool { + if(!callWrapper(AIRSteam_SetStatInt, [id, value]))return false; + return readBoolResponse(); + } + + public function setStatFloat(id:String, value:Float):Bool { + if(!callWrapper(AIRSteam_SetStatFloat, [id, value]))return false; + return readBoolResponse(); + } + + public function storeStats():Bool { + if(!callWrapper(AIRSteam_StoreStats))return false; + return readBoolResponse(); + } + + public function resetAllStats(bAchievementsToo:Bool):Bool { + if(!callWrapper(AIRSteam_ResetAllStats, [bAchievementsToo]))return false; + return readBoolResponse(); + } + + public function getFileCount():Int { + if(!callWrapper(AIRSteam_GetFileCount))return 0; + return readIntResponse(); + } + + public function getFileSize(fileName:String):Int { + if(!callWrapper(AIRSteam_GetFileSize, [fileName]))return 0; + return readIntResponse(); + } + + public function fileExists(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileExists, [fileName]))return false; + return readBoolResponse(); + } + + public function fileWrite(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileWrite, [fileName, data]))return false; + return readBoolResponse(); + } + + public function fileRead(fileName:String, data:ByteArray):Bool { + if(!callWrapper(AIRSteam_FileRead, [fileName]))return false; + + var success:Bool=readBoolResponse(); + if(success){ + var content:String=readStringResponse(); + data.writeUTFBytes(content); + data.position=0; + } + + return success; + } + + public function fileDelete(fileName:String):Bool { + if(!callWrapper(AIRSteam_FileDelete, [fileName]))return false; + return readBoolResponse(); + } + + public function isCloudEnabledForApp():Bool { + if(!callWrapper(AIRSteam_IsCloudEnabledForApp))return false; + return readBoolResponse(); + } + + public function setCloudEnabledForApp(enabled:Bool):Bool { + if(!callWrapper(AIRSteam_SetCloudEnabledForApp, [enabled]))return false; + return readBoolResponse(); + } +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/SteamConstants.hx b/intra/source/com/amanitadesign/steam/SteamConstants.hx new file mode 100644 index 0000000..f61bdea --- /dev/null +++ b/intra/source/com/amanitadesign/steam/SteamConstants.hx @@ -0,0 +1,21 @@ +/* + * SteamConstants.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=0; + public static inline var RESPONSE_FAILED:Int=1; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; + public static inline var RESPONSE_OnGameOverlayActivated:Int=3; +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/SteamEvent.hx b/intra/source/com/amanitadesign/steam/SteamEvent.hx new file mode 100644 index 0000000..279106f --- /dev/null +++ b/intra/source/com/amanitadesign/steam/SteamEvent.hx @@ -0,0 +1,55 @@ +/* + * SteamEvent.as + * This file is part of FRESteamWorks. + * + * Created by David ´Oldes´ Oliva on 3/29/12. + * Contributors:Ventero + * Copyright(c)2012 Amanita Design. All rights reserved. + * Copyright(c)2012-2013 Level Up Labs, LLC. All rights reserved. + */ + +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/old/FRESteamWorks.hx b/intra/source/com/amanitadesign/steam/old/FRESteamWorks.hx new file mode 100644 index 0000000..89d1dc8 --- /dev/null +++ b/intra/source/com/amanitadesign/steam/old/FRESteamWorks.hx @@ -0,0 +1,154 @@ +package com.amanitadesign.steam; + +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.events.IEventDispatcher; +import flash.events.StatusEvent; +import flash.external.ExtensionContext; +import flash.utils.ByteArray; +import flash.utils.clearInterval; +import flash.utils.setInterval; + +class FRESteamWorks extends EventDispatcher +{ + //[Event(name="steam_response", type="com.amanitadesign.steam.SteamEvent")] + + private var _ExtensionContext:ExtensionContext; + private var _tm:Int; + + public var isReady:Bool=false; + + public function new(target:IEventDispatcher=null) + { + _ExtensionContext=ExtensionContext.createExtensionContext("com.amanitadesign.steam.FRESteamWorks", null); + _ExtensionContext.addEventListener(StatusEvent.STATUS, handleStatusEvent); + super(target); + } + + private function handleStatusEvent(event:StatusEvent):Void{ + //_ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + var req_type:Int=new Std.int(event.code); + var response:Int=new Std.int(event.level); + var sEvent:SteamEvent=new SteamEvent(SteamEvent.STEAM_RESPONSE, req_type, response); + trace("handleStatusEvent:"+req_type+" "+response); + switch(req_type) + { + case SteamConstants.RESPONSE_OnUserStatsReceived: + trace("RESPONSE_OnUserStatsReceived"); + break; + case SteamConstants.RESPONSE_OnAchievementStored: + trace("RESPONSE_OnAchievementStored"); + break; + } + dispatchEvent(sEvent); + } + + public function dispose():Void + { + clearInterval(_tm); + _ExtensionContext.removeEventListener(StatusEvent.STATUS, handleStatusEvent); + _ExtensionContext.dispose(); + } + + public function init():Bool + { + isReady=_ExtensionContext.call("AIRSteam_Init")as Bool; + if(isReady) _tm=setInterval(runCallbacks, 100); + return isReady; + } + public function requestStats():Bool + { + return _ExtensionContext.call("AIRSteam_RequestStats")as Bool; + } + + public function runCallbacks():Bool + { + return _ExtensionContext.call("AIRSteam_RunCallbacks")as Bool; + } + + public function setAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_SetAchievement", id)as Bool; + } + + public function clearAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_ClearAchievement", id)as Bool; + } + + public function isAchievement(id:String):Bool + { + return _ExtensionContext.call("AIRSteam_IsAchievement", id)as Bool; + } + + public function getStatInt(id:String):Int + { + return _ExtensionContext.call("AIRSteam_GetStatInt", id)as Int; + } + + public function getStatFloat(id:String):Float + { + return _ExtensionContext.call("AIRSteam_GetStatFloat", id)as Float; + } + + public function setStatInt(id:String, value:Int):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatInt", id, value)as Bool; + } + + public function setStatFloat(id:String, value:Float):Bool + { + return _ExtensionContext.call("AIRSteam_SetStatFloat", id, value)as Bool; + } + + public function storeStats():Bool + { + return _ExtensionContext.call("AIRSteam_StoreStats")as Bool; + } + + public function resetAllStats(bAchievementsToo:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_ResetAllStats", bAchievementsToo)as Bool; + } + + + public function getFileCount():Int + { + return _ExtensionContext.call("AIRSteam_GetFileCount")as Int; + } + + public function getFileSize(fileName:String):Int + { + return _ExtensionContext.call("AIRSteam_GetFileSize", fileName)as Int; + } + + public function fileExists(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileExists", fileName)as Bool; + } + + public function fileWrite(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileWrite", fileName, data)as Bool; + } + + public function fileRead(fileName:String, data:ByteArray):Bool + { + return _ExtensionContext.call("AIRSteam_FileRead", fileName, data)as Bool; + } + + public function fileDelete(fileName:String):Bool + { + return _ExtensionContext.call("AIRSteam_FileDelete", fileName)as Bool; + } + + public function isCloudEnabledForApp():Bool + { + return _ExtensionContext.call("AIRSteam_IsCloudEnabledForApp")as Bool; + } + + public function setCloudEnabledForApp(enabled:Bool):Bool + { + return _ExtensionContext.call("AIRSteam_SetCloudEnabledForApp", enabled)as Bool; + } +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/old/SteamConstants.hx b/intra/source/com/amanitadesign/steam/old/SteamConstants.hx new file mode 100644 index 0000000..4e7c7cc --- /dev/null +++ b/intra/source/com/amanitadesign/steam/old/SteamConstants.hx @@ -0,0 +1,10 @@ +package com.amanitadesign.steam; + +class SteamConstants +{ + public static inline var RESPONSE_OK:Int=1; + public static inline var RESPONSE_FAILED:Int=2; + public static inline var RESPONSE_OnUserStatsReceived:Int=0; + public static inline var RESPONSE_OnUserStatsStored:Int=1; + public static inline var RESPONSE_OnAchievementStored:Int=2; +} \ No newline at end of file diff --git a/intra/source/com/amanitadesign/steam/old/SteamEvent.hx b/intra/source/com/amanitadesign/steam/old/SteamEvent.hx new file mode 100644 index 0000000..95c8e82 --- /dev/null +++ b/intra/source/com/amanitadesign/steam/old/SteamEvent.hx @@ -0,0 +1,45 @@ +package com.amanitadesign.steam; + +import flash.events.Event; + +class SteamEvent extends Event +{ + public static var STEAM_RESPONSE:String="steamResponse"; + + private var _req_type:Int=-1; + private var _response:Int=-1; + private var _data:Dynamic=null; + + public function new(type:String, req_type:Int, response:Int, bubbles:Bool=false, cancelable:Bool=false) + { + super(type, bubbles, cancelable); + _response=response; + _req_type=req_type; + } + public var response(get_response, set_response):Int; + private function get_response():Int + { + return _response; + } + public var data(get_data, set_data):Dynamic; + private function get_data():Dynamic + { + return _data; + } + private function set_data(value:Dynamic):Void + { + _data=value; + } + public var req_type(get_req_type, null):Int; + private function get_req_type():Int + { + return _req_type; + } + override public function clone():Event + { + var event:SteamEvent=new SteamEvent(type, req_type, response, bubbles, cancelable); + event.data=data; + + return event; + } +} \ No newline at end of file diff --git a/intra/source/csv/APARTMENT_BG.csv b/intra/source/csv/APARTMENT_BG.csv new file mode 100644 index 0000000..812310d --- /dev/null +++ b/intra/source/csv/APARTMENT_BG.csv @@ -0,0 +1,80 @@ +29,1,10,10,10,10,10,10,10,2,29,29,29,17,10,82,63,64,10,2,1,10,10,10,27,10,10,10,10,2,29,16,10,10,10,10,10,10,18,29,0,0,0,0,0,0,0,0,0,0,19,157,10,10,10,10,10,10,15,29,16,10,157,10,10,10,10,10,10,15,16,10,10,10,10,10,10,10,10,10,130,130,130,130,130,130,130,130,130,292 +1,158,150,150,150,150,150,150,150,15,29,1,158,27,151,92,73,74,151,14,17,150,150,150,28,161,163,150,150,15,29,16,150,150,150,150,150,150,18,29,0,0,0,0,0,0,0,0,0,0,19,152,86,152,152,152,152,152,15,29,16,150,150,150,150,150,150,150,150,15,16,150,150,150,150,150,150,150,150,150,235,153,153,153,153,153,153,153,272,292 +19,150,150,51,53,51,52,53,150,15,29,17,151,27,151,151,151,151,151,14,17,150,150,150,150,150,150,150,150,15,29,16,150,150,150,150,150,150,18,29,0,0,0,0,0,0,0,0,0,0,19,152,86,152,152,152,152,152,11,2,16,150,150,150,150,150,150,150,150,15,16,150,39,20,20,20,20,20,20,39,101,102,103,102,103,102,103,101,272,284 +19,163,34,150,150,150,150,150,150,15,1,12,151,28,151,151,151,151,151,15,16,150,150,150,161,162,163,150,150,15,29,16,150,150,7,5,150,150,18,29,0,0,0,0,0,0,0,0,0,0,19,152,152,152,152,152,152,152,70,15,16,146,146,146,146,146,154,162,162,15,16,150,27,150,150,150,150,150,172,27,101,102,103,102,103,102,103,101,272,285 +19,173,44,150,7,4,4,5,150,14,17,151,151,151,151,151,151,151,151,11,12,150,150,150,150,150,150,150,150,15,29,16,150,150,15,16,150,150,18,29,0,0,0,0,0,0,0,0,0,0,19,152,152,152,152,152,152,152,80,15,16,150,150,150,150,150,150,171,160,15,12,150,27,150,39,22,150,7,4,16,111,153,153,153,153,153,153,111,272,286 +19,173,44,150,11,10,10,12,150,15,16,95,95,85,85,85,95,95,151,151,150,150,150,150,150,150,150,150,150,15,29,16,150,150,15,16,150,150,18,29,0,0,0,0,0,0,0,0,0,0,19,152,152,152,152,152,152,152,90,15,16,150,150,150,150,150,150,150,150,15,150,150,27,150,27,150,150,11,10,12,111,153,153,153,153,153,153,111,272,286 +19,173,54,150,150,150,150,150,150,14,17,151,151,151,151,151,151,151,151,7,5,150,150,150,150,150,150,150,150,15,29,16,150,150,15,16,150,7,25,29,0,0,0,0,0,0,0,0,0,0,19,86,152,152,152,152,152,152,60,15,16,163,150,150,150,150,150,150,150,15,5,150,27,150,27,51,52,53,150,150,235,153,153,153,153,153,153,153,272,287 +19,173,51,52,53,51,52,53,150,15,16,85,85,95,95,95,85,85,151,15,16,150,150,150,150,150,150,150,150,15,29,16,150,150,15,16,150,11,158,2,0,0,0,0,0,0,0,0,0,0,19,86,152,152,152,152,152,152,152,15,16,160,146,146,146,146,146,146,154,15,16,150,27,150,27,150,150,150,150,7,5,153,107,108,108,108,108,108,108,288 +19,150,161,162,162,162,162,163,150,15,16,151,151,151,151,151,151,151,151,15,16,150,150,150,150,150,150,150,150,15,29,16,150,150,15,16,150,150,150,18,0,0,0,0,0,0,0,0,0,0,19,86,152,152,152,152,152,152,152,15,16,160,149,149,150,150,150,150,150,15,16,150,27,150,27,150,150,150,36,15,16,153,153,153,153,153,153,247,272,287 +3,4,4,4,4,4,4,4,4,25,26,4,4,4,4,4,4,4,4,25,26,4,5,150,7,4,4,4,4,25,29,26,5,150,15,26,4,4,4,25,0,0,0,0,0,0,0,0,0,0,26,4,4,5,152,7,4,4,4,25,26,4,4,5,150,7,4,4,4,25,16,150,15,4,4,5,150,7,4,25,26,4,5,236,7,4,4,4,5,281 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,12,150,11,10,10,10,10,2,1,10,12,150,11,10,10,10,10,2,0,0,0,0,0,0,0,0,0,0,19,10,10,12,150,27,10,10,10,15,16,10,10,12,150,11,10,10,10,15,16,150,27,10,10,12,150,11,10,2,1,10,27,150,11,10,10,10,10,18 +19,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,36,230,206,206,206,15,16,150,150,150,150,150,150,150,150,18,0,0,0,0,0,0,0,0,0,0,19,150,150,150,150,27,150,150,150,15,16,162,162,163,150,161,162,162,162,15,16,150,27,150,150,150,150,150,150,15,16,163,27,150,36,161,162,162,162,18 +19,150,150,21,20,20,20,20,20,7,4,4,5,20,20,20,20,20,20,7,5,41,42,42,42,42,43,224,231,15,16,150,51,52,53,150,7,5,150,18,0,0,0,0,0,0,0,0,0,0,19,150,36,36,150,27,150,39,150,15,16,160,160,173,150,171,160,160,160,15,16,150,27,150,150,150,150,150,150,11,12,173,28,150,150,181,150,171,160,18 +19,150,150,150,150,150,150,150,150,15,29,29,16,150,150,150,150,150,150,11,12,150,172,150,150,172,150,36,231,15,16,150,34,150,34,150,15,16,150,18,0,0,0,0,0,0,0,0,0,0,19,150,36,36,150,28,150,27,150,11,12,160,160,173,150,171,160,160,160,15,16,150,27,150,150,150,150,150,150,150,150,150,161,162,162,160,162,160,160,18 +19,150,150,150,150,150,150,150,150,11,10,10,12,150,150,150,150,150,150,150,150,150,181,150,150,181,150,36,231,15,16,150,44,150,44,150,11,27,150,18,0,0,0,0,0,0,0,0,0,0,19,150,150,150,150,150,150,27,150,150,150,150,150,150,150,150,150,150,150,15,16,150,27,150,150,150,150,150,150,7,5,150,171,160,160,173,150,171,160,18 +19,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,7,5,150,181,150,150,181,150,230,231,15,16,150,44,150,54,150,150,27,150,18,0,0,0,0,0,0,0,0,0,0,19,150,36,36,150,150,150,27,150,7,5,162,162,163,150,161,162,162,162,15,16,150,27,150,150,150,150,150,150,15,16,20,20,20,20,22,150,36,150,18 +19,150,150,150,150,150,150,150,150,7,5,150,150,150,150,150,41,42,43,11,12,41,42,42,42,42,43,234,231,15,16,150,54,150,34,150,7,16,150,18,0,0,0,0,0,0,0,0,0,0,19,150,36,150,150,150,150,27,150,15,16,160,160,173,150,171,160,160,160,15,16,150,27,150,150,150,150,150,150,15,16,162,162,162,162,162,162,163,150,18 +19,150,150,150,150,39,150,150,150,14,17,150,150,150,150,150,34,150,150,150,150,230,206,206,206,206,206,231,231,11,12,150,150,150,44,150,15,16,150,18,0,0,0,0,0,0,0,0,0,0,19,150,36,36,150,150,150,28,150,15,16,160,160,173,150,171,160,160,160,15,16,150,11,20,20,20,20,20,20,10,10,20,20,20,22,173,150,181,150,18 +19,150,150,150,7,25,5,150,150,15,16,150,150,150,150,150,44,150,150,7,5,240,241,7,4,4,5,241,241,242,150,150,150,150,54,150,15,16,150,18,0,0,0,0,0,0,0,0,0,0,19,150,150,150,150,150,150,150,150,15,16,160,160,173,150,171,160,160,160,15,16,150,150,150,150,150,150,150,150,150,150,150,150,150,36,150,150,150,150,18 +19,150,7,4,25,29,26,4,4,25,26,4,4,4,5,150,54,150,7,25,26,4,4,25,29,29,26,4,4,4,4,4,5,150,7,4,25,26,4,8,0,0,0,0,0,0,0,0,0,0,26,4,4,4,4,4,4,4,4,25,26,4,4,4,4,4,4,4,4,25,16,150,7,4,4,4,4,4,4,4,4,4,4,4,5,150,7,4,4,8 +19,151,11,10,2,29,29,29,29,29,1,10,10,10,12,197,86,152,11,2,1,10,10,10,10,10,10,10,10,2,1,10,12,150,11,10,10,10,10,2,280,280,284,290,287,292,281,257,275,18,1,10,10,10,10,10,10,10,10,2,1,10,27,10,10,10,10,10,10,2,29,29,29,29,29,29,29,29,29,29,1,10,10,10,12,150,11,10,10,2 +19,151,151,151,11,82,64,10,61,2,16,206,206,206,206,207,86,152,152,15,16,150,150,150,172,150,172,150,150,14,17,150,150,150,150,150,172,150,150,18,284,283,289,287,287,292,292,267,265,18,19,150,150,150,150,150,150,150,150,15,16,150,27,150,150,150,150,150,150,15,29,1,10,10,10,10,10,10,2,29,16,150,150,150,150,150,150,161,162,18 +19,151,151,151,151,92,74,151,71,15,16,216,216,216,216,217,96,152,70,15,16,162,7,4,4,4,4,5,150,15,16,150,150,150,36,150,181,150,150,18,280,286,281,281,288,285,283,277,265,18,19,150,150,150,150,150,150,150,150,15,16,150,27,150,150,150,150,150,150,11,10,12,150,150,150,150,150,150,11,2,16,150,150,150,150,150,150,150,171,18 +19,151,151,151,151,151,151,151,81,14,17,152,152,152,152,152,96,152,80,15,16,160,15,29,29,29,29,16,150,14,17,150,150,150,150,150,181,150,150,18,286,287,292,283,289,284,291,277,265,18,19,150,150,150,150,150,150,150,150,11,12,150,28,150,150,150,150,150,150,150,150,150,150,7,4,4,5,150,150,15,16,150,36,150,36,150,36,150,150,18 +19,151,151,151,151,151,151,151,91,15,16,152,152,152,152,152,86,152,90,15,16,160,15,29,29,29,29,16,162,15,16,150,150,150,36,150,181,150,150,18,285,288,280,281,287,284,286,277,265,18,19,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,45,7,5,150,150,15,29,29,16,150,150,15,16,150,150,150,150,150,172,150,150,18 +19,151,151,151,151,151,151,151,151,15,16,152,152,152,152,152,86,152,152,15,16,160,11,10,10,158,10,12,160,14,17,150,150,150,150,150,181,150,150,18,285,287,284,290,287,289,287,130,265,18,19,150,150,150,150,150,150,150,150,7,5,150,150,150,150,150,150,150,150,15,16,150,150,11,10,157,12,150,150,15,16,150,36,150,36,150,36,150,150,18 +19,151,151,151,151,39,151,151,85,14,17,152,152,152,152,152,96,152,152,15,16,150,150,150,150,150,150,150,150,15,16,150,150,150,36,150,181,150,150,18,280,292,284,286,287,286,286,271,153,18,19,150,150,150,150,150,150,150,150,15,16,150,150,150,150,150,150,150,150,15,16,150,150,150,150,150,150,150,150,15,16,150,150,150,172,150,150,150,150,18 +19,151,151,151,151,27,151,151,151,15,16,152,152,152,152,152,96,152,60,15,16,41,42,43,150,150,41,42,43,14,17,150,150,150,150,150,171,162,162,18,280,281,287,289,288,285,286,271,153,18,19,150,150,150,150,150,150,150,150,15,16,150,39,150,150,150,150,7,4,25,16,55,150,150,150,150,150,150,45,15,16,150,36,150,36,150,36,150,150,18 +19,151,151,151,151,27,151,151,151,15,16,152,152,152,152,152,152,152,152,15,16,150,150,150,150,150,150,150,150,15,16,150,150,150,36,150,150,181,150,18,292,292,287,280,292,280,292,271,153,18,19,150,150,150,150,150,150,150,150,11,16,150,27,150,150,150,150,15,29,29,26,5,55,150,150,150,150,45,7,25,16,150,172,150,150,150,172,150,150,18 +3,4,4,5,151,15,4,4,4,25,26,4,4,5,152,7,4,4,4,25,26,4,4,5,150,150,7,4,4,25,16,150,7,4,4,4,4,5,150,18,283,282,288,281,281,280,280,271,153,18,26,4,4,4,5,150,7,4,5,150,26,4,26,4,4,4,4,25,29,29,29,29,4,5,150,150,7,4,29,29,26,4,4,4,5,150,7,4,4,8 +1,10,10,12,150,11,2,29,29,29,1,10,10,12,150,11,10,10,10,2,29,29,29,16,150,150,14,29,29,29,16,150,11,10,10,10,10,12,150,18,282,283,288,292,292,283,283,271,153,18,1,10,2,29,16,150,11,10,2,4,1,10,10,10,10,10,10,10,10,2,1,10,10,12,150,150,11,10,10,2,1,10,10,10,12,151,11,10,10,2 +19,150,150,150,150,150,14,29,29,29,17,150,150,150,150,230,77,206,206,14,1,10,10,12,150,150,11,10,10,2,17,150,34,150,150,150,150,150,150,18,281,286,287,284,291,286,284,271,153,18,19,150,11,10,12,150,150,150,15,29,16,163,150,161,162,163,191,190,190,15,16,150,150,36,150,36,150,150,150,15,16,151,151,151,151,151,151,151,151,18 +19,150,150,150,150,150,14,29,29,29,17,150,150,150,150,230,77,231,231,15,16,36,150,150,150,150,150,150,150,15,16,150,54,150,150,150,150,150,150,18,286,291,288,283,286,285,286,271,153,18,19,150,150,150,36,150,34,150,15,29,16,173,190,190,150,190,150,190,190,15,16,221,221,221,221,221,222,150,150,15,16,151,151,151,151,151,151,151,151,18 +19,150,150,150,150,150,15,29,29,29,16,150,150,150,220,234,231,231,77,11,12,150,150,150,150,150,150,150,150,11,12,150,150,150,150,150,150,150,150,18,283,287,288,288,288,287,287,271,153,18,19,20,22,150,150,150,54,150,15,29,16,150,190,190,190,190,190,191,191,11,12,77,77,77,77,77,232,150,150,11,10,20,20,20,22,151,151,151,151,18 +19,146,146,146,146,146,11,10,10,10,12,150,150,220,234,231,231,231,223,242,150,150,150,150,150,150,150,34,150,150,150,150,150,150,150,150,150,150,150,18,291,292,287,292,288,280,290,271,153,18,19,51,52,52,53,150,150,150,15,29,16,163,190,190,190,191,190,150,150,150,230,231,231,231,231,77,232,150,150,150,151,151,151,151,85,151,151,151,151,18 +19,150,150,150,150,51,52,53,150,150,150,150,220,234,231,231,223,241,242,7,5,150,150,36,150,150,150,54,150,7,5,150,34,150,150,150,150,150,150,18,286,284,287,290,281,286,284,271,153,18,19,150,150,150,150,150,150,150,15,29,16,150,190,191,190,150,190,190,190,7,5,77,77,77,231,77,232,150,150,150,151,151,151,151,151,151,151,151,151,18 +19,150,150,150,150,150,150,55,150,150,150,150,230,231,231,223,242,150,150,14,17,150,150,150,150,150,150,7,4,25,16,150,44,150,150,150,150,150,150,18,285,287,289,286,286,285,281,271,153,18,19,51,52,52,52,53,150,34,15,29,16,150,190,150,190,190,191,190,190,15,16,224,231,231,231,77,232,150,150,7,5,20,20,20,22,151,151,151,151,18 +19,150,150,150,150,150,150,150,150,7,5,150,230,231,223,242,150,150,150,14,17,150,150,150,150,150,150,14,29,29,17,150,44,150,150,150,36,150,36,18,287,288,289,285,286,285,290,271,153,11,12,150,150,150,150,150,150,54,15,29,16,163,191,191,191,191,150,191,191,15,16,230,77,77,77,77,232,150,150,15,16,151,151,151,151,151,151,151,151,18 +19,150,150,150,150,150,150,150,150,14,17,150,240,241,242,150,150,150,150,14,17,150,150,150,150,150,7,25,29,29,16,150,54,150,150,150,36,150,36,18,288,283,283,287,289,287,288,100,153,237,150,150,150,150,150,150,150,150,15,29,16,160,162,163,150,161,162,162,162,15,16,240,241,241,241,241,242,150,150,15,16,151,151,151,151,151,151,151,151,18 +3,4,4,4,4,4,4,4,4,25,26,4,4,4,5,150,7,4,4,25,26,4,4,5,150,150,14,29,29,29,26,4,4,4,4,4,5,150,7,8,287,280,281,288,281,283,281,276,100,100,4,4,4,4,4,4,4,4,25,29,26,4,4,5,150,7,4,4,4,25,26,4,4,4,4,4,4,4,4,25,26,4,4,4,4,4,4,4,4,8 +0,0,0,0,0,0,0,0,0,0,29,29,1,10,12,150,11,2,29,29,29,29,29,17,150,150,14,29,29,130,130,130,130,130,130,130,130,228,130,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,130,130,130,228,130,130,130,130,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,55,182,150,150,14,29,29,29,29,29,17,150,150,14,29,17,107,109,153,153,153,153,153,153,238,272,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,101,238,101,168,168,168,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,182,150,150,150,14,29,29,130,130,130,130,228,228,130,130,130,117,119,153,153,153,153,153,153,153,272,292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,150,150,14,29,29,109,153,153,153,226,227,153,167,168,117,119,153,153,153,153,153,153,153,272,292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,168,168,153,168,168,168,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,150,150,14,29,29,106,178,101,153,153,153,167,160,160,117,119,153,153,153,153,153,153,153,272,290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,101,153,101,153,153,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,150,150,14,29,29,116,187,101,153,153,153,177,160,160,117,119,153,153,153,153,153,153,153,272,290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,168,107,108,109,168,168,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,150,150,14,29,29,116,102,103,111,153,153,177,160,160,117,119,153,153,153,153,153,153,153,272,285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,150,182,14,29,29,126,111,153,153,153,153,153,153,153,117,119,153,153,153,153,153,153,153,167,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,168,168,168,168,168,168,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,150,182,55,14,29,29,136,153,153,153,153,153,153,153,111,117,119,153,153,153,153,153,153,167,160,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,29,29,17,150,7,4,4,25,29,29,108,108,108,108,109,153,107,108,108,117,119,109,153,105,105,105,107,108,108,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,100,255,100,100,100,100,100,100,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,277,130,130,228,130,130,130,130,275,101,108,108,108,108,109,153,107,108,108,108,108,109,153,134,135,136,107,108,108,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,110,265,110,110,110,110,110,110,110,0,0,0,0,0,0,0,0,0,0,110,110,265,110,110,110,110,110,110,110 +0,0,0,0,0,0,0,0,0,0,277,153,153,238,153,153,153,153,153,102,103,153,153,153,153,153,153,153,153,102,103,153,153,153,153,153,153,153,272,282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,110,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,153,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,100,100,100,100,100,100,100,100,100,100,153,153,101,153,104,229,106,100,100,100,153,153,153,101,153,153,153,272,292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,100,100,100,100,100,100,100,255,110,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,101,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,110,257,258,110,110,257,258,110,110,110,168,169,107,109,114,239,116,110,110,110,153,153,153,101,153,153,153,272,284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,269,110,110,110,110,110,110,110,265,266,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,153,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,266,267,268,269,266,267,268,269,110,110,160,179,153,153,124,239,126,257,258,110,153,153,153,104,106,153,153,272,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,279,110,120,120,110,110,120,120,265,276,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,153,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,276,278,278,279,276,278,278,279,269,110,160,179,153,153,134,147,136,267,268,269,168,168,168,114,116,153,153,272,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,277,110,257,258,110,110,257,258,265,277,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,153,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,277,277,277,277,277,277,277,277,279,269,160,179,153,153,153,153,153,277,277,279,153,153,153,114,116,168,168,168,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,277,266,267,268,269,266,267,268,265,277,0,0,0,0,0,0,0,0,0,0,110,110,153,153,153,153,153,153,110,110 +0,0,0,0,0,0,0,0,0,0,277,277,277,277,277,277,277,277,277,277,279,160,179,153,153,153,153,153,277,277,277,153,153,153,124,126,153,153,272,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,277,276,278,278,279,276,278,278,265,277,0,0,0,0,0,0,0,0,0,0,110,110,100,100,100,100,100,100,110,110 +0,0,0,0,0,0,0,0,0,0,277,277,278,278,277,277,278,278,277,277,277,100,100,100,153,153,100,100,277,278,278,153,153,153,134,136,153,153,272,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,277,277,277,277,277,277,277,277,265,277,0,0,0,0,0,0,0,0,0,0,110,110,110,110,110,110,110,110,110,110 +0,0,0,0,0,0,0,0,0,0,277,277,277,277,277,277,277,277,277,277,277,110,257,258,154,154,257,258,277,277,277,100,100,100,100,100,100,100,100,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,277,277,277,277,277,277,277,277,259,277,0,0,0,0,0,0,0,0,0,0,110,110,120,120,110,110,120,120,110,110 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,290,283,287,292,280,282,287,292,292,282,290,283,287,292,280,282,287,292,292,282 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,107,109,167,168,168,168,168,169,101,153,101,285,291,287,286,290,290,287,283,284,281,285,291,287,286,290,290,287,283,284,281 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,169,153,153,153,153,153,153,153,117,119,153,153,153,153,153,153,111,153,111,289,289,289,291,291,284,289,291,290,292,289,289,289,291,291,284,289,291,290,292 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,167,168,169,107,109,153,153,153,153,153,153,153,153,107,109,178,153,153,153,153,153,153,286,107,109,153,153,153,153,153,153,288,286,286 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,178,117,119,178,153,153,153,153,153,153,288,117,119,153,153,153,153,153,153,288,289,289 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,104,106,153,153,153,153,153,153,153,187,117,119,178,153,153,153,153,153,153,288,117,119,153,153,153,153,153,153,288,289,289 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,169,153,153,153,153,153,114,116,153,153,153,153,153,153,153,187,117,119,187,153,153,153,153,153,153,288,117,119,153,153,153,153,153,153,288,289,289 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,153,153,153,153,153,153,153,153,114,116,153,153,153,153,153,153,153,187,117,119,178,153,153,153,153,153,153,289,117,119,153,153,153,153,153,153,288,289,289 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,168,168,169,153,153,153,167,169,124,126,167,168,168,168,168,168,168,179,117,119,177,169,153,167,169,153,178,288,117,119,153,153,153,111,153,153,289,288,288 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,101,107,109,153,107,108,108,108,134,136,108,108,108,108,108,108,108,108,117,119,108,109,153,107,109,153,107,287,117,119,153,101,111,101,111,101,288,288,288 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,284,282,292,282,288,292,280,287,289,107,109,101,102,103,153,107,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,153,108,108,153,108,108,108,109,290,285,291,281,282,288,283,292,292 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,289,286,290,292,287,290,290,289,271,117,119,153,153,153,153,153,153,153,153,111,111,153,153,153,153,153,153,153,153,153,153,153,153,153,117,119,153,107,108,108,109,291,291,289,284,286,288,286,283,284 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288,286,290,286,287,287,289,287,271,117,119,153,153,153,153,153,153,153,153,107,109,153,153,153,153,153,153,153,107,108,108,109,153,107,117,119,153,153,153,153,153,153,288,289,287,289,288,287,284,283 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,287,284,283,292,289,285,281,292,271,117,119,153,153,153,153,153,153,153,153,117,119,153,153,153,153,153,153,153,153,100,100,100,153,117,100,100,100,104,229,106,109,153,153,188,153,153,153,289,285,286 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,281,282,292,285,289,290,290,286,271,117,119,153,153,167,168,168,169,153,153,107,109,153,153,153,167,168,168,168,169,110,110,110,153,117,110,110,110,114,239,116,119,153,153,153,153,153,153,289,286,286 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,289,291,291,287,288,288,288,271,117,119,153,153,177,160,160,179,153,153,153,153,153,167,168,179,153,153,153,179,120,110,120,153,117,120,110,120,114,239,116,119,153,153,153,153,153,153,288,289,287 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,284,288,290,290,292,281,287,287,271,117,119,153,153,153,153,153,153,153,153,100,100,153,177,160,179,153,153,153,179,110,257,258,153,117,100,100,100,124,239,126,119,153,153,153,153,153,153,289,287,282 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,286,283,287,288,292,282,292,288,271,107,109,153,153,153,153,153,153,153,153,257,258,153,177,160,179,153,153,153,153,266,267,268,153,107,108,108,108,134,147,136,119,153,153,101,153,153,188,289,292,281 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,286,286,287,288,286,284,290,287,271,153,153,153,153,153,153,153,153,153,153,267,268,153,153,153,153,178,153,153,153,276,277,277,153,153,153,153,153,153,153,107,109,101,101,153,101,153,188,289,284,283 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,281,281,288,285,285,286,288,100,100,100,100,100,100,100,100,100,100,100,277,277,100,100,100,100,100,100,100,100,278,277,278,100,100,100,100,100,100,100,100,100,100,100,255,100,100,100,287,290,286 diff --git a/intra/source/csv/APARTMENT_BG2.csv b/intra/source/csv/APARTMENT_BG2.csv new file mode 100644 index 0000000..1159c4f --- /dev/null +++ b/intra/source/csv/APARTMENT_BG2.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,252,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,251,0,0,0,0,0,0,0,250,0,251,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,260,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,253,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,252,0,0,0,253,252,0,0,253,0,261,0,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,262,0,0,0,263,262,0,0,263,0,252,0,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250,0,251,0,0,250,0,251,0,0,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,261,0,0,260,0,261,0,0,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,261,0,0,260,0,261,0,0,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,250,251,0,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,260,261,0,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,189,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0,0,0,260,261,0,0,0,0,0,0,0,0,260,0,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,260,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,0,0,253,252,0,0,0,0,0,0,0,0,253,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/APARTMENT_FG.csv b/intra/source/csv/APARTMENT_FG.csv new file mode 100644 index 0000000..c615cd6 --- /dev/null +++ b/intra/source/csv/APARTMENT_FG.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BEACH_BG.csv b/intra/source/csv/BEACH_BG.csv new file mode 100644 index 0000000..2dc8268 --- /dev/null +++ b/intra/source/csv/BEACH_BG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,200,200,200,200,200,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,113,113,113,113,110,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,200,200,200,200,105,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +200,200,200,200,200,200,200,200,200,200,0,0,0,0,0,0,0,0,0,0,115,200,200,200,102,100,200,200,200,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +200,200,200,1,2,1,2,1,2,200,0,0,0,0,0,0,0,0,0,0,115,200,200,200,115,200,200,200,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +200,1,2,3,4,3,4,3,4,200,135,85,92,93,93,93,93,93,93,93,94,12,12,12,85,230,230,230,95,85,230,75,3,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,4,42,43,43,40,40,40,40,40,40,40,40,40,40,40,45,65,82,83,83,83,83,83,84,12,12,12,230,230,230,230,230,230,75,3,5,6,5,6,4,200,200,200,200,200,200,200,0,0,0,0,0,0,0,0,0,0 +1,6,4,200,46,47,48,200,200,200,135,85,230,230,230,230,230,230,230,230,230,230,230,230,92,93,93,93,94,85,230,75,1,6,5,6,5,6,5,6,5,6,5,6,4,3,5,6,4,3,4,3,4,200,200,200,200,42,43,43,43,43,40,40,40,40,40,40,44,65,85,12,230,230,230,230,81,83,83,83,83,83,83,83,84,71,74,1,6,5,6,5,2,200,200,200,200,200,200,200,0,0,0,0,0,0,0,0,0,0 +3,4,200,46,40,40,44,200,200,11,135,85,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,85,230,75,3,5,6,5,6,5,6,5,6,5,6,4,200,200,3,4,11,200,200,200,200,200,200,200,200,200,200,200,200,200,41,40,40,40,40,45,62,60,92,90,230,230,230,230,230,230,230,230,230,230,230,230,95,75,1,6,5,6,5,6,5,2,1,2,1,2,1,2,0,0,0,0,0,0,0,0,0,0 +48,200,200,42,43,44,131,137,137,137,138,96,97,97,97,236,237,97,90,230,230,230,230,122,123,124,230,230,230,85,230,75,1,6,5,6,5,6,4,3,4,3,4,200,200,200,200,200,200,200,200,200,200,200,1,2,1,2,46,47,48,200,42,40,40,43,43,44,65,230,230,92,93,233,93,93,93,93,93,93,93,93,233,93,94,75,3,5,6,5,6,5,6,5,6,5,6,5,6,5,0,0,0,0,0,0,0,0,0,0 +45,200,200,200,200,200,139,202,202,202,202,202,202,202,13,202,202,13,89,230,230,230,122,120,200,135,230,230,82,80,230,75,3,5,6,4,3,4,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,3,5,6,5,2,40,45,200,200,42,44,200,200,200,65,230,230,12,12,230,230,230,230,71,73,73,73,73,232,73,73,74,200,3,4,3,4,3,4,3,4,3,4,3,4,3,0,0,0,0,0,0,0,0,0,0 +45,200,200,200,131,137,138,202,202,202,202,202,202,202,202,202,202,202,89,230,230,230,125,11,200,135,230,230,85,230,230,61,64,3,4,11,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,1,2,1,6,4,3,4,42,44,200,200,200,200,200,200,200,72,73,73,73,73,73,73,232,73,74,1,2,1,2,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,219,0,0,0,0,0,0,0,0,0,0 +45,200,200,131,138,202,202,202,202,202,202,202,202,202,202,202,202,202,89,230,230,230,132,133,133,134,230,82,80,230,230,230,61,63,64,200,200,200,200,200,200,200,200,200,200,200,200,200,200,1,2,1,6,5,6,5,2,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,1,6,5,6,5,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,0,0,0,0,0,0,0,0,0,0 +44,200,200,139,202,202,86,87,87,87,87,87,87,87,87,87,87,87,80,230,230,230,230,230,230,230,230,85,230,122,123,123,124,230,75,200,200,200,200,62,63,64,200,200,200,200,200,200,200,3,5,6,5,6,5,6,4,200,200,200,200,200,200,111,137,233,137,130,200,200,200,200,200,200,200,200,200,3,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0 +200,200,131,138,202,202,89,230,122,123,123,123,123,123,123,123,123,123,123,123,123,124,230,230,230,230,82,80,230,125,200,11,135,230,75,11,200,200,11,65,230,75,200,131,137,137,137,137,130,1,6,5,6,5,6,4,200,200,200,1,2,111,137,138,202,202,202,136,130,1,2,1,2,1,2,1,2,1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,4,3,4,3,4,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,202,89,230,125,46,48,200,200,200,200,200,200,200,1,2,200,135,230,230,230,230,85,230,230,125,11,200,135,230,61,63,64,200,62,60,230,75,200,99,21,22,202,202,129,3,5,6,5,6,5,2,200,200,1,6,4,139,202,202,202,202,202,202,129,3,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,2,200,200,200,200,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,202,89,230,125,41,45,111,113,113,113,113,110,1,6,5,2,115,200,200,200,200,65,230,230,132,133,133,134,230,230,230,95,230,85,230,230,95,230,99,23,24,202,202,129,200,3,4,3,4,3,4,200,200,3,4,200,139,202,202,202,202,202,202,129,200,3,4,3,4,3,5,6,5,6,4,3,5,6,5,6,5,6,5,6,5,6,5,6,4,3,4,200,200,200,200,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,202,89,230,125,42,44,115,200,200,200,11,105,3,5,6,4,115,200,200,200,200,65,230,230,230,230,230,230,230,230,230,95,230,85,230,230,95,230,99,21,22,202,202,136,137,137,137,137,137,137,137,137,233,137,137,137,138,202,202,202,242,243,202,136,137,137,137,137,137,130,3,4,3,4,200,200,3,4,3,4,3,4,3,5,6,4,3,4,200,131,137,137,137,137,137,0,0,0,0,0,0,0,0,0,0 +11,200,139,202,202,202,89,230,125,200,11,115,11,200,200,200,105,200,3,4,200,115,220,221,223,200,65,230,230,230,230,230,91,93,90,230,95,230,85,230,230,95,230,99,23,24,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,136,137,137,137,130,200,200,200,200,131,137,137,130,200,3,4,200,131,137,137,138,202,202,202,202,209,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,86,80,230,125,200,200,115,200,200,200,200,112,113,113,113,113,114,200,200,200,200,65,230,230,230,230,230,95,230,92,93,94,230,85,230,230,95,230,81,88,202,202,202,202,202,202,202,202,13,202,13,202,13,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,136,137,137,137,137,138,21,22,136,130,1,2,200,139,202,243,202,202,202,202,202,209,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,89,230,230,125,11,200,115,212,214,200,11,1,2,200,200,200,200,200,200,200,200,65,230,230,230,230,230,95,230,230,230,230,230,85,230,230,95,230,230,99,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,21,22,202,202,202,202,202,202,202,202,21,26,25,22,129,3,4,131,138,202,202,202,202,202,202,202,209,0,0,0,0,0,0,0,0,0,0 +48,200,139,202,202,89,230,230,125,1,2,115,216,218,200,1,6,4,200,62,63,63,63,63,63,63,60,230,230,230,230,230,95,230,82,83,83,83,80,230,230,95,91,97,98,202,202,202,202,202,202,202,202,13,202,13,202,13,202,202,202,202,202,202,202,202,202,202,202,202,202,202,21,26,24,202,202,202,202,202,202,202,202,23,24,23,24,129,200,200,139,202,202,202,253,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0 +40,48,139,202,202,89,230,230,125,3,4,101,103,104,200,3,5,2,224,65,230,230,230,230,230,230,230,230,230,230,230,230,95,230,85,230,230,230,230,91,93,94,99,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,242,243,202,202,202,202,202,202,202,202,202,23,24,202,244,245,244,202,202,202,202,245,244,245,202,202,129,200,200,139,202,253,255,254,202,202,202,202,209,0,0,0,0,0,0,0,0,0,0 +40,45,139,202,202,89,230,230,125,46,47,47,48,115,200,200,3,4,225,72,73,93,93,90,230,230,230,230,230,230,230,230,95,230,85,230,230,230,230,95,91,97,98,202,86,87,88,202,202,202,202,202,13,202,202,13,202,13,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,86,87,87,87,87,88,202,247,202,126,120,200,200,139,202,256,202,202,86,87,88,21,22,0,0,0,0,0,0,0,0,0,0 +40,45,139,202,202,136,93,90,125,41,40,40,45,115,200,200,200,200,227,200,200,230,230,85,230,230,230,230,230,230,230,230,95,230,92,90,230,230,91,94,99,202,202,202,89,230,81,88,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,242,243,202,202,204,206,208,244,202,202,202,89,230,82,83,84,99,202,246,202,129,200,200,200,139,202,256,86,87,80,230,99,23,24,0,0,0,0,0,0,0,0,0,0 +43,44,139,202,202,202,202,89,125,41,40,40,45,101,103,103,103,103,103,103,103,124,230,85,230,230,230,230,230,230,230,230,95,230,230,85,230,230,95,230,81,87,88,202,89,230,230,99,206,208,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,205,203,207,208,202,202,202,89,230,85,230,95,99,202,202,202,129,200,200,200,139,202,256,89,230,230,230,81,87,87,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,202,202,89,125,42,43,43,44,200,200,200,200,200,200,200,200,135,230,132,93,93,93,93,93,93,93,93,94,230,230,92,93,93,94,230,230,230,99,202,96,90,230,99,203,207,208,202,204,206,206,208,202,202,202,204,206,208,202,202,202,202,202,202,202,204,203,203,203,207,206,206,206,96,90,85,91,94,99,206,208,202,136,137,137,137,138,202,256,89,230,230,230,230,82,83,0,0,0,0,0,0,0,0,0,0 +200,11,139,202,202,202,202,89,132,133,133,133,133,133,133,133,133,133,133,133,133,134,230,230,230,230,230,230,230,230,230,230,230,230,91,97,97,97,97,90,230,230,99,202,202,89,230,99,203,203,207,206,205,203,203,207,206,208,204,205,203,207,206,206,208,202,202,202,204,205,203,203,203,203,203,203,203,203,89,85,95,91,98,203,207,206,208,202,242,243,202,204,256,96,97,97,90,230,85,230,0,0,0,0,0,0,0,0,0,0 +200,200,139,202,202,202,202,136,90,230,82,83,83,84,230,230,230,230,230,230,230,12,91,97,97,97,233,97,90,82,83,84,91,233,98,202,202,204,205,89,230,230,99,206,206,89,230,99,251,252,203,203,203,250,251,252,203,207,205,203,203,203,203,203,207,206,206,206,205,203,250,251,241,251,251,251,252,203,89,85,95,99,203,203,203,203,207,206,206,206,206,205,256,203,203,203,89,82,80,230,0,0,0,0,0,0,0,0,0,0 +131,133,138,202,202,202,202,202,89,230,85,230,12,95,82,83,84,230,230,230,230,91,98,202,202,202,202,202,89,85,12,95,99,202,204,206,206,205,250,89,230,230,99,241,251,89,230,119,261,262,251,251,241,260,261,262,252,241,250,251,251,251,252,203,203,203,203,203,250,251,260,261,241,261,261,261,262,251,89,92,94,99,251,251,252,203,203,203,203,203,203,250,256,252,203,203,89,85,230,230,0,0,0,0,0,0,0,0,0,0 +99,13,202,202,202,202,202,86,80,230,85,230,230,95,85,230,95,230,230,230,230,99,206,206,206,206,241,206,89,85,91,94,99,206,205,241,250,251,260,116,117,117,118,241,261,109,230,119,140,272,261,261,241,270,140,272,262,241,260,261,261,261,262,251,252,203,203,250,260,261,270,140,241,140,140,140,272,261,109,230,230,119,261,261,262,251,251,251,251,251,251,260,257,262,251,251,89,92,90,230,0,0,0,0,0,0,0,0,0,0 +99,202,202,202,13,86,87,80,230,230,92,93,93,94,85,230,95,230,230,230,230,99,251,251,251,251,241,251,89,92,94,230,99,251,251,241,260,261,270,140,140,140,140,241,140,116,117,118,140,140,140,140,241,140,140,140,272,241,270,140,140,140,272,261,262,251,251,260,270,140,140,142,241,240,240,240,144,140,116,117,117,118,140,140,272,261,261,261,261,261,261,270,140,272,261,261,109,230,85,230,0,0,0,0,0,0,0,0,0,0 +99,202,202,202,86,80,230,230,12,230,230,230,230,12,85,230,95,230,230,230,230,119,261,261,261,261,241,261,116,117,117,117,118,261,261,241,270,142,241,240,240,241,143,241,143,144,140,142,143,143,144,140,241,240,240,240,240,241,140,142,143,144,140,140,272,261,261,270,140,140,143,141,150,151,151,241,145,143,144,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,116,90,92,93,0,0,0,0,0,0,0,0,0,0 +99,202,202,86,80,230,230,230,230,230,230,230,230,230,85,230,95,230,230,230,230,119,140,140,140,140,241,140,140,140,140,140,140,140,142,241,240,240,241,151,151,241,240,241,240,240,143,141,146,146,145,143,241,151,151,151,151,241,143,141,146,145,143,143,144,140,140,140,142,143,146,146,146,146,146,150,146,146,145,143,143,143,143,144,140,140,140,140,142,143,143,143,143,144,140,140,140,109,230,230,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,82,83,84,230,230,230,230,230,230,230,92,93,94,230,230,230,230,119,140,140,140,140,241,140,140,140,140,142,143,143,141,150,151,151,150,146,146,150,151,150,151,151,146,146,146,146,146,146,150,146,146,146,146,150,146,146,146,146,146,146,145,143,143,143,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,145,143,143,143,143,141,146,146,146,146,145,143,144,140,116,117,117,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,85,230,95,230,230,230,230,230,230,230,230,230,230,230,230,230,230,119,140,140,140,140,241,142,143,143,143,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,145,144,140,140,140,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,85,230,95,230,230,230,230,91,97,97,97,97,97,97,97,90,230,119,140,142,143,143,241,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,85,230,95,91,97,97,97,98,202,204,206,205,203,250,260,116,117,118,142,141,146,146,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,85,12,95,99,202,202,202,204,206,205,203,250,251,260,270,140,142,143,141,146,146,146,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,92,93,94,99,13,202,204,205,203,203,250,260,261,241,140,142,141,146,241,240,240,240,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,230,230,91,98,202,204,205,203,250,251,260,270,140,241,142,141,146,146,241,151,151,151,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,230,91,98,202,204,205,203,250,260,261,270,140,142,241,141,146,146,146,241,146,146,146,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,230,99,202,204,205,203,250,260,270,140,142,143,141,241,240,240,240,240,241,240,240,240,241,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,230,99,204,205,250,251,260,270,140,142,141,146,146,151,151,151,151,151,150,151,151,151,150,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,202,202,89,230,99,241,250,260,261,270,142,143,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,206,206,89,230,99,241,260,270,140,142,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +99,251,251,116,117,118,241,270,140,142,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +119,261,241,140,142,143,241,140,142,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +118,140,241,142,141,146,241,143,141,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +143,143,240,240,240,240,240,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,151,151,151,151,151,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 +146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BEACH_BG2.csv b/intra/source/csv/BEACH_BG2.csv new file mode 100644 index 0000000..0f59f42 --- /dev/null +++ b/intra/source/csv/BEACH_BG2.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BEACH_FG.csv b/intra/source/csv/BEACH_FG.csv new file mode 100644 index 0000000..0f59f42 --- /dev/null +++ b/intra/source/csv/BEACH_FG.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BEDROOM_BG.csv b/intra/source/csv/BEDROOM_BG.csv new file mode 100644 index 0000000..72f0c77 --- /dev/null +++ b/intra/source/csv/BEDROOM_BG.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,2,3,1,1,2,3,1,1,2,9,9,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2 +0,0,0,0,0,0,0,0,0,0,3,24,19,24,24,24,24,24,24,2,3,21,24,19,24,24,19,24,21,2,3,24,24,19,19,19,24,24,24,2,3,24,24,2,3,24,24,2,9,9,3,24,24,24,37,37,24,24,24,24,24,24,24,24,24,24,24,24,21,2 +0,0,0,0,0,0,0,0,0,0,3,24,19,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2,3,24,24,21,36,21,24,24,24,2,3,24,24,2,3,24,24,2,9,9,3,24,24,24,19,19,24,36,36,24,36,24,36,24,24,36,36,24,24,2 +0,0,0,0,0,0,0,0,0,0,3,36,19,24,24,24,24,24,24,2,3,21,24,24,36,24,24,24,20,2,3,24,24,24,24,24,24,24,24,1,1,24,24,1,1,24,24,1,1,1,1,24,24,24,37,19,24,24,24,24,24,19,19,19,24,24,19,24,19,2 +0,0,0,0,0,0,0,0,0,0,3,24,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,36,24,1,1,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,36,24,24,24,24,24,24,37,19,37,37,19,37,37,37,19,36,19,19,24,24,24,2 +0,0,0,0,0,0,0,0,0,0,3,36,24,24,24,36,24,24,24,2,3,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,14,4,4,4,4,15,24,14,4,4,4,15,24,24,24,19,36,19,19,29,19,37,37,24,19,21,21,19,19,24,2 +0,0,0,0,0,0,0,0,0,0,3,24,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,14,15,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,24,24,24,24,24,24,24,24,19,21,24,24,21,19,24,2 +0,0,0,0,0,0,0,0,0,0,3,24,24,24,24,24,24,24,24,2,3,24,36,24,24,24,24,24,24,2,3,24,24,24,36,36,24,24,24,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,24,24,24,24,24,24,24,24,19,24,24,24,24,19,24,2 +0,0,0,0,0,0,0,0,0,0,3,24,24,24,24,24,24,24,24,2,3,24,36,24,24,24,24,24,24,2,3,24,24,36,36,36,36,24,24,2,9,9,9,9,3,36,2,9,9,9,3,24,24,24,24,36,36,24,24,24,36,24,19,24,24,20,24,19,36,2 +0,0,0,0,0,0,0,0,0,0,9,4,4,15,24,14,4,4,4,9,9,4,4,4,15,24,14,4,4,9,9,4,4,4,4,4,4,4,4,9,9,9,9,9,3,24,2,9,9,9,3,24,24,36,36,24,24,36,36,14,15,24,36,19,19,19,19,24,36,2 +3,1,1,1,1,1,1,1,1,2,3,1,1,1,24,1,1,1,1,2,3,1,1,1,1,24,1,1,1,2,3,1,1,1,1,1,1,1,1,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,24,24,24,24,24,2,3,24,24,19,19,19,19,24,24,2 +3,24,19,24,24,24,24,24,24,2,3,24,24,24,24,19,24,24,24,2,3,24,24,24,21,24,21,24,24,1,1,24,24,24,24,24,21,21,24,2,9,9,9,9,3,24,2,9,9,9,3,24,19,24,24,24,24,24,24,2,3,24,24,36,24,24,24,24,19,2 +3,24,19,24,36,24,24,24,24,2,3,24,24,24,24,19,24,24,24,2,3,24,19,24,24,24,19,24,24,24,24,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,19,19,24,19,19,2,3,19,19,19,19,19,19,19,24,2 +3,24,19,36,24,36,24,24,24,1,1,24,24,24,24,19,24,19,24,1,1,24,19,24,24,24,19,19,19,14,15,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,24,24,24,24,24,1,1,24,24,24,24,24,24,24,24,2 +3,24,19,24,36,24,24,19,24,24,24,24,24,24,24,19,24,19,24,24,24,24,21,24,24,24,24,24,24,2,3,24,24,24,24,24,24,37,24,2,9,9,9,9,3,24,2,9,9,9,3,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,2 +3,24,19,24,24,24,24,24,24,14,15,24,24,24,24,19,24,19,37,14,15,21,37,21,24,24,24,24,24,2,3,24,37,36,24,24,24,24,24,2,9,9,9,9,3,36,2,9,9,9,3,24,24,24,24,24,24,24,24,14,15,24,24,24,24,24,24,24,24,2 +3,24,19,24,24,24,24,36,24,2,3,24,24,24,24,24,24,24,24,2,9,4,4,15,24,24,14,4,4,9,3,24,36,24,24,24,24,24,24,2,9,9,9,9,3,36,2,9,9,9,3,24,24,24,24,24,24,24,24,2,3,36,24,24,24,24,24,24,24,2 +3,24,19,19,19,19,36,24,36,2,3,24,24,24,24,24,24,24,24,2,3,1,1,1,24,24,1,1,1,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,3,24,19,24,24,19,24,24,19,2,3,24,24,24,24,24,24,24,24,2 +3,24,19,24,24,24,24,36,24,2,3,24,24,24,24,24,24,24,24,2,3,20,24,24,24,24,24,24,20,2,3,24,24,24,24,24,24,24,20,2,9,9,9,9,3,24,2,9,9,9,3,36,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2 +9,4,15,24,24,14,4,4,4,9,9,4,4,4,4,4,4,4,4,9,9,4,4,15,24,24,14,4,4,9,9,4,4,15,24,14,4,4,4,9,9,9,9,9,3,24,2,9,9,9,9,4,4,4,4,4,4,4,4,9,9,4,4,4,4,4,4,4,4,9 +3,1,1,24,24,1,1,1,1,2,3,1,1,1,1,1,1,1,1,2,3,1,1,1,24,24,1,1,1,2,3,1,1,1,24,1,1,1,1,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,1,1,2,9,9,9,9,9,9,9,9,9,9,9,9,9 +3,21,24,24,24,24,24,24,21,2,3,24,24,24,21,24,21,24,36,2,3,24,21,21,24,24,21,21,24,2,3,24,24,36,24,36,24,21,21,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,21,21,2,9,9,9,9,9,9,9,9,9,9,9,9,9 +3,24,24,24,24,24,24,24,24,2,3,37,19,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,36,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,3,1,1,36,36,1,1,2,9,9,9,9,9,9,9,9,9,9,9 +3,24,24,24,24,24,24,24,24,1,1,24,19,24,24,24,24,24,24,1,1,24,36,24,24,24,24,24,24,1,1,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,3,19,37,36,36,37,19,2,9,9,9,9,9,3,1,1,1,2,9 +3,24,24,24,20,36,24,24,24,24,24,24,19,24,24,24,24,24,24,24,24,24,19,24,19,24,24,24,24,24,24,24,24,36,24,36,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,4,15,37,37,14,4,9,9,9,9,9,9,3,36,24,24,2,9 +3,24,24,24,36,19,24,24,24,14,15,24,19,24,24,24,24,24,24,14,15,24,24,19,24,24,24,24,24,14,15,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,3,1,1,36,36,1,1,2,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,24,24,24,2,3,24,19,24,24,24,37,37,37,2,3,24,24,24,24,24,24,24,24,2,3,24,24,36,24,36,24,24,24,2,9,9,9,9,3,36,2,9,9,9,9,3,19,37,37,37,37,19,2,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,24,24,24,2,3,24,19,24,24,24,24,37,37,2,3,24,36,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,4,15,36,36,14,4,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,20,2,3,36,24,24,24,24,24,24,20,2,3,24,20,24,24,24,24,24,24,2,9,9,9,9,3,36,2,9,9,9,9,9,9,3,36,36,2,9,9,9,9,9,9,9,3,24,36,24,2,9 +9,4,4,15,24,24,14,4,4,9,9,4,4,4,4,4,4,4,4,9,9,4,4,15,24,24,14,4,4,9,9,4,4,4,15,24,14,4,4,9,9,9,9,9,3,24,2,9,9,9,9,9,9,9,4,4,9,9,9,9,9,9,9,9,3,24,24,24,2,9 +9,9,9,3,24,24,2,9,9,9,3,1,1,1,1,1,1,1,1,2,3,1,1,1,24,24,1,1,1,2,3,1,1,1,1,24,1,1,1,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,1,1,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +9,9,9,3,24,24,2,9,9,9,3,24,19,24,21,24,21,24,24,2,3,24,24,21,24,24,24,24,24,2,3,36,21,24,37,24,24,24,21,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,36,36,2,9,9,9,9,9,9,9,3,36,24,24,2,9 +3,1,1,1,24,24,1,1,1,2,3,24,19,24,21,24,21,24,24,2,3,24,24,19,19,19,19,19,24,2,3,36,24,37,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,36,36,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,21,24,24,24,24,24,24,21,1,1,24,19,24,24,24,24,24,24,1,1,24,24,24,24,24,24,19,24,2,3,24,37,24,24,24,24,24,24,2,3,1,1,2,3,24,2,9,9,9,9,9,9,3,24,36,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,24,24,24,24,24,24,19,24,24,24,24,24,24,24,24,24,24,19,24,24,24,19,24,2,3,24,37,24,24,24,24,24,24,2,3,24,24,2,3,24,2,9,9,9,9,9,9,3,36,24,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,24,36,24,14,15,24,19,36,24,24,24,24,24,24,24,24,24,19,24,24,24,24,24,2,3,37,24,24,24,24,24,24,24,2,9,4,4,9,3,24,2,9,9,9,9,9,9,3,24,24,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,24,24,24,24,36,24,24,2,3,24,19,24,24,24,24,24,24,14,15,24,24,19,24,24,24,19,19,2,3,24,24,24,24,24,37,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,9,3,24,36,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,36,24,24,24,24,24,24,24,2,3,24,19,24,24,24,36,24,24,2,3,24,24,19,19,19,19,19,24,1,1,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,3,1,2,9,9,9,3,24,24,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +3,36,24,36,24,24,24,20,24,2,3,24,19,24,24,24,24,24,24,2,3,20,24,24,24,24,24,19,24,24,24,24,24,24,24,20,24,24,24,2,9,9,9,9,3,24,2,3,24,2,9,9,9,3,24,24,2,9,9,9,9,9,9,9,3,24,24,24,2,9 +9,4,4,4,4,4,4,4,4,9,9,4,4,4,4,4,4,4,4,9,9,4,4,15,24,24,14,4,4,4,4,4,4,4,4,4,4,4,4,9,9,9,9,9,3,24,2,9,4,9,9,9,9,9,4,4,9,9,9,9,9,9,9,9,3,24,36,24,2,9 +3,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,2,3,1,1,1,24,24,1,1,1,2,9,9,9,9,9,9,9,9,9,9,9,9,9,9,3,24,2,9,9,9,9,9,3,1,1,1,1,2,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,37,24,24,24,36,24,24,2,3,21,24,24,24,24,36,36,21,2,3,24,24,21,24,24,21,24,36,2,3,1,1,1,1,1,1,1,1,2,9,9,9,9,3,24,2,9,9,9,9,9,3,21,36,36,21,2,9,9,9,9,9,9,3,36,24,24,2,9 +3,24,37,24,24,24,24,24,24,2,3,24,36,24,24,24,24,24,24,2,3,24,24,24,36,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,3,20,36,36,20,2,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,37,24,24,19,24,19,19,1,1,36,24,24,24,24,24,24,24,1,1,24,24,21,24,24,21,24,24,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,3,19,24,36,19,2,9,9,9,9,9,9,3,24,24,24,2,9 +3,24,37,24,24,19,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,3,19,36,24,19,2,9,9,3,1,1,1,1,24,24,24,2,9 +3,24,37,24,24,19,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,21,24,24,21,24,24,2,3,24,24,24,24,24,24,24,24,2,9,3,1,2,3,24,2,9,9,9,9,9,3,24,24,24,24,2,9,9,3,24,24,24,24,24,36,24,2,9 +3,24,37,24,24,36,19,19,19,14,15,24,24,24,24,24,24,24,24,14,15,24,24,24,24,24,24,24,24,2,3,24,24,24,24,24,24,24,24,2,9,3,24,2,3,24,2,9,9,9,9,9,3,24,24,36,24,2,9,9,9,4,4,4,4,4,4,4,9,9 +3,24,37,24,24,24,24,24,24,2,3,24,36,24,24,24,24,24,24,2,3,24,24,24,36,36,24,36,24,2,3,24,24,24,24,24,24,24,24,2,9,9,4,9,3,24,2,9,9,9,9,9,3,24,24,24,24,2,9,9,9,9,9,9,9,9,9,9,9,9 +3,24,24,24,24,24,24,36,36,2,3,37,24,24,24,24,20,24,37,2,3,24,24,36,36,24,36,24,20,2,3,24,24,24,24,24,24,24,24,2,9,9,9,9,3,24,2,9,9,9,9,9,3,24,24,24,24,2,9,9,9,9,9,9,9,9,9,9,9,9 +9,4,4,4,4,4,4,4,4,9,9,4,4,4,4,4,4,4,4,9,9,4,4,15,36,36,14,4,4,9,9,4,4,4,4,4,4,4,4,9,9,9,9,9,3,24,2,9,9,9,9,9,9,15,24,24,14,9,9,9,9,9,9,9,9,9,9,9,9,9 diff --git a/intra/source/csv/BEDROOM_BG2.csv b/intra/source/csv/BEDROOM_BG2.csv new file mode 100644 index 0000000..a476387 --- /dev/null +++ b/intra/source/csv/BEDROOM_BG2.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BEDROOM_FG.csv b/intra/source/csv/BEDROOM_FG.csv new file mode 100644 index 0000000..a476387 --- /dev/null +++ b/intra/source/csv/BEDROOM_FG.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BLANK_BG.csv b/intra/source/csv/BLANK_BG.csv new file mode 100644 index 0000000..1a59fa7 --- /dev/null +++ b/intra/source/csv/BLANK_BG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,41,41,41,41,41,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,18,20,0,0,0,3,3,3,3,3,3,3,3,3,3,41,41,41,41,41,41,41,41,41,41,0,0,0,0,0,0,0,17,20,0,0,17,20,0,0,0,17,18,20,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,27,0,0,0,3,3,17,18,18,18,18,20,3,3,41,41,41,41,41,41,41,41,41,41,0,0,17,18,20,0,0,33,35,0,0,33,35,0,0,0,25,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,27,0,0,0,3,3,25,26,26,26,26,27,3,3,41,41,41,41,41,41,41,41,41,41,0,0,25,26,27,0,0,9,11,0,0,9,11,0,0,0,33,34,35,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,26,35,0,0,0,0,3,25,26,26,26,26,27,3,0,41,41,41,41,41,41,41,41,41,41,0,0,33,34,35,0,0,0,0,0,0,0,0,0,0,0,9,10,11,0 +0,17,18,18,18,18,18,18,20,0,0,0,0,0,9,10,11,0,0,0,0,3,25,26,26,26,26,27,3,0,41,41,41,41,41,41,41,41,41,41,0,0,9,10,11,0,0,17,20,0,0,0,0,0,0,0,0,0,0,0 +0,25,26,26,26,26,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,3,25,26,26,26,26,27,3,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,17,20,0,33,35,0,0,0,0,17,20,0,0,0,0,0 +0,25,26,26,26,26,26,26,27,0,0,0,0,0,17,18,20,0,0,0,0,3,33,34,34,21,34,35,3,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,33,35,0,9,11,0,0,0,0,33,35,0,0,0,0,0 +0,33,34,34,34,34,34,34,35,0,0,0,0,0,33,26,35,0,0,0,0,3,9,10,10,29,10,11,3,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,9,11,0,0,0,0,0,0,0,9,11,0,0,0,0,0 +0,9,10,10,10,10,10,10,11,0,0,0,0,0,9,29,11,0,0,0,16,16,16,16,3,29,3,16,16,16,41,41,41,41,41,41,41,41,41,41,0,17,20,0,0,0,0,0,0,17,20,0,0,0,0,0,17,20,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,3,3,3,3,29,3,3,3,3,41,41,41,41,41,41,41,41,41,41,0,33,35,0,0,0,0,0,0,33,35,0,0,0,0,0,33,35,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,17,18,18,18,19,18,18,20,3,41,41,41,41,41,41,41,41,41,41,0,9,11,17,20,0,0,0,0,9,11,0,0,0,0,0,9,11,0,0 +0,0,0,0,0,0,17,18,18,18,18,18,18,18,18,27,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,0,0,33,35,0,0,17,20,0,0,0,0,0,0,0,0,0,0,0 +0,0,17,18,18,18,34,34,34,34,34,34,34,34,34,27,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,0,0,9,11,0,0,33,35,0,0,0,0,17,20,0,0,0,0,0 +0,0,29,10,10,10,10,10,10,10,10,10,10,10,10,29,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,0,0,0,0,0,0,9,11,0,0,0,0,33,35,0,0,0,0,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,0,0,0,17,18,20,0,0,0,0,0,0,9,11,0,0,0,0,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,17,18,20,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,25,26,26,26,26,26,26,27,3,41,41,41,41,41,41,41,41,41,41,0,17,20,0,33,34,35,0,0,17,20,0,17,20,0,0,25,26,27,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,33,34,34,21,34,34,34,35,3,41,41,41,41,41,41,41,41,41,41,0,33,35,0,9,10,11,0,0,33,35,0,33,35,0,0,33,34,35,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,3,9,10,10,29,10,10,10,11,3,41,41,41,41,41,41,41,41,41,41,0,9,11,0,0,0,0,0,0,9,11,0,9,11,0,0,9,10,11,0 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,16,16,3,3,29,3,3,3,0,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,16,0,3,17,19,18,20,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,25,18,20,0,17,18,18,18,18,18,20,0,0,29,0,0,0,0,16,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,25,26,27,0,25,26,26,26,26,26,27,0,0,29,0,0,0,0,16,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,33,34,35,0,33,34,34,34,34,34,35,0,0,29,0,0,0,0,16,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,9,10,11,0,9,10,10,10,10,10,11,0,0,29,0,0,0,0,16,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,0,17,18,18,18,18,18,18,18,18,20,0,0,29,0,0,0,0,0,0,3,25,26,26,27,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,0,25,26,26,34,34,34,34,34,34,27,0,0,29,0,0,0,0,0,0,3,33,34,34,35,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,0,25,26,27,10,10,10,10,10,10,29,0,0,29,0,0,0,0,0,16,3,9,10,10,11,3,16,16,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41 +0,0,0,25,26,27,0,0,0,0,0,0,29,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,25,26,27,0,0,0,0,0,0,29,0,0,29,0,0,0,0,0,0,17,18,18,18,18,18,20,0,41,41,41,41,41,41,41,41,41,41,0,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,20,0 +0,0,0,9,10,11,0,0,0,0,0,0,10,0,0,29,0,0,0,0,0,0,25,34,34,34,34,34,27,0,41,41,41,41,41,41,41,41,41,41,0,29,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,29,0 +0,0,0,17,18,20,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,29,10,10,10,10,11,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,17,18,18,18,18,18,18,18,18,18,18,18,18,20,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,17,18,18,18,27,0,0,0,0,0,0,29,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,10,10,10,10,10,10,10,10,10,10,10,10,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,25,34,34,34,35,0,0,0,0,0,0,29,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,17,18,18,18,18,18,18,18,18,20,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,29,10,10,10,11,0,0,0,0,0,0,29,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,10,10,10,10,10,10,10,10,29,0,29,0,29,0 +0,0,0,9,10,11,0,0,0,0,0,25,18,18,18,18,18,18,18,18,18,18,27,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,0,0,0,0,17,20,0,29,0,29,0,29,0 +0,0,0,17,18,20,0,0,0,0,0,33,34,34,34,34,34,34,34,34,34,34,35,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,0,0,0,0,33,35,0,29,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,9,10,10,10,10,10,10,10,10,10,10,11,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,0,0,0,0,9,11,0,29,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,0,0,0,0,0,0,0,29,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,17,20,0,0,0,0,0,29,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,33,35,0,0,0,0,0,29,0,29,0,29,0 +0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,29,0,9,11,0,0,0,0,0,29,0,29,0,29,0 +0,0,0,25,26,26,18,18,18,18,18,18,20,0,17,18,18,18,18,18,18,18,18,18,18,18,18,18,27,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,33,18,18,18,18,18,18,18,18,35,0,29,0,29,0 +0,0,0,33,34,34,34,34,34,34,34,34,35,0,25,26,34,34,34,34,34,34,34,34,34,34,34,34,35,0,41,41,41,41,41,41,41,41,41,41,0,29,0,29,0,9,10,10,10,10,10,10,10,10,11,0,29,0,29,0 +0,0,0,9,10,10,10,10,10,10,10,10,11,0,25,27,10,10,10,10,10,10,10,10,10,10,10,10,11,0,41,41,41,41,41,41,41,41,41,41,0,29,0,33,18,18,18,18,18,18,18,18,18,18,18,18,35,0,29,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,29,0,9,10,10,10,10,10,10,10,10,10,10,10,10,11,0,29,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,33,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,35,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,9,10,10,10,10,10,10,10,10,10,10,10,10,10,29,10,10,11,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,17,20,0,17,18,18,18,18,18,18,18,18,18,18,26,18,18,20,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,27,0,33,26,26,26,26,26,26,26,26,26,26,26,26,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,17,18,26,26,18,20,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,27,0,9,25,26,26,26,26,26,34,34,34,26,26,26,26,27,0 +0,17,18,18,18,18,18,18,18,18,20,0,25,26,26,26,26,27,0,17,18,18,18,18,18,18,18,18,20,0,41,41,41,41,41,41,41,41,41,41,0,25,26,18,18,26,26,26,26,26,27,10,10,10,25,26,26,26,27,0 +0,33,34,34,34,34,34,34,34,34,35,0,25,26,26,26,26,27,0,33,34,34,34,34,34,34,34,34,35,0,41,41,41,41,41,41,41,41,41,41,0,25,26,26,26,26,34,34,26,26,27,0,0,0,33,34,34,26,27,0 +0,9,10,10,10,10,10,10,10,10,10,0,25,26,26,26,26,27,0,10,10,10,10,10,10,10,10,10,11,0,41,41,41,41,41,41,41,41,41,41,0,25,34,26,26,27,10,10,25,26,27,0,0,0,9,10,10,25,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,33,34,34,34,34,35,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,29,10,25,26,27,0,0,25,26,26,18,18,18,18,20,0,25,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,9,10,10,10,10,11,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,18,26,26,26,18,18,26,26,26,26,26,34,34,35,0,25,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,26,26,26,26,26,26,26,26,26,26,27,10,10,11,0,25,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,26,26,26,26,26,26,26,26,26,26,27,0,0,0,0,25,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,33,26,26,26,26,26,34,26,26,26,26,27,0,17,18,18,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,9,25,26,26,26,27,10,25,26,26,26,27,0,25,26,26,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,17,26,26,26,26,26,18,26,26,26,26,26,18,26,34,26,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,26,26,34,26,26,34,26,26,26,26,26,26,27,10,25,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,26,27,10,25,27,10,25,26,26,34,34,34,35,0,25,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,25,26,26,18,26,26,18,26,26,27,10,10,10,11,0,25,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,33,34,34,26,34,34,34,26,26,26,18,18,18,18,18,26,26,27,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,29,0,0,0,33,34,34,34,34,34,34,34,34,34,35,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,17,26,26,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,26,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,33,34,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,10,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BLUE_BG.csv b/intra/source/csv/BLUE_BG.csv new file mode 100644 index 0000000..71eb106 --- /dev/null +++ b/intra/source/csv/BLUE_BG.csv @@ -0,0 +1,50 @@ +5,1,3,40,2,1,1,1,1,4,10,10,10,10,10,10,10,10,10,10,5,1,1,1,1,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4 +7,60,60,40,60,60,60,60,60,2,1,1,1,1,1,1,1,1,1,1,3,20,70,60,60,60,60,60,60,6,7,60,60,117,60,117,60,117,60,64,60,117,60,117,60,117,60,60,117,6 +3,60,60,40,60,60,60,60,60,60,60,60,20,111,112,113,60,70,70,60,60,70,60,60,60,12,13,60,60,6,7,60,111,110,112,110,112,110,113,12,13,114,112,110,112,110,112,112,115,6 +40,40,40,40,60,60,60,60,60,60,60,60,20,114,110,115,60,60,60,60,60,60,70,60,60,6,7,60,60,6,7,111,110,110,115,20,114,110,115,6,7,114,110,115,20,116,60,60,116,6 +41,20,20,20,60,12,11,11,11,11,13,60,60,114,110,115,60,60,60,60,60,63,60,70,60,6,7,60,60,6,7,60,114,115,20,60,20,114,115,6,7,114,110,110,112,110,112,112,115,6 +41,60,60,60,60,2,4,10,10,10,5,60,60,70,60,116,60,60,60,60,60,60,60,60,70,6,7,60,60,6,7,111,115,20,60,60,60,20,116,6,7,114,110,115,20,116,64,60,116,6 +41,20,60,60,60,60,2,1,1,4,15,11,11,11,11,11,11,11,11,11,13,60,60,60,70,6,7,60,60,6,7,60,114,113,20,60,20,111,115,6,7,114,110,110,112,110,112,112,115,6 +11,13,60,60,60,60,60,60,60,6,10,10,10,10,10,10,10,10,10,10,7,60,60,70,60,6,7,60,63,6,7,111,110,110,113,20,111,110,115,6,7,114,110,115,20,116,60,60,116,6 +10,7,60,60,60,60,60,60,60,6,10,10,10,10,10,10,10,10,10,10,7,20,70,60,20,6,7,60,60,6,7,60,60,63,116,60,116,60,60,6,7,60,60,60,63,60,111,112,115,6 +10,15,11,13,60,60,12,11,11,14,10,10,10,10,10,10,10,10,10,10,15,11,11,11,11,14,15,13,60,6,15,11,11,11,11,11,13,60,12,14,7,60,63,60,60,12,11,11,11,14 +10,10,10,7,60,60,6,10,10,10,5,1,1,1,1,1,1,4,10,10,5,1,1,1,1,1,1,3,60,6,5,1,1,1,1,1,3,60,2,4,7,60,60,60,60,2,1,1,1,4 +10,10,5,3,60,60,2,1,4,10,7,70,60,60,70,60,60,6,10,10,7,60,60,60,60,60,60,70,60,6,7,63,60,60,60,60,60,60,60,6,7,111,112,112,112,112,112,112,113,6 +10,10,7,60,62,60,20,70,6,10,7,60,60,60,60,20,60,6,10,10,7,70,60,60,60,60,60,60,60,6,7,60,60,60,60,60,63,60,60,6,7,114,110,110,110,110,110,110,115,6 +10,10,7,70,60,60,20,60,2,1,3,62,60,60,60,20,60,6,10,10,7,60,60,60,60,60,60,60,60,6,7,60,60,60,60,60,60,60,60,6,7,116,63,60,60,60,114,110,115,6 +10,10,7,60,60,60,20,62,60,60,60,60,60,60,60,20,60,6,10,10,7,60,111,112,112,112,112,113,70,6,7,60,60,60,62,60,60,60,60,6,7,116,60,60,60,111,110,110,115,6 +10,10,7,60,20,20,20,60,60,60,60,60,63,60,60,20,60,6,10,10,7,60,114,110,110,110,110,115,70,6,7,60,60,60,60,60,60,60,60,6,7,116,60,111,112,110,110,110,115,6 +10,10,7,60,60,60,60,60,12,11,13,20,20,20,20,20,60,6,10,10,7,60,62,60,60,60,60,60,60,6,7,60,60,60,60,60,60,60,60,6,7,114,112,110,110,110,110,110,115,6 +10,10,15,11,11,11,11,11,14,10,7,70,62,60,60,60,60,6,10,10,7,60,60,62,60,60,60,60,60,2,3,60,60,60,62,60,60,60,60,6,7,114,110,110,110,115,60,64,60,6 +10,10,10,10,10,10,10,10,10,10,7,60,70,70,60,63,60,6,10,10,7,70,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,6,7,114,110,110,110,115,60,60,60,6 +10,10,10,10,10,10,10,10,10,10,15,11,11,13,60,60,12,14,10,10,15,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,15,11,11,11,11,11,13,60,12,14 +5,1,1,1,1,1,1,1,1,4,5,1,1,1,60,60,1,1,1,4,10,10,10,10,10,10,10,10,10,10,10,5,1,1,1,4,10,10,10,10,5,1,1,1,1,1,3,60,2,4 +7,111,112,112,112,112,112,112,113,6,7,60,60,60,60,60,62,60,60,6,10,10,10,10,10,10,10,10,10,10,10,7,62,20,62,2,1,1,1,4,7,111,112,112,112,113,60,64,60,6 +7,114,110,110,110,110,110,110,115,6,7,60,70,60,60,60,60,60,60,6,10,10,5,1,1,1,1,1,1,4,5,3,117,62,117,62,117,20,117,6,7,114,110,110,110,115,60,63,60,6 +7,114,110,110,110,110,110,110,115,3,3,20,20,60,60,60,60,60,70,6,10,10,7,20,60,60,60,60,60,6,7,111,110,112,110,112,110,112,110,6,7,114,110,110,110,115,60,60,60,6 +7,114,110,110,110,110,115,60,60,60,60,60,20,60,60,20,60,60,60,6,10,10,7,60,60,60,62,60,60,2,3,114,110,115,62,62,62,114,115,2,3,114,110,110,110,110,112,112,113,6 +7,70,60,60,60,20,60,60,60,12,13,60,20,20,20,20,60,60,60,6,10,10,7,117,60,63,60,64,60,60,60,62,60,62,62,60,60,60,60,62,62,60,60,114,110,110,110,110,115,6 +7,20,60,60,60,60,61,60,60,6,7,60,60,60,60,61,60,12,11,14,10,10,7,116,60,60,60,60,20,12,13,111,112,113,60,62,60,111,113,12,13,63,60,114,110,110,110,110,115,6 +7,20,60,61,60,60,60,60,70,6,7,64,12,13,60,60,60,6,10,10,10,10,7,116,60,61,60,60,12,14,7,116,62,114,112,112,112,110,115,6,7,60,64,60,114,110,115,60,116,6 +7,60,70,60,60,60,60,70,60,6,7,60,6,7,62,60,60,6,10,10,10,10,15,13,60,60,60,60,6,10,7,62,12,11,11,11,11,11,11,14,7,60,60,60,114,110,115,60,116,6 +15,11,11,13,60,60,12,11,11,14,15,11,14,15,11,11,11,14,10,10,10,10,10,7,60,60,60,60,6,10,15,11,14,10,10,10,10,10,10,10,15,11,11,11,11,11,11,11,11,14 +5,3,1,3,60,62,2,1,1,1,1,1,1,1,1,1,1,1,1,4,10,10,10,7,60,60,60,60,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,20,70,70,62,60,60,60,60,60,60,60,60,111,112,112,113,60,60,6,10,10,10,7,60,62,60,60,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,70,70,63,70,70,70,70,60,12,13,60,111,110,110,110,115,60,60,6,10,10,10,7,60,60,60,64,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,70,60,70,70,60,70,70,60,6,7,60,114,110,110,110,110,113,64,6,10,10,10,7,20,60,60,117,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,61,70,20,70,61,20,70,62,6,7,60,114,110,110,110,110,115,60,6,10,10,10,7,20,60,60,116,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,70,70,70,60,70,70,60,6,7,60,114,110,110,110,110,115,60,6,10,10,10,7,60,60,60,116,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,61,60,60,60,70,70,70,63,6,7,60,114,110,110,110,110,115,60,6,10,10,10,7,60,60,64,116,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,70,70,70,70,70,20,70,60,6,7,60,114,110,110,110,110,115,60,6,10,10,10,7,60,64,60,116,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,60,64,60,60,60,60,64,6,7,60,60,60,60,60,60,60,64,6,10,10,10,7,60,60,60,20,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,11,11,11,11,11,11,11,11,14,15,13,60,12,11,11,11,11,11,14,10,10,10,15,13,60,12,11,14,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +5,1,1,1,1,1,1,1,1,1,1,3,60,2,1,1,1,1,1,1,1,1,1,1,3,60,2,1,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,111,112,112,112,112,112,113,12,13,111,112,112,112,112,112,112,113,12,13,60,111,112,112,112,112,113,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,111,110,110,110,110,110,110,115,6,7,114,110,110,110,110,110,110,115,6,7,60,114,110,110,110,110,115,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,114,110,110,110,110,110,110,115,6,7,114,110,110,110,110,110,110,115,6,7,20,114,110,110,110,110,115,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,114,110,110,110,110,110,115,6,7,60,114,110,110,110,110,110,115,6,7,60,114,110,110,110,110,115,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,111,110,110,110,110,110,110,115,2,3,60,114,110,110,110,110,110,115,6,7,60,114,110,110,110,110,115,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,114,110,110,110,110,110,110,115,60,60,64,114,110,110,110,115,60,60,6,7,60,114,110,110,110,110,115,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,60,60,60,64,60,60,60,60,60,60,60,60,60,60,60,60,60,6,7,60,60,60,60,60,60,60,60,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +15,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,15,11,11,11,11,11,11,11,11,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BLUE_BG2.csv b/intra/source/csv/BLUE_BG2.csv new file mode 100644 index 0000000..7e71a76 --- /dev/null +++ b/intra/source/csv/BLUE_BG2.csv @@ -0,0 +1,50 @@ +0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +30,30,30,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/BLUE_FG.csv b/intra/source/csv/BLUE_FG.csv new file mode 100644 index 0000000..dd829ee --- /dev/null +++ b/intra/source/csv/BLUE_FG.csv @@ -0,0 +1,10 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/CIRCUS_BG.csv b/intra/source/csv/CIRCUS_BG.csv new file mode 100644 index 0000000..5c6a4e8 --- /dev/null +++ b/intra/source/csv/CIRCUS_BG.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,32,32,32,32,33,33,33,33,34,31,32,32,32,32,33,33,33,33,34,31,32,32,32,32,32,33,33,33,34,0,0,0,0,0,0,0,0,0,0,50,51,51,51,51,51,51,51,51,52,50,51,51,51,51,51,51,51,51,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,46,46,82,60,60,60,34,31,73,73,73,73,73,73,73,73,34,31,66,66,66,66,66,66,66,66,34,0,0,0,0,0,0,0,0,0,0,50,60,60,41,60,41,60,60,60,52,50,60,46,60,46,46,60,46,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,46,60,60,60,60,60,32,33,60,7,60,7,60,7,60,7,32,33,82,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,50,46,46,40,82,40,46,46,60,52,50,92,93,93,93,93,93,93,94,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,73,73,73,73,74,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,84,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,50,60,60,60,84,60,60,60,60,52,50,103,110,110,110,110,110,110,102,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,70,70,70,70,70,74,60,60,37,36,60,7,60,7,60,7,60,7,37,36,82,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,50,60,43,45,81,43,45,60,60,52,50,110,110,110,110,110,110,110,110,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,70,70,70,70,70,75,20,60,34,31,60,7,60,7,60,7,60,7,34,31,43,44,44,44,44,44,45,60,34,0,0,0,0,0,0,0,0,0,0,50,60,60,60,84,60,60,60,60,52,50,110,110,110,110,110,110,110,110,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,60,60,71,75,21,60,34,31,60,43,44,44,44,44,44,45,34,31,60,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,50,60,60,46,82,46,60,60,60,51,51,43,44,44,44,44,44,44,45,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,60,60,60,46,21,46,32,33,60,41,60,60,60,88,60,41,34,31,60,60,60,43,44,44,44,45,34,0,0,0,0,0,0,0,0,0,0,50,60,60,45,45,45,60,60,60,60,60,60,60,82,42,42,89,60,84,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,84,60,60,84,82,21,60,60,60,84,40,92,93,93,94,60,40,34,31,60,60,60,60,7,60,60,60,34,0,0,0,0,0,0,0,0,0,0,50,60,60,46,84,46,60,60,60,60,60,60,60,81,40,40,60,60,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,35,35,36,60,37,36,21,60,37,35,35,35,36,110,110,37,38,38,39,39,35,35,36,60,37,38,38,38,39,0,0,0,0,0,0,0,0,0,0,56,54,54,55,84,53,54,54,54,54,55,60,53,54,54,54,54,55,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,32,32,32,60,33,33,21,60,34,31,32,32,32,110,110,33,33,33,34,31,32,32,32,60,33,33,33,33,34,0,0,0,0,0,0,0,0,0,0,56,50,51,51,84,51,51,51,52,56,50,60,52,56,56,56,56,50,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,42,60,60,84,21,60,34,31,60,60,91,110,100,60,60,60,34,31,66,84,60,60,60,60,84,66,34,0,0,0,0,0,0,0,0,0,0,56,50,60,60,60,60,60,60,52,56,50,60,52,56,56,56,56,50,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,40,60,60,60,21,60,34,31,60,72,73,73,73,73,74,60,34,31,84,60,60,60,60,60,60,84,34,0,0,0,0,0,0,0,0,0,0,56,50,60,60,60,60,60,60,52,56,50,60,57,51,51,51,51,57,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,46,72,73,74,21,82,34,31,60,71,70,70,70,70,75,60,34,31,60,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,56,50,60,60,60,60,60,60,52,56,50,60,57,60,60,60,60,57,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,72,74,46,71,70,75,21,84,34,31,60,71,70,70,70,70,75,60,34,31,60,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0,56,50,60,60,60,60,60,60,52,56,50,60,57,60,60,60,60,57,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,70,70,73,70,70,75,21,84,34,31,60,71,70,70,70,70,75,60,34,31,66,60,60,60,60,60,60,66,34,0,0,0,0,0,0,0,0,0,0,56,50,46,60,60,60,60,60,52,56,50,60,57,60,60,60,60,57,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,71,70,75,60,21,82,34,31,60,71,70,70,70,70,75,60,34,31,43,45,60,60,60,60,43,45,34,0,0,0,0,0,0,0,0,0,0,56,50,60,60,60,60,60,60,52,56,50,60,52,54,54,54,54,50,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,60,71,70,75,60,21,60,34,31,60,71,70,70,70,70,75,60,34,31,60,77,66,60,60,60,77,60,34,0,0,0,0,0,0,0,0,0,0,56,56,54,54,54,54,54,54,56,56,50,60,51,51,51,51,51,51,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,84,60,60,60,60,84,21,60,34,31,60,60,60,103,110,95,60,60,34,31,84,76,60,60,60,60,76,66,34,0,0,0,0,0,0,0,0,0,0,56,56,56,56,56,56,56,56,56,56,50,60,60,60,60,60,60,60,60,52 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,35,35,36,60,37,36,21,60,34,39,35,35,36,110,37,38,38,38,39,39,35,35,35,35,36,60,37,38,39,0,0,0,0,0,0,0,0,0,0,56,56,56,56,56,56,56,56,56,56,56,54,54,54,54,54,54,54,54,56 +0,0,0,0,0,0,0,0,0,0,31,32,32,32,32,33,33,33,33,34,0,0,0,0,0,0,0,0,0,0,31,32,32,32,60,33,33,21,60,34,31,32,32,32,110,33,33,33,33,34,31,32,32,32,32,32,60,33,33,32,51,51,51,51,51,51,51,51,51,51,32,32,32,32,32,33,33,33,33,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,41,60,41,60,60,7,34,0,0,0,0,0,0,0,0,0,0,31,82,84,60,60,60,60,21,60,34,31,60,60,91,110,46,66,66,66,34,31,46,84,46,66,84,82,84,66,80,80,84,60,60,84,84,60,60,84,80,80,80,81,81,46,60,46,81,81,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,73,73,40,60,40,73,73,7,34,0,0,0,0,0,0,0,0,0,0,31,84,60,60,60,60,60,21,60,34,31,60,72,73,110,46,60,60,60,34,31,43,44,45,66,60,60,60,66,37,54,54,54,54,54,54,54,54,54,54,36,46,60,60,46,60,46,60,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,84,82,84,60,60,7,34,0,0,0,0,0,0,0,0,0,0,31,60,60,60,60,60,60,21,84,32,33,60,71,70,110,46,60,60,60,32,33,66,66,66,66,60,60,60,66,34,56,56,56,56,56,56,56,56,56,56,31,43,44,45,80,84,80,60,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,84,60,84,60,60,7,34,0,0,0,0,0,0,0,0,0,0,31,60,60,84,84,60,60,21,60,60,60,60,60,91,110,95,60,60,60,60,84,60,60,60,60,60,60,60,66,34,56,56,56,56,56,56,56,56,56,56,31,60,60,60,84,60,84,60,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,60,60,60,60,60,7,34,0,0,0,0,0,0,0,0,0,0,31,60,60,84,84,60,60,21,7,37,36,43,44,44,44,45,82,82,60,60,84,60,60,60,60,60,60,60,66,34,56,56,56,56,56,56,56,56,56,56,31,60,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,92,93,93,93,94,7,34,0,0,0,0,0,0,0,0,0,0,31,60,60,60,60,60,60,21,60,34,31,66,91,110,110,95,72,74,60,60,7,66,66,66,60,66,66,66,66,34,56,56,56,56,56,56,56,56,56,56,31,60,60,60,60,60,60,60,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,91,110,110,110,95,7,34,0,0,0,0,0,0,0,0,0,0,31,84,60,60,60,60,60,22,60,34,31,66,91,110,110,95,71,75,60,37,35,35,35,36,60,37,38,38,38,39,56,56,56,56,56,56,56,56,56,56,31,60,60,60,60,60,60,84,82,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,31,60,60,91,110,112,110,95,7,34,0,0,0,0,0,0,0,0,0,0,31,82,84,60,60,60,60,60,60,34,31,66,91,110,110,95,60,60,60,34,39,39,39,31,60,34,39,39,39,39,56,56,56,56,56,56,56,56,56,56,31,60,60,60,60,60,60,83,60,34,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,39,35,35,35,36,112,37,38,38,39,0,0,0,0,0,0,0,0,0,0,39,35,35,35,35,38,38,38,38,39,39,35,35,35,36,96,37,38,38,39,39,39,39,39,35,39,39,39,39,39,56,56,56,56,56,56,56,56,56,56,39,35,35,35,35,35,35,36,60,34,0,0,0,0,0,0,0,0,0,0 +39,39,39,39,31,32,32,33,33,34,1,2,2,2,2,112,3,3,3,4,1,2,2,2,2,3,3,3,3,4,10,10,10,10,10,10,10,10,10,10,31,32,32,32,32,60,33,33,33,34,56,56,56,56,56,56,56,56,56,56,1,2,2,2,2,3,3,3,3,4,1,2,2,2,2,2,2,2,60,4,0,0,0,0,0,0,0,0,0,0 +39,39,39,39,31,60,46,84,81,34,1,74,67,110,110,112,110,110,110,4,1,112,113,113,30,110,110,110,110,4,1,2,2,2,2,3,3,3,3,4,31,110,110,95,60,60,91,110,110,34,56,50,51,51,51,51,51,51,52,56,1,72,73,73,73,73,73,73,74,4,1,60,60,60,60,60,60,7,60,4,0,0,0,0,0,0,0,0,0,0 +31,32,32,32,32,60,46,60,84,34,1,75,67,110,110,112,110,110,110,2,3,110,30,114,30,110,110,110,110,4,1,60,60,60,60,60,92,93,93,4,31,110,100,96,60,60,90,101,110,34,56,50,60,60,60,60,60,60,52,56,1,71,75,60,60,60,60,71,75,4,1,60,60,60,24,25,29,26,60,4,0,0,0,0,0,0,0,0,0,0 +31,84,60,60,60,60,46,60,60,34,1,75,110,110,110,112,110,110,110,110,110,110,30,114,30,110,110,110,100,2,3,60,60,60,60,60,91,111,111,2,33,110,95,82,60,60,81,91,110,34,56,50,60,46,60,60,46,60,52,56,1,71,75,60,72,74,60,71,75,4,1,60,60,60,60,7,60,60,60,4,0,0,0,0,0,0,0,0,0,0 +31,81,43,44,44,44,45,60,60,34,1,75,67,110,110,111,111,111,111,111,100,101,30,114,30,110,110,110,95,60,60,60,60,60,60,60,91,111,111,111,111,111,95,60,84,84,60,91,110,34,56,50,60,60,78,78,60,60,52,56,1,76,60,60,71,75,60,60,60,4,1,60,24,25,25,25,25,25,29,4,0,0,0,0,0,0,0,0,0,0 +31,60,60,60,60,60,60,60,60,34,1,75,67,110,110,110,110,110,110,13,12,91,30,114,30,110,110,110,102,13,12,60,60,60,60,60,91,111,111,13,36,110,95,60,84,84,60,91,110,34,56,50,60,60,78,78,60,60,52,56,1,76,60,72,70,70,73,74,60,2,3,60,60,60,60,60,7,60,60,4,0,0,0,0,0,0,0,0,0,0 +31,60,60,60,60,60,60,60,60,34,1,75,67,110,110,110,110,110,110,4,1,29,30,114,30,110,110,110,110,4,10,11,11,11,11,12,90,13,14,10,31,110,95,80,60,60,82,91,110,34,56,50,60,46,60,60,46,60,52,56,1,76,60,71,70,70,70,75,60,60,60,60,60,60,60,60,7,60,60,4,0,0,0,0,0,0,0,0,0,0 +31,84,60,60,60,60,60,60,84,34,1,75,110,67,67,67,110,67,67,4,1,29,110,110,110,110,110,110,110,4,10,10,10,10,10,10,11,10,10,10,31,110,102,94,60,60,92,103,110,34,56,50,60,60,60,60,60,60,52,56,1,76,60,71,70,70,70,75,29,13,12,60,60,60,60,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0 +31,82,84,60,60,60,60,84,82,34,1,0,73,73,73,73,73,73,73,4,1,91,110,110,110,110,110,110,110,4,10,10,10,10,10,10,10,10,10,10,31,110,110,95,60,60,91,110,110,34,56,56,54,54,54,54,54,54,56,56,1,60,60,60,60,60,60,60,60,4,1,60,60,60,60,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0 +39,35,35,35,36,60,37,38,38,39,10,14,14,14,14,11,11,11,11,10,10,14,14,14,14,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10,39,35,35,35,36,60,37,38,38,39,56,56,56,56,56,56,56,56,56,56,10,11,11,11,11,12,60,13,14,10,10,11,11,11,12,60,13,14,14,10,0,0,0,0,0,0,0,0,0,0 +1,2,2,2,2,60,3,3,3,10,10,2,2,2,2,3,3,3,3,4,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,3,3,3,3,4,31,32,32,32,32,60,33,33,33,34,1,2,2,2,2,3,3,3,3,4,1,2,2,2,2,2,60,3,3,3,2,2,2,2,2,60,3,3,3,4,0,0,0,0,0,0,0,0,0,0 +1,73,73,74,60,60,72,73,73,2,3,60,60,72,74,60,60,66,60,4,0,0,0,0,0,0,0,0,0,0,1,81,81,66,66,82,66,66,7,4,31,81,72,73,74,60,60,60,82,34,1,60,60,60,72,74,60,60,60,4,1,72,74,66,66,66,60,60,60,60,60,60,60,60,20,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0 +1,66,60,60,60,60,60,60,60,60,60,60,60,71,70,73,73,74,60,4,0,0,0,0,0,0,0,0,0,0,1,60,66,80,80,66,80,80,66,4,31,60,30,30,30,30,30,30,77,34,1,60,60,60,71,75,60,60,60,4,1,71,75,60,60,60,60,60,66,13,12,60,60,60,21,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0 +1,66,60,60,60,60,60,60,60,13,12,60,60,71,70,70,70,75,60,4,0,0,0,0,0,0,0,0,0,0,1,66,7,66,66,7,66,80,80,2,33,60,30,110,110,110,110,30,76,34,1,60,60,23,25,27,60,60,60,4,1,60,60,60,60,60,60,60,66,4,1,24,25,29,27,66,24,26,60,4,0,0,0,0,0,0,0,0,0,0 +1,60,60,72,73,73,74,66,60,4,1,60,60,60,71,70,70,70,73,4,0,0,0,0,0,0,0,0,0,0,1,66,66,72,74,66,7,80,66,60,60,60,30,110,110,110,110,30,76,32,3,60,60,21,60,21,60,60,60,4,1,60,60,60,72,74,60,60,66,4,1,60,66,60,21,60,66,60,60,4,0,0,0,0,0,0,0,0,0,0 +1,60,60,60,60,60,60,60,60,4,1,60,60,60,71,70,70,70,70,4,0,0,0,0,0,0,0,0,0,0,1,60,7,66,66,7,66,66,7,13,36,77,30,110,110,110,110,30,60,60,60,60,60,21,60,21,60,60,60,2,3,60,60,60,71,75,60,60,66,4,1,60,66,60,22,60,66,60,60,4,0,0,0,0,0,0,0,0,0,0 +1,60,60,60,60,60,60,60,66,4,1,60,60,60,60,60,71,75,60,4,0,0,0,0,0,0,0,0,0,0,1,66,66,80,66,81,66,66,81,4,31,76,30,110,110,110,110,30,60,37,12,60,60,24,25,26,60,60,60,60,60,60,60,60,60,60,60,60,66,4,1,29,25,26,60,24,25,26,66,4,0,0,0,0,0,0,0,0,0,0 +1,66,60,60,60,66,72,73,73,4,1,66,66,60,60,60,71,75,60,4,0,0,0,0,0,0,0,0,0,0,1,66,80,66,81,66,81,60,81,4,31,76,30,30,30,30,30,30,60,34,1,60,60,72,74,60,60,60,60,13,12,60,60,60,60,60,60,72,74,4,1,60,66,60,7,60,66,60,60,4,0,0,0,0,0,0,0,0,0,0 +1,73,73,74,60,60,60,60,60,4,1,66,66,60,60,60,71,75,60,4,0,0,0,0,0,0,0,0,0,0,1,82,66,60,60,60,60,60,60,4,31,82,60,60,60,60,72,74,81,34,1,60,60,71,75,60,60,60,60,4,1,66,66,66,66,66,66,71,75,4,1,60,66,60,66,60,66,60,60,4,0,0,0,0,0,0,0,0,0,0 +10,11,11,11,11,14,14,14,14,10,10,11,11,11,12,60,13,14,14,10,0,0,0,0,0,0,0,0,0,0,10,11,12,60,13,14,14,14,14,10,39,35,35,35,36,60,37,38,38,39,10,11,11,11,11,14,14,14,14,10,10,11,11,11,11,14,14,14,14,10,10,11,11,11,11,14,14,14,14,10,0,0,0,0,0,0,0,0,0,0 +1,2,2,2,2,3,3,3,3,4,1,2,2,2,2,60,3,3,3,4,31,32,32,32,32,33,33,33,33,34,1,2,2,60,3,3,3,3,3,4,1,2,2,2,2,92,3,3,3,4,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,39,31,32,32,32,33,33,33,33,34,1,2,2,2,2,3,3,3,3,4 +1,60,60,60,60,60,60,60,60,4,1,66,60,60,60,60,60,60,66,4,31,41,60,41,81,76,60,76,60,34,1,60,60,60,20,60,60,66,66,4,1,7,60,60,60,91,110,95,7,4,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,39,31,72,74,46,60,46,72,74,34,1,49,7,60,60,7,60,60,60,4 +1,60,72,73,73,73,73,74,60,4,1,60,60,60,60,60,60,60,60,4,31,40,60,40,60,71,73,70,73,34,1,60,60,60,21,60,60,60,60,4,1,60,60,60,60,91,110,102,94,4,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,39,31,76,42,46,82,46,42,76,34,1,48,7,60,60,7,60,72,74,4 +1,60,71,70,70,70,70,75,60,4,1,60,60,66,60,60,66,60,60,4,31,60,84,60,60,76,60,76,60,34,1,60,60,60,21,60,60,72,74,4,1,60,60,60,60,91,110,110,60,4,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,39,31,42,40,60,60,60,40,42,34,1,48,7,7,60,72,73,70,75,4 +1,60,71,70,70,70,70,70,73,2,3,60,60,60,60,60,60,60,60,4,31,60,60,60,60,71,73,75,60,34,1,60,60,60,21,60,60,60,60,4,1,60,60,60,60,90,101,110,95,4,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,39,31,40,60,60,60,60,60,40,34,1,48,7,60,60,7,71,75,60,4 +1,60,60,76,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4,31,73,73,73,73,70,70,75,60,34,1,60,60,60,21,72,74,60,60,4,1,60,60,60,60,60,91,110,95,3,51,51,51,51,51,51,51,52,56,56,56,56,56,56,56,56,56,56,56,56,39,31,60,81,60,60,60,81,60,34,1,120,60,60,60,77,60,71,74,4 +1,73,73,75,60,72,73,73,73,13,12,60,60,66,60,60,60,60,60,4,31,70,70,70,70,75,60,76,60,34,1,60,60,60,21,60,60,77,60,4,1,60,60,60,60,60,91,110,95,60,60,60,60,60,60,60,60,52,56,56,56,56,56,56,56,56,56,56,56,56,39,31,60,84,60,84,60,84,60,34,1,60,60,7,60,71,73,70,75,4 +1,70,70,75,60,71,70,70,70,4,1,60,60,60,60,60,60,60,60,4,31,60,60,60,60,71,73,70,73,34,1,60,60,60,21,60,60,60,60,4,1,60,60,60,60,60,91,110,102,13,54,54,54,54,54,55,60,51,51,51,51,51,51,51,51,51,51,51,51,51,32,32,60,81,60,60,60,83,60,32,3,60,60,7,60,71,75,7,60,4 +1,70,70,75,60,71,70,70,70,4,1,66,60,60,60,60,60,60,60,4,31,60,60,60,60,71,70,75,60,34,1,60,60,60,22,77,60,60,60,4,1,7,60,60,60,60,91,110,30,4,56,56,56,56,56,50,60,60,60,60,60,60,78,78,78,78,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4 +10,11,11,12,60,13,14,14,14,10,10,14,14,14,14,11,11,12,60,4,39,36,60,37,38,38,38,38,38,39,10,12,60,13,14,11,12,60,13,10,10,11,11,11,12,60,13,14,14,10,56,56,56,56,56,56,54,54,54,54,54,54,54,54,54,54,54,54,54,54,35,35,35,35,35,38,38,38,38,38,14,14,14,14,14,14,14,12,60,4 +1,2,2,2,60,3,3,3,3,4,1,2,2,2,2,3,3,3,60,4,1,2,60,3,3,3,3,3,3,4,1,2,60,3,3,2,2,60,3,3,2,2,2,2,2,60,3,3,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,3,3,3,3,3,2,2,2,2,2,3,3,3,60,4 +1,73,74,60,60,60,72,73,73,4,1,60,60,60,60,60,72,74,60,4,1,60,60,60,60,60,60,60,60,4,1,7,60,60,60,60,20,60,60,60,60,20,60,60,60,60,91,110,95,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4 +1,70,75,66,66,66,71,70,70,4,1,60,60,60,60,60,71,75,60,4,1,60,60,24,25,25,25,27,60,4,1,24,25,25,26,60,21,60,60,60,60,21,60,60,7,60,91,110,95,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,23,25,25,25,25,25,25,25,25,25,25,26,7,23,25,27,60,4 +1,70,75,60,60,60,71,70,70,2,3,60,60,60,60,60,71,75,60,2,3,60,60,60,60,60,60,21,60,4,1,60,60,60,60,60,21,60,60,60,60,21,60,60,60,60,91,110,95,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,60,60,60,60,60,60,60,60,60,60,60,21,60,21,60,4 +1,70,75,60,60,60,60,66,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,72,73,74,60,21,60,4,1,60,24,25,25,25,27,60,60,60,60,21,60,7,60,60,91,30,95,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,60,24,25,25,25,25,25,25,25,26,77,24,25,26,60,4 +1,70,75,60,60,60,72,73,73,13,12,60,60,60,60,60,72,74,60,13,12,60,60,71,75,60,60,21,60,4,1,60,60,60,60,60,21,60,60,60,60,21,60,60,60,60,91,110,95,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,20,60,60,60,60,60,60,60,60,72,70,74,60,60,60,4 +1,70,75,60,60,60,71,70,70,4,1,60,60,60,60,60,71,75,60,4,1,60,60,71,60,73,74,21,60,4,1,60,23,25,25,29,26,60,60,60,60,23,25,25,26,60,24,25,26,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,21,60,7,13,14,14,11,11,11,12,76,24,27,13,14,10 +1,70,75,60,60,60,71,70,70,4,1,60,60,60,60,60,71,75,60,4,1,24,25,25,25,25,25,26,60,4,1,60,22,60,7,60,60,60,60,60,60,21,66,60,92,93,103,110,67,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,21,60,60,4,10,10,10,10,10,1,60,60,20,4,10,10 +1,70,75,60,60,60,71,70,70,4,1,60,60,60,60,60,71,75,60,4,1,60,60,60,60,60,60,60,60,4,1,60,60,60,7,60,60,60,60,60,60,22,66,60,91,110,110,110,67,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,21,60,60,4,10,10,10,10,10,1,60,60,21,4,10,10 +10,11,11,12,60,13,14,14,14,10,10,14,14,14,14,11,11,11,11,10,10,14,14,14,14,11,11,11,11,10,10,11,11,11,12,60,60,13,14,14,11,11,11,11,12,110,13,14,14,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,21,60,21,7,60,4,10,10,10,10,10,1,60,60,21,4,10,10 +1,2,2,2,60,3,3,3,3,4,1,2,2,2,2,3,3,3,3,4,1,2,2,2,2,3,3,3,3,4,10,10,10,1,3,60,60,4,10,10,10,10,10,1,3,110,4,10,10,10,1,2,2,2,2,3,3,3,3,4,1,2,2,2,2,3,3,3,3,3,3,60,22,60,22,7,60,2,2,4,10,10,10,1,60,60,21,4,10,10 +1,60,60,60,60,60,60,60,60,4,1,60,60,60,60,60,60,60,60,4,1,60,60,72,73,74,60,60,60,4,10,10,10,1,60,60,60,4,10,10,10,10,10,1,112,112,4,10,10,10,1,110,110,110,110,110,110,110,110,4,1,66,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4,1,2,2,2,20,60,21,4,10,10 +1,60,60,60,60,60,60,60,60,2,3,60,60,60,60,60,60,60,60,2,3,60,60,71,70,75,60,60,60,4,10,10,10,1,60,60,60,4,10,10,10,10,10,1,112,112,4,10,10,10,1,110,110,110,110,110,110,110,110,4,1,60,60,60,60,60,60,24,26,13,12,60,60,60,80,60,60,60,60,4,1,60,60,60,21,60,21,4,10,10 +1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,71,75,60,60,60,4,10,10,10,1,60,60,60,4,10,10,10,1,2,2,112,112,3,3,4,10,1,110,110,67,67,67,67,110,110,4,1,24,25,27,60,60,60,60,60,4,1,60,60,60,66,66,60,60,60,4,1,60,60,60,21,60,21,4,10,10 +1,60,60,60,60,60,60,60,60,13,12,60,60,60,60,60,60,60,60,13,12,60,60,60,71,75,60,60,60,2,3,3,3,3,77,29,29,2,2,2,3,3,110,110,110,110,110,110,2,2,3,110,110,67,67,67,67,110,110,2,3,94,60,21,60,60,60,60,60,4,1,60,60,60,60,82,60,60,60,2,3,60,60,60,22,77,22,3,3,4 +1,24,25,26,60,60,60,60,60,4,1,24,25,26,60,60,60,60,60,4,1,60,60,72,70,75,60,60,60,60,60,60,60,72,75,60,60,91,113,113,113,110,110,30,110,110,30,110,110,111,111,111,110,110,110,110,110,110,110,110,110,95,60,24,25,25,27,60,60,4,1,60,60,60,66,66,60,60,60,60,60,60,60,60,72,70,74,60,60,4 +1,60,60,60,60,60,60,60,60,2,3,60,60,60,60,60,60,60,60,2,3,60,60,71,70,75,60,60,60,13,14,11,11,12,76,29,29,13,14,14,11,11,12,30,110,110,30,13,14,14,12,101,110,67,67,67,67,110,110,13,12,96,60,60,60,60,21,60,60,4,1,60,60,60,80,60,60,60,60,13,12,60,60,60,20,76,20,60,60,4 +1,5,6,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,61,4,10,10,1,3,60,60,60,4,10,10,10,10,1,30,110,110,30,4,10,10,1,91,110,67,67,67,67,110,110,4,1,60,60,60,60,66,22,60,60,4,1,60,60,60,66,66,60,60,60,4,1,60,60,60,22,60,21,60,60,4 +1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4,10,10,1,60,60,60,60,4,10,10,10,10,1,110,110,110,110,4,10,10,1,91,110,110,110,110,110,110,110,4,1,66,7,60,60,60,60,60,60,4,1,60,60,60,66,66,60,60,60,4,10,11,11,11,12,60,21,60,60,4 +10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,14,14,14,14,14,14,14,14,14,14,14,14,14,10,10,10,1,60,60,60,60,2,10,10,10,10,1,110,110,110,110,4,10,10,10,11,11,11,11,14,14,14,14,10,10,11,11,11,11,14,14,14,14,10,10,11,11,11,11,14,14,14,14,10,10,10,10,10,1,60,21,7,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,94,60,60,92,110,3,4,1,2,2,110,110,110,110,3,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,60,23,26,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,95,60,60,91,110,110,4,1,74,91,112,110,110,112,100,72,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,21,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,95,60,60,91,110,110,4,1,66,66,101,112,112,100,66,60,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,23,25,25,27,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,95,60,60,91,110,110,2,3,66,60,90,97,97,66,66,60,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,21,60,60,21,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,95,60,60,90,97,97,96,60,60,60,60,60,60,60,66,60,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,21,60,60,21,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,95,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,21,60,60,21,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,102,93,93,93,93,93,94,60,60,60,60,60,60,60,60,60,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,24,25,25,26,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,110,110,110,110,110,110,13,12,74,60,60,60,60,60,66,72,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,110,110,110,110,110,110,110,110,4,10,11,11,12,60,60,13,14,14,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,4 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,11,14,14,14,14,10,10,10,10,1,60,60,4,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,11,14,14,14,14,10 diff --git a/intra/source/csv/CIRCUS_BG2.csv b/intra/source/csv/CIRCUS_BG2.csv new file mode 100644 index 0000000..12bbba1 --- /dev/null +++ b/intra/source/csv/CIRCUS_BG2.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/CIRCUS_FG.csv b/intra/source/csv/CIRCUS_FG.csv new file mode 100644 index 0000000..12bbba1 --- /dev/null +++ b/intra/source/csv/CIRCUS_FG.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/CLIFF_BG.csv b/intra/source/csv/CLIFF_BG.csv new file mode 100644 index 0000000..372d5ed --- /dev/null +++ b/intra/source/csv/CLIFF_BG.csv @@ -0,0 +1,80 @@ +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,152,169,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,150,150,150,150,152,152,152,152,152,152,152,152,152,152,152,171 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,150,150,150,150,150,35,33,32,32,33,33,32,32,32,33,33,33 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,30,150,150,150,35,32,4,3,73,74,74,74,74,74,74,74,74,74 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,1,32,210,33,4,3,73,74,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,30,10,2,210,3,4,73,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,32,2,210,3,4,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,3,2,210,3,4,121,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,3,2,210,3,4,169,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,125,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121,121,121,121,121,122,124,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121,121,1,3,2,210,3,4,153,121,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,126,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,152,169,121,121,121,121,121,121,121,121,168,10,12,2,210,3,3,150,169,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,121,121,121,121,121,121,121,121,121,121,122,124,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,150,150,150,150,169,121,121,168,152,152,152,152,150,150,157,10,210,12,15,150,153,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,152,169,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,152,152,169,121,121,121,121,168,152,152,150,150,150,150,150,150,150,152,152,150,150,150,150,150,150,150,150,150,150,150,150,150,35,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,124,151,150,150,150,152,169,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,150,150,150,152,152,152,152,150,150,150,150,150,150,150,150,150,150,150,150,150,150,35,32,32,33,32,30,150,150,150,150,179,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,150,150,150,150,153,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,150,150,150,150,150,150,150,150,150,35,32,32,30,150,150,150,150,35,33,33,32,4,3,3,3,3,2,32,30,150,150,35,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,30,150,150,150,150,153,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,30,150,150,35,32,32,31,32,33,32,4,3,2,1,33,32,210,32,4,4,3,3,73,74,74,74,74,74,75,2,32,210,3,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,32,30,150,150,35,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,2,210,32,73,74,74,74,74,75,3,3,3,2,1,4,3,210,3,4,3,73,74,121,121,121,121,121,121,121,2,3,210,3,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,3,2,210,32,4,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,2,210,3,121,121,121,121,121,121,74,75,3,2,2,3,3,210,3,4,73,121,121,121,121,121,121,121,121,121,75,3,210,3,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,1,3,2,210,3,4,169,121,121,121,122,124,121,121,121,121,121,121,121,121,121,168,2,210,3,121,121,121,121,121,121,121,121,3,2,2,3,3,210,3,4,121,121,121,121,121,121,121,121,121,121,121,3,210,3,4,121,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,2,3,2,210,3,3,150,152,169,121,121,121,121,121,121,121,121,121,121,121,121,151,1,211,2,121,121,121,121,121,121,121,168,3,2,2,3,3,210,3,4,169,121,121,121,121,121,121,121,121,121,121,3,210,3,4,169,121,121,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,168,2,3,2,210,3,15,150,150,153,121,121,121,121,121,121,121,121,121,121,121,121,151,1,3,2,169,121,121,121,168,152,152,150,10,11,2,3,3,210,3,3,153,121,121,121,121,121,121,121,121,121,168,3,210,3,15,150,152,169,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,2,3,2,210,3,150,150,35,33,169,121,121,121,121,121,121,121,121,121,121,168,150,10,12,14,150,101,101,152,150,150,150,150,150,157,10,12,12,210,12,15,153,121,121,121,121,121,121,121,121,121,151,10,210,15,150,150,150,153,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,10,12,2,210,3,33,32,15,150,150,152,152,169,121,121,121,121,121,168,152,150,150,150,150,150,150,101,101,150,150,150,150,150,150,150,150,150,150,150,150,150,35,121,121,121,121,121,121,121,121,121,30,150,150,150,150,150,150,153,121,121,121,121,121,121,121,121 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,151,150,157,10,210,15,150,150,150,150,150,150,150,150,152,152,152,152,152,150,150,150,150,150,150,150,150,101,101,150,150,150,150,150,150,150,150,150,150,150,150,179,4,169,121,121,121,121,121,121,121,121,2,150,150,150,150,150,150,153,121,121,121,121,121,121,168,169 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,30,150,150,150,150,150,150,150,150,35,32,32,33,32,32,33,33,32,32,31,30,150,150,150,150,150,150,35,31,30,150,35,32,33,32,30,150,150,150,150,150,35,15,153,121,121,121,121,121,121,121,168,2,30,150,150,150,150,150,35,169,121,121,121,121,121,151,150 +121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,2,32,30,150,150,150,35,32,32,4,3,3,3,3,73,74,74,74,72,2,1,31,30,150,150,150,35,4,2,2,210,3,12,13,11,1,32,33,32,33,33,3,150,153,121,121,121,121,121,121,121,151,2,2,33,32,210,32,33,4,153,121,121,121,121,121,30,150 +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,2,3,2,32,32,33,4,3,3,4,3,70,71,71,120,120,120,120,120,2,1,2,1,32,32,210,3,4,2,2,210,15,150,150,157,10,3,4,3,4,4,15,150,35,120,120,120,120,120,120,120,30,10,2,4,3,210,3,4,4,150,169,121,121,121,121,2,33 +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,2,3,2,3,3,4,4,3,3,3,70,119,119,119,119,119,119,119,119,72,1,2,1,3,3,210,3,4,2,1,210,30,150,150,35,31,3,4,2,4,4,32,33,4,119,119,119,119,119,119,119,2,32,2,4,3,210,3,4,3,150,153,120,120,120,120,2,4 +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,166,2,2,2,3,3,3,4,12,12,12,119,119,119,119,119,119,119,119,119,119,1,2,1,3,3,210,3,4,2,1,210,2,32,33,4,2,3,3,2,4,4,3,4,4,119,119,119,119,119,119,166,2,3,2,3,3,210,3,3,15,150,35,167,119,119,166,2,4 +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,151,10,11,2,2,3,12,15,150,150,150,152,167,119,119,119,119,119,119,119,166,1,11,1,3,3,210,3,3,2,11,210,2,3,3,4,11,3,2,2,3,4,12,13,3,167,119,119,119,119,119,151,10,12,2,3,3,210,3,3,31,32,4,153,119,119,151,2,4 +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,30,150,157,10,2,2,30,150,150,150,150,150,150,152,167,119,119,166,152,152,150,2,157,10,3,3,210,3,2,2,177,157,10,12,12,15,157,10,2,11,12,15,150,179,3,153,119,119,119,119,119,151,150,157,10,12,12,210,12,12,11,12,15,150,167,166,150,2,3 +118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,2,32,31,32,2,2,1,210,30,101,150,150,150,150,150,152,152,150,150,150,179,2,30,150,35,3,210,3,2,1,177,150,150,150,150,35,32,33,2,30,150,150,150,35,3,153,118,118,118,118,118,151,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,10,3 +117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,2,3,2,3,2,2,1,210,2,32,32,177,150,150,150,150,150,150,150,150,35,2,2,32,3,2,210,3,2,1,30,150,150,150,35,3,2,4,2,1,32,32,33,4,15,150,165,117,117,117,117,151,150,150,150,150,150,150,150,150,35,32,32,30,150,150,150,150,3 +117,117,117,117,117,117,117,117,117,117,117,117,117,117,194,185,185,185,195,117,194,2,3,2,3,21,220,1,210,2,3,3,30,150,150,150,35,32,32,32,32,14,10,2,3,12,2,210,2,1,1,2,32,32,32,4,3,21,23,2,1,3,3,4,4,150,150,153,117,117,117,117,30,150,150,150,150,150,150,35,33,4,3,2,2,33,33,32,30,10 +117,117,117,117,117,117,117,117,117,117,117,117,117,117,181,180,180,180,180,185,180,20,21,21,25,180,180,20,210,21,21,21,1,32,210,31,14,150,150,150,150,150,157,10,14,157,10,210,11,11,11,2,3,2,3,4,25,180,45,2,2,3,3,4,15,150,150,35,114,115,114,164,1,30,150,150,150,150,35,4,4,3,63,64,65,3,4,3,2,33 +114,117,114,115,114,114,117,117,114,115,115,114,117,114,40,180,180,180,180,180,180,180,180,180,180,180,180,180,180,100,180,189,1,3,210,2,177,150,150,150,150,150,150,150,150,150,150,150,150,150,157,10,12,11,3,25,180,45,4,2,2,2,3,15,150,35,32,4,116,116,116,154,1,2,32,210,32,32,3,4,4,63,116,116,116,2,3,3,2,4 +116,116,116,116,116,116,116,116,116,116,116,116,116,116,2,41,40,180,180,180,180,180,180,45,41,40,180,180,180,100,180,45,1,3,210,2,30,150,35,32,32,30,150,150,150,150,150,150,150,150,150,150,150,35,2,41,42,4,4,3,2,2,2,31,32,4,3,4,116,116,116,30,10,2,3,210,3,3,3,4,4,116,116,116,116,64,65,2,2,4 +116,116,116,116,116,116,116,116,116,116,116,116,116,116,2,1,2,210,42,41,41,42,42,4,2,2,43,43,210,42,42,4,10,2,210,2,2,32,4,3,3,2,32,210,32,32,32,32,33,33,32,33,32,3,2,2,3,4,4,3,2,2,2,2,3,4,3,4,116,116,116,1,32,2,3,210,2,3,3,4,4,116,116,116,116,116,116,65,3,3 +116,116,116,116,116,116,116,116,116,116,116,116,116,116,1,10,11,210,12,11,11,12,12,12,11,2,4,4,210,3,12,15,179,2,210,2,2,3,4,3,3,2,3,210,3,3,3,3,4,3,3,4,3,3,3,2,3,4,4,3,2,3,2,3,12,12,12,15,163,116,162,10,12,2,3,210,2,3,15,3,4,116,116,116,116,116,116,116,3,3 +116,116,116,116,116,116,116,116,116,116,116,116,116,192,1,177,150,150,150,150,150,150,150,150,157,10,4,3,210,3,30,150,35,2,210,2,2,3,4,3,3,2,11,210,3,221,222,3,13,12,12,13,12,15,3,2,3,4,4,3,2,3,2,15,150,150,150,150,150,155,150,150,157,10,12,210,11,15,179,3,4,163,116,116,116,116,116,116,2,3 +116,116,116,116,111,110,116,116,116,116,116,116,116,184,1,30,150,150,35,32,30,150,150,150,150,150,3,3,211,2,1,32,4,21,210,21,2,3,3,22,22,2,177,150,101,150,150,101,150,150,150,150,150,179,3,2,3,4,3,3,2,12,2,32,210,30,150,150,34,31,30,150,150,150,150,150,150,150,179,2,3,156,116,116,116,111,110,162,2,3 +110,111,110,111,113,112,116,116,111,110,130,111,110,184,20,2,210,32,4,3,1,32,30,150,150,35,3,3,22,2,1,3,3,180,180,180,20,22,25,100,100,20,177,150,101,150,150,101,150,150,150,150,150,35,3,2,3,3,3,3,2,157,10,12,210,2,32,33,63,64,1,210,30,150,150,150,150,150,179,2,3,35,131,130,111,112,112,154,2,3 +113,112,113,112,112,112,110,111,112,113,113,190,185,180,180,2,211,3,4,22,21,22,2,32,210,3,22,25,180,20,21,22,25,180,180,180,180,180,180,180,180,180,30,150,150,150,150,150,150,150,150,150,35,4,3,2,2,3,3,2,2,30,150,150,157,10,12,15,131,130,1,210,1,210,30,150,150,150,35,2,2,4,113,112,113,113,113,30,10,2 +113,113,113,113,112,113,112,190,185,185,185,180,180,180,180,20,21,22,25,100,100,180,20,22,210,25,180,180,180,100,90,91,180,180,180,180,180,180,180,180,180,180,2,32,33,32,210,32,33,32,32,33,4,4,3,2,2,3,2,2,2,1,30,150,150,150,150,156,112,112,1,210,1,210,2,210,32,210,4,2,2,3,113,113,113,113,113,2,33,2 +113,113,113,113,113,113,113,184,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,90,95,93,180,180,180,180,180,180,180,180,180,180,20,22,23,22,210,22,23,3,3,3,4,4,2,2,2,2,2,2,2,1,2,32,30,150,150,35,113,113,1,210,2,210,2,210,3,210,4,1,2,3,113,113,113,113,113,2,4,2 +191,113,113,113,113,113,113,40,180,180,180,180,180,180,180,180,180,180,180,100,100,180,180,180,180,180,180,180,180,92,93,180,180,180,180,180,180,180,180,100,100,180,180,180,180,100,180,100,189,3,3,3,4,3,21,21,21,220,21,21,2,1,2,3,2,210,32,4,113,160,1,210,2,210,2,210,3,210,3,1,2,2,191,113,113,113,190,2,3,2 +180,185,191,113,113,113,190,1,42,41,41,40,45,42,40,180,180,180,45,42,42,41,41,42,42,41,40,180,180,100,100,180,180,180,45,41,41,42,42,41,40,180,180,180,180,180,180,180,45,3,3,3,3,25,180,90,91,180,90,91,20,1,2,3,2,210,2,3,155,179,1,210,2,210,2,210,3,210,3,1,2,24,180,185,185,185,180,20,3,2 +180,180,186,113,113,113,184,2,3,2,1,2,4,3,2,210,42,43,3,3,3,2,2,3,2,1,2,42,42,42,42,42,42,42,4,2,2,3,3,2,1,187,180,180,180,45,42,42,4,3,2,3,90,91,90,95,93,180,92,94,91,1,2,2,2,210,2,15,150,34,1,210,1,210,2,210,2,210,3,1,2,187,180,180,180,180,180,180,2,2 +90,91,186,113,113,113,184,2,2,21,21,2,4,3,2,210,3,4,3,3,3,2,2,21,21,21,2,3,3,3,3,3,2,3,4,2,2,3,3,2,1,187,180,180,189,2,2,3,4,3,2,2,92,94,95,94,91,180,180,92,93,20,21,2,2,210,2,32,31,1,2,211,2,211,2,210,2,210,2,1,2,187,180,180,180,180,180,180,20,2 +95,94,91,113,113,113,184,1,2,187,180,20,25,3,2,210,3,4,2,3,3,2,1,40,180,180,20,21,22,2,2,3,2,2,3,11,11,12,12,11,1,40,180,180,45,2,2,3,3,15,2,2,187,92,93,92,93,180,180,180,180,180,180,20,21,210,21,22,21,1,2,2,2,2,2,210,2,210,2,1,1,40,180,180,180,180,180,180,45,2 +94,95,93,191,113,190,180,1,2,40,180,180,45,2,2,210,3,3,2,3,3,2,1,2,42,40,180,180,45,2,2,3,2,11,15,150,150,150,150,35,1,2,210,42,4,2,11,12,15,35,2,2,40,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,20,21,21,21,24,2,211,2,210,2,21,24,1,42,40,180,180,45,42,4,2 +95,94,91,180,185,180,180,20,21,1,42,42,4,21,2,210,3,21,21,22,22,21,21,2,3,1,42,42,4,2,2,2,2,30,150,150,150,35,32,4,1,2,210,2,4,2,177,150,179,3,2,2,1,40,180,180,180,180,180,180,180,180,180,180,90,91,180,180,180,180,180,180,180,189,2,21,21,210,24,180,180,1,3,2,210,41,4,3,4,2 +93,92,93,100,100,180,180,180,180,20,22,22,25,180,20,210,25,180,180,180,180,180,180,20,21,1,2,3,4,2,11,11,11,1,32,32,32,4,11,15,10,2,210,2,3,2,30,150,35,3,2,2,1,1,187,180,180,90,91,90,91,180,180,90,95,94,91,180,180,180,180,180,180,45,24,180,180,100,180,180,180,2,3,2,210,2,3,2,4,2 +170,180,180,180,180,180,180,180,180,100,100,180,180,180,100,180,100,180,180,180,180,180,180,180,180,20,2,3,3,2,30,150,157,10,11,11,11,15,150,150,157,10,210,11,2,2,2,32,4,3,2,2,1,1,40,180,180,92,93,92,93,180,180,92,94,95,93,180,45,41,41,42,43,4,180,180,180,180,180,180,180,20,22,21,210,21,21,2,3,2 +91,90,91,100,100,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,45,2,3,2,2,1,177,150,150,150,150,150,150,150,150,150,150,150,157,10,11,11,2,4,3,2,2,1,1,2,41,210,41,42,42,41,40,180,180,92,93,180,45,4,2,2,3,4,25,180,180,180,180,180,180,180,180,180,180,180,180,45,2,3,2 +94,95,94,91,180,180,180,180,180,100,100,180,180,180,180,180,180,180,180,180,180,180,45,210,42,3,2,3,2,2,1,30,150,150,150,150,150,35,32,32,32,32,30,150,150,150,35,2,3,3,2,2,1,1,2,2,210,2,3,3,2,1,40,180,180,45,42,4,4,2,2,3,2,40,180,180,45,41,40,180,180,180,180,180,180,45,4,2,3,2 +95,94,95,93,180,180,180,45,41,42,42,41,40,180,180,180,45,210,41,40,45,43,3,210,2,3,2,2,2,2,1,2,32,31,31,32,32,4,3,3,3,2,2,32,210,32,4,2,3,2,2,2,1,1,2,2,210,2,3,2,2,1,2,42,42,4,3,4,3,2,2,2,2,1,210,42,4,1,2,42,41,41,43,41,43,4,4,2,3,1 +94,95,94,91,180,45,43,4,2,3,3,2,1,42,40,45,3,210,2,2,2,4,3,210,2,3,2,2,2,2,1,2,3,2,2,3,3,4,3,3,3,2,2,2,210,2,4,2,3,2,21,21,21,1,2,2,210,2,2,2,2,1,2,3,3,4,2,3,3,2,2,2,2,1,210,3,3,1,1,3,2,2,3,2,3,4,3,2,3,1 +95,94,95,93,189,3,3,4,2,3,3,2,1,3,1,2,3,210,1,2,2,3,3,210,2,3,2,21,24,180,20,21,3,2,2,3,2,3,3,2,2,2,2,2,210,2,3,21,22,24,180,90,91,20,21,21,210,21,21,21,21,1,2,3,2,3,21,22,22,21,21,21,21,1,210,2,3,21,1,3,2,2,2,1,2,2,3,2,3,1 +94,95,93,180,189,2,3,4,2,3,3,2,1,2,1,2,3,210,1,2,2,3,21,210,21,25,2,40,180,180,180,45,2,2,2,2,2,3,21,21,21,21,21,21,210,21,24,180,90,91,90,95,94,91,90,91,180,90,91,90,91,20,21,22,21,25,180,180,180,180,180,180,180,20,210,21,25,180,20,21,21,21,21,1,2,2,3,21,25,1 +95,94,91,180,189,2,3,3,2,3,3,21,1,2,1,2,3,211,1,2,2,25,180,180,180,45,1,1,41,40,45,4,20,21,21,21,21,24,90,91,90,91,90,91,180,90,91,90,95,93,92,93,92,93,92,93,180,92,93,92,93,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,90,91,90,91,180,20,21,21,25,180,189,1 +94,95,94,91,189,1,3,3,21,22,25,180,20,21,1,2,3,21,1,1,2,187,180,180,189,3,1,1,1,2,4,4,187,180,180,180,180,180,92,93,92,94,95,93,180,92,93,92,93,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,92,94,95,93,180,180,180,180,180,180,189,2 +92,93,92,93,45,1,22,24,180,180,180,180,180,180,20,21,25,180,20,1,2,210,40,180,45,3,1,1,1,2,4,3,40,180,180,180,180,180,180,180,180,92,93,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,90,95,94,91,180,180,180,180,180,180,45,2 +180,180,45,41,4,24,180,180,180,180,180,180,180,180,180,180,180,180,180,20,21,210,2,42,4,2,2,1,1,2,3,3,2,210,40,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,90,91,180,180,180,180,180,180,180,180,180,180,180,180,180,90,91,90,91,90,91,180,180,90,95,94,95,93,180,180,180,180,180,189,4,2 +41,41,3,2,4,180,180,180,180,45,41,41,40,180,180,180,180,180,180,180,180,180,20,3,3,2,21,220,1,2,3,21,21,210,1,41,42,41,40,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,92,93,180,180,180,180,180,180,180,180,180,180,90,91,90,95,94,95,94,95,94,91,90,95,94,95,94,91,180,180,180,180,180,189,4,2 +11,11,14,2,3,100,45,41,41,3,2,1,2,41,40,180,180,180,180,180,180,180,45,2,2,1,187,180,20,2,25,180,180,180,20,2,3,2,1,41,40,180,180,180,180,180,180,180,180,90,91,180,180,180,180,180,180,180,180,180,180,90,91,90,91,90,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,91,90,91,90,91,189,4,1 +150,150,34,2,3,180,3,2,1,3,1,1,2,1,2,42,42,41,41,41,42,43,4,2,2,1,40,180,180,180,180,180,180,180,45,2,3,2,1,2,1,41,42,41,40,180,90,91,90,95,94,91,180,180,180,180,180,180,90,91,90,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,91,3,1 +32,32,1,2,24,180,3,1,1,2,1,1,2,1,2,3,3,2,1,2,3,3,4,3,2,1,2,41,41,42,42,41,42,43,2,2,2,2,1,2,1,2,3,2,2,90,95,94,95,94,95,94,91,90,91,90,91,90,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,94,95,95,3,1 diff --git a/intra/source/csv/CLIFF_BG2.csv b/intra/source/csv/CLIFF_BG2.csv new file mode 100644 index 0000000..a8f2ba8 --- /dev/null +++ b/intra/source/csv/CLIFF_BG2.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/CROWD_BG.csv b/intra/source/csv/CROWD_BG.csv new file mode 100644 index 0000000..8c58434 --- /dev/null +++ b/intra/source/csv/CROWD_BG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,1,2,2,2,2,2,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,1,60,60,60,60,60,5,2,2,2,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,1,60,60,60,60,60,60,60,60,60,5,2,2,2,7,12,12,12,12,1,2,2,2,7,12,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,2,2,2,2,2,2,2,21,21,21,21,21,21,21,70,21,81,81,82,60,5,2,2,2,2,3,60,60,60,2,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,90,49,92,60,60,60,60,60,60,60,60,60,60,60,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,15,13,13,13,14,60,15,13,13,13,13,14,60,60,90,49,92,60,60,60,15,14,60,60,80,81,81,81,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,1,60,60,90,49,92,60,60,60,7,1,81,81,49,49,49,49,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,81,81,7,12,12,12,1,60,7,12,12,12,12,12,14,81,49,49,92,60,60,15,12,12,14,49,49,49,49,49,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,12,12,14,49,49,92,60,15,12,12,12,12,14,60,60,60,60,7,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,12,12,12,13,13,13,13,12,12,12,12,12,12,14,60,15,13,12,12,12 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,1,2,2,2,2,2,2,2,2,7,1,2,2,3,60,8,2,2,2,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,60,60,60,60,8,60,60,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,4,80,7,12,12,12,1,60,7,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,60,60,80,81,8,60,9,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,60,60,7,12,12,12,1,60,7,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,60,60,90,9,3,60,8,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,1,81,81,2,2,2,2,2,60,2,2,2,2,2,2,60,60,60,60,60,60,60,60,7,1,60,60,60,8,60,60,8,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,1,2,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,7,1,60,60,60,8,60,9,3,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,1,60,60,60,15,13,13,13,14,60,15,13,13,13,13,14,60,60,60,60,60,60,60,60,7,1,81,81,81,8,81,8,81,81,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,1,60,60,60,7,12,12,12,1,60,7,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,60,60,60,18,60,8,60,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,14,60,60,7,12,12,12,1,60,7,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,60,60,60,60,60,8,60,60,7 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,13,13,12,12,12,12,1,60,7,12,12,12,12,12,13,13,14,60,60,15,13,13,12,12,13,13,13,13,13,1,60,15,12 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,1,5,7,12,12,1,2,2,2,2,2,2,0,2,2,2,8,2,7,0,0,0,0,0,0,0,0,0,0,25,25,23,23,23,25,26,25,23,25,0,0,0,0,0,0,0,0,0,0,1,2,2,2,60,2,2,2,2,7,1,2,2,2,60,60,2,2,2,7,12,1,2,2,2,2,3,60,5,7 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,2,2,2,3,60,5,7,12,1,60,60,60,60,60,60,60,60,60,60,8,60,7,0,0,0,0,0,0,0,0,0,0,25,28,130,28,23,25,25,23,28,23,0,0,0,0,0,0,0,0,0,0,1,82,60,60,60,60,60,80,81,7,1,60,60,60,60,60,60,60,60,7,1,3,60,60,60,60,60,60,60,7 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,60,60,60,60,60,7,12,1,60,15,13,14,60,60,60,60,60,60,18,60,7,0,0,0,0,0,0,0,0,0,0,23,110,110,131,27,28,28,29,110,23,0,0,0,0,0,0,0,0,0,0,1,92,60,60,60,60,60,60,90,7,1,60,60,60,60,60,60,60,60,7,1,60,60,9,60,60,9,60,60,7 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,15,14,22,22,22,7,12,1,60,7,12,1,60,4,4,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,23,34,110,110,110,110,110,110,35,23,0,0,0,0,0,0,0,0,0,0,12,13,14,60,60,60,60,60,90,7,1,81,81,81,81,81,81,81,81,7,1,60,60,8,21,21,8,60,60,7 +0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,1,60,7,1,30,30,30,7,12,1,60,7,12,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,23,23,33,33,33,33,140,33,26,23,0,0,0,0,0,0,0,0,0,0,1,2,2,60,60,60,60,60,60,7,1,49,49,49,49,49,49,49,49,7,1,60,60,8,83,84,8,60,60,7 +0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,1,60,7,1,60,60,60,20,20,20,60,7,12,1,60,60,60,60,60,4,4,60,7,0,0,0,0,0,0,0,0,0,0,23,23,25,23,23,25,140,25,25,23,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,15,13,12,1,49,49,49,49,49,49,49,49,7,1,60,60,8,93,94,8,60,60,7 +0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,1,60,7,1,60,60,60,30,30,30,60,7,12,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,28,23,25,23,130,28,140,28,28,29,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,2,2,7,1,49,49,49,49,49,49,49,49,7,1,60,60,7,13,13,1,60,60,7 +0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,1,60,7,1,60,60,60,60,60,60,60,7,12,1,60,4,4,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,131,27,28,29,110,110,110,110,110,35,0,0,0,0,0,0,0,0,0,0,1,82,60,60,60,60,60,60,60,2,2,4,4,60,60,60,60,60,60,7,1,60,60,2,2,2,2,60,60,7 +0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,1,60,7,1,60,60,60,15,13,13,13,12,12,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,34,110,110,110,110,110,110,35,33,23,0,0,0,0,0,0,0,0,0,0,1,49,82,60,113,60,60,60,60,60,60,60,60,60,60,60,60,60,60,7,1,60,60,60,60,60,60,60,15,12 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,7,12,14,60,15,12,12,12,12,12,12,1,60,60,22,22,22,22,22,22,7,0,0,0,0,0,0,0,0,0,0,23,33,33,33,33,33,33,26,23,23,0,0,0,0,0,0,0,0,0,0,12,13,13,14,110,15,13,14,60,15,13,13,13,13,13,13,13,13,13,12,12,13,13,13,13,13,14,60,7,12 +12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,60,7,1,2,60,8,2,2,2,2,2,7,1,60,64,20,20,20,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,7,12,12,12,12,12,12,12,1,2,2,2,2,2,2,2,2,2,60,7,12 +1,2,7,12,12,12,12,12,12,12,12,1,2,2,2,2,2,2,60,7,1,60,60,8,82,60,60,60,80,7,1,60,64,30,20,20,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,7,12,12,12,12,12,12,12,1,60,60,60,60,60,60,60,60,60,60,7,12 +1,60,7,12,12,12,12,12,12,12,12,1,60,60,60,91,60,60,60,7,1,60,60,8,60,60,60,60,60,7,1,60,64,66,30,111,30,30,30,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,2,2,2,2,2,2,2,2,2,70,21,21,21,21,15,13,13,13,13,12,12 +1,60,2,2,2,2,2,2,7,12,12,1,81,81,15,13,13,13,13,12,1,60,60,7,14,60,60,60,60,7,1,22,22,66,4,112,60,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,7,12,12,12,12,12,12 +1,60,60,91,60,60,91,60,7,12,12,1,60,60,7,1,2,2,2,2,2,60,60,2,8,60,60,60,60,7,1,30,30,66,4,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12 +1,60,15,13,13,13,14,60,7,12,12,1,60,60,8,2,60,60,60,60,60,60,60,60,2,60,60,60,60,7,1,60,64,22,4,60,60,4,4,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +1,60,7,12,12,12,1,60,7,12,12,1,60,60,8,60,60,15,13,13,14,21,21,21,21,60,60,60,60,7,1,22,22,60,4,60,4,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +12,13,1,2,2,2,2,60,2,2,2,2,81,81,8,60,15,12,12,12,1,60,4,60,60,60,60,60,15,12,1,30,30,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +12,12,1,60,60,60,60,60,60,60,60,60,60,60,8,60,7,12,12,12,1,60,60,60,60,60,60,60,7,12,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +12,12,1,60,15,13,13,13,13,13,13,13,13,13,1,60,7,12,12,12,12,13,13,14,60,15,13,13,12,12,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12 +1,2,18,60,2,2,2,2,2,7,1,2,2,2,2,60,2,2,2,7,1,2,2,2,60,2,2,2,2,7,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,15,13,14,132,15,14,49,49 +1,60,91,60,60,60,80,82,60,7,1,60,60,60,60,60,60,60,80,7,1,82,60,60,60,60,60,60,80,7,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,2,2,2,112,2,2,49,49 +1,60,90,81,81,81,49,92,60,7,1,60,60,80,81,81,81,81,49,7,1,49,82,60,60,60,60,80,49,7,1,60,15,13,13,13,13,14,60,7,0,0,0,0,0,0,0,0,0,0,12,1,2,2,2,2,2,2,2,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,81,82,60,60,80,81,49,49 +1,60,90,49,49,49,49,92,60,7,1,81,81,49,49,49,49,49,49,7,1,49,92,60,60,60,60,90,49,7,1,60,7,1,18,18,7,1,60,7,0,0,0,0,0,0,0,0,0,0,1,3,81,81,81,81,81,81,81,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,92,60,60,90,92,60,4,60,60,4,4,90,49 +1,60,90,49,49,49,49,92,60,2,2,49,49,49,49,49,92,60,90,7,1,49,92,60,60,60,60,90,49,7,1,60,7,1,83,84,7,1,60,7,0,0,0,0,0,0,0,0,0,0,1,81,49,92,60,60,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,92,60,60,90,92,60,60,60,60,60,60,90,49 +1,60,90,49,49,49,49,92,60,60,60,90,49,49,49,49,49,81,49,7,1,49,92,4,60,60,60,90,49,7,1,60,7,1,93,94,7,1,60,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,81,81,49,49,81,82,60,60,80,81,49,49 +1,60,100,60,90,92,60,100,60,15,14,60,90,49,49,49,92,60,90,7,1,49,92,60,60,60,60,90,49,7,1,60,18,18,60,60,18,18,60,7,0,0,0,0,0,0,0,0,0,0,1,60,60,100,60,60,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,49,92,60,60,90,49,49,49 +1,60,100,60,90,92,60,100,60,7,1,81,49,49,49,49,49,81,49,7,1,49,92,60,60,60,4,90,49,7,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,60,80,92,60,60,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,49,92,60,60,90,49,49,49 +1,60,100,60,60,60,60,100,60,7,1,49,49,49,49,92,60,60,60,7,1,92,60,60,60,60,60,60,90,7,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,60,90,49,81,82,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,49,49,49,92,60,60,90,49,49,49 +12,13,13,13,13,13,13,13,13,12,12,13,13,13,13,14,60,15,13,12,12,13,13,14,60,60,15,13,13,12,12,13,13,14,60,60,15,13,13,12,0,0,0,0,0,0,0,0,0,0,1,60,90,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49,49,49,49,49,49,13,13,13,14,60,60,15,13,13,13 +1,2,2,2,2,8,20,20,20,7,1,2,2,2,2,3,60,5,2,7,12,12,1,2,60,60,2,7,12,12,12,12,12,1,60,60,5,2,7,12,12,12,1,2,2,8,2,2,7,12,1,60,90,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,1,60,60,7,12,12,12 +1,60,60,60,60,20,30,30,30,20,20,82,60,91,60,60,60,60,60,7,12,12,1,82,60,60,80,7,12,12,12,1,2,3,60,60,60,4,5,7,12,1,3,60,60,5,80,81,5,7,1,60,90,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,2,2,60,60,2,2,7,12 +1,60,60,9,22,20,60,60,60,30,30,92,60,100,60,60,60,60,4,7,12,12,1,92,60,60,90,2,2,7,12,1,4,60,60,60,60,60,60,7,1,3,60,60,4,80,49,49,82,7,1,81,49,49,49,92,60,80,49,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,8,30,30,60,60,60,60,60,100,60,100,60,60,60,60,60,2,2,2,2,92,60,60,90,81,81,7,12,1,60,60,60,60,60,60,60,7,1,60,60,60,60,60,90,49,92,5,3,60,90,49,49,49,81,49,49,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,8,60,60,60,60,60,60,60,100,60,90,81,82,60,60,60,60,60,60,60,100,60,60,60,60,60,2,2,3,60,60,60,60,60,60,60,5,3,60,60,60,60,60,60,60,60,60,60,60,90,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,7,13,13,13,13,13,13,14,92,60,90,49,92,60,60,60,15,14,81,81,92,60,80,82,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,15,13,13,14,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,18,18,18,18,18,18,7,1,92,60,100,60,60,60,60,60,7,1,49,49,92,60,90,49,81,81,15,13,14,60,60,60,60,60,60,15,13,14,81,81,81,82,60,60,60,60,7,12,12,1,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,60,60,60,60,60,60,7,1,92,60,100,60,60,60,60,4,7,1,49,49,49,81,49,49,49,49,7,12,12,14,60,60,60,60,60,7,12,1,49,49,49,49,82,60,60,60,7,12,12,1,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +1,60,60,60,60,60,60,60,60,7,1,92,60,100,60,60,60,60,60,7,1,49,49,92,60,60,60,90,49,7,12,12,12,14,60,60,15,13,12,12,1,49,49,49,49,49,82,60,60,8,20,20,20,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,60,60,60,60,60,60,7,12 +12,13,13,13,13,13,13,14,60,7,12,13,13,13,13,13,13,13,13,12,12,13,13,14,60,60,60,15,13,12,12,12,12,1,60,60,7,12,12,12,12,13,13,13,13,13,14,60,60,8,20,20,20,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,4,4,60,60,4,4,7,12 +1,2,2,2,2,2,2,2,60,7,1,2,2,2,2,2,2,2,2,7,1,20,20,20,60,60,60,7,12,12,1,2,8,3,60,60,5,2,2,7,1,2,2,2,2,2,3,60,60,8,30,30,30,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,3,3,3,3,7,0,0,0,0,0,0,0,0,0,0,1,2,4,4,60,60,4,4,2,7 +1,60,60,91,60,60,60,60,60,7,1,60,80,81,81,81,82,60,60,7,1,30,30,30,60,60,60,20,20,7,20,60,8,60,60,60,60,60,60,7,1,4,60,60,60,60,60,60,60,8,81,81,81,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,4,60,4,60,60,7,0,0,0,0,0,0,0,0,0,0,1,4,4,4,60,60,4,4,4,7 +1,60,60,15,14,60,60,60,60,7,1,60,90,49,49,49,49,82,60,7,1,81,81,81,82,60,60,30,30,20,30,60,2,9,60,60,60,60,60,7,1,60,60,60,15,13,13,13,13,1,49,49,49,49,49,92,60,60,90,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,4,60,4,60,60,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7 +1,60,60,5,2,4,91,15,13,12,1,81,49,49,49,49,49,92,60,30,30,49,49,49,49,81,81,81,81,30,60,60,60,8,60,60,60,60,60,7,1,21,21,21,7,12,12,12,12,1,49,92,60,60,60,100,60,60,90,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,81,60,60,60,60,60,60,81,7 +1,60,60,60,60,4,60,7,12,12,1,49,49,49,49,49,49,92,60,60,60,60,60,90,49,49,49,49,92,60,60,60,60,8,60,60,60,4,60,7,1,60,60,60,20,20,20,20,20,8,49,92,60,60,60,100,60,60,90,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,49,60,60,60,60,60,60,49,7 +1,60,60,91,60,4,4,7,12,12,1,49,49,49,49,49,49,49,81,7,1,60,60,90,49,49,49,49,92,60,60,60,60,8,60,60,60,60,60,7,1,21,21,21,20,20,20,20,20,8,49,49,81,81,81,49,81,81,49,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,49,60,60,60,60,60,60,49,7 +1,60,60,4,4,4,4,5,5,7,1,49,49,49,49,49,49,49,49,7,1,81,81,49,49,49,49,49,49,15,14,4,4,18,60,60,60,60,60,7,1,60,60,60,30,30,30,30,30,8,49,92,60,60,90,49,49,49,49,7,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,49,60,60,60,60,60,60,49,7 +1,60,60,4,4,60,60,60,60,7,1,60,90,49,49,49,49,49,49,7,1,49,49,49,49,49,49,49,49,5,1,81,82,60,60,4,60,60,60,7,1,60,60,60,91,60,60,60,60,5,49,92,60,60,90,49,15,13,13,12,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,49,60,60,60,60,60,60,49,7 +1,60,60,91,60,60,60,60,60,7,1,60,60,60,60,100,60,60,60,7,1,49,92,60,60,60,60,90,49,81,1,49,92,60,60,60,60,60,60,7,1,60,60,60,100,60,60,60,60,60,60,100,60,60,90,49,7,12,12,12,0,0,0,0,0,0,0,0,0,0,1,60,60,60,60,60,60,60,60,7,0,0,0,0,0,0,0,0,0,0,1,49,81,81,81,81,81,81,49,7 +12,13,13,13,13,13,13,14,60,7,12,13,13,14,60,60,15,13,13,12,1,49,92,60,60,60,60,90,49,49,12,13,13,14,60,60,15,13,13,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,0,0,0,0,0,0,0,0,0,0,1,60,15,13,13,13,13,13,13,12,0,0,0,0,0,0,0,0,0,0,12,13,13,14,60,60,15,13,13,12 +12,12,12,12,12,12,12,1,60,7,1,2,2,3,60,60,5,2,2,7,1,49,92,60,60,60,60,90,49,49,1,2,2,3,60,60,5,7,12,12,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,1,3,3,3,3,3,3,3,3,7,1,60,3,3,3,3,3,3,3,7,0,0,0,0,0,0,0,0,0,0,1,2,2,2,60,60,2,2,120,7 +12,12,12,12,12,12,12,1,60,7,1,81,81,82,60,60,60,80,81,7,1,49,92,60,60,60,60,90,49,49,1,60,60,60,60,60,60,20,20,7,1,80,81,81,82,60,60,60,60,60,60,60,80,81,81,81,81,82,60,7,1,60,60,91,60,60,91,60,60,7,1,60,100,60,100,60,100,60,100,7,0,0,0,0,0,0,0,0,0,0,1,81,81,82,60,60,91,4,60,7 +12,12,12,12,12,12,12,1,60,7,1,49,49,49,81,81,81,92,60,7,1,49,49,81,82,60,80,49,49,15,1,21,21,21,70,70,21,30,30,7,1,60,60,60,60,60,4,60,60,60,60,60,90,49,49,49,49,92,4,7,1,60,91,4,81,81,4,82,60,7,1,60,100,60,100,60,100,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,49,81,81,49,82,60,7 +12,12,12,12,12,12,12,1,60,5,3,49,49,49,49,49,49,92,60,5,5,49,49,49,49,81,49,49,15,12,1,60,60,60,60,60,60,80,82,7,1,60,80,81,81,4,91,4,60,60,60,60,90,49,49,49,49,92,4,7,1,80,49,4,60,60,4,49,82,7,1,60,100,60,90,81,92,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,100,60,60,7 +12,12,12,12,12,12,12,1,60,60,60,60,90,49,49,49,92,60,60,60,60,60,90,49,49,49,49,49,5,7,1,60,60,60,60,60,60,90,92,7,1,60,60,60,60,60,60,80,81,81,82,60,90,49,49,49,49,92,60,7,1,60,90,4,81,81,4,92,60,7,1,60,90,81,49,49,92,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,90,81,81,7 +12,12,12,12,12,12,12,1,60,60,60,60,60,90,49,49,92,60,60,60,60,60,90,49,49,49,92,60,60,7,1,60,60,60,4,4,60,90,92,7,1,80,81,81,81,82,60,90,49,49,92,60,90,49,49,49,49,92,60,7,1,80,49,4,60,60,4,49,82,7,1,81,49,49,92,60,90,81,92,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,90,49,49,7 +12,12,12,12,12,12,12,12,13,13,14,60,60,60,100,60,60,60,60,15,14,81,49,49,49,49,92,60,60,7,12,14,60,60,60,60,60,60,15,12,1,90,49,49,49,92,60,90,49,49,92,60,90,49,49,49,49,92,60,7,1,60,90,4,60,60,4,92,60,7,1,49,92,60,100,60,100,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,90,49,49,7 +12,12,12,12,12,12,12,12,12,12,1,60,60,60,60,60,60,60,60,7,1,49,49,49,49,92,60,60,60,7,1,2,60,60,60,60,60,60,2,7,1,60,60,60,60,100,60,90,49,49,92,60,90,49,49,49,49,92,60,2,2,60,90,4,4,4,4,92,60,2,2,60,100,60,100,60,100,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,92,60,60,90,49,49,7 +12,12,12,12,12,12,12,12,12,12,1,81,81,81,81,81,81,81,81,7,1,49,49,49,92,60,60,60,60,7,1,60,60,60,114,115,60,60,60,7,1,60,60,60,113,100,60,90,49,49,92,60,90,49,49,49,49,92,60,60,60,60,60,60,60,60,60,60,60,60,60,60,100,60,100,60,100,60,100,7,0,0,0,0,0,0,0,0,0,0,1,49,49,49,81,81,49,49,49,7 +12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,12,12,13,13,13,13,13,13,13,13,12,12,13,13,14,110,110,15,13,13,12,12,13,13,14,110,15,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,0,0,0,0,0,0,0,0,0,0,12,13,13,13,13,13,13,13,13,16 diff --git a/intra/source/csv/CROWD_BG2.csv b/intra/source/csv/CROWD_BG2.csv new file mode 100644 index 0000000..9cccf5d --- /dev/null +++ b/intra/source/csv/CROWD_BG2.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,47,47,0,0,0,0,0,0,0,0,46,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,46,46,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,46,46,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,46,46,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,46,46,0,0,0,0,0,47,47,47,47,47,47,47,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,45,45,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,47,47,47,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,47,45,45,45,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,46,0,0,0,0,47,45,45,45,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,46,0,0,0,0,0,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,47,47,47,47,47,47,45,0,0,0,0,0,46,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,47,47,45,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/CROWD_FG.csv b/intra/source/csv/CROWD_FG.csv new file mode 100644 index 0000000..90d167d --- /dev/null +++ b/intra/source/csv/CROWD_FG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/DEBUG_BG.csv b/intra/source/csv/DEBUG_BG.csv new file mode 100644 index 0000000..0a04c5a --- /dev/null +++ b/intra/source/csv/DEBUG_BG.csv @@ -0,0 +1,100 @@ +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +1,2,2,2,2,2,2,2,2,2,10,10,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,3,3,3,3,3,3,3,3,3,3,3,3,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,2,2,2,2,2,2,2,2,2,10,9,8,10,12,10,10,10,10,10,10,10,10,9,9,9,9,10,10,10,3,3,3,9,9,9,3,3,3,3,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,2,2,2,2,2,2,2,2,2,10,10,10,13,10,10,15,13,10,10,10,9,9,9,9,9,9,10,10,10,1,3,3,3,3,3,3,3,3,3,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,1,1 +1,2,2,2,2,2,2,2,2,2,10,10,10,10,14,10,10,10,10,10,10,9,9,9,9,9,9,10,10,10,3,3,3,3,3,9,9,9,3,3,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,1,1 +1,1,2,1,1,2,2,1,2,1,10,10,4,10,10,5,7,10,10,10,10,10,10,10,10,10,10,10,10,10,1,3,3,3,3,3,3,3,3,3,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,2,2,2,2,2,2,2,2,1,10,10,6,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,3,3,3,9,9,3,3,3,3,1,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,2,2,2,2,2,2,2,2,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,3,3,3,3,3,3,3,3,1,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,2,2,2,2,2,2,2,2,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,3,3,3,3,3,3,3,3,1,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,2,1,1,1,1,1,1,1,10,15,12,10,13,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,10,10,10,10,10,10,10,10,1,1,1,1,1,10,10,1,1,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,36,36,36,36,1,1,1,1,1,1,1,1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,10,10,1,1,1,1 +1,10,10,10,10,10,10,10,10,10,10,17,18,18,10,10,36,36,36,36,2,2,2,2,2,2,2,2,2,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,17,10,19,10,10,10,10,10,10,10,10,17,20,20,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,16,16,19,10,10,10,10,10,10,10,10,17,20,20,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,17,20,20,10,10,10,10,10,10,10,10,1,10,1,10,1,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,20,20,10,10,10,10,1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,1,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,20,20,10,10,1,17,18,18,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,17,1,19,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,16,16,19,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,10,10,1,1,1,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,1,10,1,10,10,10,1,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,7,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1 +1,10,10,10,10,10,10,10,10,10,10,1,0,1,1,1,10,1,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1 +1,10,9,9,9,9,9,9,10,10,10,1,10,10,10,1,10,1,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,47,47,47,47,47,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,9,9,9,9,9,9,10,10,10,1,10,10,10,1,10,1,10,10,1,10,10,10,10,10,10,7,10,10,10,10,10,47,47,47,47,47,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,9,9,9,9,9,9,10,10,10,1,10,10,10,1,10,1,10,10,1,10,10,10,10,10,10,7,7,10,10,10,10,47,47,47,47,47,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,6,10,10,10,10,10,1 +1,10,9,9,9,9,9,9,10,10,10,1,1,1,10,10,10,1,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,20,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,10,10,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,1,20,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,1,1,1 +1,1,20,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,1,1,1 +1,9,17,9,9,9,9,9,9,1,1,18,18,18,18,18,18,18,18,20,20,17,17,17,17,17,17,17,9,1,1,9,9,9,9,9,9,9,10,20,20,20,20,20,20,20,9,9,9,1,1,10,10,10,10,10,10,10,10,1 +1,9,17,9,9,9,9,9,9,1,1,18,18,18,18,18,18,18,18,1,9,17,17,17,17,17,17,17,9,1,1,9,9,9,9,10,9,10,9,1,9,9,9,9,9,20,9,9,9,1,1,10,10,10,10,10,10,10,10,1 +1,9,17,17,9,9,9,9,9,1,1,20,9,9,9,9,9,9,9,1,9,9,9,9,9,9,9,17,9,1,1,9,9,9,9,9,9,9,9,1,9,9,9,9,9,20,9,9,9,1,1,10,10,10,10,10,10,10,10,1 +1,9,9,17,17,9,9,9,9,1,1,16,16,16,16,16,16,16,16,1,9,9,9,9,9,9,9,17,9,1,1,9,9,10,9,10,9,10,9,1,9,9,9,9,9,20,9,9,9,1,1,10,10,10,10,10,10,10,10,1 +1,9,9,9,17,9,9,9,9,1,1,16,16,16,16,16,16,16,16,1,9,17,17,17,17,17,17,17,9,1,1,9,9,9,9,9,9,9,9,1,9,9,9,9,9,20,9,9,9,1,1,10,10,6,10,10,10,10,10,1 +1,9,9,9,17,17,17,9,9,1,1,9,9,9,9,9,9,9,20,1,9,17,17,17,17,17,17,17,9,1,1,10,9,10,9,10,9,9,9,1,9,9,9,9,10,10,10,9,9,1,1,10,10,6,10,10,10,10,10,1 +1,9,9,9,9,9,17,17,17,20,20,18,18,18,18,18,18,18,18,1,9,17,9,9,9,9,9,9,9,1,1,9,9,9,9,9,9,9,9,1,9,9,9,9,10,10,10,9,9,1,1,10,10,6,10,10,10,10,10,1 +1,9,9,9,9,9,9,9,17,20,20,18,18,18,18,18,18,18,18,1,9,17,17,17,17,17,17,17,17,17,20,10,9,10,9,9,9,9,9,1,9,9,9,9,10,10,10,9,9,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,1,1,10,10,10,10,10,10,10,10,1 +1,1,10,1,10,1,10,1,1,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,32,10,10,10,32,32,32,1,1,10,10,10,1,10,1,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,10,1,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,1,1,1,1,1,10,10,10,10,10,10,10,10,10,10,10,1 +1,1,10,10,10,10,10,10,1,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,1,10,10,10,1,10,10,10,10,10,10,10,10,10,10,10,1 +1,1,10,10,10,10,10,10,1,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,1,10,10,10,1,10,10,10,10,10,6,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,1,1,1,1,1,10,10,10,10,10,6,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,10,10,10,10,10,10,10,10,10,5,5,10,10,10,10,10,1 +1,10,10,10,1,10,1,10,1,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,1,1,10,1,10,1,10,1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,32,32,32,32,10,32,32,32,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,10,10,1,1,1,1,1,1,1,1,1,1,1,1,1 +1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,10,10,1,1,1,1,1,1,1,1,1,1,1,1,1 +1,32,32,32,32,10,32,32,32,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,17,18,18,18,10,18,18,18,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,32,32,32,32,10,10,10,10,1,1,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,1,1,17,17,18,18,10,18,18,19,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,32,32,32,32,32,32,1,10,1,1,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,1,1,17,17,17,18,18,18,19,19,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,1,1,10,10,10,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,1,1,17,17,17,17,18,10,10,10,10,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,1,1,10,10,10,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,1,1,17,17,17,16,19,19,19,19,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,32,32,32,32,32,32,1,10,1,1,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,10,10,17,17,16,16,16,19,19,19,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,32,32,32,32,10,10,10,10,1,1,10,9,9,9,9,9,9,9,10,10,20,20,20,20,20,20,20,10,1,1,17,16,16,16,16,19,19,19,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,32,32,32,32,10,32,32,32,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,16,16,16,16,16,19,19,19,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,10,1,1,1,1 +1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,10,1,1,1,1 +1,10,10,10,1,10,1,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,1,10,1,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,1,10,10,1,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1 +1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,1,1,1,1,10,1 +1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,1,1,1,10,10,1,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,1,10,10,10,10,1,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,1,1,1,10,1,1,10,1 +1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,1,1,10,10,10,1,10,1,10,10,1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,10,1,1,1,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,10,1,1,1,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,9,9,10,9,10,9,10 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,9,9,9,9,9,9,9 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,9,9,10,9,9,9,9 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,9,9,10,9,9,9,9 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,10,10,10,9,9,9,9,9,10,9,10 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,9,9,9,9,9,9,9 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,10,9,9,9,10,9,9,10,9 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,10,10,10,10,10,10,10,1,1,9,9,10,9,9,10,9,9,10 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 diff --git a/intra/source/csv/DEBUG_BG2.csv b/intra/source/csv/DEBUG_BG2.csv new file mode 100644 index 0000000..a7b8152 --- /dev/null +++ b/intra/source/csv/DEBUG_BG2.csv @@ -0,0 +1,30 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,42,42,42,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,42,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,42,42,42,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/DEBUG_FG.csv b/intra/source/csv/DEBUG_FG.csv new file mode 100644 index 0000000..cd36e57 --- /dev/null +++ b/intra/source/csv/DEBUG_FG.csv @@ -0,0 +1,30 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/DRAWER_BG.csv b/intra/source/csv/DRAWER_BG.csv new file mode 100644 index 0000000..33e8ebc --- /dev/null +++ b/intra/source/csv/DRAWER_BG.csv @@ -0,0 +1,110 @@ +0,0,0,0,0,0,0,0,0,0,8,22,22,8,5,6,11,22,22,22,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70 +0,0,16,4,11,7,5,6,0,0,11,2,2,2,2,2,2,2,2,7,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70,70,70 +0,0,10,8,4,12,11,11,0,0,11,2,2,2,2,2,2,2,2,12,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,74,70,70,74,70,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70,70,70 +0,0,20,10,8,2,11,7,0,0,11,22,11,2,2,2,2,7,22,0,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,74,70,70,74,70,70,74,70,70,84,70,70,70,70,74,70,70,70,70,70,70,70,70 +0,20,11,2,11,11,2,12,0,0,0,0,0,16,2,2,7,12,0,0,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,70,74,70,70,84,70,70,74,70,70,70,70,70,74,70,74,70,70,70,70,70,70,70,70 +15,4,2,2,2,2,21,22,16,11,11,11,11,22,2,2,12,12,22,22,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,70,70,84,70,70,70,70,70,84,70,74,70,70,74,70,70,70,70,70 +11,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,7,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,74,70,70,70,70,70 +11,11,2,2,2,2,2,2,10,10,11,11,10,10,2,2,10,22,22,22,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,74,70,70,70 +0,11,2,2,2,2,2,2,10,0,0,0,0,0,10,22,0,0,0,0,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,74,70,70,70 +0,0,11,10,2,2,7,10,0,0,0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70 +0,0,0,10,2,2,12,0,0,0,70,70,70,70,70,70,70,70,70,70,33,33,33,33,33,33,33,33,33,33,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,70 +0,0,0,11,2,2,10,0,0,0,70,70,70,70,70,70,70,70,70,70,33,28,35,38,35,35,38,35,29,33,70,70,70,70,70,70,70,70,70,70,70,110,131,131,131,131,131,131,112,110,131,131,131,131,131,131,112,70,70,70 +0,0,0,7,2,2,11,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,30,30,53,25,25,25,32,0,0,70,70,70,70,70,70,110,131,131,112,122,77,78,78,78,78,79,120,122,77,78,78,78,78,79,120,70,70,70 +0,0,0,12,2,2,20,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,43,50,51,51,52,25,32,0,0,70,70,70,70,70,70,122,77,79,120,122,87,107,71,72,73,89,120,122,87,107,107,107,107,89,120,70,70,70 +0,0,0,20,2,2,10,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,30,30,30,30,30,53,32,33,70,70,70,70,70,70,70,122,87,89,120,122,87,107,81,92,96,89,120,122,97,98,98,98,98,99,120,70,70,70 +0,0,0,11,2,2,7,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,45,25,46,48,25,30,32,33,70,70,70,70,70,70,70,122,97,99,120,122,87,107,100,101,106,89,120,130,111,111,111,111,111,111,132,70,70,70 +0,0,0,10,2,2,12,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,55,25,25,30,25,30,32,33,70,70,70,70,70,70,70,130,111,111,132,122,87,107,107,107,107,89,120,70,70,70,70,70,70,70,70,70,70,70 +0,0,0,11,2,2,3,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,46,48,25,25,46,48,32,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,70,70,70,70,70,70,70 +0,0,0,7,2,2,9,0,0,0,70,70,70,70,70,70,70,70,70,70,33,40,41,42,25,25,26,41,27,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,70,70,70,70,70,70,70 +0,0,0,12,2,2,11,0,0,0,70,70,70,70,70,70,70,70,70,70,33,33,33,31,25,25,32,33,33,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,70,70,70,70,70,70,70 +0,0,0,10,2,2,10,0,0,0,70,70,70,70,70,70,70,70,70,70,33,33,33,31,25,25,32,33,33,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,70,70,70,70,70,70,70 +0,0,0,11,2,2,20,0,0,0,70,70,70,70,70,70,70,70,70,70,33,28,35,37,25,25,36,35,29,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,10,2,2,10,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,25,25,25,25,25,32,33,70,70,70,70,70,70,70,70,70,70,70,122,87,71,72,73,107,89,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,3,2,2,11,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,25,25,25,25,25,32,33,70,70,70,70,70,70,70,70,70,70,70,122,87,81,92,96,107,89,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,9,2,2,10,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,50,52,25,25,25,25,32,33,70,70,70,70,70,70,70,70,70,70,70,122,87,100,101,106,107,89,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,20,2,2,11,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,25,25,25,25,53,32,33,70,70,70,70,70,70,70,70,70,70,70,122,87,107,107,107,107,89,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,20,2,2,7,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,43,25,25,50,52,32,33,70,70,70,70,70,70,70,70,70,70,70,122,97,98,98,98,98,99,120,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,11,2,2,12,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,53,25,25,25,43,32,33,70,70,70,70,70,70,70,70,70,70,70,130,111,111,111,111,111,111,132,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,11,2,2,3,0,0,0,70,70,70,70,70,70,70,70,70,70,33,31,25,53,25,25,25,53,32,33,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,70,70,70 +0,0,0,4,2,2,9,0,0,0,70,70,70,70,70,70,70,70,70,70,33,40,41,42,25,25,26,41,27,33,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,70,70,70,70 +9,9,0,9,2,2,15,0,11,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70 +11,11,0,11,2,2,11,0,17,17,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,110,131,131,131,131,131,131,131,131,131,131,131,131,131,112,70,70,70,70 +20,20,0,20,2,2,10,0,10,10,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,122,77,78,78,78,78,78,78,78,78,78,78,78,79,120,70,70,70,70 +11,11,0,11,2,2,3,0,11,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,122,87,107,71,72,72,72,72,72,72,73,107,107,89,120,70,70,70,70 +7,7,0,7,2,2,8,0,7,7,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,122,87,107,81,92,92,92,92,92,92,96,107,107,89,120,70,70,70,70 +12,12,0,12,2,2,10,0,12,12,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,122,87,107,100,101,102,103,104,105,105,106,107,107,89,120,70,70,70,70 +11,11,0,11,2,2,11,0,11,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,122,97,98,98,98,98,98,98,98,98,98,98,98,99,120,70,70,70,70 +10,10,0,10,2,2,16,0,11,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,130,111,111,111,111,111,111,111,111,111,111,111,111,111,132,70,70,70,70 +7,7,0,7,2,2,7,0,7,7,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +12,12,0,12,2,2,12,0,12,12,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +11,11,11,11,11,11,11,11,11,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,110,131,131,131,131,112,110,131,131,112,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +11,11,11,11,11,11,17,11,17,11,70,70,110,131,131,131,131,131,131,131,131,131,131,131,112,70,70,70,70,70,70,70,70,70,122,77,78,78,79,120,122,77,79,120,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +11,10,11,11,11,11,11,11,10,11,70,70,122,77,78,78,78,78,78,78,78,78,78,79,120,70,70,70,70,70,70,70,70,70,122,87,71,73,89,120,122,87,89,120,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +17,11,0,17,2,2,11,0,11,17,70,70,122,87,107,107,107,107,98,98,98,98,98,99,120,70,70,70,70,70,70,70,70,70,122,87,100,106,89,120,122,97,99,120,70,70,70,70,74,70,70,70,70,70,70,70,70,70,70,70 +10,7,0,10,2,2,7,0,7,10,70,70,122,97,98,98,98,99,111,111,111,111,111,111,132,70,70,70,70,70,70,70,70,70,122,97,98,98,99,120,130,111,111,132,70,70,70,70,74,70,70,110,131,131,112,70,70,70,70,70 +16,12,0,16,2,2,12,0,12,16,70,70,130,111,111,111,111,111,132,70,70,110,131,131,131,131,131,131,131,131,131,131,131,131,130,111,111,111,111,132,70,70,70,70,70,70,70,70,74,70,70,122,77,79,120,70,70,70,70,70 +11,11,0,11,2,2,11,0,11,11,70,70,70,70,70,70,70,70,70,70,70,122,77,78,78,78,78,78,78,78,78,78,78,79,120,70,70,70,70,70,70,70,70,70,70,70,70,70,74,70,70,122,87,89,120,70,70,70,70,70 +11,11,0,11,2,2,11,0,11,11,70,70,70,70,70,70,70,70,70,70,70,122,97,98,98,98,98,98,98,98,98,98,98,99,120,70,70,70,70,70,70,70,70,70,70,70,70,70,84,70,70,122,97,99,120,70,70,70,70,70 +15,7,0,15,2,2,7,0,7,15,70,70,70,70,70,70,70,70,70,70,70,130,111,111,111,111,111,111,111,111,111,111,111,111,132,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,130,111,111,132,70,70,70,70,70 +11,12,0,11,2,2,12,0,12,11,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,142,144,145,162,142,142,142,142,142,142,142,144,145,162,142,142,142,142,142,142,142,144,145,162,162,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,162,142,142,142,142,142,142,144,145,162,142,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,140,141,142,142,142,144,145,142,142,142,140,141,142,142,142,144,145,142,142,142,140,141,142,142,142,144,145,142,142,142,140,141,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,150,151,142,142,142,144,145,142,142,142,150,151,142,142,142,144,145,142,142,142,150,151,142,142,142,144,145,142,142,142,150,151,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,169,168,168,168,166,166,168,168,168,167,169,168,168,168,166,166,168,168,168,167,169,168,168,168,166,166,168,168,168,167,169,168,168,168,166,166,168,168,168,167,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,142,142,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,148,143,143,143,143,143,143,143,143,147,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,166,166,142,142,162,144,145,162,142,142,166,166,142,142,162,144,145,162,142,142,166,166,142,142,162,144,145,162,162,142,166,166,142,142,162,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,162,142,142,142,142,142,142,144,145,162,142,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,142,142,166,144,145,166,142,142,142,142,153,153,153,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,148,143,143,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,142,142,142,144,145,142,142,142,142,142,145,142,142,144,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,169,168,168,168,168,168,168,168,168,167,169,168,168,168,168,168,168,168,168,167,169,168,168,168,168,168,168,168,168,167,169,168,168,168,168,168,169,168,168,167,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153 +173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173 +173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,174,175,176,177,175,188,173,173,173,173,173,173,173,173,173,173,173,173 +183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,184,185,186,187,185,198,183,183,183,183,183,183,183,183,183,183,183,183 +193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,194,195,196,197,185,208,193,193,193,193,193,193,193,193,193,193,193,193 +191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,192,195,196,197,185,218,191,191,191,191,191,191,191,191,191,191,191,191 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,180,170,170,170,180,170,170,170,170,170,170,180 +180,170,170,180,170,170,170,180,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,180,170,170,170,170,180,170,180,170,170,170,170,180 +180,170,170,170,180,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,180,180,170,170,170,170,170,170,170,170,170,170,180,170,170,180 +180,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,180,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,180,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,180 +180,170,180,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,171,172,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,180,170,170,170,170,170,170,170,170,180,170,170,170,170,180 +180,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,181,182,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180 +180,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,180,170,170,170,170,180,170,170,170,170,170,180 +180,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,180 +180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180 diff --git a/intra/source/csv/DRAWER_BG2.csv b/intra/source/csv/DRAWER_BG2.csv new file mode 100644 index 0000000..c4b6b89 --- /dev/null +++ b/intra/source/csv/DRAWER_BG2.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/DRAWER_FG.csv b/intra/source/csv/DRAWER_FG.csv new file mode 100644 index 0000000..4a27795 --- /dev/null +++ b/intra/source/csv/DRAWER_FG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,34,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FIELDS_BG.csv b/intra/source/csv/FIELDS_BG.csv new file mode 100644 index 0000000..66fa9a4 --- /dev/null +++ b/intra/source/csv/FIELDS_BG.csv @@ -0,0 +1,120 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,141,141,142,140,141,142,146,146,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,204,142,140,202,142,146,146,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,142,140,202,142,146,146,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,141,141,202,141,141,142,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,202,202,202,202,202,142,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,202,202,202,202,202,142,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,202,202,202,202,202,142,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,202,202,202,202,202,202,202,142,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,144,144,145,202,143,144,144,146,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,146,146,140,202,142,146,146,146,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,250,250,255,243,243,254,250,250,65,85,230,230,230,91,93,93,93,94,230,75,1,2,3,4,65,85,125,3,4,3,5,6,5,6,5,6,5,6,5,6,5,6,4,243,243,3,5,6,5,2,135,95,230,75,254,250,250,255,65,230,85,230,125,200,200,1,6,5,6,5,6,5,6,5,6,5,6,5,6,4,3,4,3,4,135,91,93,90,12,12,230,230,230,230,125,201,201,200,200,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,13,13,255,224,200,254,13,13,65,92,90,230,230,95,91,73,73,73,73,74,3,4,11,62,60,85,125,46,47,48,3,4,3,4,3,4,3,5,6,5,6,4,200,200,200,200,3,4,3,4,135,95,230,75,254,250,250,255,65,230,85,230,125,200,1,6,5,6,5,6,5,6,5,6,5,6,5,6,4,131,133,133,133,133,134,95,230,92,93,93,93,93,90,230,132,133,133,130,200,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,261,250,255,211,200,254,250,260,65,230,92,93,93,94,75,200,200,220,221,223,11,200,11,65,230,85,125,41,40,45,201,201,201,201,201,201,201,3,5,6,5,2,200,212,214,200,200,200,131,133,134,95,230,75,263,250,250,262,65,230,85,230,125,200,3,5,6,5,6,5,6,5,6,5,6,4,3,4,200,135,230,230,230,230,230,95,230,230,230,230,230,230,92,90,230,230,230,125,200,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,254,250,255,227,200,254,250,255,65,230,230,230,230,230,75,200,200,200,200,200,200,200,11,65,230,85,125,41,40,45,201,201,46,47,47,48,201,201,3,5,6,4,200,211,215,200,200,200,135,230,91,94,230,75,13,13,13,13,65,230,85,230,132,130,1,6,5,6,4,3,4,3,5,6,5,2,200,200,200,135,230,91,236,237,93,94,230,82,83,83,84,230,230,92,93,93,90,125,201,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,254,250,262,253,228,254,250,255,72,73,73,73,73,73,74,200,62,63,63,63,64,200,200,65,230,85,125,42,43,44,201,201,41,40,40,40,48,201,1,6,4,200,212,210,218,200,200,200,135,230,95,230,71,74,261,250,250,260,65,230,85,230,230,125,3,4,3,4,200,200,200,200,3,4,3,4,131,133,133,134,230,95,230,230,230,230,230,85,230,230,95,71,232,73,231,70,85,132,133,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,254,250,250,262,252,263,250,255,11,11,200,200,200,200,200,200,65,230,230,230,75,200,200,65,230,85,132,133,133,133,130,201,42,43,43,43,44,201,3,5,2,200,216,215,200,200,200,200,135,230,95,71,74,200,254,250,250,255,65,230,85,230,230,125,200,200,200,200,200,200,200,200,200,200,200,200,135,230,230,230,230,81,83,83,83,83,83,80,230,230,95,75,200,201,201,65,85,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,254,250,250,250,250,250,250,255,62,63,64,200,62,63,63,63,60,230,230,230,61,63,63,60,230,85,230,230,12,12,132,233,133,133,130,200,200,200,1,6,4,200,200,227,224,200,200,131,134,230,95,75,200,200,254,250,250,255,65,230,85,230,230,125,200,200,200,200,200,131,133,133,133,133,133,133,134,230,122,123,123,123,123,123,123,123,123,123,123,124,95,75,200,200,201,65,85,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,256,257,261,250,250,250,260,258,65,230,61,200,60,230,230,230,82,83,83,83,83,83,83,84,230,92,93,90,12,12,230,230,230,230,125,200,200,200,3,5,2,200,200,200,227,200,200,135,12,230,95,75,200,200,254,250,260,258,65,230,92,90,230,132,133,133,133,133,133,134,12,91,93,93,93,90,12,230,125,200,200,200,201,201,200,200,200,201,201,135,95,61,63,63,63,60,85,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,61,63,64,254,250,250,260,258,200,65,230,12,230,12,82,83,83,80,230,230,230,230,230,230,95,230,230,230,92,93,93,93,93,90,230,125,200,200,200,1,6,5,2,131,236,237,130,200,135,12,230,95,75,200,200,254,250,255,200,65,230,230,85,230,230,230,230,230,230,230,230,91,94,122,123,124,92,90,230,125,201,200,200,200,201,201,201,200,200,201,135,81,83,83,83,83,83,80,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,83,84,75,254,250,250,255,200,62,60,230,12,230,12,85,230,230,230,230,230,230,230,230,230,81,83,84,230,12,12,12,230,230,85,230,132,133,133,130,3,5,6,4,135,230,230,125,200,135,12,230,95,75,46,48,254,250,255,200,65,230,230,85,91,93,93,93,93,93,90,230,95,230,125,200,135,230,85,230,125,201,201,200,200,200,201,201,201,200,200,121,123,124,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,95,75,254,250,250,255,200,65,230,230,12,230,12,85,230,230,230,230,230,230,230,230,230,230,230,95,230,230,12,12,12,230,85,230,91,93,90,125,1,6,5,2,135,230,230,125,200,135,230,91,94,75,41,45,254,250,262,253,65,230,230,92,94,230,230,230,230,230,92,93,94,230,125,200,135,230,85,230,125,201,201,131,133,133,133,133,133,130,200,200,201,135,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,95,75,254,250,250,255,200,65,12,12,12,230,12,92,93,93,93,93,93,93,90,230,230,230,230,81,83,83,83,83,84,230,92,233,94,230,85,125,3,4,3,4,135,230,230,125,200,135,230,95,71,74,42,44,254,250,250,255,65,230,71,73,73,73,73,73,73,73,73,73,73,70,125,200,121,124,85,230,132,133,133,134,230,230,230,230,230,132,130,201,201,135,230,91,93,93,93,90,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,95,75,254,250,250,255,200,200,230,230,230,230,12,12,230,230,230,230,230,230,85,230,230,230,230,230,230,230,230,230,95,230,230,230,230,230,85,132,133,133,133,133,134,230,230,132,133,134,230,95,75,200,200,200,254,250,250,255,65,230,75,46,47,47,47,47,47,47,47,47,48,65,132,130,200,135,85,230,230,230,230,230,230,91,93,233,90,230,132,133,133,134,230,95,230,230,230,85,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,93,94,75,254,250,250,255,200,72,73,90,12,12,12,12,230,230,230,230,230,230,85,230,230,230,230,230,230,230,230,230,95,230,82,83,84,230,85,230,230,230,91,93,93,236,237,93,93,90,230,95,75,200,200,200,254,250,250,255,65,230,75,42,43,43,43,43,43,40,40,40,44,65,230,132,133,134,92,90,230,230,230,230,91,94,230,230,92,90,230,230,230,230,91,94,230,230,230,85,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,254,250,250,255,200,1,2,65,230,230,71,73,73,90,230,230,230,230,92,93,93,93,90,230,230,230,230,230,95,230,85,230,95,230,92,93,93,93,94,230,12,230,230,12,230,92,93,94,75,200,200,200,254,250,250,255,65,230,75,200,200,200,200,200,200,41,40,45,201,72,70,230,230,230,230,92,93,93,93,93,94,230,230,230,230,92,93,93,93,93,94,230,230,230,82,80,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,71,73,74,254,250,250,255,200,3,4,72,73,73,74,203,203,72,90,230,230,230,230,230,230,230,85,230,230,230,230,230,95,230,85,230,95,230,230,230,230,230,230,230,12,230,230,12,230,230,230,230,75,200,200,200,254,250,250,255,65,230,75,200,200,200,200,200,200,42,43,44,201,201,72,73,73,70,230,230,230,230,230,230,12,230,230,230,230,12,230,230,230,230,230,230,230,230,85,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,1,2,254,250,250,262,253,200,200,200,200,203,200,200,203,200,65,230,230,230,12,230,230,230,92,93,93,93,93,93,94,230,85,230,81,83,84,230,230,230,230,230,71,234,235,70,230,230,230,230,75,200,200,251,263,250,250,255,65,230,75,200,200,200,200,200,200,200,200,200,200,200,200,1,2,72,73,73,73,73,73,73,73,73,73,232,73,70,230,230,230,230,230,230,230,230,92,93,93,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,3,4,254,250,250,250,255,1,2,1,2,203,200,200,203,200,72,73,73,73,232,73,90,230,230,230,230,230,230,230,230,230,85,230,230,230,81,84,230,230,91,73,74,200,200,72,73,73,70,230,75,200,251,263,250,250,250,255,72,73,74,200,46,48,200,200,200,46,47,48,1,2,200,3,4,200,201,201,201,201,201,201,201,201,201,201,201,65,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,200,200,256,261,250,250,255,3,5,6,5,2,200,200,203,200,200,200,200,200,200,200,65,230,230,12,230,12,12,12,12,12,92,93,90,230,230,95,230,230,75,200,200,200,200,200,200,200,72,73,74,200,254,250,250,260,257,258,46,47,48,200,41,45,200,200,200,41,40,45,3,4,200,200,200,200,46,48,201,201,201,201,201,201,201,201,201,72,73,73,73,73,73,73,73,73,73,73,73,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,200,200,200,254,250,250,255,1,6,5,6,5,2,1,2,200,1,2,1,2,1,2,65,230,230,12,230,12,230,230,230,230,230,230,85,230,230,95,230,230,75,200,200,200,200,200,200,200,46,47,47,47,48,250,46,47,47,47,40,40,45,200,41,40,47,47,47,40,40,45,200,224,200,46,47,47,40,40,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,48,1,2,1,2,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,200,200,200,254,250,250,255,3,4,3,4,3,4,3,4,200,3,5,6,5,6,4,65,230,230,12,230,12,230,230,230,230,230,230,92,93,93,94,230,230,75,200,200,200,200,200,200,200,41,40,40,43,44,250,42,43,43,43,40,40,45,200,41,40,43,43,43,43,47,45,200,226,200,41,40,40,40,40,40,40,43,43,43,43,43,43,43,43,43,43,43,43,43,43,44,3,4,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,74,1,2,200,254,250,250,262,252,46,47,47,48,252,252,253,200,1,6,5,6,5,2,72,73,90,12,230,12,230,230,230,91,73,73,73,73,90,230,230,230,75,200,251,252,252,252,252,252,42,43,44,250,250,250,255,200,201,201,41,40,45,200,42,44,201,201,201,201,41,45,200,227,200,41,40,40,43,43,43,44,201,201,201,200,200,200,200,200,200,200,200,200,200,200,200,200,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,104,3,4,200,254,250,250,250,250,42,43,43,44,250,250,262,253,3,5,6,5,6,4,200,200,230,230,230,91,73,73,73,74,1,2,201,201,72,73,73,73,74,200,254,250,250,250,250,250,250,250,250,250,250,260,258,200,200,201,42,43,44,200,201,201,201,201,201,201,41,40,48,200,46,40,40,44,201,201,201,201,201,201,200,200,200,200,46,47,47,47,48,200,1,2,1,2,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,115,1,2,200,254,250,250,250,250,13,13,250,250,250,250,250,255,200,3,4,3,4,200,200,200,65,230,230,75,46,48,200,200,3,4,201,201,46,47,47,48,200,200,254,250,260,257,257,257,257,257,257,53,58,200,200,59,54,201,201,201,201,200,201,201,201,201,201,201,41,40,45,200,42,43,44,201,201,201,201,201,201,201,200,200,46,47,40,40,40,40,44,200,3,5,6,4,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,115,3,5,2,256,261,250,250,46,47,47,48,250,250,250,250,255,200,200,200,200,200,200,200,200,72,73,73,74,41,45,200,200,200,200,200,200,42,43,43,44,200,200,254,250,255,200,224,200,200,200,200,50,212,213,213,214,50,200,201,201,200,200,200,201,201,201,201,46,40,40,44,200,200,201,201,201,201,46,47,47,47,47,47,47,43,43,43,43,43,44,200,200,1,6,5,2,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,101,104,3,4,200,256,257,257,41,40,40,45,261,250,250,250,262,252,252,252,252,252,252,252,252,253,200,200,200,41,45,200,200,200,200,200,200,201,200,200,200,200,200,254,250,255,200,211,214,200,200,200,200,211,210,210,215,200,200,200,200,200,200,200,200,200,201,201,41,40,45,200,200,201,201,46,47,47,40,43,43,43,43,43,44,200,200,200,200,200,200,200,1,6,5,6,4,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,2,101,103,104,200,200,200,200,42,40,40,45,254,250,250,250,250,250,250,250,250,250,250,250,250,262,253,200,200,41,45,200,200,200,200,200,212,213,213,222,221,222,223,254,250,255,200,211,215,200,200,200,200,211,210,210,215,200,200,200,200,200,200,200,200,200,200,201,41,40,40,47,48,201,46,40,40,40,44,201,201,201,200,200,200,200,46,47,47,47,48,1,6,5,6,5,2,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,115,200,200,200,1,2,42,43,44,256,257,257,257,257,257,257,257,257,261,250,250,250,250,255,200,200,41,45,200,200,200,200,220,217,217,218,200,200,251,252,263,250,255,200,211,210,214,200,200,52,216,217,217,218,52,200,200,200,200,200,200,200,200,200,201,41,40,40,43,44,201,42,43,40,45,201,201,201,200,200,200,200,200,42,43,43,43,44,3,5,6,4,3,4,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,2,115,1,2,1,6,5,2,1,2,200,1,2,1,2,200,200,200,200,256,257,261,250,250,255,200,46,40,40,48,200,200,200,200,200,200,46,47,48,254,250,250,250,255,200,216,210,210,214,200,55,58,200,200,59,56,200,200,200,200,200,200,200,200,201,201,41,40,45,201,201,201,254,250,41,45,201,46,47,47,47,48,200,200,200,200,201,201,201,201,3,4,200,200,200,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,6,4,115,3,4,3,4,3,4,3,4,1,6,5,6,5,2,46,47,47,48,200,254,250,250,255,200,41,40,40,40,47,47,47,47,47,47,40,40,45,254,250,260,257,258,200,200,211,210,215,200,200,200,200,200,200,200,200,46,47,47,48,200,200,46,47,47,40,40,45,201,46,47,48,250,41,45,200,41,40,40,40,40,47,47,47,47,47,47,47,47,48,1,2,200,1,2,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,2,101,103,103,103,103,103,103,103,104,3,4,3,4,3,4,42,40,40,45,200,254,250,250,255,200,42,43,43,43,43,43,43,43,43,40,40,40,45,254,250,255,200,200,200,200,211,210,215,200,200,200,200,200,200,200,200,42,43,43,44,200,200,42,43,43,40,40,45,201,41,40,45,250,41,45,200,42,43,43,43,43,43,43,43,43,43,43,43,43,44,3,4,200,3,5,6,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,6,4,200,200,200,30,32,33,46,48,101,103,103,103,103,103,103,104,41,40,45,200,254,250,250,255,200,200,200,200,200,200,200,200,200,200,42,40,40,45,254,250,255,200,200,200,200,216,210,215,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,42,40,45,200,42,40,45,250,41,45,200,200,200,200,200,201,201,201,201,200,200,200,200,200,200,200,200,200,1,6,5,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,4,200,200,200,200,34,35,38,42,44,11,11,11,11,200,11,11,115,41,40,45,200,254,250,250,262,253,200,200,200,200,200,200,200,200,200,200,41,40,45,254,250,255,30,31,32,33,200,216,218,200,11,11,200,200,11,11,200,200,200,212,213,213,213,213,213,214,200,41,45,200,200,41,45,250,41,40,47,47,47,47,47,47,48,201,46,48,200,200,200,200,200,200,200,201,3,4,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,11,115,41,40,45,200,254,250,250,250,262,252,252,252,252,252,252,252,252,253,200,41,40,45,254,250,255,34,35,36,38,200,200,200,200,11,11,200,200,11,11,200,200,200,211,210,210,210,210,210,215,200,42,44,200,46,40,45,250,42,40,40,40,40,40,40,40,45,201,42,40,47,47,47,47,47,47,48,201,201,201,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,11,200,200,200,200,200,200,46,47,47,48,200,200,200,200,200,115,41,40,45,200,254,250,250,250,250,250,250,250,250,250,250,250,250,262,253,41,40,45,254,250,255,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,211,210,210,210,210,210,215,200,200,200,200,41,40,45,250,250,42,43,43,43,43,40,40,45,201,201,41,40,43,43,43,43,43,40,47,48,201,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,242,200,200,200,200,200,200,200,200,41,40,40,47,47,48,200,200,200,115,41,40,45,200,256,261,250,250,250,250,250,250,250,250,250,250,250,250,255,41,40,45,254,250,255,200,224,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,211,210,210,210,210,210,215,200,46,47,47,40,40,45,250,250,250,250,250,250,250,41,40,40,48,201,41,45,200,200,200,201,201,42,40,45,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,1,2,11,200,200,200,200,200,200,41,40,40,40,40,45,111,232,113,114,42,43,44,200,200,256,257,257,257,257,257,257,257,257,261,250,250,250,255,41,40,45,254,250,255,200,211,214,200,212,213,213,213,213,223,200,200,200,200,200,200,200,211,210,210,210,210,210,215,200,41,40,40,40,40,45,13,46,47,47,47,48,250,41,40,40,45,200,42,40,47,47,47,48,201,201,41,45,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,2,200,200,200,200,200,200,41,40,40,40,40,45,115,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,256,261,250,250,255,41,40,45,254,250,255,200,216,210,213,210,217,217,217,218,200,200,200,200,200,200,200,200,216,217,217,217,217,217,218,200,41,40,40,40,40,45,13,41,40,40,40,45,250,41,40,43,44,200,200,42,40,40,40,40,48,201,41,45,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,4,3,4,200,200,200,200,200,200,41,40,40,40,40,45,115,200,62,63,63,63,63,64,200,1,2,1,2,200,200,200,200,200,200,254,250,250,46,40,40,45,254,271,255,200,200,211,210,218,46,48,200,200,200,200,200,200,200,1,2,1,2,200,200,200,200,200,200,200,41,40,40,40,40,45,250,41,40,40,40,45,250,41,45,200,200,200,200,200,41,40,40,40,45,201,41,45,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,47,47,47,48,200,200,46,47,47,40,40,43,43,43,44,115,200,65,230,230,230,230,75,1,6,5,6,5,2,1,2,1,2,46,48,250,250,41,40,40,45,254,271,255,200,200,211,215,46,40,40,48,200,200,200,200,200,1,6,5,6,5,2,1,2,1,2,46,47,40,40,40,40,40,45,250,41,40,40,40,45,250,41,40,48,201,46,48,200,41,40,40,40,45,200,41,45,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,43,43,43,44,200,200,42,43,43,43,44,111,113,113,113,114,200,65,230,230,230,230,75,3,5,6,5,6,5,6,5,6,4,41,45,250,250,41,40,40,45,254,271,255,200,200,216,215,42,40,40,44,200,200,200,200,200,3,5,6,5,6,5,6,5,6,4,41,40,40,40,40,40,43,44,250,41,40,40,40,45,250,41,40,45,201,41,45,200,41,40,40,40,45,200,42,44,200,3,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,113,113,113,113,113,113,113,113,113,113,113,114,220,213,213,214,200,72,73,73,73,73,74,200,3,4,3,4,3,4,3,4,200,42,44,250,250,42,43,40,45,254,271,255,200,200,200,225,200,42,44,200,200,200,200,200,200,1,6,5,6,5,6,4,3,4,200,42,43,43,43,43,44,200,254,250,41,40,40,40,45,250,42,40,45,201,41,45,200,41,40,40,40,44,200,200,200,200,1,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,10,10,245,245,245,210,214,200,200,200,200,200,216,217,217,223,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,254,250,250,255,200,42,44,254,271,255,200,200,200,227,200,200,200,200,200,200,200,200,200,3,5,6,5,6,4,200,200,200,200,200,200,200,200,200,200,200,254,250,41,40,40,40,45,250,250,41,45,200,42,40,47,40,40,40,45,1,2,1,2,1,6,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,244,245,245,245,245,245,245,210,214,200,200,251,252,252,252,252,252,252,252,252,252,252,252,252,252,253,200,200,200,200,200,200,200,200,254,250,250,255,200,200,200,254,271,255,251,252,252,253,200,200,200,200,200,200,200,200,200,200,3,4,3,4,200,200,200,200,200,200,200,200,200,200,200,251,263,250,42,43,40,40,40,48,250,41,45,200,200,42,43,43,43,43,44,3,5,6,4,3,4,3,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,244,245,245,245,245,245,245,210,210,214,252,263,250,250,250,250,250,250,250,250,250,250,250,250,250,262,253,200,200,200,200,200,200,251,263,250,250,255,200,200,200,254,271,262,263,250,250,262,253,200,200,200,200,200,200,200,200,200,200,200,200,200,200,251,252,252,252,252,252,252,252,252,252,263,250,250,250,255,42,40,40,45,250,41,45,200,200,201,201,201,201,200,200,200,3,4,200,200,200,242,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,246,246,246,246,246,246,246,246,246,246,250,250,250,260,257,257,257,257,261,250,250,250,250,250,250,250,262,252,253,200,200,200,200,254,250,250,250,255,200,200,200,254,271,271,271,250,250,250,255,200,200,200,200,200,200,200,200,200,200,200,200,200,251,263,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,41,40,44,250,42,40,48,200,200,200,201,201,201,200,200,200,200,200,200,200,242,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,244,245,245,245,245,245,245,210,210,210,257,257,257,258,200,200,200,200,256,257,257,257,257,261,250,250,250,250,255,200,200,200,200,254,250,250,250,262,252,253,251,263,271,271,271,250,250,250,262,252,252,252,253,200,200,200,200,200,200,200,200,251,263,250,250,250,250,250,260,257,257,261,250,250,250,250,260,258,200,41,45,254,250,250,41,45,200,46,47,47,47,47,47,47,47,48,1,2,1,2,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,244,245,245,245,245,245,245,245,210,210,200,200,200,200,200,200,62,63,63,63,63,63,64,256,257,261,250,250,255,200,200,200,200,254,250,250,250,250,250,262,263,271,271,271,271,250,250,250,250,250,250,250,262,252,252,252,252,252,252,252,252,263,250,250,250,250,260,257,258,200,200,256,261,250,250,250,255,200,200,41,45,256,261,250,42,44,252,42,43,43,43,43,43,43,43,44,3,4,3,4,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,10,10,245,245,245,245,245,245,210,213,213,214,62,63,63,60,230,230,230,230,230,61,63,64,254,250,250,255,200,200,200,200,254,250,250,250,250,250,250,250,271,271,271,271,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,13,260,257,258,46,47,47,47,48,256,257,261,250,255,200,200,41,45,200,254,250,250,250,250,250,250,13,13,250,250,250,250,250,262,252,252,252,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,63,63,63,63,63,63,63,63,63,63,63,63,63,60,230,230,230,230,230,230,230,230,230,230,75,254,250,250,255,200,200,200,200,254,250,250,250,250,250,250,250,271,271,271,271,250,250,250,250,250,250,250,250,250,250,250,250,13,13,13,13,13,13,46,47,48,200,41,40,40,40,45,200,200,254,250,255,200,200,41,45,200,254,250,260,257,257,257,46,47,47,48,257,257,261,250,250,250,250,250,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,71,73,70,230,230,230,230,230,230,75,254,250,250,255,200,200,200,200,254,250,250,250,250,250,250,250,271,271,271,271,250,250,250,250,250,250,250,250,250,250,250,250,13,250,250,250,250,13,42,43,44,200,41,40,40,40,45,200,200,254,250,255,200,200,41,45,200,254,250,255,200,200,200,41,40,40,45,200,200,254,250,250,250,250,250,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,71,73,73,73,73,73,73,70,230,230,71,73,73,73,74,205,72,73,70,230,230,230,230,75,254,250,250,262,253,200,200,251,263,271,272,272,272,272,272,272,272,271,271,271,250,250,250,250,250,250,250,250,250,250,250,250,13,250,250,250,250,13,255,200,11,200,42,40,40,40,44,200,200,254,250,255,200,200,41,45,200,256,257,258,200,1,2,42,40,40,45,200,200,256,257,257,257,257,257,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,206,200,200,200,200,206,72,73,73,74,200,200,200,200,205,200,200,65,230,71,73,70,75,254,250,250,250,262,252,252,263,272,271,271,272,272,272,272,272,272,272,271,271,250,250,250,250,250,250,250,250,250,250,250,250,13,13,13,13,13,13,255,200,11,200,200,41,40,44,1,2,200,254,250,255,200,46,40,45,200,200,200,200,1,6,5,2,41,40,45,201,200,200,200,200,200,200,200,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,200,200,200,200,200,200,11,11,11,11,205,200,200,200,205,200,200,65,230,75,200,65,75,256,261,250,250,272,272,272,272,272,272,271,271,272,272,272,272,272,272,272,250,250,250,250,250,250,250,250,250,250,250,13,13,13,250,250,250,250,260,258,200,11,11,205,41,45,1,6,4,200,254,250,255,46,40,40,45,200,46,47,48,3,5,6,4,41,40,45,201,201,201,46,47,47,47,47,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,200,200,200,200,200,200,200,200,200,200,205,200,200,200,205,200,200,65,230,75,200,65,75,62,64,261,272,272,272,272,272,272,272,272,271,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,259,250,250,13,14,259,250,250,250,250,255,200,200,200,11,200,41,45,3,5,2,200,254,250,255,42,40,40,45,201,41,40,45,1,6,4,46,40,40,40,47,48,201,41,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,71,74,200,200,200,200,200,200,200,200,200,200,205,200,200,200,205,205,205,72,73,74,200,72,74,65,75,254,272,272,272,272,272,272,272,272,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,250,250,13,259,250,250,250,250,250,255,11,11,11,11,205,41,45,1,6,5,2,254,250,255,200,41,40,45,201,42,40,45,3,5,2,41,40,40,40,40,40,47,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,46,48,200,200,200,200,200,11,11,11,11,205,205,205,205,205,200,200,201,201,200,200,200,200,72,74,254,272,272,272,272,272,272,272,13,13,259,259,250,250,250,14,259,259,259,259,259,250,13,259,14,13,250,250,13,250,250,250,250,250,250,255,205,200,200,205,200,41,45,3,5,6,4,254,250,255,200,41,40,45,201,201,41,40,48,3,4,41,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,41,45,200,200,200,200,46,48,62,63,64,200,200,205,200,200,200,200,46,48,200,200,200,200,46,47,48,13,13,13,13,13,13,13,13,259,259,250,250,250,250,250,250,259,259,14,250,250,13,250,259,13,250,250,13,250,250,250,250,250,250,262,46,47,47,47,47,40,40,48,3,4,200,254,250,255,200,42,40,40,48,201,42,43,44,200,200,41,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,41,40,48,200,200,46,40,45,65,230,75,200,200,205,200,200,200,200,41,45,200,200,200,200,41,40,45,250,250,250,250,13,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,13,250,250,13,250,250,13,250,250,13,13,13,13,13,42,43,43,40,40,40,40,40,48,200,200,254,250,255,200,200,41,40,45,201,201,200,251,252,253,41,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,41,40,45,200,200,41,40,45,65,230,61,63,63,63,63,64,200,46,40,45,200,200,46,47,40,40,45,250,13,13,13,13,250,250,250,250,250,250,13,13,250,250,250,250,250,250,250,250,13,250,250,13,250,250,13,250,250,13,250,250,250,13,250,250,250,41,40,40,40,40,45,200,200,254,250,255,200,200,41,40,40,48,1,2,254,250,255,41,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,41,40,45,200,200,41,40,45,65,230,230,230,230,230,230,75,200,41,40,45,200,200,41,40,40,40,45,259,13,13,13,13,250,250,250,250,250,250,13,13,250,250,250,250,250,250,250,250,13,13,13,13,250,250,13,250,250,13,250,250,250,13,250,250,250,42,43,43,40,40,45,200,200,254,250,262,253,200,41,40,40,44,3,4,254,250,255,42,40,40,40,40,43,43,43,43,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,41,40,44,200,200,42,40,45,65,230,230,71,73,73,73,74,200,41,40,45,200,200,41,40,40,40,44,250,13,13,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,259,13,13,250,13,250,250,13,250,250,13,13,250,250,250,255,200,200,42,43,44,52,200,254,250,250,262,252,42,43,44,252,252,253,256,257,1,2,41,40,40,44,201,201,201,201,42,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,75,42,44,201,200,200,201,42,44,65,230,71,74,200,200,200,200,200,42,40,40,48,200,42,43,43,44,259,259,13,13,250,250,14,259,250,250,250,250,250,250,250,259,260,257,257,257,257,261,250,250,250,250,250,250,250,250,250,13,13,13,13,250,250,250,250,262,252,253,200,200,200,51,200,254,250,250,250,250,250,250,250,250,250,262,252,253,3,4,41,40,44,201,201,201,201,201,201,42,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,61,64,205,205,205,205,205,205,62,60,230,75,200,200,200,200,200,200,201,41,40,45,200,11,200,254,259,259,14,13,13,250,259,259,259,259,250,250,271,271,250,250,260,258,62,63,63,64,46,47,47,47,47,47,47,47,48,250,250,250,250,250,250,273,273,273,250,250,262,252,252,253,55,54,256,261,250,250,250,250,250,250,250,250,250,250,255,200,52,41,45,201,201,201,201,201,201,201,201,41,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,200,200,200,200,200,200,65,230,71,74,200,200,200,200,200,200,201,41,40,45,200,11,200,254,250,259,259,13,13,250,14,259,259,250,250,250,271,271,271,14,255,62,60,12,12,75,42,43,43,43,43,43,43,43,43,47,47,47,47,48,257,261,273,273,250,250,250,250,250,262,253,51,200,256,257,257,257,257,257,261,250,250,250,250,255,200,51,41,45,201,201,201,200,200,201,201,201,41,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,205,205,205,205,205,205,65,230,75,200,200,200,200,46,47,47,47,40,40,45,200,11,251,263,250,14,259,13,13,250,250,250,250,250,250,250,271,271,271,259,255,65,230,230,230,75,200,200,200,200,200,200,200,200,200,41,43,40,40,45,200,254,273,273,273,250,250,250,250,250,255,51,200,220,221,222,213,213,214,256,257,257,257,257,258,200,51,41,45,200,200,201,200,200,201,200,200,41,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,75,201,201,200,200,201,201,65,230,75,200,200,200,200,41,40,40,40,40,40,45,200,11,254,250,250,259,250,13,13,250,250,250,14,250,259,271,271,46,47,47,48,65,230,230,230,75,200,46,47,47,48,200,200,200,46,45,200,42,43,43,47,48,273,273,273,273,250,250,250,250,255,51,200,200,200,200,216,217,217,223,200,200,200,200,1,200,200,200,200,200,200,200,201,201,200,200,200,41,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,61,64,201,200,200,201,62,60,230,75,200,200,200,200,41,40,43,43,43,43,44,200,11,254,250,250,250,250,13,13,250,250,250,250,250,250,271,271,41,40,40,45,65,230,71,232,74,200,41,40,43,44,200,200,200,41,45,200,200,200,200,42,43,48,273,273,273,250,250,250,250,255,51,200,200,200,200,200,200,200,200,200,224,200,200,3,4,51,41,40,48,200,200,200,200,200,200,46,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,201,200,200,201,65,230,230,75,200,200,200,200,41,45,201,201,201,201,200,200,11,254,250,259,250,250,13,13,250,250,250,250,250,271,271,46,40,40,40,45,65,230,75,200,200,200,41,45,250,255,200,200,200,41,45,252,46,48,200,200,200,41,48,273,273,250,250,250,250,255,55,57,57,57,57,57,57,54,200,200,211,214,200,200,53,56,41,0,40,48,200,200,200,200,46,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,11,200,200,11,65,230,230,61,63,63,64,200,41,40,47,47,47,47,47,47,47,48,250,250,250,250,13,13,250,250,250,250,250,271,271,41,40,40,40,45,65,230,75,46,47,47,40,45,250,46,47,47,47,40,45,250,41,40,48,200,200,41,45,273,273,273,250,250,250,255,11,11,11,46,47,47,48,51,200,200,211,215,200,200,51,46,40,40,40,40,47,47,47,47,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,11,200,200,11,65,230,230,230,230,230,75,200,41,40,40,40,40,40,40,40,40,45,250,250,250,250,13,13,250,250,250,250,250,271,271,41,40,40,40,44,65,230,75,42,43,43,40,45,271,42,43,40,40,43,44,250,41,40,45,200,200,41,45,273,273,273,250,250,250,255,11,11,11,41,40,40,45,51,200,200,211,215,200,200,51,41,40,40,40,40,43,43,43,43,43,43,43,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,11,200,200,11,65,230,230,230,230,71,74,200,42,43,43,43,40,40,43,43,43,44,261,14,259,250,13,13,250,250,250,250,250,271,271,42,40,40,45,62,60,230,61,63,63,64,41,45,270,270,271,41,45,271,272,272,41,40,45,200,224,41,45,273,273,273,250,250,250,255,200,200,11,41,40,40,45,51,200,200,211,215,200,200,51,41,40,40,40,44,1,2,1,2,1,2,1,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,200,200,200,200,65,230,230,230,230,75,200,200,200,200,201,201,41,45,62,63,63,63,64,261,259,259,14,13,13,250,259,250,250,250,250,250,41,40,45,65,230,230,82,83,84,75,41,45,270,270,271,42,44,271,272,272,41,40,44,212,215,41,45,273,273,273,250,250,250,262,253,200,200,41,40,40,45,55,57,54,211,210,214,200,51,42,43,43,44,1,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,200,200,200,200,65,230,230,230,230,75,200,200,200,200,200,201,41,45,65,230,230,230,75,254,250,259,259,259,13,250,250,250,14,250,250,250,41,40,45,65,230,230,85,230,95,75,41,45,270,270,250,272,272,272,272,272,41,45,200,211,218,41,45,273,273,273,250,250,250,250,262,252,253,42,40,40,40,47,48,51,211,210,210,213,55,57,57,57,54,3,5,6,4,3,4,3,4,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,230,230,75,251,252,252,253,65,230,230,230,230,75,200,200,200,200,200,200,41,45,65,230,230,230,75,254,250,14,259,259,13,250,14,259,259,14,250,250,41,40,45,72,70,230,92,233,94,75,41,45,270,270,273,13,13,272,272,272,41,45,200,226,200,41,45,273,273,273,250,250,250,250,250,250,255,200,41,40,40,40,44,51,216,210,210,210,210,210,210,210,55,54,3,4,53,57,57,57,57,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,73,73,74,254,250,250,255,72,70,230,230,230,75,200,200,200,200,200,200,41,45,65,230,230,230,75,254,259,259,259,250,13,14,259,259,259,14,250,250,41,40,40,48,65,230,230,230,71,74,41,45,270,270,273,273,273,250,272,272,41,45,200,227,200,41,44,273,273,273,250,250,250,250,250,250,255,200,42,43,43,44,200,50,200,211,210,210,210,210,210,210,210,55,57,57,56,200,200,200,242,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,1,2,200,254,250,250,255,200,65,230,230,71,74,200,200,200,200,200,200,42,44,72,73,232,73,74,254,250,259,250,250,13,250,259,259,250,250,250,250,41,40,40,45,72,70,230,230,75,46,40,45,270,270,273,273,273,273,272,272,41,45,200,200,46,45,259,273,273,273,250,250,250,250,250,250,255,200,200,200,200,200,200,200,200,216,217,217,53,57,57,54,210,210,210,223,200,200,53,57,57,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,250,250,255,200,65,230,230,75,200,200,200,200,200,200,200,200,200,200,200,200,200,46,48,250,250,250,250,13,250,250,250,250,250,250,250,41,40,40,40,48,65,230,230,75,41,40,45,270,270,273,273,273,273,273,273,41,45,200,46,40,45,259,273,273,273,250,250,250,250,250,250,262,253,200,46,47,47,48,52,200,200,200,200,51,46,48,55,57,57,57,57,57,57,56,1,2,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,254,273,273,255,200,65,230,230,61,63,63,63,63,64,200,46,47,48,200,200,200,200,41,45,250,259,250,250,13,13,13,250,250,250,271,250,41,40,40,40,45,72,234,235,74,41,40,40,48,270,270,273,273,273,273,273,41,45,200,41,40,45,273,273,273,273,250,250,250,250,250,250,250,255,200,41,40,40,45,55,57,57,57,57,56,41,40,47,48,201,1,2,1,2,1,6,5,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,273,273,255,200,65,230,230,230,230,230,230,230,75,200,41,40,40,47,47,47,47,40,45,250,250,250,250,14,259,13,250,250,271,271,271,41,40,40,40,45,11,200,200,11,41,40,40,40,47,47,47,47,47,48,13,41,45,200,41,40,45,273,273,273,273,250,250,250,250,250,250,250,255,200,41,40,40,40,47,47,47,47,47,47,40,40,40,45,1,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,254,273,273,255,200,65,230,230,230,230,230,230,230,75,200,41,40,40,43,43,40,40,40,45,250,250,250,259,14,259,13,250,250,271,271,271,41,40,40,40,45,11,224,200,11,42,43,43,43,40,40,43,40,40,45,13,42,44,252,42,40,45,273,273,273,273,250,250,250,250,250,250,250,255,200,41,40,40,40,40,40,40,40,40,40,40,40,40,45,3,5,6,5,6,5,6,5,2,11,13,13,13,13,13,13,13,13 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,273,273,255,200,72,73,73,73,73,73,70,230,75,200,41,40,45,1,2,42,43,43,44,13,13,259,259,13,13,13,13,13,271,271,271,42,43,43,43,44,11,211,214,11,1,2,1,2,42,44,200,42,43,44,250,250,250,250,250,41,45,273,273,273,250,250,250,250,250,250,250,250,255,200,41,40,40,40,40,40,40,40,40,40,40,40,40,45,1,6,5,6,4,3,4,3,4,254,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,5,2,200,254,273,273,255,200,200,200,200,200,200,200,72,73,74,200,41,40,45,3,4,200,200,200,254,250,13,259,259,13,260,257,261,13,271,271,271,271,271,271,255,200,200,211,218,1,6,5,6,5,2,200,200,200,251,263,250,260,257,261,13,41,45,259,273,273,250,250,250,250,250,250,250,250,255,200,41,40,40,40,40,40,40,40,40,40,40,40,40,45,3,4,3,4,200,46,47,47,48,254,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,6,5,2,254,273,273,255,200,200,1,2,1,2,200,200,200,200,200,41,40,45,200,200,200,200,200,254,250,13,13,13,13,255,200,254,13,250,271,271,271,271,271,255,200,212,215,200,3,5,6,5,6,4,200,200,200,254,250,250,255,200,254,13,42,44,250,273,273,250,250,250,250,250,250,250,250,255,200,41,40,40,40,40,40,40,40,40,40,40,40,40,40,48,11,251,252,252,42,43,43,44,263,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,5,6,4,254,273,273,255,200,1,6,5,6,4,200,200,200,200,200,42,43,44,200,212,214,200,251,263,250,250,250,250,250,262,252,263,13,250,250,250,271,271,271,262,253,216,218,200,200,3,4,3,4,200,200,200,200,254,250,46,47,47,48,259,259,259,250,273,273,250,250,250,250,250,250,250,250,255,200,42,43,43,43,43,40,40,40,40,40,40,40,40,40,45,251,263,250,250,250,250,13,250,250,250,250,250,260,257,261,250,13 +0,0,0,0,0,0,0,0,0,0,6,5,2,254,273,273,255,200,3,5,6,5,2,200,200,200,200,200,200,200,200,220,210,215,200,254,250,250,250,250,250,250,250,250,250,13,13,250,250,271,271,270,270,262,252,252,253,200,200,46,47,47,47,48,200,46,47,47,43,43,43,44,259,259,250,259,250,250,250,250,250,250,250,250,250,260,258,200,200,1,2,1,2,42,43,43,40,40,40,40,40,40,45,254,250,250,250,250,250,13,250,250,250,250,250,262,252,263,250,13 +0,0,0,0,0,0,0,0,0,0,5,6,4,254,273,273,255,200,1,6,5,6,4,200,200,200,200,200,46,47,48,200,211,218,200,254,250,250,250,250,250,250,250,250,250,250,250,250,250,250,270,270,270,270,270,270,262,252,252,42,43,43,43,44,252,42,43,44,250,250,250,250,14,14,250,250,250,250,250,250,250,250,250,250,260,258,200,200,1,6,5,6,5,2,1,2,42,40,40,40,40,40,45,254,250,250,250,260,257,46,48,261,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,273,273,255,200,3,5,6,5,2,200,200,1,2,200,41,40,45,200,227,200,251,263,250,250,13,13,13,13,13,13,13,13,13,250,250,250,250,250,270,270,270,270,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,200,1,6,5,6,5,6,5,6,5,2,41,40,40,40,40,44,254,250,250,260,258,200,41,45,254,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,5,2,200,254,273,273,255,200,200,3,5,6,5,2,1,6,4,200,41,40,45,200,200,200,254,250,250,250,13,250,250,250,250,250,250,250,13,250,250,250,250,250,250,270,270,270,270,270,270,270,270,270,270,270,270,270,270,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,200,3,5,6,5,6,5,6,5,6,4,41,40,40,40,45,200,254,250,250,255,200,46,40,45,254,250,250,250,250,250,250,250,13 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,273,273,262,253,200,1,6,5,6,5,6,5,2,200,41,40,45,200,200,200,254,250,250,13,13,250,250,250,250,250,250,250,13,13,14,14,14,250,250,250,270,270,270,270,270,270,270,270,270,270,270,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,200,1,6,5,6,5,6,5,6,5,2,41,40,40,40,45,200,254,250,250,46,47,40,45,45,11,13,13,13,13,13,13,13,13 +0,0,0,0,0,0,0,0,0,0,5,2,200,254,273,273,272,262,253,3,4,3,5,6,5,6,4,200,42,43,44,200,200,200,254,250,250,13,250,250,250,250,250,250,250,250,250,13,259,259,14,250,250,250,250,270,270,270,270,270,270,270,270,270,270,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,200,3,4,3,4,3,4,3,4,3,4,41,40,40,40,45,200,254,250,250,41,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,4,200,254,273,272,272,272,262,252,252,253,3,4,3,4,251,252,252,252,252,252,252,252,263,250,250,13,250,250,250,250,250,250,250,250,250,13,259,259,14,250,250,250,250,250,270,270,270,270,270,270,270,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,255,200,46,47,48,200,200,200,200,200,200,200,200,42,40,40,40,44,251,263,250,250,41,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,256,261,272,272,272,272,272,272,262,252,252,252,252,263,272,272,272,272,272,272,250,250,250,250,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,262,253,41,40,45,200,200,200,200,200,200,200,200,200,42,43,44,200,254,250,250,250,41,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,4,200,200,256,257,261,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,13,250,250,250,13,250,250,250,250,250,250,250,250,250,250,250,250,250,250,13,13,13,13,13,13,13,13,13,250,250,250,250,250,250,250,250,250,262,42,43,44,252,252,252,252,252,252,252,253,200,200,200,200,251,263,250,250,250,41,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,2,200,200,200,200,256,257,261,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,13,13,13,13,13,250,250,250,250,250,250,250,250,250,250,250,250,13,13,250,250,250,250,250,250,250,46,47,47,47,47,47,48,14,250,250,250,250,250,14,250,250,250,250,250,250,250,250,262,252,252,252,252,263,250,250,250,250,41,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,2,200,200,200,200,200,256,257,257,257,257,257,257,257,257,257,257,257,257,257,261,250,250,250,250,250,250,250,250,250,250,250,250,272,272,272,272,272,272,272,13,13,13,13,13,13,13,13,13,13,13,13,13,13,272,272,250,250,250,250,250,260,42,43,43,43,43,43,44,257,257,261,14,250,250,14,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,46,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,6,5,2,1,2,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,256,257,257,257,257,257,257,257,257,261,250,250,250,250,250,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,250,250,250,250,250,255,200,203,200,200,200,200,200,200,200,256,46,47,47,48,257,257,257,257,257,261,250,250,250,250,250,250,250,250,250,250,46,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,6,5,6,5,2,200,200,62,63,63,63,63,63,63,64,200,200,200,200,200,200,200,200,200,200,200,200,200,200,256,257,257,257,257,261,250,250,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,250,250,250,250,250,250,255,200,203,200,200,200,200,200,200,46,47,40,40,40,40,47,47,47,48,200,256,257,257,257,257,46,47,47,47,47,47,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,4,62,63,60,230,230,230,230,230,230,61,63,63,63,63,63,63,64,200,200,200,200,200,200,200,200,62,63,63,64,254,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,46,47,47,47,47,47,47,48,200,41,40,40,40,40,40,40,40,40,40,47,47,47,47,47,47,40,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,5,6,5,6,5,2,65,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,61,63,63,63,63,63,63,63,63,60,230,230,75,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,41,40,40,40,40,40,40,40,47,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,41,40,40,40,40,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,42,43,43,43,43,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,201,200,200,201,201,41,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,48,200,200,200,200,201,42,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,44,200,200,200,200,201,201,41,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,200,208,200,200,201,201,41,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,206,207,200,200,201,201,41,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,201,200,200,200,200,46,47,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,48,200,200,207,208,41,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,40,47,47,47,47,40,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FIELDS_BG2.csv b/intra/source/csv/FIELDS_BG2.csv new file mode 100644 index 0000000..10e6369 --- /dev/null +++ b/intra/source/csv/FIELDS_BG2.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FIELDS_FG.csv b/intra/source/csv/FIELDS_FG.csv new file mode 100644 index 0000000..e6dc80a --- /dev/null +++ b/intra/source/csv/FIELDS_FG.csv @@ -0,0 +1,120 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,281,283,280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,285,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,293,290,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,230,230,291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,301,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,287,310,301,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,289,310,301,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FOREST_BG.csv b/intra/source/csv/FOREST_BG.csv new file mode 100644 index 0000000..0d8d852 --- /dev/null +++ b/intra/source/csv/FOREST_BG.csv @@ -0,0 +1,90 @@ +1,1,1,1,1,1,1,1,1,1,11,11,11,1,1,11,11,1,11,1,1,1,11,1,31,1,11,11,1,11,0,0,0,0,0,0,0,0,0,0,1,1,1,8,8,1,11,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,8,8,8,8,8,8,8,1,11,11,11,1,1,23,31,1,11,1,1,1,11,1,10,1,11,11,1,11,0,0,0,0,0,0,0,0,0,0,11,10,9,80,80,7,10,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,80,111,112,112,112,113,80,2,11,11,11,1,1,31,10,1,10,1,1,1,10,1,1,1,10,31,1,11,0,0,0,0,0,0,0,0,0,0,11,6,80,80,80,80,7,1,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,111,125,110,110,110,124,113,2,11,23,11,1,1,10,1,1,1,8,8,8,8,8,8,8,1,10,1,23,0,0,0,0,0,0,0,0,0,0,11,6,80,80,80,80,80,7,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,121,110,110,110,110,110,123,2,11,11,23,1,8,8,8,8,9,80,80,80,80,80,80,80,7,8,1,10,0,0,0,0,0,0,0,0,0,0,23,16,112,112,113,80,80,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,121,110,110,110,110,110,123,2,31,10,23,6,80,80,80,80,80,80,80,3,4,4,5,80,80,80,7,1,0,0,0,0,0,0,0,0,0,0,31,16,110,110,124,112,113,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,121,110,110,110,110,110,123,2,10,1,11,6,80,3,5,20,80,3,4,1,1,1,1,4,5,80,80,2,0,0,0,0,0,0,0,0,0,0,10,16,115,110,110,110,123,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,131,115,110,110,110,114,133,2,1,1,10,6,80,2,1,4,4,1,1,1,1,1,1,1,6,20,80,2,0,0,0,0,0,0,0,0,0,0,1,6,131,132,115,110,124,112,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,80,131,132,132,132,133,80,2,1,1,1,6,80,2,1,1,1,1,1,1,1,1,1,1,6,80,80,2,0,0,0,0,0,0,0,0,0,0,1,1,5,80,121,110,110,110,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,4,4,4,4,4,4,4,1,1,1,1,6,80,2,1,1,1,1,1,1,1,1,1,1,6,80,80,2,0,0,0,0,0,0,0,0,0,0,1,1,9,80,131,132,132,13,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,11,1,11,1,1,1,1,1,1,11,1,11,6,80,2,11,1,23,1,1,11,11,11,1,1,6,80,80,2,1,1,1,1,1,1,1,1,1,1,1,6,80,80,80,3,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,11,1,23,1,1,1,1,1,1,11,1,23,6,80,2,31,1,10,1,1,11,23,10,1,1,6,80,20,2,1,1,1,1,1,1,1,8,8,1,1,6,80,80,80,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,11,1,10,1,1,8,1,1,1,11,1,10,6,80,2,10,1,1,1,1,10,10,1,1,1,6,80,80,2,1,1,8,1,1,8,9,25,25,7,8,9,80,111,112,17,18,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,10,1,1,1,6,80,2,1,1,10,1,1,6,80,2,1,8,8,8,8,8,8,8,1,1,1,5,80,2,1,6,80,2,6,25,80,80,80,80,80,20,80,121,110,110,110,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,8,8,8,9,80,7,8,8,8,8,8,9,80,7,9,80,80,80,80,80,20,80,7,8,8,9,80,7,8,9,80,7,9,80,80,80,20,3,4,5,111,125,110,114,132,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,9,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,2,1,1,15,110,110,123,80,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,80,3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,20,80,80,80,80,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,16,132,132,133,80,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,3,4,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,7,8,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,11,1,11,11,1,11,1,1,1,11,1,1,1,1,1,1,1,1,1,11,11,1,11,1,1,11,1,11,11,1,11,6,80,80,20,7,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,11,1,11,11,1,11,1,1,1,11,1,1,18,18,18,18,18,1,1,11,11,1,11,1,1,10,1,11,11,1,11,16,112,112,112,113,7,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,11,1,11,11,1,11,1,1,1,23,1,19,110,110,110,110,110,17,1,11,11,1,10,8,8,8,1,11,11,1,31,16,110,110,110,124,113,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,11,1,11,11,1,10,1,1,1,11,6,121,110,110,110,110,110,123,2,11,31,1,9,80,80,80,2,11,11,1,23,16,132,132,115,110,124,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,10,1,11,11,1,1,1,1,1,10,6,131,115,110,110,110,114,133,2,23,11,6,80,80,80,80,2,10,31,1,11,6,80,80,121,110,110,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,11,1,1,11,10,1,1,8,8,8,8,9,80,131,132,132,132,133,80,2,10,23,6,80,80,80,80,7,1,23,1,10,9,80,80,131,132,132,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,10,1,1,10,1,1,6,26,80,80,80,80,80,80,80,80,80,80,80,2,1,10,6,80,80,80,80,80,2,11,1,6,80,80,25,3,4,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,80,80,80,80,80,80,80,80,80,80,80,2,1,1,6,80,80,80,111,112,12,10,1,6,80,25,3,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,11,1,11,1,1,1,1,1,1,1,1,1,1,1,4,4,4,5,80,80,80,80,80,80,80,3,1,1,1,1,4,4,5,125,110,12,1,1,6,80,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,11,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,80,80,80,80,80,3,1,1,1,1,1,1,1,16,110,110,12,1,1,6,80,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,11,1,23,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,80,80,80,80,2,1,1,11,1,11,11,11,16,110,110,12,1,1,6,80,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,10,23,1,10,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,9,80,80,80,80,80,2,1,1,11,1,11,11,11,16,110,110,12,1,1,6,80,7,8,8,8,8,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,1,1,10,1,8,8,8,8,8,8,8,8,9,25,80,80,80,80,80,80,80,80,80,80,80,3,1,1,1,11,1,11,11,11,16,110,110,12,1,1,6,80,80,80,80,80,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,9,25,80,80,80,80,80,80,80,80,80,80,80,80,80,3,4,4,4,4,4,4,1,1,1,1,23,1,23,31,11,16,110,110,12,11,11,1,4,4,4,4,5,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +90,80,80,80,80,80,80,25,3,4,4,4,5,80,80,80,80,3,4,1,1,1,1,1,1,1,1,1,1,1,11,1,31,10,11,16,110,110,12,11,11,1,1,1,11,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,4,4,4,4,4,4,4,1,1,1,1,1,5,80,80,25,2,1,1,1,1,1,1,1,1,1,1,1,1,10,1,10,1,11,16,110,110,12,11,11,11,1,1,11,1,6,20,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +18,18,18,1,1,1,1,1,1,1,1,1,1,6,80,80,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,16,110,110,12,11,11,11,1,11,11,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +110,110,110,12,1,1,1,1,1,1,1,1,8,9,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,110,110,12,11,23,11,1,31,23,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,15,110,12,1,1,1,1,1,1,1,6,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,110,110,12,23,11,10,1,23,10,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,16,110,12,1,1,1,1,1,1,1,6,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,110,110,12,10,10,1,1,11,1,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,16,110,12,11,1,1,1,11,11,1,6,80,80,80,80,2,1,11,11,11,1,1,1,1,1,1,1,1,1,11,11,11,1,1,16,110,110,12,1,1,1,1,10,1,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,16,110,12,11,1,1,1,11,11,1,6,80,80,80,80,2,1,11,11,11,1,1,1,1,1,1,1,1,1,11,11,11,1,1,16,110,110,12,1,11,11,1,8,8,8,9,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,16,110,12,31,1,11,1,10,23,1,6,80,80,80,3,1,1,11,31,11,1,8,8,8,8,8,8,1,1,11,11,11,1,1,16,110,110,12,1,11,11,6,80,80,80,80,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +31,16,110,12,11,1,11,1,1,10,1,9,80,80,80,2,1,1,23,10,11,6,111,112,112,112,112,113,7,1,11,11,11,1,1,16,110,110,12,1,11,11,6,80,3,4,5,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,16,110,12,10,1,23,1,1,8,9,80,80,80,80,7,1,1,10,1,10,6,121,110,110,110,110,123,80,2,11,11,11,1,1,16,110,110,12,1,11,11,6,80,2,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,16,110,12,1,1,10,1,9,80,80,111,112,112,112,112,17,18,18,18,18,19,125,110,110,110,110,123,80,2,10,11,11,1,1,16,110,110,12,1,11,10,6,80,2,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,16,110,17,18,18,18,19,112,112,112,125,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,123,3,1,1,11,10,1,1,16,132,132,12,1,10,1,6,80,2,1,6,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,16,110,110,30,110,110,110,110,110,110,110,110,114,132,13,14,14,14,14,14,15,132,132,132,132,132,133,2,1,1,11,1,1,1,9,80,80,7,8,8,8,9,80,7,8,9,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,14,14,15,132,132,132,132,132,132,132,132,133,80,2,1,1,1,1,1,1,4,5,80,80,3,4,1,1,1,10,1,1,9,20,80,80,80,80,80,80,80,80,80,80,80,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,6,80,80,80,3,4,4,4,5,80,3,1,1,1,1,1,1,1,1,6,80,80,2,1,1,1,1,1,1,6,80,80,80,80,80,3,4,4,4,4,4,4,4,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,11,11,1,6,80,80,80,2,11,11,1,6,80,2,1,11,11,1,11,11,11,1,6,80,80,2,11,11,11,11,11,1,9,80,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,1,6,80,80,80,2,11,11,1,6,80,2,1,11,11,1,11,11,11,1,6,80,80,2,11,11,11,11,11,6,20,80,3,4,5,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,1,6,80,80,80,2,11,11,1,6,80,2,1,11,11,1,11,11,11,1,6,80,80,2,11,11,11,11,11,1,5,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,11,1,6,80,80,80,2,11,11,1,6,80,2,1,11,11,1,11,11,11,1,6,80,80,2,11,11,11,11,11,1,6,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,1,23,1,1,5,80,80,2,11,23,1,6,80,2,1,11,31,1,23,11,11,1,6,20,80,2,11,11,11,11,10,1,6,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,1,10,1,1,6,80,80,2,10,10,1,6,80,2,1,10,11,1,11,11,10,1,6,80,80,2,11,11,11,11,1,1,6,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,1,1,1,1,1,5,80,7,8,8,8,9,80,2,1,1,23,1,10,11,1,1,6,80,80,2,11,10,11,10,1,1,9,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,6,80,80,80,80,80,80,80,2,1,1,10,1,1,10,1,1,6,80,80,2,10,1,11,1,1,6,25,80,2,1,6,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,5,80,80,80,80,80,80,2,1,1,1,1,1,1,1,1,6,80,80,2,1,1,10,1,1,9,80,80,7,8,9,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,4,4,5,25,80,25,2,1,1,1,1,1,1,1,1,6,80,80,2,1,1,1,1,6,80,80,80,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,11,11,1,8,8,8,8,8,8,9,25,80,25,2,1,1,1,1,1,1,1,1,6,80,80,2,1,1,1,1,6,80,80,80,80,80,80,80,2,1,1,1,1,1,11,11,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,11,11,6,80,80,80,80,80,25,25,25,80,80,7,8,8,1,1,1,1,1,1,6,80,80,2,1,1,1,1,6,80,80,80,80,80,80,80,2,1,1,1,1,1,11,11,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,11,11,6,80,3,4,5,80,80,80,80,80,80,80,80,80,7,8,8,8,8,1,6,80,20,2,1,1,1,1,6,20,80,80,80,80,80,3,1,1,1,1,1,1,11,11,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,11,11,6,80,2,1,1,5,25,25,80,80,80,80,80,80,80,25,25,25,80,7,9,80,80,2,1,1,1,1,1,5,80,80,80,80,80,2,1,1,1,1,1,1,11,11,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +11,23,10,6,80,7,8,8,8,4,5,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,2,1,1,1,1,1,6,80,80,80,80,80,2,1,1,1,1,1,1,11,11,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +10,11,1,6,80,80,80,80,80,2,6,80,80,80,80,80,80,80,25,25,25,80,3,4,4,4,1,1,1,1,1,1,6,80,80,80,80,80,7,1,1,1,1,1,1,11,31,1,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,10,1,1,4,4,4,5,80,2,6,80,80,80,80,80,80,80,3,4,4,4,1,1,1,1,1,1,1,1,1,1,6,80,80,80,80,80,80,2,1,1,1,1,1,11,23,1,31,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,8,8,8,8,8,9,80,2,1,5,80,80,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,80,80,80,80,80,7,8,8,1,1,1,23,10,1,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,80,80,80,80,80,80,80,2,1,6,80,80,80,80,80,80,2,1,1,1,1,1,1,1,1,1,1,1,1,1,6,80,80,80,80,80,80,80,80,80,2,1,1,10,1,1,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,80,80,3,4,4,4,4,1,1,1,5,80,80,80,3,4,1,1,1,11,1,1,1,11,1,1,1,1,1,1,6,80,80,80,80,80,80,3,5,80,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,6,80,80,7,8,8,8,8,1,11,1,6,80,80,80,2,1,1,1,1,11,11,1,1,23,11,1,11,1,1,1,6,80,80,80,80,80,80,7,9,80,7,8,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,5,80,80,80,25,80,25,2,11,1,16,112,112,112,12,1,1,1,1,11,11,1,1,31,23,1,11,1,1,1,9,80,80,80,80,80,20,80,80,80,80,80,7,8,8,8,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,6,80,80,80,80,80,25,2,11,1,19,110,110,110,17,1,1,1,1,10,31,1,1,10,11,1,10,1,1,6,25,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,6,112,112,112,113,80,80,2,31,16,110,110,110,110,110,17,1,1,1,1,10,1,1,1,10,1,1,1,1,6,80,111,112,112,112,112,112,112,112,112,112,112,113,80,80,80,80,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,18,19,110,110,110,124,112,3,1,23,16,110,110,110,110,110,110,17,18,18,18,18,18,18,18,18,18,18,18,18,19,112,125,110,110,110,110,110,110,110,110,110,110,123,80,80,80,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,35,81,110,110,110,110,110,12,1,10,16,35,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,114,132,132,132,132,132,132,115,110,123,80,80,80,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,110,17,1,1,16,35,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,114,132,132,133,80,80,80,80,80,80,121,110,13,4,4,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,110,110,17,18,19,110,110,110,110,110,110,110,13,14,14,14,14,14,14,14,14,14,14,14,14,5,25,80,80,80,80,3,4,4,4,15,110,12,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,13,14,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,25,80,80,80,2,1,1,1,16,110,12,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,13,14,14,14,14,15,110,110,110,110,12,1,1,1,1,1,1,1,1,1,1,23,1,1,1,1,1,4,5,80,80,2,1,1,1,16,110,12,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,12,1,11,11,1,16,110,110,110,110,12,1,1,1,1,31,1,1,1,1,1,10,1,1,8,8,8,8,9,80,80,2,1,1,1,16,110,12,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,12,1,31,11,1,16,110,110,110,110,17,18,1,1,1,10,1,1,1,1,8,8,8,9,80,80,80,80,80,80,3,1,1,1,1,16,110,17,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,110,110,110,110,110,110,17,18,10,10,1,16,110,110,110,110,81,35,12,1,8,8,8,8,8,9,80,80,80,80,80,80,80,80,3,4,1,1,1,1,1,16,110,110,17,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,81,110,110,110,110,110,110,110,17,18,18,19,110,110,110,110,110,110,17,9,80,80,80,80,80,80,80,80,3,4,4,4,4,4,1,1,1,1,1,1,1,1,15,110,110,110,81,81,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,35,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,123,80,80,80,80,80,80,80,80,3,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,14,14,14,14,14,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,35,81,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,123,80,80,80,3,4,4,4,4,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +16,132,132,115,110,110,110,110,110,110,110,110,110,110,110,110,110,114,132,13,4,4,4,1,1,1,1,1,1,1,11,1,1,1,1,11,1,11,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,80,131,132,115,110,110,110,110,110,110,110,110,110,110,110,123,80,2,1,1,1,1,1,1,1,1,1,11,11,1,1,1,1,11,1,11,11,11,11,11,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,80,80,80,121,110,110,110,110,110,110,110,110,110,110,114,133,80,2,1,1,1,1,1,1,1,11,1,11,11,11,11,1,1,11,1,11,11,23,11,11,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,4,4,4,4,14,14,14,14,14,14,14,14,14,14,14,14,14,4,1,1,1,1,1,1,1,1,23,1,11,23,11,11,1,1,31,1,23,11,11,23,11,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FOREST_BG2.csv b/intra/source/csv/FOREST_BG2.csv new file mode 100644 index 0000000..131f4fd --- /dev/null +++ b/intra/source/csv/FOREST_BG2.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,21,0,21,21,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,21,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,31,0,0,21,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,31,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,31,23,21,0,0,0,0,0,0,31,31,0,0,21,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,23,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,23,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,21,21,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,21,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/FOREST_FG.csv b/intra/source/csv/FOREST_FG.csv new file mode 100644 index 0000000..22e1b91 --- /dev/null +++ b/intra/source/csv/FOREST_FG.csv @@ -0,0 +1,90 @@ +0,0,0,0,0,0,0,0,0,0,171,171,171,171,182,178,179,0,177,183,171,182,178,179,0,177,178,183,171,171,0,0,0,0,0,0,0,0,0,0,171,182,178,179,0,0,177,183,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,171,171,171,182,179,0,0,0,0,177,178,179,0,0,0,0,0,177,178,183,0,0,0,0,0,0,0,0,0,0,182,179,0,0,0,0,0,177,178,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,182,178,183,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,176,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,179,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,175,0,0,0,0,0,0,173,174,174,174,181,171,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,180,175,0,0,0,173,174,181,171,171,171,171,171,171,180,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,171,180,174,175,0,172,171,182,178,183,171,182,178,183,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,182,178,178,179,0,177,178,183,171,171,182,178,179,0,177,178,179,0,177,178,179,0,177,183,182,179,0,0,0,0,177,178,183,171,182,178,179,0,0,0,0,0,0,0,0,0,0,177,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,179,0,0,0,0,0,0,177,178,178,179,0,0,0,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,177,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,174,175,0,0,0,0,0,0,0,0,0,0,0,173,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,0,0,0,173,174,175,0,0,0,173,181,171,180,174,175,0,0,0,0,0,0,0,0,173,174,175,0,0,173,174,181,171,171,180,174,174,174,174,175,0,0,0,0,173,174,181,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,174,175,0,173,174,181,171,180,174,174,174,181,171,171,171,171,180,174,174,175,0,0,0,0,173,181,171,180,174,174,181,171,171,171,171,171,171,171,171,171,180,175,0,0,0,177,183,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,180,174,181,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,180,174,175,0,0,172,171,171,171,171,171,171,171,171,182,178,183,171,171,171,171,171,176,0,0,0,0,172,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,182,178,178,183,171,171,182,179,0,0,177,178,183,171,171,171,171,182,178,179,0,177,183,171,171,171,182,179,0,0,0,0,177,178,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,171,171,182,178,183,171,182,179,0,0,177,178,178,179,0,0,0,0,0,177,178,178,183,182,179,0,0,0,0,172,171,171,182,179,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,171,182,179,0,177,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,177,178,183,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,180,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,171,171,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,171,171,171,171,171,171,171,180,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,181,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,182,178,178,178,183,171,171,171,171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,180,174,175,0,0,0,0,0,0,0,0,0,0,0,173,181,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,176,0,0,0,177,183,171,171,171,171,171,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,171,180,174,175,0,0,0,173,175,0,0,0,0,172,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +178,179,0,0,0,0,177,178,183,171,171,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,171,171,171,171,171,180,175,0,0,172,180,175,0,0,0,177,183,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,177,178,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,183,171,182,178,183,171,182,179,0,173,181,171,176,0,0,0,0,177,178,183,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,178,179,0,177,178,179,0,0,172,171,182,179,0,0,0,0,0,0,177,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,180,175,0,173,174,175,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,0,172,171,171,180,174,181,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,173,174,175,0,0,0,173,181,171,180,174,175,0,0,0,0,0,0,0,177,183,171,171,171,182,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,173,181,171,176,0,0,0,0,0,0,173,181,171,180,174,175,0,172,171,171,171,171,180,175,0,0,0,0,0,0,0,177,178,183,182,179,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,173,174,175,0,172,171,171,180,175,0,0,0,173,174,181,171,171,171,171,180,174,181,171,171,171,171,171,176,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,172,171,180,174,181,171,171,171,176,0,0,173,181,171,171,171,171,171,171,171,171,182,178,183,171,171,171,180,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,173,181,171,171,171,171,171,171,171,176,0,0,172,171,171,171,171,171,171,171,171,171,176,0,172,171,171,171,171,171,180,175,0,0,0,0,0,173,175,0,0,0,0,0,0,172,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,175,0,172,171,171,171,171,171,171,182,178,179,0,0,177,178,183,171,171,171,171,171,182,178,179,0,177,183,171,171,171,171,171,176,0,0,0,0,0,172,180,175,0,0,0,0,0,177,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,179,0,177,178,183,171,182,178,178,179,0,0,0,0,0,0,177,178,178,183,171,182,179,0,0,0,0,172,171,171,171,171,182,179,0,0,0,0,173,181,171,176,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,0,0,0,177,178,179,0,0,0,0,0,0,0,0,0,0,0,0,177,178,179,0,0,0,0,0,177,183,171,182,178,179,0,0,0,0,0,172,171,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,178,179,0,0,0,0,0,0,0,177,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,180,175,0,0,0,0,0,173,174,175,0,0,0,0,0,173,174,174,174,175,0,0,0,0,0,173,174,181,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,180,175,0,0,0,0,172,171,176,0,0,0,173,174,181,171,171,171,180,175,0,0,0,0,172,171,171,171,180,175,0,0,0,0,0,0,0,0,0,0,0,0,173,174,181,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,176,0,0,173,174,181,171,180,175,0,0,172,171,171,171,171,171,171,176,0,0,0,173,181,171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,173,181,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,182,179,0,0,172,171,171,171,182,179,0,173,181,171,171,171,171,171,182,179,0,0,0,172,171,171,171,182,178,179,0,0,0,0,0,0,0,173,174,174,174,181,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,178,178,179,0,0,0,177,183,171,182,179,0,0,177,178,183,171,182,178,178,179,0,0,0,0,177,183,182,178,179,0,0,0,0,0,0,0,0,173,181,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,0,0,0,0,0,0,177,178,179,0,0,0,0,0,177,178,179,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,178,183,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,174,181,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,180,175,0,0,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,176,0,0,0,0,0,0,0,0,173,181,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,178,183,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,183,171,176,0,0,0,0,0,0,0,173,181,171,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,182,179,0,0,0,0,0,0,0,172,171,171,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,176,0,0,0,0,0,0,0,0,177,183,171,171,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,176,0,0,0,0,0,0,0,0,0,177,178,183,171,171,171,182,178,183,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,180,175,0,0,0,0,0,0,0,0,0,0,177,183,171,182,179,0,177,178,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,174,175,0,172,171,171,176,0,0,0,0,0,0,0,0,0,0,0,177,178,179,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,0,0,0,0,0,0,173,175,0,0,0,0,0,0,0,0,0,0,173,181,171,171,180,174,181,171,171,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,175,0,0,0,0,0,0,173,181,180,175,0,0,0,0,0,0,0,173,174,181,171,171,182,183,171,171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,180,175,0,0,0,0,0,172,171,171,176,0,0,0,0,0,0,173,181,171,171,171,182,179,177,183,171,171,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,171,176,0,0,0,0,0,177,183,171,176,0,0,0,0,0,0,172,171,182,178,178,179,0,0,177,178,183,171,171,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,182,179,0,0,0,0,0,0,172,182,179,0,0,0,0,0,0,177,178,179,0,0,0,0,0,0,0,177,178,178,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,179,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,180,174,175,0,0,173,174,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,171,180,174,174,181,171,180,175,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,181,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,175,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,173,174,181,171,171,171,171,171,182,178,183,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,172,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,176,0,0,0,0,0,0,173,181,171,176,0,0,0,0,0,0,0,177,183,182,178,183,171,171,182,179,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,183,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,176,0,0,0,0,0,0,177,178,178,179,0,0,0,0,0,0,0,0,177,179,0,177,183,182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,183,182,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +182,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,175,0,0,0,173,174,181,171,180,174,174,181,180,175,0,0,0,0,0,173,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,181,171,180,174,174,174,181,171,171,171,171,171,171,171,171,180,174,175,0,173,174,181,180,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,174,181,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,180,174,181,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +175,0,0,0,0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,0,0,0,173,181,171,182,178,183,171,171,171,171,171,171,182,178,178,183,182,178,178,183,171,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +180,175,0,0,0,0,0,173,181,171,180,174,175,0,0,0,0,0,0,0,0,0,172,171,182,179,0,177,178,178,178,183,171,171,176,0,0,177,179,0,0,177,183,171,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +171,180,174,175,0,0,0,172,171,171,171,171,180,175,0,0,0,0,0,0,0,173,181,171,176,0,0,0,0,0,0,177,183,182,179,0,0,0,0,0,0,0,177,183,171,171,171,171,171,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/GO_BG.csv b/intra/source/csv/GO_BG.csv new file mode 100644 index 0000000..8ffefb2 --- /dev/null +++ b/intra/source/csv/GO_BG.csv @@ -0,0 +1,60 @@ +6,80,81,81,81,81,81,81,82,6,0,0,0,0,0,0,0,0,0,0,130,130,130,130,130,130,130,130,130,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,130,130,130,130,130,130,130,130,130,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,109,109,109,130,130,130,130,109,109,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,80,91,91,91,91,91,91,82,6,0,0,0,0,0,0,0,0,0,0,104,104,104,64,130,130,65,104,104,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,85,91,91,91,91,83,6,6,0,0,0,0,0,0,0,0,0,0,2,2,2,12,130,130,13,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,80,91,91,91,91,82,6,6,0,0,0,0,0,0,0,0,0,0,6,1,2,3,101,101,4,2,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,80,91,91,91,91,82,6,6,0,0,0,0,0,0,0,0,0,0,1,3,104,104,107,107,104,104,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,80,91,91,91,91,82,6,6,0,0,0,0,0,0,0,0,0,0,10,104,104,90,90,90,90,104,104,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,6,85,91,91,83,6,6,6,0,0,0,0,0,0,0,0,0,0,3,104,90,90,100,102,90,90,104,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,50,50,104,104,90,100,104,104,102,90,104,104,50,50,50,0,0,0,0,0,0,0,0,0,0,171,172,172,173,0,0,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,0,0,12,90,90,106,104,104,108,90,90,13,0,0,50,0,0,0,0,0,0,0,0,171,172,181,170,170,180,172,173,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,0,0,10,90,90,90,103,105,90,90,90,15,0,0,50,0,0,0,0,0,0,0,0,177,170,170,170,170,170,170,178,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,0,0,10,90,90,90,103,105,90,90,90,15,0,0,50,0,0,0,0,0,0,0,0,177,170,170,170,170,170,170,178,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,0,0,10,90,90,90,103,105,90,90,90,15,0,0,50,0,0,0,0,0,0,0,0,174,175,175,183,182,175,175,176,0 +6,6,6,80,91,91,82,6,6,6,0,0,0,0,0,0,0,50,0,0,11,2,2,12,103,105,13,2,2,14,0,0,50,0,0,0,0,0,0,0,0,184,185,185,174,176,185,185,186,0 +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,50,6,6,1,2,2,3,103,105,4,2,2,5,6,6,50,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,2,5,10,90,90,90,103,105,90,90,90,15,10,2,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +30,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,50,90,15,10,90,90,90,106,108,90,90,90,15,10,90,50,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90 +104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,50,50,50,90,15,10,90,90,90,90,90,90,90,90,15,10,90,50,50,50,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104 +123,30,30,90,90,90,90,90,90,90,90,90,90,90,90,50,90,90,90,4,3,90,90,100,101,101,102,90,90,4,3,90,90,90,50,90,90,90,90,90,90,90,90,90,90,90,90,30,30,124 +123,90,90,90,90,90,90,90,90,90,90,90,90,90,90,120,90,90,100,101,101,102,90,103,104,104,105,90,100,101,101,102,90,90,120,90,90,90,90,90,90,90,90,90,90,90,90,90,90,124 +123,30,30,90,90,90,90,90,90,90,90,90,90,90,90,50,90,90,106,107,107,108,90,103,104,104,105,90,106,107,107,108,90,90,50,90,90,90,90,90,90,90,90,90,90,90,90,30,30,124 +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,2,2,2,2,12,90,90,106,107,107,108,90,90,13,2,2,2,2,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,50,6,6,6,6,10,90,90,90,90,90,90,90,90,15,6,6,6,6,50,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,50,6,6,6,6,11,2,2,12,90,90,13,2,2,14,6,6,6,6,50,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +1,2,114,2,2,2,114,2,63,5,1,2,2,2,3,50,4,2,2,2,2,2,2,3,90,90,4,2,2,2,2,2,2,2,50,2,2,2,2,5,0,0,0,0,0,0,0,0,0,0 +10,14,101,10,114,114,2,101,102,15,10,30,30,90,90,50,90,90,90,30,30,100,101,129,60,61,62,101,102,30,30,90,90,90,50,90,90,30,140,15,0,0,0,0,0,0,0,0,0,0 +114,114,114,114,114,114,114,114,105,15,10,30,100,101,101,121,101,101,101,101,101,104,114,114,114,114,114,114,104,101,101,101,101,101,121,101,101,102,30,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,2,103,114,114,114,105,15,10,90,103,104,107,122,107,107,107,107,107,104,114,63,114,114,127,114,104,107,107,107,107,107,122,107,104,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,114,114,114,114,114,2,114,105,15,10,90,103,105,90,50,90,90,90,90,90,103,114,114,114,114,114,114,105,90,90,90,90,90,50,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +114,103,114,103,114,114,114,62,105,15,10,90,103,105,90,50,50,50,50,90,90,103,114,114,114,114,114,128,105,90,90,50,50,50,50,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,10,10,114,105,15,10,90,103,105,90,90,90,90,50,90,90,103,126,114,114,114,114,114,105,90,90,50,90,90,90,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +60,114,114,61,114,114,103,114,105,15,10,90,103,105,90,20,22,90,50,90,90,103,114,114,114,114,114,114,105,90,90,50,90,70,72,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,106,107,107,107,2,107,107,108,15,10,90,103,105,90,23,25,90,50,90,90,106,107,104,104,104,104,107,108,90,90,50,90,73,75,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +11,2,2,107,2,2,2,2,2,100,10,90,103,105,90,23,25,90,50,90,90,30,30,103,104,104,105,30,30,90,90,50,90,73,75,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +1,2,2,2,2,2,2,2,2,5,10,90,103,105,90,26,28,90,50,90,90,30,30,103,104,104,105,30,30,90,90,50,90,76,78,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,100,101,60,61,62,63,101,102,15,10,90,103,105,90,90,90,90,50,90,90,30,30,103,104,104,105,30,30,90,90,50,90,90,90,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,90,103,105,90,50,50,50,50,90,90,30,30,103,104,104,105,30,30,90,90,50,50,50,50,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,30,103,105,90,50,90,90,90,90,90,90,90,103,104,104,105,90,90,90,90,90,90,90,50,90,103,105,30,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,30,103,105,90,50,90,20,21,21,21,22,90,103,104,104,105,90,70,71,71,71,72,90,50,90,103,105,30,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,30,103,105,90,120,90,23,24,24,24,25,90,103,104,104,105,90,73,74,74,74,75,90,120,90,103,105,30,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,30,103,105,90,50,90,26,27,27,27,28,90,103,104,104,105,90,76,77,77,77,78,90,50,90,103,105,30,15,0,0,0,0,0,0,0,0,0,0 +10,103,114,114,114,114,114,114,105,15,10,90,103,105,90,50,90,90,90,90,90,90,90,103,104,104,105,90,90,90,90,90,90,90,50,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +10,106,107,107,107,107,107,107,108,15,10,90,103,105,90,50,50,50,90,20,21,22,90,103,104,104,105,90,70,71,72,90,50,50,50,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +11,2,2,2,2,2,2,2,2,14,10,90,103,105,90,90,90,50,90,23,24,25,90,103,104,104,105,90,73,74,75,90,50,90,90,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,90,103,105,90,90,90,50,90,26,27,28,90,103,104,104,105,90,76,77,78,90,50,90,90,90,103,105,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,90,103,104,102,90,90,50,90,90,90,90,90,103,104,104,105,90,90,90,90,90,50,90,90,100,104,105,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,90,106,104,104,101,101,121,101,101,101,101,101,104,104,104,104,101,101,101,101,101,121,101,101,104,104,108,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,90,90,106,107,107,107,122,107,107,107,107,107,107,104,104,107,107,107,107,107,107,122,107,107,107,108,90,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,90,90,90,90,90,90,50,90,90,90,90,90,31,103,105,31,90,90,90,90,90,50,90,90,90,90,90,90,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,10,30,30,90,20,22,90,50,90,90,90,31,90,32,106,108,32,90,31,90,90,90,50,90,70,72,90,30,30,15,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,11,12,30,90,26,28,90,50,90,30,30,32,90,33,90,90,33,90,32,30,30,90,50,90,76,78,90,30,13,14,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,11,12,90,90,90,90,50,90,30,30,33,13,12,90,90,13,12,33,30,30,90,50,90,90,90,90,13,14,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,6,11,2,2,2,12,50,13,2,2,2,14,10,90,90,15,11,2,2,2,12,50,13,2,2,2,14,6,6,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,10,50,15,6,6,6,6,10,125,125,15,6,6,6,6,10,50,15,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/GO_BG2.csv b/intra/source/csv/GO_BG2.csv new file mode 100644 index 0000000..0c69bff --- /dev/null +++ b/intra/source/csv/GO_BG2.csv @@ -0,0 +1,60 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,40,0,0,40,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,45,0,0,0,0,44,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,40,40,40,45,0,0,0,0,0,0,44,40,40,40,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,46,40,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,40,46,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,40,40,43,0,0,0,0,0,0,0,0,0,0,0,0,42,40,40,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,40,40,45,0,0,0,0,0,0,0,0,0,0,0,0,44,40,40,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,40,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,40,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/GO_BG2_old.csv b/intra/source/csv/GO_BG2_old.csv new file mode 100644 index 0000000..7bd493f --- /dev/null +++ b/intra/source/csv/GO_BG2_old.csv @@ -0,0 +1,60 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/GO_FG.csv b/intra/source/csv/GO_FG.csv new file mode 100644 index 0000000..438713a --- /dev/null +++ b/intra/source/csv/GO_FG.csv @@ -0,0 +1,60 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/HAPPY_BG.csv b/intra/source/csv/HAPPY_BG.csv new file mode 100644 index 0000000..e079b27 --- /dev/null +++ b/intra/source/csv/HAPPY_BG.csv @@ -0,0 +1,30 @@ +31,0,31,31,31,0,0,0,0,31,31,0,0,0,0,31,31,31,0,31,31,0,31,31,31,0,0,0,0,31,31,0,31,31,31,31,0,0,0,31,0,0,0,0,0,0,0,0,0,0 +31,21,0,0,0,60,60,60,60,31,31,60,60,21,60,31,31,31,60,31,31,60,0,0,0,60,21,60,60,31,31,21,31,31,31,31,60,70,21,31,0,0,0,0,0,0,0,0,0,0 +31,60,60,70,60,70,60,70,60,0,0,60,60,60,60,31,31,31,60,31,31,60,60,21,60,60,60,60,60,31,31,60,0,0,0,0,60,70,60,31,0,0,0,0,0,0,0,0,0,0 +31,70,60,70,60,60,70,60,60,60,60,60,60,60,60,0,0,0,60,31,31,60,60,60,60,60,60,60,60,31,31,70,70,70,70,70,70,70,70,31,0,0,0,0,0,0,0,0,0,0 +31,60,60,60,111,113,60,60,60,31,31,60,60,60,60,60,21,60,60,0,0,60,60,60,60,60,60,60,60,0,0,60,60,60,60,60,60,70,60,31,0,0,0,0,0,0,0,0,0,0 +31,70,60,60,114,115,60,60,70,31,31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,70,70,70,70,70,70,70,31,0,0,0,0,0,0,0,0,0,0 +31,60,60,70,60,60,70,60,60,31,31,60,60,31,31,31,60,60,60,31,31,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,70,60,31,0,0,0,0,0,0,0,0,0,0 +31,70,60,60,60,60,60,60,70,31,31,60,60,0,0,0,60,60,60,31,31,60,60,31,31,31,60,60,60,31,31,70,70,70,70,70,31,31,60,31,0,0,0,0,0,0,0,0,0,0 +31,60,60,60,60,70,60,70,60,31,31,60,60,60,60,60,60,60,60,31,31,60,60,31,31,31,60,60,60,31,31,60,60,60,60,60,31,31,60,31,0,0,0,0,0,0,0,0,0,0 +31,31,60,60,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,60,31,31,31,31,31,0,0,0,0,0,0,0,0,0,0 +31,31,60,60,31,31,0,0,0,31,31,0,0,0,0,0,0,0,0,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,31,30,0,0,0,0,0,50,0,0,30 +31,31,111,113,31,31,60,60,60,31,31,60,111,113,60,60,21,60,117,31,31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,21,31,30,60,60,60,60,60,50,60,60,30 +31,31,60,116,31,31,60,21,60,31,31,60,114,115,60,60,60,60,60,0,0,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,60,60,0,0,60,60,60,60,60,50,60,60,30 +31,31,111,115,31,31,60,60,60,31,31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,50,50,50,50 +31,31,60,60,31,31,60,21,60,31,31,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,60,60,31,30,30,30,30,60,20,20,20,20,61 +31,31,117,60,31,31,60,21,60,31,31,60,60,60,111,113,60,60,60,31,31,60,60,60,60,60,60,60,60,31,31,60,60,60,60,60,60,60,60,31,30,0,0,0,60,60,60,60,60,61 +31,31,114,113,31,31,60,60,60,31,31,60,60,60,114,115,60,60,117,31,31,60,60,60,60,60,60,60,21,31,31,60,60,60,60,60,60,60,60,31,30,60,60,60,60,60,60,20,20,61 +31,31,116,60,31,31,60,21,60,31,31,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,60,60,60,60,31,30,60,60,60,60,60,30,30,30,30 +31,31,114,113,31,31,60,60,60,31,31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,20,60,60,60,60,60,31,30,60,60,60,60,60,30,30,30,30 +31,31,60,60,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,60,60,60,60,60,30,30,30,30 +31,0,60,60,0,0,0,31,31,31,30,0,0,0,0,0,0,0,0,0,0,0,0,30,30,30,30,0,0,0,0,30,30,30,0,30,30,30,30,0,0,60,60,60,60,60,30,30,30,30 +31,60,60,60,111,112,113,31,31,31,30,20,60,60,60,20,60,20,60,60,60,60,60,30,30,30,30,60,60,60,60,30,30,30,20,30,30,30,30,60,60,60,60,60,60,60,30,30,30,30 +31,60,60,60,60,21,116,31,31,31,30,60,60,60,60,60,20,60,20,60,60,60,60,30,30,30,30,60,60,60,60,0,0,0,60,0,0,0,0,60,60,60,20,60,60,60,30,30,30,30 +31,60,60,60,60,60,116,0,0,0,0,60,60,60,60,60,60,60,60,60,60,60,60,0,0,0,0,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,30,30,30,30 +31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,0,0,0,30 +31,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,30 +31,113,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,30,30,30,30,30,30,60,60,60,60,60,30,30,30,30,30,30,60,60,60,60,60,30,30,30,60,60,60,30 +31,115,21,60,60,60,60,60,60,60,60,60,20,60,60,60,20,60,20,60,60,30,30,30,30,30,30,60,60,60,60,60,30,30,30,30,30,30,60,60,60,60,60,30,30,30,60,60,60,30 +31,110,112,113,60,60,60,60,60,60,60,20,60,60,60,20,60,20,60,60,60,30,30,30,30,30,30,60,60,60,60,60,30,30,30,30,30,30,20,60,60,60,60,30,30,30,60,60,20,30 +31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30 diff --git a/intra/source/csv/HAPPY_BG2.csv b/intra/source/csv/HAPPY_BG2.csv new file mode 100644 index 0000000..7ea0d87 --- /dev/null +++ b/intra/source/csv/HAPPY_BG2.csv @@ -0,0 +1,30 @@ +5,1,4,0,5,1,1,1,1,4,5,1,1,1,1,4,0,5,1,4,5,1,4,0,5,1,1,1,1,4,5,1,4,0,0,5,1,1,1,4,0,0,0,0,0,0,0,0,0,0 +7,0,2,1,3,0,0,0,0,6,7,0,0,0,0,6,0,7,0,6,7,0,2,1,3,0,0,0,0,6,7,0,6,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,2,3,0,0,0,0,6,0,7,0,6,7,0,0,0,0,0,0,0,0,6,7,0,2,1,1,3,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,3,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,12,13,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,6,7,0,0,12,11,13,0,0,0,12,13,0,0,0,0,0,0,0,0,12,13,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,6,7,0,0,2,1,3,0,0,0,6,7,0,0,12,11,13,0,0,0,6,7,0,0,0,0,0,12,13,0,6,0,0,0,0,0,0,0,0,0,0 +7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,6,0,7,0,0,0,6,7,0,0,0,0,0,6,7,0,6,0,0,0,0,0,0,0,0,0,0 +15,13,0,0,12,11,11,11,11,14,15,11,11,11,11,11,11,11,11,14,15,11,11,14,0,15,11,11,11,14,15,11,11,13,0,12,14,15,11,14,0,0,0,0,0,0,0,0,0,0 +0,7,0,0,6,5,1,1,1,4,5,1,1,1,1,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,1,1,1,3,0,2,1,1,1,4,5,1,1,1,1,3,41,2,1,4 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,41,0,0,6 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,12,13,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,41,0,0,2 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,40,40,40 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,12,13,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,12,11,11,11,13,0,0,0,0,0,0 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,5,1,1,3,0,0,0,0,0,0 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,0,0,0 +0,7,0,0,6,7,0,0,0,6,7,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,6,7,0,0,0,0,0,12,11,11,11 +0,7,0,0,6,7,0,0,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,0,6,0,0,0 +0,7,0,0,6,15,11,11,11,14,15,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,7,0,0,0,0,0,6,0,0,0 +5,3,0,0,2,1,1,4,0,0,5,1,1,1,1,1,1,1,1,1,1,1,1,4,0,0,5,1,1,1,1,4,0,5,1,4,0,0,5,1,3,0,0,0,0,0,6,0,0,0 +7,0,0,0,0,0,0,6,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,7,0,0,0,0,6,0,7,0,6,0,0,7,0,0,0,0,0,0,0,6,0,0,0 +7,0,0,0,0,0,0,6,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,7,0,0,0,0,2,1,3,0,2,1,1,3,0,0,0,0,0,0,0,6,0,0,0 +7,0,0,0,0,0,0,2,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,4 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,11,11,11,11,13,0,0,0,0,0,12,11,11,11,11,13,0,0,0,0,0,12,11,13,0,0,0,6 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,7,0,0,0,0,0,6,0,7,0,0,0,6 +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,7,0,0,0,0,0,6,0,7,0,0,0,6 +15,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,0,0,0,0,15,11,11,11,11,11,14,0,0,0,0,15,11,11,11,11,11,14,0,15,11,11,11,14 diff --git a/intra/source/csv/HAPPY_FG.csv b/intra/source/csv/HAPPY_FG.csv new file mode 100644 index 0000000..dd829ee --- /dev/null +++ b/intra/source/csv/HAPPY_FG.csv @@ -0,0 +1,10 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/HOTEL_BG.csv b/intra/source/csv/HOTEL_BG.csv new file mode 100644 index 0000000..d9e5f02 --- /dev/null +++ b/intra/source/csv/HOTEL_BG.csv @@ -0,0 +1,120 @@ +225,224,224,224,224,225,225,225,225,225,225,225,224,224,224,225,225,225,224,224,224,224,225,225,225,225,225,225,224,224,224,224,225,225,224,224,224,225,225,225,225,224,224,224,225,225,225,224,224,224,224,225,225,225,224,224,224,225,225,225,1,23,21,21,21,21,23,24,26,18,9,9,1,13,11,16,13,16,11,2,1,11,13,16,13,13,13,16,12,2,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +235,234,234,234,234,235,235,235,235,235,235,235,234,234,234,235,235,235,234,234,234,234,235,235,235,235,235,235,234,234,234,234,235,235,234,234,234,235,235,235,235,234,234,234,235,235,235,234,234,234,234,235,235,235,234,234,234,235,235,235,19,98,98,98,98,98,98,98,98,20,11,11,12,92,92,14,92,16,92,18,19,92,93,16,91,92,93,16,91,18,1,11,88,13,11,16,11,89,11,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +247,244,244,244,244,245,246,246,246,246,246,247,244,244,244,245,246,247,244,244,244,244,245,246,246,246,246,247,244,244,244,244,245,247,244,244,244,245,246,246,247,244,244,244,245,246,247,244,244,244,244,245,246,247,244,244,244,245,246,246,19,90,81,81,81,81,81,81,81,81,80,80,160,183,183,162,183,14,183,18,19,103,80,14,80,80,80,14,101,18,19,30,80,30,30,16,30,80,30,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +257,254,254,254,254,255,256,256,256,256,256,257,254,254,254,255,256,257,254,254,254,254,255,256,256,256,256,257,254,254,254,254,255,257,254,254,254,255,256,256,257,254,254,254,255,256,257,254,254,254,254,255,256,257,254,254,254,255,256,256,19,90,81,95,95,95,95,95,95,7,5,30,30,30,30,170,171,160,183,10,12,80,80,80,80,80,80,80,80,10,12,80,80,80,80,16,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +220,220,221,222,223,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,19,90,81,90,90,90,90,81,90,18,19,80,80,80,30,80,30,30,30,30,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,16,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +230,215,231,232,233,215,230,230,215,215,215,215,230,215,119,215,119,119,215,230,230,215,215,215,215,215,215,215,215,230,230,215,215,215,215,215,215,215,215,230,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,230,215,230,19,90,81,90,90,90,90,81,90,18,19,80,15,80,30,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,16,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +230,215,241,214,243,215,215,215,215,215,215,215,215,215,119,215,119,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,230,230,230,215,215,230,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,230,215,230,19,90,81,90,90,90,90,81,90,18,19,80,16,151,30,30,30,80,80,7,5,30,30,30,30,80,30,30,30,7,4,4,4,4,4,19,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +230,215,215,215,215,215,215,215,215,215,215,215,119,215,215,215,119,215,215,215,215,215,230,215,215,215,215,230,215,215,215,215,215,230,215,215,215,215,215,230,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,230,19,90,81,90,90,81,81,95,90,18,19,80,16,181,162,80,150,151,30,18,19,80,80,80,30,80,30,80,80,18,9,1,11,13,13,11,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,216,217,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,19,90,81,90,90,95,95,90,90,18,19,80,16,191,30,80,160,180,194,18,19,80,80,80,30,80,30,80,80,18,9,19,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,218,219,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,250,251,19,81,81,7,4,4,4,4,4,8,19,80,18,4,4,5,80,7,4,8,3,4,4,4,5,80,7,4,4,8,9,19,80,7,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,20,23,24,26,21,21,2,19,80,16,11,13,12,80,10,11,2,1,11,13,13,12,80,10,13,11,2,1,12,150,10,13,11,11,13,11,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,95,95,40,81,81,18,19,80,16,30,30,102,80,80,91,18,19,180,180,194,93,80,102,80,181,18,19,30,160,131,131,131,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,90,90,40,81,81,18,19,80,16,30,80,111,80,80,101,18,19,180,194,90,90,92,90,92,191,18,19,80,160,131,131,131,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,80,16,80,80,80,80,80,80,18,19,191,90,90,90,90,103,80,101,18,19,80,160,131,131,131,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,80,16,102,80,80,80,80,30,18,19,90,90,103,80,111,80,91,90,18,19,80,160,131,131,131,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,80,16,101,92,93,80,80,30,18,19,90,103,80,91,90,92,90,90,18,19,80,160,131,131,131,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,95,95,81,81,81,40,40,40,18,19,80,16,111,80,80,80,80,80,18,19,90,90,92,90,90,90,90,90,18,19,80,170,7,4,5,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,90,90,81,81,95,95,40,81,18,19,80,16,111,80,80,80,80,91,18,19,103,80,101,90,90,90,190,182,18,19,151,152,18,9,19,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,90,90,40,81,18,19,80,16,111,80,91,93,80,80,18,19,103,80,101,90,90,190,182,182,18,19,131,162,18,9,19,131,131,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,81,7,4,4,4,5,81,18,19,80,18,4,4,4,4,5,80,18,3,5,80,7,4,4,4,4,4,8,19,131,7,8,9,19,181,7,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,22,81,20,25,26,18,19,81,20,12,80,10,11,13,11,13,12,80,18,1,12,80,10,13,11,11,13,11,2,19,131,20,16,25,22,181,20,23,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,18,19,81,81,80,80,30,80,80,80,80,80,80,18,19,80,80,91,193,182,80,80,80,18,19,131,162,16,97,193,181,194,98,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,20,22,40,7,5,30,30,80,80,80,80,80,80,18,19,80,80,101,90,193,182,80,80,18,19,171,172,16,101,190,181,192,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,92,93,80,91,92,93,80,80,18,19,80,80,80,101,90,193,182,80,18,19,80,80,16,101,190,180,180,181,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,90,103,80,111,80,111,80,80,18,19,80,80,80,101,90,190,182,80,18,19,30,80,16,101,90,191,193,181,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,1,89,37,2,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,95,81,95,95,95,40,81,81,18,19,80,80,80,111,80,111,80,80,18,19,30,80,80,101,190,182,80,80,18,19,30,80,16,101,90,90,190,181,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,19,81,81,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,90,81,90,90,90,40,81,81,18,19,80,80,80,80,80,80,80,80,18,19,30,80,80,101,190,182,80,80,18,19,80,80,16,101,90,90,190,181,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,19,81,81,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,90,81,90,90,90,40,81,81,18,19,80,80,80,80,80,80,91,92,18,19,30,80,80,101,190,182,80,80,18,19,150,151,16,101,190,181,182,182,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,19,81,81,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,40,81,81,18,19,80,80,80,80,80,80,101,90,18,19,30,80,80,101,90,193,182,80,18,19,160,131,16,101,190,181,194,191,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,19,81,81,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,81,7,4,4,4,4,4,4,8,3,5,80,7,4,4,4,4,4,8,3,5,80,7,90,90,190,182,7,8,3,5,131,18,4,5,181,7,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,19,90,90,37,37,37,38,81,81,36,37,37,18,19,37,37,37,37,37,37,37,37,2,1,37,37,37,37,37,37,37,37,2,0,0,0,0,0,0,0,0,0,0,19,81,20,23,21,21,21,23,21,2,1,12,80,10,2,9,9,9,9,9,1,12,80,10,90,90,190,182,10,2,1,12,131,20,23,22,181,20,23,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,19,90,90,90,90,90,106,81,81,104,106,81,18,19,81,114,81,81,114,81,81,81,18,19,95,95,96,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,19,81,97,98,98,98,98,99,81,18,19,30,80,30,18,9,9,9,9,9,19,80,80,80,101,90,190,182,80,18,19,170,171,40,81,135,181,137,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,37,37,37,37,37,38,90,90,90,90,90,106,81,81,104,106,81,18,19,81,104,95,95,90,96,81,81,18,19,90,90,106,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,81,81,95,18,19,80,80,80,18,9,9,9,9,9,19,80,80,91,90,90,190,182,80,18,19,80,80,40,81,135,181,137,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,81,81,81,81,81,81,104,90,90,90,90,90,95,95,90,106,81,18,19,95,90,90,90,90,90,95,95,18,19,90,90,106,81,81,94,95,95,18,0,0,0,0,0,0,0,0,0,0,19,81,95,95,95,95,81,81,90,18,19,80,80,80,18,1,11,13,13,11,12,80,80,7,4,4,5,80,80,18,19,80,80,40,81,135,181,137,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,81,81,81,81,81,81,114,40,40,104,90,90,90,90,90,90,95,36,38,81,104,90,90,90,106,81,81,18,19,90,90,106,81,81,104,90,90,18,0,0,0,0,0,0,0,0,0,0,19,81,90,90,81,90,81,81,90,18,19,30,80,80,18,19,80,80,80,80,80,80,80,18,9,9,19,80,80,18,19,80,80,40,81,145,146,147,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,81,81,81,81,81,81,81,81,81,81,104,90,90,90,90,106,81,81,81,81,104,90,90,90,106,81,81,18,19,90,90,106,81,81,104,90,90,18,0,0,0,0,0,0,0,0,0,0,19,81,90,90,81,90,81,81,90,18,3,4,5,80,18,19,80,7,4,4,5,80,80,48,188,189,49,80,80,10,12,80,80,40,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,81,81,81,81,81,81,94,7,5,95,90,90,90,90,90,90,95,7,5,95,90,40,40,40,40,95,95,18,19,90,90,106,81,81,104,90,90,18,0,0,0,0,0,0,0,0,0,0,19,81,90,90,81,90,81,81,90,18,9,9,19,80,18,19,80,18,9,9,19,80,91,46,198,199,47,93,80,80,80,80,80,40,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,81,81,81,81,81,81,104,18,19,90,90,90,90,90,90,90,90,18,19,90,90,96,81,81,105,81,81,18,19,90,90,106,81,81,104,90,90,18,0,0,0,0,0,0,0,0,0,0,19,81,90,90,81,81,81,81,90,18,19,89,12,80,18,19,80,10,88,18,19,80,101,81,81,81,92,90,92,7,4,4,5,40,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,3,5,95,95,95,95,95,90,18,19,90,90,90,90,90,90,90,90,18,19,81,81,104,95,95,106,81,81,18,19,90,90,106,81,81,104,90,90,18,0,0,0,0,0,0,0,0,0,0,19,81,90,90,95,95,95,95,81,18,19,80,80,80,18,19,80,80,80,18,19,92,90,95,95,95,90,90,90,18,9,9,19,40,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,3,5,81,7,5,81,7,8,3,4,5,81,81,81,81,7,4,8,3,5,81,7,4,4,5,81,7,8,3,4,4,5,81,81,7,4,4,8,0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,8,3,4,4,4,8,3,4,4,4,8,3,4,4,4,4,4,4,4,4,8,9,9,3,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,37,37,38,81,36,38,81,36,37,37,37,38,81,81,81,81,36,37,37,37,38,81,36,37,37,38,81,36,2,9,9,1,38,81,81,36,2,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,81,81,81,81,42,81,81,81,81,81,81,81,81,81,105,81,81,81,81,211,81,94,95,95,96,81,81,18,9,1,38,81,81,81,81,36,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,95,95,95,95,95,96,42,81,81,81,94,96,81,81,90,95,96,42,42,94,95,90,90,90,90,95,95,18,1,38,81,81,81,81,81,81,36,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,90,106,81,81,81,81,114,40,41,41,90,90,90,95,95,90,90,90,90,90,90,90,90,18,19,81,81,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,90,90,95,95,95,95,90,95,41,41,90,90,90,70,70,90,70,70,90,90,90,90,90,18,19,81,81,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,106,81,211,211,81,42,90,90,41,41,90,90,90,70,106,42,211,81,42,104,90,90,90,18,19,81,81,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,106,81,81,211,81,42,90,90,81,81,90,90,90,70,106,211,81,81,42,104,90,90,90,18,19,81,81,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,106,81,81,81,81,42,90,90,75,75,90,90,90,70,70,75,79,75,74,90,90,90,90,18,3,5,81,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,81,90,90,90,90,95,95,95,95,95,106,81,81,81,81,104,90,90,90,90,74,74,90,90,106,81,81,18,9,3,5,81,81,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,40,81,40,90,106,81,81,81,7,4,4,4,5,81,81,7,4,4,4,5,90,90,90,90,90,106,81,7,8,9,9,3,4,4,4,4,5,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,42,81,42,90,106,81,211,211,18,19,11,11,12,80,80,10,2,9,9,19,90,90,90,90,90,106,81,36,37,37,37,37,37,37,37,37,38,81,18,0,0,0,0,0,0,0,0,0,0,1,21,23,21,24,25,25,26,23,21,21,21,24,25,25,26,21,23,21,2,1,23,24,25,26,21,21,24,25,2,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,81,95,90,106,81,81,211,18,19,80,80,80,80,80,80,10,11,2,19,90,90,90,90,90,106,81,211,81,81,81,81,94,95,95,96,81,81,18,0,0,0,0,0,0,0,0,0,0,19,98,99,82,120,121,121,121,121,121,121,121,121,122,82,82,82,97,98,18,19,82,82,82,82,82,82,82,82,20,21,21,89,23,21,24,2,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,95,90,90,90,95,95,95,18,19,80,80,80,30,30,80,80,80,18,19,81,104,90,90,90,90,95,96,42,42,94,95,90,90,90,106,40,81,18,0,0,0,0,0,0,0,0,0,0,19,109,82,120,134,131,131,131,131,131,131,131,131,133,122,82,82,82,107,18,19,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,104,90,106,211,81,81,211,18,19,80,80,7,4,4,5,80,80,18,19,115,211,42,104,90,90,90,90,95,95,90,90,90,90,90,90,75,75,18,0,0,0,0,0,0,0,0,0,0,19,82,82,130,131,131,131,131,131,131,131,131,131,131,133,122,82,82,82,18,19,82,82,82,120,121,121,121,121,122,82,82,82,82,82,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,95,90,90,106,81,81,211,211,18,19,80,80,18,9,9,19,80,80,18,19,74,81,81,104,90,90,90,90,90,90,90,90,90,90,90,106,81,81,18,0,0,0,0,0,0,0,0,0,0,19,82,82,130,131,131,131,131,131,131,131,131,131,131,131,133,122,82,82,20,22,82,82,120,134,131,131,131,131,7,4,4,4,4,5,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,90,90,90,95,95,95,95,18,19,80,80,48,188,189,49,80,80,18,19,90,74,75,90,90,90,90,90,90,90,90,90,90,90,90,106,81,81,18,0,0,0,0,0,0,0,0,0,0,19,82,82,130,131,131,131,131,131,131,131,131,131,131,131,131,133,122,82,82,82,82,120,134,131,131,131,131,131,18,9,9,9,9,19,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,106,211,81,81,104,90,90,10,12,80,80,46,198,199,47,30,30,10,38,90,90,90,90,106,42,42,104,90,90,90,90,90,90,90,106,81,81,18,0,0,0,0,0,0,0,0,0,0,19,82,82,130,131,131,131,131,131,131,131,131,131,131,131,131,131,133,122,82,120,121,134,131,131,131,131,131,131,18,9,9,9,9,19,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,106,211,211,81,114,81,81,81,80,80,80,81,81,81,81,80,80,80,81,81,104,90,90,106,211,81,104,90,90,106,81,81,114,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,19,82,82,140,124,131,131,131,131,131,131,131,131,131,131,131,131,131,133,121,134,131,131,131,131,131,131,131,131,18,9,9,9,9,19,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,90,95,95,95,90,95,95,7,5,80,80,40,81,81,40,80,80,80,81,81,81,104,90,90,75,74,90,90,90,106,81,81,114,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,19,82,82,82,140,141,124,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,18,9,9,9,9,19,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,8,3,4,4,4,4,4,4,4,4,4,4,5,81,81,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,19,82,82,82,82,82,130,131,131,7,4,4,4,4,4,4,4,4,4,4,4,4,5,131,7,4,4,4,4,8,9,9,9,9,19,82,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,1,37,37,37,37,37,37,37,37,37,37,16,37,37,37,37,37,37,37,37,37,38,81,81,36,37,37,37,37,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,82,82,130,131,131,18,1,11,13,13,11,11,13,13,11,2,1,23,22,131,18,9,9,1,21,2,1,24,25,26,22,82,20,24,23,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,95,96,81,81,40,81,81,94,95,95,37,95,95,95,95,95,95,96,81,81,81,81,211,40,81,81,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,82,120,134,131,131,18,19,80,30,80,80,80,80,80,80,18,19,131,32,131,18,9,1,22,82,18,19,82,82,82,82,82,82,82,97,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,95,95,95,95,95,90,90,90,95,90,90,90,90,90,90,90,40,40,95,95,81,81,41,40,81,81,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,120,134,131,131,131,18,19,80,30,80,80,80,80,80,80,18,19,131,32,131,18,1,22,82,82,18,19,82,82,82,82,97,99,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,106,81,81,40,40,40,104,90,90,90,90,90,90,95,95,90,90,40,81,81,40,95,95,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,80,30,80,80,80,80,150,151,18,19,131,32,32,20,22,82,82,82,18,19,82,82,82,82,107,109,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,95,90,90,90,90,81,95,95,81,81,81,81,90,90,90,90,90,106,81,81,81,90,95,40,40,40,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,80,80,80,80,80,80,160,131,18,19,131,131,131,133,121,122,82,82,18,19,82,82,82,82,107,109,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,90,90,90,90,81,90,81,81,81,95,95,90,90,90,90,90,90,7,5,81,90,90,81,81,81,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,151,152,80,80,80,80,160,131,18,19,131,131,131,131,131,133,122,82,18,19,82,82,82,97,90,109,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,90,90,90,90,90,95,90,95,40,40,90,90,90,90,90,90,90,90,18,19,81,90,90,81,81,81,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,131,163,152,80,80,150,164,131,18,19,131,131,131,131,131,131,133,122,20,22,82,82,97,90,90,109,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,90,90,90,90,90,90,90,40,40,104,90,90,90,90,90,90,90,18,19,95,90,90,81,40,41,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,131,131,163,151,151,164,131,131,18,19,131,131,131,131,131,131,131,133,122,82,82,82,107,90,90,109,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,81,104,90,90,90,90,106,81,81,81,81,104,90,90,90,90,90,90,18,19,90,90,90,95,95,95,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,131,131,18,19,131,131,131,131,131,131,131,131,18,19,131,131,131,131,131,131,131,131,7,5,82,82,107,109,82,82,82,107,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,130,131,131,7,4,8,3,4,4,4,4,5,131,131,131,18,3,5,131,131,131,7,4,4,4,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,120,134,131,7,1,13,2,9,1,11,11,13,12,131,131,131,18,1,22,131,131,131,18,21,21,24,2,1,25,25,26,23,21,23,21,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,120,134,131,131,18,19,80,18,1,12,30,80,150,164,131,131,131,18,19,131,131,131,131,20,82,82,82,18,19,82,82,82,82,82,82,82,20,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,99,130,131,131,131,10,12,80,18,19,30,80,150,164,131,131,131,153,18,19,131,131,131,131,192,82,82,82,18,19,31,31,82,82,31,82,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,131,163,151,151,18,19,80,150,164,131,131,131,153,172,18,19,131,131,131,131,192,98,98,98,18,19,82,82,82,31,31,31,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,32,32,32,32,18,19,80,160,131,131,131,131,162,80,18,19,131,131,131,131,131,192,90,90,18,19,82,82,82,82,31,82,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,32,131,131,131,18,19,150,164,131,131,153,171,172,80,18,19,131,131,131,131,131,131,131,131,18,19,121,122,82,82,82,82,82,31,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,32,131,32,131,10,12,164,131,131,131,162,80,80,80,18,19,191,193,131,131,131,131,131,131,20,22,131,133,121,122,82,120,121,122,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,32,131,32,131,163,131,131,131,131,153,172,80,80,30,18,3,5,90,193,131,131,131,131,131,131,131,131,131,131,133,121,134,32,132,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,109,130,131,131,131,131,32,131,131,131,131,131,153,172,80,80,30,7,8,9,3,5,90,193,131,131,131,131,131,131,131,131,131,131,131,131,32,132,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,130,131,131,131,7,4,4,4,4,4,4,4,5,80,7,4,8,9,9,9,3,4,4,4,4,4,4,4,4,4,4,4,4,5,131,7,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,19,11,18,19,11,13,13,11,11,13,13,11,18,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,130,131,131,131,20,23,21,18,9,9,1,13,12,80,10,13,11,11,11,11,13,11,2,1,11,13,11,2,1,21,24,25,26,22,131,20,25,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,1,11,13,11,11,11,13,12,80,18,19,93,80,80,80,80,80,80,91,18,9,9,9,19,11,13,11,88,11,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,140,124,131,131,131,131,131,18,9,1,12,80,80,80,80,80,80,80,80,80,80,80,18,19,80,80,80,10,22,82,82,130,131,131,131,132,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,80,80,80,18,19,103,80,80,80,80,80,80,101,18,9,9,9,19,150,151,151,151,152,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,130,131,131,131,131,131,18,1,12,80,80,80,80,80,80,80,7,5,80,80,80,18,19,80,80,80,80,82,82,82,130,131,131,131,132,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,85,76,76,76,76,76,76,76,18,19,103,80,80,7,5,80,80,101,18,9,9,9,19,160,181,182,182,162,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,120,134,131,131,131,131,131,18,19,80,80,80,80,80,80,80,80,18,19,80,80,7,4,4,5,85,85,7,5,82,82,130,131,131,123,142,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,80,80,80,18,19,103,80,80,18,19,80,80,101,18,9,9,9,3,5,181,7,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,130,131,131,131,131,131,131,18,19,80,80,80,80,80,80,80,80,18,19,76,76,18,9,9,19,80,30,18,19,82,82,130,131,131,132,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,76,76,76,76,76,76,76,85,18,19,103,80,80,18,19,80,80,101,18,9,9,9,9,19,181,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,130,131,131,131,131,131,131,20,22,76,76,76,76,76,76,7,4,9,19,151,152,48,188,189,49,30,80,18,19,82,82,130,131,131,132,31,31,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,80,80,80,18,19,103,80,80,18,19,80,80,101,18,9,9,9,9,19,181,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,140,124,131,131,131,131,131,131,131,133,121,122,120,121,134,18,9,9,19,131,162,46,198,199,47,80,80,18,19,121,121,134,131,131,132,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,85,76,76,76,76,76,76,76,18,19,103,80,80,18,19,80,80,101,18,9,9,9,9,19,181,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,140,141,141,141,141,124,131,131,131,131,133,134,131,131,10,89,18,19,131,163,127,81,81,125,151,151,18,19,131,131,131,131,131,132,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,80,80,80,18,19,103,80,80,18,19,80,80,101,18,9,9,9,9,19,181,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,82,82,82,82,82,82,82,140,141,124,131,131,131,131,131,123,141,142,18,19,131,131,137,81,81,135,131,131,18,19,131,131,131,131,123,142,82,82,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,4,4,5,80,7,4,4,8,3,5,80,7,8,3,5,80,7,8,9,9,9,9,19,181,18,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,3,4,4,5,81,81,7,4,4,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,1,11,13,13,12,80,10,13,13,11,11,12,80,10,2,1,12,80,10,2,1,11,13,13,12,181,10,2,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,24,25,22,82,82,21,23,23,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,80,30,80,80,80,80,80,80,18,19,80,80,80,18,19,80,80,80,30,181,162,18,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,120,121,121,121,121,121,121,122,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,15,30,30,30,30,80,80,7,5,80,80,80,18,19,80,80,80,18,19,80,80,80,30,181,162,18,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,134,131,131,131,131,131,131,133,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,16,80,80,80,80,80,80,18,19,80,80,91,10,12,151,151,151,10,12,151,30,30,30,181,162,10,11,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,190,182,131,131,131,131,180,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,16,80,80,80,80,80,80,18,19,80,80,101,92,193,182,182,182,182,182,182,182,182,182,182,162,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,190,182,131,131,131,131,180,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,16,80,80,80,80,80,80,18,19,80,50,51,101,103,171,171,171,7,5,171,171,171,171,171,80,50,51,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,190,182,131,131,131,131,180,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,16,80,80,80,80,80,80,18,19,80,52,53,7,5,80,80,80,18,19,80,80,80,80,80,30,52,53,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,190,182,131,131,131,131,131,123,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,14,30,80,80,80,80,80,18,19,80,80,55,18,19,80,80,80,18,19,80,80,80,80,80,30,80,55,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,124,131,131,131,131,181,181,133,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,102,80,80,30,80,80,18,19,80,80,80,18,19,80,80,80,18,19,80,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,134,191,193,182,180,194,191,191,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,4,4,4,8,3,5,80,7,8,3,5,80,7,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,32,32,32,131,131,32,32,32,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,1,12,80,10,2,19,12,80,10,2,1,11,13,13,11,11,13,13,11,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,131,131,32,131,131,32,131,131,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,1,11,13,11,11,11,13,11,2,19,80,80,55,18,19,80,80,55,18,19,80,80,80,80,80,50,51,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,32,32,32,131,131,32,32,32,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,80,80,80,80,80,80,18,19,80,50,51,18,19,80,50,51,18,19,80,80,80,80,80,52,53,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,141,124,131,131,131,131,131,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,80,80,80,80,80,80,10,12,80,52,53,18,19,80,52,53,18,19,80,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,140,141,141,141,141,124,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,80,80,80,80,80,80,80,80,80,80,80,18,19,80,80,80,11,12,80,80,80,102,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,210,82,82,82,82,130,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,80,80,80,80,80,80,7,5,80,80,30,18,19,80,80,80,80,80,80,80,80,80,102,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,82,82,82,82,82,130,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,150,151,151,152,80,80,18,19,102,80,80,18,19,80,80,80,7,5,80,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,210,82,82,82,82,130,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,160,181,181,162,80,80,18,19,80,91,93,18,19,80,80,80,18,19,80,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,82,120,121,121,121,134,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,19,80,160,181,181,162,80,80,18,19,80,80,80,18,19,30,80,30,18,19,30,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,210,210,130,131,131,194,191,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,3,4,5,181,181,7,4,4,8,3,5,80,7,8,3,5,80,7,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,4,5,131,131,7,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,1,12,80,10,13,13,12,80,10,2,1,11,13,13,11,11,13,13,11,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,1,21,23,22,131,131,20,24,26,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,30,80,80,30,30,80,80,30,18,19,80,80,102,80,80,50,51,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,19,130,181,181,123,124,181,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,30,80,80,80,80,80,80,30,18,19,80,80,111,80,80,52,53,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,1,21,21,21,21,23,21,2,19,130,181,123,142,140,124,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,80,80,7,4,4,5,80,80,18,19,80,80,30,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,82,18,19,130,181,132,82,82,130,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,80,80,18,9,9,19,80,80,10,12,80,80,30,80,80,80,80,55,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,82,20,22,130,181,132,82,82,130,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,80,80,48,188,189,49,80,80,80,80,80,80,80,80,80,80,80,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,82,82,31,130,181,132,82,82,130,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,9,9,9,19,181,181,18,9,9,9,19,80,102,46,198,199,47,80,80,7,5,80,80,80,80,80,80,30,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,31,7,5,130,181,133,121,121,134,181,192,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,88,11,12,171,171,18,9,9,9,19,80,111,81,81,81,81,80,80,18,19,92,93,80,80,80,80,30,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,82,18,19,130,193,181,181,181,181,194,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,19,80,80,80,80,80,18,9,9,9,19,102,80,81,81,81,81,80,80,18,19,80,111,80,80,80,91,93,80,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,19,82,82,82,82,82,82,18,19,130,90,191,191,191,191,90,90,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,4,9,9,9,9,3,4,4,4,4,4,4,4,4,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,3,4,4,4,4,4,4,8,3,4,4,4,4,4,4,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/HOTEL_BG2.csv b/intra/source/csv/HOTEL_BG2.csv new file mode 100644 index 0000000..2ccf240 --- /dev/null +++ b/intra/source/csv/HOTEL_BG2.csv @@ -0,0 +1,120 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,202,202,200,200,202,202,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,0,0,0,0,0,0,0,0,0,201,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,202,202,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,202,202,202,202,202,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,202,202,202,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,202,202,200,202,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,202,202,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,202,200,202,202,202,202,202,0,0,0,0,0,0,202,202,202,202,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,202,202,202,202,202,202,202,0,0,202,202,202,202,202,202,202,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/HOTEL_FG.csv b/intra/source/csv/HOTEL_FG.csv new file mode 100644 index 0000000..6fbfb0a --- /dev/null +++ b/intra/source/csv/HOTEL_FG.csv @@ -0,0 +1,120 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/Minimap_Apartment.csv b/intra/source/csv/Minimap_Apartment.csv new file mode 100644 index 0000000..04520db --- /dev/null +++ b/intra/source/csv/Minimap_Apartment.csv @@ -0,0 +1,8 @@ +19,21,15,23,0,23,23,7,33 +7,17,14,16,0,4,12,4,16 +6,6,23,6,23,7,13,33,6 +4,8,8,16,4,12,7,14,12 +0,6,24,6,0,0,6,0,0 +0,20,20,2,0,0,20,0,0 +0,0,0,0,0,7,11,5,0 +0,0,0,0,21,14,13,14,11 diff --git a/intra/source/csv/Minimap_Beach.csv b/intra/source/csv/Minimap_Beach.csv new file mode 100644 index 0000000..56eb3c9 --- /dev/null +++ b/intra/source/csv/Minimap_Beach.csv @@ -0,0 +1,7 @@ +9,9,9,9,9,9,9,9,9,9,9 +7,13,15,7,17,17,17,13,13,31,9 +6,3,16,6,10,8,26,17,15,25,9 +6,9,10,14,14,14,14,34,4,12,9 +10,13,12,9,9,9,9,9,9,9,9 +2,9,9,9,9,9,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9,9 diff --git a/intra/source/csv/Minimap_Bedroom.csv b/intra/source/csv/Minimap_Bedroom.csv new file mode 100644 index 0000000..d7d16c8 --- /dev/null +++ b/intra/source/csv/Minimap_Bedroom.csv @@ -0,0 +1,5 @@ +9,5,7,13,35,17,15 +7,14,8,15,6,4,12 +10,13,8,16,6,9,9 +4,13,8,12,24,9,9 +3,13,30,9,9,9,9 diff --git a/intra/source/csv/Minimap_Cell.csv b/intra/source/csv/Minimap_Cell.csv new file mode 100644 index 0000000..2e85c01 --- /dev/null +++ b/intra/source/csv/Minimap_Cell.csv @@ -0,0 +1,9 @@ +7,17,13,17,17,13,17,33 +6,2,3,8,8,17,14,16 +6,7,15,2,10,14,17,12 +10,8,8,31,14,17,14,15 +10,14,8,13,13,16,7,16 +4,17,8,17,17,16,6,6 +7,8,8,8,8,8,8,12 +22,14,14,14,14,14,14,11 +9,9,9,9,9,9,9,9 diff --git a/intra/source/csv/Minimap_Circus.csv b/intra/source/csv/Minimap_Circus.csv new file mode 100644 index 0000000..bac9984 --- /dev/null +++ b/intra/source/csv/Minimap_Circus.csv @@ -0,0 +1,9 @@ +0,0,0,7,35,15,0,3,33 +0,0,0,6,6,6,0,0,2 +0,5,0,4,8,12,0,5,0 +5,4,13,13,16,0,7,16,0 +4,15,0,7,8,13,14,12,0 +7,16,5,10,16,0,0,3,15 +10,14,12,10,16,0,0,7,16 +4,13,13,8,8,13,13,14,16 +0,0,0,4,34,0,0,0,2 diff --git a/intra/source/csv/Minimap_Cliff.csv b/intra/source/csv/Minimap_Cliff.csv new file mode 100644 index 0000000..3038107 --- /dev/null +++ b/intra/source/csv/Minimap_Cliff.csv @@ -0,0 +1,8 @@ +0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,7,31 +0,0,5,0,7,13,17,16,0 +0,0,4,13,16,7,12,10,11 +0,7,35,35,8,12,0,10,11 +7,8,12,4,26,33,7,16,5 +26,8,15,3,16,10,14,8,12 +4,14,14,13,14,14,13,12,0 diff --git a/intra/source/csv/Minimap_Crowd.csv b/intra/source/csv/Minimap_Crowd.csv new file mode 100644 index 0000000..a7c887f --- /dev/null +++ b/intra/source/csv/Minimap_Crowd.csv @@ -0,0 +1,8 @@ +0,0,0,0,0,0,7,17,13,15 +0,0,0,0,0,0,4,8,15,6 +0,7,17,33,0,1,0,28,12,24 +7,8,16,24,0,0,0,4,13,12 +4,16,6,24,0,5,0,0,0,20 +7,14,8,8,17,16,0,0,0,6 +6,7,8,16,4,12,0,5,0,6 +4,14,12,24,7,13,13,12,0,20 diff --git a/intra/source/csv/Minimap_Fields.csv b/intra/source/csv/Minimap_Fields.csv new file mode 100644 index 0000000..37665cf --- /dev/null +++ b/intra/source/csv/Minimap_Fields.csv @@ -0,0 +1,12 @@ +9,9,9,9,9,9,9,9,9,9,9,9 +9,24,9,9,9,24,5,9,7,13,29,9 +9,10,17,11,9,10,16,7,8,11,9,9 +9,2,4,15,3,8,26,16,10,13,15,9 +9,35,17,14,15,10,8,14,8,17,16,9 +9,32,14,17,8,8,8,17,16,10,32,9 +9,7,17,8,8,8,8,16,6,6,9,9 +9,6,10,12,10,8,8,8,8,16,9,9 +9,6,10,11,6,6,2,10,8,14,31,9 +9,10,8,17,8,16,7,8,16,9,5,9 +9,4,14,14,14,14,14,14,14,13,12,9 +9,9,9,9,9,9,9,9,9,9,9,9 diff --git a/intra/source/csv/Minimap_Forest.csv b/intra/source/csv/Minimap_Forest.csv new file mode 100644 index 0000000..00e5f29 --- /dev/null +++ b/intra/source/csv/Minimap_Forest.csv @@ -0,0 +1,9 @@ +0,0,0,0,5,0,0 +0,0,0,0,6,0,0 +0,3,15,5,6,0,0 +31,17,12,6,6,0,0 +7,16,5,10,12,0,0 +4,16,6,6,0,0,0 +7,26,12,10,15,0,0 +10,8,13,8,26,0,0 +4,14,13,12,2,0,0 diff --git a/intra/source/csv/Minimap_Hotel.csv b/intra/source/csv/Minimap_Hotel.csv new file mode 100644 index 0000000..cf2f24c --- /dev/null +++ b/intra/source/csv/Minimap_Hotel.csv @@ -0,0 +1,12 @@ +21,13,13,29,0,0,7,17,17,33,0,0 +0,0,0,0,0,0,6,6,6,6,0,0 +0,0,24,0,0,0,10,16,6,6,0,0 +0,7,8,15,5,0,2,22,32,12,0,0 +0,10,8,16,6,0,0,0,0,0,0,0 +0,4,32,8,12,0,7,13,17,33,0,0 +0,3,13,12,0,0,6,5,10,12,0,0 +0,0,0,0,0,0,10,16,4,15,0,0 +0,5,5,23,0,0,4,32,35,12,0,0 +0,4,8,12,0,0,0,0,6,0,0,0 +0,7,8,11,0,0,0,0,6,0,0,0 +0,20,22,11,0,0,0,0,2,0,0,0 diff --git a/intra/source/csv/Minimap_Overworld.csv b/intra/source/csv/Minimap_Overworld.csv new file mode 100644 index 0000000..0b3a687 --- /dev/null +++ b/intra/source/csv/Minimap_Overworld.csv @@ -0,0 +1,10 @@ +9,9,9,9,9,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9 +7,15,9,9,9,9,9,9,9,9 +6,6,9,9,9,9,9,9,9,9 +6,6,9,9,9,9,9,9,9,9 +10,12,7,11,28,17,26,17,17,15 +10,17,8,15,6,10,16,6,6,22 +6,6,2,4,12,10,8,8,8,15 +24,2,9,9,3,14,14,12,4,12 diff --git a/intra/source/csv/Minimap_Redcave.csv b/intra/source/csv/Minimap_Redcave.csv new file mode 100644 index 0000000..c066e8f --- /dev/null +++ b/intra/source/csv/Minimap_Redcave.csv @@ -0,0 +1,7 @@ +3,13,13,35,13,13,15 +0,7,13,17,13,15,6 +0,4,13,8,13,12,24 +7,13,15,6,7,11,5 +6,5,6,24,6,5,6 +4,8,12,5,4,8,12 +0,24,25,14,11,24,0 diff --git a/intra/source/csv/Minimap_Redsea.csv b/intra/source/csv/Minimap_Redsea.csv new file mode 100644 index 0000000..2264b4e --- /dev/null +++ b/intra/source/csv/Minimap_Redsea.csv @@ -0,0 +1,7 @@ +7,17,15,23,7,15,5 +4,16,10,16,10,8,16 +7,8,8,26,16,10,16 +10,12,2,24,4,16,6 +4,15,21,26,29,10,16 +9,4,13,32,17,14,16 +9,9,9,3,14,13,12 diff --git a/intra/source/csv/Minimap_Space.csv b/intra/source/csv/Minimap_Space.csv new file mode 100644 index 0000000..fed9ffd --- /dev/null +++ b/intra/source/csv/Minimap_Space.csv @@ -0,0 +1,8 @@ +5,9,9,9,9,24,9,9,9,5,9 +10,15,5,5,9,6,9,5,5,10,15 +4,14,14,14,13,8,13,14,14,14,12 +9,9,9,9,31,16,9,9,9,9,9 +9,9,9,9,9,2,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9,9 +9,9,9,9,9,9,9,9,9,9,9 diff --git a/intra/source/csv/Minimap_Street.csv b/intra/source/csv/Minimap_Street.csv new file mode 100644 index 0000000..725eb6e --- /dev/null +++ b/intra/source/csv/Minimap_Street.csv @@ -0,0 +1,7 @@ +0,0,0,0,0,0,0 +0,7,13,11,0,0,0 +0,6,0,0,0,0,0 +0,6,0,0,0,0,0 +3,8,13,13,11,0,0 +0,24,0,0,0,0,0 +0,0,0,0,0,0,0 diff --git a/intra/source/csv/Minimap_Suburb.csv b/intra/source/csv/Minimap_Suburb.csv new file mode 100644 index 0000000..4f178c4 --- /dev/null +++ b/intra/source/csv/Minimap_Suburb.csv @@ -0,0 +1,8 @@ +35,17,17,26,33,27 +10,8,8,8,16,27 +10,26,8,8,16,27 +10,8,26,26,30,27 +4,32,14,14,11,27 +27,27,27,27,27,27 +27,27,27,27,27,27 +27,27,27,27,27,27 diff --git a/intra/source/csv/Minimap_Terminal.csv b/intra/source/csv/Minimap_Terminal.csv new file mode 100644 index 0000000..eb7f788 --- /dev/null +++ b/intra/source/csv/Minimap_Terminal.csv @@ -0,0 +1,5 @@ +9,7,26,15,9 +3,14,8,12,9 +9,9,6,9,5 +5,9,6,9,6 +4,13,26,13,12 diff --git a/intra/source/csv/NEXUS_BG.csv b/intra/source/csv/NEXUS_BG.csv new file mode 100644 index 0000000..cb7bf01 --- /dev/null +++ b/intra/source/csv/NEXUS_BG.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,11,10,10,16,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,11,10,10,10,10,16,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,12,30,30,30,30,15,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,12,30,30,30,30,15,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,13,6,6,6,6,14,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,10,10,10,10,10,10,10,10,32,32,32,32,10,10,10,10,10,10,16,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,30,30,30,30,30,30,30,30,32,32,32,32,30,30,30,30,30,30,15,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,30,30,30,30,30,30,30,30,32,32,32,32,30,30,30,30,30,30,15,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,6,6,6,6,6,6,6,6,32,32,32,32,6,6,6,6,6,6,14,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,17,17,17,17,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,44,45,1,1,1,44,45,1,1,1,1,1,1,1,1,1,1,1,1,1,44,45,1,1,1,44,45,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,46,47,16,1,11,46,47,16,1,1,44,45,1,1,1,1,44,45,1,11,46,47,16,1,11,46,47,16,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,32,32,32,30,30,15,1,11,46,47,16,1,1,11,46,47,16,12,30,30,32,32,32,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,6,6,19,32,18,6,6,14,1,12,30,30,32,32,32,32,30,30,15,13,6,6,19,32,18,6,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,44,45,1,32,1,44,45,1,1,13,6,6,19,32,32,18,6,6,14,1,44,45,1,32,1,44,45,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,46,47,16,32,11,46,47,16,1,1,44,45,1,32,32,1,1,1,1,11,46,47,16,32,11,46,47,16,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,32,32,32,30,30,15,1,11,46,47,16,32,32,1,1,1,1,12,30,30,32,32,32,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,6,6,19,32,18,6,6,14,1,12,30,30,32,32,32,1,1,1,1,13,6,6,19,32,18,6,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,13,6,6,19,32,32,1,1,1,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,32,32,1,1,1,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,1,44,45,1,32,32,1,44,45,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,11,46,47,16,32,32,11,46,47,16,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,12,30,30,32,32,32,12,30,30,15,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,1,1,1,13,32,6,19,17,17,13,6,32,14,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,1,1,44,45,1,1,32,1,1,44,45,1,1,32,1,1,44,45,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,31,31,31,31,31,10,1,11,10,32,1,11,46,47,16,1,32,10,10,46,47,10,10,32,1,11,46,47,16,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,31,31,31,40,41,30,15,12,32,32,32,32,30,30,32,32,32,32,32,30,30,32,32,32,32,32,30,30,32,32,32,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,31,31,31,42,43,30,15,12,32,32,32,32,30,30,32,32,32,32,32,30,30,32,32,32,32,32,30,30,32,32,32,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,31,4,5,31,31,6,14,13,6,6,17,18,6,6,19,17,17,17,8,30,30,9,17,17,17,18,6,6,19,32,17,17,17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,31,31,31,31,3,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,15,1,1,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,15,1,1,1,1,1,1,1,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,51,1,51,51,51,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,32,1,1,1,1,1,44,45,1,32,1,44,45,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,32,1,1,1,1,11,46,47,16,32,11,46,47,16,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,10,32,32,10,16,1,1,12,30,30,32,32,32,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,15,1,1,13,6,6,19,32,18,6,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,44,45,1,1,1,1,1,12,30,30,30,30,15,1,1,1,44,45,1,32,1,44,45,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,46,47,10,10,10,10,16,12,30,30,30,30,15,11,10,10,46,47,16,32,11,46,47,16,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,30,30,32,32,30,30,30,30,32,32,30,30,30,30,32,32,32,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,6,6,6,6,6,6,19,8,30,30,30,30,9,18,6,6,6,6,19,17,18,6,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,6,32,32,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,10,32,32,10,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,32,32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,30,30,30,30,9,17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,6,6,6,6,14,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/NEXUS_BG2.csv b/intra/source/csv/NEXUS_BG2.csv new file mode 100644 index 0000000..10e6369 --- /dev/null +++ b/intra/source/csv/NEXUS_BG2.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/NEXUS_FG.csv b/intra/source/csv/NEXUS_FG.csv new file mode 100644 index 0000000..10e6369 --- /dev/null +++ b/intra/source/csv/NEXUS_FG.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/OVERWORLD_BG.csv b/intra/source/csv/OVERWORLD_BG.csv new file mode 100644 index 0000000..c627406 --- /dev/null +++ b/intra/source/csv/OVERWORLD_BG.csv @@ -0,0 +1,100 @@ +3,23,3,23,3,23,3,23,3,23,3,3,23,3,3,3,3,23,3,3,23,3,23,3,23,3,23,3,23,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,23,23,23,23,23,23,23,23,23,23,23,3,23,3,3,23,3,23,23,23,23,23,23,23,23,23,23,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +23,23,23,23,23,23,23,23,23,23,23,23,3,23,14,15,23,3,23,23,23,23,23,23,23,23,23,23,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,24,25,33,33,33,33,33,33,33,33,33,33,33,33,33,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +34,71,71,71,71,71,71,71,71,71,71,36,30,31,71,36,30,31,36,71,71,71,71,71,71,71,71,71,71,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,71,71,71,71,71,71,71,71,71,71,71,71,3,81,81,3,71,71,71,71,71,71,71,71,71,71,71,71,9,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +29,91,71,71,71,71,71,71,71,71,71,71,71,36,91,91,36,71,71,71,71,71,71,71,71,71,71,71,91,9,13,0,0,0,0,0,0,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,91,71,71,71,71,71,71,71,71,71,71,3,81,81,3,71,71,71,71,71,71,71,71,71,71,91,67,9,13,0,13,13,13,0,0,0,0,0,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,91,71,71,71,71,71,71,71,71,71,36,91,91,36,71,71,71,71,71,71,71,71,71,91,50,67,9,13,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,91,71,71,71,71,71,71,71,71,3,81,81,3,71,71,71,71,71,71,71,71,91,50,50,67,9,13,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,91,71,71,71,71,71,71,71,36,91,91,36,71,71,71,71,71,71,71,91,50,50,50,67,9,13,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,91,71,71,71,71,71,71,3,81,81,3,71,71,71,71,71,71,91,67,50,50,50,67,9,13,0,0,0,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,91,71,71,71,71,71,36,91,91,36,71,71,71,71,71,91,50,67,50,50,50,67,9,13,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,91,71,71,71,71,3,81,81,3,71,71,71,71,91,50,50,67,50,50,50,67,9,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,91,71,71,71,36,91,91,36,71,71,9,5,5,5,5,5,5,5,5,5,9,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,91,71,71,3,81,81,3,71,71,9,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,50,91,71,36,91,91,36,71,91,9,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,50,50,91,3,81,81,3,91,50,9,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,50,50,67,36,91,91,36,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,50,50,67,50,91,91,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,67,50,50,50,67,50,50,50,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,87,50,50,50,67,50,50,50,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,67,50,50,50,50,50,50,87,50,50,50,91,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,87,50,50,50,50,50,50,50,50,50,50,91,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,50,50,50,50,72,50,50,50,50,50,50,91,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,72,72,50,50,72,50,50,50,82,72,50,50,50,50,50,50,91,36,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,82,50,36,72,50,50,72,50,50,50,50,50,50,50,91,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,82,50,50,50,50,50,50,50,81,72,72,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,50,50,50,50,50,50,50,50,50,50,50,50,50,36,50,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +39,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,9,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,30,31,50,50,36,30,31,50,36,36,4,5,5,5,5,5,5,5,6,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +50,36,57,30,31,50,50,50,36,50,50,50,50,72,72,50,50,50,50,36,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +30,31,87,50,30,31,50,50,82,50,91,91,91,72,72,50,50,50,36,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +35,50,50,30,31,50,50,82,50,82,50,50,72,91,50,50,50,30,31,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,30,31,82,50,30,31,36,50,91,50,50,50,36,50,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,36,36,50,36,36,50,36,50,91,50,50,50,50,36,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,88,50,50,50,50,50,36,50,30,31,50,50,50,50,50,36,50,36,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,50,50,36,50,30,31,50,50,50,50,50,30,31,36,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,89,79,36,36,50,36,50,50,50,50,50,50,50,50,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,36,50,50,50,50,50,30,31,36,50,50,50,50,50,50,30,31,36,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,13,13,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,36,50,50,57,50,50,50,36,50,50,36,50,50,50,50,50,50,30,31,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,13,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,59,50,50,87,50,50,88,50,36,30,31,50,50,50,50,50,36,50,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,69,50,50,50,50,36,50,50,36,36,50,50,50,50,50,50,50,30,31,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,13,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,50,50,36,30,31,36,50,50,50,50,50,50,50,36,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,36,50,36,50,50,50,36,36,50,30,31,50,30,31,30,31,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,36,50,36,50,50,50,36,30,31,30,31,50,30,31,36,36,50,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,30,31,50,50,36,50,50,30,31,50,58,59,50,50,50,50,30,31,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,0,0,0,0,0 +9,36,50,50,50,50,50,30,31,30,31,58,77,77,59,50,50,50,50,36,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0 +9,50,50,50,50,50,50,50,30,31,50,68,77,77,69,50,50,50,36,50,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,13,0,13,0,0 +9,50,50,50,50,50,50,50,50,36,30,31,68,69,50,50,50,30,31,50,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,0,13,0,13,0,0 +9,50,50,50,30,31,50,50,50,36,36,50,50,50,50,36,50,50,50,36,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,0,13,13,13,0,0 +9,50,50,50,50,50,50,50,50,50,50,36,50,50,36,50,88,50,36,50,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0 +9,50,50,50,50,50,50,50,30,31,50,36,50,50,50,36,50,50,30,31,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0 +9,50,50,50,50,50,50,50,50,36,36,50,50,50,36,79,50,50,50,36,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +9,50,50,50,50,50,50,50,36,50,30,31,50,50,50,50,36,30,31,50,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +9,50,50,50,50,50,50,50,36,50,36,36,50,50,30,31,50,36,36,36,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +9,30,31,50,50,30,31,50,50,30,31,50,50,50,50,30,31,50,36,50,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +9,50,30,31,50,36,50,30,31,50,36,50,50,50,50,50,50,50,50,36,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,3,23,14,15,23,3,23,23,23,3,3,23,23,23,23,23,23,23,23,23,23,14,15,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23 +9,50,50,50,50,50,50,50,50,36,36,50,50,50,50,50,88,50,50,36,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,24,25,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,24,25,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33 +9,50,50,50,50,50,50,50,50,36,30,31,50,50,50,50,50,50,30,31,36,36,71,81,82,71,72,82,72,71,81,82,72,71,71,81,81,82,72,36,9,30,31,50,72,81,50,30,31,50,50,50,50,71,36,50,50,50,50,36,30,31,50,50,50,50,50,36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,36,36 +9,50,50,50,50,50,50,50,50,36,36,50,50,50,89,79,50,50,50,36,50,36,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,36,9,50,50,50,91,91,50,50,50,50,50,50,50,50,36,50,91,50,50,36,36,50,50,50,50,50,50,30,31,50,89,59,50,50,91,91,91,91,50,58,77,79,91,82,89,78,78,79,91,82,50,50,50,50,50,50,50,50,36,36 +28,18,18,18,18,18,53,19,19,19,18,18,53,18,50,50,36,30,31,36,36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,36,9,50,50,50,91,91,50,50,50,50,50,50,50,50,50,50,50,71,71,30,31,36,36,36,30,31,50,36,91,82,50,68,59,50,71,71,71,91,89,77,69,50,50,71,71,81,81,71,71,82,50,57,50,36,91,82,82,36,50,36 +44,44,44,44,44,44,63,44,44,44,44,44,63,44,30,31,50,71,82,36,36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,36,9,50,50,50,91,91,50,50,58,59,50,50,50,50,50,50,50,71,71,50,50,50,50,50,50,36,50,71,71,71,71,50,87,50,50,82,91,91,50,67,50,50,50,71,71,82,81,71,71,82,89,77,78,36,91,71,82,36,50,36 +36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,30,31,91,89,78,78,79,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,36,9,50,50,50,91,91,50,50,68,69,50,50,50,50,36,50,91,50,50,91,50,50,50,50,50,50,36,91,91,91,91,50,89,78,78,79,50,50,50,87,82,91,91,91,91,91,91,91,91,91,50,87,50,36,36,71,36,36,50,36 +36,50,50,50,4,5,5,5,5,5,5,5,5,6,36,36,36,36,36,30,31,36,36,36,30,31,36,36,50,30,31,36,30,31,36,36,30,31,36,36,9,50,50,50,81,82,50,36,36,36,36,36,82,36,36,36,36,50,50,50,50,50,50,50,50,50,36,36,36,34,36,56,56,56,56,35,50,91,50,34,36,36,50,50,50,36,36,50,50,36,36,36,30,31,36,71,36,30,31,36 +36,36,50,50,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,50,4,5,5,5,5,5,6,36,50,50,36,9,56,56,56,56,56,56,36,36,36,36,36,82,36,36,50,50,50,50,50,50,50,50,50,50,50,30,31,50,29,36,66,66,66,66,9,50,72,50,29,36,36,50,50,50,50,50,50,50,36,36,36,50,50,91,71,91,50,50,36 +16,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,88,50,50,50,89,78,78,79,50,50,50,50,50,30,31,36,9,66,66,66,66,66,66,44,44,44,36,50,71,50,50,30,31,50,50,50,50,50,50,50,50,50,50,30,31,29,36,50,34,56,35,9,50,50,50,29,34,35,35,50,50,30,31,34,34,36,4,5,5,5,5,53,5,5,5,6 +26,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,89,59,50,50,50,50,36,9,50,50,50,50,50,88,50,50,36,36,50,71,50,57,50,30,31,50,36,36,50,50,50,50,50,36,50,50,29,36,50,29,66,9,28,19,53,19,39,29,9,28,19,19,19,19,39,29,36,36,50,50,50,91,63,91,50,50,36 +16,50,50,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,36,36,50,50,50,57,50,50,50,50,50,50,50,50,50,68,59,50,50,30,31,9,50,50,58,77,79,50,50,50,36,36,50,82,50,87,50,36,36,30,31,36,50,50,50,36,30,31,50,50,29,36,50,29,50,9,45,44,63,45,46,29,9,45,45,45,45,45,46,29,36,36,50,50,50,91,50,91,50,50,36 +26,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,36,35,50,50,50,67,50,57,50,50,34,36,50,50,50,57,87,50,50,50,36,9,50,89,77,69,50,50,50,50,36,36,50,50,88,50,50,50,36,36,50,50,50,50,50,36,36,50,88,50,29,36,50,29,59,28,18,18,53,19,19,39,28,18,18,18,19,19,19,39,36,4,5,5,5,5,53,5,5,5,6 +16,50,50,50,50,50,50,50,50,50,50,50,89,78,79,88,50,50,50,36,9,50,50,50,67,57,87,50,50,29,36,50,50,50,87,50,50,50,50,36,9,50,50,67,50,50,50,30,31,36,36,50,50,50,50,30,31,36,50,36,36,50,50,50,30,31,50,50,50,29,36,50,29,77,45,45,45,63,45,45,45,45,45,45,45,45,45,45,45,36,36,50,50,50,91,63,91,36,36,36 +26,50,50,50,57,50,50,50,50,50,50,50,50,50,89,77,59,50,36,50,9,50,50,50,77,77,59,50,50,29,35,50,50,50,50,50,50,50,50,34,9,50,50,87,50,50,50,50,50,36,36,89,79,50,50,50,36,36,36,36,30,31,50,50,36,36,50,50,50,29,36,50,29,87,50,50,50,57,50,36,36,50,50,50,50,50,50,50,50,36,36,50,50,50,91,71,71,36,71,71 +16,50,50,50,67,50,50,50,50,50,50,50,50,50,50,87,67,50,30,31,9,50,50,89,77,77,69,50,50,29,9,50,50,50,50,50,50,50,50,29,9,50,50,50,88,50,50,50,50,36,36,50,50,36,30,31,50,50,50,50,50,50,36,30,31,50,50,50,50,29,36,50,29,50,50,50,50,67,50,30,31,58,78,78,78,78,78,78,59,36,36,50,50,50,91,91,91,91,91,36 +26,50,50,50,67,50,50,50,50,50,50,50,50,50,50,50,87,50,36,50,9,50,50,50,87,67,50,57,50,29,9,50,35,50,71,91,50,34,50,29,9,50,50,50,50,50,50,50,50,35,36,30,31,50,50,50,36,50,50,50,50,50,50,50,50,50,50,50,58,29,36,50,29,50,50,50,50,67,50,30,31,67,50,50,50,50,50,50,67,36,36,50,50,50,50,50,50,50,50,36 +50,35,50,50,67,50,50,50,50,34,36,36,50,50,50,50,50,50,50,36,9,50,50,50,58,77,79,87,50,29,9,56,9,50,91,72,50,29,56,29,28,18,18,18,54,56,56,56,56,9,35,50,30,31,50,50,50,50,50,50,50,50,50,88,50,50,50,50,68,29,36,50,29,50,36,50,50,67,36,36,36,67,36,50,36,36,50,36,67,36,36,36,36,36,36,36,36,36,36,36 +50,9,50,50,67,50,50,50,50,29,71,36,50,50,50,50,50,50,30,31,9,50,50,50,67,87,50,50,50,29,9,66,9,50,50,50,50,29,66,29,43,44,44,44,64,66,66,66,66,9,9,50,36,36,50,50,50,30,31,50,36,50,50,50,50,50,50,50,50,29,36,50,29,50,36,50,50,67,36,36,36,67,36,50,36,36,50,36,67,36,36,36,50,50,50,50,50,50,50,36 +31,9,50,50,87,50,50,50,50,29,30,31,50,50,50,50,50,50,50,36,9,50,50,50,87,50,50,50,50,29,9,50,28,18,18,53,19,39,50,29,36,50,50,50,50,50,50,50,50,9,9,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,29,36,50,29,50,50,50,50,67,50,30,31,67,50,50,36,50,50,58,77,59,30,31,36,36,50,50,50,50,50,50 +50,9,50,50,50,50,50,50,50,29,81,36,35,91,50,50,50,91,34,36,9,50,50,50,50,88,50,71,50,29,9,50,43,44,44,63,45,46,50,29,36,50,50,50,50,50,50,50,50,9,9,50,50,50,50,50,50,50,50,50,50,50,50,50,50,88,50,50,50,29,36,50,29,50,50,50,50,67,50,36,36,67,50,50,36,50,58,77,77,77,59,50,30,31,36,50,50,50,50,50 +31,28,18,18,18,53,19,19,19,39,71,36,28,18,54,56,55,19,39,50,9,50,50,91,91,91,91,50,50,29,9,50,50,50,50,50,50,50,50,29,36,50,71,72,71,81,71,82,50,9,9,50,50,50,50,50,50,50,50,50,50,50,58,59,50,50,50,50,58,29,36,50,29,50,50,50,50,68,78,78,78,69,50,30,31,89,77,77,77,77,77,79,50,50,50,36,36,50,50,50 +50,43,44,44,44,63,45,45,45,46,81,36,43,44,64,66,65,45,46,36,9,50,50,91,51,52,91,50,50,29,28,18,18,18,53,19,19,19,19,39,36,50,81,91,91,91,91,71,50,9,28,18,18,18,53,19,19,19,19,19,19,19,19,19,19,19,19,19,19,39,36,50,29,36,36,36,36,36,36,36,36,36,36,36,36,50,68,77,77,77,69,82,50,50,50,82,36,50,50,50 +31,50,50,50,50,50,50,50,36,71,30,31,50,50,50,50,50,30,31,50,9,50,50,91,61,62,91,50,50,29,43,44,44,44,63,45,45,45,45,46,36,50,82,81,72,72,71,81,50,9,43,45,45,46,66,43,45,45,45,45,45,45,45,45,45,45,45,45,45,46,36,50,29,36,36,36,36,36,36,36,36,36,30,31,36,36,50,68,77,69,50,50,50,50,50,50,30,31,50,50 +34,50,50,50,57,50,50,50,36,71,72,36,50,50,50,50,50,50,50,36,9,50,50,91,91,91,91,50,50,29,36,50,50,50,57,50,50,50,50,50,50,50,50,50,50,50,50,50,50,9,36,50,50,50,50,50,50,50,87,50,50,88,50,50,36,50,50,50,50,50,50,50,29,82,50,50,50,50,50,50,50,50,50,50,82,30,31,50,87,50,50,50,50,50,50,50,50,36,36,50 +29,50,50,50,67,50,50,50,36,82,30,31,50,50,50,50,50,50,50,36,9,50,71,50,50,50,50,82,50,29,30,31,50,50,87,50,58,77,78,79,50,50,50,50,50,50,50,50,50,28,18,18,18,18,53,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,39,36,82,50,50,50,50,50,36,50,50,50,50,50,36,30,31,50,50,50,82,50,50,50,50,82,36,50 +29,50,50,50,67,50,50,50,81,36,71,36,50,50,50,50,50,50,30,31,9,50,50,50,50,50,50,50,50,29,36,50,50,50,50,89,77,69,88,50,50,50,50,30,31,50,50,50,82,43,45,45,45,46,66,43,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,46,50,50,50,36,36,30,31,36,50,50,50,50,50,30,31,36,50,50,50,50,50,50,50,50,50,30,31 +29,50,50,50,67,50,50,50,36,71,36,82,50,50,50,50,50,50,50,36,28,18,18,18,18,19,19,19,19,39,36,30,31,36,30,31,36,36,30,31,36,30,31,36,36,36,30,31,36,30,31,88,50,50,50,87,50,82,30,31,36,50,50,50,50,50,50,87,50,35,34,87,91,71,71,91,30,31,36,36,36,50,50,36,30,31,36,36,30,31,30,31,36,36,30,31,50,36,36,36 +29,50,50,89,77,78,78,79,36,35,34,56,56,56,56,56,56,56,30,31,43,44,44,44,44,44,44,44,44,46,4,6,4,6,4,6,4,6,4,6,4,6,4,6,4,6,4,6,30,31,36,50,50,50,50,50,50,82,50,36,30,31,91,91,91,91,91,91,50,9,29,50,91,71,71,91,36,36,30,31,36,50,50,30,31,36,36,30,31,36,36,30,31,36,36,36,50,36,30,31 +29,50,50,50,67,50,50,50,50,9,29,66,66,66,66,66,66,66,66,36,50,4,6,50,50,4,6,50,50,50,50,50,50,50,50,50,4,6,50,50,50,50,50,50,50,50,50,50,36,30,31,50,50,50,50,50,50,50,50,82,82,72,72,72,81,81,81,91,50,9,29,50,91,72,72,91,50,50,50,36,30,31,50,50,50,50,50,82,30,31,36,82,30,31,50,50,50,50,50,36 +29,50,50,50,87,50,50,50,50,9,29,50,50,88,50,50,50,50,50,36,50,50,50,50,50,50,50,50,50,4,6,50,50,50,50,50,50,50,50,50,4,6,50,50,50,50,50,36,30,31,36,50,50,50,50,50,50,50,82,35,34,91,91,91,91,81,81,91,50,9,29,50,91,72,72,91,50,50,50,36,36,50,50,50,50,50,50,50,50,36,36,50,50,50,50,50,50,50,30,31 +29,50,50,50,50,50,50,50,50,9,29,50,50,50,50,50,50,57,30,31,50,50,50,50,50,50,50,71,71,81,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,30,31,50,50,50,50,50,50,50,50,50,50,9,29,50,50,50,91,72,72,91,50,9,29,50,91,81,81,91,50,50,50,30,31,50,50,50,50,50,50,50,82,30,31,50,50,50,50,50,50,50,50,36 +29,56,56,56,56,56,56,56,56,9,29,50,50,50,50,50,58,77,50,36,50,50,50,4,6,3,3,50,71,81,50,50,50,50,58,59,50,50,50,4,6,50,50,50,50,50,30,31,50,50,50,50,50,50,50,50,50,50,50,28,39,50,50,50,91,72,72,91,50,9,29,79,91,81,81,91,50,30,31,36,36,50,82,50,50,50,50,50,30,31,30,31,50,50,50,50,50,30,31,36 +29,66,66,66,66,66,66,66,66,9,29,91,72,50,50,50,77,69,36,36,50,50,50,3,3,50,71,50,71,81,50,58,59,58,4,6,50,50,50,50,50,50,50,50,50,50,36,88,50,50,50,50,50,50,50,50,50,50,50,43,46,50,50,50,91,81,81,91,50,9,29,50,91,71,71,91,50,50,30,31,30,31,50,50,50,50,50,50,50,36,36,50,50,50,30,31,50,50,50,30 +29,50,50,36,50,50,36,50,50,9,29,50,91,50,50,50,87,36,50,50,50,50,50,71,50,50,82,50,82,71,89,77,77,77,77,59,50,50,50,50,50,50,50,50,50,50,50,30,31,50,50,50,50,50,50,50,50,50,30,31,50,30,31,50,91,72,72,91,50,28,39,79,91,71,71,91,50,50,50,36,36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,82,50,30,31 +29,50,50,36,91,91,36,50,50,9,29,91,82,50,50,50,88,36,30,31,50,50,50,71,50,50,50,50,50,71,50,68,77,77,77,69,50,4,6,50,50,50,50,50,50,50,50,50,36,88,50,50,50,50,50,50,50,50,50,35,34,50,50,50,91,72,72,91,50,43,46,50,91,72,72,91,50,50,50,30,31,50,50,50,50,50,50,50,50,36,36,50,50,82,30,31,50,50,50,36 +39,50,50,36,71,72,36,50,50,28,39,50,50,50,50,36,50,50,36,50,50,50,4,6,50,50,50,50,50,82,50,50,68,69,87,50,50,50,50,50,50,50,50,50,50,50,50,50,30,31,36,30,31,50,50,50,50,50,50,28,39,50,50,50,91,72,72,82,82,72,82,72,91,72,72,91,50,50,30,31,36,82,50,50,50,50,50,82,30,31,36,30,31,36,36,30,31,36,30,31 +46,36,36,36,72,71,36,36,36,43,46,36,36,36,36,50,30,31,50,50,50,50,50,82,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,4,5,5,5,5,5,5,5,5,43,46,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6 diff --git a/intra/source/csv/OVERWORLD_BG2.csv b/intra/source/csv/OVERWORLD_BG2.csv new file mode 100644 index 0000000..896edea --- /dev/null +++ b/intra/source/csv/OVERWORLD_BG2.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,20,21,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +20,21,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,20,21,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,20,21,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,20,21,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,20,21,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,20,21,0,0,20,21,0,0,20,21,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,20,21,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,20,21,0,0,0,20,21,0,20,21,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,20,21,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0 +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +21,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,20,21 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,20,21,0,0,20,21,0,20,21,0,0,0,20,21,0,20,21,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,20,21,0,0,20,21,20,21,0,0,20,21,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,20,21,0,0,20,21,0,0,20,21,0,0,0,0,0,20,21 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,20,21,0,0,20,21,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,20,21,20,21,0,0,0,0,0,20,21,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,20,21,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,20,21,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,20,21,0,20,21,0,0,20,21,0,20,21 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/OVERWORLD_FG.csv b/intra/source/csv/OVERWORLD_FG.csv new file mode 100644 index 0000000..10e6369 --- /dev/null +++ b/intra/source/csv/OVERWORLD_FG.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/REDCAVE_BG.csv b/intra/source/csv/REDCAVE_BG.csv new file mode 100644 index 0000000..8b8ddc7 --- /dev/null +++ b/intra/source/csv/REDCAVE_BG.csv @@ -0,0 +1,100 @@ +14,6,15,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13 +14,27,6,36,45,17,18,44,38,13,14,60,36,37,37,37,37,37,37,6,6,37,37,37,37,38,20,20,20,13,14,27,27,27,27,27,27,27,27,13,14,10,10,27,27,27,27,27,27,27,27,27,27,27,27,27,27,40,42,13,14,27,36,45,28,28,44,38,27,13 +14,27,36,45,17,18,19,18,48,13,14,60,46,18,18,18,18,75,18,18,18,18,18,18,18,48,27,10,27,13,14,27,27,27,27,27,27,27,27,13,14,37,37,37,37,37,37,37,37,37,37,37,37,38,27,27,27,50,52,13,14,36,45,28,28,28,28,44,37,13 +14,41,42,17,18,18,18,19,44,13,14,60,46,17,74,73,19,76,17,3,4,57,57,35,19,44,37,37,37,6,6,37,37,37,37,37,37,38,27,6,6,17,18,18,18,18,18,18,18,18,18,18,18,44,37,12,12,12,12,6,6,45,28,28,28,28,28,28,18,13 +14,61,61,73,18,18,18,19,18,13,14,60,46,17,72,70,19,76,17,13,14,27,27,46,19,18,18,18,18,18,18,18,18,18,18,18,17,44,37,37,45,17,34,57,57,57,57,57,57,57,57,35,19,18,18,18,18,18,18,18,18,18,28,28,28,28,28,18,18,13 +14,61,61,61,73,18,18,18,19,13,14,92,46,17,72,70,19,76,17,13,14,27,27,56,57,57,57,57,57,3,4,57,57,57,57,35,18,18,18,18,18,18,48,10,27,27,27,27,10,20,27,46,17,18,18,18,18,18,18,18,18,18,28,28,28,28,28,18,18,13 +14,61,61,61,70,18,18,18,19,6,6,37,45,17,72,70,19,76,17,13,14,27,27,27,27,27,27,10,20,13,14,27,27,27,27,56,57,57,57,3,4,19,48,27,27,20,10,27,27,27,27,46,17,34,57,12,12,12,12,11,4,35,28,28,28,28,28,28,18,13 +14,61,61,61,61,71,73,18,18,18,18,18,18,18,72,70,18,18,18,13,14,20,10,27,27,27,27,27,20,13,14,27,27,27,27,27,27,27,27,13,14,19,44,37,37,37,37,37,37,37,37,45,17,48,27,27,27,40,42,13,14,56,35,28,28,28,28,34,57,13 +14,61,61,61,61,61,62,73,18,3,4,74,71,71,61,61,71,71,71,13,14,20,20,20,27,27,10,20,20,13,14,27,27,27,27,27,27,27,27,13,14,19,18,18,18,18,18,18,18,18,18,18,18,48,27,27,27,50,52,13,14,27,56,35,28,28,34,58,27,13 +7,11,11,11,11,11,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,4,27,27,3,11,11,7,7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,7,7,11,11,11,4,17,3,11,11,7 +7,7,7,7,7,7,7,7,7,7,14,6,6,6,6,6,6,6,6,13,14,6,15,6,6,6,6,6,6,13,14,6,6,15,6,6,15,6,6,13,14,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,13,14,6,6,6,6,34,6,6,6,13 +14,6,6,6,6,6,6,6,6,13,14,27,27,27,27,27,27,27,27,13,14,27,15,46,17,48,27,27,27,13,14,27,27,15,27,27,15,27,27,13,14,41,41,41,41,41,41,41,42,27,27,27,27,27,36,37,45,17,18,13,14,40,42,46,17,44,38,27,27,13 +14,27,36,37,37,37,37,38,27,13,14,27,10,10,27,10,27,27,27,13,14,27,15,45,17,48,27,27,27,13,14,27,27,15,27,27,15,27,27,13,14,27,27,27,27,27,27,27,60,27,27,27,27,27,46,17,18,18,18,13,14,50,52,46,17,17,48,27,27,13 +14,27,46,28,28,28,28,48,27,13,14,92,27,27,27,92,27,27,27,6,6,36,6,18,18,48,27,27,27,6,6,27,27,15,10,27,15,27,27,6,6,27,40,41,41,41,42,27,60,27,27,27,27,27,46,17,34,57,57,13,14,50,52,46,17,17,48,27,27,13 +14,27,46,28,28,28,28,48,27,13,14,10,27,27,27,10,27,27,27,27,27,46,28,34,57,58,27,27,27,27,27,27,27,15,27,27,15,27,27,27,27,27,50,61,52,27,27,27,60,27,27,27,27,27,46,17,48,27,27,13,14,27,27,46,17,17,48,27,27,13 +14,27,46,28,28,28,28,48,27,13,14,27,27,27,27,20,27,27,27,3,4,46,28,44,38,27,27,5,12,12,12,12,12,6,27,10,13,11,11,11,11,4,52,27,27,27,40,41,52,27,27,27,36,37,45,18,48,27,27,13,14,27,27,46,17,17,48,27,27,13 +14,27,56,57,57,57,57,58,27,13,14,27,27,27,27,92,10,20,20,13,14,56,5,17,48,27,27,15,27,27,27,27,27,27,27,27,13,7,7,7,7,14,52,27,40,41,61,61,52,27,27,27,46,17,18,34,58,27,27,13,14,27,27,46,17,17,48,27,27,13 +14,36,37,38,27,27,27,22,27,13,14,27,27,27,27,20,20,20,20,13,14,27,15,17,44,38,27,15,27,12,12,12,12,12,12,12,13,7,7,7,7,14,52,27,27,27,27,27,27,27,27,27,46,17,34,58,27,27,27,13,14,27,27,46,17,17,48,27,27,13 +14,46,28,48,27,27,27,27,27,13,14,27,27,27,27,10,20,92,92,13,14,27,15,16,17,48,27,15,27,27,27,27,27,27,27,27,13,7,7,7,7,14,61,41,41,41,41,41,41,3,4,27,46,17,48,27,27,27,27,13,14,27,27,46,17,17,48,27,27,13 +6,56,57,58,3,11,11,11,11,7,7,11,4,27,3,11,11,11,11,7,7,11,7,11,11,11,11,7,11,11,11,11,11,4,27,27,13,7,7,7,7,14,61,61,61,61,61,61,61,13,7,11,11,11,11,11,4,27,27,13,7,11,11,4,17,17,3,11,11,7 +10,27,27,27,10,50,61,61,61,61,14,6,6,27,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,7,7,7,14,27,27,13,7,7,7,7,14,61,61,61,61,61,61,61,13,14,6,6,6,6,6,6,27,27,13,14,6,6,6,57,57,6,6,6,6 +27,27,40,41,41,61,61,61,61,61,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,10,13,14,6,6,6,27,27,6,6,6,13,14,6,50,61,61,61,61,61,62,6,6,16,17,48,27,27,27,27,27,13,14,40,41,42,27,27,51,10,22,27 +10,40,61,61,61,61,61,61,61,61,14,27,27,27,27,27,27,10,27,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,40,61,61,61,61,61,52,27,27,27,35,17,48,27,27,27,27,27,13,14,50,61,52,27,27,60,10,27,27 +41,61,61,61,61,61,61,61,61,61,14,27,27,3,11,11,4,27,27,6,6,27,27,27,27,27,27,27,27,6,6,27,27,27,27,27,27,27,27,13,14,50,61,61,61,61,52,20,27,3,4,46,17,44,37,37,38,27,27,13,14,50,61,52,27,27,60,10,10,10 +27,50,61,61,61,61,61,61,61,61,14,27,27,13,7,7,14,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,5,27,27,27,27,27,27,6,6,27,27,50,61,61,52,20,40,13,14,46,16,16,16,17,48,27,27,13,14,50,61,52,27,27,50,41,41,41 +27,50,61,61,61,61,61,61,61,61,14,27,27,13,7,7,14,27,27,3,4,27,27,27,27,27,27,27,27,3,4,27,15,27,27,27,27,27,27,27,27,27,27,20,20,20,27,20,50,13,14,56,57,57,35,17,48,27,27,13,14,60,27,27,27,27,27,27,50,61 +27,50,61,61,61,61,61,61,61,61,14,27,27,6,6,6,6,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,15,27,27,27,27,27,27,3,4,27,27,40,41,41,41,41,61,13,14,27,27,27,46,17,44,37,37,13,14,60,27,27,27,27,27,27,50,61 +41,61,61,61,61,61,61,61,61,61,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,6,27,27,27,27,27,27,13,14,41,41,61,61,61,61,61,61,13,14,27,27,27,46,16,16,16,17,13,14,50,42,10,27,27,10,40,61,61 +61,61,61,61,61,61,61,61,61,61,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,61,61,61,61,61,61,61,61,13,14,27,27,27,56,57,57,35,16,13,14,50,61,42,27,27,40,61,61,61 +61,61,61,61,61,61,61,61,61,61,7,11,11,11,11,11,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,4,27,27,3,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,11,4,27,3,11,11,11 +14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,15,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,15,6,27,27,6,15,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,15,6,13,14,6,6,15,6,15,6,6,6,13 +14,27,27,27,36,37,40,41,41,6,6,41,41,41,41,41,15,27,27,13,14,20,20,27,20,20,20,20,20,13,14,27,6,27,27,27,27,6,27,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,15,27,13,14,27,27,15,27,15,27,27,27,13 +14,27,27,27,46,18,18,18,72,41,41,70,18,18,18,72,15,27,27,13,14,20,20,27,20,20,20,20,20,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,6,27,13,14,27,36,6,37,6,37,38,27,13 +14,27,27,27,46,18,18,18,18,18,18,18,18,18,18,18,15,27,27,6,6,20,20,20,20,20,27,20,20,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,46,19,17,17,19,48,27,13 +14,12,12,37,12,12,12,12,12,12,12,12,12,12,19,19,15,27,27,27,27,27,20,20,27,20,20,20,20,13,14,27,5,27,27,27,3,11,11,7,14,27,27,27,12,27,27,27,27,6,6,27,27,27,27,27,27,27,27,13,14,27,46,19,17,17,19,48,27,13 +14,46,16,16,17,48,27,46,16,16,16,16,16,16,19,19,15,27,27,3,4,20,20,20,20,20,20,20,20,13,14,27,15,27,27,27,13,7,7,7,14,27,27,27,27,10,27,27,27,27,27,27,27,27,27,27,27,27,27,13,14,27,46,19,17,17,19,48,27,13 +14,46,19,18,18,48,27,46,16,16,16,16,16,16,19,74,15,27,27,13,14,20,20,20,20,20,20,20,20,13,14,27,15,27,27,27,13,7,7,7,14,27,27,27,27,27,5,27,27,3,4,27,27,27,27,27,27,27,27,13,14,27,46,19,34,35,19,48,27,13 +14,56,57,57,57,58,27,56,57,74,71,71,71,71,71,61,15,27,27,13,14,20,20,20,20,20,27,20,20,13,14,27,6,20,27,27,13,7,7,7,14,27,27,27,27,27,15,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,46,19,48,46,19,48,27,13 +14,27,27,27,27,27,27,27,27,3,4,61,61,61,61,61,15,27,27,13,14,20,20,20,20,20,27,20,20,13,14,27,10,20,27,27,13,7,7,7,14,27,5,27,27,27,15,27,27,13,14,27,27,27,27,27,27,27,27,13,14,27,46,19,48,46,19,48,27,13 +7,11,11,11,11,11,11,4,27,13,7,11,11,11,11,11,7,11,11,7,7,11,11,11,11,4,27,3,11,7,7,11,11,4,27,27,13,7,7,7,7,11,7,11,4,27,13,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,4,58,56,3,11,11,7 +14,6,6,6,6,6,6,6,27,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,27,6,6,13,14,6,6,6,38,36,6,6,6,13,14,6,6,6,6,27,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,36,37,13,7,7,7 +14,27,27,27,27,27,27,27,27,13,14,27,27,27,20,10,46,17,17,13,14,27,27,27,27,27,27,27,27,13,14,27,46,28,44,45,28,48,92,13,14,27,27,27,27,27,27,27,27,13,14,27,10,27,27,27,27,27,10,13,14,27,27,36,45,19,6,6,6,13 +14,27,40,41,41,41,41,41,42,13,14,27,27,27,27,27,46,17,17,13,14,27,27,27,27,27,27,27,27,13,14,27,46,28,28,28,28,48,27,13,14,27,27,27,27,27,27,27,27,13,14,10,27,27,27,27,27,36,37,13,14,27,27,46,19,19,28,28,28,13 +14,27,50,61,61,61,61,61,52,13,14,27,27,27,27,27,46,17,17,13,14,27,27,27,27,27,27,27,27,13,14,20,56,35,28,28,34,58,27,13,14,27,27,27,27,27,12,12,12,13,14,41,41,42,27,27,27,46,28,13,14,11,11,4,19,19,3,11,11,7 +14,27,50,61,61,61,61,61,52,13,14,27,27,27,27,27,46,17,17,13,14,12,12,12,12,12,12,27,27,13,14,20,10,56,57,57,58,27,27,13,14,27,27,27,27,27,27,27,27,13,14,61,61,52,27,27,27,46,28,13,14,6,6,6,19,19,6,6,6,13 +14,27,50,61,61,61,61,61,52,13,14,27,27,27,27,27,46,17,17,13,14,27,27,27,27,27,27,27,27,13,14,37,37,37,37,37,37,37,37,13,14,12,12,12,12,27,27,27,27,13,14,61,61,52,27,27,27,56,57,13,14,28,28,28,19,19,20,20,20,13 +14,27,50,61,61,61,61,61,52,13,14,20,27,27,27,27,46,17,17,13,14,27,27,27,27,27,27,27,27,13,14,16,16,16,16,16,16,16,16,13,14,27,27,27,27,27,27,27,27,13,14,61,61,52,27,27,27,27,27,13,14,28,28,28,19,19,3,11,11,7 +14,27,27,50,61,61,61,62,27,13,14,27,27,27,27,12,5,17,17,13,14,27,27,27,27,27,27,27,27,13,14,71,71,71,57,57,57,57,57,13,14,27,27,27,27,27,27,27,27,13,14,61,61,52,20,20,20,36,37,13,14,28,28,5,19,19,6,6,13,7 +14,27,27,27,27,27,27,27,27,13,14,10,20,5,27,27,15,74,73,13,14,27,27,27,27,27,27,27,27,13,14,61,61,61,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,61,61,52,27,20,20,46,28,13,14,57,57,15,19,19,48,27,13,7 +7,11,11,11,11,11,11,4,27,13,7,11,11,7,4,27,13,11,11,7,7,4,27,3,11,11,11,11,11,7,7,11,11,4,27,27,3,11,11,7,7,11,11,11,11,11,4,27,3,7,7,11,11,4,27,3,11,11,11,7,7,11,11,7,11,4,58,27,13,7 +14,6,6,6,6,6,6,6,27,13,14,6,6,15,6,27,6,6,6,13,14,6,37,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,38,6,13,14,6,6,15,27,15,6,6,6,13,7,7,7,7,7,14,27,27,13,7 +14,27,27,27,27,27,27,27,27,13,14,27,27,15,27,27,40,41,42,13,14,17,18,18,18,18,18,18,19,13,14,36,37,37,37,37,37,37,38,13,14,28,28,28,28,28,28,48,10,13,14,27,27,6,27,6,27,27,27,13,7,14,6,6,6,6,37,37,13,7 +14,27,27,27,27,27,27,27,27,13,14,27,27,15,27,27,50,61,52,13,14,17,5,12,57,57,12,5,19,13,14,46,17,18,18,18,18,17,48,13,14,28,34,57,57,57,57,58,20,13,14,27,27,27,27,27,27,27,27,13,7,14,17,18,18,18,18,18,13,7 +14,27,5,27,27,27,27,27,27,6,6,12,12,6,27,27,50,61,52,13,14,17,15,27,27,27,27,15,19,13,14,46,17,28,28,28,28,17,48,13,14,28,48,27,27,27,27,27,20,13,14,27,10,27,27,27,27,10,27,13,7,14,17,17,18,18,18,19,13,7 +14,27,15,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,6,6,57,15,27,27,27,27,15,19,13,14,46,17,28,28,28,28,17,48,13,14,28,48,27,27,27,27,27,27,6,6,27,27,27,27,27,27,27,27,13,7,14,17,17,17,18,19,19,13,7 +14,27,15,37,37,37,37,37,38,3,4,27,27,27,27,27,27,27,27,27,27,27,15,27,27,27,27,15,19,13,14,46,17,28,28,28,28,17,48,13,14,28,48,27,27,27,27,36,37,38,27,27,27,27,27,27,27,27,27,13,7,14,17,17,16,19,19,19,13,7 +14,27,15,17,18,18,18,18,48,13,14,20,20,20,27,27,5,12,12,11,4,37,15,27,27,27,27,15,19,13,14,46,17,18,18,18,18,18,48,13,14,28,48,10,27,27,27,46,28,3,4,27,27,12,12,12,12,27,27,6,6,6,17,16,16,16,19,19,13,7 +14,27,15,17,34,57,35,19,48,13,14,37,37,37,37,37,6,37,38,13,14,17,6,12,12,12,12,6,19,13,14,46,17,34,57,57,35,17,48,13,14,28,44,37,37,37,37,45,28,13,14,27,27,40,41,41,42,27,27,27,27,46,16,16,16,16,16,19,13,7 +14,27,15,17,48,27,46,19,48,13,14,16,16,16,16,16,16,16,72,13,14,17,16,16,16,16,16,16,16,13,14,46,17,48,40,42,46,17,48,13,14,28,28,28,28,28,28,28,28,13,14,27,27,27,27,27,27,27,27,27,27,56,3,11,11,11,11,11,7,7 +7,11,7,11,11,11,11,11,11,7,7,11,11,4,57,57,3,11,11,7,7,11,11,11,11,11,11,11,11,7,7,4,17,3,11,11,4,17,3,7,7,11,11,11,11,11,11,11,11,7,7,11,11,4,27,27,3,11,11,11,11,11,7,7,7,7,7,7,7,7 +0,0,0,0,0,0,0,0,0,0,14,6,6,6,27,27,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,17,6,6,6,6,17,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,38,27,6,6,6,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,37,37,37,38,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,46,17,48,40,42,46,17,48,13,14,27,27,27,27,27,27,10,27,13,14,27,46,17,48,27,46,17,44,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,16,16,17,44,37,37,38,27,13,14,27,27,27,3,4,27,27,27,13,14,46,17,48,50,52,46,17,48,13,14,27,40,41,41,42,27,27,27,13,14,27,46,17,48,27,46,16,16,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,57,35,16,16,16,17,48,20,13,14,27,27,27,13,14,27,27,27,13,14,46,17,48,50,52,46,17,48,13,14,27,50,61,61,61,42,27,27,13,14,20,46,17,48,27,56,57,57,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,10,56,57,57,35,17,44,37,13,14,27,27,27,13,14,27,27,27,13,14,56,57,58,50,52,56,57,58,13,14,27,50,61,61,61,52,27,27,13,14,10,46,17,44,37,37,37,37,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,20,20,27,27,46,16,16,16,13,14,27,27,27,13,14,27,27,27,13,14,27,92,27,50,52,27,27,27,13,14,27,50,61,61,61,52,27,27,13,14,20,46,16,16,16,16,16,16,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,20,20,27,27,56,57,57,57,13,14,27,27,27,13,14,27,27,27,13,14,27,27,27,50,52,27,92,27,13,14,27,50,61,61,61,52,27,27,13,14,27,56,57,57,57,57,57,57,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,10,10,13,14,27,20,27,13,14,27,27,27,6,6,27,27,27,50,52,27,27,92,6,6,27,50,61,61,61,52,27,27,13,14,27,27,27,27,27,27,27,10,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,20,27,20,13,14,27,27,27,27,27,27,27,27,50,52,92,27,27,27,27,27,27,27,27,27,27,27,27,13,14,42,27,27,27,27,27,40,42,13,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,7,11,11,4,27,3,11,11,11,7,7,4,27,3,7,7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,7,7,11,11,4,27,27,3,11,11,7,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,14,9,9,27,27,27,27,9,9,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,9,9,27,27,9,9,27,13,14,27,27,27,30,30,27,27,27,13,14,9,27,27,27,27,27,27,9,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,9,9,27,27,9,9,27,6,6,27,30,30,30,30,30,30,27,13,14,27,27,40,41,41,42,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,27,27,27,27,27,30,30,27,27,27,6,6,27,27,50,61,61,52,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,3,4,27,27,30,30,30,30,27,27,27,27,27,27,50,61,61,52,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,27,30,27,27,27,27,30,27,3,4,27,27,50,61,61,52,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,30,27,27,27,27,27,27,30,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,30,30,27,27,27,27,30,30,13,14,27,27,27,27,27,27,27,27,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,7,11,11,4,27,3,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,11,4,27,3,11,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,6,6,6,27,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,6,27,6,6,6,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,30,27,27,27,27,27,27,30,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,32,26,26,26,26,32,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,9,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,9,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,26,26,26,26,26,26,26,26,13,14,30,27,27,27,27,27,27,30,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,7,11,11,4,27,3,11,11,11,7,7,11,11,11,11,11,11,11,11,7,7,11,11,4,27,3,11,11,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,6,6,6,27,6,6,6,6,13,14,6,6,6,6,6,6,6,6,13,14,6,6,6,27,6,6,6,6,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,30,30,30,27,27,30,30,30,13,14,27,27,9,27,9,27,27,27,13,14,27,30,27,27,27,30,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,30,27,30,27,27,30,27,30,13,14,27,27,9,27,9,27,27,27,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,9,9,9,27,9,9,9,9,13,14,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,6,6,27,27,27,27,27,27,27,27,13,7,11,11,11,4,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,27,27,27,27,27,27,9,9,9,27,13,7,7,7,7,14,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,3,4,9,9,9,27,9,27,9,27,13,7,14,6,13,14,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,27,27,9,27,9,9,9,27,6,6,6,27,6,6,27,27,22,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,14,27,27,27,27,27,27,27,27,13,14,27,27,9,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,7,11,11,11,11,11,11,11,11,7,7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/REDCAVE_BG2.csv b/intra/source/csv/REDCAVE_BG2.csv new file mode 100644 index 0000000..c29dd7c --- /dev/null +++ b/intra/source/csv/REDCAVE_BG2.csv @@ -0,0 +1,100 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,0,0,0,0,0,9,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,0,0,0,0,0,9,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,0,0,0,0,0,0,9,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0,9,9,9,0,0,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,31,31,9,0,0,9,31,31,0,0,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/REDCAVE_FG.csv b/intra/source/csv/REDCAVE_FG.csv new file mode 100644 index 0000000..850cdc9 --- /dev/null +++ b/intra/source/csv/REDCAVE_FG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/REDSEA_BG.csv b/intra/source/csv/REDSEA_BG.csv new file mode 100644 index 0000000..bc5e98d --- /dev/null +++ b/intra/source/csv/REDSEA_BG.csv @@ -0,0 +1,70 @@ +3,12,1,2,11,12,1,3,4,2,11,12,11,12,1,3,4,3,4,2,61,61,1,2,1,3,4,3,4,3,4,3,4,3,4,2,61,1,2,1,3,4,3,4,2,61,61,1,3,4,2,72,5,63,63,6,7,75,13,11,4,3,12,72,63,63,63,75,13,61 +4,2,11,12,1,2,11,12,11,12,13,71,71,61,11,12,11,12,11,12,1,2,11,12,11,4,3,12,11,4,3,4,3,4,3,4,2,11,4,3,4,3,4,3,4,2,1,3,4,3,12,102,104,104,92,16,17,75,14,1,3,4,2,102,92,63,63,75,13,70 +3,12,71,71,11,12,61,61,61,61,61,61,61,61,61,61,61,1,2,13,11,12,60,61,60,11,12,60,60,11,4,3,12,11,12,11,12,1,3,4,3,4,3,4,3,4,3,4,3,4,2,1,2,61,102,92,63,75,1,3,4,3,12,61,102,104,104,105,1,2 +4,2,80,1,2,80,71,61,61,61,61,61,73,74,61,61,60,11,12,71,60,61,61,13,1,2,1,2,71,1,3,4,2,62,64,64,65,11,4,3,4,3,4,3,4,3,4,3,4,3,12,11,12,13,13,72,63,75,11,4,3,4,2,1,2,1,2,14,11,12 +4,3,71,11,12,71,1,2,61,14,13,71,61,61,61,61,61,71,80,71,71,61,71,60,11,4,3,12,61,11,4,3,12,72,83,63,105,13,11,4,3,4,3,12,11,12,11,12,11,12,60,60,61,71,14,102,104,105,1,3,4,3,4,3,4,3,4,2,1,2 +3,4,2,61,1,2,11,12,61,1,2,70,80,80,71,61,61,71,71,71,61,61,61,61,13,11,12,61,61,1,3,4,2,102,63,75,1,2,1,3,12,11,12,61,61,61,61,61,61,61,61,61,61,61,71,13,14,1,3,4,3,12,11,12,11,12,11,4,3,12 +4,3,12,60,11,12,1,2,61,11,12,13,71,90,90,71,61,61,70,80,80,71,61,61,61,61,71,61,60,11,4,3,12,13,102,105,11,4,3,12,14,61,61,61,61,61,80,80,71,61,61,61,61,61,61,61,1,3,4,3,4,2,60,61,61,60,1,3,12,13 +3,4,2,71,61,61,11,12,60,61,61,61,61,61,14,61,61,61,61,71,71,61,61,61,61,61,61,61,61,1,3,4,2,70,84,60,1,3,4,2,14,61,61,61,61,71,90,90,1,2,1,2,61,61,61,61,11,4,3,4,3,12,61,61,61,61,11,4,2,13 +4,3,4,2,61,61,62,65,61,1,2,61,61,61,61,61,61,61,61,1,2,61,61,62,65,61,61,61,1,3,4,3,12,61,94,1,3,4,3,4,2,61,61,61,61,71,90,1,3,4,3,4,2,61,62,65,60,11,4,3,4,2,71,61,61,61,60,11,4,2 +3,4,3,4,2,71,72,75,14,11,12,14,61,61,61,61,61,61,1,3,4,2,62,83,85,64,65,61,11,4,3,12,62,65,1,3,4,3,4,3,12,60,61,61,61,71,71,11,4,3,4,3,12,61,72,85,65,1,3,4,3,4,2,61,61,61,61,71,11,4 +4,3,4,3,12,71,72,75,1,2,1,2,61,61,61,61,61,61,11,4,3,12,102,92,83,95,105,61,1,3,4,2,102,105,11,4,3,4,3,4,2,60,61,61,61,61,71,1,3,4,3,4,2,61,72,63,75,11,4,3,4,3,12,61,61,61,61,71,1,3 +3,4,3,4,2,60,102,105,11,12,11,12,71,61,70,70,61,61,61,11,12,61,61,72,83,75,61,1,3,4,3,4,2,62,65,11,4,3,4,3,12,61,61,61,61,61,61,11,4,3,4,3,12,61,72,63,75,61,11,12,11,12,61,61,61,61,61,60,11,4 +4,3,4,3,4,2,61,61,1,2,1,2,1,2,1,2,1,2,71,14,14,61,61,72,63,75,61,11,4,3,4,3,12,72,75,60,11,4,3,4,2,71,71,61,61,61,61,60,11,12,11,12,61,61,72,63,85,65,61,61,61,84,61,61,61,61,60,60,1,3 +11,12,11,4,3,12,62,65,11,12,11,4,3,4,3,4,3,12,70,14,14,61,62,82,63,75,71,60,11,12,11,12,61,72,75,61,71,11,4,3,4,2,71,71,61,61,61,61,61,61,61,61,61,61,102,92,63,75,61,61,61,94,61,61,61,61,71,1,3,4 +60,60,1,3,4,2,72,85,64,65,60,11,12,11,12,11,12,14,14,14,14,61,72,63,95,105,61,61,71,80,80,71,62,82,75,61,61,60,11,4,3,4,2,1,2,61,61,61,71,71,71,61,61,61,13,72,63,75,61,61,61,61,61,61,61,61,61,11,4,3 +61,60,11,4,3,12,102,104,92,85,64,64,64,65,61,61,61,71,60,14,14,61,102,63,105,61,61,61,61,71,71,62,82,103,85,65,61,61,1,3,4,3,4,3,12,61,61,61,61,60,60,71,61,61,61,72,63,75,61,61,61,61,61,61,61,61,61,60,11,4 +61,71,1,3,4,2,60,71,102,104,104,104,104,105,71,70,62,65,61,1,2,14,71,94,61,71,70,80,61,61,61,72,83,63,83,75,61,71,11,4,3,12,11,4,2,1,2,61,1,2,1,2,61,61,61,72,95,105,61,61,61,61,61,61,84,61,61,61,1,3 +2,1,3,4,3,4,2,1,2,1,2,1,2,1,2,61,72,75,1,3,4,2,70,71,62,65,61,71,71,61,61,102,92,63,93,75,61,71,1,3,4,2,1,3,4,3,12,61,11,4,3,4,2,61,61,72,75,61,1,2,1,2,61,61,94,61,61,61,11,4 +4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,2,72,75,11,4,3,12,61,61,72,75,61,61,61,1,2,61,102,92,63,85,65,61,11,4,3,4,3,4,3,4,2,61,1,3,4,3,4,2,61,72,75,1,3,4,3,4,2,61,61,61,61,61,1,3 +3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,12,72,75,1,3,4,2,61,61,72,105,61,61,1,3,4,2,61,72,63,95,105,61,1,3,4,3,4,3,4,3,12,61,11,4,3,4,3,12,61,102,105,11,4,3,4,3,12,61,61,61,61,60,11,4 +4,3,4,3,4,3,12,11,12,11,12,11,4,3,12,14,72,75,11,12,11,12,61,61,94,61,61,61,11,4,3,12,61,72,63,75,71,73,16,4,3,4,3,4,3,4,2,61,1,3,4,3,4,2,61,61,61,1,3,4,3,4,2,61,61,61,61,60,1,3 +3,4,3,12,11,12,60,61,62,64,64,65,11,12,61,61,102,105,61,61,61,61,61,61,61,61,61,61,13,11,12,61,62,82,63,85,65,61,102,16,17,16,17,16,17,16,17,64,16,4,3,4,3,12,61,62,65,11,4,3,4,3,12,61,61,61,61,1,3,4 +4,3,4,2,71,62,64,64,82,83,83,85,65,61,61,61,71,1,2,1,2,60,60,61,61,61,61,61,61,61,61,61,72,83,63,63,85,64,65,102,92,63,83,15,83,63,63,63,63,16,4,3,4,2,61,72,85,65,11,12,11,12,60,61,61,61,61,11,4,3 +3,4,3,12,62,82,103,95,104,92,103,103,75,61,1,2,61,11,4,3,4,2,61,61,61,61,61,61,61,61,61,73,63,63,63,63,63,95,105,61,72,63,103,83,93,63,6,7,63,6,3,4,3,4,2,102,92,75,61,61,61,61,61,61,61,61,71,71,11,4 +4,3,4,2,102,104,104,105,61,102,104,104,105,1,3,4,2,1,3,4,3,12,13,13,71,61,61,61,61,61,61,61,72,63,63,63,83,75,61,61,102,104,92,63,63,63,16,17,63,16,4,3,4,3,4,2,102,105,61,62,65,61,61,61,61,80,90,90,1,3 +11,4,3,12,61,61,73,74,61,14,1,2,1,3,4,3,12,11,4,3,4,2,13,1,2,1,2,71,71,61,61,61,102,92,63,63,15,75,61,61,61,61,102,104,104,92,63,95,104,6,3,12,11,4,3,12,61,61,61,72,75,61,61,61,71,90,81,71,11,4 +61,11,4,2,61,61,61,61,61,1,3,4,3,4,3,4,2,61,11,12,11,12,70,11,12,11,4,2,71,71,71,61,61,72,63,63,95,105,61,71,71,61,61,61,61,72,95,105,1,3,4,2,61,11,4,2,61,62,65,72,85,64,65,61,61,61,61,61,1,3 +61,1,3,12,60,62,65,61,1,3,4,3,4,3,4,3,12,61,61,61,61,61,61,61,61,1,3,12,61,61,61,61,61,72,63,63,75,61,1,2,1,2,61,61,61,72,75,61,11,4,3,12,61,1,3,12,62,82,75,102,104,92,85,65,61,61,61,60,11,4 +1,3,4,2,61,72,75,60,11,4,3,4,3,12,11,12,61,61,61,61,61,61,61,61,61,11,4,2,61,61,61,61,61,102,92,95,105,1,3,4,3,4,2,61,61,102,105,61,1,3,4,2,1,3,12,61,72,95,105,1,2,102,92,75,61,61,61,61,1,3 +3,4,3,12,62,82,75,14,1,3,4,3,4,2,70,61,61,61,61,14,14,61,61,61,61,1,3,12,61,14,1,2,1,2,72,75,1,3,4,3,4,3,12,61,61,61,61,61,11,4,3,4,3,4,2,61,72,75,1,3,4,2,72,75,61,61,61,1,3,4 +4,3,12,14,102,104,105,1,3,4,3,4,3,12,61,61,70,61,61,14,14,61,61,61,61,11,4,2,61,1,3,4,3,12,72,75,11,4,3,4,3,4,2,61,61,61,61,61,1,3,4,3,4,3,12,61,102,105,11,4,3,12,72,75,61,61,61,11,4,3 +3,12,80,71,61,61,1,3,4,3,4,3,4,2,13,61,61,61,61,1,2,1,2,61,61,1,3,12,61,11,4,3,12,13,72,75,13,11,4,3,4,3,12,61,61,61,61,61,11,4,3,4,3,4,2,61,61,61,1,3,4,2,102,75,61,61,61,71,11,4 +4,2,71,61,61,61,11,4,3,4,3,12,11,12,61,61,61,61,1,3,4,3,12,61,1,3,4,2,61,1,3,13,13,62,82,85,65,13,11,12,11,12,61,61,61,61,61,61,1,3,4,3,12,11,12,61,84,61,11,4,3,12,61,94,61,61,71,80,1,3 +3,12,84,61,1,2,1,3,4,3,4,2,61,61,61,61,61,71,11,4,3,4,2,61,11,4,3,12,61,11,12,62,64,82,63,63,85,64,65,13,14,61,61,61,61,61,61,61,11,4,3,4,2,61,61,62,75,61,1,3,4,2,61,61,61,61,71,71,11,4 +4,2,94,71,11,4,3,4,3,4,3,12,62,64,65,61,1,2,1,3,4,3,12,61,1,3,12,61,61,14,14,72,95,104,104,104,104,92,75,14,61,14,13,61,61,61,61,61,71,11,12,11,12,61,61,72,75,1,3,4,3,12,61,61,61,61,61,71,1,3 +3,12,61,61,1,3,4,3,4,3,4,2,72,5,75,1,3,4,3,4,3,4,2,61,11,12,61,61,61,1,2,72,75,71,60,60,71,72,75,1,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61,102,105,11,4,3,4,2,61,73,74,61,61,1,3,4 +4,2,61,61,11,4,3,4,3,12,11,12,72,95,105,11,4,3,4,3,4,3,12,61,61,61,61,61,61,11,12,72,75,60,62,65,71,72,75,11,12,71,61,61,61,61,61,13,61,61,61,61,61,61,61,61,61,61,11,4,3,4,2,61,61,61,61,11,4,3 +3,12,60,61,61,11,12,11,12,61,61,62,82,75,61,1,3,4,3,4,3,12,60,61,61,61,61,61,60,13,13,72,85,64,82,85,64,82,75,13,14,71,71,61,61,61,61,61,61,61,61,62,65,61,61,61,61,61,1,3,4,3,12,61,61,61,61,1,3,4 +4,2,60,60,71,61,61,61,61,61,61,102,104,105,1,3,4,3,4,3,4,2,13,71,71,1,2,61,14,1,2,102,104,92,63,63,95,104,105,1,2,13,71,13,14,61,61,1,2,1,2,102,105,61,61,61,61,61,11,4,3,12,61,61,61,61,61,11,4,3 +3,4,2,1,2,14,61,61,61,14,14,1,2,1,3,1,3,4,3,4,3,4,2,13,14,11,12,14,61,11,12,13,13,102,92,95,105,13,13,11,12,61,13,61,61,13,14,11,4,3,4,2,61,61,61,61,61,61,1,3,4,2,61,62,65,61,61,1,3,4 +4,3,4,3,4,2,61,61,61,14,1,3,4,3,4,3,4,3,12,11,4,3,4,2,1,2,1,2,1,2,60,1,2,61,72,75,61,1,2,61,1,2,1,2,1,2,1,2,11,4,3,12,61,61,61,61,61,61,11,4,3,12,61,102,105,61,61,11,4,3 +3,4,3,4,3,4,2,13,61,1,3,4,3,4,3,4,3,12,61,61,11,12,11,12,11,12,11,12,11,12,61,11,12,61,72,75,61,11,12,60,11,12,11,12,11,12,11,12,1,3,4,2,61,61,61,61,61,61,1,3,4,2,61,61,61,61,61,1,3,4 +4,3,12,11,12,11,4,2,61,11,12,11,4,3,4,3,4,2,61,1,2,61,61,62,64,64,65,61,60,13,13,13,14,62,82,85,65,14,13,13,13,70,61,62,64,64,65,70,11,4,3,4,2,1,2,61,61,1,3,4,3,4,2,61,73,74,1,3,4,3 +3,4,61,61,70,1,3,12,61,61,61,60,11,4,3,4,3,12,1,3,12,62,64,82,63,63,85,64,65,1,2,62,64,82,63,63,85,64,65,1,2,62,64,82,63,63,85,64,65,11,4,3,4,3,12,61,1,3,4,3,4,2,12,61,61,61,11,4,3,4 +4,3,61,121,1,3,12,61,84,61,61,61,60,11,4,3,12,61,11,4,2,72,95,104,104,104,104,92,75,11,12,72,95,104,104,104,104,92,75,11,12,72,95,104,104,104,104,92,75,1,3,4,3,4,2,61,11,12,11,12,11,12,61,84,61,61,61,11,4,3 +3,4,61,4,3,4,2,62,75,61,61,61,61,1,3,4,2,61,1,3,12,72,75,71,61,61,71,72,75,1,2,72,75,71,61,61,71,72,75,1,2,72,75,71,61,61,71,72,75,3,4,3,12,11,12,61,61,61,62,65,61,61,61,94,61,61,61,1,3,4 +4,3,61,3,12,11,12,72,85,64,64,65,61,11,12,11,12,61,11,4,2,72,75,71,62,65,71,72,75,11,12,72,75,61,62,65,71,72,75,11,12,72,75,71,62,65,61,72,75,1,3,4,2,61,61,61,61,61,102,105,61,1,2,61,61,61,1,3,4,3 +3,4,61,4,2,60,60,102,104,104,104,104,74,61,61,71,80,71,1,3,12,72,85,64,82,85,64,82,85,64,64,82,85,64,82,85,64,82,85,64,64,82,85,64,82,85,64,82,75,11,4,3,4,2,61,61,61,61,61,61,61,11,12,61,61,61,11,4,3,4 +4,3,61,61,61,60,1,2,1,2,1,2,61,61,61,71,71,1,3,4,2,102,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,105,1,3,4,3,12,61,61,61,61,61,1,2,61,61,61,61,61,1,3,4,3 +3,4,3,4,121,1,3,4,3,4,3,4,2,61,1,2,14,11,4,3,4,2,1,2,1,2,1,2,1,2,1,2,1,2,61,84,1,2,1,2,1,2,1,2,1,2,1,2,1,3,4,3,12,61,61,61,61,61,1,3,4,2,61,61,61,1,3,4,3,4 +4,3,4,3,4,3,4,3,4,3,4,3,12,61,11,12,1,2,11,4,3,4,3,4,3,4,3,4,3,4,3,4,3,12,61,94,11,4,3,4,3,4,3,4,3,4,3,4,3,4,3,12,14,61,61,61,61,61,11,4,3,12,61,61,61,11,4,3,4,3 +3,4,3,4,3,4,3,4,3,4,3,4,2,61,61,61,11,12,71,11,12,11,12,11,12,11,12,11,12,11,12,11,4,2,1,2,14,11,4,3,4,3,12,11,12,11,12,11,12,11,12,61,61,62,65,61,61,61,61,11,12,61,61,61,61,60,11,4,3,4 +4,3,4,3,4,3,12,11,4,3,4,3,12,80,71,61,61,61,61,61,61,61,61,61,61,61,61,61,71,70,70,71,11,4,3,4,2,14,11,4,3,4,2,61,61,61,14,14,61,61,61,61,61,102,105,61,61,61,61,61,61,61,61,61,61,61,1,3,4,3 +11,4,3,12,11,12,61,61,11,12,11,12,60,60,70,80,71,61,61,14,1,2,70,71,14,14,71,1,2,1,2,61,61,11,12,11,12,61,1,3,4,3,12,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,13,60,61,61,11,4,3,4 +61,11,12,61,61,61,61,61,1,2,13,14,1,2,13,13,1,2,1,2,11,12,14,13,1,2,1,3,4,3,12,61,61,61,61,61,61,61,11,4,3,12,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,1,3,4,3 +61,61,61,61,61,61,61,61,11,12,1,2,11,12,1,2,11,12,11,12,61,61,61,1,3,4,3,4,3,4,2,60,61,71,61,61,61,61,14,11,12,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,11,4,3,4 +61,61,61,61,61,61,61,61,61,61,11,12,60,61,11,12,60,61,61,62,64,65,61,11,4,3,4,3,4,3,4,2,71,71,80,70,71,61,61,61,61,61,61,62,65,14,14,71,61,70,70,71,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,11,4,3 +61,61,61,61,61,61,61,61,61,61,71,71,71,71,61,61,61,62,64,82,63,85,65,61,11,4,3,4,3,4,3,12,80,71,71,61,1,2,1,2,1,2,61,102,105,14,14,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,71,71,1,3,4 +61,61,71,61,61,61,61,71,71,80,80,80,80,71,71,61,61,72,83,93,93,63,75,61,1,3,4,3,4,3,13,80,81,13,14,1,3,4,3,4,3,12,60,61,61,61,61,61,61,61,61,61,61,1,2,1,2,61,61,61,61,61,61,61,71,71,1,3,4,3 +71,61,61,71,61,61,61,61,71,71,81,81,81,81,71,71,62,82,63,63,83,63,105,61,11,4,3,4,3,4,14,14,14,14,1,3,4,3,4,4,4,2,60,60,61,61,61,61,1,2,1,2,1,3,4,3,4,2,1,2,1,2,61,61,61,61,11,4,3,4 +61,61,61,61,61,61,61,61,70,61,61,61,61,61,61,61,102,104,104,104,104,105,61,61,1,3,4,3,4,3,13,14,14,14,11,4,3,12,11,12,11,12,60,61,61,61,61,61,11,4,3,4,3,4,3,4,3,4,3,4,3,12,61,61,61,61,61,11,4,3 +61,61,61,61,70,61,61,61,61,61,61,61,70,61,61,61,61,61,70,61,61,61,61,61,11,4,3,4,3,4,2,61,70,70,71,11,12,61,60,60,60,61,61,61,61,61,61,61,61,11,12,11,12,11,4,3,4,3,12,11,12,60,61,61,61,61,61,60,11,12 +61,61,61,61,61,61,61,61,61,70,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,11,12,11,4,3,12,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60,11,12,11,12,60,71,71,61,61,61,61,61,61,60,60,14 +60,13,14,61,61,61,61,61,70,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,11,12,13,61,61,62,64,64,64,64,64,64,64,64,64,65,61,61,61,61,61,61,62,64,65,61,61,61,61,61,61,61,61,61,61,61,61,61,71,80,60,14 +2,14,61,14,61,61,61,70,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,70,61,61,61,61,14,61,62,82,63,63,63,63,63,63,63,63,63,85,64,64,65,61,62,64,104,104,105,61,61,61,61,61,61,61,61,61,61,61,61,71,80,90,14,14 +1,2,61,61,61,61,70,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,70,61,61,70,61,61,61,14,61,102,92,63,63,63,95,104,104,104,92,63,63,63,63,105,61,102,105,61,61,61,61,61,61,61,62,64,64,64,65,61,61,61,61,60,1,2,2 +3,12,61,61,61,70,61,61,61,61,61,70,70,70,70,70,70,70,70,61,61,70,61,61,61,61,61,61,61,61,14,14,61,102,104,104,104,105,61,61,61,102,104,104,104,105,61,61,61,61,61,61,61,61,61,61,61,102,104,104,104,105,61,61,61,61,1,3,4,3 +12,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,14,61,61,61,71,71,70,71,61,61,61,61,61,61,61,61,61,61,61,61,61,71,70,1,2,1,2,61,61,61,61,61,61,61,61,71,11,4,3,4 +61,1,2,13,61,60,13,14,61,13,61,70,1,2,13,61,61,13,14,61,1,2,13,61,61,13,61,1,2,13,13,61,13,13,14,70,1,2,13,61,61,13,14,61,1,2,13,61,70,13,1,2,1,3,4,3,4,2,1,2,13,13,71,71,13,70,1,3,4,3 +13,11,12,70,1,2,14,61,14,14,13,13,11,12,61,1,2,14,70,13,11,12,61,1,2,14,13,11,12,70,1,2,14,14,61,13,11,12,60,1,2,14,70,13,11,12,61,1,2,1,3,4,3,4,3,4,3,4,3,4,2,60,1,2,14,14,11,4,3,4 diff --git a/intra/source/csv/REDSEA_BG2.csv b/intra/source/csv/REDSEA_BG2.csv new file mode 100644 index 0000000..dbe236c --- /dev/null +++ b/intra/source/csv/REDSEA_BG2.csv @@ -0,0 +1,40 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/REDSEA_FG.csv b/intra/source/csv/REDSEA_FG.csv new file mode 100644 index 0000000..e197cfa --- /dev/null +++ b/intra/source/csv/REDSEA_FG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,122,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,123,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,122,123,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,123,122,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,122,123,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,123,122,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,122,123,122,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,123,122,123,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/SPACE_BG.csv b/intra/source/csv/SPACE_BG.csv new file mode 100644 index 0000000..0eb2f96 --- /dev/null +++ b/intra/source/csv/SPACE_BG.csv @@ -0,0 +1,80 @@ +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,0,0,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,81,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,31,114,115,31,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,91,25,91,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,81,12,81,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,101,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,91,25,25,25,91,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,81,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,81,101,100,100,102,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,25,21,21,21,25,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,11,12,12,12,81,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,81,12,101,100,100,102,25,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,25,27,27,27,25,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,11,12,12,12,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,30,114,115,30,25,25,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,25,91,91,91,25,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,11,11,110,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,11,13,114,115,13,21,25,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,21,113,21,21,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,11,11,110,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,23,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,27,27,113,27,27,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,81,11,11,110,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,23,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,113,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,11,11,11,110,11,11,81,81,81,81,81,81,13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,81,81,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,23,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,113,13,13,91,91,91,91,91,91,91,13,13,13,13,13 +13,13,11,11,11,110,11,11,12,11,11,11,11,12,81,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,24,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,91,91,13,13,13,13,13,13,13,13,91,13,13,13,13,13,13,13,13,13,13,113,13,91,25,25,25,25,25,25,25,13,13,13,13,13 +13,13,11,11,11,110,11,11,12,11,11,11,11,11,111,13,13,13,13,13,13,13,13,13,18,18,12,18,13,13,13,13,13,81,12,12,81,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,111,13,114,115,13,21,24,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,25,25,13,13,13,13,13,13,13,91,25,91,13,13,13,13,13,13,13,13,91,25,91,25,21,21,21,21,21,21,113,13,13,13,13,13 +13,13,12,11,11,110,11,11,12,11,11,11,11,11,111,13,13,13,13,13,13,13,13,18,80,80,80,80,18,13,13,13,81,12,12,12,12,81,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,21,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,25,25,13,13,13,13,13,13,13,25,25,25,13,13,13,13,13,13,13,13,21,21,21,21,27,27,27,27,27,27,113,13,13,13,13,13 +13,13,11,12,11,110,11,10,12,11,11,11,11,11,111,13,13,13,13,13,13,13,13,80,80,80,80,80,80,13,13,13,11,12,12,12,12,11,13,13,13,13,13,13,13,13,13,13,13,13,13,111,11,13,114,115,13,113,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,91,25,25,91,13,13,13,13,13,91,25,21,25,91,91,13,13,13,13,13,13,21,21,21,21,0,0,0,13,13,13,113,13,13,13,13,13 +13,13,11,11,10,110,10,12,12,11,11,11,11,11,110,13,13,13,13,13,13,13,13,80,80,80,10,80,80,13,13,13,11,11,111,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,111,11,13,114,115,13,21,23,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,113,21,21,13,13,13,13,13,25,21,20,21,21,25,13,13,13,13,13,13,22,21,22,22,0,0,0,13,13,91,25,91,13,13,13,13 +13,13,11,11,12,12,12,12,12,10,10,10,10,11,110,18,13,13,13,13,13,13,13,80,80,11,80,80,80,13,13,13,11,11,111,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,24,23,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,113,21,21,13,13,13,13,13,25,20,90,20,20,25,91,13,13,13,13,13,27,21,27,27,0,0,0,13,91,25,21,25,13,13,13,13 +13,13,11,11,110,11,11,11,11,80,80,80,80,10,110,80,13,13,13,13,13,13,13,80,80,80,80,80,80,13,13,13,11,11,111,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,21,23,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,113,21,21,91,91,91,91,91,25,27,90,90,27,25,25,13,13,13,13,13,13,21,0,0,0,0,0,13,25,21,21,25,13,13,13,13 +13,13,11,11,110,11,11,11,11,17,17,17,17,80,80,80,13,13,13,13,13,13,13,17,17,80,80,17,17,13,13,13,11,11,111,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,111,11,13,114,115,13,21,23,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,113,23,21,25,27,27,27,27,25,13,90,90,13,25,25,13,13,13,13,13,13,21,0,0,0,0,0,0,21,21,21,113,13,13,13,13 +13,13,11,11,110,11,11,11,11,13,13,13,13,80,80,80,13,13,13,13,13,13,13,13,13,80,80,13,13,13,13,13,11,11,111,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,114,115,13,21,24,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,113,23,21,25,0,0,0,13,25,13,90,90,13,25,25,13,13,28,28,28,28,21,28,28,28,0,0,0,21,21,21,113,13,13,13,13 +13,18,10,11,110,11,11,11,11,13,13,13,13,80,80,80,13,13,13,13,13,13,13,13,13,80,80,13,13,13,13,13,11,11,111,11,11,10,13,13,13,13,81,13,13,13,13,13,13,13,13,11,11,13,114,115,13,24,21,13,13,13,13,13,13,91,91,13,13,13,13,13,91,21,113,23,21,25,0,0,13,91,21,13,90,90,13,21,113,13,13,90,90,90,90,21,90,90,90,13,0,0,21,21,21,113,13,13,13,13 +13,80,80,10,110,11,11,11,11,13,13,18,18,80,80,80,18,18,13,13,13,13,13,13,13,80,80,13,18,18,18,18,10,11,111,11,10,80,18,18,18,13,11,18,18,18,18,18,18,13,13,11,11,31,114,115,31,21,21,13,13,13,13,91,91,21,21,28,91,28,28,13,25,21,113,23,21,25,0,28,28,20,20,28,90,90,28,20,112,28,28,90,90,90,90,20,90,90,90,28,28,0,23,23,22,113,13,13,13,13 +13,80,80,80,110,10,10,10,10,18,18,80,80,80,80,80,80,80,18,18,18,18,18,18,18,80,80,18,80,80,80,80,80,10,110,10,80,80,80,80,80,18,11,80,80,80,80,80,80,18,18,11,10,100,100,100,100,22,21,28,28,28,28,21,25,25,21,90,21,90,90,28,21,25,113,25,25,25,28,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,28,23,22,90,113,28,28,13,13 +13,17,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,10,80,100,100,100,100,90,20,90,90,90,90,20,21,21,20,90,20,90,90,90,21,21,113,21,21,21,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,27,27,27,90,90,90,90,90,90,22,90,90,112,90,90,13,13 +13,13,17,80,80,80,80,80,80,80,80,80,80,80,17,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,100,100,100,100,90,90,90,90,90,90,90,20,20,90,90,90,90,90,90,20,20,112,20,20,20,90,90,90,90,90,27,27,27,23,90,90,90,90,90,90,13,91,13,90,90,90,90,90,90,90,90,90,90,90,90,13,13 +13,13,13,17,17,17,17,17,17,17,17,17,17,17,13,17,17,17,17,17,17,17,17,80,80,80,80,80,80,80,80,80,80,80,80,80,80,17,17,80,80,80,80,80,80,80,80,80,80,17,17,17,80,100,100,100,100,90,27,27,27,27,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,28,28,28,23,90,90,90,90,90,90,13,21,13,90,90,90,27,27,27,27,27,27,27,27,27,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,17,17,11,11,17,17,17,17,17,17,17,17,17,17,0,0,17,17,17,11,17,17,17,17,17,17,0,0,0,17,11,114,115,21,27,13,13,13,13,27,90,90,90,90,90,90,27,27,90,90,90,90,90,90,90,90,27,21,90,90,90,90,90,90,90,90,27,27,23,27,13,21,13,27,27,27,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,81,0,0,0,0,0,0,81,11,114,115,21,0,91,13,13,13,13,27,27,27,27,27,27,13,13,27,27,27,27,27,27,27,27,13,21,27,27,27,27,27,23,27,27,13,13,24,13,13,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,0,0,0,0,81,11,11,114,115,21,0,21,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,13,13,13,13,13,23,13,13,13,13,21,13,13,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,0,0,18,18,11,11,11,114,115,21,28,21,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,18,18,80,80,11,11,11,114,115,21,90,21,23,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,80,80,80,80,10,11,101,100,100,102,90,21,25,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,80,80,80,80,80,10,101,100,100,102,90,20,20,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,11,0,17,17,17,17,80,17,101,100,100,102,90,90,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,11,13,13,13,13,13,17,31,101,100,100,102,27,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,11,11,120,120,120,120,120,120,120,120,120,120,120,120,120,122,120,80,120,120,80,120,120,120,120,120,121,100,100,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,41,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,11,11,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,11,42,42,11,42,42,42,42,42,42,43,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,11,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11,114,115,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,114,115,22,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,101,102,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,17,30,30,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,81,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,25,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,13,13,13,13,13,12,25,13,13,13,13,13,28,28,28,28,28,28,28,28,28,28,28,13,13,13,13,13,13,13,91,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,13,13,13,13,13,12,25,13,13,13,13,13,90,90,90,90,90,90,90,90,90,90,90,13,13,13,13,13,13,13,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,17,17,17,17,17,17,17,17,17,17,80,13,13,13,13,13,111,113,13,13,13,13,13,90,90,90,90,90,90,90,90,27,27,90,13,13,13,13,13,13,13,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,13,13,13,13,13,13,13,13,13,13,80,13,13,13,13,13,111,113,13,13,13,13,13,90,90,90,90,90,90,90,90,13,13,90,28,28,28,28,0,91,0,21,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,13,13,13,18,18,18,18,18,18,18,80,13,13,13,13,13,111,113,13,13,13,13,13,90,90,90,90,90,90,90,90,13,13,90,90,90,90,90,0,21,0,20,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,13,13,13,80,80,80,80,80,80,80,80,13,13,13,13,13,111,113,13,13,13,13,13,90,90,90,90,90,90,90,90,13,13,90,90,90,90,90,0,21,0,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,13,13,13,80,17,17,17,17,17,17,17,18,18,18,18,18,110,112,28,28,28,28,28,90,90,90,90,90,90,90,90,13,13,27,27,27,27,90,0,20,0,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,81,17,17,17,17,17,17,80,13,13,13,80,18,18,18,18,18,18,18,80,80,80,80,80,80,90,90,90,90,90,90,90,90,90,90,90,90,90,90,13,13,13,13,13,28,90,0,90,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,80,80,80,80,80,80,80,13,13,13,80,80,80,80,80,80,80,80,80,80,80,80,80,80,90,90,90,90,90,90,90,90,90,90,90,90,90,90,13,13,13,13,13,90,90,0,27,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,17,17,80,17,17,17,17,17,13,13,13,17,17,17,17,17,17,17,17,17,17,17,17,17,80,90,27,27,27,27,27,27,27,27,27,27,27,27,27,13,13,13,13,13,90,27,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,80,18,18,18,18,18,0,81,13,18,18,18,18,18,18,18,18,13,13,13,13,13,80,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,28,28,90,28,28,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,80,80,80,80,80,80,18,10,18,80,80,80,80,80,80,80,80,13,13,13,13,13,80,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,90,90,90,90,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,17,17,17,17,17,17,80,80,80,80,80,80,80,80,80,80,80,13,13,13,13,18,80,90,28,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,27,27,90,27,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,0,13,13,13,13,13,80,17,17,80,80,80,80,80,80,80,80,18,18,18,13,80,80,90,90,13,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,13,13,13,13,13,13,80,13,13,80,80,80,80,80,80,80,80,80,80,80,13,80,17,27,90,13,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,13,13,13,13,13,13,80,13,13,80,80,80,80,80,80,80,80,80,80,80,13,80,13,13,90,13,90,90,90,90,90,27,27,27,27,27,27,27,27,27,27,27,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,80,13,13,13,13,13,13,80,13,13,80,80,80,80,80,80,80,80,80,80,80,13,80,18,28,90,13,90,90,90,90,27,13,13,13,13,13,13,13,13,13,28,28,90,28,28,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,81,80,18,18,18,18,18,18,80,13,13,80,80,80,80,80,80,80,80,17,17,17,13,80,80,90,90,13,27,27,27,27,13,13,13,13,13,13,13,13,13,13,90,90,90,90,90,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,80,80,80,80,80,80,80,80,13,13,80,80,80,80,80,80,80,80,13,13,0,13,17,114,115,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,27,27,27,27,27,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,17,17,17,17,17,17,17,17,10,13,13,17,17,17,17,17,17,17,17,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,114,115,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,101,100,100,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,101,100,100,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,101,100,100,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,101,100,100,100,100,102,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,30,30,30,30,30,30,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 diff --git a/intra/source/csv/SPACE_BG2.csv b/intra/source/csv/SPACE_BG2.csv new file mode 100644 index 0000000..dd04977 --- /dev/null +++ b/intra/source/csv/SPACE_BG2.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,30,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,18,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/SPACE_FG.csv b/intra/source/csv/SPACE_FG.csv new file mode 100644 index 0000000..edfe78d --- /dev/null +++ b/intra/source/csv/SPACE_FG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,91,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,23,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,21,23,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,21,23,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,91,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,0,20,20,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,20,24,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,20,20,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/STREET_BG.csv b/intra/source/csv/STREET_BG.csv new file mode 100644 index 0000000..3cf9a06 --- /dev/null +++ b/intra/source/csv/STREET_BG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,60,14,62,63,64,65,66,67,17,61,12,12,12,12,12,8,22,22,22,22,22,9,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,28,42,43,44,45,46,47,27,11,12,12,12,8,22,23,30,30,30,30,30,11,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,24,32,33,34,35,36,37,27,21,22,22,22,23,30,30,30,30,30,30,30,21,22,22,22,9,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,11,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,11,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,1,2,2,3,30,30,30,30,30,30,30,30,30,30,30,30,11,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,12,12,18,2,2,2,2,3,30,30,30,30,30,1,2,19,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,18,2,2,2,2,2,19,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,60,14,62,63,64,65,66,67,17,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,28,42,43,44,45,46,47,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,24,32,33,34,35,36,37,27,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,20,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,22,22,22,22,22,22,22,9,12,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,8,22,22,22,22,9,12,12,12 +13,30,20,30,30,30,30,30,21,9,13,30,32,33,34,35,36,37,30,11,8,22,9,12,8,22,22,22,22,9,12,12,12,8,22,22,22,22,9,12,12,13,30,30,30,30,11,8,22,9 +13,30,20,30,30,30,30,30,30,21,23,20,32,33,34,35,36,37,20,11,13,30,21,22,23,30,30,30,30,11,12,12,12,13,30,30,30,30,11,12,12,13,30,30,30,30,11,13,30,11 +13,30,30,30,30,30,30,30,30,30,30,30,32,33,34,35,36,37,30,11,13,30,30,30,30,30,30,30,30,21,22,22,22,23,30,30,30,30,21,22,22,23,30,30,30,30,21,23,30,11 +18,3,30,30,30,30,30,30,30,30,30,30,32,33,34,35,36,37,30,21,23,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,11 +8,23,30,30,30,30,30,30,30,1,3,30,32,33,34,35,36,37,30,30,30,30,30,30,1,2,3,30,30,30,30,30,30,30,30,30,30,30,1,2,2,3,30,30,30,30,30,30,30,11 +13,30,30,30,30,30,30,30,30,11,13,30,32,33,34,35,36,37,30,30,30,30,30,30,11,12,18,2,2,2,2,2,2,3,30,30,30,30,11,12,12,13,30,30,30,30,30,30,30,11 +13,30,30,30,30,30,30,30,1,19,13,30,32,33,34,35,36,37,30,1,2,2,2,2,19,12,12,12,12,12,12,12,12,18,2,2,2,2,19,12,12,13,30,30,30,30,30,30,30,11 +13,30,30,30,30,30,30,30,11,12,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,18,2,3,30,30,30,1,2,19 +18,2,2,2,2,2,2,2,19,12,13,30,32,33,34,35,36,37,30,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,18,2,2,2,19,12,12 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,20,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,20,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,20,32,33,34,35,36,37,20,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,32,33,34,35,36,37,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,13,30,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,18,3,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,13,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,13,62,63,64,65,66,67,30,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,13,62,63,64,65,66,67,1,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,18,2,3,64,65,66,67,11,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,12,12,13,64,65,66,67,11,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,12,12,18,2,2,2,2,19,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/STREET_BG2.csv b/intra/source/csv/STREET_BG2.csv new file mode 100644 index 0000000..95cedd0 --- /dev/null +++ b/intra/source/csv/STREET_BG2.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,52,53,54,55,56,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,5,6,6,6,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,5,6,7,0,5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,5,6,7,5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,5,6,7,0,5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,5,7,4,0,5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,5,6,7,5,7,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/STREET_FG.csv b/intra/source/csv/STREET_FG.csv new file mode 100644 index 0000000..c55f672 --- /dev/null +++ b/intra/source/csv/STREET_FG.csv @@ -0,0 +1,70 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,58,58,58,58,58,58,58,58,58,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,71,71,71,71,71,71,71,71,71,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,70,70,70,70,70,70,70,70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,52,53,54,55,56,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,58,58,58,58,58,58,58,58,58,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,71,71,71,71,71,71,71,71,71,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/SUBURB_BG.csv b/intra/source/csv/SUBURB_BG.csv new file mode 100644 index 0000000..d1047a1 --- /dev/null +++ b/intra/source/csv/SUBURB_BG.csv @@ -0,0 +1,80 @@ +18,34,36,36,36,36,36,36,37,18,18,34,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,37,34,111,100,100,115,37,34,35,35,35,35,35,35,35,35,35,37,18,0,0,0,0,0,0,0,0,0,0 +18,34,1,2,1,2,1,2,35,35,35,35,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,35,35,13,100,100,14,35,35,90,11,90,90,90,90,90,90,90,35,37,0,0,0,0,0,0,0,0,0,0 +18,34,3,6,5,4,3,4,90,90,90,21,90,30,31,32,32,33,90,1,2,25,23,23,23,23,23,23,21,90,90,90,101,111,100,100,115,105,21,90,90,90,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +35,35,90,3,4,30,31,32,33,90,90,21,90,40,41,41,41,43,90,3,4,25,90,30,31,32,33,90,21,90,90,25,101,111,100,100,115,105,21,90,90,90,90,30,32,32,31,33,90,37,0,0,0,0,0,0,0,0,0,0 +90,90,90,90,90,40,41,41,43,90,90,22,23,50,52,140,52,53,23,23,23,24,90,40,41,41,43,90,22,23,23,24,101,111,100,100,115,105,22,23,23,23,23,40,41,41,41,43,90,37,0,0,0,0,0,0,0,0,0,0 +133,133,133,132,90,50,52,140,53,90,90,90,90,90,11,11,11,90,90,90,90,90,90,50,52,52,53,90,90,90,90,90,101,111,100,100,115,105,90,90,90,90,90,50,52,140,51,53,90,37,0,0,0,0,0,0,0,0,0,0 +90,90,90,131,90,90,11,130,11,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,11,11,11,90,90,90,90,90,101,111,100,100,115,105,90,90,90,90,90,90,11,130,11,90,90,37,0,0,0,0,0,0,0,0,0,0 +36,45,90,133,133,133,133,132,133,133,133,132,133,133,133,133,133,133,132,133,133,133,133,133,133,132,133,133,133,133,133,133,133,120,120,120,120,133,132,133,133,133,133,133,133,133,133,132,90,37,0,0,0,0,0,0,0,0,0,0 +18,34,90,90,90,90,90,131,90,90,90,131,90,90,90,90,90,90,131,90,90,90,90,90,90,131,90,90,90,1,2,90,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +18,34,90,90,90,90,90,131,90,90,90,131,90,90,90,90,90,90,131,90,90,90,90,90,90,131,90,90,1,5,6,2,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +18,34,90,90,90,90,90,131,90,90,90,131,90,90,90,90,90,90,131,90,90,90,90,90,90,131,90,90,3,4,3,4,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,36,90,91,93,93,93,134,93,93,93,134,93,93,93,93,93,93,134,93,93,93,93,93,93,134,93,93,93,93,93,93,92,111,100,100,115,94,134,93,93,93,93,93,93,95,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,1,2,101,102,103,103,103,103,103,103,110,103,103,103,103,103,103,110,103,103,103,103,103,103,103,103,103,103,103,103,103,103,100,100,100,100,103,110,103,103,103,103,103,104,105,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,3,4,101,111,100,100,100,100,100,100,110,100,100,100,100,100,100,110,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,110,100,100,100,100,100,115,105,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,1,2,101,111,100,100,100,100,100,100,110,100,100,100,100,100,100,110,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,110,100,100,100,100,100,115,105,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,3,4,101,111,100,100,100,113,113,113,110,113,113,113,113,113,113,110,113,113,113,113,100,100,100,100,113,113,113,113,113,113,113,113,113,113,113,110,113,113,113,113,113,114,105,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,90,101,111,100,100,115,124,123,123,131,123,123,123,123,123,123,131,123,123,123,122,111,100,100,115,124,123,123,123,123,123,123,123,123,123,123,131,123,123,123,123,123,123,125,90,131,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,90,101,111,100,100,115,105,90,90,131,90,90,90,90,90,90,131,90,90,90,101,111,100,100,115,105,90,90,90,90,90,90,90,90,90,90,131,90,90,90,90,90,90,131,133,133,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,132,133,120,120,120,120,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,120,120,120,120,133,132,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,1,2,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,1,2,1,2,90,90,90,90,90,1,2,1,2,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,90,90,90,90,90,90,1,2,1,5,6,2,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,3,6,5,4,90,90,90,90,90,3,6,5,4,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,90,90,90,90,90,90,3,6,5,6,5,4,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,1,5,4,20,23,23,23,23,23,26,3,6,2,101,111,100,100,115,105,131,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,3,4,3,4,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,90,101,111,100,100,115,105,3,4,90,21,90,90,90,90,90,25,1,5,4,101,111,100,100,115,105,131,90,90,90,20,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,37,0,0,0,0,0,0,0,0,0,0 +34,23,23,24,12,13,14,15,22,23,23,30,32,31,33,90,90,90,25,3,6,2,101,111,100,100,115,105,131,90,90,90,21,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,90,101,111,100,100,115,105,1,2,40,41,41,43,90,90,90,25,1,5,4,101,111,100,100,115,105,131,90,90,90,21,90,11,11,11,11,11,11,11,11,11,11,11,90,90,90,46,47,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,3,4,50,140,52,53,24,90,22,24,3,4,90,101,111,100,100,115,105,131,90,90,90,21,90,11,90,90,90,90,90,90,90,90,90,11,90,90,90,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,90,90,11,130,11,90,90,90,90,90,90,90,90,101,111,100,100,115,105,131,90,90,90,21,90,11,90,90,90,90,90,90,90,90,90,11,90,90,90,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,131,133,120,120,120,120,133,133,133,133,132,133,133,133,133,133,133,133,133,133,133,120,120,120,120,133,132,90,90,90,21,90,11,90,11,11,11,11,11,11,11,11,11,90,90,90,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,90,90,90,131,90,90,90,90,90,90,90,90,90,101,111,100,100,115,105,131,90,90,90,21,90,11,90,90,90,90,90,90,90,90,90,90,90,1,2,35,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,1,2,90,131,90,90,90,90,90,90,90,90,90,101,111,100,100,115,105,131,90,90,90,21,90,11,1,2,1,2,1,2,1,2,1,2,1,5,4,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,105,3,4,90,131,90,90,90,90,90,90,90,90,90,101,111,100,100,115,105,131,90,90,90,21,90,1,5,6,5,6,5,6,5,6,5,6,5,6,2,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,115,94,93,93,93,134,93,93,93,93,93,93,93,93,93,92,111,100,100,115,105,131,90,90,90,21,90,3,4,3,4,3,4,3,4,3,4,3,4,3,4,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,100,103,103,103,103,110,103,103,103,103,103,103,103,103,103,103,100,100,100,115,105,131,90,90,90,21,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,100,100,100,100,100,110,100,100,100,100,100,100,100,100,100,100,100,100,100,115,105,131,90,90,90,21,30,32,32,32,32,31,32,33,90,30,31,32,32,33,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,111,100,100,100,100,100,100,100,110,100,100,100,100,100,100,100,100,100,100,100,100,100,115,105,131,90,90,90,22,40,41,41,41,41,41,41,43,23,40,41,41,41,43,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,101,112,113,113,113,113,113,113,113,110,113,113,113,113,113,113,113,113,113,113,100,100,100,115,105,131,90,90,90,90,50,52,140,52,51,52,51,53,90,50,52,140,52,53,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,131,121,123,123,123,123,123,123,123,123,131,123,123,123,123,123,123,123,123,123,122,111,100,100,115,105,131,90,90,90,90,90,11,130,11,90,90,90,90,90,90,11,130,11,90,90,46,47,0,0,0,0,0,0,0,0,0,0 +34,90,131,90,90,90,90,90,90,90,90,90,131,90,90,90,90,90,90,90,90,90,101,111,100,100,115,105,131,90,90,90,90,90,90,131,133,133,133,133,133,133,133,133,133,90,90,90,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,132,133,120,120,120,120,133,132,133,133,133,133,131,133,133,90,90,90,1,2,1,2,90,90,90,90,90,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,90,90,90,90,90,90,90,90,90,90,90,90,22,23,23,24,90,90,90,131,101,111,100,100,115,105,131,90,90,90,90,131,90,90,90,90,1,5,6,5,6,2,1,2,1,2,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,91,93,93,93,93,93,93,93,93,93,93,95,30,31,32,33,90,90,90,131,101,111,100,100,115,94,134,93,93,93,93,134,93,95,90,90,3,6,5,6,5,6,5,6,5,4,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,101,102,103,136,103,136,103,136,103,136,104,105,40,41,41,43,90,90,90,131,101,111,100,100,100,103,110,103,103,103,103,103,104,105,90,90,1,5,6,5,4,3,4,3,6,2,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,101,111,100,135,100,135,100,135,100,135,115,105,50,52,140,53,90,90,90,131,101,111,100,100,100,100,110,100,100,100,100,100,115,105,90,1,5,6,5,4,90,90,90,90,3,4,37,18,0,0,0,0,0,0,0,0,0,0 +34,90,101,111,100,100,100,100,100,100,100,100,115,94,93,93,134,93,93,93,93,134,92,111,100,100,100,100,110,100,100,100,100,100,115,105,1,5,6,5,6,2,90,90,90,90,90,90,35,37,0,0,0,0,0,0,0,0,0,0 +34,90,101,111,100,100,100,100,100,100,100,100,100,103,103,103,103,103,103,103,103,110,103,100,100,100,100,113,110,113,113,113,113,113,114,105,3,6,5,6,5,4,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,101,111,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,110,100,100,100,100,115,124,123,123,123,123,123,123,123,125,1,5,6,5,6,2,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,101,111,100,135,100,135,100,135,100,135,100,113,113,113,113,113,113,113,113,110,113,100,100,100,115,105,90,1,2,1,2,90,90,1,5,4,3,4,3,4,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,101,112,113,137,113,137,113,137,113,137,114,124,123,123,123,123,123,123,123,131,122,111,100,100,115,105,1,5,6,5,6,2,90,3,4,90,90,90,90,90,90,90,90,90,90,90,90,37,0,0,0,0,0,0,0,0,0,0 +34,90,121,123,123,123,123,123,123,123,123,123,123,125,90,90,90,90,90,90,90,131,101,111,100,100,115,105,3,4,3,4,3,4,90,90,90,90,46,36,36,45,90,90,90,90,90,90,46,47,0,0,0,0,0,0,0,0,0,0 +44,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,12,13,14,15,36,36,36,36,36,36,36,36,36,36,36,47,18,18,44,36,36,36,36,36,36,47,18,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2,11,11,111,100,100,115,11,11,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +7,60,60,60,68,69,60,60,60,9,7,60,60,60,60,60,60,60,60,9,4,90,101,111,100,100,115,105,90,3,7,60,68,69,60,63,66,65,60,60,60,60,60,60,60,9,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,70,160,160,160,160,160,160,70,19,17,160,160,160,160,160,160,160,160,19,2,11,101,111,100,100,115,105,10,1,17,160,160,160,160,73,76,75,160,160,160,160,160,160,160,19,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,70,70,70,70,70,160,19,4,90,101,111,100,100,115,105,90,3,17,80,81,82,160,160,160,160,160,39,28,38,160,160,160,19,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,70,70,70,70,160,160,160,160,19,2,90,101,111,100,100,115,105,90,1,17,160,160,160,160,160,160,160,160,19,8,17,160,160,160,19,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,160,70,70,160,160,160,19,4,90,101,111,100,100,115,105,90,3,17,160,160,160,160,160,160,160,160,19,8,27,28,28,28,29,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,70,70,160,160,160,160,160,160,19,2,90,101,111,100,100,115,105,90,1,17,160,160,160,160,160,160,160,160,19,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,160,160,160,70,160,160,19,4,90,121,123,123,123,123,125,11,3,17,160,160,160,160,160,160,160,160,19,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +27,28,28,28,28,38,160,39,28,29,27,28,28,38,160,39,28,28,28,29,2,90,90,90,90,90,90,90,90,1,27,28,28,38,160,39,28,28,28,29,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,8,17,160,19,8,8,8,8,8,17,160,19,8,8,8,8,4,22,23,24,90,90,22,23,24,3,8,8,8,17,160,19,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2,22,23,24,90,90,22,23,24,1,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,64,66,65,67,60,78,79,60,9,7,64,66,65,67,60,68,69,60,9,4,90,91,93,93,93,93,95,90,3,7,60,60,78,79,60,60,9,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,74,76,75,77,160,160,160,160,19,17,74,76,75,77,160,160,160,160,19,2,90,101,111,100,100,115,105,90,1,17,160,160,160,160,160,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,80,81,82,19,17,160,160,160,160,160,80,81,82,19,4,90,101,111,100,100,115,105,90,3,17,160,80,81,81,82,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,160,160,160,160,160,160,19,2,90,101,111,100,100,115,105,90,1,17,160,160,160,160,160,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,160,160,160,160,160,160,19,4,90,101,111,100,100,115,105,90,3,17,160,160,160,160,160,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,160,160,19,17,160,160,160,160,160,160,160,160,19,2,90,101,111,100,100,115,105,90,1,17,160,160,160,160,160,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,70,160,160,160,160,160,160,160,19,17,160,160,160,160,160,160,160,160,19,4,90,101,111,100,100,115,105,90,3,17,160,160,160,160,160,160,19,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,28,28,28,28,38,160,39,28,29,27,28,28,28,28,38,160,39,28,29,2,90,121,123,123,123,123,125,90,1,27,28,28,28,38,160,39,29,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,8,17,160,19,8,8,8,8,8,8,8,17,160,19,8,8,4,22,23,24,90,90,22,23,24,3,8,8,8,8,17,160,19,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2,22,23,24,90,90,22,23,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +7,60,60,60,60,60,78,79,60,9,7,60,60,60,60,60,60,60,60,9,4,90,90,90,90,90,90,90,90,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,70,160,160,160,160,160,160,19,17,160,160,160,160,160,160,160,160,19,2,90,90,90,90,90,90,90,90,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,70,160,160,70,80,81,82,19,17,160,70,70,70,70,70,70,160,19,4,90,90,90,90,90,90,90,90,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,70,160,160,160,160,160,160,19,17,160,160,160,160,160,160,70,160,19,2,90,90,90,90,90,90,90,90,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,70,160,70,70,70,70,160,19,17,70,70,70,160,160,160,70,160,19,4,90,90,90,90,90,90,90,90,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,70,160,160,160,160,70,160,61,62,160,160,70,70,70,70,160,160,19,2,90,90,90,11,90,90,90,90,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +17,160,160,160,160,160,160,70,160,160,160,160,160,160,160,160,160,160,160,19,4,90,90,11,90,11,90,90,90,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +27,28,28,38,160,39,28,28,28,28,28,28,28,28,28,28,28,28,28,29,2,90,90,90,90,90,90,90,90,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +8,8,8,17,160,19,8,8,8,8,8,8,8,8,8,8,8,8,8,8,4,11,1,2,1,2,11,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/SUBURB_BG2.csv b/intra/source/csv/SUBURB_BG2.csv new file mode 100644 index 0000000..dd829ee --- /dev/null +++ b/intra/source/csv/SUBURB_BG2.csv @@ -0,0 +1,10 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/SUBURB_FG.csv b/intra/source/csv/SUBURB_FG.csv new file mode 100644 index 0000000..dd829ee --- /dev/null +++ b/intra/source/csv/SUBURB_FG.csv @@ -0,0 +1,10 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/TERMINAL_BG.csv b/intra/source/csv/TERMINAL_BG.csv new file mode 100644 index 0000000..b3fc81d --- /dev/null +++ b/intra/source/csv/TERMINAL_BG.csv @@ -0,0 +1,50 @@ +6,5,6,5,6,5,6,5,6,5,6,5,6,2,150,150,7,120,120,120,120,120,120,7,124,124,7,120,120,120,120,120,120,7,150,150,3,6,5,6,5,6,5,6,5,6,5,6,5,6 +5,6,5,6,5,6,5,6,5,6,5,4,3,4,150,150,8,120,7,120,120,7,120,8,120,120,8,120,7,120,120,7,120,8,150,150,120,3,6,5,6,5,6,5,6,5,6,5,6,5 +6,5,6,5,6,5,6,5,6,5,6,2,120,120,150,150,9,36,8,120,120,8,36,9,120,120,9,36,8,120,120,8,36,9,150,150,120,120,3,6,5,6,5,4,3,4,3,6,5,6 +5,6,5,6,5,6,5,6,5,6,5,4,120,120,150,150,120,120,9,36,36,9,120,120,120,120,120,120,9,36,36,9,120,120,150,150,120,120,1,5,6,5,4,120,120,120,120,3,6,5 +6,5,6,5,6,5,6,5,6,5,6,2,120,120,150,150,120,120,120,120,120,120,120,36,120,120,36,120,120,120,120,120,120,120,150,150,120,1,5,6,5,6,2,120,120,120,120,1,5,6 +5,6,5,6,5,6,5,6,5,6,5,6,2,120,150,150,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,150,150,120,3,6,5,6,5,4,120,120,120,120,3,6,5 +6,5,6,5,6,5,6,5,6,5,6,5,4,120,150,150,120,120,120,120,120,120,120,36,120,120,36,120,120,120,120,120,120,120,150,150,120,1,5,6,5,6,2,120,120,120,120,1,5,6 +5,6,5,6,5,6,5,6,5,6,5,6,2,120,150,150,120,120,120,1,2,120,120,120,120,120,120,120,120,1,2,120,120,120,150,150,120,3,6,5,6,5,6,2,120,120,120,3,6,5 +6,5,6,5,6,5,6,5,6,5,6,5,4,120,150,150,120,120,1,5,6,2,120,120,120,120,120,120,1,5,6,2,120,120,150,150,120,120,3,6,5,6,5,4,120,120,120,120,3,6 +5,6,5,6,5,6,5,6,5,6,5,6,2,120,150,150,120,120,3,6,5,4,120,120,120,120,120,120,3,6,5,4,120,120,150,150,120,120,1,5,6,5,6,2,120,120,120,120,1,5 +6,5,6,5,6,5,6,5,6,5,6,5,4,120,150,150,120,120,1,5,6,2,120,120,120,120,120,120,1,5,6,2,120,120,150,150,120,120,3,6,5,6,5,6,2,120,120,120,3,6 +5,6,5,6,5,6,5,4,3,4,3,4,120,120,150,150,120,120,3,6,5,4,120,120,120,120,120,120,3,6,5,4,120,120,150,150,120,120,1,5,6,5,6,5,4,120,120,120,120,3 +4,3,4,3,4,3,4,120,120,120,120,120,120,120,150,150,120,120,120,3,4,120,120,120,120,120,120,120,120,3,4,120,120,120,150,150,120,120,3,6,5,4,3,4,120,120,120,45,42,43 +42,43,43,40,120,120,120,120,120,120,120,120,120,45,152,153,40,120,120,120,120,120,33,120,120,120,120,34,120,120,120,120,120,45,152,153,40,120,120,3,4,120,120,45,42,43,43,44,52,51 +52,51,53,41,43,43,42,40,120,120,120,45,43,44,152,153,41,43,43,42,43,42,42,146,147,147,148,42,42,43,43,43,43,44,152,153,41,43,43,42,43,43,43,44,52,51,54,52,52,51 +52,51,53,52,51,54,52,41,42,43,42,44,54,52,152,153,51,51,53,54,54,63,52,146,147,147,148,52,51,53,54,63,54,52,152,153,51,54,63,52,51,51,53,54,52,63,54,52,52,63 +51,51,53,52,51,63,54,52,52,63,52,51,54,52,152,153,51,51,53,54,63,62,52,146,147,147,148,52,63,53,54,52,63,52,152,153,51,54,63,52,52,51,53,54,52,62,63,52,52,63 +63,51,53,52,52,62,63,52,52,63,52,63,62,52,152,153,63,51,54,52,52,52,64,146,147,147,148,52,62,51,54,52,51,54,152,153,51,54,52,52,52,62,53,63,52,52,62,64,52,62 +62,62,53,62,52,52,62,64,52,62,64,62,62,52,152,153,62,63,63,52,51,54,63,146,147,147,148,52,64,51,63,62,51,63,152,153,62,63,52,52,52,62,53,62,52,64,61,63,52,62 +52,62,53,62,52,64,61,63,52,62,53,52,62,52,152,153,62,63,63,52,51,54,52,146,147,147,148,52,63,63,63,62,63,62,152,153,62,63,52,62,52,62,63,62,52,63,61,62,52,62 +52,62,63,62,152,153,61,62,52,62,52,51,53,54,152,153,52,63,63,52,63,63,52,146,147,147,148,61,62,63,63,52,63,64,152,153,62,63,52,62,51,54,63,62,52,63,61,62,52,62 +51,54,63,62,152,153,61,62,52,62,52,63,53,63,152,153,52,64,63,52,52,62,52,146,147,147,148,61,52,62,62,51,54,63,152,153,52,52,52,62,63,63,62,52,62,62,61,51,53,54 +63,63,62,52,152,153,61,51,53,54,52,62,53,62,152,153,52,63,62,52,64,62,52,146,147,147,148,61,62,62,62,51,54,62,152,153,52,51,53,54,62,62,62,52,62,61,61,63,53,63 +62,62,62,52,152,153,61,63,53,63,52,52,63,52,152,153,64,52,64,52,63,52,52,146,147,147,148,61,62,64,62,51,54,62,152,153,61,63,53,63,62,62,61,61,61,61,61,62,53,62 +64,62,61,61,152,153,61,63,53,62,52,52,62,61,152,153,63,52,63,52,63,61,61,146,147,147,148,61,62,63,62,63,62,61,152,153,61,62,53,62,61,62,61,136,137,137,138,62,63,62 +63,61,61,61,152,153,61,62,63,61,61,61,61,61,152,153,62,61,63,52,62,64,61,146,147,147,148,61,61,63,64,63,62,61,152,153,64,62,63,62,61,62,61,146,147,147,148,62,62,62 +62,61,51,54,152,153,61,62,63,61,61,61,61,64,152,153,62,61,62,61,62,63,61,146,147,147,148,61,61,62,63,62,62,64,152,153,63,62,62,62,61,64,61,146,61,147,148,61,62,64 +62,61,51,54,152,153,61,61,62,61,61,64,61,63,152,153,61,61,62,61,62,62,61,146,147,147,148,61,64,62,63,62,61,63,152,153,62,61,62,61,61,63,61,146,147,147,148,61,61,63 +61,61,64,63,152,153,61,61,62,61,61,63,61,62,152,153,61,64,61,61,61,62,61,146,147,147,148,61,63,62,62,61,64,62,152,153,62,61,62,61,61,62,61,146,147,147,148,64,61,63 +61,61,63,62,152,153,61,61,61,61,61,62,61,62,152,153,61,63,61,61,61,62,61,35,147,147,35,61,63,62,62,61,63,61,152,153,61,61,61,61,61,61,61,146,147,147,148,63,61,62 +61,61,63,61,152,153,61,61,61,61,61,62,61,62,152,153,61,63,61,61,61,62,61,35,147,147,35,61,63,62,61,61,63,61,152,153,61,61,61,61,64,61,61,146,147,147,148,62,61,62 +64,61,62,61,152,153,61,61,64,62,61,62,61,61,152,153,61,62,64,61,64,61,61,146,147,147,148,61,63,64,61,61,62,61,152,153,61,64,61,61,63,61,61,146,62,61,148,62,61,61 +62,61,61,61,152,153,61,61,62,62,61,62,61,61,152,153,61,62,62,61,63,64,61,146,147,147,148,61,62,63,61,61,61,61,152,153,61,62,61,61,62,61,61,61,147,147,148,62,61,64 +62,61,61,136,137,137,138,61,62,61,61,61,61,61,152,153,61,61,62,61,62,62,61,146,147,147,148,61,62,62,61,61,61,61,152,153,61,61,61,61,61,61,61,146,147,147,61,61,61,62 +21,21,21,35,147,147,35,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,146,147,147,148,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,146,147,21,148,21,21,21 +22,22,22,35,147,147,35,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,35,147,147,35,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,35,147,147,35,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,146,147,147,148,22,22,22 +120,22,22,146,147,147,148,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,35,147,147,35,22,22,22,22,22,22,22,22,22,22,22,22,22,22,120,120,120,120,120,120,120,22,22 +2,120,120,120,120,120,120,120,120,120,120,22,22,22,22,22,22,22,22,22,22,120,120,120,120,120,120,120,120,120,120,120,120,22,22,22,22,120,120,120,120,120,120,120,120,120,120,120,1,2 +6,2,1,2,120,120,120,120,120,120,120,120,120,22,22,22,22,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,151,151,120,120,120,120,120,120,120,120,1,2,120,120,3,6 +5,6,5,4,120,120,120,120,120,120,120,120,120,120,151,151,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,150,150,120,120,120,120,120,120,120,120,3,4,120,120,1,5 +6,5,6,2,120,120,120,120,120,120,120,120,120,120,150,150,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,150,150,120,120,120,120,120,120,120,120,120,120,120,1,5,6 +5,6,5,6,2,120,120,120,120,120,120,120,120,120,150,150,120,120,1,2,1,2,120,120,120,120,120,120,1,2,1,2,120,120,150,150,120,120,120,120,120,120,1,2,1,2,1,5,6,5 +6,5,6,5,6,2,1,2,1,2,1,2,1,2,150,150,120,1,5,6,5,6,2,36,120,120,36,1,5,6,5,6,2,120,150,150,120,1,2,1,2,1,5,6,5,6,5,6,5,6 +5,6,5,6,5,6,5,6,5,6,5,6,5,4,150,150,1,5,6,5,6,5,4,36,123,123,36,3,6,5,6,5,6,2,150,150,1,5,6,5,6,5,6,5,6,5,6,5,6,5 diff --git a/intra/source/csv/TERMINAL_BG2.csv b/intra/source/csv/TERMINAL_BG2.csv new file mode 100644 index 0000000..0454f5a --- /dev/null +++ b/intra/source/csv/TERMINAL_BG2.csv @@ -0,0 +1,50 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,126,0,0,128,129,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,127,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,127,127,0,139,0,0 +0,0,125,126,0,0,128,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,127,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,127,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,127,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0 +131,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,131,145,0,0,0,0,149,0,0 +0,132,145,0,0,0,0,149,131,131,131,0,0,0,0,0,0,0,0,0,0,131,145,0,0,0,0,149,131,131,131,131,131,0,0,0,0,131,131,131,130,0,0,0,0,0,0,0,132,131 +0,0,0,0,0,0,0,0,0,0,0,132,131,0,0,0,0,131,131,131,130,0,0,0,0,0,0,0,0,0,0,0,0,132,0,0,130,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,132,0,0,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/TERMINAL_FG.csv b/intra/source/csv/TERMINAL_FG.csv new file mode 100644 index 0000000..a5bdd2c --- /dev/null +++ b/intra/source/csv/TERMINAL_FG.csv @@ -0,0 +1,30 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/TRAIN_BG.csv b/intra/source/csv/TRAIN_BG.csv new file mode 100644 index 0000000..a8d2216 --- /dev/null +++ b/intra/source/csv/TRAIN_BG.csv @@ -0,0 +1,90 @@ +1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,1,1,60,60,1,1,2,1 +1,60,60,60,60,60,60,60,60,60,60,60,60,10,60,1,60,60,60,60,60,80,60,60,60,60,60,60,60,1,1,2,2,60,60,60,80,60,60,60,60,60,60,60,60,60,60,60,60,1,14,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,80,2,2,60,60,2,2,80,1 +1,60,10,10,10,10,10,10,1,2,1,60,1,1,60,1,1,1,1,1,1,1,1,60,1,1,1,1,60,1,1,60,10,60,10,10,10,1,1,1,1,60,1,2,2,2,1,60,1,2,14,1,60,2,2,2,2,2,2,1,1,1,1,1,10,1,1,1,60,1,1,60,60,10,60,60,10,60,60,1 +1,60,10,60,60,80,60,81,1,14,1,71,1,1,60,2,2,2,2,2,2,2,2,60,2,2,2,2,60,2,2,60,10,60,60,60,60,1,2,2,2,60,1,14,14,14,1,60,1,14,14,1,60,60,60,60,60,60,60,1,1,2,2,2,60,2,2,2,60,1,1,60,60,80,60,60,60,60,60,1 +1,60,10,80,71,71,60,61,1,14,1,60,1,1,60,60,60,60,71,60,60,60,60,60,60,60,60,60,71,60,60,60,1,1,1,1,1,1,60,60,60,60,2,3,2,3,2,60,2,1,14,2,2,1,60,1,1,1,60,1,1,60,60,60,60,60,60,60,60,1,1,60,80,60,60,60,60,80,60,1 +1,60,10,60,14,14,81,60,1,14,1,80,1,1,71,1,2,2,2,2,1,60,10,10,10,10,10,10,60,1,1,60,2,2,2,2,2,2,60,10,10,10,10,10,60,60,60,60,60,1,14,14,14,1,60,1,1,1,60,1,1,60,1,2,3,1,2,1,3,1,1,60,60,60,60,60,60,10,60,1 +1,60,10,60,60,60,60,80,1,14,1,60,1,1,60,1,14,14,14,14,1,60,10,60,60,60,60,60,60,1,1,60,60,60,60,60,60,10,60,60,60,60,60,10,60,10,60,10,60,1,1,2,1,1,1,1,2,2,60,1,1,60,1,80,60,1,60,1,60,1,1,60,10,60,60,60,10,60,80,1 +1,60,60,60,61,60,60,60,1,14,1,71,1,1,60,2,2,2,2,2,2,60,10,10,10,10,10,10,10,2,2,10,10,10,10,10,10,10,10,1,2,1,60,10,60,10,60,10,60,2,2,60,3,2,2,2,60,10,60,1,1,60,2,2,2,2,60,2,2,2,2,60,10,60,60,60,10,60,60,1 +1,10,1,2,2,2,2,2,2,14,1,60,1,1,60,10,60,60,60,60,60,60,60,60,60,60,71,60,60,60,60,60,60,60,60,60,60,60,60,1,14,1,60,10,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,10,60,1 +1,60,1,14,14,14,14,14,14,14,1,60,1,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,1,14,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,2,2,2,2,2,1,1,1,1,1,60,1,2,1,60,1 +1,60,2,3,1,14,14,14,14,14,1,60,1,1,60,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,1,1,2,60,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,1,1,60,1,2,2,2,2,2,1,1,2,2,1,60,1,14,1,60,1 +1,60,60,60,2,2,2,2,2,1,1,60,1,1,60,10,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,71,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,1,1,60,1,60,60,60,60,60,1,1,60,60,1,60,1,14,1,60,1 +1,60,10,60,10,10,80,10,80,1,1,71,1,1,60,10,60,10,60,1,1,60,10,10,10,10,10,10,10,1,2,2,1,60,1,2,2,1,60,1,1,10,10,10,10,60,10,10,10,10,10,10,10,60,1,1,60,60,60,60,1,1,80,1,60,60,60,60,60,1,1,60,60,1,60,1,14,1,60,1 +1,60,10,60,10,10,60,10,80,1,1,60,2,2,60,10,60,10,60,1,1,60,10,60,60,60,60,60,60,1,14,14,1,60,1,14,14,1,60,1,1,60,60,60,10,60,10,60,60,60,60,60,60,60,1,2,2,2,1,2,2,2,60,2,2,2,2,2,2,2,2,2,1,1,60,1,14,1,81,1 +1,60,10,60,10,60,60,10,60,1,1,60,60,71,60,10,60,10,60,1,1,60,10,60,1,1,1,1,60,2,2,2,2,71,2,2,2,2,60,1,1,80,1,1,1,3,1,60,1,1,1,60,1,1,1,14,14,14,1,60,60,60,60,60,60,60,60,60,60,60,60,60,2,2,60,1,14,1,60,1 +1,60,10,60,10,60,1,1,60,1,1,60,10,10,10,10,10,10,60,1,1,60,10,10,2,2,1,1,60,60,60,60,60,60,60,60,60,60,60,1,1,60,1,14,14,14,1,60,2,2,2,10,2,2,2,2,2,2,2,1,1,1,1,10,10,10,10,10,10,10,10,10,10,60,60,1,14,1,60,1 +1,60,10,60,10,60,1,1,60,1,1,60,60,60,10,60,10,60,60,1,1,60,60,60,60,60,2,2,10,10,10,10,10,10,10,10,10,10,10,2,2,60,1,14,14,14,1,60,60,60,60,60,60,60,60,60,60,60,60,1,1,2,2,60,60,60,60,60,60,60,60,60,60,60,1,2,14,1,60,1 +1,60,10,10,10,60,1,1,60,1,1,60,60,10,10,60,10,60,60,1,1,60,10,10,10,60,60,60,60,60,60,60,60,60,60,60,71,60,60,60,60,60,2,2,2,2,2,10,10,10,10,10,10,60,1,1,2,2,2,2,2,60,60,60,1,2,2,2,2,2,2,2,2,2,2,14,14,1,81,1 +1,60,60,60,10,60,1,1,60,1,1,60,60,71,60,60,61,60,60,1,1,60,60,60,60,60,60,1,2,2,2,2,2,2,2,1,60,1,2,2,1,60,60,60,60,60,60,60,60,60,60,60,10,60,1,1,60,60,60,60,60,60,1,2,2,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1 +2,2,1,60,10,60,1,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,14,14,14,14,14,14,1,60,1,14,14,1,2,2,2,2,1,60,1,2,2,2,2,1,60,1,1,60,1,2,2,2,2,2,14,14,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1 +14,14,1,60,10,60,1,1,60,1,14,1,2,2,4,2,2,4,2,2,2,2,2,2,2,2,2,2,2,1,14,14,14,14,14,1,60,1,14,14,1,2,2,2,2,2,60,2,2,2,2,2,2,60,1,2,60,1,14,14,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,60,1 +1,3,2,60,10,60,2,2,60,1,14,1,60,60,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,14,14,14,14,14,1,60,1,14,14,1,60,60,60,60,60,60,60,60,60,60,60,60,60,1,60,60,1,14,14,1,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,1 +1,60,60,60,60,60,60,60,60,1,14,1,1,1,1,1,1,60,1,2,1,60,1,2,2,2,2,1,60,1,1,3,2,2,2,2,80,1,14,14,1,60,2,3,2,1,1,2,2,2,2,2,2,2,2,60,1,1,2,2,2,60,71,71,71,71,71,71,60,1,1,60,71,71,71,71,71,71,60,1 +1,60,1,2,1,60,1,1,60,1,1,2,2,2,2,2,2,60,1,14,1,60,1,60,60,60,60,1,60,1,1,80,60,60,60,60,60,2,2,1,1,60,60,60,60,1,2,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,1,14,1,60,3,1,60,1,1,60,60,60,60,60,60,60,1,14,1,60,1,60,60,60,60,1,60,1,1,1,1,1,1,1,60,60,60,1,1,10,10,60,10,1,60,60,1,2,1,2,2,2,2,2,2,2,60,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,1,14,1,60,60,10,60,1,1,60,1,3,2,2,1,60,1,14,1,60,1,60,60,60,60,1,60,1,1,2,2,2,2,2,60,10,10,1,1,60,60,60,60,1,60,1,2,14,1,60,60,60,60,60,60,60,60,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,1,2,3,1,60,10,60,1,1,60,1,60,60,60,1,60,1,14,1,60,1,60,60,60,60,1,60,1,1,80,60,60,60,60,60,60,60,1,1,60,60,60,60,1,60,1,14,14,1,60,71,71,71,71,71,71,60,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,1,60,81,1,60,10,60,1,1,60,1,60,60,60,1,60,1,14,1,60,1,60,60,60,60,1,60,1,1,10,10,10,10,10,60,10,10,1,1,60,60,60,60,1,60,1,14,14,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,2,2,60,14,14,14,14,14,14,60,1 +1,60,1,81,61,1,60,10,60,1,1,60,1,60,80,60,1,60,1,14,1,60,1,60,60,60,60,1,60,1,1,80,60,60,60,60,60,60,60,1,1,60,60,60,60,1,60,1,14,14,1,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1 +1,60,1,60,60,1,1,1,60,1,1,60,1,60,80,60,1,60,1,14,1,60,1,71,71,71,71,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,14,14,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2 +1,60,2,2,2,2,2,2,60,1,1,60,1,80,80,80,1,60,1,14,1,60,2,2,2,2,2,2,60,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,1,14,14,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,60,2,2,2,1,1,2,2,2,2,2,2,2,2,1 +1,60,60,60,60,60,60,60,60,1,1,60,2,2,2,2,2,60,2,2,2,60,60,60,60,60,60,60,60,1,1,80,80,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,14,14,1,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,2,2,60,60,60,60,60,60,60,60,1 +1,60,1,1,1,1,1,1,1,1,1,60,60,60,10,60,60,60,60,60,60,60,1,2,2,2,2,2,2,2,1,80,60,60,60,60,60,60,60,1,1,2,3,2,2,2,2,3,2,1,1,60,71,71,71,71,71,71,60,1,1,60,71,71,71,71,71,71,60,60,60,60,71,71,71,71,71,71,60,1 +1,60,2,3,2,2,2,2,3,2,2,10,10,60,10,60,1,2,2,2,2,2,2,14,14,14,14,14,14,14,1,60,60,60,60,60,60,60,60,1,1,71,71,71,71,71,71,71,71,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,14,14,14,14,14,14,14,14,14,14,14,14,14,1,60,60,60,60,60,60,60,60,1,1,14,14,14,14,14,14,14,14,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,14,14,14,14,14,14,14,14,14,14,14,14,1,60,60,60,60,60,60,60,60,1,1,14,14,14,14,14,14,14,14,1,1,60,14,14,14,14,14,14,60,2,2,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,1,14,14,14,14,14,14,14,1,60,60,60,60,60,60,60,80,1,1,14,14,14,14,14,14,14,14,1,1,60,60,60,60,60,60,60,60,60,60,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,60,71,71,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,2,3,2,2,2,2,3,60,81,60,60,60,60,60,80,2,2,2,2,2,2,2,2,2,2,2,2,10,10,10,10,1,2,1,71,1,1,60,14,14,14,14,14,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,2,1,1,1,2,2,3,1,1,1,3,1,2,2,2,2,1,2,1,1,60,1,1,60,60,60,60,60,60,60,81,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,14,1,14,1,1,60,60,60,60,60,60,60,60,1,1,60,14,14,60,14,14,60,60,1 +1,60,1,1,1,60,10,60,1,1,1,60,1,14,14,14,14,1,60,1,1,60,1,1,60,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,14,1,60,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,2,2,2,2 +1,60,2,2,3,60,10,60,2,2,2,60,2,3,2,2,2,2,60,1,1,60,1,1,60,1,14,14,14,14,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,3,1,2,2,2,2,2,1,60,1,2,2,60,1,1,2,2,3,1,1,2,2,2,2,2,2,2,2,60,2,2,2,2,1 +1,60,10,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,1,1,60,1,14,14,14,14,1,60,60,60,1,60,60,60,60,1,14,14,14,1,80,80,80,1,60,60,60,60,60,1,60,1,60,60,60,1,1,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,1 +1,60,10,60,1,3,2,2,3,1,1,2,3,2,1,3,2,1,60,1,1,60,1,1,60,1,14,14,14,14,1,60,60,60,1,60,1,1,60,2,2,2,2,1,60,60,60,1,60,1,2,1,60,1,60,1,60,71,60,1,1,60,60,60,1,1,60,71,60,1,1,60,71,71,71,71,71,71,60,1 +1,60,10,60,1,60,60,60,60,1,1,71,71,71,1,60,60,1,2,2,2,60,1,1,80,1,14,14,14,14,1,60,60,60,1,60,1,1,60,60,60,60,60,1,71,71,71,1,60,1,14,1,60,1,60,1,60,14,60,1,1,60,60,60,1,1,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,60,60,1,60,60,60,60,1,1,14,14,14,1,60,60,1,60,60,60,60,1,1,60,1,14,14,14,14,1,1,1,1,2,60,1,2,2,2,2,1,60,2,2,2,2,2,60,1,14,1,60,1,60,1,60,14,60,1,1,60,60,60,2,2,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,60,60,60,60,1,1,14,14,14,1,60,60,1,60,10,10,10,2,2,60,2,2,2,2,2,2,3,2,2,60,60,1,14,14,14,14,1,60,60,60,60,60,60,60,1,14,1,60,1,60,1,60,14,60,1,1,71,71,60,60,60,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,10,10,60,1,80,60,60,80,1,1,14,14,14,1,60,60,1,60,60,60,60,60,60,60,60,60,71,71,60,60,60,60,60,60,1,2,2,2,1,1,2,2,2,2,2,2,2,2,1,14,1,60,1,60,1,60,14,60,1,1,1,10,10,10,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,60,60,60,60,1,1,14,14,14,1,60,60,2,2,1,1,10,10,10,80,1,2,2,2,2,2,2,2,2,2,1,60,60,60,1,1,60,60,60,60,60,60,60,60,1,14,1,60,1,60,1,60,60,60,1,14,1,60,60,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,60,60,60,60,1,1,14,14,14,1,80,60,60,60,1,1,60,60,60,60,1,14,14,14,14,14,14,14,14,14,1,60,60,60,1,1,80,80,80,60,60,60,60,60,1,14,1,60,1,60,1,60,1,1,1,14,1,60,10,60,10,60,60,60,1,1,60,60,60,60,60,60,60,60,1 +1,60,10,60,1,1,1,1,1,1,1,14,14,14,1,80,80,60,60,1,1,60,1,2,2,2,14,14,14,14,14,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,1,60,1,60,1,60,1,14,14,14,1,60,10,60,10,2,2,60,1,1,2,1,60,1,2,2,2,2,1 +1,60,10,60,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,60,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,1,60,1,60,1,14,14,14,1,60,10,60,10,2,2,60,1,1,2,2,60,2,2,2,2,2,1 +1,60,10,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,60,1,60,2,2,1,14,1,60,10,60,10,60,60,60,1,1,60,60,60,60,60,60,60,60,1 +1,60,60,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,2,2,1,60,1,2,3,2,1,2,2,2,2,2,2,2,2,2,2,1,60,10,10,10,10,10,10,10,1,1,2,2,2,60,1,60,10,60,1,14,1,60,10,60,10,60,71,60,1,1,60,71,71,71,71,71,71,60,1 +1,60,10,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,1,60,1,60,60,60,1,82,82,82,82,82,82,82,82,82,82,1,60,60,60,60,60,60,60,60,1,1,60,60,60,60,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,1,60,60,1,60,1,60,60,60,1,1,2,2,2,2,2,2,2,1,82,1,1,2,2,2,2,2,1,60,1,1,60,10,10,1,1,60,60,60,1,14,1,60,10,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,71,71,71,71,71,71,71,71,71,71,71,71,1,60,1,1,60,60,1,60,1,60,60,60,1,1,60,60,60,60,60,60,60,1,82,1,1,60,60,60,80,60,1,60,1,1,60,10,60,1,1,3,1,1,1,14,1,60,10,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1,1,60,60,1,60,1,60,60,60,1,1,60,1,2,2,2,1,60,1,82,1,1,71,71,71,71,71,1,60,1,1,60,10,60,1,1,60,2,3,1,14,1,60,10,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,10,60,1,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1,1,60,60,1,60,1,60,80,80,1,1,60,1,60,60,60,1,60,1,82,1,2,2,2,2,2,2,2,60,1,1,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,60,14,14,14,14,14,14,60,1 +1,60,60,60,1,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1,1,60,60,1,60,1,71,71,71,1,1,60,1,60,71,60,1,60,1,82,1,60,60,60,60,60,60,60,60,1,1,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,60,60,60,60,60,60,60,60,1 +1,2,2,2,2,14,14,14,14,14,14,14,14,14,14,14,14,1,60,1,1,2,2,1,60,1,2,2,2,2,1,60,1,80,60,60,1,60,1,82,1,60,1,2,2,2,2,2,2,2,1,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,2,2,2,2,2,2,1,60,1 +1,2,1,1,2,1,14,1,2,1,14,14,1,2,1,14,14,1,60,1,1,2,2,1,60,1,2,2,2,2,1,60,2,2,2,2,2,60,1,82,1,60,2,2,2,2,2,2,2,1,1,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,2,2,2,2,2,2,2,60,1 +1,60,1,1,60,1,14,1,60,1,14,14,1,60,1,14,14,1,60,1,1,60,60,1,60,1,60,60,60,60,1,60,10,60,60,60,60,60,1,82,1,60,10,60,80,10,60,60,60,1,1,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,14,60,1,1,60,60,60,60,60,60,10,60,1 +1,60,3,2,60,2,2,2,60,2,2,3,2,60,2,1,14,1,60,1,1,60,60,1,60,1,60,60,60,60,1,60,10,60,1,3,2,2,3,1,1,60,10,60,60,10,71,71,71,1,1,60,10,60,1,1,71,10,71,1,14,1,60,10,60,10,60,60,60,1,1,60,71,71,71,71,60,10,60,1 +1,60,60,81,60,60,60,60,60,60,60,71,71,60,60,1,14,1,60,1,2,1,60,1,2,2,2,2,2,2,2,60,10,60,1,60,60,60,60,1,1,60,10,60,60,10,2,2,2,2,2,60,10,71,1,1,60,10,60,1,14,1,60,10,60,10,10,10,60,1,1,60,14,14,14,14,60,10,60,1 +1,60,1,2,2,2,2,2,2,2,2,2,2,1,80,1,14,1,60,1,14,1,10,1,60,60,60,60,60,60,60,60,10,60,1,60,60,60,60,1,1,60,10,60,60,10,60,10,60,60,60,60,10,60,1,1,60,10,60,1,14,1,60,10,60,10,60,10,60,1,1,60,14,14,14,14,60,60,60,1 +1,81,1,14,14,14,14,14,14,14,14,14,14,1,60,2,2,3,60,1,14,1,60,1,60,1,2,1,2,2,2,2,10,60,1,80,80,60,60,1,1,60,10,60,60,10,60,10,60,1,1,10,10,60,2,2,60,10,60,2,2,2,10,10,60,10,60,10,60,2,2,60,14,14,14,14,60,10,60,1 +1,60,1,14,14,14,14,14,14,14,14,14,14,1,60,60,80,60,60,1,14,1,60,1,60,1,82,1,60,60,60,60,10,60,1,71,71,71,71,1,1,60,10,71,71,10,60,10,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,10,60,10,60,60,60,60,60,60,60,60,60,10,60,1 +1,60,2,2,2,2,2,2,2,2,2,2,2,2,2,1,60,10,10,3,2,2,60,1,60,1,82,1,60,1,1,60,10,60,1,2,3,2,2,3,2,60,10,10,10,10,60,10,60,1,1,60,1,2,3,1,60,10,10,10,10,10,10,10,10,10,60,10,2,2,2,2,2,2,2,2,2,2,60,1 +1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,60,60,60,60,60,60,60,1,60,1,82,1,60,1,1,60,10,60,1,60,60,60,60,60,60,60,60,60,60,60,60,10,60,1,1,60,1,80,80,1,60,60,60,60,60,60,71,71,60,60,60,10,60,60,60,60,60,60,60,60,60,60,60,1 +1,60,1,2,2,2,2,2,2,2,2,2,2,1,60,1,2,2,2,2,2,2,2,1,60,1,82,1,60,1,1,60,10,60,1,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,1,60,1,80,62,2,2,2,2,2,2,2,2,2,2,2,2,1,60,1,2,2,2,2,2,2,2,2,2,1 +1,60,1,14,14,14,1,2,1,14,14,14,14,1,60,2,2,2,2,2,2,2,2,2,60,1,82,1,60,1,1,60,10,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,1,1,60,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,60,1,1,2,3,2,2,2,2,3,2,1 +1,60,1,14,14,14,1,60,1,14,14,14,14,1,60,60,60,60,60,60,60,60,60,60,60,1,82,1,60,1,1,60,10,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,60,10,60,1,1,60,60,60,60,60,60,60,60,1 +1,60,1,14,14,14,1,60,1,14,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,1,60,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,10,10,10,10,10,10,10,10,10,10,10,10,60,2,2,60,10,60,1,1,60,10,10,10,10,10,10,60,1 +1,60,2,2,2,2,2,60,1,14,1,60,60,60,60,60,60,80,60,1,1,82,82,82,82,82,1,1,60,60,60,60,60,60,60,60,60,60,60,1,82,82,82,82,82,82,82,82,82,82,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,10,60,1,1,80,10,60,60,80,60,10,60,1 +1,60,60,60,60,60,10,60,1,14,1,60,60,60,60,60,60,60,80,1,1,82,82,82,82,82,1,2,3,1,1,1,1,1,1,1,1,1,60,1,1,2,2,3,2,2,2,2,2,2,2,10,10,10,10,10,10,10,10,10,10,10,10,60,60,10,60,10,60,1,1,60,1,1,1,1,60,10,60,1 +1,60,10,10,10,60,10,60,1,14,1,60,60,60,60,60,60,60,60,1,1,82,82,82,82,82,1,60,60,1,1,2,2,2,2,2,1,1,60,1,1,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,10,60,60,10,60,10,60,1,1,60,2,2,2,2,80,10,60,1 +1,60,10,60,60,60,10,60,1,14,1,71,71,71,60,60,71,71,71,1,1,82,82,82,82,82,1,1,60,1,1,60,60,60,60,60,1,1,60,1,1,60,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,1,1,60,10,60,60,10,60,10,60,1,1,80,60,60,80,60,60,10,60,1 +1,60,10,10,10,10,10,60,3,3,2,2,2,3,2,2,2,2,2,3,2,2,2,2,3,2,2,2,60,2,3,60,10,10,10,60,2,2,60,2,2,60,10,60,60,60,60,60,60,60,60,60,60,60,2,2,2,2,2,2,2,60,10,60,60,10,60,10,60,2,2,10,10,10,10,10,10,10,60,1 +1,60,60,60,60,60,60,60,81,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,1,1,1,1,1,1,1,1,1,1,1,60,60,60,71,71,60,60,60,60,60,60,60,10,60,10,60,60,60,60,60,60,60,60,60,60,60,1 +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +14,14,14,1,2,2,2,2,1,1,1,1,1,14,14,14,14,1,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,82,82,82,82,1,2,1,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,1,60,60,60,60,2,2,2,2,1,2,2,2,2,2,60,60,60,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,1,1,60,60,60,60,60,60,60,60,1,82,82,82,82,1,60,1,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,1,60,60,60,60,60,60,60,60,1,60,60,60,60,60,60,1,1,60,10,10,10,10,10,10,10,2,2,60,1,1,1,1,1,1,3,1,1,60,80,80,80,80,80,80,80,1,82,82,82,82,1,60,1,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,1,60,60,60,60,1,1,1,60,1,10,10,10,60,10,10,1,1,60,30,60,60,60,30,60,60,60,60,60,2,2,2,2,2,2,60,2,2,60,80,80,80,80,80,80,80,2,2,2,2,2,2,60,2,1,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,2,2,2,2,2,2,2,1,60,1,60,60,60,60,60,60,1,1,60,30,60,30,60,30,60,1,2,1,60,60,60,60,60,60,60,60,60,60,60,80,80,80,60,80,80,80,60,60,60,60,60,60,60,60,1,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,14,14,14,14,14,14,14,1,60,1,10,10,60,10,10,10,1,1,60,30,60,30,60,30,60,1,0,1,60,60,60,60,60,60,1,60,1,1,60,80,80,80,80,80,80,80,60,60,60,60,60,60,60,60,1,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,14,14,14,14,14,14,14,1,60,1,60,60,60,60,60,60,1,1,60,60,60,30,60,60,60,1,0,1,60,60,60,60,60,60,1,2,2,1,60,80,80,80,80,80,80,80,1,2,2,2,2,2,2,2,2,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,14,14,14,14,14,14,14,1,60,2,60,10,10,10,10,10,1,1,60,30,60,30,60,30,60,1,0,1,60,60,60,60,60,60,1,82,82,1,60,60,80,80,80,80,80,80,1,82,82,82,82,82,82,82,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,14,14,14,14,14,14,14,1,60,60,60,60,60,60,60,60,1,1,60,30,60,30,60,30,60,1,82,1,60,60,60,60,60,60,1,82,82,1,60,60,80,80,80,80,80,80,1,82,82,82,82,82,82,82,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +14,14,14,14,14,14,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,82,82,82,82,82,82,82,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/TRAIN_BG2.csv b/intra/source/csv/TRAIN_BG2.csv new file mode 100644 index 0000000..de87506 --- /dev/null +++ b/intra/source/csv/TRAIN_BG2.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/TRAIN_FG.csv b/intra/source/csv/TRAIN_FG.csv new file mode 100644 index 0000000..de87506 --- /dev/null +++ b/intra/source/csv/TRAIN_FG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/WINDMILL_BG.csv b/intra/source/csv/WINDMILL_BG.csv new file mode 100644 index 0000000..96575bf --- /dev/null +++ b/intra/source/csv/WINDMILL_BG.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,65,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,64,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,67,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,67,69,69,0,60,60,60,63 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,69,69,63,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,64,68,68,66,61,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,64,60,60,60,60,66,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,0,61,61,61,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,67,60,60,60,60,60,0,68,68,66,61 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,67,69,60,60,60,0,60,60,60,66 +0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,67,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,64,68,68,68,66,61,61,61,61,61,61,61,65,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,68,60,60,60,60,60,68,66,61,61,61,64,68,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,60,60,60,60,60,62,61,61,61,65,60,60,60,0,60,60,60,63 +0,0,0,0,0,0,0,0,0,0,60,60,60,60,60,60,60,60,66,61,64,60,60,60,60,0,60,60,62,61 +0,0,0,0,0,0,0,0,0,0,60,60,60,100,60,60,69,60,60,68,60,60,60,60,60,0,60,60,60,66 +0,0,0,0,0,0,0,0,0,0,69,60,60,0,60,62,61,65,60,60,69,60,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,67,69,0,60,60,68,60,60,63,61,67,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,61,61,0,60,60,60,69,63,61,61,61,65,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,68,66,61,0,60,60,62,61,61,61,61,61,67,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,60,0,60,60,60,66,61,61,61,61,61,67,69,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,67,60,60,0,60,60,60,60,68,66,61,61,61,61,61,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,61,65,60,0,60,60,60,60,60,60,68,68,66,61,61,0,60,60,60,69 +0,0,0,0,0,0,0,0,0,0,68,60,60,0,60,60,60,60,69,69,60,60,60,68,68,0,60,60,62,61 +0,0,0,0,0,0,0,0,0,0,60,60,60,0,60,60,60,62,61,61,67,69,69,60,60,0,60,60,63,61 +0,0,0,0,0,0,0,0,0,0,60,69,63,0,60,60,60,60,66,61,61,61,61,65,60,0,60,62,61,64 +0,0,0,0,0,0,0,0,0,0,62,61,61,0,67,69,60,60,60,66,61,61,64,60,60,0,60,60,68,60 +0,0,0,0,0,0,0,0,0,0,60,66,61,0,61,61,65,60,60,60,68,68,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,68,0,68,68,60,60,60,60,60,60,62,65,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,60,0,60,60,60,60,60,60,60,60,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,60,0,60,60,60,60,60,60,60,60,60,60,60,0,60,60,60,60 +0,0,0,0,0,0,0,0,0,0,60,60,60,0,60,60,60,60,60,60,60,60,53,54,56,0,56,57,58,60 +0,0,0,0,0,0,0,0,0,0,56,57,58,0,53,54,55,56,54,55,56,54,59,59,59,0,59,59,59,56 +0,0,0,0,0,0,0,0,0,0,59,59,59,0,59,59,59,59,59,59,59,59,59,59,59,0,59,59,59,59 +0,0,0,0,0,0,0,0,0,0,43,47,48,0,44,45,46,47,48,59,43,47,44,46,47,0,48,59,43,44 +0,0,0,0,0,0,0,0,0,0,49,41,41,0,41,41,41,41,52,42,49,41,41,41,41,0,52,42,49,41 +0,0,0,0,0,0,0,0,0,0,41,41,41,0,41,41,41,41,41,41,41,41,41,41,41,0,41,41,41,41 +0,0,0,0,0,0,0,0,0,0,40,40,40,0,40,40,40,40,40,40,40,40,40,40,40,0,40,40,40,40 +0,0,0,0,0,0,0,0,0,0,50,50,50,0,50,50,50,50,50,50,50,50,50,50,50,0,50,50,50,50 +0,0,0,0,0,0,0,0,0,0,100,100,100,0,100,100,100,100,100,100,100,100,100,100,100,0,100,100,100,100 +0,0,0,0,0,0,0,0,0,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2 +0,0,0,0,0,0,0,0,0,0,11,101,7,0,8,130,130,130,102,10,11,100,100,102,7,0,8,102,10,15 +0,0,0,0,0,0,0,0,0,0,13,100,6,0,9,130,130,130,10,15,13,10,11,100,6,0,9,100,12,14 +0,0,0,0,0,0,0,0,0,0,11,100,100,100,100,130,130,130,12,14,11,12,13,130,130,130,130,100,10,15 +0,0,0,0,0,0,0,0,0,0,13,101,100,100,100,100,100,100,101,12,13,130,130,130,130,130,130,100,12,14 +0,0,0,0,0,0,0,0,0,0,2,2,2,3,100,100,1,2,2,2,3,130,130,130,130,130,130,100,10,15 +0,0,0,0,0,0,0,0,0,0,11,130,130,100,100,100,100,100,101,10,11,130,130,130,130,130,130,100,12,14 +0,0,0,0,0,0,0,0,0,0,13,130,130,130,100,100,100,100,10,15,13,130,130,130,130,130,130,100,10,15 +0,0,0,0,0,0,0,0,0,0,11,130,130,130,130,130,100,100,12,14,11,130,130,130,130,130,130,102,12,14 +0,0,0,0,0,0,0,0,0,0,13,100,130,130,130,130,100,130,130,12,13,10,11,100,100,100,10,11,10,15 +0,0,0,0,0,0,0,0,0,0,11,100,130,130,130,130,100,130,130,10,11,12,13,100,100,100,12,13,12,14 +0,0,0,0,0,0,0,0,0,0,13,101,100,100,100,100,100,130,130,12,13,100,100,100,100,100,100,102,10,15 +0,0,0,0,0,0,0,0,0,0,2,2,2,3,100,100,1,2,2,2,3,100,100,10,11,100,130,130,12,14 +0,0,0,0,0,0,0,0,0,0,3,102,101,100,100,100,100,100,100,1,3,101,102,12,13,100,130,130,10,15 +0,0,0,0,0,0,0,0,0,0,11,130,130,100,100,100,100,100,100,10,11,100,100,100,100,100,130,130,12,14 +0,0,0,0,0,0,0,0,0,0,13,130,130,130,100,100,100,100,102,12,13,100,100,100,100,100,130,130,10,15 +0,0,0,0,0,0,0,0,0,0,11,130,130,130,100,100,100,101,102,10,11,1,3,101,100,100,1,3,12,14 +0,0,0,0,0,0,0,0,0,0,14,11,130,130,100,130,130,130,10,15,13,102,5,100,100,100,101,102,10,15 +0,0,0,0,0,0,0,0,0,0,15,13,130,130,100,130,130,130,12,14,11,101,5,1,2,3,100,100,12,14 +0,0,0,0,0,0,0,0,0,0,14,11,100,100,100,130,130,130,10,15,13,1,3,130,130,130,100,100,10,15 +0,0,0,0,0,0,0,0,0,0,15,13,101,100,100,100,130,130,12,14,11,100,100,130,130,130,100,100,12,14 +0,0,0,0,0,0,0,0,0,0,14,11,100,100,100,100,100,101,10,15,13,100,100,100,130,130,100,100,10,15 +0,0,0,0,0,0,0,0,0,0,15,14,11,100,100,100,100,10,15,14,11,100,100,1,2,2,2,3,12,14 +0,0,0,0,0,0,0,0,0,0,14,15,13,100,100,100,10,15,14,15,13,100,100,100,100,100,100,100,10,15 +0,0,0,0,0,0,0,0,0,0,12,13,100,100,100,100,12,13,12,13,100,101,102,100,100,100,100,100,12,14 +0,0,0,0,0,0,0,0,0,0,2,2,2,3,100,100,1,2,2,2,2,2,2,2,2,2,3,100,10,15 +0,0,0,0,0,0,0,0,0,0,102,101,100,5,100,100,4,100,102,130,130,100,100,100,100,100,100,100,12,14 +0,0,0,0,0,0,0,0,0,0,10,11,101,5,100,100,4,102,101,130,130,100,100,100,100,100,100,100,10,15 +0,0,0,0,0,0,0,0,0,0,15,14,11,5,100,100,4,101,100,10,11,10,11,10,11,10,11,10,15,14 +0,0,0,0,0,0,0,0,0,0,14,15,13,5,103,103,4,10,11,12,14,15,14,15,14,15,14,15,14,15 diff --git a/intra/source/csv/WINDMILL_BG2.csv b/intra/source/csv/WINDMILL_BG2.csv new file mode 100644 index 0000000..9347a13 --- /dev/null +++ b/intra/source/csv/WINDMILL_BG2.csv @@ -0,0 +1,80 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,110,35,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,23,110,33,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,20,110,36,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,21,110,35,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0,0,0,0,0,0,0,25,110,31,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,22,110,34,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,23,110,33,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,24,110,32,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,25,110,31,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0,0,0,0,0,0,0,26,110,30,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,110,0,100,100,101,0,0,0,0,0,0,0,110,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,111,0,122,124,123,0,0,0,0,0,0,0,111,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,120,127,121,12,0,0,12,13,100,100,100,100,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,100,100,100,101,0,0,100,122,124,124,123,100,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,100,1,2,2,0,3,122,0,0,0,0,123,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,100,100,100,100,100,100,100,0,0,11,126,0,0,0,0,125,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,122,123,100,100,100,100,100,0,0,13,120,0,0,0,0,125,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,120,125,100,100,100,100,100,0,0,11,100,120,127,127,127,121,101,0,0 +0,0,0,0,0,0,0,0,0,0,0,100,126,124,124,123,100,100,100,0,13,10,11,100,100,100,10,11,0,0 +0,0,0,0,0,0,0,0,0,0,0,100,120,127,127,121,100,122,123,0,0,0,0,100,100,100,12,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,101,100,100,100,100,100,120,121,0,0,0,0,100,100,100,100,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,2,2,3,100,100,1,2,2,2,0,0,0,0,0,100,100,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,102,101,100,100,100,100,100,100,0,0,0,0,0,0,100,122,123,10,0 +0,0,0,0,0,0,0,0,0,0,0,101,100,100,100,100,100,100,100,0,0,0,0,0,0,100,126,125,12,0 +0,0,0,0,0,0,0,0,0,0,0,122,123,100,100,0,0,0,0,0,0,0,0,0,0,100,120,121,10,0 +0,0,0,0,0,0,0,0,0,0,0,120,0,123,100,0,0,0,0,0,0,0,0,0,0,100,1,3,12,0 +0,0,0,0,0,0,0,0,0,0,0,11,126,125,100,100,100,100,0,0,0,0,0,0,0,100,0,0,10,0 +0,0,0,0,0,0,0,0,0,0,0,13,120,121,100,122,124,123,0,0,0,0,0,0,0,0,0,100,0,0 +0,0,0,0,0,0,0,0,0,0,0,11,100,100,100,120,0,125,0,0,0,0,3,122,124,123,100,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,101,100,100,100,120,121,0,0,0,0,100,120,0,125,100,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,100,100,100,100,100,101,0,0,0,0,100,100,120,121,100,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,100,10,0,0,0,0,100,1,2,2,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,10,15,0,0,0,0,100,100,100,100,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,100,100,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,122,123,100,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,120,121,100,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,10,11,10,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,14,15,0,0,0,0,0,0,0,0 diff --git a/intra/source/csv/WINDMILL_FG.csv b/intra/source/csv/WINDMILL_FG.csv new file mode 100644 index 0000000..a5bdd2c --- /dev/null +++ b/intra/source/csv/WINDMILL_FG.csv @@ -0,0 +1,30 @@ +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0 diff --git a/intra/source/data/CLASS_ID.hx b/intra/source/data/CLASS_ID.hx new file mode 100644 index 0000000..51becb4 --- /dev/null +++ b/intra/source/data/CLASS_ID.hx @@ -0,0 +1,81 @@ +package data +{ +/** + * BECAUSE STRING COMPARISONS ARE SLOW AS FUCK + * IN THE COLLISION LOGIC + * + *(I still do comparisons on names in SpriteFactory, though - not + * really an issue there) + * + *(IDs for any object that is compared with its xml name...) + * @author Seagaia + */ +class CLASS_ID +{ + + /* ENEMIES */ + public static var SLIME:Int=0; + public static var MOVER:Int=1; + public static var PEW_LASER:Int=2; + public static var SHIELDY:Int=3; + public static var SUN_GUY:Int=4; + public static var WALL_LASER:Int=5; + public static var ANNOYER:Int=6; + public static var RED_WALKER:Int=7; + public static var FOUR_SHOOTER:Int=8; + public static var SLASHER:Int=9; + public static var ON_OFF_LASER:Int=10; + public static var RED_BOSS:Int=11; + public static var ROTATOR:Int=12; + public static var PERSON:Int=13; + public static var FROG:Int=14; + public static var DOG:Int=15; + public static var SPIKE_ROLLER:Int=16; + public static var WALLBOSS:Int=17; + public static var RAT:Int=18; + public static var SILVERFISH:Int=19; + public static var GASGUY:Int=20; + public static var TELEGUY:Int=21; + public static var DASHTRAP:Int=22; + public static var DUSTMAID:Int=23; + public static var BURSTPLANT:Int=24; + + + /* DECORATIONS */ + public static var EYE_LIGHT:Int=100; + public static var SOLID_SPRITE:Int=101; + + /* GADGETS */ + public static var BUTTON:Int=200; + public static var CRACKEDTILE:Int=201; + public static var DOOR:Int=202; + public static var DUST:Int=203; + public static var GATE:Int=204; + public static var HOLE:Int=205; + public static var KEY:Int=206; + public static var KEYBLOCK:Int=207; + public static var SINGLEPUSHBLOCK:Int=208; + public static var TREASURE:Int=209; + public static var CONSOLE:Int=210; + public static var GROWTH_GATE:Int=211; + public static var CHALLENGE_GATE:Int=212; + public static var BIG_DOOR:Int=213; + public static var JUMP_TRIGGER:Int=214; + public static var PROPELLED:Int=215; + public static var STOP_MARKER:Int=216; + public static var PILLAR_SWITCH:Int=217; + + /* OTHER */ + public static var PLAYER:Int=300; + public static var HEALTHPICKUP:Int=301; + public static var BROOM:Int=302; + public static var EVENT_SCRIPT:Int=303; + public static var CONTROLSDEITY:Int=304; + public static var FOLLOWER_BRO:Int=305; + public static var RED_PILLAR:Int=306; + public static var FISHERMAN:Int=307; + public static var NPC_:Int=308; + public static var TRADE_NPC:Int=309; + public static var MITRA:Int=310; + +} \ No newline at end of file diff --git a/intra/source/data/CSV_Data.hx b/intra/source/data/CSV_Data.hx new file mode 100644 index 0000000..1c26570 --- /dev/null +++ b/intra/source/data/CSV_Data.hx @@ -0,0 +1,319 @@ +package data +{ +import org.flixel.plugin.photonstorm.FlxGridOverlay; + +class CSV_Data +{ + + //[Embed(source="../csv/DEBUG_BG.csv", mimeType="application/octet-stream")] public static var DEBUG_BG:Class; + //[Embed(source="../csv/DEBUG_BG2.csv", mimeType="application/octet-stream")] public static var DEBUG_BG2:Class; + //[Embed(source="../csv/DEBUG_FG.csv", mimeType="application/octet-stream")] public static var DEBUG_FG:Class; + + //[Embed(source="../csv/Bedroom_BG.csv", mimeType="application/octet-stream")] public static var BEDROOM_BG:Class; + ////[Embed(source="../csv/Bedroom_BG2.csv", mimeType="application/octet-stream")] public static var BEDROOM_BG2:Class; + ////[Embed(source="../csv/Bedroom_FG.csv", mimeType="application/octet-stream")] public static var BEDROOM_FG:Class; + + + //[Embed(source="../csv/FOREST_BG.csv", mimeType="application/octet-stream")] public static var FOREST_BG:Class; + //[Embed(source="../csv/FOREST_BG2.csv", mimeType="application/octet-stream")] public static var FOREST_BG2:Class; + //[Embed(source="../csv/FOREST_FG.csv", mimeType="application/octet-stream")] public static var FOREST_FG:Class; + + //[Embed(source="../csv/FIELDS_BG.csv", mimeType="application/octet-stream")] public static var FIELDS_BG:Class; + ////[Embed(source="../csv/FIELDS_BG2.csv", mimeType="application/octet-stream")] public static var FIELDS_BG2:Class; + //[Embed(source="../csv/FIELDS_FG.csv", mimeType="application/octet-stream")] public static var FIELDS_FG:Class; + + //[Embed(source="../csv/STREET_BG.csv", mimeType="application/octet-stream")] public static var STREET_BG:Class; + //[Embed(source="../csv/STREET_BG2.csv", mimeType="application/octet-stream")] public static var STREET_BG2:Class; + //[Embed(source="../csv/STREET_FG.csv", mimeType="application/octet-stream")] public static var STREET_FG:Class; + + //[Embed(source="../csv/OVERWORLD_BG.csv", mimeType="application/octet-stream")] public static var OVERWORLD_BG:Class; + //[Embed(source="../csv/OVERWORLD_BG2.csv", mimeType="application/octet-stream")] public static var OVERWORLD_BG2:Class; + ////[Embed(source="../csv/OVERWORLD_FG.csv", mimeType="application/octet-stream")] public static var OVERWORLD_FG:Class; + + //[Embed(source="../csv/BEACH_BG.csv", mimeType="application/octet-stream")] public static var BEACH_BG:Class; + ////[Embed(source="../csv/BEACH_BG2.csv", mimeType="application/octet-stream")] public static var BEACH_BG2:Class; + ////[Embed(source="../csv/BEACH_FG.csv", mimeType="application/octet-stream")] public static var BEACH_FG:Class; + + //[Embed(source="../csv/BLANK_BG.csv", mimeType="application/octet-stream")] public static var BLANK_BG:Class; + ////[Embed(source="../csv/BLANK_BG2.csv", mimeType="application/octet-stream")] public static var BLANK_BG2:Class; + ////[Embed(source="../csv/BLANK_FG.csv", mimeType="application/octet-stream")] public static var BLANK_FG:Class; + + //[Embed(source="../csv/REDSEA_BG.csv", mimeType="application/octet-stream")] public static var REDSEA_BG:Class; + ////[Embed(source="../csv/REDSEA_BG2.csv", mimeType="application/octet-stream")] public static var REDSEA_BG2:Class; + //[Embed(source="../csv/REDSEA_FG.csv", mimeType="application/octet-stream")] public static var REDSEA_FG:Class; + + //[Embed(source="../csv/REDCAVE_BG.csv", mimeType="application/octet-stream")] public static var REDCAVE_BG:Class; + //[Embed(source="../csv/REDCAVE_BG2.csv", mimeType="application/octet-stream")] public static var REDCAVE_BG2:Class; + ////[Embed(source="../csv/REDCAVE_FG.csv", mimeType="application/octet-stream")] public static var REDCAVE_FG:Class; + + //[Embed(source="../csv/NEXUS_BG.csv", mimeType="application/octet-stream")] public static var NEXUS_BG:Class; + ////[Embed(source="../csv/NEXUS_BG2.csv", mimeType="application/octet-stream")] public static var NEXUS_BG2:Class; + //[Embed(source="../csv/NEXUS_FG.csv", mimeType="application/octet-stream")] public static var NEXUS_FG:Class; + + //[Embed(source="../csv/CROWD_BG.csv", mimeType="application/octet-stream")] public static var CROWD_BG:Class; + //[Embed(source="../csv/CROWD_BG2.csv", mimeType="application/octet-stream")] public static var CROWD_BG2:Class; + ////[Embed(source="../csv/CROWD_FG.csv", mimeType="application/octet-stream")] public static var CROWD_FG:Class; + + //[Embed(source="../csv/APARTMENT_BG.csv", mimeType="application/octet-stream")] public static var APARTMENT_BG:Class; + //[Embed(source="../csv/APARTMENT_BG2.csv", mimeType="application/octet-stream")] public static var APARTMENT_BG2:Class; + //[Embed(source="../csv/APARTMENT_FG.csv", mimeType="application/octet-stream")] public static var APARTMENT_FG:Class; + + //[Embed(source="../csv/TERMINAL_BG.csv", mimeType="application/octet-stream")] public static var TERMINAL_BG:Class; + //[Embed(source="../csv/TERMINAL_BG2.csv", mimeType="application/octet-stream")] public static var TERMINAL_BG2:Class; + ////[Embed(source="../csv/TERMINAL_FG.csv", mimeType="application/octet-stream")] public static var TERMINAL_FG:Class; + + + //[Embed(source="../csv/HOTEL_BG.csv", mimeType="application/octet-stream")] public static var HOTEL_BG:Class; + //[Embed(source="../csv/HOTEL_BG2.csv", mimeType="application/octet-stream")] public static var HOTEL_BG2:Class; + //[Embed(source="../csv/HOTEL_FG.csv", mimeType="application/octet-stream")] public static var HOTEL_FG:Class; + + + /* NOTE!!!! CELL is called TRAIN in DAME because I'm an idiot. That's why. */ + //[Embed(source="../csv/TRAIN_BG.csv", mimeType="application/octet-stream")] public static var CELL_BG:Class; +// //[Embed(source="../csv/TRAIN_BG2.csv", mimeType="application/octet-stream")] public static var CELL_BG2:Class; + ////[Embed(source="../csv/TRAIN_FG.csv", mimeType="application/octet-stream")] public static var CELL_FG:Class; + + + //[Embed(source="../csv/CIRCUS_BG.csv", mimeType="application/octet-stream")] public static var CIRCUS_BG:Class; + ////[Embed(source="../csv/CIRCUS_BG2.csv", mimeType="application/octet-stream")] public static var CIRCUS_BG2:Class; + //[Embed(source="../csv/CIRCUS_FG.csv", mimeType="application/octet-stream")] public static var CIRCUS_FG:Class; + + + //[Embed(source="../csv/WINDMILL_BG.csv", mimeType="application/octet-stream")] public static var WINDMILL_BG:Class; + //[Embed(source="../csv/WINDMILL_BG2.csv", mimeType="application/octet-stream")] public static var WINDMILL_BG2:Class; + ////[Embed(source="../csv/WINDMILL_FG.csv", mimeType="application/octet-stream")] public static var WINDMILL_FG:Class; + + + //[Embed(source="../csv/GO_BG.csv", mimeType="application/octet-stream")] public static var GO_BG:Class; + //[Embed(source="../csv/GO_BG2.csv", mimeType="application/octet-stream")] public static var GO_BG2:Class; + ////[Embed(source="../csv/GO_FG.csv", mimeType="application/octet-stream")] public static var GO_FG:Class; + + + //[Embed(source="../csv/HAPPY_BG.csv", mimeType="application/octet-stream")] public static var HAPPY_BG:Class; + //[Embed(source="../csv/HAPPY_BG2.csv", mimeType="application/octet-stream")] public static var HAPPY_BG2:Class; + ////[Embed(source="../csv/HAPPY_FG.csv", mimeType="application/octet-stream")] public static var HAPPY_FG:Class; + + + //[Embed(source="../csv/BLUE_BG.csv", mimeType="application/octet-stream")] public static var BLUE_BG:Class; + //[Embed(source="../csv/BLUE_BG2.csv", mimeType="application/octet-stream")] public static var BLUE_BG2:Class; + ////[Embed(source="../csv/BLUE_FG.csv", mimeType="application/octet-stream")] public static var BLUE_FG:Class; + + //[Embed(source="../csv/SUBURB_BG.csv", mimeType="application/octet-stream")] public static var SUBURB_BG:Class; + ////[Embed(source="../csv/SUBURB_BG2.csv", mimeType="application/octet-stream")] public static var SUBURB_BG2:Class; + ////[Embed(source="../csv/SUBURB_FG.csv", mimeType="application/octet-stream")] public static var SUBURB_FG:Class; + + //[Embed(source="../csv/SPACE_BG.csv", mimeType="application/octet-stream")] public static var SPACE_BG:Class; + //[Embed(source="../csv/SPACE_BG2.csv", mimeType="application/octet-stream")] public static var SPACE_BG2:Class; + //[Embed(source="../csv/SPACE_FG.csv", mimeType="application/octet-stream")] public static var SPACE_FG:Class; + + //[Embed(source="../csv/CLIFF_BG.csv", mimeType="application/octet-stream")] public static var CLIFF_BG:Class; + //[Embed(source="../csv/CLIFF_BG2.csv", mimeType="application/octet-stream")] public static var CLIFF_BG2:Class; + ////[Embed(source="../csv/CLIFF_FG.csv", mimeType="application/octet-stream")] public static var CLIFF_FG:Class; + + + //[Embed(source="../csv/DRAWER_BG.csv", mimeType="application/octet-stream")] public static var DRAWER_BG:Class; + + + /* Minimaps */ + //[Embed(source="../csv/Minimap_Street.csv", mimeType="application/octet-stream")] public static var MM_Street:Class; + //[Embed(source="../csv/Minimap_Bedroom.csv", mimeType="application/octet-stream")] public static var MM_Bedroom:Class; + //[Embed(source="../csv/Minimap_Redcave.csv", mimeType="application/octet-stream")] public static var MM_Redcave:Class; + //[Embed(source="../csv/Minimap_Crowd.csv", mimeType="application/octet-stream")] public static var MM_Crowd:Class; + //[Embed(source="../csv/Minimap_Apartment.csv", mimeType="application/octet-stream")] public static var MM_Apartment:Class; + //[Embed(source="../csv/Minimap_Hotel.csv", mimeType="application/octet-stream")] public static var MM_Hotel:Class; + //[Embed(source="../csv/Minimap_Circus.csv", mimeType="application/octet-stream")] public static var MM_Circus:Class; + //[Embed(source="../csv/Minimap_Fields.csv", mimeType="application/octet-stream")] public static var MM_Fields:Class; + //[Embed(source="../csv/Minimap_Beach.csv", mimeType="application/octet-stream")] public static var MM_Beach:Class; + //[Embed(source="../csv/Minimap_Cliff.csv", mimeType="application/octet-stream")] public static var MM_Cliff:Class; + //[Embed(source="../csv/Minimap_Forest.csv", mimeType="application/octet-stream")] public static var MM_Forest:Class; + //[Embed(source="../csv/Minimap_Overworld.csv", mimeType="application/octet-stream")] public static var MM_Overworld:Class; + //[Embed(source="../csv/Minimap_Redsea.csv", mimeType="application/octet-stream")] public static var MM_Redsea:Class; + + //[Embed(source="../csv/Minimap_Suburb.csv", mimeType="application/octet-stream")] public static var MM_Suburb:Class; + //[Embed(source="../csv/Minimap_Space.csv", mimeType="application/octet-stream")] public static var MM_Space:Class; + //[Embed(source="../csv/Minimap_Cell.csv", mimeType="application/octet-stream")] public static var MM_Train:Class; + //[Embed(source="../csv/Minimap_Terminal.csv", mimeType="application/octet-stream")] public static var MM_Terminal:Class; + + public static var minimap_csv:Dynamic={ STREET:MM_Street, BEDROOM:MM_Bedroom , REDCAVE:MM_Redcave, APARTMENT:MM_Apartment, HOTEL:MM_Hotel, CIRCUS:MM_Circus , CROWD:MM_Crowd, FIELDS:MM_Fields, BEACH:MM_Beach, CLIFF:MM_Cliff, FOREST:MM_Forest, OVERWORLD:MM_Overworld, REDSEA:MM_Redsea, SUBURB:MM_Suburb, SPACE:MM_Space, TRAIN:MM_Train, TERMINAL:MM_Terminal}; + + public static var maps_with_fg:Array=new Array("DEBUG", "SPACE","STREET", "APARTMENT", "HOTEL", "NEXUS","CIRCUS","FOREST", "REDSEA", "FIELDS"); + public static var maps_with_bg2:Array=new Array("TERMINAL", "SPACE","DEBUG", "OVERWORLD","HAPPY", "BLUE", "REDCAVE","STREET", "APARTMENT", "HOTEL", "CROWD", "WINDMILL","CLIFF","FOREST","GO"); + + // it looks like you're adding a new CSV. + // did you make sure to add in the new tiles in TileData? + // How to add in a layer once it's been exported from DAME: + // 1.Make sure the file is included above("Embed ...")- just follow the pattern + // 2. Depending on what you're adding, add that map's name to the arrays maps_with_fg or maps_with_bg2. + // 3. In the big if-statement head, find and insert the necessary code(use the "DEBUG" block as an example) + // 4. you should then be good to go. + /* Layers:0,1,2:BG. 1 is collidable, others are decoration. 3:FG */ + /** + * + * @param mapName + * @param layer 0,1,2 Bg layers, 3 fg + * @return "0", otherwise the CSV as a string. + */ + public static function getMap(mapName:String,layer:Int=1):String { + var CSV:String="0,0"; + if(layer==3){ + if(maps_with_fg.indexOf(mapName)==-1){ + return CSV; + } + //else go down there and define the behavior + } + + if(layer==2){ + if(maps_with_bg2.indexOf(mapName)==-1){ + return CSV; + } + } + + if(mapName=="DEBUG"){ + if(layer==2){ + CSV=new DEBUG_BG2(); + } else if(layer==3){ + CSV=new DEBUG_FG(); + } else { + CSV=new DEBUG_BG(); + } + } else if(mapName=="BEDROOM"){ + CSV=new BEDROOM_BG(); + } else if(mapName=="STREET"){ + if(layer==2){ + return new STREET_BG2(); + } else if(layer==3){ + CSV=new STREET_FG(); + } else { + CSV=new STREET_BG(); + } + } else if(mapName=="FIELDS"){ + if(layer==3){ + CSV=new FIELDS_FG(); + } else { + CSV=new FIELDS_BG(); + } + } else if(mapName=="OVERWORLD"){ + if(layer==2){ + CSV=new OVERWORLD_BG2(); + } else { + CSV=new OVERWORLD_BG(); + } + } else if(mapName=="BEACH"){ + CSV=new BEACH_BG(); + } else if(mapName=="BLANK"){ + CSV=new BLANK_BG(); + } else if(mapName=="REDSEA"){ + if(layer==3){ + CSV=new REDSEA_FG(); + } else { + CSV=new REDSEA_BG(); + } + } else if(mapName=="REDCAVE"){ + if(layer==2){ + CSV=new REDCAVE_BG2(); + } else if(layer==3){ + //CSV=new REDCAVE_FG(); + } else { + CSV=new REDCAVE_BG(); + } + } else if(mapName=="NEXUS"){ + if(layer==2){ + //CSV=new NEXUS_BG2(); + } else if(layer==3){ + CSV=new NEXUS_FG(); + } else { + CSV=new NEXUS_BG(); + } + } else if(mapName=="CROWD"){ + if(layer==2){ + CSV=new CROWD_BG2(); + } else { + CSV=new CROWD_BG(); + } + } else if(mapName=="APARTMENT"){ + if(layer==2){ + CSV=new APARTMENT_BG2(); + } else if(layer==3){ + CSV=new APARTMENT_FG(); + } else { + CSV=new APARTMENT_BG(); + } + } else if(mapName=="HOTEL"){ + if(layer==2){ + CSV=new HOTEL_BG2(); + } else if(layer==3){ + CSV=new HOTEL_FG(); + } else { + CSV=new HOTEL_BG(); + } + } else if(mapName=="CIRCUS"){ + if(layer==3){ + CSV=new CIRCUS_FG(); + } else { + CSV=new CIRCUS_BG(); + } + } else if(mapName=="WINDMILL"){ + if(layer==2){ + CSV=new WINDMILL_BG2(); + } else { + CSV=new WINDMILL_BG(); + } + } else if(mapName=="TRAIN"){ //CELL!! + CSV=new CELL_BG(); + } else if(mapName=="FOREST"){ + if(layer==3){ + CSV=new FOREST_FG(); + } else if(layer==2){ + CSV=new FOREST_BG2(); + } else { + CSV=new FOREST_BG(); + } + } else if(mapName=="BLUE"){ + if(layer==2){ + CSV=new BLUE_BG2(); + } else { + CSV=new BLUE_BG(); + } + } else if(mapName=="HAPPY"){ + if(layer==2){ + CSV=new HAPPY_BG2(); + } else { + CSV=new HAPPY_BG(); + } + } else if(mapName=="TERMINAL"){ + if(layer==2){ + CSV=new TERMINAL_BG2(); + } else { + CSV=new TERMINAL_BG(); + } + } else if(mapName=="GO"){ + if(layer==2){ + CSV=new GO_BG2(); + } else { + CSV=new GO_BG(); + } + } else if(mapName=="SUBURB"){ + CSV=new SUBURB_BG(); + } else if(mapName=="CLIFF"){ + if(layer==2){ + CSV=new CLIFF_BG2(); + } else { + CSV=new CLIFF_BG(); + } + } else if(mapName=="DRAWER"){ + CSV=new DRAWER_BG(); + } else if(mapName=="SPACE"){ + if(layer==2){ + CSV=new SPACE_BG2(); + } else if(layer==3){ + CSV=new SPACE_FG(); + } else { + CSV=new SPACE_BG(); + } + + } + + return CSV; + } + +} \ No newline at end of file diff --git a/intra/source/data/Common_Sprites.hx b/intra/source/data/Common_Sprites.hx new file mode 100644 index 0000000..4357cb2 --- /dev/null +++ b/intra/source/data/Common_Sprites.hx @@ -0,0 +1,66 @@ +package data +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +/* Embedded sprites common to multiple entities, e.g., shadows */ +public class Common_Sprites +{ + /* Normal shadow that is used by bullets and has two animations */ + //[Embed(source="../res/sprites/decoration/shadows/8x8_shadow.png")] public static var shadow_sprite_8_8:Class; + //[Embed(source="../res/sprites/decoration/SPACE_BG.png")] public static var space_bg:Class; + //[Embed(source="../res/sprites/decoration/briar_BG.png")] public static var briar_Bg:Class; + //[Embed(source="../res/sprites/decoration/nexus_bg.png")] public static var nexus_bg:Class; + + /* This shadow has 5 frames, and its frame is determined by the fist's y-offset + *(or height)used by Wallboss fists, and Eyeboss Land form */ + //[Embed(source="../res/sprites/decoration/shadows/28x10_shadow.png")] public static var shadow_sprite_28_10:Class; + + + //[Embed(source="../helper/static.pbj", mimeType="application/octet-stream")] public static inline var static_shader:Class; + + // OVERLAYS + + // 160x160 image, tiled 2x2. No anims. + //[Embed(source="../res/sprites/decoration/overlays/debug_overlay.png")] public static var debug_overlay:Class; + //[Embed(source="../res/sprites/decoration/overlays/windmill_overlay.png")] public static var windmill_overlay:Class; + //[Embed(source="../res/sprites/decoration/overlays/happy_overlay.png")] public static inline var happy_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/redsea_overlay.png")] public static inline var redsea_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/ending_overlay.png")] public static inline var ending_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/forest_overlay.png")] public static inline var forest_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/cliff_overlay.png")] public static inline var cliff_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/apartment_overlay.png")] public static inline var apartment_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/beach_overlay.png")] public static inline var beach_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/space_overlay.png")] public static inline var space_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/hotel_overlay.png")] public static inline var hotel_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/hotel_roof_overlay.png")] public static inline var roof_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/suburbs_overlay.png")] public static inline var suburbs_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/bedroom_overlay.png")] public static inline var bedroom_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/blue_overlay.png")] public static inline var blue_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/circus_overlay.png")] public static inline var circus_blend:Class; + + //[Embed(source="../res/sprites/decoration/overlays/windmill_overlay2.png")] public static inline var windmill2_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/terminal_overlay.png")] public static inline var terminal_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/street_overlay.png")] public static inline var street_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/nexus_overlay.png")] public static inline var nexus_Blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/crowd_overlay.png")] public static inline var crowd_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/go_overlay.png")] public static inline var go_blend:Class; + //[Embed(source="../res/sprites/decoration/overlays/redcave_overlay .png")] public static inline var redcave_blend:Class; + + public static var static_map:Bitmap; + + public static function init():Void { + static_map=new Bitmap(new BitmapData(320, 320,true,0x00000000)); + var alpha:Int; + var gray:Int; + var maxalpha:Int=80; + var maxgray:Int=80; + + for(i in 0...320){ + for(j in 0...320){ + alpha=maxalpha * Math.random(); + gray=maxgray * Math.random(); + static_map.bitmapData.setPixel32(j, i,(alpha<<24)|(gray)|(gray<<8)|(gray<<16)); + } + } + } +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_EN.hx b/intra/source/data/NPC_Data_EN.hx new file mode 100644 index 0000000..b513ea9 --- /dev/null +++ b/intra/source/data/NPC_Data_EN.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_EN { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Like music? Talk to that terminal!", + "Like pain? Head on down south!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "That acrobat is losing balance! Where is the safety net?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "The lions are closing in on that juggler!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again.", + "Briar:...", + "Briar:It’s not going to change, Young. This is all we’ll ever be.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Goodbye, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Dude, Young.", + "Briar:Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me!", + "Briar:Well, come on, let’s go get a sandwich or something.", + "Sage:You... you did adequately. Until we meet again.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Mysterious voice:Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around.", + "You will press the \'", + "\' key to Interact with objects and people around you.", + "And you will press the \'", + "\' key to access the menu, which will provide you with information about yourself and your surroundings.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... I just wanted to fix everything for you.", + "I hope... I hope you can do better than me.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Good luck, Young.", + "Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality.", + "I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young.", + "You are fighting, Young. You are trying to understand. I hope you can work things out.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... this is my final warning... wait, who is that?", + "Mitra:My name is Mitra, and this is my bike, Wares!", + "Sage:I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you.", + "Mitra:I’m here to help my friend, Young..", + "Sage:Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world!", + "Mitra:What do you mean? Wares and I--", + "Sage:SHUT UP ABOUT YOUR STUPID BICYCLE!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone?", + "Sage:You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young.", + "Sage:Go talk to your \"friend\".", + "Mitra:We're just doing the best we can...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Cloaked Man:Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar.", + "Enter the active portal on your left to begin your quest.", + "*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need!", + "Just go in the damn door!") + } +, + after_ent_str:{ + dialogue:new Array( + "Why are you still here?") + } +, + after_bed:{ + dialogue:new Array( + "Continue on, Young. That key you have found, there may be others like it - seek them out.", + "Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness.") + } +, + before_windmill:{ + dialogue:new Array( + "Take those three keys, Young, and unlock the way to the deeper realms of The Land.") + } +, + after_windmill:{ + dialogue:new Array( + "You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and Intellect. And I assume that by this point you have found a weapon?", + "Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend...", + "*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for?", + "Keep your wits about you, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest.", + "That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest.", + "Travel East and South through the temple grounds... you will find a use for that key.", + "What, do you want a piggy back ride to the gate or something??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:Why won’t you listen to me?! If you rush Into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar.", + "Sage:You’re not ready Young, first you must face more trials in The Land.", + "Sage:You have made progress, Young, but you must collect at least 36 cards to pass this gate.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36!", + "Sage:Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!!", + "Sage:Of course, you still have a long way to go. Have you been exploring The Land?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Well done, Young. However, there are still trials to face. Do not let your guard down.", + "Sage:Have you found all of the keys yet, Young? If not, go to the beach.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "I'm not like the others! *woof* I won't harm you...", + "It is a quiet existence up here.", + "You smell like swiss chard.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful!", + "So beautiful...") + } +, + dump:{ + dialogue:new Array( + "Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha!", + "Hahaha. Hahahahaha. HAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Hey sexy, I’ll buy you a drink!", + "Have another drink, you little shit! Hahaha!") + } +, + hot:{ + dialogue:new Array( + "Fuck, it’s hot here... I’m so hot... and sweatyyy...", + "Damn, working out makes me horny!") + } +, + gold:{ + dialogue:new Array( + "Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha!", + "Seriously, why are you just standing there? Help me jack this brick!") + } +, + briar:{ + dialogue:new Array( + "???:Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "HEADS UP!", + "Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess!", + "I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle!", + "Well, maybe we’ll run Into each other again sometime. I’ll let you know if I hear anything about that Briar.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "HEADS UP! All right Wares, let’s do this!", + "Annnd presto!", + "Keep going, Young, we’ve got your back!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Remember me? I forgot to Introduce myself the last time, I only Introduced my bicycle, Wares. My name is Mitra.", + "Remember me? I forgot to Introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares.", + "Mitra:So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie.", + "Mitra:See you around, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry.") + } +, + game_hints:{ + dialogue:new Array( + "Nothing.", + "Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more?", + "Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others?", + "Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there?", + "Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land?", + "Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those!", + "What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land", + "How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team!", + "Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple?", + "Mitra:Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple.", + "Mitra:Hey Young, looking for a card?\nYou might find something near the Seeing One's lair.", + "Mitra:Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right?", + "Mitra:Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple?", + "Mitra:Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair.", + "Mitra:Hey Young, looking for a card?\nMaybe your neighbor knows something about it.", + "Mitra:Hey Young, looking for a card?\nI know the guy in your apartment was hiding something...", + "Mitra:Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there!", + "Mitra:Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment?", + "Mitra:Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out.", + "Mitra:Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around!", + "Mitra:Hey Young, looking for a card?\nI know someone left a card near the windmill.", + "Mitra:Hey Young, looking for a card?\nLook around the rivers in the forest...", + "Mitra:Hey Young, looking for a card?\nTry poking around the base of the mountains.", + "Mitra:Hey Young, looking for a card?\nTry going to the summit of the mountains.", + "Mitra:Hey Young, looking for a card?\nThe far end of the beach may hold something.", + "Mitra:Hey Young, looking for a card?\nTake a walk in the crimson woods.", + "Mitra:Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right?", + "Mitra:Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end!", + "Mitra:Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river!", + "Mitra:Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth?", + "Mitra:Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it!", + "Mitra:Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere?", + "Mitra:Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit?", + "Mitra:Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something.", + "Mitra:Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves!", + "Mitra:Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave?", + "Mitra:Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave?", + "Mitra:Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something!", + "Mitra:Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something.", + "Mitra:Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something!", + "Mitra:Hey Young, looking for a card?\nDid you walk Into all of the rooms on the 3rd floor of the hotel?", + "Mitra:Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel.", + "Mitra:Hey Young, looking for a card?\nThe owner of the hotel might have left something for you!", + "Mitra:Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there!", + "...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know?") + } +, + general_banter:{ + dialogue:new Array( + "Did you find that guy who was looking for something in the mountains?", + "Do you know what my bike’s surname is? …Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames.", + "Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days...", + "So what is The Briar? Some sort of ancient artifact from a lost culture?", + "I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles.", + "Hey Young, I just wanted to tell you... your hair is awesome.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Statue:The Village Elder in name only, for he is neither.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Statue:I’ve seen a broom in a legend... it was on the map of a janitor closet.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Statue:Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Statue:Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap Into the cracks, thinking I might short-circuit the wires. Of course, I never found anything.", + "Edward:This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in “The Land”, and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust!") + } +, + after_fight:{ + dialogue:new Array( + "I will be with you, Young, whenever you are alone. And remember my advice on your little “adventure”.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Rock:Peripheral vision is the hive of demons.") + } +, + two:{ + dialogue:new Array( + "Rock:To-do:Construct method of transportation to Nexus. Progress:Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal.") + } +, + three:{ + dialogue:new Array( + "Rock:I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "This wheel is used to lift the dam.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "June 24th, 1957:Trapeze swing breaks. Alice Rutgers is flung Into the ground, resulting in two fractured shins.") + } +, + two:{ + dialogue:new Array( + "July 17th, 1957:Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs.") + } +, + three:{ + dialogue:new Array( + "July 21st, 1957:Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection.") + } +, + four:{ + dialogue:new Array( + "August 5th, 1957:In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain.") + } +, + five:{ + dialogue:new Array( + "August 7th, 1957:How many of us will suffer before we accept the truth of the Seeing One?") + } +, + six:{ + dialogue:new Array( + "August 8th, 1957:I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Indecipherable markings)") + } +, + two:{ + dialogue:new Array( + "December 7th, 2010.(name unreadable). There's nothing up here, except this stupid rock!") + } +, + three:{ + dialogue:new Array( + "Danger! This cave is unexplored.") + } +, + four:{ + dialogue:new Array( + "These cliffs extend far and upwards, though I've never gone high enough to find out where they lead.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Rock:How?") + } +, + two:{ + dialogue:new Array( + "Rock:Warning! Vertical drop, jump at your own risk.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations!", + "I forget why we ended up scrapping it. Perhaps too dramatic.") + } +, + two:{ + dialogue:new Array( + "Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides(i.e., walls)working very well so I just ended up scrapping the idea entirely...or something.", + "There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game.") + } +, + three:{ + dialogue:new Array( + "Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing.", + "Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt.", + "We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard!") + } +, + four:{ + dialogue:new Array( + "PRISON!!!", + "Save us!!!", + "Please!") + } +, + five:{ + dialogue:new Array( + "Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world(90 PER-CENT)\"Non-canon\". Anyways.", + "Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with her tilesets.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVES-", + "PROCEED WITH CAUTION") + } +, + four:{ + dialogue:new Array( + "West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing.") + } +, + three:{ + dialogue:new Array( + "The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home.") + } +, + two:{ + dialogue:new Array( + "COLD STORAGE\n\n^ -- THE MGMT") + } +, + one:{ + dialogue:new Array( + "CONTINUE") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "West:Beach\n\nEast:Forest\n\nSoutheast:\n Rainy Area\n\nNorth:\nTemple Grounds\n\nNorthwest:Chasm") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "West:Land Lake\nSouth, then east:Cliffs") + } +, + two:{ + dialogue:new Array( + "Relaxation pond. Stay a while, we know you have the time.") + } +, + three:{ + dialogue:new Array( + "I'm afraid I may be stuck on this tiny corner forever.") + } +, + four:{ + dialogue:new Array( + "East:Cliffs") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below.") + } +, + two:{ + dialogue:new Array( + "When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone.") + } +, + three:{ + dialogue:new Array( + "The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die.") + } +, + four:{ + dialogue:new Array( + "The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Rock:This is unclaimed territory - not yet a part of The Land.") + } +, + two:{ + dialogue:new Array( + "Rock:These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Rock:Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here!") + } +, + four:{ + dialogue:new Array( + "Rock:Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really.") + } +, + five:{ + dialogue:new Array( + "Rock:My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "Sometimes if you talk to people multiple times, they have new things to say.", + "But not rocks. Rocks don’t do that.") + } +, + two:{ + dialogue:new Array( + "Rock:So close! If only...") + } +, + three:{ + dialogue:new Array( + "Rock:Curiosity is a great thing.") + } +, + four:{ + dialogue:new Array( + "Rock:Oh!...?") + } +, + five:{ + dialogue:new Array( + "The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads:\"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Rock:I’ll bet you’re reading a rock because you don’t have any friends.") + } +, + two:{ + dialogue:new Array( + "Rock:Welcome to Overworld Station. We hope you enjoyed your time in The Land.") + } +, + three:{ + dialogue:new Array( + "Rock:An explorer is you!", + "Rock:Please don't go south. It's under construction.") + } +, + four:{ + dialogue:new Array( + "Rock:Treasure in 5,3!") + } +, + five:{ + dialogue:new Array( + "Rock:Haha, gotcha!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY.") + } +, + two:{ + dialogue:new Array( + "ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG.") + } +, + three:{ + dialogue:new Array( + "WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Rock:Signs indicate the trees have not been active for an extended period of time.") + } +, + two:{ + dialogue:new Array( + "Rock:South:???^ North:???") + } +, + three:{ + dialogue:new Array( + "Rock:The uneven terrain is said to have been formed by the ancestors of the area's inhabitants.") + } +, + four:{ + dialogue:new Array( + "Rock:They appear to be a peaceful species.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Scribbled in what appears to be permanent marker:Greetings, fellow traveler of SPACE and TIME. You have stepped Into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT", + "(Below the message, an engraving:)Here lies ____(unreadable). He got lost in the woods.", + "(Even further below the message:)(just don't go too far south.)") + } +, + two:{ + dialogue:new Array( + "Here lies ____(unreadable. Who wrote this?). He was impaled by rainbows!", + "Would've been better with achievements.") + } +, + three:{ + dialogue:new Array( + "Here lies Burd. The cliffs weren't feeling too friendly.") + } +, + four:{ + dialogue:new Array( + "Here lies bag. It never had a chance.", + "Pretentious!") + } +, + five:{ + dialogue:new Array( + "Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead.") + } +, + six:{ + dialogue:new Array( + "Here lies Dave. He wasn't very inspirational.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay.") + } +, + two:{ + dialogue:new Array( + "To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware.") + } +, + three:{ + dialogue:new Array( + "On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits.") + } +, + four:{ + dialogue:new Array( + "I remember the long sentences I used to write. Ha! Fragmented.") + } +, + five:{ + dialogue:new Array( + "A DANGEROUS SITUATION") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches.") + } +, + two:{ + dialogue:new Array( + "Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze.") + } +, + three:{ + dialogue:new Array( + "Move along.") + } +, + four:{ + dialogue:new Array( + "Do not anger the Chasers with violence.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "SCENIC LANDMARK:Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching Into the sky. Due to safety concerns, the path to the tower has been cut off until further notice.") + } +, + two:{ + dialogue:new Array( + "PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "The statue does not look like it will be moving anytime soon.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "It looks like this statue is firmly in place.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "This statue does not seem to be movable.") + } +, + two:{ + dialogue:new Array( + "The statue has moved.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars.") + } +, + after_fight:{ + dialogue:new Array( + "Okay, so stars aren't really made of fire. ^Who gives a shit anyway?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "How are you today? I'm the ruler of this partition and Interpretation of space.", + "You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while.", + "Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here.", + "Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me!", + "The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign.", + "Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others...", + "...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation.", + "Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends.", + "I like to think that whenever we're under the Interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next Interpretation. You know, encouragement and the like, their physical presence, those are comforting.", + "I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done.", + "I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different.", + "It was nice to meet you.", + "Oh, you want to hear my story again?", + "Okay, sit tight.") + } +, + gray:{ + dialogue:new Array( + "Hello there. I'm the ruler of this part of space.", + "What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why!", + "Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining!", + "Well, even though I'm the ruler of this part of space, I am not really ruling over anyone.", + "Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist.", + "My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar Interests and desires, and the like. We like to talk a lot about how to rule, and so forth.", + "But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form.", + "So you're not actually talking to their physical forms, but a representation of them in some holographic form.", + "I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much.", + "There's just a small thing lacking when you can't have a one-on-one physical conversation all the time.", + "But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible.", + "It was nice talking at you, good luck with whatever you're up to.", + "You're still here? I can tell you everything again, if you'd like.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Hey ya big bully! I’m not afraid of you!", + "Crickson:Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one!", + "Crickson:Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself!") + } +, + thorax:{ + dialogue:new Array( + "Thorax:I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight!", + "Thorax:Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change!", + "Thorax:Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Buy my stuff") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "What are you doing here, punk? Get lost! I caught it fair and square!", + "I won’t let it go! Not in a million years!") + } +, + inside:{ + dialogue:new Array( + "Oh, did you come here to terrorize me some more?", + "You’re just siding with the cats because they are cute and furry.") + } +, + etc:{ + dialogue:new Array( + "What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!!", + "You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession!", + "Young opens and takes the box. Something is inside it!", + "Icky:Oh. Hey Miao.^\n\nMiao:I’m so glad you’re safe!^\n\nIcky:Uh... thanks for the hand, Young.", + "Icky:To be honest, I kind of like sitting in boxes.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training!", + "Could I follow you around for a bit to watch a Chosen One in action?", + "Hello again, Young! Can I shadow you today?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Hey, Young… have you ever stolen anything?", + "Miao:I like Mitra... and isn’t Wares a handsome bike?", + "Miao:What’s that cool stone thing, Young? Does it make you go back in time?!", + "Miao:I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east.", + "Miao:Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young.", + "Miao:Have you ever sat in a bunch of grocery bags?", + "Miao:Hey Young, do you think it’s wrong to do catnip?", + "Miao:I bet it must have taken a lot of work to become The Chosen One, huh, Young?") + } +, + philosophy:{ + dialogue:new Array( + "That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life?", + "Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy?", + "And then what is our reward for completing our journey? Do we just fade away?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Hi, Young.", + "My name’s not really Icky. It’s Ichabod.", + "I hope Miao Xiao Tuan Er hasn’t been too much trouble.", + "See you later, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside.", + "You can blame me for all of those awful rooms! I made them with the DAME map editor.", + "I made this game with FlashDevelop IDE and the Flixel AS3 framework!", + "Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity.", + "I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate?", + "Hi mom! ^And dad!", + "Want to know how to finish the game in 20 minutes?", + "Ha! Like I'd tell you!", + "(...maybe if you ask me nicely...)") + } +, + marina:{ + dialogue:new Array( + "Woah hey!", + "I wrote a ton of dialogue for this game!^(...but not this dialogue. Melos is doing this.)", + "I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "The humidity here is good for your skin, but bad for your hair.", + "I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones.", + "It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes Into her late 20s. Now she’s got hairline cracks all over her molars.") + } +, + second:{ + dialogue:new Array( + "Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria.", + "Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer.") + } +, + bomb:{ + dialogue:new Array( + "Get away from me.", + "I’m serious... leave me alone now.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "I don’t need your pity, Young.", + "Right, just go on living in your happy little world, “Chosen One”...", + "You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone.", + "Hah, I knew you hated me, Young.", + "I’m doing fine.", + "Of course you don’t care, no one does.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights.", + "It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity.", + "Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal.", + "I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight...", + "I’m sorry, I’m babbling. Thanks for listening.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Heeyyyy, mannn...take a load off, stay a whilleee, eh?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! You found me!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you.", + "Golem:My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked.") + } +, + second:{ + dialogue:new Array( + "Golem:When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men.", + "Golem:At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on.", + "Golem:Actually, I don’t miss watching people much, it’s a bore.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "I’m not a lobster, I’m a langostino. The name’s Hews.", + "Hews:You know what the best part of the ocean is? Being able to see the horizon.", + "Hews:The ocean is like a salty taste of infinity.", + "Hews:A crowded beach is robbed of its grace.") + } +, + second:{ + dialogue:new Array( + "Hews:Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors?", + "Hews:Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Berries are a good kind of food. I like berries.", + "James:Please make sure not to defecate on the berries.", + "James:So far I have had sexual Intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries.", + "James:Do you have any berries for James?") + } +, + second:{ + dialogue:new Array( + "James:I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very!", + "James:Do you like blueberries or raspberries more?", + "James:Do you have any berries for James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Someone came by. They did not want berries. Went to southeast part of lake to the west.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olive:Hi, I'm Olive the rabbit.", + "Olive:I have so much cereal left to eat! I love cereal.", + "Olive:The box is so big. It never ends!", + "Olive:Neverending cereal!", + "Olive:Hmmm...maybe that's not such a bad thing.") + } +, + bush:{ + dialogue:new Array( + "Rank:Eheheh, silly Young! A broom’s no tool for cutting bushes!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh!", + "Rank:The economy has been really struggling under this bush...", + "Rank:Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Oh hey, how are you feeling?", + "Marvin:Where is Justin?", + "Marvin:There's no bottle rockets around...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:Bob the Hamster likes to refer to himself in the third person.", + "Bob:Apostrophes are the root of all e'vil.", + "Bob:quiet! I am busy exuding an aura of hamstery ambiance.", + "Bob:... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong?", + "Bob:A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries.", + "Bob:This game was created by an infinite number of monkeys working on an infinite number of typewriters.", + "Bob:I miss James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Curry is yellow and spicy!", + "Kuribu:For the clever opponent, injure increase!", + "Kuribu:You got the experience of 2!", + "Kuribu:I tell you my phone number! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you.", + "It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes?", + "It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect.") + } +, + quest_event:{ + dialogue:new Array( + "Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Hello.", + "Are you looking for something?", + "What are you looking at?", + "No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't Interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange.") + } +, + quest_event:{ + dialogue:new Array( + "Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "WHOA WHOA WHOA - - - WHO ARE YOU ? ? ?", + "I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B .", + "WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "You actually were...uh, ah. Well done.", + "The shiny rock reflects only a bit of the light from the room. There is writing etched Into it:\"Quickly, before I have to leave again(Std.is(It, getting) very light in here, this always happens)- the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\"") + } +, + quest_event:{ + dialogue:new Array( + "The shiny rock reflects only a bit of the light from the room. There is writing etched Into it:\"Quickly, before I have to leave again(Std.is(It, getting) very light in here, this always happens)- the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "HELLO. HAVE YOU MET cube YET?", + "cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL.") + } +, + gray2:{ + dialogue:new Array( + "WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO?", + "AN INTERSECTION OF WORLDS!") + } +, + gray3:{ + dialogue:new Array( + "NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE.", + "WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...IS THE HOLOGRAM DEVICE WORKING CORRECTLY?", + "NO?^...^DAMN!") + } +, + color1:{ + dialogue:new Array( + "Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot!") + } +, + color2:{ + dialogue:new Array( + "CUBE does a lot of Interesting work!", + "Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe.") + } +, + color3:{ + dialogue:new Array( + "I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE!", + "Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell.") + } +, + colordead:{ + dialogue:new Array( + "(...is it taking a nap?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE.") + } +, + after_fight:{ + dialogue:new Array( + "IS THIS YOUR PUNISHMENT FOR OUR REBELLION?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation?") + } +, + after_fight:{ + dialogue:new Array( + "...We have failed to make you pay for your Interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "So good to see you, Yang. Been too long. Still playing those nentendos, I see?") + } +, + after_fight:{ + dialogue:new Array( + "Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "We have all the finest amenities here. How do you like the Pool?") + } +, + middle_fight:{ + dialogue:new Array( + "How about our state-of-the-art fitness center?") + } +, + after_fight:{ + dialogue:new Array( + "We hope you enjoyed your stay!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Today is a nice day.", + "Thanks for scratching that itch on my neck - I can't seem to reach it.", + "I've heard the eggs at the local diner are quite good. I have a coupon for them, too.", + "Did you see the car accident today? So horrible! He was texting. Such a shame, so young!", + "My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career.", + "Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains.", + "Ah, I think I might be late for work.", + "I am in a bit of a rush to get home, I need to tidy up before the in-laws come over.", + "We're having a garage sale!", + "Welcome!") + } +, + words_teen:{ + dialogue:new Array( + "I didn't see the latest movie.") + } +, + words_kid:{ + dialogue:new Array( + "I never gotta see the new cartoon!") + } +, + family:{ + dialogue:new Array( + "Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors.", + "Do you like Davement? My brother Dave showed me this really cool song by them!") + } +, + older_kid:{ + dialogue:new Array( + "My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes..", + "I guess I'll just go write in my blog.", + "You sure look like you're in a daze.", + "I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it.") + } +, + hanged:{ + dialogue:new Array( + "A note on the corpse:\"Placing myself in danger no more.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, is there something going on outside? A festival? A parade?", + "There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be.") + } +, + paranoid:{ + dialogue:new Array( + "My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me.", + "Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave.", + "Please get out.") + } +, + dead:{ + dialogue:new Array( + "The body of this woman has been beaten to death by a blunt weapon.", + "The man, to put it bluntly, well...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit.", + "According to this pamphlet...you only need to kill a few more people! Keep it up.", + "We only need one more body, and then we can keep going.", + "Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "I don't mind being watched by the trees.", + "Where is she?!", + "I will be with you Young, whenever you are alone.", + "Are you an Ookchot? My mom always warned me about the Dangerous Ookchot.", + "Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea!", + "Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows...", + "Limited time offer! Buy one, get one free - only today!", + "Remember the time that you lit a candle when the power was out?", + "Mmmm, your pillow was cozy last night.", + "This'll teach 'em for calling me the fumi-GAY-tion guy.", + "Wares and I make a good team.", + "I'm the Chosen One-in-training!!!", + "Do you ever feel like, no matter what you do, you can't stop the world from dying?", + "Beware the forest mushrooms...", + "I am sorry. It is my nature.", + "What do you mean, 'Only a rock'?? Rocks can be on cards too, you know!", + "Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy.", + "Sometimes the answer is taking a walk.", + "Why do bats suddenly fly down, every time you're around?", + "NO, *YOU* NEED BRACES!", + "ARE YOU HAPPY NOW?", + "Don't get violent around me.", + "I've always wanted to be on Iron Chef.", + "My mom always told me, 'If you do that arch long enough, your spine will stay that way!'", + "Are you amused yet, human?", + "...", + "Scientifically speaking, toads are a subset of frogs.", + "HAHAHAHA! Yeah! I know!", + "Oh, you collect cards, too? Real classy, Ying.", + "They always said, \"Get off the computer! Or you'll never make friends!\"", + "I'm only the ruler for the extent of a conversation.", + "I'll bet you think you're 'making my job Interesting'!", + "I hate diagonals.", + "Don't even try that claritin clear shit with me.", + "Swipe this card to unlock the door to your room!", + "I'm doing a great job.", + ".......??", + "Who carved all of us anyways?", + "I hope you enjoyed your stay.", + "Seening as you've gotten to this point, you must be quite Intrasting.", + "I'm just here to lead you astray.", + "You like like a pyramid to us, too!", + "It's the same damn play, night after night, and the pay sucks.", + "Leave me alone! My last name isn't Sachs!", + "At least I'm not a stick.", + "What do you mean money doesn't grow on trees? Eheheheh!", + "I'm nothing but an illusion.", + "I'LL TAKE IT OUT ON YOU.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Press", + "to set controls.", + "to cancel.", + "Up", + "Down", + "Left", + "Right", + "Jump", + "Attack", + "Menu", + "Press", + "to exit", + "to set controls.") + } +, + title:{ + dialogue:new Array( + "Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress", + "when done.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Press", + "to start", + "Version", + "Continue", + "New Game", + "Are you sure?\nNo\nYes", + "Really?\nNah\nYeah", + "No going back!\nForget it\nI know", + "deaths", + "cards", + "Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n", + "NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device.", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "Saving...") + } +, + map:{ + dialogue:new Array( + "Map", + "Current Room", + "Door/Exit", + "No Map", + "Return to\nNexus", + "Return to\nentrance") + } +, + items:{ + dialogue:new Array( + "Items", + "Normal", + "Swap", + "Extend", + "Widen", + "A pair of spring-loaded shoes - press", + "to jump!", + "A pair of shoes for biking.", + "An empty cardboard box.", + "A key found in the Temple of the Seeing One.", + "A key found in a red, underground cave.", + "A key found in a mountain cave.") + } +, + cards:{ + dialogue:new Array( + "Cards", + "cards") + } +, + save:{ + dialogue:new Array( + "Save", + "Saved!", + "ERROR", + "Save and go\nto title", + "Go to title", + "Save and quit", + "Quit game", + "Deaths:") + } +, + config:{ + dialogue:new Array( + "Config", + "Set keybinds", + "Set volume", + "Autosave at\ncheckpoints:", + "On", + "Off", + "Change\nResolution:", + "Config UI", + "Touch+D-Pad", + "D-Pad Only", + "Touch Only", + "Move Input:", + "Resolution:", + "Windowed", + "Int. Scaled", + "Stretch", + "Scaling:", + "Language:", + "ja", + "en", + "Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n", + "Resize Window", + "Config Joypad") + } +, + secrets:{ + dialogue:new Array( + "You\'re rolling in it!", + "Once the property of a famous Bubble Mage.", + "If your graphics become scrambled, look at the pakidex entry of an official Pakimon.", + "This heart has no name.", + "Please visit the electric monsters\' world.", + "A kitty statue. Cute, but useless.", + "Oh my!!!!", + "Oh no!!!!", + "It\'s black.", + "It\'s red.", + "It\'s green.", + "It\'s blue.", + "It\'s white.", + ":Select", + ":Back") + } +, + swap:{ + dialogue:new Array( + "Sorry!", + "The swap won't work here.", + "Young could not muster the strength to use the swap here.") + } +, + keyblock:{ + dialogue:new Array( + "This door is locked.") + } +, + treasure:{ + dialogue:new Array( + "Some strange force stops this treasure box from being opened.", + "An engraving on the broom handle reads:Press", + "to sweep.", + "This key may be used a single time to open up a locked barrier.", + "A mysterious pair of boots has nothing but the branding on it, which says \"Press", + "\".", + "A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\"", + "A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\"", + "A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\"", + "YOU FOUND A HEART!!! Maximum Health increased by...zero.", + "Goldman:What? It's not there? That shopkeeper must have stolen it!") + } +, + dust:{ + dialogue:new Array( + "Your broom is now full of dust! Attack again to place it.") + } +, + checkpoint:{ + dialogue:new Array( + "Save game?\n Yes\n No", + "While standing on a checkpoint, press", + "to save your progress and set it as your respawn point if you die.") + } +, + rock:{ + dialogue:new Array( + "There is writing scrawled on this rock:") + } +, + door:{ + dialogue:new Array( + "The portal does not appear to be active.") + } +, + keyblockgate:{ + dialogue:new Array( + "The gate stares, petrified. It won't open until it senses four cards...", + "Sensing four cards, the gate decides to open.", + "The gate stubbornly remains in place.", + "The gate senses all of the cards, and decides to open.", + "The gate senses enough cards, and decides to open.", + "It opens!", + "It remains closed.") + } +, + solidsprite:{ + dialogue:new Array( + "The sign points to the east but the words on it are faded.", + "The sign points to the west but the words on it are faded.", + "The words on the sign are faded.") + } +, + mitra:{ + dialogue:new Array( + "Hey, Young!", + "Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press", + "to jump with them on!", + "Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip Into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press", + "to jump with them on!", + "Alright, take care!", + "Go on, try them out! ...They're not THAT smelly.", + "Cool, huh?", + "Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press", + "to jump\". I've never understood that, though, because there's no \"", + "\" anywhere on the shoes...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye!", + "Finty:I still appreciate that box!", + "Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning!", + "Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead!", + "As a token of my gratitude, take these stylish biking shoes!", + "Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around.", + "Too bad, looks like you can't afford this item! Come back later, when you have the cash!", + "Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99!", + "Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99!", + "Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99!", + "Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99!", + "As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nA game created by\n\nMelos Han-Tani\n\nand\n\nMarina Kittaka\n\n-------------", + "Created from\n\nMarch, 2012\n\nto\n\nJanuary, 2013", + "DESIGN\n------\nBoth", + "PROGRAMMING\n-----------\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\nART\n---\nMarina\n", + "MUSIC/SFX\n---------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\nDIALOGUE\n--------------\nMostly Marina\n", + "STORY\n-----\nBoth\nJapanese Localization:\nKakehashi Games", + "Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game.", + "Olivia - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport.(Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina.", + "Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up.", + "Mo, for believing\n in me.\n\nTina, for Introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it.", + "CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "And we'd like to\nthank YOU!\nFor playing our game!\n\n\nWe hope you\nenjoyed it.", + "\n\n\n\n\n\n\n\n", + "Now you have\nthe ability\nto explore Young's\nworld with(almost)no\nlimitations, via \nthe swap.\n") + } +, + elevator:{ + dialogue:new Array( + "Floor?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancel") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} diff --git a/intra/source/data/NPC_Data_ES.hx b/intra/source/data/NPC_Data_ES.hx new file mode 100644 index 0000000..e98bb86 --- /dev/null +++ b/intra/source/data/NPC_Data_ES.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_ES { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "¿Te gusta la música? ¡Habla con ese terminal!", + "¿Te gusta el dolor? ¡Ve hacia el sur!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "¡Ese acróbata está perdiendo el equilibrio! ¿Dónde está la red de seguridad?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "¡Los leones están acorralando a ese malabarista!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Estoy cansado, Young. Estoy cansado de todas estas vueltas. Me siento como si estuviera viviendo el mismo sueño, la misma pesadilla una y otra vez.", + "Briar:...", + "Briar:No va a cambiar, Young. Esto es lo que seremos por siempre.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Adiós, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Young, colega.", + "Briar:Patalea. Mueve los brazos. Dios, ¡no aguantarías ni un minuto sin mí!", + "Briar:Bien, venga, vamos a por un sandwich o algo.", + "Sage:Lo... lo hiciste adecuadamente. Hasta que nos volvamos a encontrar.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voz misteriosa:¿Hola? ¿...Young? ^EY! ... oh, ¿puedes oírme? Bien, ahora escucha. Estás a punto de despertar. Usarás las teclas de dirección para desplazarte.", + "Pulsarás la tecla \'", + "\' para Interactuar con objetos y la gente a tu alrededor.", + "Y pulsarás la tecla \'", + "\' para acceder al menú, el cual te proporcionará información sobre ti mismo y tus alrededores.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Yo sólo quería arregarlo todo para ti.", + "Espero... Espero que puedas hacerlo mejor que yo.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Buena suerte, Young.", + "Sage tiene razón, en parte. Quiero que todo sea agradable y que funcione a la perfección, y algunas veces eso me hace ignorar la realidad.", + "No sé qué necesitas hacer para ayudar a Briar. No entiendo cómo funciona este mundo o por qué todo parece tan extraño. Pero quiero ser tu amiga, en serio, Young.", + "Estás luchando, Young. Estás Intentando entender. Espero que puedas aclarar las cosas.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... esta es mi advertencia final... espera, ¿quién es?", + "Mitra:¡Mi nombre es Mitra, y esta es mi bici, Wares!", + "Sage:No pregunté por el nombre de tu bicicleta, ¿qué estás haciendo aquí? No te recuerdo.", + "Mitra:Estoy aquí para ayudar a mi amigo, Young...", + "Sage:Young no tiene amigos. Ni siquiera tiene a Briar. Y si tú estás animándolo, ¡entonces te quiero fuera de mi mundo!", + "Mitra:¿Qué quieres decir? Wares y yo--", + "Sage:¡¡¡DEJA DE HABLAR DE TU ESTÚPIDA BICICLETA!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:¡Young! ¿Estás bien? Lo que acabas de hacer ha sido realmente admirable... ¡Continúa y acaba esta estúpida área! ¡Sabemos que puedes lograrlo!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Mira, misterioso personaje encapuchado, no sé quién te crees que eres, ¿pero por qué no nos dejas a solas y punto?", + "Sage:Te crees amiga de Young porque le mentirás y le dirás que en el fondo él es simplemente perfecto y que todo saldrá bien. Bien, si eso es lo que quieres, VALE. Apártate de mi vista, Young.", + "Sage:Ve a hablar con tu \"amiga\".", + "Mitra:Estamos haciéndolo lo mejor que podemos...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Hombre encapuchado:Bueno, ya va siendo hora. Eh...^Quiero decir...^ Saludos, Young(Joven)! Yo soy Sage(Sabio), el Anciano del Pueblo. Has sido convocado aquí porque La Oscuridad se ha extendido a lo largo de la Región. La Oscuridad anda tras el Legendario Briar(Espino), para usar su poder con fines malvados. Debes encontrarlo antes. Debes proteger el Briar.", + "Entra por el portal activo a tu izquierda para empezar tu búsqueda.", + "*Suspiro* No es de buen agüero que aún estés rondando por aquí. Entra por el portal para empezar tu búsqueda. ¡El Briar y, por extensión, el mundo están en extrema necesidad!", + "¡Entra por la maldita puerta ya!") + } +, + after_ent_str:{ + dialogue:new Array( + "¿Aún estás aquí?") + } +, + after_bed:{ + dialogue:new Array( + "Prosigue, Young. Esa llave que has encontrado, puede que haya otras como esa - encuéntralas.", + "Viaja hasta los límites de La Región, Young. Es la única manera de parar La Oscuridad.") + } +, + before_windmill:{ + dialogue:new Array( + "Coge esas tres llaves, Young, y abre el camino a las áreas más recónditas de La Región.") + } +, + after_windmill:{ + dialogue:new Array( + "Has hecho lo que te había pedido, Young, aunque aún queda mucho por hacer. Quizás si exploras los terrenos más recónditos de La Región llegarás a conseguir mayores logros... quizás así le sirvas a Briar para algo.") + } +, + all_card_first:{ + dialogue:new Array( + "Buen trabajo, Young. Has encontrado todas las cartas de un área de La Región, y como resultado, una gema ha aparecido en lo alto del portal de ese área.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Pronto tus habilidades serán puestas a prueba, Young. Para lograr atravesar este templo con vida, necesitarás fuerza y no menos Intelecto. Y llegados a este punto doy por supuesto que has encontrado un arma, ¿no es así?", + "¿¿Pero qu-?? ... Qu-Quiero decir... Sí, por supuesto... ¡una escoba! Esto... justo como fue presagiado en La Leyenda...", + "*gruñidos* ... de todos los incompetent--¡Eh! ¿A qué estás esperando aquí parado?", + "Ándate con mucho ojo, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:Por el momento aún eres débil. Si esperas proteger al Briar de La Oscuridad, debes enfrentarte a tus miedos. La carta que encontrarás en este baúl, y en otros como éste, son símbolos de tu desarrollo, luego adquirirlos es absolutamente vital para tu búsqueda.", + "Esa llave jugará también un papel importante en tu búsqueda. Además debes buscar concienzudamente otras llaves. Selecciona el mapa en la pantalla de menú para teletransportarte de vuelta a la entrada del templo, y continúa tu heroica búsqueda.", + "Viaja al Este y al Sur a través de los terrenos del templo... encontrarás un uso para esa llave.", + "¿Qué quieres? ¿Que te lleve a caballito hasta la puerta o qué?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:¡¿Por qué no me escuchas?! ¡Si te precipitas en esto como un idiota, solamente conseguirás poner en peligro al Briar, a La Región, y a todo por lo que he trabajado! Lo siento, Young, pero si no quieres escucharme tendré que convencerte de otra forma...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... Así no es como yo quería que sucedieran las cosas... Yo pretendía que te convirtieras en mejor persona. Pretendía que fueras capaz de ayudar al Briar. Pero todo esto es solo un absurdo juego... No puedo evitar que llegues hasta El Briar. Tan solo recuerda lo que dije cuando todo se vaya al infierno.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Hola, Young. Cuando te conviertas en alguien más fuerte y más sabio, este camino te llevará al Briar.", + "Sage:No estás preparado, Young, primero debes afrontar más pruebas en La Región.", + "Sage:Has hecho progresos, Young, pero debes poseer al menos 36 cartas para pasar a través de esta verja.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... eh... ¿tienes al menos 36 cartas? Pero no estoy seguro de que estés preparado para la verdadera prueba. De hecho, mira, estábamos leyendo mal esta verja, en realidad necesitas...\n...\n........\n¡92 cartas para atravesarla, no 36!", + "Sage:Young, no vayas ahí, ¡aún no estás preparado! ¡Piensa en El Briar! ¡La Región! ¡Todo esto no habrá valido para nada si no estás preparado!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Un trabajo excelente, Young. Tenías que conquistar no sólo este monstruo, ¡¡¡sino también tus propios miedos para prevalecer!!!", + "Sage:Por supuesto, aún te queda un largo camino por recorrer. ¿Has estado explorando La Región?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Bien hecho, Young. Sin embargo, aún quedan pruebas por afrontar. No bajes la guardia.", + "Sage:¿Has escontrado ya todas las llaves, Young? Si no es así, ve a la playa.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "¡No soy como los otros! *ladrido* No te haré daño...", + "Aquí se vive muy tranquilamente.", + "Hueles como a acelga.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "¡Lo hiciste, Young! ¡Derrotaste a La Oscuridad! ¡Mira este sitio! ¡Es precioso!", + "Tan precioso...") + } +, + dump:{ + dialogue:new Array( + "¡Oh, gracias a Dios que estás aquí! Estaba preocupado por si te habías quedado atrapado en ese vertedero todo nevado... ¡Ahí todo es jodidamente deprimente! ¡Ja!", + "Jajaja. Jajajajaja. ¡JAJAJAJAJAJAJA!") + } +, + drink:{ + dialogue:new Array( + "Oye encanto, ¡te invito a un trago!", + "¡Toma otro trago, mierdecilla! ¡Jajaja!") + } +, + hot:{ + dialogue:new Array( + "Joder, qué calor hace aquí... Estoy tan caliente... y sudaaado...", + "¡Maldita sea! ¡Entrenar me pone cachondo!") + } +, + gold:{ + dialogue:new Array( + "¿Sabías que este lugar está hecho de oro? ¡Oro de verdad! ¡Podríamos escapar juntos y vivir de este ladrillo de aquí! ¡Jajajajaja!", + "En serio, ¿qué estás haciendo ahí parado? ¡Ayúdame a levantar este ladrillo!") + } +, + briar:{ + dialogue:new Array( + "???:Young... !Al final lO hiCisTE¡ !ME AHs SalvaDO¡ !!!!!AgoRA ToDo IRa BEIN de NUeVO¡¡¡¡¡") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "¡CUIDADO!", + "Siento eso... Iba demasiado deprisa. Oh, ¡no te había visto nunca antes! ¿Tú también eres un viajero como yo? ... ¿Eh? ¿Que quieres proteger al Briar de La Malvada Oscuridad? ... ^Bien... No tengo ni idea de lo que me hablas, ¡pero suena guay, supongo!", + "Voy de acá para allá, llevando mi género... ¿Qué? No, no soy una vendedora ambulante. ¡Wares(Género)es el nombre de mi bicicleta!", + "Bueno, puede que nos encontremos en otra ocasión. Si oigo lo que sea acerca de ese Briar, te lo haré saber.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "¡CUIDADO! Bien, Wares, ¡vamos allá!", + "Yyyy ¡presto!", + "No pares, Young, ¡nosotros te cubrimos!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "¿Te acuerdas de mí? Olvidé presentarme la última vez, solo te presenté a mi bicicleta, Wares. Mi nombre es Mitra.", + "¿Te acuerdas de mí? Olvidé presentarme la última vez, soy Mitra, y esta joven bicicleta tan bonita se llama Wares.", + "Mitra:¿Y cómo te ha ido, Young? ¿...qué? ¿Que cómo sé tu nombre? Te parece extraño, ¿verdad? Bueno, lo vi en la parte trasera de tu sudadera.", + "Mitra:¡Nos vemos, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Eh, acabo de recordar - alguien dijo que estaban Intentando encontrar algo antes. No estaba segura de a qué se referían, así que dijeron que irían hacia las montañas - salieron corriendo.") + } +, + game_hints:{ + dialogue:new Array( + "Nada.", + "Oh, ¿estás perdido? ¿Te has pasado por la playa? Quizás alguien de por allí pueda ayudarte. Parece que esa llave tuya forme parte de un manojo. ¿Tendrás que encontrar más?", + "Oh, ¿estás perdido? ¿Has mirado en el bosque, hacia el Este? Esa llave que tienes - parece que forma parte de un manojo. ¿Tendrás que encontrar otras?", + "¡Mira todas esas llaves! Creo que vi algunas puertas hacia el Sudeste. ¿Tendrás que usarlas allí?", + "¡Eh, vi que encendiste el molino de viento! ¿Sabes si ha tenido algún efecto en La Región?", + "Eh, Young. ¡Guau! ¡Has estado en verdad reuniendo todas esas cartas! ¿Has descubierto ya para qué sirven? ¡Podrías ganar un pastón vendiéndolas!", + "¿Qué es ese nuevo accesorio que tienes en la escoba? ¿Te permite alterar la estructura del mundo...? La verdad, eso da mucho miedo, Young. Me alegro de que no parezca funcionar en cualquier sitio, quizás solo en los más profundos, extraños recovecos de La Región.", + "¿Qué tal funcionan mis zapatos saltarines? ¿De maravilla, eh? Me están gustando mis nuevos zapatos para ir en bici. ¡Hacen de Wares y de mí un equipo incluso mejor!", + "¡Qué guay, Young, encontraste otra llave! ¡A Wares le gusta el color! ¿Has encontrado ya un lugar donde usarlas?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has buscado bien por el área del templo de El-Que-Todo-Lo-Ve?", + "Mitra:Eh, Young, ¿buscando una carta?\nHe oído que hay un laberinto por la salida trasera del templo de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nQuizás encuentres algo cerca de la guarida de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nHabía una sala repleta de enemigos en el templo de El-Que-Todo-Lo-Ve, ¿me equivoco?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has mirado bien dentro del templo de El-Que-Todo-Lo-Ve?", + "Mitra:Eh, Young, ¿buscando una carta?\nIntenta buscar en el área vestigial cerca de la salida trasera de la guarida de El-Que-Todo-Lo-Ve.", + "Mitra:Eh, Young, ¿buscando una carta?\nPuede que tu vecino sepa algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nEse tipo de tu cuarto estaba escondiendo algo...", + "Mitra:Eh, Young, ¿buscando una carta?\nEn algún lugar cerca de la entrada de tu cuarto...¡mira por allí!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has buscado *por todos lados* en tu cuarto?", + "Mitra:Eh, Young, ¿buscando una carta?\n¡Justo al Sur de aquí hay una isla! No he ido allí, pero deberías inspeccionar el sitio.", + "Mitra:Eh, Young, ¿buscando una carta?\nHay un montón de cosas por descubrir si sigues los ríos. ¡Mira bien!", + "Mitra:Eh, Young, ¿buscando una carta?\nSé que alguien dejó una cerca del molino de viento.", + "Mitra:Eh, Young, ¿buscando una carta?\nMira cerca de los ríos del bosque...", + "Mitra:Eh, Young, ¿buscando una carta?\nFisgonea alrededor de la base de las montañas.", + "Mitra:Eh, Young, ¿buscando una carta?\nIntenta llegas hasta la cumbre de las montañas.", + "Mitra:Eh, Young, ¿buscando una carta?\nEl extremo alejado de la playa puede que guarde algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nDate una vuelta por el bosque carmesí.", + "Mitra:Eh, Young, ¿buscando una carta?\nHabía muchas puertas cerradas con llave en una de esas cuevas rojizas, ¿verdad?", + "Mitra:Eh, Young, ¿buscando una carta?\nVe a la cueva rojiza situada más al norte, ¡comprueba el nacimiento del río!", + "Mitra:Eh, Young, ¿buscando una carta?\nMmm...¿miraste bien por todo ese laberinto oscuro?", + "Mitra:Eh, Young, ¿buscando una carta?\nRecuerdo que había un camino bastante lúgubre de lanzallamas en algún lugar. ¡Algo debe de haber al final del mismo!", + "Mitra:Eh, Young, ¿buscando una carta?\nEsa gente del circo tiene que estar ocultando algo. ¿Miraste por todos lados?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has echado un vistado por el perímetro del gran foso de esa pareja?", + "Mitra:Eh, Young, ¿buscando una carta?\nEsa pareja que gusta tanto de estar por un foso. Deben estar escondiendo algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nAlgunas veces hay cosas escondidas al otro lado de los abismos - ¡especialmente en cuevas montañosas!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has registrado las partes más altas de la cueva montañosa?", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Habrá algo en las profundidades de esa cueva montañosa?", + "Mitra:Eh, Young, ¿buscando una carta?\nEse cubo lleno de colorido que está en ese lugar tan raro - ¡probablemente tenga algo!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Has hablado con el cubo gris de esa zona que parece tan salvaje? Puede que sepa algo.", + "Mitra:Eh, Young, ¿buscando una carta?\nEl último piso de ese hotel está un poco desmoronado, ¡pero seguro que allí hay algo!", + "Mitra:Eh, Young, ¿buscando una carta?\n¿Entraste a todas las habitaciones de la 3ª planta del hotel?", + "Mitra:Eh, Young, ¿buscando una carta?\nApuesto a que alguien dejó algo por ahí tirado en la 2ª planta del hotel.", + "Mitra:Eh, Young, ¿buscando una carta?\n¡El propietario del hotel podría haber dejado algo para ti!", + "Mitra:Eh, Young, ¿buscando una carta?\nEsos puentes rotos allá por el Noroeste...¡mira por allí!", + "¿...Qué? ¿Que no has encontrado *ninguna* carta? Pero hombre, Young, ¿qué locura es esta? Algunas veces en la vida es necesario ser Intrépido, abrir alguna que otra caja, ¿sabes?") + } +, + general_banter:{ + dialogue:new Array( + "¿Encontraste a ese tipo que estaba buscando algo en las montañas?", + "¿Sabes cuál es el apellido de mi bici? ...¡So! ¿Lo pillas? ¡Género So! ...Es broma, las bicicletas no tienen apellidos.", + "¿Crees que debería comprarme un candado? No me gustaría tener que atar a Género así, pero se oye tanto hablar sobre bicicletas robadas estos días...", + "Así que... ¿qué es El Briar? ¿Algún tipo de artefacto antiguo de una cultura perdida?", + "Me pregunto por qué no habré oído nada acerca de la llegada de La Oscuridad. Supongo que mucha gente de la región está concentrada en sus propias luchas diarias.", + "Eh, Young, solo quería decirte que... tu pelo mola un montón.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Estatua:El Anciano del Pueblo sólo en nombre, pues no es ninguno.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Estatua:He visto una escoba en una leyenda... que estaba en el plano del armario de un conserje.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Estatua:Adquirir tarjetas es vital para tu búsqueda. Adquirir tarjetas también es vital para otros fines, como obtener crédito o comprar bebidas alcohólicas.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Estatua:Un trabajo excelente, Sage. ¡¡¡Has tenido que conquistar no sólo tu temperamento sino también tu amor propio para decir algo tan cutre!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Cuando te hayas convertido en un individuo más estresado y apático, este sendero te llevará a los Breyers. ¡Reconfórtate bebiendo, perdedor!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Una vez un hombre vino e instaló un espejo en nuestro cuarto de baño. Yo tenía miedo de que hubiera una cámara oculta dentro de él. Registré cada pulgada del marco de madera, echando Don Limpio en las grietas, creyendo que eso cortocircuitaría los cables. Por supuesto, nunca encontré nada.", + "Edward:Este templo está dedicado a El-Que-Todo-Lo-Ve. No sé por qué he venido aquí, pero tengo demasiado miedo para entrar dentro.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:¿Problemas? Bueno, me imagino. Todo lo que tienes es una escoba, y todo lo que las escobas pueden hacer es mover mugre.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:¿Dices que has vencido a El-Que-Todo-Lo-Ve? Ja. ¿No entiendes que esto no funciona así? Lo único que estás haciendo es echar detergente en las grietas.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, ¿no es una monada? Nuestro querido y joven Young, jugando a ser el héroe. Pero he estado observando cada paso que has dado en \"La Región\", y déjame decirte, Young, que no todo el mundo de por aquí es tan honesto como yo. ¡Ten cuidado en quien confías!") + } +, + after_fight:{ + dialogue:new Array( + "Estaré contigo, Young, siempre que estés solo. Y recuerda mi consejo en tu pequeña \"aventura\".") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Roca:La visión periférica es la colmena de los demonios.") + } +, + two:{ + dialogue:new Array( + "Roca:Por-hacer:Construir un método de teletransporte hasta Nexus. Progreso:Detenido - El-Que-Todo-Lo-Ve no quiere proporcionar los fondos necesarios para hacer posible la empresa. Tendremos que volver al método original del inexplicable portal.") + } +, + three:{ + dialogue:new Array( + "Roca:Estoy atrapado aquí a solas. El trabajo no cesa en este túnel, y al menos puedo ver un poco de progreso cada día.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Este torno se usa para levantar el dique.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 de junio de 1957:Las cuerdas del trapecio se rompen. Alice Rutgers se precipita violentamente al suelo, acabando con dos espinillas rotas.") + } +, + two:{ + dialogue:new Array( + "17 de julio de 1957:Siete payasos se retiran con problemas casi fatales de pulmón. Se sospecha de la marca de cosméticos LANDBLEND, pero ninguna investigación oficial se lleva a cabo.") + } +, + three:{ + dialogue:new Array( + "21 de julio de 1957:Debido a un fallo de la jaula, mi cara y mi costado quedan severamente destrozados por un león indomado. Sobrevivo, pero ahora estremezco al mirar mi propio reflejo.") + } +, + four:{ + dialogue:new Array( + "5 de agosto de 1957:En mi sueño, vi una cara hecha de piedra con fieros, brillantes ojos. Hablaba de la verdad de nuestra existencia y fue el primero en ofrecer la liberación del dolor.") + } +, + five:{ + dialogue:new Array( + "7 de agosto de 1957:¿Cuántos de nosotros sufrirán antes de que aceptemos la verdad de El-Que-Todo-Lo-Ve?") + } +, + six:{ + dialogue:new Array( + "8 de agosto de 1957:He tomado una decisión. Algunos de los otros han dicho que me seguirán. Esta será mi actuación final. Que El-Que-Todo-Lo-Ve tenga consideración por todos nosotros.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Marcas indescifrables)") + } +, + two:{ + dialogue:new Array( + "7 de diciembre de 2010.(nombre ilegible). ¡No hay nada aquí arriba, excepto esta estúpida roca!") + } +, + three:{ + dialogue:new Array( + "¡Peligro! Esta cueva está inexplorada.") + } +, + four:{ + dialogue:new Array( + "Estos precipicios se extienden lejos hacia arriba, aunque nunca he subido lo suficiente como para saber a dónde llevan.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Roca:¿Cómo?") + } +, + two:{ + dialogue:new Array( + "Roca:¡Advertencia! Caída en picado, salte bajo su propio riesgo.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Esta solía ser una animación comodín para las verjas que se abren con cartas. ¡Acércate dos veces para ver las animaciones de cierre y apertura!", + "He olvidado por qué acabamos desechándola. Quizás por demasiado dramática.") + } +, + two:{ + dialogue:new Array( + "¡Aquí hay tests para varias capas de suelos y colisiones! No pude lograr que funcionaran bien los suelos de dirección única desde cada lado(p.ej., muros), así que acabé desechando la idea por completo... creo.", + "Había alguna razón por la que no las usamos. Simplificar diseño, lo cual era importante para nosotros para acabar el juego.") + } +, + three:{ + dialogue:new Array( + "Los enemigos solían ser capaces de soltar llaves. Deseché esta idea pese a que tenía algo de encanto.", + "Otra idea que tanteamos fue la de tener puertas de desafío, las cuales se encontraban tras filas de enemigos, y solo se abrían cuando las alcanzabas sin que te hirieran.", + "Queríamos diseñar todas las mazmorras de esta forma y desechar los puntos de vida por completo, ¡pero resultó ser demasiado difícil!") + } +, + four:{ + dialogue:new Array( + "¡¡¡PRISIÓN!!!", + "¡¡¡Sálvanos!!!", + "¡Por favor!") + } +, + five:{ + dialogue:new Array( + "¡Te damos la bienvenida al MUNDO DEBUG! Has salido fuera de \"La Región\", así que considera este mundo(90 POR-CIENTO)\"No canónico\". En fin.", + "Antes de que hubieran sets de suelos para muchas de las áreas, usaba suelos como estos para marcar dónde iban las puertas. De hecho, cada mazmorra fue modelada con el set de suelos de este área, y luego Marina fue sustituyendo estos suelos por las suyas.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVOS-", + "PROCEDA CON PRECAUCIÓN") + } +, + four:{ + dialogue:new Array( + "Oeste. Fisura. ¡Realidad! Valores de condición bajos y reales, huracán, viejo, acabado. Relajante.") + } +, + three:{ + dialogue:new Array( + "El-Que-Todo-Lo-Ve, por lo que puedo recor- rcrr,,,,,,un Buen Rato En Casa.") + } +, + two:{ + dialogue:new Array( + "LUGAR DE ALMACENAMIENTO EN FRÍO\n\n^ -- LA DIRECCIÓN") + } +, + one:{ + dialogue:new Array( + "CONTINÚA") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Oeste:Playa\n\nEste:Bosque\n\nSudeste:\n Área lluviosa\n\nNorte:\nJardines del templo\n\nNoroeste:Abismo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Oeste:Lago\nSur, luego Este:Precipicios") + } +, + two:{ + dialogue:new Array( + "Estanque de la relajación. Quédate un rato, sabemos que tienes tiempo de sobra.") + } +, + three:{ + dialogue:new Array( + "Me temo que me quedaré atrapado en esta diminuta esquina para siempre.") + } +, + four:{ + dialogue:new Array( + "Este:Precipicios") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "El sendero se abrirá cuando las baldosas de los guardianes oscuros sean reemplazadas por sus respectivos colores espirituales en el tablero de abajo.") + } +, + two:{ + dialogue:new Array( + "Cuando la estatua de piedra azulada se apartó\nUn nuevo sendero fue revelado\nMás allá de los precipicios, atravesando extrañas dimensiones\nSe halla un hotel de viajeros\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién gobierna este abarrotado lugar de negocios?\"\nA pesar de las muchas almas humanas\nAún me siento solo.") + } +, + three:{ + dialogue:new Array( + "La roja y oxidada estatua se movió\nY abrió el camino hacia más profundas fosas\nUna mazmorra laberíntica a continuación\nY después una gran carpa de circo\n\n\n\"¿Quiénes son los guardianes?\" Pregunto,\n\"¿Quiénes renunciaron a la vida para huir de este lugar?\"\nTemo al dolor, al igual que ellos\nPero temo a la muerte más aún.") + } +, + four:{ + dialogue:new Array( + "La verde, metálica estatua se apartó\nAbriendo un sendero más profundo\nHogares suburbanos y aceras forman\nUn camino hacia un apartamento.\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién busca consuelo en las estrellas?\"\nSolo, me siento como si estuviera siendo observado\nY no por la amigable luz de las estrellas.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Roca:Esto es territorio de nadie - ni siquiera de La Región.") + } +, + two:{ + dialogue:new Array( + "Roca:Estos -^ yo y mis^ - círculos son^ - promesas...^ - círculos^ - Intentaré acabarlo todo...^ - concéntricos. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Roca:Ten cuidado^ -...pero yo siempre^ - por dónde pisas^ - ¿consigo reaparecer, no?^ - ¡cuando estés aquí!") + } +, + four:{ + dialogue:new Array( + "Roca:Mirando hacia abajo^ - Y me di cuenta:^ - desde aquí, tú- ^ Lo amo.^ - puedes ver...nada, realmente.") + } +, + five:{ + dialogue:new Array( + "Roca:Mis disculpas -^ Pos claro, -^ por este desorden -^ mantengámonos en contacto-^ pero ese portal debería^ - e Intentaré darte mis opiniones - ^ devolverte a La Región.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "A veces si hablas con la gente varias veces tiene nuevas cosas que decir.", + "Pero no las rocas. Las rocas no hacen eso.") + } +, + two:{ + dialogue:new Array( + "Roca:¡Muy cerca! Si tan solo...") + } +, + three:{ + dialogue:new Array( + "Roca:La curiosidad es algo grande.") + } +, + four:{ + dialogue:new Array( + "Roca:¡Oh!¿..?") + } +, + five:{ + dialogue:new Array( + "El ordenador tiene un e-mail abierto. Partes de la pantalla están rotas, por eso solo algunas partes del mensaje son visibles entre manchas negras. El e-mail pone:\"¡Hola, Young!\" Parece que [...] quincuagésima carta [...] quizá no deberías... [...] la pena pensárselo! ¿Crees que estás listo? Despierta...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Roca:Apuesto a que estás leyendo una roca porque no tienes amigos.") + } +, + two:{ + dialogue:new Array( + "Roca:Bienvenido a la estación del Mundo. Esperamos que haya disfrutado de su estancia en La Región.") + } +, + three:{ + dialogue:new Array( + "Roca:¡Eres todo un explorador!", + "Roca:Por favor, no vayas al Sur. Está en construcción.") + } +, + four:{ + dialogue:new Array( + "Roca:¡Tesoro en 5,3!") + } +, + five:{ + dialogue:new Array( + "Roca:Jaja, ¡te pillé!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NACEMOS ENTRE LA DESCOMPOSICIÓN DEL CUERPO DE NUESTRA MADRE") + } +, + two:{ + dialogue:new Array( + "UN DÍA NUESTRA MADRE DEJÓ A SU MADRE Y SE AVENTURÓ EN LA NIEBLA VENENOSA.") + } +, + three:{ + dialogue:new Array( + "NUNCA PEDIMOS ESTO. NO HABRÍAMOS COMPRADO NUESTRAS VIDAS CON SU SUFRIMIENTO.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Roca:Las señales indican que los árboles no han estado activos por un largo periodo de tiempo.") + } +, + two:{ + dialogue:new Array( + "Roca:Sur:???^ Norte:???") + } +, + three:{ + dialogue:new Array( + "Roca:Se dice que el terreno irregular ha sido formado por los ancestros de los habiantes del área.") + } +, + four:{ + dialogue:new Array( + "Roca:Parecen una especie apacible.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Garabateado con lo que parece un rotulador permanente:Saludos, compañero viajero del ESPACIO y TIEMPO. Te has adentrado en una grieta muy lejos del área yuxtapuesta de YOUNG. Digamos que has cruzado como un OCÉANO o dos. No te preocupes por el CONTRASTE, podrás volver a tu aventura normal en breve. No TEMAS este lugar, aunque parezca FATÍDICO y PELIGROSO descubrirás que sus habitantes son bastante SIMPÁTICOS.\n -- La Dirección", + "(Bajo el mensaje, un grabado:)Aquí yace ____(ilegible). Se extravió en los bosques.", + "(Aún más abajo del mensaje:)(no vayas muy al Sur.)") + } +, + two:{ + dialogue:new Array( + "Aquí yace ____(ilegible. ¿Quién ha escrito esto?). ¡Fue empalado por arcoíris!", + "Habría sido mejor con logros.") + } +, + three:{ + dialogue:new Array( + "Aquí yace Burd. Los precipicios no fueron muy agradables que digamos.") + } +, + four:{ + dialogue:new Array( + "Aquí yace bolsa. Nunca tuvo oportunidad.", + "¡Pretencioso!") + } +, + five:{ + dialogue:new Array( + "Aquí yace Savitch. Intentó arreglar mi ordenador en el garaje una vez, y no cogió mucho espacio mientras. Tres años después, aún no había terminado. Entonces, cayó muerto.") + } +, + six:{ + dialogue:new Array( + "Aquí yace Dave. No era muy inspirador.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---YOUNG TOWN(CIUDAD JOVEN)---^\nBienvenido a Young Town. Por favor, tenga cuidado con algunos de los ciudadanos. No son muy sociables...camine con precaución. Young Town fue fundada en los 90 por el alcalde Ying como parte de una serie de continuos proyectos de ingeniería civil, cuyo nombre fue elegido como muestra del rechazo de Ying de poseer el nombre Ying, y el beneplácito de poseer el nombre Young. Esperamos que disfrute de su estancia.") + } +, + two:{ + dialogue:new Array( + "Al Oeste se encuentran los legendarios templos de El-Que-Todo-Lo-Ve. Al Este se encuentra la vivienda de nuestro maravilloso alcalde Ying, que permanece cerrada al público - quedan advertidos.") + } +, + three:{ + dialogue:new Array( + "En su quinta visita, el alcalde Ying se frustró por la falta de aparcamientos. Este aparcamiento refleja la frustración de Ying por la falta de aparcamientos. Ying aparcaría ocasionalmente en este aparcamiento en subsiguientes visitas.") + } +, + four:{ + dialogue:new Array( + "Recuerdo las largas frases que solía escribir. ¡Ja! Fragmentado.") + } +, + five:{ + dialogue:new Array( + "UNA SITUACIÓN PELIGROSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "El-Que-Todo-Lo-Ve lo sabe todo y llevará a uno a la iluminación. El camino a la iluminación no está iluminado por ninguna antorcha.") + } +, + two:{ + dialogue:new Array( + "No te apartes del camino de El-Que-Todo-Lo-Ve, ni siquiera por los tesoros que aguardan en las esquinas lejanas del laberinto.") + } +, + three:{ + dialogue:new Array( + "Muévete.") + } +, + four:{ + dialogue:new Array( + "No hagas enfadar a los Acosadores con violencia.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "LUGAR CONOCIDO:La Pareja de Torres. Construidas hace algún tiempo, la Pareja de Torres tiene vistas a las montañas lejanas. La primera torre fue dañada hace poco y desde entonces le ha sido asignada otro uso. La segunda está plantada al Este, rozando el cielo. Debido a asuntos de seguridad, el sendero hacia la torre ha sido vedado hasta nuevo aviso.") + } +, + two:{ + dialogue:new Array( + "AVISO DE SEGURIDAD PÚBLICA:^\nEsta torre, cuando no estaba dañada, decíase poseer una brecha dimensional en lo alto de la misma. Proceda con precaución y una mente abierta.^\n -- La Dirección") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "No parece que la estatua vaya a moverse en breve.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Parece que esta estatua permanece firme en su lugar.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Esta estatua no parece que sea movible.") + } +, + two:{ + dialogue:new Array( + "La estatua se ha movido.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Qué bonito es el fuego, ¿verdad? Qué lástima que la deslumbrante luz de las farolas eclipse el fuego de las estrellas.") + } +, + after_fight:{ + dialogue:new Array( + "Vale, pues las estrellas no están hechas de fuego. ^De todas formas, ¿a quién coño le importa?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "¿Qué tal estás hoy? Soy el soberano de esta partición e Interpretación del espacio.", + "¿Quieres saber por qué soy el soberano de este lugar? Te lo diré, pero va a llevarnos un rato. Un buen rato. Un aborrecible y largo rato.", + "En serio, bastante rato. No, de verdad, ¡te estoy advirtiendo! Tiendo a divagar. Quizá sería mejor que te pusieras a vaciar el contenido de ese baúl de ahí. O que te dirigieras al hotel de más allá. No sé cómo llegó hasta ahí, he oído que tienen precios relativamente bajos. No es que el dinero importe aquí.", + "¿Que por qué soy el soberano?^...No estoy seguro del porqué, pero mis amigos de por aquí vieron apropiado asignarme este cargo, debido al estado apremiante de este espacio. Quizá esta sea la causa de que los cubos sean los mejores en permanecer quietos en superficies planas. En cuanto a por qué alguien necesita estar sentado aquí arriba - ¡eso es algo que me supera!", + "Los otros - mis amigos de por ahí - tienen sus propios méritos. No es que no puedan sentarse aquí arriba en un futuro, solo que no pueden hacerlo ahora. A veces nos turnamos para ocupar el puesto de gobernante, ¡pero cada vez tenemos que reinterpretar esta región del espacio! Puede ocurrir que el Sr. o la Sra. Pirámide vengan aquí arriba porque hayamos decidido darle al trono una forma tal que se adecúe mejor a ellos, reimaginando este mundo, por decirlo de alguna forma. ¿Parece estúpido? Podría ser. Pero así es como es. Sucede bastante rápido. Minutos, horas - no necesariamente un largo reinado.", + "Aunque, cuando soy el gobernante, me siento un tanto extraño...Me siento aislado de alguna forma, evitando relacionarme con los demás...", + "...pero aislamiento no es la palabra correcta, aunque abarca parte de la sensación. No estoy aislado, y no me disgustan los demás. Todos nos consideramos amigos, pero ya sabes, nadie sube aquí arriba excepto para decir unas palabras. ¡Así que tengo que pensar sobre cosas o puedo volverme loco! Tal vez eso sea parte del aislamiento.", + "Fuera de esas preguntas sin sentido sobre *por qué* estamos aquí ocupando este espacio, siento curiosidad por saber por qué somos amigos siquiera.", + "Me gusta pensar que siempre que estamos bajo las Interpretaciones para las cuales soy el mejor para gobernar, me alientan a ser capaz de mantener esta posición tanto como se tarde en alcanzar la siguiente Interpretación. Ya sabes, ánimos y tal, su presencia física, ese tipo de cosas son reconfortantes.", + "Supongo que eso es suficiente para satisfacerme, aunque sería genial que uno o dos probaran y entendieran cómo me siento sobre ser un gobernante. ¡No es que me esté quejando sobre los ánimos! Pero quizá entonces podríamos tener varios gobernantes...¡qué desvarío! Tal vez eso implique que cuando no sea gobernante deba actuar de la misma forma en la que a veces deseo que ellos actuaran...quién sabe si eso se puede hacer.", + "Ya he divagado demasiado. Si te diriges hacia allá, hay otra región del espacio similar, aunque creo que huele un poco distinto.", + "Un placer haberte conocido.", + "Oh, ¿quieres escuchar mi historia de nuevo?", + "Muy bien, ponte cómodo.") + } +, + gray:{ + dialogue:new Array( + "Qué tal. Soy el soberano de esta parte del espacio.", + "¿Cómo está la cosa? ¿Que quieres saber por qué estoy aquí? ¿Estás seguro? ¡Me llevará bastante explicar por qué!", + "Bien, si insistes. Aunque quizá sería mejor que te dirigieras a ese hotel de ahí. No sé por qué siguieron adelante con su construcción. ¡Si tuviera que pagar impuestos, seguro que me quejaría!", + "Bueno, aunque sea el gobernante de esta parte del espacio, realmente no estoy gobernando sobre nadie.", + "Mis amigos - todos son gobernantes de sus propias partes del espacio. No gobiernan sobre nadie tampoco - estamos solos en ese aspecto. Pero no estamos solos en tanto que hablamos entre nosotros, ni tampoco estamos solos en otros aspectos. Este es solo un lugar en el que existo.", + "Mis amigos y yo - nuestras partes del espacio tienen mucho en común con las suyas en tanto a por qué existen y cómo están organizadas. Intereses y deseos similares, y ese tipo de cosas. Nos encanta hablar sobre cómo gobernar y demás.", + "Pero lo triste es que raramente, si alguna vez se da el caso siquiera, alcanzamos a encontrarnos en persona.", + "Así que en realidad no hablas con sus formas físicas, sino con un tipo de representación holográfica suya.", + "Lo sé, es una lástima. Es una lástima porque tenemos tanto en común, pero tan solo podemos ayudarnos como amigos.", + "Es una pequeña cosa que echas en falta cuando no puedes tener una conversación cara a cara todo el tiempo.", + "Pero no me estoy quejando. ¡Eso es mejor que nada en absoluto! No puedo ni imaginar cómo seria de otra forma. Algo terrible.", + "Ha estado bien hablar contigo, buena suerte con lo que sea que estés haciendo.", + "¿Aún estás aquí? Puedo contártelo todo de nuevo, si quieres.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:¡Hey, tú, abusón! ¡No te tengo miedo!", + "Crickson:¡Cabeza hueca! ¡No voy a salir corriendo! ¡Ni siquiera si Intentas darme una buena!", + "Crickson:Tan solo eres un idiota de mierda, ¡eso es lo que eres! ¡Deberías avergonzarte de ti mismo!") + } +, + thorax:{ + dialogue:new Array( + "Tórax:Soy el tórax, y hablo en nombre de las abejas.\n^¡Su destino es incierto, ciertamente!\n^¡En algunas colonias todas las obreras se han ido!\n^Estas colonias morirán, ¡y no es que eso sea algo agradable de ver!", + "Tórax:Quizá sea un virus o un nuevo pesticida,\n^¡quizá sean las larvas de esos asquerosos fóridos!\n^Está haciendo que todas las abejas actúen de un modo muy extraño.\n^¡Sea lo que sea, es preciso que cambie!", + "Tórax:Vale, no sé qué está pasando realmente\n^Me preocupa que mis esfuerzos sean nada más que cháchara.\n^¿Pero cómo voy a quedarme de brazos cruzados?\n^¡Voy a escribirlo en Facebook, Twitter y Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Cómprame algo") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente!", + "¡No voy a soltarla! ¡Ni en un millón de años!") + } +, + inside:{ + dialogue:new Array( + "Oh, ¿viniste aquí para aterrorizarme más aún?", + "Estás de parte de los gatos solo porque son monos y peludos.") + } +, + etc:{ + dialogue:new Array( + "¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente!^ ¡Hostia!^ ¿Eso es--?^ ¿¿¿OTRO GATO???^ ¡¡¡LA MADRE QUE...!!!", + "Has... has limpiado mi casa... ¡Eso me ha llegado al alma! ¡Toma, quiero darte mi más preciada pertenencia!", + "Young toma y abre la caja. ¡Hay algo dentro de ella!", + "Icky:Oh. Hey Miao.^\n\nMiao:¡Me alegro tanto de que estés bien!^\n\nIcky:Uh... gracias por la ayuda, Young.", + "Icky:Si te soy sincero, meterme en cajas es algo que me gusta.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "¡¡Oh!! ¡¡¡Tú eres Young, El Elegido!!! Odiosmio, ¡qué gran honor! Mi nombre es Miao Xiao Tuan Er, aspirante a Elegido!", + "¿Puedo seguirte un ratillo para ver a un Elegido en acción?", + "¡Hola de nuevo, Young! ¿Puedo seguirte hoy?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Eh, Young... ¿alguna vez has robado algo?", + "Miao:Me gusta Mitra... ¿y no te parece que Género es una bicicleta muy bonita?", + "Miao:¿Qué es esa cosa de piedra tan chula, Young? ¡¿Hace que puedas volver atrás en el tiempo?!", + "Miao:Me estoy empezando a preocupar por Icky... Young, ¿has visto un gato grande merodeando por ahí recientemente? Lo último que Icky dijo fue que iba a dar una vuelta cerca del pequeño bosque que está yendo hacia el Este.", + "Miao:Icky dijo que no debería ir donde no es seguro. Te veo luego, Young.", + "Miao:¿Alguna vez te has sentado encima de un montón de bolsas de la compra?", + "Miao:Eh Young, ¿crees que sería buena idea plantar menta de gato?", + "Miao:Apuesto a que te ha llevado mucho trabajo convertirte en El Elegido, ¿eh, Young?") + } +, + philosophy:{ + dialogue:new Array( + "Esa espantosa situación con Icky me ha hecho pensar... ¿Qué crees que ocurre después de que muramos? ¿Cómo podríamos cualquiera de nosotros cumplir nuestro propósito en lo que abarca una vida?", + "Puede que nos reencarnemos una y otra vez hasta que cumplamos nuestro destino. ¿O eso sería poner las cosas demasiado fáciles?", + "¿Y cuál es nuestra recompensa por completar nuestro trayecto? ¿Simplemente desaparecemos?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Hola, Young.", + "Mi nombre no es Icky en realidad. Es Ichabod.", + "Espero que Miao Xiao Tuan Er no te haya causado muchos problemas.", + "Te veo luego, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Hola, ¿qué tal? ¡Me has encontrado! Voy a quedarme aquí, fuera hace frío.", + "¡Yo soy el culpable de todas esas terribles salas! Las hice con el editor de mapas DAME.", + "¡He hecho este juego con FlashDevelop IDE y el framework Flixel AS3!", + "Ah sí, e hice la música usando REAPER DAW. Y algunas veces Audacity.", + "En realidad me nutro de la radiación de todos estos ordenadores... ^¿qué quieres decir con que eso no es biologicamente acertado?", + "¡Hola mamá! ^¡y papá!", + "¿Queréis saber cómo pasaros el juego en 20 minutos?", + "¡Ja! ¡Como si os lo fuera a decir!", + "(...quizá si me lo pedís amablemente...)") + } +, + marina:{ + dialogue:new Array( + "¡Eh wow!", + "¡He escrito un montón de diálogos para este juego!^(...pero no este diálogo. Melos lo está haciendo.)", + "¡He usado Adobe Photoshop CS5, Graphics Gale Free Edition y la Herramienta de Recorte de Windows 7 para hacer el arte!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "Esta humedad es buena para tu piel, pero mala para tu pelo.", + "Me gusta quedarme aquí. Ahora la gente pasa el verano entero yendo de acá para allá cambiando entre un calor sofocante y un aire acondicionado glacial. Esos cambios tan rápidos de temperatura debilitan los huesos.", + "Es como esa manía tan fea de masticar los cubitos de hielo. Mi madre lo hacía cuando iba hacia los 30. Ahora tiene pequeñas grietas por todos los molares.") + } +, + second:{ + dialogue:new Array( + "Asegúrate de cambiarte las zapatillas y envolverlas en hojas de periódico para secarlas bien. No vaya a ser que se conviertan en un nido de bacterias.", + "¿Por qué en todos los buffets hay solamente gelatina ROJA? Es como si quisieran que desarrolláramos cáncer.") + } +, + bomb:{ + dialogue:new Array( + "Apártate de mí.", + "Te lo digo en serio... déjame a solas ya.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "No necesito tu compasión, Young.", + "Venga, continúa viviendo en tu feliz mundillo, \"Elegido\"...", + "Sabes, Young, la amistad es simplemente una mentira que la gente se cree. Todos somos unos gilipollas, y al final, todos estamos solos.", + "Ja, sabía que me odiarías, Young.", + "Estoy bien.", + "Por supuesto que no te importa, a nadie le importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "Sé que las ciudades son sucias, están llenas de gente y todo eso, pero me gusta salir aquí fuera y observar todas estas luces.", + "Es bonito a su manera. No es tan infinito como las estrellas, pero hay algo sobre su humanidad que añade una capa de complejidad maravillosa.", + "Detrás de cada luz hay una persona con esperanzas y miedos y secretos... observar es tan espantosamente solitario como tremendamente personal.", + "Creo que amo cada persona tras cada ventana. Os amo, gente, por ser mis estrellas. Os amo sin importar cómo de jodida sea vuestra vida ni cuán hondo creáis haber caído. Esta noche sois encantadores...", + "Lo siento, estoy diciendo tonterías. Gracias por escuchar.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eeehh, tíiioo...descansa, quédate un raaato, ¿sí?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "¡Ah! ¡Me encontraste!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:¿Te golpeó alguna roca mientras subías? Algunas veces lanzo rocas cuando estoy furioso. Lo siento si te di.", + "Golem:Mi madre siempre decía que si seguía haciéndolo, no quedaría montaña que lanzar. Antes de eso ya chocheaba.") + } +, + second:{ + dialogue:new Array( + "Golem:Cuando eres una roca, ves muchas generaciones de gente ir y venir. Te vuelves más anciano y sabio que el más sabio entre los hombres.", + "Golem:Al menos, esa es la idea. Rompí mis prismáticos hace poco, así que no sabría decirte qué ha ocurrido desde entonces.", + "Golem:En realidad, no echo mucho de menos observar a la gente, es un aburrimiento.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh, sí, me encontré con alguien que parecía algo perdido...me dijeron que partían hacia la playa a echar un vistazo.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "No soy una langosta, soy un langostino. De nombre Hews.", + "Hews:¿Sabes qué es lo mejor del océano? Que puedes ver el horizonte.", + "Hews:El océano es como una probadita salada de infinito.", + "Hews:Una playa abarrotada pierde su encanto.") + } +, + second:{ + dialogue:new Array( + "Hews:¿Has oído hablar de la langosta mantis? Tiene 16 fotoreceptores que le permiten percibir luz ultravioleta. ¿Te imaginas ver un rango de colores más ancho?", + "Hews:Eso estaría muy bien. Pero vaya, ya hemos encontrado muchísimas formas de odiarnos por los colores que tenemos.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Así que estás buscando a alguien, ¿eh? Recuerdo que yo estaba sentado aquí cuando unas pocas nubes taparon el Sol. Entonces, alguien se me acercó y me preguntó dónde estaba algo. No recuerdo qué era, pero la persona salió corriendo, diciendo que se dirigían hacia el bosque.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Las bayas son un buen tipo de comida. Me gustan las bayas.", + "James:Por favor, ten cuidado de no defecar en las bayas.", + "James:Hasta ahora he tenido relaciones sexuales 18 veces durante esta estación. Y me he comido 389 zarpadas de bayas.", + "James:¿Tienes algo de bayas para James?") + } +, + second:{ + dialogue:new Array( + "James:He escrito un poema:\n^Me gusta comer bayas\n^Me ponen de muy buen humor\n^¿Que cuánto me gustan las bayas?\n^¡Me las como por puro amor!", + "James:¿Cuáles te gustan más? ¿Los arándanos o las frambuesas?", + "James:¿Tienes algo de bayas para James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Alguien vino. No querían bayas. Fueron a la zona Sudeste del lago que está yendo hacia al Oeste.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olive:Hola, soy Olive la coneja.", + "Olive:¡Me quedan muchos cereales por comer! Adoro los cereales.", + "Olive:La caja es tan grande. ¡Nunca se acaba!", + "Olive:¡Los cereales del nunca acabar!", + "Olive:Hmmm...quizá eso no sea tan malo.") + } +, + bush:{ + dialogue:new Array( + "Rank:Ejejej, ¡qué tonto este Young! ¡Una escoba no es para cortar arbustos!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:Me gano la vida podando arbustos. ¡A veces encuentro oro! ¡Ejejej!", + "Rank:La economía ha pegado muy duramente bajo este arbusto...", + "Rank:A veces es duro mantener a la mujer y a los niños cortando arbustos--no siempre tenemos suficiente comida...¡pero siempre hemos tenido un buen fuego! ¡Ejejej!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:¿Qué? ¡Sí! Alguien vino. Dijeron que se dirigían a un laberinto subterráneo...Apuesto a que allí hay muchos arbustos, ¿eh Young?") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Oh, hola, ¿qué tal te encuentras?", + "Marvin:¿Dónde está Justin?", + "Marvin:Por aquí no hay ninguna oreja de ese tal Van Gogh") + } +, + chikapu:{ + dialogue:new Array( + "¡Chika Chi!", + "¡¡Chika Chika!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:A Bob el hámster le gusta referirse a sí mismo en tercera persona.", + "Bob:Los apóstrofos son la raíz de todo ma'l.", + "Bob:¡Quieto! Estoy ocupado rezumando un aura de ambiente hamsteril.", + "Bob:... Supongo que mejoras en algo si lo haces repetidas veces... Pero... si haces algo mal, ¿lo que harás no será mejorar en hacer algo mal?", + "Bob:Un hombre de verdad nunca llora... bueno, quizá se le escapa una lagrimilla por el rabillo del ojo, deslizándose por su cara acostumbrada al Sol, mientras monta su mala malota Harley a través del venteado desierto de Mojave no llevando ni casco ni gafas protectoras. Pero él nunca llora.", + "Bob:Este juego fue creado por un infinito número de monos trabajando en un infinito número de máquinas de escribir.", + "Bob:Echo de menos a James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:¡El curry es amarillo y picante!", + "Kuribu:¡Para el oponente Inteligente, incremento de daño!", + "Kuribu:¡Conseguiste la experiencia de 2!", + "Kuribu:¡Te digo mi número de teléfono! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "¿Que qué ESTOY haciendo aquí? ¡Buena pregunta! Acabo de dar con este sitio. Estoy escondiéndome. Este lugar es seguro, si no te aventuras muy lejos y dejas que esos tipos te cojan.", + "Parece que soy relativamente afortunado. Todos esos muertos desparramados a lo largo y ancho del lugar - ¿cómo murieron? Es un tanto fascinante, divagar sobre cómo ocurrió. ¿Fueron atacados por los monstruos? ¿Tropezaron y cayeron en los pinchos?", + "Es un poco macabro. Espero que no me pase a mi. El dolor físico es una perspectiva terrible.") + } +, + quest_event:{ + dialogue:new Array( + "Ah...ahora que lo pienso, una persona pasó por aquí hace un rato. Dijeron que estaban buscando algo... ¡incluso se parecían un poco a ti! No recuerdo cuando, lo siento. Es difícil adivinar la hora aquí. Pero dijeron que tenían pensado ir a una ciudad de por aquí cerca.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Hola.", + "¿Estás buscando algo?", + "¿Qué estás mirando?", + "No, no soy un ciudadano de esta ciudad. Lo que es extraño es que puedes verme y hablar conmigo, pero no puedo Interactuar con ninguno de ellos. Todos esos asesinos andan por ahí sueltos, y nadie parece darse cuenta. Es extraño.") + } +, + quest_event:{ + dialogue:new Array( + "Sí. Vi una persona acercarse. Estaban buscando algo. No sé dónde podría estar ese 'algo' que buscaban. La persona salió disparada. Dijo que necesitaban ir a un area alternativa del espacio. Suena Interesante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "SOOOO SOOOO - - - ¿ ¿ ¿ QUIÉN ERES TÚ ? ? ?", + "SOY UN VAGABUNDO . . . ESTA ES UNA DE LAS ÁREAS DE DESCANSO MÁS POPULARES ENTRE EL TRAYECTO DESDE A HASTA B.", + "¿ ¿ ¿ QUE QUÉ ES 'A' ? ? ? ES MI CIUDAD NATAL . . . VOY A VISITAR A UN VIEJO AMIGO EN B . . . ES UN LARGO RECORRIDO . . . PERO YO HAGO SACRIFICIOS . . . ¿ ¿ ¿ TÚ NO ? ? ? ¡ ¡ ¡ HACE QUE LA VIDA SEA MÁS EXCITANTE ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - BUSCANDO A OTRO HUMANO - - - YA VEO . ^ DEJA QUE ACCEDA A MI MEMORIA . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n AJÁ . . . \N LA PERSONA TUVO UNA REVELACIÓN Y DIJO QUE SE DIRIGÍAN HACIA UN COBERTIZO EN ALGÚN CAMPO BIEN CUIDADO. \n AHORA QUE LO PIENSO . . . ¡ ¡ ¡ TE PARECES MUCHO A ELLOS ! ! ! ¿ ¿ ESTÁS SEGURO DE QUE NO ERAS TÚ ? ? ¿EH? ¿ MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "En realidad estabas...uh, ah. Bien hecho.", + "La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella:\"Rápido, antes de que me tenga que ir de nuevo(Esto se está iluminando cada vez más por momentos, siempre sucede)- la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera Intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\"") + } +, + quest_event:{ + dialogue:new Array( + "La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella:\"Rápido, antes de que me tenga que ir de nuevo(Esto se está iluminando cada vez más por momentos, siempre sucede)- la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera Intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "HOLA. ¿HAS CONOCIDO A cubo YA?", + "cubo ES UN MUY BUEN GOBERNANTE DE ESTA PORCIÓN DEL ESPACIO. LOS OTROS GOBERNANTES LO HACEMOS LO MEJOR QUE PODEMOS EN NUESTROS ESPACIOS TAMBIÉN.") + } +, + gray2:{ + dialogue:new Array( + "¿QUÉ OPINAS DE ESTE TROZO DE ESPACIO? ¿ES UN BUEN PUNTO EN EL CAMINO, NO?", + "¡UNA INTERSECCIÓN DE MUNDOS!") + } +, + gray3:{ + dialogue:new Array( + "NINGUNA DE LAS PIRÁMIDES GRISES ESTAMOS REALMENTE AQUÍ. USAMOS DISPOSITIVOS ESPECIALES QUE NOS PERMITEN PROYECTARNOS AQUÍ.", + "¿QUE POR QUÉ HACEMOS ESO? PORQUE QUEREMOS HABLAR CON NUESTRO AMIGO cubo Y HACERLE COMPAÑÍA.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...¿EL DISPOSITIVO HOLOGRÁFICO ESTÁ FUNCIONANDO CORRECTAMENTE?", + "¿NO?^...^¡MALDITA SEA!") + } +, + color1:{ + dialogue:new Array( + "¿Has conocido a CUBO? ¡Hace cosas muy molonas! He oído que una vez se apoyó sobre un borde durante casi doce segundos. ¡Guau tío! ¿Sabes lo que eso significa para la Liga de los Apoyadores Sobre Bordes? ¿No? ¡Bueno, pues mucho!") + } +, + color2:{ + dialogue:new Array( + "¡CUBO hace un trabajo muy Interesantes!", + "¿Te has enterado? ¡Parece ser que pronto llegará mi turno para gobernar! En tan solo unos minutos, creo.") + } +, + color3:{ + dialogue:new Array( + "Soy de Barra de Azúcar, de camino a Taipei. ¿Que por qué estoy aquí? ¡Oh, he parado para decir hola a CUBO!", + "¡No mires tanto abajo! Este lugar es simplemente una rara representación para no conmocionar a todos los visitantes. Es mayormente inofensiva, por lo que sabemos.") + } +, + colordead:{ + dialogue:new Array( + "(¿...está echándose una siesta?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "CADA GENERACIÓN NACE DEL DOLOR PARA MORIR EN DOLOR. NO SUFRIREMOS PARA REPRODUCIR EL CICLO. NO SALDREMOS FUERA.") + } +, + after_fight:{ + dialogue:new Array( + "¿ES ESTE TU CASTIGO POR NUESTRA REBELIÓN?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "¿Por qué privas a El-Que-Todo-Lo-Ve de sus sacrificios? ¿Por qué nos has arrebatado nuestra salvación?") + } +, + after_fight:{ + dialogue:new Array( + "...Hemos fallado en hacerte pagar por tu Intromisión. Y aun así... nos has devuelto nuestra oportunidad para ser libres. Gracias, Young. Que El-Que-Todo-Lo-Ve tenga consideración por ti una vez más.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Qué bueno verte, Yang. Ha pasado mucho tiempo. Veo que aún sigues jugando a esas nentendos, ¿eh?") + } +, + after_fight:{ + dialogue:new Array( + "Por el amor de Dios, Yon, ¿cúando vas a madurar? ¿Sabes? Vas a tener que aprender a tratar con gente tarde o temprano.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Aquí disponemos de los mejores servicios. ¿Cómo le gustaría la Piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "¿Le apetece una sesión en nuestro gimnasio de última generación?") + } +, + after_fight:{ + dialogue:new Array( + "¡Esperamos que haya disfrutado de su estancia!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Hoy es un buen día.", + "Gracias por rascarme ese picor en la nuca - No lograba alcanzarlo.", + "He oído que los huevos del restaurante de la zona están bastante buenos. Además tengo un cupón para ellos.", + "¿Viste el accidente de automóvil de hoy? ¡Qué horror! Estaba chateando. ¡Qué lástima, tan joven!", + "Mi hijo no ha conseguido entrar al equipo juvenil de la universidad. Qué decepción. Invertimos mucho en su carrera deportiva.", + "Hoy es el día de acción de gracias. Estoy agradecido por muchas cosas. No veo el momento de que llegue mañana para ir a las rebajas matutinas. Voy a pillar gangas a cascoporro.", + "Ah, quizás llegue tarde al trabajo.", + "Tengo un poco de prisa por llegar a casa, necesito limpiarlo todo antes de que vengan los suegros.", + "¡Estamos vendiendo objetos usados en el garaje!", + "¡Bienvenido!") + } +, + words_teen:{ + dialogue:new Array( + "No vi la última película.") + } +, + words_kid:{ + dialogue:new Array( + "¡Nunca debo ver los nuevos dibujos animados!") + } +, + family:{ + dialogue:new Array( + "¡Bienvenido a nuestra casa, forastero! Tu cara me suena. Este es un pueblo tranquilo. Bastante tranquilo, sin muchos visitantes.", + "¿Te gusta Davement? ¡Mi hermano Dave me ha enseñado esta canción tan molona suya!") + } +, + older_kid:{ + dialogue:new Array( + "A mis amigos les gusta escuchar esa canción de 'Rayhead' llamada 'None Surprises' y quejarse de este lugar. A ver, sí, es un poco aburrido, ¡pero joder, al menos muestra un poco de gratitud! ¡O haz algo para cambiarlo! Son todos unos...oh, perdona. Tiendo a hacer eso a veces...", + "Creo que iré a escribir en mi blog y ya.", + "Parece que estás atontado, en serio.", + "Me cuesta oír mis pensamientos cuando dan deportes y tal en la tele, pero a mis padres les gusta.") + } +, + hanged:{ + dialogue:new Array( + "Una nota sobre el cadáver:\"No me pondré otra vez en peligro.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, ¿están haciendo algo ahí fuera? ¿Un festival? ¿Un desfile?", + "¡Parece que hay bastante alboroto ahí fuera! ¿Has mirado por la ventana? Me pregunto qué será.") + } +, + paranoid:{ + dialogue:new Array( + "Mi casa tiene muchas ventanas. No me gustan las ventanas. Es como si alguien estuviera siempre mirando dentro. Y sabes que algo DEBE estar pasando ahí fuera. No puede ser que esté todo tan quieto siempre, tan callado y tranquilo - eso me inquieta.", + "¿Asesinos? ¿Qué? ¿En la calle? ¿De qué estás hablando? ¿Estás tomándome el pelo? Nunca antes ha habido ningún asesinato en este pueblo, pero aun así...estás haciendo que empiece a preocuparme...quizá sea mejor que te vayas.", + "Por favor, vete.") + } +, + dead:{ + dialogue:new Array( + "El cuerpo de esta mujer ha sido golpeado hasta la muerte por un arma contundente.", + "El hombre, francamente, pues...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "¡Oh, eres tú! Tu cara me suena...No puedo moverme hasta que sigas matando a más de estos ciudadanos, ¿recuerdas? Vuelve en un rato.", + "Según este panfleto...¡solo necesitas matar unas cuantas personas más! Sigue así.", + "Solo necesitamos otro cuerpo más, y ya podremos continuar.", + "Bien hecho. Entra si quieres. No tengo ni idea de lo que habrá. Te veré de nuevo mañana a la misma hora, ¿vale? ¿O la noche siguiente?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "No me importa ser observado por los árboles.", + "¡¿Dónde está ella?!", + "Estaré contigo, Young, siempre que estés solo.", + "¿Eres un Ookchot? Mi mamá siempre me advirtió sobre el Peligroso Ookchot.", + "¡Gominhola, Young! ¡Entartado de haberte conocido flanmente! Pareces abatido, ¿por qué no te quesadas un rato? ¡No tartaré en servir el té!", + "Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Presbiterio, Púlpito, Altar, Vidrieras de colores...", + "¡Oferta por tiempo limitado! Compra una, y llévate otra gratis - ¡solo hoy!", + "¿Te acuerdas de esa vez que encendiste una vela cuando se fue la luz?", + "Mmmm, se estaba bien en tu almohada esta pasada noche.", + "Esto les enseñará a no llamarme más el fumi-GAY-dor.", + "Género y yo hacemos un buen equipo.", + "¡¡¡Soy el aspirante a Elegido!!!", + "¿A veces no te sientes como si, hagas lo que hagas, no pudieras evitar que el mundo se fuera muriendo?", + "Ten cuidado con las setas del bosque...", + "Lo siento. Es mi naturaleza.", + "¿¿Qué quieres decir con 'Solo una roca'?? ¡¿Las rocas también podemos aparecer en cartas, sabes?!", + "Dale a un hombre un pez y comerá por un día. Enseña a un hombre a pescar, y pasará ratos felices con su hijo Jimmy.", + "A veces la respuesta es dar un paseo.", + "¿Por qué los murciélagos pasan volando siempre que estás cerca?", + "¡NO, *TÚ* NECESITAS APARATO!", + "¿YA ESTÁS CONTENTO?", + "No te me pongas violento.", + "Siempre he querido estar en Iron Chef.", + "Mi mamá siempre me decía, '¡Si te doblas mucho, tu espalda se quedará así para siempre!'", + "¿Te has divertido, humano?", + "...", + "Científicamente hablando, los sapos son una subespecie de las ranas.", + "¡JAJAJAJA! ¡Seh! ¡Lo sé!", + "¿Oh, coleccionas cartas también? Cuánta elegancia, Ying.", + "Siempre me decían, \"¡Quítate del ordenador! ¡O nunca harás amigos!\"", + "Soy el gobernador tan sólo el tiempo que dure una conversación.", + "¡Apostaría a que estás pensando que estás 'haciendo mi trabajo Interesante'!", + "Odio las diagonales.", + "Ningún brebaje para la alergia te salvará de mis esporas.", + "¡Pasa esta carta por un lector de tarjetas para desbloquear la puerta de tu habitación!", + "Estoy haciendo un gran trabajo.", + "¿¿.......??", + "Por cierto, ¿quién ha sido el que ha grabado encima de nosotras?", + "Espero que haya disfrutado de su estancia.", + "Biendo cómo has llegado a este punto, debes de ser bastante Interasante.", + "Estoy aquí para dirigirte hacia el extravío.", + "¡Tú eres como una pirámide para nosotras también!", + "Joder, es siempre lo mismo, noche tras noche, y encima no gano una mierda.", + "¡Déjame en paz! ¡Mi apellido no es Sachs!", + "Al menos no soy un simple palo.", + "¿Qué quieres decir con que el dinero no crece en los árboles? ¡Ejejejej!", + "No soy nada más que una ilusión.", + "ME VOY A DESQUITAR CONTIGO.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Pulsa", + "para definir\nlos controles.", + "para cancelar.", + "Arriba", + "Abajo", + "Izquierda", + "Derecha", + "Saltar", + "Atacar", + "Menú", + "Pulsa", + "para salir", + "para definir los controles.") + } +, + title:{ + dialogue:new Array( + "Por favor, usa las\nteclas de dirección para redimensionar\nla ventana hasta que\nno puedas ver\nnada negro alrededor\nde los bordes.\n\nPulsa", + "cuando acabes.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "cualquier tecla", + "Pulsa", + "para empezar", + "Versión", + "Continuar", + "Nueva partida", + "¿Estás seguro?\nNo\nSí", + "¿De verdad?\nNah\nSeh", + "¡No hay vuelta atrás!\nOlvídalo\nLo sé", + "muertes", + "cartas", + "Anodyne soporta\nla mayoría de los mandos.\n\n¿Vas a usar uno?\n\nSí No\n\nSi es así, conéctalo ahora.\n\nMuévete con las teclas de dirección\n\nSelecciona usando\nC, ESPACIO, o INTRO\n\nSe aplicará 'Sí' por defecto en\n", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", + "NOTA\n\nSi sufres de lag al pulsar las teclas\ndurante la partida,\nsal al escritorio y\nvuelve a abrir Anodyne.\n\nPULSA C PARA CONTINUAR\n\n¿La Interfaz gráfica no aparece como debería?\nPulsa el botón de abajo\ny luego reorienta el dispositivo.") + } +, + gui:{ + dialogue:new Array( + "menú=intro", + "Guardando...") + } +, + map:{ + dialogue:new Array( + "Mapa", + "Sala actual", + "Puerta/Salida", + "Sin mapa", + "Volver a\nNexus", + "Volver a\nla entrada") + } +, + items:{ + dialogue:new Array( + "Objetos", + "Normal", + "Swap", + "Alargar", + "Ensanchar", + "Un par de zapatillas con resortes - ¡pulsa", + "para saltar!", + "Un par de zapatillas para ir en bicicleta.", + "Una caja de cartón vacía.", + "Una llave encontrada en el Templo de El-Que-Todo-Lo-Ve.", + "Una llave encontrada en una roja y subterránea cueva.", + "Una llave encontrada en una cueva en las montañas.") + } +, + cards:{ + dialogue:new Array( + "Cartas", + "cartas") + } +, + save:{ + dialogue:new Array( + "Guardar", + "¡Guardado!", + "ERROR", + "Guardar, volver\nal título", + "Volver al título", + "Guardar y salir", + "Salir del juego", + "Muertes:") + } +, + config:{ + dialogue:new Array( + "Config", + "Asignar teclas", + "Ajustar volumen", + "Autoguardado en\ncheckpoints:", + "Activado", + "Desactivado", + "Cambiar resolución:", + "Configurar Interfaz", + "Táctil+Cruceta", + "Solo cruceta", + "Solo táctil", + "Entrada para movimiento:", + "Resolución:", + "Modo ventana", + "Escalado Int.", + "Estirar", + "Escalado:", + "Idioma:", + "ja", + "en", + "ko", + "Arrastra los\nbotones\nhasta que estés\nsatisfecho.\n\nLuego, toca\nel menú\npara continuar.\n\n", + "Redimensionar\nventana", + "Configurar mando") + } +, + secrets:{ + dialogue:new Array( + "¡Estás forrado!", + "Una vez fue propiedad de un famoso Mago Burbuja.", + "Si tus gráficos se entremezclan, mira la entrada de un Pakimon oficial en la pakidex.", + "Este corazón no tiene nombre.", + "Por favor, visita el mundo de los monstruos eléctricos.", + "Una estatua de un gatito. Mona, pero inútil.", + "¡¡¡¡Oh Dios!!!!", + "¡¡¡¡Oh no!!!!", + "Es negro", + "Es rojo.", + "Es verde.", + "Es azul.", + "Es blanco.", + ":Seleccionar", + ":Volver") + } +, + swap:{ + dialogue:new Array( + "¡Lo sentimos!", + "El swap no va a funcionar aquí.", + "Young no logra reunir la suficiente fuerza para poder usar el swap aquí.") + } +, + keyblock:{ + dialogue:new Array( + "Esta puerta está cerrada.") + } +, + treasure:{ + dialogue:new Array( + "Alguna extraña fuerza impide que este cofre del tesoro pueda abrirse.", + "Un grabado en el palo de la escoba pone:Pulsa", + "para barrer.", + "Esta llave podrá ser usada solamente una vez para abrir un obstáculo que te bloquee el camino.", + "Un misterioso par de botas que no tiene nada más que la marca en ellas, que dice \"Pulsa", + "\".", + "Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ENSANCHAR en el menú para hacer que la escoba suelte polvo dañino hacia los lados.\"", + "Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ALARGAR en el menú para hacer que la escoba suelte polvo dañino más allá de su alcance normal.\"", + "Una nota fijada en el accesorio para la escoba:\"Hola, Young. Usa esta mejora SWAP en dos suelos para Intercambiarlos de lugar. Aun falta un poco antes de que puedas usarla en cualquier lado, pero te servirá por ahora.\"", + "¡¡¡ENCONTRASTE UN CORAZÓN!!! Vida Máxima incrementada en...cero.", + "Goldman:¿Qué? ¿No está ahí? ¡Ese tendero debe haberlo robado!") + } +, + dust:{ + dialogue:new Array( + "¡Tu escoba está ahora cargada de polvo! Ataca de nuevo para colocarlo.") + } +, + checkpoint:{ + dialogue:new Array( + "¿Guardar partida?\n Sí\n No", + "Mientras estés sobre un punto de control, pulsa", + "para guardar tu progreso y hacer que éste sea tu punto de reaparición por si mueres.") + } +, + rock:{ + dialogue:new Array( + "Hay algo garabateado en esta roca:", + "TU NO TIENES AMIJOS") + } +, + door:{ + dialogue:new Array( + "El portal no parece estar activo.") + } +, + keyblockgate:{ + dialogue:new Array( + "La verja está quieta, petrificada. No se abrirá hasta que sienta la presencia de cuatro cartas...", + "Sientiendo la cercanía de cuatro cartas, la verja decide abrirse.", + "La verja permanece obstinadamente en su lugar.", + "La verja siente la totalidad de las cartas y decide abrirse.", + "La verja siente las suficientes cartas y decide abrirse.", + "¡Se abre!", + "Permanece cerrada.") + } +, + solidsprite:{ + dialogue:new Array( + "La señal apunta hacia el Este pero las palabras en ella están borrosas.", + "La señal apunta hacia el Oeste pero las palabras en ella están borrosas.", + "Las palabras en la señal están borrosas.") + } +, + mitra:{ + dialogue:new Array( + "¡Eh, Young!", + "¿Esas zapatillas de bicicleta son para mí? ¡Guau! ¡Gracias, Young! Había estado pensando en conseguir unas, puesto que Género tiene esos pedales donde puedes enganchar ese tipo de zapatillas. Toma, Young, ¡coge mis botas a cambio! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa", + "para saltar con ellas puestas!", + "¡Hola, Young! ¿Me notas algo nuevo? ^... ^... Oh, bueno, pues me he comprado estas zapatillas nuevas para ir en bici, ¡mira! Se enganchan en los pedales de Género. Puesto que no voy a necesitar más mis viejas botas, ¡quiero que tú las tengas, Young! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa", + "para saltar con ellas puestas!", + "¡Venga, cuídate!", + "¡Vamos, pruébatelas! ...No huelen TAN mal.", + "Molan, ¿eh?", + "Guau, ¿no son esas las zapatillas para bici de la tienda de Finty? ¿Que me las regalas? ¡Gracias, Young, te lo aprecio de verdad! Toma, quédate con mis viejas zapatillas a cambio--¡estoy segura de que las encontrarás verdaderamente útiles! Hay algo bordado en las zapatillas que dice \"Pulsa", + "para saltar\" Nunca entendí eso, la verdad, porque no hay ninguna \"", + "\" en las zapatillas...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:¡Bienvenido, bienvenido, Young, amigo mío! ¡Mi nombre es Prasandhoff--Finty Prasandhoff! ¡Echa un vistazo a lo que tengo y hazme saber si algo te Interesa!", + "Finty:¡Te sigo estando agradecido por esa caja!", + "Finty:¡Ah, una caja! ¡Muchísimas gracias! ¡Ahora podré llevar todo mi inventario de vuelta a casa por la noche y otra vez aquí por la mañana!", + "Espera un momento...¡no está aquí! ¿Qué le habrá pasado? Bueno, mira, ¡deja que alivie tus heridas entonces!", + "¡Como muestra de mi gratitud, toma estas elegantes zapatillas para ir en bici!", + "Hace una mañana espléndida, ¿no es así, amigo mío? ¡Una buena mañana para ir de compras! Ojalá tuviera una caja para poder transportar mi inventario.", + "¡Qué mal, parece que no te puedes permitir este objeto! ¡Vuelve más tarde, cuando tengas el dinero!", + "Finty:¡Ah, tienes muy buen ojo! Necesitas un arma mejor, ¿no es así? ¡Vuélales la cabeza a tus enemigos por tan solo $499.99!", + "Finty:¡Ese saco de monedas te permitirá acumular dinero que encuentres en La Región! ¡Es tuyo por tan solo unos míseros $869.99!", + "Finty:Oh jo jo, este objeto es una especialidad, sí que lo es:¡unas prácticas zapatillas de ciclista para que puedas ir rápido A LA VEZ QUE elegante! ¡Oferta de hoy, tan solo $299.99!", + "Finty:¿Cansado de remover el polvo con esa ridícula y raquítica escoba? ¡Erradica esas dañinas partículas de polvo con esta aspiradora de ultimísima generación! ¡Por tan solo $749.99, o en cuatro fáciles pagos mensuales de $199.99!", + "Como muestra de mi gratitud, toma esta fea--digo, ¡bella carta de edición coleccionista!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nUn juego creado por\n\nMelos Han-Tani\n\ny\n\nMarina Kittaka\n\n-------------", + "Creado entre\n\nmarzo de 2012\n\ny\n\nenero de 2013", + "DISEÑO\n------\nAmbos", + "PROGRAMACIÓN\n-----------\nMelos, usando la\nlibrería Flixel\npara Actionscript 3\n\n\n\nARTE\n---\nMarina\n", + "MÚSICA/SFX\n---------\nMelos, usando REAPER\ny sonidos de\nlibre uso.\n\n\n\nDIÁLOGO\n--------------\nMayormente Marina\n", + "TRAMA\n-----\nAmbos\nLocalización\nal japonés:\nKakehashi Games\nTraducción al\nespañol:\nDiego Fenollar", + "Gracias inmensas a\nnuestros testers,\nque han sufrido\n¡para que vosotros\nno tengáis que\nhacerlo!\n--------------\n\nMarina, por tener que\nsufrir muchos de\nlos bugs iniciales.\n\nEtan,por el apoyo\nconstante desde el\nprincipio, con\nmuchos bugs\nencontrados, y el\ntercer humano en\njugar a casi todo\nel juego entero.", + "Olivia - ¡gracias,\nhermanita!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Agradecimientos de\nMelos a:\n\nMamá y Papá, por su\napoyo constante\nen esta empresa.\n\nS\n\nVarios TIGSourcers\n¡y otros\ndesarrolladores que\nhe conocido por el\ncamino!\n\nMarina, por hacer este\njuego posible, y\nmejorarlo en\nincontables\nmaneras.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nY mis otros amigos\nque me han\ndemostrado su apoyo\n(¡Gracias!)\n\nY por último, pero\nno por eso menos\nimportante,\nTina Chen,\namiga desde hace\nmucho, por el apoyo\nasí como también\npor presentarme\na Marina.", + "Agradecimientos de\nMarina a...\n\nColin Meloy, por\nexpandir mi\nvocabulario\n\nTsugumo, por\n\"¿Así que quieres\nser un\nPixel Artist?\"\n\nMi familia,\npor el apoyo\ny la comida.\n\nDaniel, por ser un\n\"desarrollador de\njuegos indie\"\ncreciendo juntos.", + "Mo, por creer\n en mí.\n\nTina, por\npresentarme\na Melos.\n\nMelos, por hacer\nun juego y confiar\nen mí para que\nformara una parte\nimportante de él.", + "REPARTO\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "\n\n\n\n\n\n\n\n", + "¡Y nos gustaría\nagradecerte A TI\npor jugar a\nnuestro juego!\n\n\nEsperamos que lo\nhayas disfrutado.", + "Ahora tienes la\ncapacidad de\nexplorar el mundo\nde Young con(casi)\nninguna limitación,\nvia el swap(mover\ncosas de lugar).\n") + } +, + elevator:{ + dialogue:new Array( + "¿Planta?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancelar") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_IT.hx b/intra/source/data/NPC_Data_IT.hx new file mode 100644 index 0000000..0bbf75c --- /dev/null +++ b/intra/source/data/NPC_Data_IT.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_IT { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Ti piace la musica? Parla con questo terminal!", + "Ti piace il dolore? Vai a sud!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Quell'acrobata sta perdendo l'equilibrio! Dov'è la rete di sicurezza?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "I leoni si stanno avvicinando a quel giocoliere!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Sono stanco, Young. Sono stanco di tutti questi cicli. Mi sembra di rivivere lo stesso sogno, lo stesso incubo ancora e ancora, all'infinito.", + "Briar:...", + "Briar:Non cambierà, Young. Rimarremo così per sempre.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Addio, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Young, amico.", + "Briar:Scalcia. Muovi le braccia. Diamine, non sai fare niente senza di me!", + "Briar:Beh, andiamo a farci un paino.", + "Sage:Sei stato... bravino. Forse ci rivedremo, un giorno. Addio.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voce Misteriosa:Ehi... ... Young? EHI! ... oh, riesci a sentirmi? Bene, allora ascolta. Stai per svegliarti. Usa le frecce direzionali per muoverti.", + "Premi \'", + "\' per Interagire con gli oggetti e le persone accanto a te.", + "Premi \'", + "\' per accedere al menù, che ti darà informazioni su te stesso e su ciò che ti circonda.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Volevo solo che tutto tornasse com'era.", + "Spero... Spero che tu saprai fare meglio di me.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Buona fortuna, Young.", + "Sage non ha tutti i torti. Voglio che tutto sia perfetto, e a volte questo mi fa ignorare la realtà.", + "Non so di cosa hai bisogno per aiutare Briar. Non capisco come funziona questo mondo, o perché tutto sembra così strano. Ma so che voglio essere tua amica, Young.", + "Tu stai lottando, Young. Stai cercando di capire. Spero che riesca a sistemare le cose.") + } +, + one:{ + dialogue:new Array( + "Sage:Young... questo è il mio ultimo avvertimento... aspetta, chi è quella?", + "Mitra:Io sono Mitra, e questa è la mia bici, Manu!", + "Sage:Non ho chiesto il nome della tua bici, che ci fai qui? Non mi ricordo di te.", + "Mitra:Sono qui per aiutare il mio amico, Young...", + "Sage:Young non ha amici. Young non ha nemmeno Briar. E se tu gli stai dando corda, ti voglio fuori dal mio mondo!", + "Mitra:Che vuoi dire? Manu e io...", + "Sage:NON MI INTERESSA DELLA TUA STUPIDA BICICLETTA!!!") + } +, + hit:{ + dialogue:new Array( + "Sage:...", + "Mitra:Young! Va tutto bene? Hai fatto una cosa meravigliosa... Vai avanti e falla finita con questa stupida area! Sappiamo che ce la puoi fare!", + "Mitra:Manu!!!", + "Mitra:Manu...", + "Mitra:Senti, signor personaggio misterioso incappucciato, non so chi tu creda di essere, ma perché non ci lasci in pace?", + "Sage:Dici di essere amica di Young, ma gli mentirai, gli dirai che in fondo lui è perfetto così e tutto si sistemerà. Beh, se è questo quello che vuoi, BENE. Sparisci dalla mia vista, Young.", + "Sage:Va' a parlare con la tua \"amica\".", + "Mitra:Stiamo solo facendo del nostro meglio...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Uomo incappucciato:Ah, era ora. Ehm... ^Volevo dire...^ Benvenuto, Young! Io sono Sage, il saggio del villaggio. Sei stato convocato perché l'Oscurità si è diffusa per tutta la Landa. L'Oscurità cerca il leggendario Briar. Vuole usarne i poteri per scopi malvagi. Devi raggiungerlo per primo. Devi proteggere Briar.", + "Entra nel portale attivo alla tua sinistra per iniziare la tua avventura.", + "*Sospira* non va bene che tu stia ancora qui a ciondolare. Entra nel portale per iniziare la tua avventura. Briar e, per estensione, il mondo Intero è in pericolo!", + "Entra in quel maledetto portale!") + } +, + after_ent_str:{ + dialogue:new Array( + "Sei ancora qui?") + } +, + after_bed:{ + dialogue:new Array( + "Continua, Young. Potrebbero esserci altre chiavi come quella che hai trovato. Trovale.", + "Viaggia fino ai confini più remoti della Landa, Young. È l'unico modo di fermare l'Oscurità.") + } +, + before_windmill:{ + dialogue:new Array( + "Prendi quelle tre chiavi, Young, e apri la strada che porta alle zone più recondite della Landa.") + } +, + after_windmill:{ + dialogue:new Array( + "Hai fatto quello che ho chiesto, Young, ma c'è ancora molto altro da fare. Forse esplorando le zone più remote della Landa diventerai qualcuno... forse addirittura qualcuno degno della considerazione di Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Ottimo lavoro, Young. Hai trovato tutte le carte in un'area della Landa, e una gemma è apparsa sulla cima del portale dell'area.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sage:Presto le tue abilità saranno messe alla prova, Young. Per uscire vivo da questo tempio ti serviranno forza e Intelletto. Immagino che tu abbia già trovato un'arma, no?", + "Cos...? ... Volevo dire... Ma sì, certo... una scopa! Proprio come predetto nella Leggenda...", + "*sgrunt* di tutti gli incompeten... Ehi! Che stai facendo lì impalato?", + "Tieni gli occhi aperti, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sage:Per il momento sei ancora debole. Se speri di proteggere Briar dall'Oscurità, devi affrontare le tue paure. La carta che troverai in questo forziere, e le altre come questa, sono simboli della tua crescita. Ottenerle tutte è di vitale importanza per la tua missione.", + "Anche quella chiave è fondamentale per la tua missione. Devi trovare anche le altre chiavi. Seleziona la mappa sul menu per teletrasportarti all'entrata del tempio, e continua la tua eroica impresa.", + "Viaggia a est e sud attraversando la zona del tempio... La chiave ti servirà.", + "Che c'è? Vuoi che ti porti in spalla fino al cancello?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sage:Perché non mi ascolti?! Se fai le cose di fretta come un idiota, metterai in pericolo Briar, la Landa e tutto quello per cui ho lavorato!", + "Mi dispiace, Young, ma se non Intendi ascoltarmi, dovrò convincerti in altri modi...") + } +, + after_fight:{ + dialogue:new Array( + "Sage:Young... Non volevo che finisse così... Volevo solo che tu diventassi una persona migliore. Volevo che tu diventassi in grado di aiutare Briar. Ma questo è solo uno stupido gioco... Non posso impedirti di raggiungerlo. Ricordati le mie parole quando andrà tutto a puttane.") + } +, + entrance:{ + dialogue:new Array( + "Sage:Ciao, Young. Quando diventerai una persona più forte e più saggia, questo sentiero ti condurrà da Briar.", + "Sage:Non sei pronto, Young. Prima devi affrontare altre prove nella Landa.", + "Sage:Hai fatto progressi, Young, ma devi possedere almeno 36 carte per attraversare questo cancello.") + } +, + etc:{ + dialogue:new Array( + "Sage:Oh... Uh... hai già almeno 36 carte? Ma io non sono sicuro che tu sia pronto per la vera prova. Infatti guarda, stavamo leggendo male questo cancello, in realtà ti servono...\n...\n........\n92 carte per passare, non 36!", + "Sage:Young, non andare, non sei ancora pronto! Pensa a Briar! Alla Landa! Tutto questo non sarà servito a nulla se non sarai pronto!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sage:Ottimo lavoro, Young. Non solo hai sconfitto questo mostro, ma anche la tua paura di prevalere!!!", + "Sage:Ovviamente, hai ancora molta strada da fare. Stai esplorando la Landa?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sage:Ben fatto, Young. Tuttavia, ci sono altre prove che dovrai affrontare. Non abbassare la guardia.", + "Sage:Hai già trovato tutte le chiavi, Young? Se non le hai trovate, vai alla spiaggia.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "Non sono come gli altri! *Bau* non ti farò niente...", + "C'è molta pace quassù.", + "Sai di bietole.", + "*woof*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "Ce l'hai fatta, Young! Hai sconfitto l'Oscurità! Guarda questo posto! È bellissimo!", + "Così bello...") + } +, + dump:{ + dialogue:new Array( + "Oh, meno male che sei qui! Temevo rimanessi bloccato in quella discarica di neve... cazzo se è deprimente lì! Ha!", + "Ahahahah. Ahahahahahahah. AHAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Ehi splendore, ti offro da bere!", + "Bevi ancora, merdaccia! Ahahah!") + } +, + hot:{ + dialogue:new Array( + "Cazzo fa caldo qui... il calore... il sudore...", + "Maledizione! Allenarmi qui mi eccita così tanto!") + } +, + gold:{ + dialogue:new Array( + "Sai che questo posto è fatto d'oro? Oro vero! Potremmo scappare insieme e vivere di questo mattone! Ahahahahah!", + "Sul serio, che fai lì impalato? Aiutami a staccare questo mattone!") + } +, + briar:{ + dialogue:new Array( + "???:Young... Ce l'hAi FatTa! mI hAi salVaTo! Oora TutTo tOrnErà ComE pRimA!!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "OCCHIO!", + "Scusami... Andavo troppo veloce. Ehi, non ti ho mai visto prima! Sei un viaggiatore come me? ... Eh? Vuoi salvare Briar dalla Malefica Oscurità? ... ^Ehm... Non ci ho capito niente, ma ok, figo!", + "Ero qui, assieme a Manu... Cosa? Certo che non sono da sola, Manu è qui con me. Non hai capito, Manu è il nome della mia bici!", + "Beh, forse ci incontreremo di nuovo. Ti farò sapere se scoprirò qualcosa di questo Briar.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "OCCHIO! Forza Manu, andiamo!", + "Eeeee via!", + "Continua Young, siamo con te!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Ti ricordi di me? L'altra volta ti ho presentato solo Manu, la mia bici. Il mio nome è Mitra.", + "Ti ricordi di me? L'ultima volta ho dimenticato di presentarmi. Sono Mitra, e questa bella bici qui si chiama Manu.", + "Mitra:Come va, Young? ... Cosa? Come so il tuo nome? Pensi che sia strano, eh? Beh, l'ho letto sul retro della tua felpa.", + "Mitra:Ci vediamo, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Ah, mi sono appena ricordata. Prima qualcuno ha detto che stava cercando di trovare qualcosa. Non sono sicura di che stesse parlando, ma è andato in tutta fretta verso le montagne.") + } +, + game_hints:{ + dialogue:new Array( + "Niente.", + "Oh, non sai che fare? Hai cercato in giro per la spiaggia? Forse lì qualcuno può aiutarti. Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre?", + "Oh, non sai che fare? Hai cercato nella foresta a est? Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre?", + "Guarda tutte quelle chiavi! Penso di aver visto dei cancelli a sudest. Forse puoi usarle lì?", + "Ehi, ho visto che hai azionato la turbina! Sai se ha avuto effetti sulla Landa?", + "Ehi, Young. Wow! Stai accumulando un sacco di carte! Hai già capito a che servono? Potresti farci un sacco di soldi!", + "Cos'è quel nuovo accessorio attaccato alla scopa? Ti permette di alterare la... struttura del mondo? Young, sinceramente mi sembra pericoloso. Per fortuna sembra non funzionare da nessuna parte, forse solo nei più strani e reconditi recessi della Landa.", + "Ti piacciono le mie scarpe da salto? Ingegnose eh? Io adoro le mie nuove scarpe da bici. Con queste io e Manu siamo un team ancora migliore!", + "Ottimo Young, hai trovato un'altra chiave! A Manu piace il colore! Hai già trovato un posto dove usarla?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Ehi young, stai cercando una carta?\nHai cercato nell'area attorno al tempio di Colui Che Vede?", + "Mitra:Ehi young, stai cercando una carta?\nHo sentito che c'è un labirinto vicino all'uscita sul retro del tempio di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nPotresti trovare qualcosa vicino all'antro di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nC'era una stanza piena di nemici nel tempio di Colui Che Vede, no?", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato bene in tutto il tempio di Colui Che Vede?", + "Mitra:Ehi young, stai cercando una carta?\nProva a cercare nell'area vestigiale vicino all'uscita sul retro dell'antro di Colui Che Vede.", + "Mitra:Ehi young, stai cercando una carta?\nForse il tuo vicino ne sa qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nSo che il tipo nel tuo appartamento stava nascondendo qualcosa...", + "Mitra:Ehi young, stai cercando una carta?\nProva a cercare vicino all'entrata del tuo appartamento!", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato *ovunque* nel tuo appartamento?", + "Mitra:Ehi young, stai cercando una carta?\nProprio a sud di qui c'è un'isola! Non ci sono stata, ma dovresti cercare lì.", + "Mitra:Ehi young, stai cercando una carta?\nSeguendo i fiumi si trova un sacco di roba. Guarda bene!", + "Mitra:Ehi young, stai cercando una carta?\nSo che qualcuno ha lasciato una carta vicino alla pala eolica.", + "Mitra:Ehi young, stai cercando una carta?\nCerca vicino ai fiumi nella foresta...", + "Mitra:Ehi young, stai cercando una carta?\nProva a curiosare vicino alla base delle montagne.", + "Mitra:Ehi young, stai cercando una carta?\nProva a raggiungere la cima delle montagne.", + "Mitra:Ehi young, stai cercando una carta?\nForse qualcosa è nascosto all'estremità della spiaggia.", + "Mitra:Ehi young, stai cercando una carta?\nFai una passeggiata nei boschi cremisi.", + "Mitra:Ehi young, stai cercando una carta?\nC'erano molte porte chiuse in una di quelle caverne rosse, giusto?", + "Mitra:Ehi young, stai cercando una carta?\nVai alla caverna rossa a nord, controlla la fonte del fiume!", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato bene in quel labirinto oscuro?", + "Mitra:Ehi young, stai cercando una carta?\nRicordo che da qualche parte c'era un poco rassicurante sentiero di lanciafiamme. Alla fine deve esserci qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nQuei tizi del circo devono star nascondendo qualcosa. Hai cercato ovunque?", + "Mitra:Ehi young, stai cercando una carta?\nHai cercato attorno al perimetro del fosso di quella coppia?", + "Mitra:Ehi young, stai cercando una carta?\nC'è questa coppia che ama stare vicino a un fosso. Devono nascondere qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nA volte ci sono cose nascoste fra le voragini, soprattutto nelle caverne di montagna!", + "Mitra:Ehi young, stai cercando una carta?\nHai setacciato le one più alte della caverna di montagna?", + "Mitra:Ehi young, stai cercando una carta?\nC'è qualcosa nelle profondità della caverna di montagna?", + "Mitra:Ehi young, stai cercando una carta?\nQuel cubo colorato in quel posto strano... Forse ha qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nHai parlato con il cubo grigio in quel posto strambo? Forse sa qualcosa.", + "Mitra:Ehi young, stai cercando una carta?\nL'ultimo piano dell'hotel è un po' dimesso, ma deve esserci qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nSei entrato in tutte le stanze del terzo piano dell'hotel?", + "Mitra:Ehi young, stai cercando una carta?\nScommetto che qualcuno ha lasciato qualcosa al secondo piano dell'hotel.", + "Mitra:Ehi young, stai cercando una carta?\Il proprietario dell'hotel potrebbe averti lasciato qualcosa!", + "Mitra:Ehi young, stai cercando una carta?\nQuei ponti distrutti a nordovest... guarda lì!", + "... Cosa? Non hai trovato *nessuna* carta? Young, amico, ma sei fuori? A volte nella vita bisogna essere avventurosi, aprire qualche scatola, sai?") + } +, + general_banter:{ + dialogue:new Array( + "Hai incontrato quel tipo che stava cercando qualcosa nelle montagne?", + "Sai qual è il cognome della mia bici? ... Brio! L'hai capita? Manu Brio! ... Scherzo, le biciclette non hanno cognomi.", + "Pensi che debba comprare una catena? Non mi piacerebbe tenere legata Manu ma sai, se ne sentono tante di bici rubate al giorno d'oggi...", + "Allora, cos'è Briar? Una specie di artefatto antico di una cultura perduta?", + "Mi chiedo perché non ho sentito niente dell'arrivo dell'Oscurità. Immagino che molta gente nella Landa sia impegnata nelle sue battaglie quotidiane.", + "Ehi Young, volevo solo dirti che... hai dei bellissimi capelli.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Statua:Anziano del villaggio solo di nome, di fatto non è né saggio né anziano.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Statua:Ho visto una scopa in una leggenda... era sulla mappa nell'armadietto di un inserviente.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Statua:Le carte sono vitali per la tua missione. Le carte, soprattutto quelle di credito, sono vitali anche per altre missioni, come l'acquisto di bevande alcoliche.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Statua:Ottimo lavoro, Sage. Hai dovuto superare ogni limite del tuo carattere e ogni forma di amor proprio per dire una cosa così imbarazzante!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Se continui così, quando sarai diventato un individuo più stressato e apatico finirai per sfogarti sul gelato. Trova conforto nella bottiglia, perdente!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Edward:Una volta un uomo venne a installare uno specchio nel nostro bagno. Avevo paura che ci avesse nascosto una telecamera. Ho controllato ogni centimetro della cornice di legno, ho versato del Mastro Ligno in ogni fessura sperando di mandarla in cortocircuito. Ovviamente non ho mai trovato nulla.", + "Edward:Questo tempio è dedicato a Colui Che Vede. Non so perché sono venuto qui, e ho troppa paura di entrare.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Edward:Ci sono problemi? Immagino di sì. Tutto quello che hai è una scopa, e tutto quello che le scope fanno è spostare la polvere.") + } +, + bedroom_done:{ + dialogue:new Array( + "Edward:hai detto di aver sconfitto Colui Che Vede? Ha. Non hai capito che non funziona così? Stai solo versando Mastro Ligno nelle fessure.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Oh, sei così dolce. Il piccolo, tenero Young che gioca a fare l'eroe. Ma io ho visto ogni passo che hai mosso nella Landa, e lascia che te lo dica Young, non tutti qui sono onesti come lo sono io. Stai attento a coloro di cui ti fidi!") + } +, + after_fight:{ + dialogue:new Array( + "Sarò con te, Young, ogni volta che sarai solo. E ricorda il mio consiglio sulla tua piccola \"avventura\".") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Roccia:La visione periferica è il covo dei demoni.") + } +, + two:{ + dialogue:new Array( + "Roccia:Da fare - Costruire un sistema di teletrasporto al Nexus. Progresso - in stato di fermo. Colui Che Vede non Intende fornire i fondi per rendere il progetto possibile. Dovremo tornare a usare il metodo originale, l'inspiegabile portale dimensionale.") + } +, + three:{ + dialogue:new Array( + "Roccia:Sono Intrappolata qui, tutta sola. Il lavoro procede a buon ritmo in questo tunnel, almeno posso vedere ogni giorno piccoli progressi.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Questa ruota serve a sollevare la diga.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 giugno, 1957:Si sono rotte le corde del trapezio. Alice Rutgers è precipitata al suolo e si è fratturata gli stinchi.") + } +, + two:{ + dialogue:new Array( + "17 luglio, 1957:sette clown si sono ritirati per problemi quasi fatali ai polmoni. Si sospettano responsabilità della linea di makeup Landan Look, ma non è in corso nessuna investigazione.") + } +, + three:{ + dialogue:new Array( + "21 luglio, 1957:A seguito del malfunzionamento di una gabbia, la mia faccia e il mio fianco sono stati gravemente mutilati da un leone non ancora domato. Sono sopravvissuto, ma rabbrividisco guardandomi allo specchio.") + } +, + four:{ + dialogue:new Array( + "5 agosto, 1957:In sogno, ho visto un volto di pietra con occhi feroci e luccicanti. Parlava della verità sulla nostra esistenza, ed è stato il primo a offrire libertà dal dolore.") + } +, + five:{ + dialogue:new Array( + "7 agosto, 1957:Quanti altri di noi dovranno soffrire prima che tutti accettino la verità di Colui Che Vede?") + } +, + six:{ + dialogue:new Array( + "8 agosto, 1957:Ho preso una decisione. Degli altri, qualcuno ha detto che mi seguirà. Questa sarà la mia ultima annotazione. Possa Colui Che Vede vegliare su tutti noi.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Segni indecifrabili)") + } +, + two:{ + dialogue:new Array( + "7 dicembre, 2010.(nome illeggibile). Non c'è niente quassù a parte questa stupida roccia!") + } +, + three:{ + dialogue:new Array( + "Pericolo! Questa caverna è inesplorata.") + } +, + four:{ + dialogue:new Array( + "Questo dirupo va verso l'alto a perdita d'occhio, ma nessuno è mai arrivato abbastanza in alto per capire fin dove arriva.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Roccia:Come?") + } +, + two:{ + dialogue:new Array( + "Roccia:Attenzione! Caduta verticale, saltate a vostro rischio e pericolo.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Questo serviva come segnaposto per l'animazione dei cancelli delle carte. Avvicinati due volte per vedere le animazioni di apertura e chiusura!", + "Ho dimenticato perché non l'abbiamo più usata. Forse era un po' troppo.") + } +, + two:{ + dialogue:new Array( + "Qui ci sono dei test per vari tipi di terreno e collisioni! Non riuscivo a far funzionare i terreni a direzione unica da ogni lato(tipo i muri), quindi ho lasciato perdere... credo.", + "Abbiamo lasciato perdere per vari motivi. Semplificare il design era importante per riuscire a finire il gioco.") + } +, + three:{ + dialogue:new Array( + "All'inizio i nemici potevano droppare chiavi. Poi ho scartato l'idea, anche se poteva essere divertente.", + "Abbiamo anche considerato di creare dei cancelli sfida alla fine di alcuni percorsi, che si aprivano solo se li raggiungevi senza subire danni.", + "Volevamo basare tutti i dungeon su questo sistema e lasciar perdere completamente i punti vita, ma a quanto pare il gioco era troppo difficile!") + } +, + four:{ + dialogue:new Array( + "PRIGIONE!!!", + "Liberaci!!!", + "Per favore!") + } +, + five:{ + dialogue:new Array( + "Benvenuto nel MONDO DI DEBUG! Sei uscito dai confini de \"La Landa\", quindi considera questo mondo(al 90 percento)\"non canonico\". Ad ogni modo.", + "Prima che ci fossero set di tile per molte delle aree, usavo tile stupide tipo queste per segnare dove andavano le porte. Infatti, ogni dungeon è stato arrangiato con i set di quest'area, e poi Marina li ha aggiustati con i suoi set di tile.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-ARCHIVI-", + "PROCEDERE CON CAUTELA") + } +, + four:{ + dialogue:new Array( + "Ovest. Fessura. Realtà! Basso valore immobiliare, uragano, vecchio, fatiscente. Rilassante.") + } +, + three:{ + dialogue:new Array( + "Colui Che Vede, da quel che ric- crr,,,,, Bei Momenti in Casa.") + } +, + two:{ + dialogue:new Array( + "CELLA FRIGORIFERA\n\n^ -- LA DIREZIONE") + } +, + one:{ + dialogue:new Array( + "CONTINUA") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Ovest:Spiaggia\n\nEst:Foresta\n\nSudest:\n Area Piovosa\n\nNord:\nZona del tempio\n\nNordovest:Dirupo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Ovest:Lago\nSud, poi est:Dirupo") + } +, + two:{ + dialogue:new Array( + "Laghetto della quiete. Resta un po', sappiamo che hai tempo.") + } +, + three:{ + dialogue:new Array( + "Temo di dover rimanere in questo angolino per sempre.") + } +, + four:{ + dialogue:new Array( + "Est:Dirupo") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "Il sentiero si aprirà quando le tessere guardiane nere saranno sostituite con le pietre del loro colore spirituale nella griglia sottostante.") + } +, + two:{ + dialogue:new Array( + "Quando la statua di pietra blu si è spostata,\nsi è aperto un nuovo sentiero.\nDopo il dirupo, attraverso strane dimensioni,\nc'è un hotel per viandanti.\n\n\n\"Chi è il guardiano?\" Chiedo,\n\"Chi governa questo affollato luogo d'affari?\"\nMolte anime sono qui riunite,\nma io mi sento comunque solo.") + } +, + three:{ + dialogue:new Array( + "La statua rossa e rugginosa si è mossa,\ne ha svelato la via per abissi più profondi.\nNe segue un sotterraneo labirintico\ne un grosso tendone da circo.\n\n\n\"Chi sono i guardiani?\" Chiedo, \n\"Chi ha rinunciato alla vita per fuggire in questo posto?\"\nIo, come loro, temo il dolore.\nMa temo di più la morte.") + } +, + four:{ + dialogue:new Array( + "La statua metallica verde si è spostata,\naprendo un sentiero più profondo.\nQuartieri residenziali e marciapiedi formano\nil sentiero per un appartamento.\n\n\n\"Chi è il guardiano?\" Chiedo, \n\"Chi cerca conforto nelle stelle?\"\nSolo, sento che qualcosa mi osserva.\nE non è l'amichevole luce stellare.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Roccia:Questa è terra di nessuno - non ancora parte della Landa.") + } +, + two:{ + dialogue:new Array( + "Roccia:Questi - ^ io e i miei cerchi siamo^ - promesse... Io^ - cerchi^ - cercherò di portare tutto a termine...^ - concentrici. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "Roccia:Stai attento ^ -...ma riesco sempre^ - a dove metti i piedi^ - a riapparire ,no?^ - in questo posto!") + } +, + four:{ + dialogue:new Array( + "Roccia:Guardando in basso ^ - E ho capito:^ - da qui, - ^ Di amarlo.^ - non si vede... niente, a dire il vero.") + } +, + five:{ + dialogue:new Array( + "Roccia:Mi scuso -^ Sì ma, -^ per questa confusione -^ dobbiamo rimanere in contatto -^ ma quel portale dovrebbe ^- e cercherò di darti le mie opinioni - ^ riportarti nella Landa.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "A volte, se parli più volte con le persone, ti diranno cose diverse.", + "Le rocce no. Le rocce non lo fanno.") + } +, + two:{ + dialogue:new Array( + "Roccia:Così vicino! Se solo...") + } +, + three:{ + dialogue:new Array( + "Roccia:La curiosità è una gran cosa.") + } +, + four:{ + dialogue:new Array( + "Roccia:Oh!...?") + } +, + five:{ + dialogue:new Array( + "C'è una mail aperta sul computer. Alcune parti dello schermo sono rotte, e il messaggio è solo parzialmente visibile fra le chiazze nere. La mail dice:\"Ciao Young!\" Sembra che [...] cinquantesima carta [...] forse non dovresti... [...] vale la pena pensarci! Pensi di essere pronto? Svegliati...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Roccia:Scommetto che stai leggendo una roccia perché non hai amici.") + } +, + two:{ + dialogue:new Array( + "Roccia:Benvenuto alla Stazione Oltremondo. Speriamo che ti sia goduto la tua permanenza nella Landa.") + } +, + three:{ + dialogue:new Array( + "Roccia:Em… You are normále? Capeesh?", + "Roccia:Per favore, non andare a sud. Ci sono lavori in corso.") + } +, + four:{ + dialogue:new Array( + "Roccia:Tesoro in 5, 3!") + } +, + five:{ + dialogue:new Array( + "Roccia:Ahah, fregato!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NASCIAMO NELLA PUTREFAZIONE DEL CORPO DI NOSTRA MADRE.") + } +, + two:{ + dialogue:new Array( + "UN GIORNO NOSTRA MADRE HA LASCIATO SUA MADRE E SI È AVVENTURATA NELLA NEBBIA VENEFICA.") + } +, + three:{ + dialogue:new Array( + "NON LO ABBIAMO VOLUTO NOI. NON AVREMMO COMPRATO LE NOSTRE VITE A COSTO DELLA SUA SOFFERENZA.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Roccia:I segni indicano che gli alberi non sono stati attivi per un lungo periodo di tempo.") + } +, + two:{ + dialogue:new Array( + "Roccia:Sud:???^ Nord:???") + } +, + three:{ + dialogue:new Array( + "Roccia:Si dice che il terreno irregolare sia opera dei progenitori degli abitanti di questa zona.") + } +, + four:{ + dialogue:new Array( + "Roccia:Sembrano essere una specie pacifica.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Scarabocchiato in quello che sembra essere pennarello indelebile:Salve, compagno viaggiatore dello SPAZIO e del TEMPO. Ti sei avventurato in uno squarcio lontano dall'aera giustapposta di YOUNG. Hai attraversato un OCEANO o due, per così dire. Non preoccuparti per il CONTRASTO, potrai presto tornare alla tua consueta avventura. non TEMERE questo luogo, anche se può sembrare TENEBROSO e PERICOLOSO i suoi abitanti sono molto AMICHEVOLI \n -- La Direzione", + "(Sotto il messaggio, una incisione:)Qui giace ___(illeggibile). Si è perso nei boschi.", + "(Ancora più sotto il messaggio:)(non andare troppo a sud.)") + } +, + two:{ + dialogue:new Array( + "Qui giace ____(illeggibile. Chi l'ha scritto?)È stato impalato da arcobaleni!", + "Sarebbe stato meglio con i trofei.") + } +, + three:{ + dialogue:new Array( + "Qui giace Burd. I precipizi non gli furono troppo amici.") + } +, + four:{ + dialogue:new Array( + "Qui giace borsa. Non ha mai avuto alcuna possibilità.", + "Arrogante!") + } +, + five:{ + dialogue:new Array( + "Qui giace Savitch. Una volta ha provato ad aggiustarmi il computer in garage, e non occupava molto spazio mentre lo faceva. Dopo tre anni, non aveva ancora finito. Poi, è morto.") + } +, + six:{ + dialogue:new Array( + "Qui giace Dave. Non era molto d'ispirazione.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "--- YOUNG TOWN --- ^\nBenvenuto a Young Town. Per piacere, stai attento ad alcuni dei cittadini. Non sono molto amichevoli. Procedi con cautela. Young Town è stata fondata negli anni '90 dal sindaco Ying come parte di un progetto di edilizia urbana. Il nome è stato scelto in base al rifuto di Ying di chiamarsi Ying, e in base al suo affermare di chiamarsi Young. Ti auguriamo un piacevole soggiorno.") + } +, + two:{ + dialogue:new Array( + "A ovest ci sono i leggendari templi di Colui Che Vede. A est c'è l'appartamento del nostro fantastico sindaco Ying, che è chiuso al pubblico - i trasgressori sono avvisati.") + } +, + three:{ + dialogue:new Array( + "Durante la sua quinta visita, Ying mostrò frustrazione per la mancanza di parcheggi. Questo parcheggio riflette la frustrazione di Ying per la mancanza di parcheggi. Ying ha occasionalmente parcheggiato in questo parcheggio nelle sue visite seguenti.") + } +, + four:{ + dialogue:new Array( + "Ricordo le lunghe frasi che scrivevo. Ha! Frammentato.") + } +, + five:{ + dialogue:new Array( + "UNA SITUAZIONE PERICOLOSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "Colui Che Vede sa tutto, e conduce all'illuminazione. Il cammino per l'illuminazione non è illuminato da alcuna torcia.") + } +, + two:{ + dialogue:new Array( + "Non allontanarti dal cammino di Colui Che Vede, neanche per i tesori che si trovano agli angoli remoti del labirinto.") + } +, + three:{ + dialogue:new Array( + "Cammina.") + } +, + four:{ + dialogue:new Array( + "Non far adirare gli inseguitori con la violenza.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "PUNTO PANORAMICO:Torri sorelle. Costruite tempo fa, le torri sorelle svettano sulle montagne in lontananza. La prima torre è stata precedentemente danneggiata, e da allora è stata destinata ad altri usi. La seconda si erge a est, toccando il cielo. Per ragioni di sicurezza, il sentiero per la torre è stato chiuso fino a nuovo avviso.") + } +, + two:{ + dialogue:new Array( + "AVVISO PER LA PUBBLICA SICUREZZA:^\nSebbene non danneggiata, pare che in cima a questa torre ci sia uno squarcio dimensionale. Procedete con cautela e con una mente aperta.^\n -- La Direzione") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Sembra che questa statua non abbia Intenzione di spostarsi.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sembra che questa statua sia saldamente a posto.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "La statua non sembra essere spostabile.") + } +, + two:{ + dialogue:new Array( + "La statua si è spostata.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Il fuoco è affascinante, non è vero? È un vero peccato che il bagliore dei lampioni nasconda il fuoco delle stelle.") + } +, + after_fight:{ + dialogue:new Array( + "Ok, le stelle non sono davvero fatte di fuoco. ^Ma tanto non fotte nulla a nessuno.") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "Come va? Sono il sovrano di questa partizione e Interpretazione di spazio.", + "Vuoi sapere perché sono il sovrano di questo posto? Te lo dirò, ma ci vorrà un po'. Un bel po'. Tipo un sacco di tempo.", + "Sul serio, ci metterò molto. Davvero eh, ti sto avvisando! Ho la tendenza a divagare. Forse faresti meglio a prendere il contenuto di quel forziere laggiù. O ad andare verso quell'hotel in lontananza. Non so come ci è finito lì, ma ho sentito che fanno dei prezzi abbastanza buoni. Non che il denaro abbia importanza qui.", + "Perché sono il sovrano?^... Non ne sono sicuro, ma i miei amici hanno deciso che fosse appropriato mettermi qui, date le condizioni attuali di questo spazio. Forse è perché i cubi sono i migliori nel restare seduti sulle superfici piatte. Sul perché è necessario che qualcuno sia seduto qui - ah, non ne ho idea!", + "Gli altri - i miei amici laggiù - hanno ognuno i propri meriti. Non è impossibile che in futuro siano loro a sedersi qui, è che non possono farlo ora. A volte cambiamo chi fa il sovrano, ma ogni volta dobbiamo reinterpretare questa porzione di spazio! Può succedere che il Signor o la Signora Piramide vengano qui perché decidiamo di dare al trono una forma che si confà meglio alla loro forma, reimmaginando questo mondo, per così dire. Ti sembra stupido? Può essere. Però qui funziona così. Succede abbastanza in fretta. Minuti, ore - i regni non sono necessariamente lunghi.", + "Però, quando sono il sovrano, mi sento strano... come se fossi isolato, come se volessi evitare gli altri...", + "... ma isolamento non è la parola giusta, anche se descrive in parte la sensazione. Non sono isolato, e non odio gli altri. Ci consideriamo tutti amici, ma sai, nessuno viene effettivamente qui se non per scambiare qualche parola. Quindi devo mettermi a pensare, o rischio di impazzire! Forse è parte dell'isolamento.", + "A parte domande folli sul *perché* siamo qui a occupare questo spazio, sarei anche curioso di capire perché siamo amici.", + "Mi piace pensare che quando siamo sotto l'interpretazione che sia io la migliore scelta come sovrano, loro mi danno conforto permettendomi di mantenere la mia posizione per tutto il tempo che serve a raggiungere l'interpretazione successiva. Sai, i loro incoraggiamenti, la loro presenza fisica, quelle cose mi danno conforto.", + "Immagino che siano abbastanza per soddisfarmi, anche se sarebbe bello che qualcuno provasse a capire come mi sento a essere sovrano. Non che mi stia lamentando degli incoraggiamenti! Però forse potremmo avere più sovrani... che idea! Il che forse implica che quando non sono sovrano devo agire come ogni tanto vorrei che loro facessero... chissà se si può fare.", + "Mi sono dilungato troppo. Se vai nella direzione opposta, c'è una regione di spazio simile a questa, anche se penso abbia un odore diverso.", + "È stato un piacere incontrarti.", + "Oh, vuoi ascoltare di nuovo la mia storia?", + "Bene, mettiti comodo.") + } +, + gray:{ + dialogue:new Array( + "Ciao. Sono il sovrano di questa parte di spazio.", + "Cosa? Vuoi sapere perché sono qui? Sei sicuro? Ci vorrà un po' per spiegarti perché!", + "Beh, se insisti. Anche se faresti meglio ad andare verso quell'hotel in lontananza. Non so perché abbiano deciso di costruirlo. Se dovessi pagarci delle tasse, sicuramente protesterei!", + "Allora, anche se sono il sovrano di questa parte di spazio, non sto effetivamente regnando su nessuno.", + "I miei amici sono tutti sovrani delle loro parti di spazio. Neanche loro regnano su qualcuno - in un certo senso siamo tutti soli. Ma non nel senso che non possiamo parlare fra noi. In quel senso, non siamo soli. Questo è solo un posto in cui io esisto.", + "La mia parte di spazio e quelle dei miei amici sono molto simili nel modo in cui esistono e per come sono organizzate. Abbiamo Interessi e desideri simili. Ci piace parlare molto su come regnare e così via.", + "Ma è triste che non riusciamo quasi mai a incontrarci di persona.", + "In realtà non stai parlando con loro nella loro forma fisica, ma con una loro rappresentazione olografica.", + "Lo so, è un peccato. È un peccato perché abbiamo così tanto in comune, ma possiamo aiutarci a vicenda così poco.", + "Quando non puoi parlare sempre faccia a faccia con qualcuno sembra come se manchi qualcosa.", + "Ma non mi sto lamentando. È meglio del nulla assoluto! Non riesco a immaginare come sarebbe diversamente. Sarebbe terribile.", + "È stato bello parlare con te, buona fortuna per qualunque cosa tu stia facendo.", + "Sei ancora qui? Posso dirti tutto di nuovo, se vuoi.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Ehi tu, brutto bullo! Non ho paura di te!", + "Crickson:Zucca vuota! Non scapperò! Neanche se me le darai di santa ragione!", + "Crickson:Sei solo un grosso bruto con una scopa, ecco cosa sei! Dovresti vergognarti di te stesso!") + } +, + thorax:{ + dialogue:new Array( + "Thorax:Io sono il Thorax, e lasciamelo dire\n^Le api stan male, non fan che patire!\n^Alcune operaie son volate via\n^E nelle loro colonie ora c'è una moria!", + "Thorax:Forse è un virus, o forse un veleno\n^Che qualcuno ha gettato nel loro terreno!\n^Qualche grossa azienda, per fare più soldi\n^Sporchi assassini, ladri, manigoldi!", + "Thorax:Ok, non ho idea di che stia succedendo\n^Ma le api davvero stanno morendo.\n^Che posso fare, agire a casaccio?\n^... Trovato! Lo posto su Facebook, oh se lo faccio!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Comprami qualcosa") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "Che ci fai qui, delinquente? Vai via! È mia di diritto!", + "Non mollo mica! Mai, nemmeno fra un milione di anni!") + } +, + inside:{ + dialogue:new Array( + "Oh, sei tornato qui per terrorizzarmi ancora?", + "Sei dalla parte dei gatti solo perché sono tutti carini e pelosi.") + } +, + etc:{ + dialogue:new Array( + "Che ci fai qui, delinquente? Vai via! È mio di diritto!^ Coooos?^ È un...?^ ALTRO GATTO???^ AAAAAHHHHHH!!!", + "Tu hai... pulito casa mia... sono commosso! Prendi, voglio donarti la cosa più bella che ho!", + "Young prende e apre la scatola. C'è qualcosa dentro!", + "Icky:Oh. Ehi Miao.^\n\nMiao:Sono così felice che tu sia salvo!^\n\nIcky:Ehm... grazie per l'aiuto, Young.", + "Icky:A essere sincero, mi piace sedere nelle scatole.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Oh!! Tu sei Young, Il Prescelto!!!! Ommioddio, che onore! Io sono Miao Xiao Tuan Er, aspirante Prescelto!", + "Posso seguirti un po' per vedere un Prescelto in azione?", + "Ciao di nuovo, Young! Posso seguirti?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Ehi, Young... hai mai rubato qualcosa?", + "Miao:Mi piace Mitra... e Manu è una bicicletta bellissima, non è vero?", + "Miao:Cos'è quella specie di pietra fighissima, Young? Ti fa tornare indietro nel tempo?!", + "Miao:Sto iniziando a preoccuparmi per Icky... Young, hai visto un gatto più grande di recente? L'ultima volta Icky ha detto che sarebbe andato a fare una passeggiata nella piccola foresta a est.", + "Miao:Icky ha detto che non dovrei andare in posti pericolosi. Ci vediamo, Young.", + "Miao:Ti sei mai seduto in un mucchio di buste della spesa?", + "Miao:Ehi Young, secondo te è sbagliato farsi di erba gatta?", + "Miao:Scommetto che ci è voluto un sacco di lavoro per diventare il Prescelto, eh Young?") + } +, + philosophy:{ + dialogue:new Array( + "Quella situazione spaventosa con Icky mi ha dato da pensare... Secondo te che succede dopo che muoriamo? Come è possibile riuscire a portare a compimento il nostro scopo nel corso di una sola vita?", + "È possibile che ci reincarniamo fino a compiere il nostro destino. O renderebbe le cose troppo facili?", + "E qual è la nostra ricompensa per aver portato a termine il percorso? O semplicemente svaniamo nel nulla?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Oh. Ciao, Young.", + "Il mio nome in realtà non è Icky. È Ichabod.", + "Spero che Miao Xiao Tuan Er non ti abbia dato troppo fastidio.", + "Ci vediamo, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "Ehi ciao, come va? Mi hai trovato! Io rimango qui, fuori fa troppo freddo.", + "Puoi dare la colpa a me per tutte quelle stanze orribili! Le ho create con il DAME map editor.", + "Ho creato questo gioco con L'IDE FlashDevelop e il framework Flixel AS3!", + "Ah sì, e ho creato la musica con REAPER DAW E a volte Audacity.", + "In realtà prendo il mio nutrimento dal calore di tutti questi computer... ^Che vuol dire \"non è biologicamente possibile\"?", + "Ciao mamma! ^e papà!", + "Vuoi sapere come finire il gioco in 20 minuti?", + "Ha! E pensi che te lo dica?", + "(...forse se me lo chiedi cortesemente...)") + } +, + marina:{ + dialogue:new Array( + "Ehi woah!", + "Ho scritto un sacco di dialoghi per questo gioco!^(...non questo dialogo però. Di questo se ne è occupato Melos.)", + "Per la parte artistica ho usato Adobe Photoshop CS5 , Graphics Gale Free Edition e lo Snipping Tool di Windows 7!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "L'umidità qui è ottima per la pelle, ma pessima per i capelli.", + "Mi piace stare qui. Al giorno d'oggi, la gente passa l'intera estate correndo avanti e indietro fra il sole cocente e l'aria condizionata glaciale. Quei cambi di temperatura repentini indeboliscono le ossa.", + "È come quella maledetta mania di masticare i cubetti di ghiaccio. Mia madre masticava i cubetti di ghiaccio quando aveva quasi 30 anni. Ora i suoi molari sono pieni di microfratture.") + } +, + second:{ + dialogue:new Array( + "Mi raccomando a cambiarti le scarpe e a riempirle con carta di giornale per farle asciugare. Non vorrai creare un nido di batteri.", + "Perché nei buffet servono solo gelatina ROSSA? È come se volessero farci venire il cancro.") + } +, + bomb:{ + dialogue:new Array( + "Allontanati da me.", + "Dico davvero... lasciami in pace.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Non mi serve la tua pietà, Young.", + "Certo, continua a vivere nel tuo piccolo mondo felice, \"Prescelto\"...", + "Sai Young, l'amicizia è solo un modo che la gente usa per ingannarsi. La verità è che siamo dei pezzi di merda, e alla fine siamo tutti soli.", + "Hah, sapevo che mi odiavi, Young.", + "Sto bene.", + "Chiaramente non ti importa, a nessuno importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "So che le città sono sporche e caotiche, ma a me piace venire qui e guardare tutte queste luci.", + "È bello, a modo suo. Non è una bellezza infinita come quella delle stelle, ma nella loro umanità queste luci hanno un fascino più profondo, più complesso.", + "Dietro ogni luce c'è una persona, ci sono speranze, paure e segreti... Guardare mi fa sentire terribilmente solo, ma in profonda Intimità.", + "Credo di amare ogni persona dietro ogni finestra. Io vi amo, perché siete le mie stelle. Vi amo, e non importa quanto di merda sia la vostra vita, o quanto in basso pensate di essere caduti. Stanotte siete stupendi...", + "Scusami, sto blaterando. Grazie per avermi ascoltato.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eeeehiiii... rilassati e rimani un pooooo', eh?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! Mi hai trovato!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Ti ho colpito con un masso mentre salivi? A volte lancio massi quando sono arrabbiato. Scusami se ti ho colpito.", + "Golem:Mia madre diceva sempre che se avessi continuato a farlo, avrei finito la montagna. Prima che la trivellassero.") + } +, + second:{ + dialogue:new Array( + "Golem:Se sei una roccia, vedi molte generazioni andare e venire. Diventi antico, e più saggio del più saggio fra gli uomini.", + "Golem:O almeno, quella è l'idea. Ho rotto in mio binocolo un po' di tempo fa e da allora non riesco a capire che sta succedendo.", + "Golem:In realtà non mi manca molto guardare la gente. È una noia.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Oh sì, ho incontrato qualcuno che si era un po' perso... mi ha detto che sarebbe andato a dare un'occhiata alla spiaggia.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "Non sono un'aragosta, sono un gambero. Mi chiamo Hews.", + "Hews:Sai qual è la cosa migliore dell'oceano? Poter guardare l'orizzonte.", + "Hews:L'oceano è come un piccolo assaggio salato di infinito.", + "Hews:Una spiaggia affollata perde la sua magia.") + } +, + second:{ + dialogue:new Array( + "Hews:Hai mai sentito parlare degli stomatopodi? Hanno 16 fotorecettori che permettono loro di vedere la luce ultravioletta. Riesci a immaginare di poter vedere altri colori?", + "Hews:Penso che sarebbe bellissimo. O forse no, abbiamo già abbastanza modi di odiarci l'un l'altro con i colori che abbiamo.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Stai cercando qualcuno? Ero seduto qui quando alcune nuvole sono passate davanti al sole. Mentre il sole era coperto, qualcuno è venuto vicino a me e mi ha chiesto dove fosse qualcosa. Non ricordo cosa fosse, ma la persona è corsa via dicendo di andare verso la foresta.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:I frutti di bosco sono un buon cibo. Mi piacciono i frutti di bosco.", + "James:Per piacere, stai attento a non defecare sui frutti di bosco.", + "James:Finora, in questa stagione ho avuto rapporti sessuali 18 volte. E ho mangiato 389 zampate di frutti di bosco.", + "James:Hai dei frutti di bosco per James?") + } +, + second:{ + dialogue:new Array( + "James:Ho scritto una poesia:\n^Quanto amo i frutti bosco\n^Quando son triste mi mettono a posto\n^Le farei a pezzettini e ne mangerei un pozzo\n^Di crostate ai frutti di... bosco!", + "James:Cosa preferisci? Mirtilli o lamponi?", + "James:Hai dei frutti di bosco per James?") + } +, + quest_event:{ + dialogue:new Array( + "James:È venuto qualcuno. Non voleva i frutti di bosco. È andato nella zona sudest del lago a ovest.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olivia:Ciao, sono Olivia la coniglietta.", + "Olivia:Mi sono rimasti così tanti cereali da mangiare! Amo i cereali.", + "Olivia:La scatola è così grande. Non finisce mai!", + "Olivia:Cereali infiniti!", + "Olivia:Mhhhh... forse non è così male.") + } +, + bush:{ + dialogue:new Array( + "Lonk:Eheheh, che scemo che sei, Young! Una scopa non è fatta per tagliare i cespugli!") + } +, + quest_normal:{ + dialogue:new Array( + "Lonk:Mi guadagno da vivere tagliando cespugli. A volte trovi oro nei cespugli tagliati! Eheheh!", + "Lonk:L'economia sta andando davvero male sotto questo cespuglio...", + "Lonk:A volte è difficile mantenere moglie e figli tagliando i cespugli... non sempre abbiamo da mangiare... ma il nostro focolare è sempre acceso! Eheheh!") + } +, + quest_event:{ + dialogue:new Array( + "Lonk:Come? Sì! È venuto qualcuno. Ha detto che stava andando in un labirinto sotterraneo... scommetto che ci sono molti cespugli lì, eh Young? Eheheh!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Ehi ciao, come va?", + "Marvin:Dov'è Justin?", + "Marvin:Non c'è nessuno qui attorno...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:A Bob il criceto piace parlare di sé in terza persona.", + "Bob:Gli apostrofi sono la radice di tutti i ma'li.", + "Bob:Silenzio! Sono impegnato a emanare un'aura cricetosa.", + "Bob:... Immagino che il modo migliore per imparare qualcosa è farla... Però... se facciamo qualcosa male, non stiamo solo migliorando nel farla male?", + "Bob:Un vero uomo non piange mai... beh, al massimo lascia scorrere una singola lacrima dall'angolo del suo occhio lungo la sua faccia inaridita dal sole, mentre guida la sua Harley nel deserto senza usare casco né occhialoni. Ma non piange mai.", + "Bob:Questo gioco è stato creato da un infinito numero di scimmie che hanno lavorato su un infinito numero di macchine da scrivere.", + "Bob:Mi manca James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Il curry è giallo e piccante!", + "Kuribu:Per l'avversario Intelligente, danni aumentati!", + "Kuribu:Hai guadagnato un'esperienza di 2!", + "Kuribu:Ti dico il mio numero di telefono! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "Che STO FACENDO qui? Bella domanda! Sono capitato qui per caso. Mi sto nascondendo. Questo posto è sicuro, se non ti avventuri troppo lontano e lasci che quei tizi ti prendano.", + "Sembra che io sia relativamente fortunato. Tutti questi morti appesi alle pareti - come sono morti? È un po' affascinante pensare a come sia successo. Sono stati attaccati dai mostri? Sono inciampati e caduti sugli spuntoni?", + "È un po' macabro. Spero che non mi succeda. Il dolore fisico è una terribile prospettiva.") + } +, + quest_event:{ + dialogue:new Array( + "Ah... ora che ci penso, una persona è passata di qui un po' di tempo fa. Ha detto che stava cercando qualcosa... e ti somigliava anche! Non ricordo quando, scusami. Qui si perde la cognizione del tempo. Però ha detto di essere diretto verso una città vicina.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Ciao.", + "Stai cercando qualcosa?", + "Che stai guardando?", + "No, non sono di qui. La cosa strana è che tu puoi vedermi e parlarmi, ma io non posso Interagire con nessuno di loro. Ci sono tutti quegli assassini in giro, e nessuno sembra accorgersene. È strano.") + } +, + quest_event:{ + dialogue:new Array( + "Sì. Ho visto una persona passare. Stava cercando qualcosa. Non so cosa fosse questo \"qualcosa\". Il tipo è andato via di fretta. Ha detto di dover andare in un'area di spazio alternativa. Sembra Interessante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "EHI EHI EHIIIII - - - CHI SEI TU? ? ?", + "IO SONO UN VIANDANTE. . . QUESTO È UNO DEI PUNTI DI SOSTA PIÙ POPOLARI LUNGO IL TRAGITTO DA A VERSO B.", + "COSA È \"A\"? ? ? È LA MIA CITTÀ NATALE. . . VADO A VISITARE UN VECCHIO AMICO A B. . . È UN LUNGO VIAGGIO. . . MA FACCIO SACRIFICI. . . TU NO? ? ? RENDONO LA VITA PIÙ INTERESSANTE! ! !") + } +, + quest_event:{ + dialogue:new Array( + "OHH - - - CERCHI UN ALTRO UMANO - - - CAPISCO. ^ LASCIA CHE ACCEDA ALLA MIA MEMORIA. . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA. . . \n QUEL TIPO HA AVUTO UN LAMPO DI GENIO E HA DETTO CHE SAREBBE ANDATO VERSO UNA CASETTA IN UN GIARDINO BEN CURATO. \n ORA CHE CI PENSO. . . TU GLI SOMIGLI MOLTO! ! ! SEI SICURO CHE LUI NON FOSSE TE? ? EH? MMH?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "In realtà stavi... ehm, ah. Ben fatto.", + "La roccia riflette parzialmente la luce accecante della stanza. C'è inciso qualcosa:\"Presto, prima di dovermene andare di nuovo(si sta illuminando sempre di più, succede ogni volta)- la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\"") + } +, + quest_event:{ + dialogue:new Array( + "La roccia lucente riflette solo parzialmente la luce della stanza. C'è inciso qualcosa:\"Presto, prima di dovermene andare di nuovo(si sta illuminando sempre di più, succede ogni volta)- la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "CIAO. HAI GIÀ INCONTRATO cubo?", + "cubo È UN OTTIMO SOVRANO DI QUESTA PORZIONE DI SPAZIO. ANCHE NOI ALTRI SOVRANI FACCIAMO DEL NOSTRO MEGLIO NEI NOSTRI SPAZI.") + } +, + gray2:{ + dialogue:new Array( + "CHE NE PENSI DI QUESTA PARTE DI SPAZIO? È UN BUON PUNTO DI INCONTRO, NO?", + "UNA INTERSEZIONE DI MONDI!") + } +, + gray3:{ + dialogue:new Array( + "NESSUNA DI NOI PIRAMIDI GRIGIE È DAVVERO QUI. USIAMO DEI CONGEGNI SPECIALI CHE CI PERMETTONO DI PROIETTARCI QUI.", + "PERCHÉ LO FACCIAMO? PERCHÉ VOGLIAMO PARLARE CON IL NOSTRO AMICO cubo E TENERE COMPAGNIA A cubo.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "... IL DISPOSITIVO OLOGRAFICO STA FUNZIONANDO CORRETTAMENTE?", + "NO?^...^MALEDIZIONE!") + } +, + color1:{ + dialogue:new Array( + "Hai conosciuto CUBO? Fa delle cose fantastiche! Ho sentito che una volta è rimasto appoggiato su uno spigolo per circa dodici secondi. Oh cielo! Sai che significa per la Lega degli Appoggiatori sugli Spigoli? No? Beh, molto!") + } +, + color2:{ + dialogue:new Array( + "CUBO fa un sacco di lavoro Interessante!", + "Hai sentito? Pare che fra poco toccherà a me fare il sovrano! Fra qualche minuto, credo.") + } +, + color3:{ + dialogue:new Array( + "Vengo da Pan di Zucchero, vado verso Taipei. Perché sono qui? Oh, sono passato a salutare CUBO!", + "Non essere così abbattuto! Questo posto è solo una strana rappresentazione per non shockare tutti i visitatori. Per quanto ne sappiamo, è per la maggior parte innocuo.") + } +, + colordead:{ + dialogue:new Array( + "(... sta facendo un pisolino?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "OGNI GENERAZIONE NASCE NEL DOLORE PER MORIRE NEL DOLORE. NON SOFFRIREMO PER CONTINUARE IL CICLO. NON ANDREMO ALL'ESTERNO.") + } +, + after_fight:{ + dialogue:new Array( + "È QUESTO IL TUO CASTIGO PER LA NOSTRA RIBELLIONE?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Perché privi Colui Che Vede dei suoi sacrifici? Perché ci hai rubato la nostra salvezza?") + } +, + after_fight:{ + dialogue:new Array( + "... Abbiamo fallito nel fartela pagare per la tua Interferenza. Eppure... ci hai ridato la possibilità di essere liberi. Grazie, Young. Possa Colui Che Vede concederti nuovamente il suo favore.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Che bello vederti, Yang. Ne è passato di tempo. Stai ancora giocando a quei nintendo, eh?") + } +, + after_fight:{ + dialogue:new Array( + "Per amor del cielo, Yon, quando ti deciderai a crescere? Sai, dovrai imparare ad avere a che fare con la gente prima o poi.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Qui disponiamo di tutti i comfort. Ti piace la nostra piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "Che ne pensi del nostro centro fitness di ultima generazione?") + } +, + after_fight:{ + dialogue:new Array( + "Speriamo che ti sia goduto il soggiorno!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Oggi è una bella giornata.", + "Grazie per avermi grattato la parte che mi prudeva sul collo - non riuscivo a raggiungerla.", + "Ho sentito che il ristorante qui in zona fa delle ottime uova. Ho anche un coupon per prenderle.", + "Hai visto l'incidente d'auto di oggi? È stato orribile! Lui era al cellulare. Che peccato, così giovane!", + "Mio figlio non è riuscito a entrare nella squadra giovanile dell'università. Che delusione. Abbiamo investito così tanto nella sua carriera sportiva.", + "Oggi è il giorno del ringraziamento. Sono grato per molte cose. Non vedo l'ora che arrivi domani mattina per i saldi. Farò un sacco di affari.", + "Ah, penso che potrei far tardi a lavoro.", + "Vado un po' di fretta, devo tornare a casa per mettere in ordine prima che arrivino i miei suoceri.", + "Stiamo facendo un mercatino dell'usato in garage!", + "Benvenuto!") + } +, + words_teen:{ + dialogue:new Array( + "Non ho visto l'ultimo film.") + } +, + words_kid:{ + dialogue:new Array( + "Non devo mai vedere l'ultimo cartone!") + } +, + family:{ + dialogue:new Array( + "Benvenuto nella nostra casa, straniero! Mi sembri familiare. Questa è una cittadina pacifica. Abbastanza tranquilla, senza molti visitatori.", + "Ti piacciono i Davement? Mio fratello Dave mi ha fatto sentire una loro canzone molto bella!") + } +, + older_kid:{ + dialogue:new Array( + "I miei amici amano ascoltare \"Nessuna sopresa\" delle \"Teste di radio\" e lamentarsi di questo posto. Non sarà fantastico, ma che diamine, almeno mostra un po' di gratitudine! O fa' qualcosa per cambiarlo! Sono tutti dei... Oh, scusa. A volte tendo a fare così...", + "Andrò a scrivere sul mio blog.", + "Certo che sembri Intontito.", + "Ho difficoltà a sentire i miei stessi pensieri con gli sport a tutto volume alla TV, ma ai miei genitori piace.") + } +, + hanged:{ + dialogue:new Array( + "Un biglietto sul cadavere:\"Così non sarò più in pericolo.\"") + } +, + festive:{ + dialogue:new Array( + "Oh, che succede fuori? Un festival? Una parata?", + "Sembra che ci sia una bella confusione lì fuori! Hai guardato fuori dalla finestra di recente? Mi chiedo cosa possa essere.") + } +, + paranoid:{ + dialogue:new Array( + "In casa mia ci sono molte finestre. Non mi piacciono le finestre. È come se qualcuno stesse sempre guardando dentro. E tu sai che CI DEVE essere qualcosa là fuori. Non può essere sempre così silenzioso, così silenzioso e tranquillo - mi inquieta.", + "Assassini? Cosa? Fuori? Di che stai parlando? Mi stai prendendo in giro? Non ci sono mai stati assassinii in questa città prima d'ora, ma... stai iniziando a farmi preoccupare... penso che forse dovresti andartene.", + "Per piacere, vai via.") + } +, + dead:{ + dialogue:new Array( + "Questa donna è stata colpita a morte con un corpo contundente.", + "È stato davvero un duro colpo...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Oh, sei tu! Mi sembri familiare... non posso muovermi finché non uccidi abbastanza cittadini, ricordi? Torna fra un po'.", + "Secondo questo volantino... devi uccidere ancora qualche persona! Continua così.", + "Ci serve solo un altro corpo, poi potremo continuare.", + "Ben fatto. Sentiti libero di entrare. Non ho idea di cosa ci sia lì dentro. Ci vediamo domani a quest'ora, giusto? O la notte successiva?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "Non mi importa se gli alberi mi guardano.", + "Dov'è lei?!", + "Sarò con te, Young, ogni volta che sarai solo.", + "Sei un Ookchot? Mia madre mi ha sempre messo in guardia contro il Pericoloso Ookchot.", + "È da un gel po' che non ci vediamo, Young! Blobabilmente non dovrei pensarci ma... Mi trovi flaccido? Mi hanno dato del Buddhino!", + "Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Meno, Per, Diviso, Fratto...", + "Offerta limitata! Compra uno, prendi uno gratis - solo per oggi!", + "Ricordi quella volta che hai acceso una candela perché era andata via la luce?", + "Mmmm, si stava comodi sul tuo cuscino ieri notte.", + "Questo gli insegnerà a non chiamarmi fumi-GAY-tore.", + "Manu e io facciamo una bella squadra.", + "Sono l'Aspirante Prescelto!!!", + "A volte non ti sembra che, qualunque cosa tu faccia, non puoi impedire la fine del mondo?", + "Attento ai funghi della foresta...", + "Mi dispiace. È la mia natura.", + "In che senso, SOLO una roccia?? Anche le rocce possono stare sulle carte, sai?!", + "Dai un pesce a un uomo, e lui mangerà per un giorno. Insegna a pescare a un uomo, e gli darai dei momenti in cui legare con suo figlio Jimmy.", + "A volte la risposta è fare una passeggiata.", + "Perché i pipistrelli volano basso ogni volta che ti avvicini?", + "NO, *TU* HAI BISOGNO DELL'APPARECCHIO!", + "SEI FELICE ORA?", + "Non usare la violenza vicino a me.", + "Ho sempre voluto partecipare a Master Chef.", + "La mamma diceva sempre, 'se inarchi così la schiena finirai per rimanere così!'", + "Ti stai divertendo, umano?", + "...", + "Scientificamente parlando, i rospi sono un sottoinsieme delle rane.", + "AHAHAHAH! Sì! LO SO!", + "Oh, anche tu collezioni carte? È molto di classe, Ying.", + "Mi dicevano sempre, \"Smettila di stare al computer! O non avrai nessun amico!\"", + "Sono il sovrano solo per la durata di una conversazione.", + "Scommetto che pensi di 'star rendendo il mio lavoro Interessante'!", + "Odio le diagonali.", + "Non pensare che uno stupido antistaminico funzioni con me.", + "Usa questa carta per sbloccare la porta della tua stanza!", + "Sto facendo un ottimo lavoro.", + "........??", + "Chi diavolo ci ha scolpiti?", + "Spero che tu abbia trascorso un piacevole soggiorno.", + "Visto che sei arvrivato fin qui, devi essere un tipo Interassante.", + "Sono qui solo per portarti fuori strada.", + "Tu ci sembri una piramide!", + "È sempre lo stesso maledetto spettacolo, notte dopo notte, e la paga fa schifo.", + "Lasciami in pace! Il mio cognome non è Sachs!", + "Almeno non sono solo una mazza.", + "Il denaro non cresce sugli alberi? Che vuoi dire? Eheheheh!", + "Non sono altro che un'illusione.", + "MI SFOGHERO' CON TE.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Premi", + "Per selez. comandi.", + "Per cancellare.", + "Su", + "Giù", + "Sinistra", + "Destra", + "Salta", + "Attacca", + "Menù", + "Premi", + "per uscire", + "per impostare i comandi.") + } +, + title:{ + dialogue:new Array( + "Premi le\nfrecce direzionali per ridimensionare\nla finestra finché\nnon riesci a vedere\nzone nere sui\nbordi.\n\nPremi", + "Quando hai terminato.", + "ANODYNE", + "Melos Han-Tani\Marina Kittaka", + "Qualunque tasto", + "Premi", + "Per iniziare", + "Versione", + "Continua", + "Nuovo gioco", + "Sei sicuro?\nNo\nSì", + "Davvero?\nNah\nDai, sì", + "Davvero davvero??\nScherzavo\nCerto", + "morti", + "carte", + "Anodyne supporta\nla maggior parte dei controller.\n\nNe userai uno?\n\nSì No\n\nSe sì, connettilo adesso.\n\nMuoviti con le frecce direzionali\n\nSeleziona usando\nC, SPAZIO, o ENTER\n\nSi applicherà sì di default in\n", + "Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", + "NOTA\n\nSe ci sono lag di movimento\ndurante la partita,\nritorna alla schermata inziale e\nrientra in Anodyne.\n\nPREMI C PER CONTINUARE\n\nL'interfaccia grafica non appare come dovrebbe?\nPremi il tasto qui sotto\n\ne orienta di nuovo il dispositivo.") + } +, + gui:{ + dialogue:new Array( + "menù=enter", + "Salvataggio...") + } +, + map:{ + dialogue:new Array( + "Mappa", + "Stanza attuale", + "Porta/Uscita", + "Ness. mappa", + "Ritorna al\nNexus", + "Ritorna\nall' entrata") + } +, + items:{ + dialogue:new Array( + "Oggetti", + "Normale", + "Scambia", + "Estendi", + "Amplia", + "Un paio di scarpe a molla - premi", + "per saltare!", + "Un paio di scarpe da ciclismo.", + "Una scatola di cartone vuota.", + "Una chiave trovata nel tempio di Colui Che Vede.", + "Una chiave trovata in una caverna sotterranea rossa.", + "Una chiave trovata in una caverna di montagna.") + } +, + cards:{ + dialogue:new Array( + "Carte", + "carte") + } +, + save:{ + dialogue:new Array( + "Salva", + "Salvato!", + "ERRORE", + "Salva e torna\nalla schermata iniziale", + "Vai alla schermata iniziale", + "Salva ed esci", + "Esci dal gioco", + "Morti:") + } +, + config:{ + dialogue:new Array( + "Config", + "Imposta comandi", + "Imposta volume", + "Autosalvataggio nei\ncheckpoint:", + "Attivato", + "Disattivato", + "Cambia\nRisoluzione:", + "Config. Interfaccia", + "Touch + Frecce", + "Solo frecce", + "Solo touch", + "Impostazioni movimento:", + "Risoluzione:", + "Mod. finestra", + "Regola Int.", + "Estendi", + "risoluz.:", + "Lingua:", + "ja", + "en", + "Trascina i\npulsanti\nfino a raggiungere\n una posizione ideale.\n\nPoi, tocca il\nmenù\nper continuare.\n\n", + "Dimensione\nfinestra", + "Config. joypad") + } +, + secrets:{ + dialogue:new Array( + "Ci sei dentro fino al collo!", + "Un tempo di proprietà di un famoso Mago delle Bolle.", + "Se la grafica sembra criptata, cerca la definizione del pokedex di un pokemon ufficiale.", + "Questo cuore non ha nome.", + "Prego, fai visita al mondo dei mostri elettrici.", + "La statua di un gattino. Carina, ma inutile.", + "Oh cielo!!!!", + "Oh no!!!!", + "È nero.", + "È rosso.", + "È verde.", + "È blu.", + "È bianco.", + ":Seleziona", + ":Indietro") + } +, + swap:{ + dialogue:new Array( + "Scusa!", + "Lo swap non funzionerà qui.", + "Young non è riuscito a raccogliere forze a sufficienza per usare lo swap qui.") + } +, + keyblock:{ + dialogue:new Array( + "Questa porta è chiusa.") + } +, + treasure:{ + dialogue:new Array( + "Una forza misteriosa ti impedisce di aprire questo forziere.", + "L'incisione sul manico della scopa recita:Premi", + "per spazzare.", + "Questa chiave può essere usata una sola volta per aprire un ostacolo che blocca il tuo percorso.", + "Un misterioso paio di scarpe di marca con su scritto\"Premi", + "\".", + "Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria AMPLIA dal menù per permettere alla scopa di rilasciare polvere nociva a destra e sinistra.\"", + "Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria ESTENDI dal menù per permettere alla scopa di rilasciare polvere nociva in avanti, oltre il suo normale raggio.\"", + "Una nota accanto alla miglioria della scopa:\"Ciao, Young. Usa questa miglioria SWAP per scambiare di posto due pezzi di terreno. Potrebbe volerci un po' affinché tu possa usarla ovunque, ma dovrebbe esserti utile per ora.\"", + "HAI TROVATO UN CUORE!!!! Vita massima aumentata di... zero.", + "Goldman:Cosa? Non è qui? Quel negoziante deve averlo rubato!") + } +, + dust:{ + dialogue:new Array( + "La tua scopa ora è piena di polvere! Attacca di nuovo per farla posare.") + } +, + checkpoint:{ + dialogue:new Array( + "Vuoi salvare?\n Sì\n No", + "Mentre sei su un checkpoint, premi", + "Per salvare i tuoi progressi e ripartire da qui se dovessi morire.") + } +, + rock:{ + dialogue:new Array( + "C'è qualcosa scarabocchiato su questa roccia:") + } +, + door:{ + dialogue:new Array( + "Il portale non sembra essere attivo.") + } +, + keyblockgate:{ + dialogue:new Array( + "Il cancello non si muove. Non si aprirà finché non percepirà la presenza di quattro carte...", + "Avendo percepito la presenza di quattro carte, il cancello decide di aprirsi.", + "Il cancello rimane ostinatamente chiuso.", + "Il cancello percepisce tutte le carte e decide di aprirsi.", + "Il cancello percepisce abbastanza carte e decide di aprirsi.", + "Si apre!", + "Rimane chiuso.") + } +, + solidsprite:{ + dialogue:new Array( + "Il cartello indica a est ma le parole sono sbiadite.", + "Il cartello indica a ovest ma le parole sono sbiadite.", + "Le parole sul cartello sono sbiadite.") + } +, + mitra:{ + dialogue:new Array( + "Ehi Young!", + "Queste scarpe da ciclismo sono per me? Wow! Grazie, Young! Stavo proprio pensando di prenderne un paio, visto che Manu ha dei pedali ai quali puoi attaccare questo tipo di scarpe. Tieni Young, prendi le mie scarpe in cambio! Hanno queste molle fighissime che ti fanno saltare molto in alto! Premi", + "per saltare mentre le indossi!", + "Ciao, Young! Noti niente di nuovo? ^... ^... Oh beh, vedi, ho comprato questo nuovo paio di scarpe da ciclismo! Si attaccano ai pedali di Manu. Visto che non mi serviranno più le mie vecchie scarpe, voglio che le abbia tu, Young! Hanno queste molle fighissime che ti fanno saltare molto in alto!", + "per saltare mentre le indossi!", + "Beh, ciao!", + "Forza, provale! ... Non puzzano COSì tanto.", + "Belle, eh?", + "Ehi, quelle sono le scarpe da ciclismo del negozio di Flinty? Le stai dando a me? Grazie Young, lo apprezzo moltissimo! Tieni, in cambio prova queste scarpe -- Sono sicura che le troverai molto utili! Sulle scarpe c'è scritto \"Premi", + "per saltare\" Non è molto chiaro però, non c'è nessun \"", + "\" sulle scarpe...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Benvenuto, benvenuto Young, amico mio! Io sono Prasandhoff--Finty Prasandhoff! Dai un'occhiata e fammi sapere se ti Interessa qualcosa!", + "Finty:Ti sono ancora grato per quella scatola!", + "Finty:Ah, una scatola! Grazie mille! Ora posso portare la mia merce a casa di notte e di nuovo qui al mattino!", + "Aspetta un momento... non è qui! Che è successo? Aspetta, lasciami tamponare le tue ferite!", + "Come segno della mia gratitudine, prendi queste eleganti scarpe da ciclismo!", + "Buongiorno, amico mio! Una splendida mattinata, non trovi? Un'ottima giornata per fare compere! Vorrei solo avere una scatola per poter trasportare la mia merce.", + "Peccato, pare che non ti possa permettere questo oggetto! Torna più tardi, quando avrai il denaro!", + "Finty:Ah, hai buon occhio! Hai bisogno di un'arma migliore, non è così? Fai saltare in aria i tuoi nemici per soli $499.99!", + "Finty:Quel sacco per le monete ti permetterà di accumulare il denaro che trovi nella Landa! È tuo per soli $869.99!", + "Finty:Oh ho ho, questo è un oggetto assolutamente speciale:scarpe da ciclismo che si attaccano ai pedali, per essere veloci ED eleganti! È in offerta a soli $299.99!", + "Finty:Stanco di spostare la polvere con la tua misera, piccola scopa? Oblitera le particelle di polvere nociva con questo aspirapolvere all'avanguardia! A soli $749.99, o in quattro piccole, comode rate mensili da $199.99!", + "Come segno della mia gratitudine, ti dono questa orribile--volevo dire, stupenda carta da collezione!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nUn gioco creato da\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n-------------", + "Creato fra\n\nmarzo 2012\n\ne\n\ngennaio 2013", + "DESIGN\n------\nEntrambi", + "PROGRAMMAZIONE\n-----------\nMelos, con la\nlibreria di Flixel\nper Actionscript 3\n\n\n\nART\n---\nMarina\n", + "MUSICA/SFX\n---------\nMelos, con REAPER\ne soundfonts\ngratuiti.\n\n\n\nDIALOGHI\n--------------\nPrincipalmente Marina\n", + "TRAMA\n-----\nEntrambi\nLocalizzazione\ngiapponese:\nKakehashi Games\nLocalizzazione\nspagnola:\nDiego Fenollar\nLocalizzazione\nitaliana:\nFrancesco D'Aucelli", + "Un immenso grazie ai\nnostri testers,\nche hanno sofferto\naffinché voi\nnon doveste\nfarlo!\n--------------\n\nMarina, che ha\nsofferto molto\nper i bug iniziali.\n\nEtan, per il sostegno\ncostante, fin dal\nprincipio, con\nmolti bug \ntrovati, e il\nterzo umano a\ngiocare a quasi tutto\nil gioco.", + "Olivia - grazie,\nsorellina!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos vorrebbe\nringraziare:\n\nMamma e Papà, per il\nloro sostegno costante\nin questa impresa.\n\nS\n\nMolti TIGSourcers\ne altri\ndevs incontrati!\n\nMarina, per aver reso\nquesto gioco possibile,\ne per averlo\nmigliorato in\nmille aspetti.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE i mei altri amici\nche mi hanno\nmostrato sostegno\n(Grazie!)\n\nInfine, ma non \n per importanza,\nTina Chen.\nVecchia amica,\ngraze per il sostegno\ne anche per\navermi presentato\na Marina.", + "I ringraziamenti\n di Marina vanno a...\n\nColin Meloy, per\naver ampliato\nil mio vocabolario\n\nTsugumo, per\n\"E così vuoi fare il\nPixel Artist?\"\n\nAlla mia famiglia,\nper il sostegno\ne il cibo.\n\nA Daniel, per essere un\n\"Indie games dev\"\ncrescendo insieme.", + "Mo, per aver creduto\n in me.\n\nTina, per\navermi presentato\na Melos.\n\nMelos, per aver creato\nun gioco e per esserti\nfidato così\ntanto\ndi me.", + "CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer", + "Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n", + "Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n", + "Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n", + "Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n", + "Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera", + "Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews", + "Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman", + "Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites", + "Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "\n\n\n\n\n\n\n\n", + "Vorremmo infine\nringraziare TE!\nPer aver giocato!\n\n\nSperiamo che\nti sia piaciuto.", + "Ora sei in grado\n di esplorare il mondo\ndi Young senza\n(quasi)alcuna\nlimitazione, spostando\nil terreno con\nlo swap.\n") + } +, + elevator:{ + dialogue:new Array( + "Piano?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancella") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_JP.hx b/intra/source/data/NPC_Data_JP.hx new file mode 100644 index 0000000..3314848 --- /dev/null +++ b/intra/source/data/NPC_Data_JP.hx @@ -0,0 +1,3948 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_JP { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "音楽好きなら,ターミナルに話しかけてみよう!", + "イタイの好きなら,南へ行ってみよう!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "サーカスの団員が落ちそうだ! 安全ネットはどこに?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "ウワーー") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "ライオンたちがジャグラーに近づいてる!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "ブライア:ボクはねヤング つかれたんだ 同じ事のくり返し 同じ夢のくり返し... 終わらない悪夢だ", + "ブライア:...", + "ブライア:永遠に変わらないんだよ ヤング ずっとこのままなんだ") + } +, + after_fight:{ + dialogue:new Array( + "ブライア:さよならだ ヤング") + } +, + final:{ + dialogue:new Array( + "ブライア:おいおい ヤング", + "ブライア:ほら足動かして 手もだ オレがいないと何にもできないのかよ!", + "ブライア:ほら 行こうぜ サンドイッチかなんか食おう", + "賢者:まあ... 及第点だよ... 次に会うまではな") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "なぞの声:こほん... ヤングよ... 私の声が聞こえるかね? ^もしもーし! お 聞こえるようだね... いいかい 間もなくキミは目をさます そうしたら 矢印キーで歩き回れるはずだ", + "人と話したりモノを使ったりするには \'", + "\' キーを押すように", + "それからメニューを開くには \'", + "\' キーだ ここでは自分や世界についての情報が見られる") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "ヤング... 私はただキミのためにすべてを正したかったのだ", + "キミは... もっとうまくやってくれることをねがうよ") + } +, + posthappy_mitra:{ + dialogue:new Array( + "ヤング... がんばってね", + "賢者の言ったこと それなりに合ってる わたしはすべてがステキで完ぺきであってほしくて そのせいで ときには現実だって無視してた", + "ブライアを助けるために何するべきかなんて わからない 世界のしくみも...ここが色々おかしく見える原因だって...でもねヤング わたしはキミの友だちになりたいよ", + "キミはたたかってる 分かろうとしてるじゃない 早くカイケツできるといいね") + } +, + one:{ + dialogue:new Array( + "賢者:ヤングよ... 私からのさいごのけいこくだ... ん?なんだ だれだ?", + "ミトラ:わたしはミトラっていうの こちらはわたしの自転車でウェアズ!", + "賢者:自転車の名前など聞いておらんよ 知らないかおだな ここで何をしている?", + "ミトラ:友だちのヤングを助けにきたのよ", + "賢者:ヤングに友だちなどおらんよ ブライアもおらんというのに ヤングにいらぬことを吹きこむのなら私の世界から出て行ってもらおう!", + "ミトラ:どういうイミ? わたしとウェアズは --", + "賢者:アホみたいな自転車のことは 聞いておらんと言っている!!!") + } +, + hit:{ + dialogue:new Array( + "賢者:...", + "ミトラ:ヤング! 大丈夫?! ウェアズのために...ありがとう... さあ このろくでもない場所を おわらせちゃって! キミならできるよ!", + "ミトラ:ウェアズ!!!!", + "ミトラ:ウェアズ......", + "ミトラ:ちょっとフードのヒト! アナタがなにさまか知らないけど わたしたちのことはほっといてよ!", + "賢者:きさまがヤングの友だちだと? ヤングは本当は完ぺきで 最後には何もかもうまくいくとウソをつくことが友だちだとでも? そうか いいだろう それがお前の望みだというのなら 勝手にすればいい さっさと失せるがいい", + "賢者:\"友だち\"と話せばよかろう", + "ミトラ:わたしたちはただベストを尽くしてるだけなのに...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "フードをかぶった男:さてと そろそろ時間かな ええと...^その...^ やあヤング! 私は賢者 まあ村の長老だ 君に来てもらったのは他でもない 実はセカイに広まった\"クラヤミ\"が 伝説のブライアをさがしているのだ その力を邪悪なことに使うためにね キミにはクラヤミよりも先にブライアを見つけて 守ってほしい", + "さあ 左に使えるようになったポータルがある そこから冒険に出かけなさい", + "ハァ... 何だってまだ うろついてるんだね 早くポータルから出かけてくれ ブライアの ひいては世界の ききだというのに!", + "さあ さっさと行かんか!") + } +, + after_ent_str:{ + dialogue:new Array( + "どうしたのだ?早く進みたまえ") + } +, + after_bed:{ + dialogue:new Array( + "いいぞ ヤング そのようなカギは 他にもあるはず すべてさがし出すんだ", + "さあヤング この世界を歩きつくすのだ \"クラヤミ\"を止めるにはそれしかないのだから") + } +, + before_windmill:{ + dialogue:new Array( + "その3つのカギがあれば \"ザ ランド\"のさらに おくまで 歩みを進められるだろう") + } +, + after_windmill:{ + dialogue:new Array( + "たのんだ通りにやってくれたようだね ヤング だがまだザ ランドでやるべき事は残ってる ザ ランドをくまなく冒険し より多くを成しとげれば... ブライアにまた近づくことになるかもしれん") + } +, + all_card_first:{ + dialogue:new Array( + "フム エリアにあるカードをすべて集めたようだね ポータルの上にある宝石が赤くかがやくのは カードを集めた あかし なのだ") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "賢者:間もなくキミは 力をためされることになるだろう この寺院を生き抜くには 力と知性の両方が求められる さて もう武器は手に入れたかね?", + "ハァ?... ちがっ いや もちろんホウキだとも! えーっと... まさに言い伝えの通りだ", + "... 何でよりによってゴニョゴニョ... おい! 何を突っ立っているだね!", + "気を引き締めてな ヤング") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "賢者:キミはまだ とてもよわい クラヤミからブライアを守るには 己の恐怖を克服しなければならん そこのハコに入っているようなカードは キミの成長のあかしだ たびの間は できるだけ集めるようにしなさい", + "それからカギ これも大事だ カギは他にもあるから よくさがしなさい ああ それからメニューの\"マップ\"からは寺院の入り口までテレポートできる さあ先をいそぎなさい", + "寺院庭園の東と南にすすめば カギがやくだつ 場所があるだろう", + "何だ? 私にくっついて ゲートにもぐりこもうとでも?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "なぜ言うことを聞かない! バカみたいに突っ込めば ブライアとザ ランドを危険にさらすだけなのだぞ! これまでの じゅんびもオシャカだ! すまんがヤング キミが話を聞かぬなら 別の方法で聞かせるしかないようだ") + } +, + after_fight:{ + dialogue:new Array( + "賢者:ヤング... こんなハズではなかったのだ... 私はただ キミにより良い人間になって欲しかった ブライアを助けられるようになって欲しかった しかしすべては くだらぬゲームにすぎない... もう私には キミがブライアのもとへ行くのを止められぬ すべてが じごくになったとき 私が今言ったことを思い出すといい") + } +, + entrance:{ + dialogue:new Array( + "賢者:やあ ヤングよ キミがよりつよく よりかしこくなったとき ブライアへとつづくこの道は開かれるだろう", + "賢者:だが今はまだ早い まずは\"ザ ランド\"にのこる試練を のりこえねばな", + "賢者:ずいぶん成長したな ヤングよ しかしこの門をくぐるには カードが36枚はひつようだぞ") + } +, + etc:{ + dialogue:new Array( + "賢者:ううむ...フム... 36枚以上カードを集めてきたと? しかし本当の試練に立ち向かうには まだ早い気がせんでもない... そうだ... 門に書いてある数字も...36じゃないし...\n...\n......\nほら門には92枚ひつようって書いてあるな!", + "賢者:ヤング 行ってはならん まだ早いのだ! ブライアも ザ ランドも 早まってしまっては ぜんぶ おわってしまう!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "賢者:見事だったぞ ヤング モンスターを倒すだけでなく 己の恐怖にも 打ち勝ったのだから!", + "賢者:もちろん道のりはまだ長い ザ ランドのぼうけんは進んでいるかね?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "賢者:見事だったよ ヤング しかし しれんはまだまだ続く 気をぬかんようにな", + "賢者:ところでカギはぜんぶ集まったかね? まだならビーチに行ってみなさい") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "ぼくはほかの犬とはちがうよ! ワフワフ おそったりしないから...", + "ぼくは ちょうわとしずけさを好むからね", + "きみの匂い スイスチャードのはっぱ みたいだね", + "わんわん!") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "やったわね ヤング! ついに\"クラヤミ\"をたおしたのね! ほら見てこの場所 本当にうつくしいわ!", + "本当に美しいわ...") + } +, + dump:{ + dialogue:new Array( + "ああ良かった! 無事だったか! あの雪だったから うもれちまったのかと思ったよ... それにしてもココは気が めいるよなあ! まいるぜ!", + "アハハハ ウハハハハハ アヒャヒャヒャヒャヒャヒャ!") + } +, + drink:{ + dialogue:new Array( + "キミかわいいねー 一杯おごっちゃうよ!", + "もう一杯どうだい このクソヤロー! ハハハハハ!") + } +, + hot:{ + dialogue:new Array( + "ここ クッソあつい... ホット!ホット! 汗ダラダラ...", + "あー チキショー ワークアウトするとムラムラしてくる!") + } +, + gold:{ + dialogue:new Array( + "この世界って金で できてるって知ってた? かね じゃなくて きん で! そこのレンガひとつ もらって かけおちしましょ 一生あそんでくらせるわよ! アハーハハハー!", + "マジで つったってないで このレンガ外すの手伝ってよ!") + } +, + briar:{ + dialogue:new Array( + "???:ヤング... ついやにったな! よやうく たかすった! もにうどと もにとは もらどんぞ!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "どーいてー!", + "ごめんね... ちょっととばしすぎてたわ... あれ 見ないカオね! キミも旅行中? へ? くらやみからブライアを守る...?^えーっと 何の話かサッパリだけど なんかカッコイイんじゃない!", + "わたしはこのへんをウェアズで走ってたの え...? ちがうよ服のハナシじゃなくて わたしの自転車の名前!", + "きっとまた どこかで会うわよね ブライアのハナシを聞いたらちゃんとおぼえとくね") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "よっし! ウェアズ! いっくよーーー!", + "ドォーーン!", + "ヤング がんばって! わたしたちも ついてるよ!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "わたしのコト 覚えてる? この前は自己紹介してなかったね 自転車のウェアズだけ紹介して... わたしはミトラっていうの", + "わたしのコト 覚えてる? この前は自己紹介してなかったね わたしはミトラ それからこのハンサムでカッコイイ自転車はウェアズっていうの", + "ミトラ:で ヤングは元気だった? へ? なんで名前を知ってるかって? フシギ? えっと その服 背中に名前が書いてあったから", + "ミトラ:それじゃ またね!ヤング") + } +, + quest_event:{ + dialogue:new Array( + "ミトラ:あ 今思い出した... 誰かがね 何かを先に見つけないととか言ってたの 何のハナシかは分からなかったんだけど とにかく山に行くって言ってた すごく急いでたよ") + } +, + game_hints:{ + dialogue:new Array( + "んー 何でもない", + "ん? まよったの? ビーチのほうは もう行ってみた? だれか助けてくれるかもよ カギの使える場所もありそうだけど ほかのカギがいるかもね", + "ん? まよったの? 東にある森はもう行ってみた? あそこ カギの使える場所もありそうだけど ほかのカギがいるかもね", + "わぁ カギそろったのね! そういえば南東に カギがかかった門がいくつかあったような... そのカギで開けられるんじゃない?", + "ふうりょくタービンを動かしたの見たよー! すごいね! あれだけ強いカゼだとさ 自然への影響とかもありそうじゃない?", + "やっほ ヤング! わわ カードいっぱい集めたねえ! ところでこれって何につかえるのかな? 売ったらいいおかねになりそうだよね", + "わー そのホウキの新しいアタッチメント 何? え? 世界のありかたを...変える? ヤング それなんかコワイよ でも何でもってわけじゃ ないみたいで良かった きっと ザ ランドでもホントにおくでしか使えないんじゃないかな", + "ジャンプシューズのちょうしは どう? ケッコウ良いでしょ? わたしも新しいクツ気に入ってるよ ウェアズとの一体感もさらにアップしたし!", + "わあヤング またカギ見つけたの? ウェアズもその色好きだって言ってる! それで カギが使えるトビラとかは見つかった?") + } +, + card_hints:{ + dialogue:new Array( + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院のあたりはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえば見通せし者の寺院のうらぐちに迷路があるって聞いたなあ", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかの近くで何か見つかるかもよ", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院にさ てきが一杯の部屋 なかった?", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院はくまなく さがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかにウラぐちあったでしょ?あの近くにある はいきょ はさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのご近所さんが 何か知ってるかもよ?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパートに住んでるヒト,何か かくしてるみたいだけど...", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパートの入口近く...よーくさがしてみたら!?", + "ミトラ:あ ヤング カードさがしてるの?\nキミのアパート ホントにすみずみまで さがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\nここから南に行くと 島があるみたいなの わたしは行ったことないけど 行ってみたらどう?", + "ミトラ:あ ヤング カードさがしてるの?\n川ぞいには 色んなものが あるみたいよ よーくさがしてみたらどうかな!", + "ミトラ:あ ヤング カードさがしてるの?\nふうしゃの近くに 誰かがカードを置いていったって聞いたけどなあ", + "ミトラ:あ ヤング カードさがしてるの?\n森の中にある川のあたり さがしてみるといいよ...", + "ミトラ:あ ヤング カードさがしてるの?\n山のふもとあたりは もう回ってみた?", + "ミトラ:あ ヤング カードさがしてるの?\n山の頂上って 何かありそうよね", + "ミトラ:あ ヤング カードさがしてるの?\nビーチのはしっこって 何かありそうよね", + "ミトラ:あ ヤング カードさがしてるの?\n赤い森をさんぽしてみるってのはどうかな?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 赤のどうくつのひとつに カギのかかったトビラがいっぱいあるトコロあったよねえ", + "ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつはもうチェックした? 川に沿って進んでみるといいよ!", + "ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつから 川の源泉までさかのぼってみたら?", + "ミトラ:あ ヤング カードさがしてるの?\nえっと... やみの迷宮は すみずみまで回ったのよね?", + "ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 火がわんさか吹き出してる道あったじゃない? あのおくとか ゼッタイ何かありそうだよね!", + "ミトラ:あ ヤング カードさがしてるの?\nサーカスの団員たち 何かかくしているみたいだったけど あのへんはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n男女の二人組が落っこちた大きな穴あったじゃない?あの近くはさがしてみた?", + "ミトラ:あ ヤング カードさがしてるの?\n穴の近くでグルグルしてたあのカップル ゼッタイ何かかくしてるよ", + "ミトラ:あ ヤング カードさがしてるの?\n深い谷とか いかにも何かありそうよね とくに山にあるどうくつとか!", + "ミトラ:あ ヤング カードさがしてるの?\n山にあるどうくつの いちばん高いところとか もう行ってみた?", + "ミトラ:あ ヤング カードさがしてるの?\n山にあるあのどうくつ... あのおくって何があるのかな?", + "ミトラ:あ ヤング カードさがしてるの?\nあの変な空間にいるカラフルなキューブとか ゼッタイ何かかくしてるよ!", + "ミトラ:あ ヤング カードさがしてるの?\nあのナゾ空間にいるモノクロのキューブとはもう話した? あのキューブなら何か知ってるんじゃないかな", + "ミトラ:あ ヤング カードさがしてるの?\nあのホテルのいちばん上のフロアさ 高級感はなかったけど 何か かくされてるかもよ!", + "ミトラ:あ ヤング カードさがしてるの?\nホテル3かいの部屋はくまなくさがした?", + "ミトラ:あ ヤング カードさがしてるの?\nホテルの2かいフロアには誰か何か置いてきてると思うんだけどなあ", + "ミトラ:あ ヤング カードさがしてるの?\nホテルのオーナーさん,キミに何か置いていってくれたかもよ!", + "ミトラ:あ ヤング カードさがしてるの?\n北西のこわれたハシのとこ あのへんてアヤシイよね!", + "...えー!? い ち ま い も カード見つけてないの? ヤング そんなの絶対 おかしいよ!人生たまには冒険しなきゃ!ハコをあけてみるとかさ!") + } +, + general_banter:{ + dialogue:new Array( + "そういえば 山で何かさがしてたヒトには会えたの?", + "ウェアズのみょうじってねー...ウォーリーっていうの ウェアーズ・ウォーリー なんちゃって!ハハン 自転車に みょうじはないから!", + "ねねヤング U字ロック売ってるとこ知らない? ウェアズをしばりつけたくは ないけど 自転車のとうなん 最近多いらしいから...", + "ところでブライアって何なの? 古代文明の失われた いさんとか そういうの?", + "クラヤミが迫ってるとかって話 全然聞かないのよね みんな自分のコトで忙しいってコトなのかな", + "ヤング 今度会ったら言おうと思ってたんだけど キミのヘアスタイルって ステキよ") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "石像:村の長老というのは名前だけ 村などないし 長老でもない") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "石像:ホウキについての言い伝え 用具入れロッカーに入っているとか") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "石像:冒険においてカード集めはとても大事 カードはいろいろ役に立つ クレジットとか みぶんしょうめいとか") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "石像:見事だったぞ 賢者 かんしゃくを起こさず 自己陶酔もしないで ちゃんと定型文みたいなセリフを言ったのだから!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "キミが より冷たく けれども より甘くなったとき キミはアイスクリームかもしれんだろう") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "エドワード:トイレにかがみを取り付けてもらったときにさ 中にかくしカメラがついてるんじゃないかって不安で 不安で とにかくしらべまくって すきまというすきまに オイルソープをすり込んだんだ 回路をショートさせようと思って でも 当然というか カメラなんて入ってなかったんだけど", + "エドワード:ここは見通せし者をまつる寺院なんだ なんでここに来たのかよく 覚えてないけど とにかく こわくて 中には入れないんだ") + } +, + bedroom_not_done:{ + dialogue:new Array( + "エドワード:お困りかい? たぶんそうだよね キミはホウキしか もってなくて ホウキはほこりを移動させる道具だ だよね?") + } +, + bedroom_done:{ + dialogue:new Array( + "エドワード:見通せし者をたおしたって? ハハッ ちがうよ キミはいわば すきまにオイルソープすり込んだ だけなんだ") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "おお ヤング なんとかわいらしい えいゆうごっこかね だがね 私はキミが\"ザ ランド\"に来てからの行ないをすべて知っている それから...この世界で私以上に正直なものはいない だれを信頼するのか よく考えることだね") + } +, + after_fight:{ + dialogue:new Array( + "ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる この先の冒険...私からのアドバイスを よくかみしめることだね") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "岩:周辺視野はアクマの巣") + } +, + two:{ + dialogue:new Array( + "岩:次の仕事:ネクサスへの移動手段を建設する 現在の状況:中断 - 見通せし者から予算を得られず続行不可 今後もあの 謎のポータルを使用し続けるしか方法なし") + } +, + three:{ + dialogue:new Array( + "岩:一人だけ残されてしまった トンネルの作業はじゅんちょうだ 少なくとも 毎日少しずつはすすんでいる") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "ダムを開けるハンドル") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957年6月24日:空中ブランコこわれる アリス・ラトガーズが地面に落ちる 両足のスネを骨折") + } +, + two:{ + dialogue:new Array( + "1957年7月17日:道化師7人が引退 深刻な呼吸器の病 ランドブレンド社のメイク道具が原因と思われるが 公式なそうさは行なわれず") + } +, + three:{ + dialogue:new Array( + "1957年7月21日:オリの誤作動あり 調教前のライオンにおそわれ顔と体に深いキズを負った 生きてはいるがカガミを見るのが こわい") + } +, + four:{ + dialogue:new Array( + "1957年8月5日:夢の中で 顔だけの石像と話す 目を光らせたそれは 私たちの存在理由を話すと 次にいたみから解き放つと言った") + } +, + five:{ + dialogue:new Array( + "1957年8月7日:見通せし者が明かしてくださった真実 それを受け入れるまで どれだけの者が苦しむことになるのか") + } +, + six:{ + dialogue:new Array( + "1957年8月8日:ついに決めた ついてくると言ってくれる者も何人かいる この日記もこれで最後だろう 見通せし者のご加護があらんことを") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(知らない文字で何かが書いてある)") + } +, + two:{ + dialogue:new Array( + "2010年12月7日(名前はよめない):何もない場所じゃないか!このろくでもない岩しかない!") + } +, + three:{ + dialogue:new Array( + "キケン! このどうくつは せいびされていません") + } +, + four:{ + dialogue:new Array( + "このガケははるか上まで伸びているが その先がどうなっているかを見たことはないなあ") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "岩:どうやって?") + } +, + two:{ + dialogue:new Array( + "岩:キケン! ガケあり 飛び込みは自己責任で") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "これはカードゲートの仮アニメーションとして つかってたものなんだ 近づいたりはなれたりすると ゲートが開いたり閉じたりするよ", + "なんでコレ使わなかったのかは忘れちゃったな... ドラマチックすぎたとかかな") + } +, + two:{ + dialogue:new Array( + "これは色んなタイルのレイヤーとかコリジョンをためしたところ! 一方通行タイルを両サイドに置いたりしていじってたんだけど 上手くいかなかったから ボツにした... とかだった気がする", + "これをつかわなかったのは デザインをシンプルにしたからなんだ ゲームを完成させるには大事なことだったんだよ") + } +, + three:{ + dialogue:new Array( + "さいしょはてきを倒すとカギを手に入れられたんだけど けっきょくボツにしたんだ それなりに気に入っていたんだけど", + "他にもチャレンジゲートっていうアイデアもあったんだ これはダメージを食らわずに試練をクリアできた ときだけ開くってやつだったっけ", + "いちじは 全部のダンジョンにつけて HPをなくしちゃおうかみたいな話もあったんだけど けっきょく なんいどが高すぎてダメだったんだ!") + } +, + four:{ + dialogue:new Array( + "ろうやです!", + "助けて!", + "おねがい!") + } +, + five:{ + dialogue:new Array( + "デバッグワールドへようこそ!ここはザ ランドではないので ゲームのストーリーとは(9割がた)関係ないけれど ゆっくりしていってね", + "マップのタイルセットが完成するまでは こういう仮タイルでマップを仮組みしていたんだ このゲームのダンジョンは 実はぜんぶそうやって仮組みして それからジョンが本番用タイルで置きかえていったんだよ") + } +, + six:{ + dialogue:new Array( + "若い女性") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "- 記録保存庫 -", + "注意してお進みください") + } +, + four:{ + dialogue:new Array( + "西:裂け目->現実へ! 不動産価値ひくめ ハリケーンあり 年代物 荒れほうだい リラックス効果") + } +, + three:{ + dialogue:new Array( + "見通せし者は おぼえているかぎりでばばばば......ヤー ヤッパリ ウチハ オチツクネー") + } +, + two:{ + dialogue:new Array( + "れいぞうしつ\n\n^ -- MGMT") + } +, + one:{ + dialogue:new Array( + "つづきから") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "西:ビーチ\n\n東:森\n\n南東:\n 熱帯雨林\n\n北:\n寺院庭園\n\n北の果て:ふかい谷") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "西:ランド湖\n南のち東:がけ") + } +, + two:{ + dialogue:new Array( + "森の小さなくつろぎの池 ちょっとひといき いかがです?") + } +, + three:{ + dialogue:new Array( + "おそらく私は このへんぴな場所にずっと いるんだろう") + } +, + four:{ + dialogue:new Array( + "東:がけ") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "灰色のガーディアンタイルを そのスピリットカラーに対応する色の石で置きかえれば 道は開けるだろう") + } +, + two:{ + dialogue:new Array( + "青い石像が動く時\n新たな道が開ける\nガケを抜けてきみょうな次元へ\nその先にはホテルがある\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所を取り仕切っているのは?\"\nこれほど人の魂に囲まれているのに\nぼくはこどくを感じる") + } +, + three:{ + dialogue:new Array( + "赤くさびた像が動いた\nおくへと つづく道が開く\nその先には迷路のようなダンジョンがある\nそしてサーカスへ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所から逃げるために 命をすてたのは誰だ?\"\nぼくはいたみを恐れる 他の人と同じように\nでも それよりも 死が怖い") + } +, + four:{ + dialogue:new Array( + "にぶいかがやきを放つ緑色の像が動いた\nさらにおくへと進む\nこぢんまりとした町を抜けて\nとある住宅へ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"星になぐさめを求めるのは誰だ?\"\n誰かに見られている気がする\nそしてそれは やさしい星々のそれではない") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "岩:ここは未開の地 ザ ランドの外側") + } +, + two:{ + dialogue:new Array( + "岩:これら^円と私は^やくそく^同心円に^全力でおわらせて...^...円が^ ビビービー...") + } +, + three:{ + dialogue:new Array( + "岩:見ててくれ^ -...でも僕はいつも^ - キミの歩みを^ - 再びキミがここに ^ - 現れてくれたらと") + } +, + four:{ + dialogue:new Array( + "岩:ここから見下ろして^ - 私は気がついた^ - ここから見るあなたは^私は彼を愛している^ - 実は何も見えない") + } +, + five:{ + dialogue:new Array( + "岩:申し訳ない - ^でもそうだね 僕らは -^このちらかった -^連絡は取ろうね -^でもポータルは^ - そしたら僕もいけんを -^君をザ ランドに帰すよ") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "人によっては 何度も話すと ちがうことを言ってくれる ことがある", + "岩はちがうけど 岩は いつも 同じ") + } +, + two:{ + dialogue:new Array( + "岩:本当に惜しかったんだ ああ もしも...") + } +, + three:{ + dialogue:new Array( + "岩:好奇心てのはすばらしいね") + } +, + four:{ + dialogue:new Array( + "岩:おおっ...!?") + } +, + five:{ + dialogue:new Array( + "コンピューターたんまつには メールが開かれている 画面が一部こわれているので一部のテキストは よめない メールの中身は...\" やあ ヤング!どうやら [...] 15番目のカード [...] から さけたほうが [...] 考えてみてほしい さて じゅんびはいいかい? 起きてくれ\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "岩:岩に書かれた文字を よんでるなんて 友だち いないの") + } +, + two:{ + dialogue:new Array( + "岩:オーバーロードステーションへようこそ ザ ランドはお楽しみいただけましたか?") + } +, + three:{ + dialogue:new Array( + "岩:たんけんー はっけんー ぼくのせかーい!", + "岩:南には行かないでください 建設中です") + } +, + four:{ + dialogue:new Array( + "岩:5,3にお宝!") + } +, + five:{ + dialogue:new Array( + "岩:おお!見つけたねえ!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "くずれゆく母の体内に 生まれ落ちた わたしたち") + } +, + two:{ + dialogue:new Array( + "私たちの母はある時 自らの母をすてて どくのキリの中へと歩み入った") + } +, + three:{ + dialogue:new Array( + "こんなこと 私たちは のぞんでなかった 母の苦しみの中に 産みおとされることなんて") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "岩:状況から考えるに これらの植物はかなり長いあいだ かつどうをていし しているようだ") + } +, + two:{ + dialogue:new Array( + "岩:南:???^ 北:???") + } +, + three:{ + dialogue:new Array( + "岩:このちいきのいびつな地形は 先住者の祖先が形作ったものだと言われている") + } +, + four:{ + dialogue:new Array( + "岩:かれらは平和的な生物のようだ") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "油性マジックらしきもので書いてある:\"空間\"と\"時間\"の旅人よ かんげいします あなたが足を踏み入れたのは次元の裂け目 りんせつする\"ヤング\"の世界からはるか はなれた場所 いわばあなたは\"海\"をひとつふたつ こえてきたわけです この場所はいろいろ\"ちがい\"ますが恐れないでください あなたはすぐに元の世界にもどるのですから \"不吉\"あるいは\"危険\"に見えるかもしれませんが恐れないでください ここの住民はみなとても\"フレンドリー\"ですので\n -- MGMT", + "(メッセージの下には文字が刻まれている)森で迷った ____(よめない)ここに眠る", + "(その下にまだメッセージがある)(とにかく南には行きすぎるな)") + } +, + two:{ + dialogue:new Array( + "虹に刺された____(よめない)ここに眠る", + "ここに書けるようなじっせきがあれば 良かったんだけど") + } +, + three:{ + dialogue:new Array( + "ガケに八つ当たりされちゃったバードここに眠る") + } +, + four:{ + dialogue:new Array( + "一回も使われなかったバッグ ここに眠る", + "大事にされすぎたね!") + } +, + five:{ + dialogue:new Array( + "サヴィッチここに眠る - ぼくのPCを修理してくれると言ってガレージに来て きゅうくつそうに座り込んで作業しだした 3年後 修理はまだ終わっていなかった そしてかれはコロリと死んでしまった") + } +, + six:{ + dialogue:new Array( + "とりたてて書くことのない男 デイブ ここに眠る") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---ヤング タウン---^\nヤングタウンへようこそ 他人とうまくやれない者もいますので\n 移動のさいはご注意ください... ヤングタウンは市長のイン氏による\n 宅地開発政策の一環として90年代に開発された町です 町の名前は市長の\n イン(陰)氏が自らの名前を拒絶し 自ら選んだヤング(陽)と名乗ったことに由来します\n ごゆっくりお過ごしください") + } +, + two:{ + dialogue:new Array( + "西には伝説の見通せし者の寺院があり 東には我らがイン市長のアパートがあります なお市長のアパートは一般開放されていません 訪れるさいはご注意ください") + } +, + three:{ + dialogue:new Array( + "5回めの訪問時 イン市長は駐車場の少なさに強い不満をおぼえました この駐車場は市長が感じた駐車場の少なさを表しています イン市長はそれ以来 来訪時にはこの駐車場を使うことがあります") + } +, + four:{ + dialogue:new Array( + "昔は長い文章書いてたの思い出すなあ 全然まとまりなかったけど!") + } +, + five:{ + dialogue:new Array( + "A DANGEROUS SITUATION") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "見通せし者はすべてを知り なんじを悟りへとみちびく者 悟りへの道のりを照らす明かりはない") + } +, + two:{ + dialogue:new Array( + "見通せし者の示す道から それてはならない たとえ迷路のかたすみに 宝箱があっても") + } +, + three:{ + dialogue:new Array( + "立ち止まるな") + } +, + four:{ + dialogue:new Array( + "チェイサーは らんぼうすると おこり出す") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "かんこうスポット:\"双子の塔\"しばらく前にけんせつされたこの塔からは 遠くの山々まで見渡すことができます 第一の塔は はそんして以来 別の目的に使われるようになりました 第二の塔は いまだ東にあり 天高くそびえています なお東の塔へ続く道は 安全上の理由から 現在ふうさされています") + } +, + two:{ + dialogue:new Array( + "安全上のお知らせ:^\nこの塔は はそんしていませんが 最上部に次元の裂け目が生じています ちゅういして 広い心をもって すすんでください^\n -- MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "この像は動かせそうにないし 動いてもくれなそうだ") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "この像はしっかり固定されているようだ") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "この像は 動かせそうにない") + } +, + two:{ + dialogue:new Array( + "像は動いたようだ") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "火は美しい そう思わんかね? だが町のあかりは 星のはなつ火のかがやきを かくしてしまう なげかわしいことだ") + } +, + after_fight:{ + dialogue:new Array( + "そうかね 星は火のかたまりじゃ ないのかね^キミは細かいな...") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "やあ 調子どう? 僕はこのパーティションの支配者であり この空間の成り立ちそのものだよ", + "なんで僕がこの場所の支配者か知りたい? いいけど長い話になるよ てか 超長いよ? じんじょうじゃないくらい長いよ", + "マジで 相当かかるけど いやマジで 忠告はしたからね! 僕すぐ話をだっせんさせちゃうしさあ 多分そこにある宝箱の中身さらってサッサと先進んだほうがいいよ それかチョイ遠いけどあっちのホテルに向かうとか なんでココにつながってるのかは分かんないけど 値段はけっこう安いみたいよ まあココではお金とか意味ないんだけど", + "なんで僕が支配者なのかって?^...じつは僕もよく分かんないんだよね ここらの友だちが この空間の現状を考えるとオマエがピッタリだよって言うからやってるんだけど アレかな? ココの支配者ってずっとここに座ってなきゃいけないんだけど キューブって平らな面に置くと安定するじゃない? そういうこと? 分かんないけど", + "あっちの友だちにも やっぱり長所はあるワケ その友だちもいつか支配者になる可能性はあるし 今はできないってだけなのね 僕らってときどき支配者交代するからさ まあそのときは空間のなりたちを変えるわけだけど! たとえば次に定める世界の形によっては ピラミッドさんだか ピラミッドくんが次の支配者になることもあるんよ 彼らが世界にハマる形さえしてればね なりたちを変えるってのはそういう意味なのね アホっぽく聞こえる? まあそうなのかもね でもまあ そういうもんだからしゃあない 世界のなりたちなんて数分とか数時間で変わるしね 長い時間がかかるわけじゃないのよ", + "ともあれ支配者ってのは やっぱ変な気分になるよ 何というか孤立してる感じとか 他人をさけたくなる というかさ", + "...ああ 孤立ってのはちょっと ちがうかな 部分的には合ってるんだけどね じっさい孤立はしてないし 他人も苦手なわけじゃないんだ 僕らはみんな友だちだと思ってるし でもさー みんなココに来ないし 来ても二言三言しか話さないし そういう点では孤立してるなあって思うよね", + "まあ そういう\"どうしてこの空間に僕らが存在してるか\"みたいな話よりさ どうして僕らが友だちなのかのほうが気になるよ", + "まあ今の空間のなりたちでは 僕が支配者やるのがベストってことで なりたちが新しく変わるまでは みんな僕が支配者でいられるように気をつかってくれるし... 物理的にそこに存在してくれる事とかね そういうのは はげみになるよね", + "僕としては それで十分みたいだ まあ一人か二人くらい 支配者の気持ちを理解してくれる友だちがいたらベターだけど でも別に文句言ってるわけじゃないよ! でももしそんな友だちがいたら 支配者が一人じゃない空間とかもありじゃないかって... うわ これすごいアイデアじゃない?! まあ僕が支配者じゃなくなったら 今言ったみたいに ふるまうつもりだよ... できるのかどうかは分かんないけど", + "でも支配者も これ以上はいいかなあ あ そうだ あっちの方向に進むと また似たような空間があるよ まあ匂いはちょっと ちがうだろうけど", + "いやあ でも会えてよかったよ", + "ん? また僕の話ききたいの?", + "オッケー んじゃ ココにすわっとく") + } +, + gray:{ + dialogue:new Array( + "やあ ボクはこの空間の支配者なんだー", + "ん? 何? なんでボクがここにいるか知りたいって? マジで言ってる? 説明し始めたら ちょう長いよ?", + "うーん どうしてもって言うならね... ただ それよりホテルに向かったほうがいいとは思うけどね どうしてホテルを建設することにしたのかはサッパリ分かんないけどさ もし税金かかるとか言われたら ぜったい文句言わないと!", + "やあ ボクはこの空間の支配者やってるんだ でも空間だけで人を支配してるわけじゃないよ", + "友だちもみんな それぞれの空間で支配者やってるけどさ あいつらも人を支配してはいないんだ そういうイミではみんな孤立してんのよね もちろんお互い話したりはするのよ? だからそういうイミでは全然孤立してないんだけど まあここは ボクが存在する空間のひとつってこと", + "ボクと友だちが支配してる空間には 共通点がたくさんあるんだ 存在する理由とか こうぞう あるいはきょうみ よくぼう そういうものがね よく支配のしかたについても話し合うんだよ", + "ひとつ切ないのは 物理的に会うきかいが ほぼ ないってことかな", + "だから話しあうっていっても 物理的に会ってるわけじゃなくて ホログラムに話しかけるカンジなんだ", + "そうなんだよ 切ないでしょ? こんなに共通のわだいがあって 助け合いもするのに 会えないんだからさ", + "面と向かって話さないと伝わらない部分て どうしてもあるじゃない? そういうのがねえ...", + "あ 文句言ってるわけじゃないんよ? 話せるだけでもすごくウレシイし! 話せもしなかったら...それこそサイテーじゃん?", + "いやあ 話せてよかったよ キミのほうもうまくいくといいね", + "あれ まだいるの? もう一回話を聞きたいとか そういう系?") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "クリックソン:来たなイジワル野郎! オメなんか怖くねえぞ!", + "クリックソン:バーカバーカ!オラは逃げたりしねっぞ! さあなぐるなら なぐれー!", + "クリックソン:アホー!とんまー! やーいやーい! こンの恥知らず!") + } +, + thorax:{ + dialogue:new Array( + "ソラックス:オレはソラックス ハチたちの代弁者\n^ハチのうんめい いつも こんめい\n^はたらきバチが逃げ出したよ コロニー\n^そしてほろびたよ 切ないね 心に!", + "ソラックス:新種のウイルスか あるいはのうやくか\n^はたまた タイコバエの幼虫のしわざか!\n^ミツバチみんな うごき オカシイな\n^こんな状況 変えなきゃ オワリだ!", + "ソラックス:オゥケィ オレも原因サッパリ分からねえ\n^じゃあ このMCもたぶんムダじゃねえ?\n^だからってココに 座ってたら 結果はそう ゼツボウです!\n^ならTwitterで!Facebookで!さけぶぜオレらのSOS!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "お買いものは こちらで") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ!", + "ぜったい 逃がさないぞ! 何百年たっても ぜったい!") + } +, + inside:{ + dialogue:new Array( + "何だよう またおどかすつもりかよう?", + "どうせオメーだって ネコがモフモフでかわいいから 味方してるんだろう") + } +, + etc:{ + dialogue:new Array( + "何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ!^ えっ ウワッ!^ それって...?^ ネコがもういっぴき!???^ ウワアアアアアアアアア!!!!", + "オメ... ウチをキレーにしてくれたのか...? うおおん オラ カンドーした! お礼にオラのたからもの あげるよ!", + "ヤングはハコをあけた 中には何か入っている!", + "イッキィ:あらま ミャオか^\n\nミャオ:無事でよかったよう!^\n\nイッキィ:えっと... ヤング 助けてくれてありがとうね", + "イッキィ:正直言えば ハコの中も悪くなかったんだけどね") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "うわ...! 選ばれし者 ヤングさん!? ウワオ!光栄です!ボクはミャオ・シャオ・テュアン・アイ 選ばれし者見習いです!", + "ぜひ少し お供させてください 選ばれし者のカツヤクを生で見たいです!", + "ヤングさん! どうもです 今日もお供していいですか?") + } +, + randoms:{ + dialogue:new Array( + "ミャオ:ドモーっす! そうだヤングさん 何か ぬすんだことって あります?", + "ミャオ:ボク ミトラさん好きっス... ウェアズもハンサムな自転車ですよねぇ", + "ミャオ:ヤングさん そのカッコイイ石なんスカ? タイムスリップとかできるヤツッスか?", + "ミャオ:だんだんイッキィのこと心配になってきたッス... ヤングさん このへんで大きなネコ見ませんでした?イッキィは 東の森をサンポしてくるって言ってたッスが...", + "ミャオ:イッキィから 危ないところには行っちゃダメって言われてるンス... ボクはここで帰るッス!", + "ミャオ:ヤングさんは ダンボールの中に入ったことあります?", + "ミャオ:ヤングさん マタタビってやっぱ やっちゃだめスかね?", + "ミャオ:やっぱ選ばれし者になるには イッパイしゅぎょうしたんスカ...?") + } +, + philosophy:{ + dialogue:new Array( + "イッキィが怖い目にあって 考えたんスけど ボクらは死んだらどこへ行くんスかね? そんで 人生の目標をやりとげることなんて可能なンスかね?", + "それともボクらは 運命をまっとうするまで 生まれ変わり続けるんスかね? あ... それじゃ簡単すぎッスか?", + "そしてその旅路の果てには何があるんでしょう? ただ時間に流されて 消え去るんスかね?", + "フムー...") + } +, + icky:{ + dialogue:new Array( + "やあ ヤング", + "実はボク ホントの名前はイッキィじゃなくて イカボッドなんだ", + "ミャオ・シャオ・テュアン・アイは迷惑かけてない?", + "それじゃあね ヤング") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "やあやあ 見つかっちゃったねえ! まあボクはここに残るよ 外はさむいしね", + "部屋がキタナいのはカンベンしてね このへんはボクが DAME マップエディタで作ったんだ", + "あと このゲームはFlashDevelop IDEとFlixel AS3フレームワークを使って作ったよ!", + "ああ あと音楽は主にREAPER DAWで ときどきAudacityを使って作ったかな", + "ボクはまわりのコンピューターから出る放射線から栄養をとってるんだ^ん? それは生物学的に正しくない?...ってどういうこと?", + "やあ母さん^それから父さんも!", + "このゲーム20分でクリアする方法知りたい?", + "そりゃー教えらんないなー!", + "(丁寧にきかれたら別かもだけど...)") + } +, + marina:{ + dialogue:new Array( + "うおー! やあやあ!", + "このゲームのセリフはだいたいボクがガリガリ書きまくったんだよ^(このセリフはショーンが書いてるけど)", + "このゲームのアートはAdobe Photoshop CS5とGraphics Gale Free Edition,それからWindows 7 Snipping Toolを使って作ったんだ") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "ここはシットリしててお肌にはいいんだけど 髪の毛にはサイテーよね...", + "こうして立ってるのが好きなの 夏になるとさ みんな うだるように暑い外とエアコンの効きすぎた部屋を 行ったり来たり きゅうげきな温度変化は骨に良くないよ", + "氷をかむクセと同じよ わるいクセ うちのママとか 大人になっても氷をかんでたんだけど おかげで今じゃ おくば ヒビだらけなんだよ") + } +, + second:{ + dialogue:new Array( + "クツは脱いだらちゃんと新聞紙つめて かわかしてね ジメジメのままだとバクテリアがはんしょくしちゃうからね", + "なんで食べほうだいのデザートって赤いゼリーばっかりなのかな? お客さんをガンにしたいとしか思えないよ") + } +, + bomb:{ + dialogue:new Array( + "ボクに関わるな", + "マジで... ほっといて") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "同情はいらねえよ ヤング", + "そうかい そうやって幸せな世界の中で生きてりゃいいよ\"選ばれし者\"さんよ...", + "なあ ヤング 友情なんてさ みんなが自分をだましてるから成立するんだぜ オレたちはみんなクソヤローだし 最後にはみんな一人なんだ", + "ハッ! お前がオレをキラいなのは知ってたよ", + "オレは調子よくやってるよ", + "もちろんお前は気にしないよな 誰も気にしやしない") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "街は汚れて人だらけ それは分かってるんだけどさ それでもときどき ここに来て街の明かりを見るのが好きなんだ", + "街には街の美しさがあるだろう? 星のかがやきみたいに永遠じゃないけれど 人間くささっていうのかな それが美しさに深みを持たせてると思うんだ", + "明かり一つひとつのかたわらには だれかがいて 期待や恐れ 秘密なんかをかかえてて だから街の明かりは怖いほどこどくで だけどくっきりと人らしい", + "ここから見えるまどのおくにいる すべての人を 僕は愛してる 一人ひとりが僕の星だからね きみの人生がどれほど ろくでもなくても どこまで落ちていったと思ってても 僕はきみを愛してるんだよ 夜はかがやきにみちてるんだ", + "くだらない おしゃべりを聞かせちゃったね 聞いてくれてありがとう") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "ヘーーーーイ! まあゆっくりして行きなよ!な!?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "わっ! 見つかっちゃったか!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "ゴーレム:来るとちゅう でっかい岩が降ってきたりしなかった? イライラするとどうしても岩投げちゃうんだよねえ 当たったらゴメンね", + "ゴーレム:よく母さんに\"そんな事してたら そのうち山がなくなっちまうよ\"って言われたよ まさかポッキリいっちまうなんてなあ") + } +, + second:{ + dialogue:new Array( + "ゴーレム:岩って長生きだから 何世代にもわたって人間を見ることになるんだ そうして年を重ねて どんな人よりもかしこくなる", + "ゴーレム:...というのがリクツなんだけど ずいぶん前に双眼鏡こわしちゃってさ じつは人の営みもそんなに見てないんだ", + "ゴーレム:じっさい 見ててもタイクツだから 別にいいんだけどね") + } +, + quest_event:{ + dialogue:new Array( + "ゴーレム:ああ うん たしかに人が来たよ 困ってたみたいだった たしか ビーチに向かうって言ってたかな") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "ロブスター? ちがうよ オレはランゴスティーノさ 名前はヒュウズってんだ", + "ヒュウズ:海はいい... 何がいいって 水平線が見えるだろう", + "ヒュウズ:海ってのはいわば 塩味のついた無限の可能性なんだよ", + "ヒュウズ:混んでるビーチなんてのは くもった宝石みたいなもんさ") + } +, + second:{ + dialogue:new Array( + "ヒュウズ:シャコって知ってるかい? シャコには\"じゅようたい\"が16コもあって しがいせんも見えるらしいんだ たくさん色が見えるってどんなだろうね?", + "ヒュウズ:きっと美しいんだろうな でも色がちがうだけで憎しみ合う今の世界を考えれば そうシンプルなハナシでもないのかね") + } +, + quest_event:{ + dialogue:new Array( + "ヒュウズ:だれか 探してるのかい? そういえばオレがここで空を見てたとき あれはちょうど太陽が雲にかくれちまった時だったか 誰かが来て 何か探してるんだがって聞いてきたな 何だったか覚えてないが... そいつは森へ行かねばって言って走り去っちまったよ") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "ジェームズ:木イチゴはいいよね 好物なんだ", + "ジェームズ:木イチゴにオシッコかけないようにね", + "ジェームズ:今年は今のところ18回交尾したかな それから木イチゴは389回食べたかな", + "ジェームズ:ジェームズに木イチゴのおみやげは ない?") + } +, + second:{ + dialogue:new Array( + "ジェームズ:ポエムを かいたよ\n^食べたよ 木イチゴ\n^ハッピーな キモチよ\n^笑顔こぼれて みのり たわわに\n^冬が来るから さらに おかわり", + "ジェームズ:ブルーベリーとラズベリーだと どっちが好き?", + "ジェームズ:ジェームズに木イチゴのおみやげは ない?") + } +, + quest_event:{ + dialogue:new Array( + "ジェームズ:誰か来たよ 木イチゴいらないって言ってた 湖の南まで行って 西に行ったよ") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "オリーヴ:やほ アタシはウサギのオリーヴっていうの", + "オリーヴ:アタシ すっごくたくさん シリアル持ってるんだ シリアルって大好き", + "オリーヴ:アタシのもってるシリアルのハコ すっごく大きいの もうネバーエンディングなのよ!", + "オリーヴ:ネバエンディン シーリアール!", + "オリーヴ:...うーん これじゃ ちっとも悪いことに聞こえないわね") + } +, + bush:{ + dialogue:new Array( + "ランク:ウハハ ヤング おめえバカだなー ホウキじゃ草は刈れねえって!") + } +, + quest_normal:{ + dialogue:new Array( + "ランク:オラはここで 低木を切って くらしてる 低木を刈ってると ゴールドが見つかる時があるんだぜ ウハハハ!", + "ランク:このあたりの低木も さいきんは景気が低迷しててな...", + "ランク:低木を切って ヨメと子供を食わせるのは 楽じゃねえよ ただ暖炉のマキだけは いつでもたっぷりあるがな ウハハハ!") + } +, + quest_event:{ + dialogue:new Array( + "ランク:ん? ああ そういやあ 誰か来たなァ 地下の迷宮に行くとかなんとか きっとそこには 刈り切れないほど草木があるんだろうなあ ウハハ!") + } +, + marvin:{ + dialogue:new Array( + "マーヴィン:おっ やあやあ!", + "マーヴィン:ジャスティンどこだろ...?", + "マーヴィン:このへんにはボトルロケットはないみたいだね...") + } +, + chikapu:{ + dialogue:new Array( + "チカチィー!", + "チカ チカ!", + "チーー^\nカーー^\nプゥウーーー!!!") + } +, + hamster:{ + dialogue:new Array( + "ボブ:ハムスターのボブは 自分のことを三人称で呼ぶんだ", + "しかし句点ってむず,かしいよね", + "ボブ:しずかに! 私は今 ハムスター的オーラをかもしだすべく 集中しているんだ", + "ボブ:...ものごとは実際にやらないと じょうたつしないらしいけれどさ... もしまちがった場合はやっぱり まちがえかたが上手になるのかな?", + "ボブ:本物の男は泣かない... ああ 本物のハーレーに乗り かぜの強いモハーヴェさばくを走り抜ける男が たとえばヘルメットもゴーグルもかけてなかったら 日に焼けた顔についたその目から 涙がひとしずく スッとほほを流れたりするかもしれないけど うん 男は泣かないよね", + "ボブ:このゲームはぼうだいな数のサルが 同じくぼうだいな数のタイプライターを使って作ったものなんだ", + "ボブ:ジェームズが恋しいなあ...") + } +, + electric:{ + dialogue:new Array( + "クリブー:ざんぎゃくこうい手当 ほしいなあ!", + "クリブー:コイン いっこ いれて!", + "クリブー:こだま分隊 に入りたい!", + "クリブー:じゅーびょー!") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "ここで何してるのかって? いい質問ですね! たまたまココに来ちゃって この場所にかくれているんだ ここは安全だし あの変なのに つかまりたくないからね", + "どうも私は ひかく的 うんがいいようだ あのゾンビみたいなのはそこら中ウロウロしてるし... しかし彼らはどうして どうやって死んだのか気になるねえ モンスターにやられた? ラリってトゲにやられた? フムー", + "何にしても 楽しくはなさそうだ 僕はごめんこうむりたいね 物理的にイタいのはいやだもの") + } +, + quest_event:{ + dialogue:new Array( + "ああ そういえば思い出した... たしかにしばらく前 だれか来ましたね 何かをさがしてると言ってたような... キミに似ていた気がするよ ん? いつだったかは思い出せないなあ ここにいると じかんってよくわからなくなるから... あ でも たしか ちかくの町に行くと 言っていたよ") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "やあ", + "何かさがしているの?", + "何見てるの?", + "いや ちがうよ ボクはココの住人じゃない しかし何でかな キミはボクが見えるし話せるのに 他の人はムリなんだ... さつじん者がウロウロしているっていうのに だれも気づかないし... 変だよ...") + } +, + quest_event:{ + dialogue:new Array( + "うん 通りかかった人は いたよ 何かさがしてるって言ってた 何をかは分からなかったけど いそいでた ようすだったなあ 別の空間に行くとか言ってたけど... なんかヘンな言い方だよね") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "ちょっと え? え? キミ誰?", + "ぼくは たんなる旅人だよ ここはAからBへ行く途中にある けっこう人気のあるきゅうけいスポットなんだ", + "Aって何かって? ? ? ぼくの地元だよ . . . 古い友だちに会いに行く途中なんだ . . . 長い旅だけど . . . ぎせいも払うさ . . . キミもだろ? ? ? そのほうが人生しげき的だしね! ! !") + } +, + quest_event:{ + dialogue:new Array( + "ナルホド - - - ホカノ ニンゲン サガシテルノ^チョット メモリ ケンサク シテミマショ - READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \nフムフム. . . \nソノ ニンゲンハ トツゼン ナニカ ヒラメイタ ヨウスデ ナニヤラ テイレノ イキトドイタ タテモノニ ムカウト イッテマシタ\nイワレテミレバ アナタ ソックリ デシタヨ!! ホントニ アナタジャ ナカッタ? ホントニ? アレレ") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "あれ 今...あれ? うん まあ おみごと...!", + "つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\"") + } +, + quest_event:{ + dialogue:new Array( + "つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "やあー! キューブにはもう会った?", + "キューブはこのあたりの空間を支配してる すごくいい支配者なんだ ボクや他の支配者も自分の空間ではけっこう うまくやってるけどね") + } +, + gray2:{ + dialogue:new Array( + "このあたりの空間どう思う? 旅の途中に 立ちよるには けっこういいよね?", + "世界と世界の中間地点!") + } +, + gray3:{ + dialogue:new Array( + "ボクら灰色のピラミッドは ホントはここにはいないんだ 特別なマシンでホログラムを うつしてるってワケ", + "どうしてそんな事するかって? 友だちのキューブと話したり アイツを一人にしたくないからさ") + } +, + graydead:{ + dialogue:new Array( + "zzz... ムニャ...") + } +, + grayspin:{ + dialogue:new Array( + "...ホログラムマシン ちゃんと動作してる?", + "してない?^...^あーもう!!") + } +, + color1:{ + dialogue:new Array( + "キューブにはもう会った? すごくクールなんだよ! 聞いた話じゃあ\n ガケぎりぎりの場所に12びょう近く立っていられるとか!ハンパないよね!\n\"ガケぎり立ちリーグ\"のメンバーならそのスゴさが分かると思うけど! え?\n 分かんない? うーん スゲエってことさ!") + } +, + color2:{ + dialogue:new Array( + "キューブはいろいろ 面白いことしてるんだよ!", + "聞いた? どうやら次の支配者 ボクみたいなんだよね! たぶんあと何分かしたらじゃないかなあ!") + } +, + color3:{ + dialogue:new Array( + "僕はシュガーローフから来たんだ タイペイへ行く途中なんだ ここにいる理由? キューブにあいさつしていこうと思ってね!", + "そんなに落ち込んだカオしないで! ここを訪れる人をおどろかさないように変なすがたしてるだけで キホン的には むがいだからさ") + } +, + colordead:{ + dialogue:new Array( + "(...寝てるのかな...?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "くつうのうちに生まれ くつうのうちに死ぬ そのくり返し 私たちは その苦しみを たち切る 私たちは 二度と外には出ない") + } +, + after_fight:{ + dialogue:new Array( + "これが 私たちの反逆にたいする ばつなのか...") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "どうして見通せし者の いけにえに なるのを拒む!? どうして私たちのきゅうさいを うばう!?") + } +, + after_fight:{ + dialogue:new Array( + "...われらは しかるべき むくいを与えられなかった だが...きみは私たちをふたたび自由をくれた ありがとう ヤング 見通せし者のおみちびきが キミに再びあらんことを") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "しばらくぶりだねえ ヤン 本当に久しぶりだ まだあのファミコンで遊んでるようだねえ?") + } +, + after_fight:{ + dialogue:new Array( + "ええい! いいかげん大人になれ ヤン! どうせさいごには 他人と付き合わなきゃ ならないというのに") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "私どもではさいこうのアメニティをご用意 しています プールはいかがでした?") + } +, + middle_fight:{ + dialogue:new Array( + "私どもの さいしんフィットネスセンターは いかがだったでしょうか?") + } +, + after_fight:{ + dialogue:new Array( + "おくつろぎ いただけましたでしょうか!!!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "やあ 今日もいい日だね", + "背中をかいてくれてありがとう どうも届かなくてね", + "地元のダイナーで出してるタマゴが美味しいって聞いたんだ クーポンも持ってる", + "今日の交通事故見たかい? ヒドい話だよ! メールしてたらしい...当てられたのは小さな男の子だったとか 気の毒に", + "ウチの息子 ジュニア代表チームに入れなかったんだ ガッカリだよ あれだけ 力を入れてきたのに", + "今日は感謝祭だから 色んなものに感謝しないとなあ 明日は早朝セールがあるから たくさん買い物するぞー", + "ああー 仕事に遅刻しちゃう", + "早く家に帰らないと 義理の母さんが来るから そうじしないと!!", + "ガレージセールやってまーす!", + "ようこそ!") + } +, + words_teen:{ + dialogue:new Array( + "最新の映画まだ見てないのに") + } +, + words_kid:{ + dialogue:new Array( + "もう アニメのつづき 見られないよ!") + } +, + family:{ + dialogue:new Array( + "見ず知らずの方 我が家へようこそ! 見たことのあるカオね... ここは平和で しずかな町だから 外から来る人はほとんど いないのよ", + "ねーねー デイブメントは好き? デイブ兄ちゃんが デイブメントのカッコイイ曲をきかせてくれたんだー!") + } +, + older_kid:{ + dialogue:new Array( + "友だちはみんなレイヘッドの\"ノー・サプライズ\"って曲が好きなんだ この町の文句を言ってる歌なんだけど そりゃあ ここは天国じゃないけどさ 感謝くらいすべきだよ! それか自分で変えようとしなきゃ! みんなときたら... あ スミマセン ついアツくなっちゃいました", + "これは自分のブログに書くことにします", + "なんかフラフラしてません?", + "スポーツとかテレビ番組について話すの どうもニガテなんだけど 父さんも母さんも大好きなんだよね...") + } +, + hanged:{ + dialogue:new Array( + "死体の上にメモがある\"これで危険から はなれられる\"") + } +, + festive:{ + dialogue:new Array( + "ねえ 外は何かやってるの? お祭りとかパレードとか?", + "何だか外がおおさわぎだけど 最近マドの外のぞいたことある? 何がどうなってるのか...") + } +, + paranoid:{ + dialogue:new Array( + "ウチにはマドがたくさんあるんだ マドは好きじゃない ずっと誰かにのぞかれてるみたいじゃないか 外で何かが起きてるのは間違いない あまりに長い間しずかすぎるよ こんなにしずかじゃ 気がちって しょうがない", + "さつじん? はあ? 外で? 何を言ってるんだ? からかってるのか? この町でさつじんなんか起きたことがないよ いや...君を見ているとなんだか不安になるよ 早く町を出たほうがいい", + "早く出て行ってくれ") + } +, + dead:{ + dialogue:new Array( + "女性の死体だ 鈍器で殴られたのが死因のようだ", + "男性の死体だ") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "ああ キミか! 見覚えのあるカオだね... いやー ここはまだ通せないよ キミがもっと町の人を ころしまくらないと そういう話だったろう? じゃあ また後でな", + "このパンフレットによれば あと何人か ころせばOKだ さあその調子で行った行った", + "いいぞ あと1人だ さあチャッチャとやって先へ進もう", + "いいぞ! さあ中へどうぞ 中に何があるのかは知らんけれど それじゃあまた明日 同じ時間に あ 明後日だったかな?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "もりの木々がボクを見てる でも ボクは気にしない", + "ジョーカーを止めなければ...", + "ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる", + "キミってオークチョット? ママからオークチョットはあぶないって言われてるんだ", + "ぷるぷる ヤングさん お会いできてこうえいです あ そうだ ゼリーたべます?", + "ピーピーピーピーピーピーピーピーピーピーピーピー ...別にヒワイなことは言ってないです", + "本日限り!なんト!ひとつぶんのお値段デ!ふたつ!ごていきょウ!", + "停電の夜に ロウソクを灯したあの頃を 覚えているかね?", + "カサカサカサッ", + "もやせ もやせ いーろいろ もやーせーええー", + "ウェアズとわたしはいつでも一緒!", + "選ばれし者見習いです!", + "たまにさ 自分が何をしたところで 世界が死にゆくのは止められない なんて感じないかい?", + "森のキノコに ご用心...", + "本当にすみません 本能なんです", + "\"ただの岩じゃん\"ってどういうこと!? 岩だってカードになるよ!いいじゃん!", + "男に魚を一匹やれば一日食いつなぐが,魚の取り方を教えてやれば息子の\n ジミーとの父子のじかんプライスレス", + "歩こう 歩こう こたえは 歩いた先にあるよ", + "なんでコウモリって いつも飛びかかってくるのかな?", + "歯ならびの話はやめろ!!", + "幸せって何だったのかな?", + "私のー 見ている前で 叩かないでくださいー", + "リョーリの鉄人に出るのが夢だったんだよねえ", + "母さんにはよく\"背中曲げてると ずっとその形になっちゃうよ!\"って言われてたなあ", + "お楽しみいただけましたでしょうか", + "...", + "げんみつに言えば ヒキガエルはカエル目にぞくする科のひとつなんだ", + "アハハハハ!!! うん! 知ってた!", + "カードとか集めてるのかい? いいシュミだね インくん", + "たまにはコンピューターやめなさい! 友だちできないよ!ってよく言われたなあ", + "今んとこ支配者やってます", + "アンタ アタシの仕事を面白くしてるとか思ってるでしょ!", + "ななめとか やめろよ", + "オレの花粉だぜ? ヒスタミンなんか効かねえよ", + "お部屋のカギは こちらのカードになっております", + "私に任せておきたまえ", + ".......??", + "ところで私たちに 文字を刻んだのは 誰なのだろう?", + "おくつろぎ いただけましたか?", + "ここまでの道のり見てたよ キミ面白いね", + "迷わせるために 存在してます", + "ボクらにとってはキミもピラミッドなんだけどね!", + "毎夜 毎夜 同じことのくり返し おまけに給料も安いと きたもんだ", + "ほっといて! あと名字はサックスじゃないから!", + "ただのぼう じゃないだけ いいか", + "お金のなる木なんかない? オメ何言ってんだ! ウハハハ!", + "私はまぼろしに すぎない", + "八つ当たりするよ") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "操作設定をするには", + "を,キャンセルするには", + "を押してください", + "上", + "下", + "左", + "右", + "ジャンプ", + "こうげき", + "メニュー", + "しゅうりょうするには", + "を,操作設定をするには", + "を押してください") + } +, + title:{ + dialogue:new Array( + "黒いエリアが見えなくなるまで\n矢印キーをつかって\nウィンドウの大きさを調節してください\nおわったら", + "を押してください", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Press", + "to start", + "バージョン", + "つづきから", + "はじめから", + "よろしいですか?\nいいえ\nはい", + "ホントに?\nやっぱダメ\nホントに", + "取り消せませんからね?!\nやっぱやめる\nわかってるって", + "回死亡しました", + "枚カードを集めました", + "Anodyneは\nコントローラー\nに対応しています\n\n使用しますか?はい いいえ\n\n使用する場合は\n接続してください\n\n矢印キーで移動\nC / スペース / Enterで決定\n\n自動で\"はい\"に設定:", + "注意\n\n入力にラグが\nある場合は\n一度ホームに\n戻ってください\n\nCで次に進みます", + "戻るをもう一度\n押すと終了します\n保存されてないデータは\n失われます") + } +, + elevator:{ + dialogue:new Array( + "何階へ行きますか?", + "1\n", + "2\n", + "3\n", + "4\n", + "キャンセル") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "セーブ中...") + } +, + map:{ + dialogue:new Array( + "マップ", + "げんざいち", + "ドア/でぐち", + "マップなし", + "ネクサスにもどる", + "いりぐちにもどる") + } +, + items:{ + dialogue:new Array( + "アイテム", + "ふつうのホウキ", + "いれかえ", + "えんちょう", + "はばひろ", + "バネが仕込まれたクツ。", + "を押すとジャンプ!", + "じてんしゃ用シューズ", + "カラのダンボールばこ", + "見通せし者の寺院で見つけたカギ", + "地下にある赤い海で見つけたカギ", + "山にあるどうくつで見つけたカギ") + } +, + cards:{ + dialogue:new Array( + "カード", + "xカード") + } +, + save:{ + dialogue:new Array( + "セーブ", + "セーブかんりょう!", + "エラー", + "セーブして\nタイトルへ", + "タイトル画面へ", + "セーブして終了", + "ゲームを終了", + "死亡回数:") + } +, + config:{ + dialogue:new Array( + "設定", + "キー割り当て", + "音の大きさ", + "チェックポイントで\n自動セーブ:", + "オン", + "オフ", + "解像度\n変更", + "UI 設定", + "タッチ+方向キー", + "方向キーのみ", + "タッチのみ", + "いどうそうさのタイプ", + "解像度:", + "ウィンドウ", + "倍率", + "拡大", + "スケーリング:", + "言語:", + "ja", + "en", + "ボタンを\nドラッグ\nしおわったら\nメニューを\n\nタップして\nください\n\n", + "ウィンドウサイズ変更", + "コントローラー設定") + } +, + secrets:{ + dialogue:new Array( + "まいて まいてー!", + "しおづけのおにくのかんづめ すききらいがわかれる", + "グラフィックがおかしいときは パキモンずかんでチェックしてみよう!", + "このハートには特に名前はない", + "きみもデラモンワールドにおいでよ!", + "こねこの像 かわいいけど役には立たない", + "ウワーーー! 見つかった!", + "ヤベー! 見つかった!", + "黒色だ", + "赤色だ", + "緑色だ", + "青色だ", + "白色だ", + ":決定", + ":戻る") + } +, + swap:{ + dialogue:new Array( + "ゴメンなさい!", + "ここでは いれかえ できません", + "ここをスワップするには力が足りない") + } +, + keyblock:{ + dialogue:new Array( + "とびらはカギがかかっている") + } +, + treasure:{ + dialogue:new Array( + "なぞの力により 宝箱はふういんされている", + "ホウキの取っ手に文字がきざまれている\"", + "を押すとホウキを 振るいます\"", + "このカギは一回使うとこわれてしまうようだ", + "ナゾのブーツ。ブランド名は\"", + "ヲ オスト ジャンプ\"", + "ホウキのアタッチメントに何か書いてある\"メニューで\"はばひろ\"をえらぶと ホウキの左右にほこりが広がり こうげきはんいが広くなる\"", + "ホウキのアタッチメントに何か書いてある\"メニューで\"えんちょう\"をえらぶと ホウキの前方にほこりが広がり こうげきはんいが広くなる\"", + "ホウキのアタッチメントに何か書いてある\"やあ ヤング \"いれかえ\"アタッチメントは2つのものを入れ替えられる どこでも使えるわけじゃないけど とりあえずは 役に立つはず\"", + "ハートを見つけた!最大体力がゼロぞうかした!", + "ゴールドマン:ええ? ない?! きっとあの商人がぬすんだんだ!") + } +, + dust:{ + dialogue:new Array( + "ホウキはほこりまみれになった!もう一度ふれば ほこりを置けそうだ") + } +, + checkpoint:{ + dialogue:new Array( + "セーブする?\n はい\n いいえ", + "チェックポイントの上で", + "を押すとセーブされ そこが復活ポイントに設定されます") + } +, + rock:{ + dialogue:new Array( + "岩には何かがなぐり書きされている:") + } +, + door:{ + dialogue:new Array( + "このポータルは作動していないようだ") + } +, + keyblockgate:{ + dialogue:new Array( + "門の一部が石化している これを開くにはカードが4まい必要そうだ...", + "4まいのカードを感知した門が 開きはじめる...", + "門はズッシリとたたずんでいる", + "すべてのカードを感知した門が 開きはじめる...", + "カードを感知した門が 開きはじめる...", + "開いた!", + "トビラはまだ とじている") + } +, + solidsprite:{ + dialogue:new Array( + "東を指すひょうしきだ 文字は消えてしまっている", + "西を指すひょうしきだ 文字は消えてしまっている", + "ひょうしきの文字は消えてしまっている") + } +, + mitra:{ + dialogue:new Array( + "あっ ヤング!", + "え この自転車用シューズ わたしに? スゴい!ありがとうヤング!ウェアズのペダルには固定金具がついてるから ちょうどソレに合うクツを買おうかなって思ってたの じゃあ代わりに このクツあげるよ!バネがついててね すごく高くジャンプできるんだよ", + "を押せばジャンプできるよ!", + "やっほ ヤング!何か気づくコトない...?^... ^...正解は じゃーん! クツが新しくなってる でしたー! 見て見て ウェアズのペダルにカチッとはまるの! それでね 前のクツはいらなくなっちゃったから キミにあげるよ! バネがついててね すごく高くジャンプできるんだよ", + "を押せばジャンプできるよ!", + "オッケ!そんじゃね!", + "ホラホラ はいてみて! ...そんなにクサくないはずだし!", + "ね? よくない?", + "わわっ! それってフィンティのお店にあった自転車シューズじゃない? えっ!? わたしに? ヤング ありがとうー! すごくうれしい! そうだ お礼にわたしのクツあげるよ すごく便利なんだよ えーっとねブランドは...\"", + "ヲ オスト ジャンプ\"だって。イミわかんないよね クツのどこにも", + "ボタンなんか ついてないし!") + } +, + tradenpc:{ + dialogue:new Array( + "フィンティ:あの箱 ホントに助かってるヨ!", + "フィンティ:ヤヤ!この箱は!アリガト アリガト! これで在庫をもちはこべるヨ お礼にこのキモい... じゃないステキなカードをあげマス!", + "ってアレ? ないデス! 一体ドコに... まあいいデス 代わりにキズを手当てしまスヨ", + "ソレでは感謝のシルシに このカッコイイ 自転車用シューズを差し上げマス!", + "イヤア いい日でス 買い物にはもってこいでス! あとは商品を持ち運ぶ箱があったらサイコウなんですガ...", + "ざんねんネ! お客さん お金 たりない! お金をためて また来てクダサイ", + "フィンティ:おお お客さん お目がたかい! いい武器は旅に欠かせナイ! 敵も一発で肉片に!この品がナント! オドロキの! 499ドルよ!", + "フィンティ:このマネーバッグがあれば ザ ランドで集めたお金をもっとたくさん持ち歩けマス! それがたったの869.99ドル!", + "フィンティ:ホッホッホ! とくべつ品が見つかっちゃいマシタ クリップイン式自転車シューズでス もっとはやく カッコよくデスよ 今ならセールで299.99ドル!", + "フィンティ:ホウキにまとわりつく ほこり お手入れタイヘンでショウ? イヤなほこりは最新掃除機でイチモーダジン! 今なら749.99ドル! 月々199.99ドルの4回払いもお選びいただけマス!", + "アリガト!") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nせいさくしゃ:\n\nMelos Han-Tani\n\n\n\nMarina Kittaka\n\n-------------", + "せいさくきかん:\n\n2012 年 3 月\n\nから\n\n2013 年 1 月", + "ゲームデザイン\n------\nふたりとも", + "プログラミング\n-----------\nMelos:Actionscript 3\nと Flixel ライブラリ\nを使用\n\n\n\nアート\n---\nMarina\n", + "おんがく/SFX\n---------\nMelos:REAPER と\n無料のサウンドフォント\nを使用\n\n\n\n会話文\n--------------\nだいたい Marina\n", + "ストーリー\n-----\nふたりとも\n日本語ローカライズ:\nKakehashi Games", + "テスターのみんなに\nありがとう\nちょうタイヘン\nだったよね!\n--------------\n\nMarina,初期のバグ\n対応 すごくタイヘン\nだったよね\n\nEtan,さいしょから\nずっと支えてくれて\nバグもたくさん\n見つけてくれて\nさいごまで手伝って\nくれて ありがとう\n", + "それから妹の Olivia も!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos からの謝辞:\n\n父と母へ - ずっと\n支えてくれてありがとう\n\nS\n\nTIGSource のみんな\n開発者の仲間たちに\nありがとう\n\nそして Marina キミが\nいなければ完成\nしなかったよ", + "Adobe,Adam Saltsman氏\nFlashDevelop の人たち\nREAPER の人たち\nDAME 開発者さん\nDesura,Gamersgate,\nIndieDB,TIGSource\n\n\nそれから友だちみんな\n支えてくれて ホントに\nありがとう\n\nさいごに... 親友の\nTina Chen へ\n\nいつも 支えてくれて\nそして Marina を紹介して\nくれて ありがとう", + "Marina からの謝辞:\n\nColin Meloy へ\n僕の表現力を高めて\nくれて ありがとう\n\nTsugumo へ\n\"え,オマエ ドット絵\nアーティストやるの?\"\n\n家族のみんな\n支えてくれて \nご飯食わせてくれて\nありがとうでした\n\nDaniel へ\n小さな頃から\n僕と一緒に\n\"インディー開発者\"\nでいてくれてありがとう", + "Mo へ\n信じてくれてありがとう\n\nTina へ\nMelos を紹介してくれて\n本当にありがとう\n\nMelos へ\n一緒にゲームを作って\nくれて そして僕を\nしんらい してくれて\nありがとう", + "出演\n----\n\n\nスライム\n\n\nじゃまなアレ\n\n\nポウポウ\n\n\nシールディ\n\n\n見通せし者", + "押してくるアレ\n\n\nオン オフ\n\n\nフォーシューター\n\n\nスラッシャー\n\n\nローグ\n", + "イヌ\n\n\nカエル\n\n\n回るヤツ\n\n\nヒト\n\n\nカベ\n\n", + "ネズミ\n\n\nガス男\n\n\nカサカサ虫\n\n\nダッシュマシン\n\n\nローラー\n\nウォッチャー\n\n\n", + "ダストメイド\n\n\nはきだし草\n\n\n支配人\n\n\n", + "ライオン\n\n\n曲芸の人たち\n\n\n燃える柱\n\n\nしもべ\nアーサー\nハビエラ", + "ついてくる人\n\n\nエドワード\n\n\n釣り師\n\n\nレッドウォーカー\n\nヒュウズ", + "ウサギ\n\n\nイッキィ\n\n\n商人\n\nミャオ・シャオ・テュアン・アイ\n\nランク\n\nゴールドマン", + "ソラックス\n\nジェームズ\n\nキノコ\n\nクリックソン\n\nゴーレム\n\n住民", + "チェイサー\n\n\nホログラムのアレ\n\n\nあの空間の住人\n\nキューブキングたち", + "ヤング\n\n\nミトラ\n\n\n賢者\n\n\nブライア", + "そして...\nあそんでくれた\nあなたに... ありがとう!\n\n\n楽しんでもらえたなら\nウレシイです", + "\n\n\n\n\n\n\n\n", + "スワップを活用して ヤングの世界を\n(ほとんど)制限なくぼうけん\nできるようになった!") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_KR.hx b/intra/source/data/NPC_Data_KR.hx new file mode 100644 index 0000000..d89b32c --- /dev/null +++ b/intra/source/data/NPC_Data_KR.hx @@ -0,0 +1,3947 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_KR { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "음악을 좋아한다고? 터미널이랑 대화해봐!", + "고통을 좋아한다고? 남쪽으로 가봐") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "저 곡예사는 균형을 잃고 있어! 안전망은 어디있는 거지?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "우와!") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "사자가 곡예사랑 가까워지고 있어!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "브라이어:피곤하군, 영. 난 이럴 때가 피곤해. 마치 같은 악몽속에 다시, 또 다시 살고 있는 것 같아,", + "브라이어:...", + "브라이어:아무리 해도 바뀌지 않을거야, 영. 계속 그대로일 거라고.") + } +, + after_fight:{ + dialogue:new Array( + "브라이어:작별이네, 영.") + } +, + final:{ + dialogue:new Array( + "브라이어:이봐, 영.", + "브라이어:천천히 다리랑 손을 움직여봐. 이런, 나 없인 움직일 수도 없는 거야?!", + "브라이어:좋아, 가자, 샌드위치인지 뭔지를 먹으로 가자고.", + "현자:자네... 그 사이에 잘 해낸 것 같아 보이는군.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "의문의 목소리:이봐? ...영? ^이봐!!! ... 오, 내 말이 들리나? 좋아, 내 말 잘 듣게. 우선 움직이는 법을 알려주겠네. 방향키를 사용해서 움직일 수 있네.", + "아마 \'", + "\' 버튼을 눌러서 앞에 있는 사물이나 사람들이랑 상호 작용을 할 수 있을 걸세.", + "그리고 \'", + "\' 버튼을 눌러서 메뉴로 갈 수 있네, 메뉴에서 자네에 대한 정보와 환경을 볼 수 있을걸세.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "영... 난 그냥 자넬 위해 모든 것을 되돌리고 싶네.", + "부디... 자네가 나보다 더 나을 거라고 믿네.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "행운을 빌어. 영.", + "현자의 말이 어느 정도는 맞아. 난 모든 것이 깔끔하고 완벽하게 해결됐으면 좋겠어, 그리고 난 나의 이러한 점 때문에 현실을 무시하게 되버리기도 해.", + "난 네가 브라이어를 돕기 위해 무엇을 할지 몰라. 난 어떻게 이 세상이 계속 앞을 향해서 나아 가는지, 아니면 왜 모든 것이 신비스럽고 이상한지 이해할 수 없어. 하지만 난 너의 친구가 되고 싶어, 영.", + "넌 싸우고 있어, 영. 넌 이해하려고 노력하고 있어. 난 네가 해낼 수 있기를 희망해.") + } +, + one:{ + dialogue:new Array( + "현자:영... 이건 내 마지막 경고네... 기다려, 저 자는 누구지?", + "미트라:내 이름은 미트라다. 그리고 이건 내 자전거, 이름은 상품이지!", + "현자:난 네녀석의 자전거 이름을 묻지 않았다. 여기서 뭐 하는 건가? 처음보는 것 같은데.", + "미트라:난 내 친구 영을 도우러 이곳에 왔지..", + "현자:영은 친구를 사귄 적이 없네. 브라이어랑 친구를 한 적은 더더욱 없네. 그리고 만약 자네가 영을 부추긴다면, 자넬 내 세계에서 내쫓겠네!", + "미트라:뭐라고 지껄이는 거야? 상품이랑 나는--", + "현자:너의 좇같은 자전거에 관한 이야기는 그만 짓껄여!!") + } +, + hit:{ + dialogue:new Array( + "현자:...", + "미트라:영! 괜찮아? 고맙다, 상품아... 자, 가서 이 빌어먹을 곳을 끝내버리자고! 넌 할 수 있어!", + "미트라:상품!!!", + "미트라:상품...", + "미트라:이봐, 정체불명의 후드모자 양반, 당신이 누군진 모르겠지만, 왜 우리를 내버려두지 않는거야?", + "현자:자넨 영에게 뭐든지 완벽하고 잘 한다고 거짓말 한 주제에 자신이 영의 친구라고 생각하고 있나보군. 뭐, 그것이 자네가 원하는 거라면, 좋네. 내 눈앞에서 사라지게, 영.", + "현자:네 \"친구\" 하고 떠들어 봐.", + "미트라:우린 그냥 우리가 할 수 있는 최선의 방법을 선택한 거야...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "망토른 두른 남자:좋아, 인사할 시간이군. 음...^내 말은...^ 반갑네, 영! 나는 현자라고 하네. 마을의 장로지. 어둠이 대륙으로 손을 뻗어가고 있어서 자넬 이곳으로 소환했네. 어둠이 전설의 브라이어를 찾고 있네. 브라이어들의 힘을 악에게 쓰기 위해서지. 자넨 반드시 어둠보다 먼저 브라이어들에게로 가야하네.", + "자네의 임무를 시작하기 위해 왼쪽에 있는 차원문으로 들어가게.", + "*한숨* 아직도 꾸물거리는 건가? 차원문으로 들어가서 임무를 시작하게. 브라이어와, 더 나아가 세계는 매우 도움이 필요하네!", + "그냥 빨리 저 망할 문에 가라고!") + } +, + after_ent_str:{ + dialogue:new Array( + "아직도 여기서 뭐하는 건가?") + } +, + after_bed:{ + dialogue:new Array( + "계속 앞으로 나아가게나, 영. 자네가 찾은 열쇠, 그것과 비슷한 게 다른 장소에 있을 수도 있네.", + "이 대륙의 머나먼 곳까지 여행하게, 영. 어둠을 멈추려면 이 방법만이 유일한 길이니까.") + } +, + before_windmill:{ + dialogue:new Array( + "이 세개의 열쇠를 가지고 가게, 영, 그리고 대륙의 깊은 영역으로 가는 길을 열게.") + } +, + after_windmill:{ + dialogue:new Array( + "부탁한 일을 잘 마무리했군, 영, 아직 대륙의 깊은 영역에서 할 일들이 남아 있지만. 자넨 아마 대륙의 깊은 영역을 탐험하면서 큰 깨달음을 얻을 걸세... 어쩌면 자네가 브라이어에게 가치가 있게 될 수도 있지.") + } +, + all_card_first:{ + dialogue:new Array( + "잘했네, 영. 이곳의 모든 카드를 찾아냈군, 그 증거로, 보석이 이 지역의 차원문 위에 나타났네.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "현자:곧 자네의 능력을 시험해 봐야 할 거네. 영. 이 사원에서 살아남기 위해서는 힘과 지성이 모두 필요하네. 혹시 쓸만한 무기를 찾았나?", + "뭐-?? ... 내-내 말은... 그래 물론이지... 빗자루! 어... 전설에 예언된 그대로...", + "*툴툴거리며* ... 이 무능한--자네! 왜 아직도 거기에 서 있는 건가?", + "정신 바짝 차리게, 영") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "현자:아직도 자넨 여전히 약하군. 자네가 어둠한테서 브라이어를 보호하고 싶다면, 자넨 자네의 두려움을 극복해야만 하네. 저기 있는 상자에서 카드를 발견할 수 있을걸세, 카드는 자네의 성장을 상징하지, 그러니 카드를 모으는 것은 임무를 수행하는 데 매우 중요하네.", + "열쇠 역시 자네의 임무에 중요한 역할을 하지. 자넨 반드시 문을 열기 위한 여러 열쇠를 찾아야만 하네. 메뉴화면으로 간 다음 맵을 선택해서 사원의 입구로 돌아가기 위해 텔레포트하게나, 그리고 자네의 영웅적인 임무를 계속하게나.", + "사원의 정원을 통해 남쪽 또는 북쪽으로 여행을 할 수 있네... 열쇠는 어딘가에서 찾을 수 있을걸세.", + "뭔가, 내가 자네를 목마 태워 관문까지 데려다 주길 바라는 건가??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "현자:왜 말을 듣지 않는 건가?! 멍청이처럼 돌진했다간 브라이어와 대륙을 위험에 빠뜨리게 될걸세. 이때까지 했던 일들이 헛수고가 되어버리는...! 미안하네, 영. 하지만 자네가 내 말을 듣지 않는다면, 다른 방법으로 내말을 듣게 하는 수밖에 없네..") + } +, + after_fight:{ + dialogue:new Array( + "현자:영... 이럴려던 게 아니었네... 단지 자네가 브라이어들을 도울 수 있을 정도까지 자넬 성장시키기 위해서였지. 하지만 이건 멍청한 놀이에 불가했어... 난 자네가 브라이어에게 가는 걸 막을 수 없네. 그냥 모두가 지옥에 갈 때 내가 했던 말을 기억하게나.") + } +, + entrance:{ + dialogue:new Array( + "현자:반갑네, 영. 자네가 더욱 강해지고 현명해질 때, 이 길은 자넬 브라이어에게로 인도할 걸세.", + "현자:하지만 영, 자넨 아직 준비되지 않았어. 우선 이 대륙에서 더 많은 시련을 극복해야만 하네.", + "현자:많이 성장했군, 영, 하지만 이 관문을 통과하기 위해서는 반드시 36장의 카드를 모아야만 하네.") + } +, + etc:{ + dialogue:new Array( + "현자:오... 음... 36장의 카드를 가지고 온건가? 하지만 아직 난 자네가 진정한 시련과 맞설 때가 되지 않았다고 생각하네. 사실, 이걸 보게, 우리가 잘못 읽고 있었네, 진짜로 필요한 카드의 양은...\n...\n........\n36장이 아닌 92장이라고 써져있네!", + "현자:영, 자넨 아직 준비되지 않았네! 이 대륙과 브라이어를 생각해보게! 만약 자네가 준비되지 않았다면 이 모든 것들은 물거품이 되어버릴걸세!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "현자:훌륭하군, 영. 자넨 괴물들 뿐만 아니라 자신의 두려움도 이겨냈군!!!", + "현자:물론, 아직 가야할 길이 머네. 대륙을 전부 탐험해봤나?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "현자:훌륭하군, 영. 하지만, 아직도 시련이 보이는군. 긴장을 풀지 말게나.", + "현자:아직도 모든 열쇠를 찾지 못한 건가, 영? 아직 다 모으지 못했다면, 바닷가로 가보게나.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "나는 다른 놈들과는 달라! *멍멍* 당신을 해치지 않을게...", + "난 조용함과 평화로운 걸 좋아한다고.", + "당신의 냄새가 근대같은데.", + "*멍멍*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "해냈군, 영! 마침내 어둠을 막아냈어! 여길 봐! 정말로 아름다워!", + "너무나 아름다워...") + } +, + dump:{ + dialogue:new Array( + "오 다행이야! 무사했구나! 그 눈더미에 덮혀서 꼼짝못하고 있을거라고 생각했어... 만약 그랬다면 존나 우울했겠지! 하!", + "하하하. 하하하하하. 하하하하하하하!") + } +, + drink:{ + dialogue:new Array( + "이봐 거기, 귀여운데? 한잔 할래? 내가 쏠게!", + "한잔 더 할래? 거지같은 새끼야! 하하하!") + } +, + hot:{ + dialogue:new Array( + "씨발, 여기 존나 뜨겁군... 나도 뜨겁고... 땀범벅이 되버렸네...", + "젠장, 운동은 날 불끈불끈하게 하지!!") + } +, + gold:{ + dialogue:new Array( + "이 세계가 금으로 만들어진 곳이라는 걸 알아? 진짜 금 말이야! 둘이서 도망쳐도 이 벽돌로 평생을 놀고먹고 할 수 있는 거지! 와하하하하!", + "나 진지하다고, 왜 아직도 거기 서있어? 어서 벽돌 나르는 것을 도와줘!") + } +, + briar:{ + dialogue:new Array( + "???:영... 드디어 해냈구우나! 가너 나를 구줬해어! 이제 든모 일이 시다 잘 풀거릴야!!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "조심해!", + "아 미안해... 너무 흥분했었나 봐. 오, 처음 보는 얼굴인데! 넌 여행자야? ... 뭐? 악한 어둠에게 브라이어를 지키겠다고? ... ^음... 네가 무슨 말을 하는지 잘 모르겠지만, 왠지 멋진데!", + "방금 막 나와서, 상품을 좀 타려고 했는데.... 뭐? 아니, 난 잡상인이 아니라고. 상품은 내 자전거 이름이야!", + "분명히 다시 만나게 될 거야, 혹시 내가 브라이어에 관한 정보를 듣게 되면 너한테 알려줄게.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "꼼작 마! 좋아 상품아, 시작하자!", + "쨔자안!", + "계속 가라고, 영. 우린 네 뒤에 있을게!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "날 기억해? 저번에 자기소개하는 걸 까먹었었지, 내 자전거 상품만 소개 했었어. 그래, 내 이름은 미트라야.", + "날 기억해? 저번에 자기소개하는 걸 까먹었었지, 나는 미트라야, 그리고 이 크고 아름다운 자전거 이름은 상품이고!", + "미트라:그래서, 어떻게 지냈어 영? ...잠시만? 내가 어떻게 네 이름을 알지? 이상하다고 생각하지 않아, 응? 뭐, 사실 네 옷 뒤에 적힌 걸 봤었어.", + "미트라:다음에 또 봐, 영!") + } +, + quest_event:{ + dialogue:new Array( + "미트라:이봐, 기억났어 - 누군가 무엇을 빨리 찾는 중이라고 했어. 그 사람들이 무엇에 대해 말 했는지 확신하진 못 하겠지만, 그사람들이 산으로 간다는 말을 하고 - 서둘러 도망치듯 가던데.") + } +, + game_hints:{ + dialogue:new Array( + "아무것도 아니다.", + "오, 포기하려는 거야? 바닷가는 둘러봤어? 혹시 그곳에 있는 누군가가 널 도와줄 수도 있지 않을까? 어쩌면 열쇠를 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까?", + "오, 포기하려는 거야? 동쪽의 숲은 둘러봤어? 어쩌면 열쇠를 - 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까?", + "열쇠를 찾았네! 아까 남동쪽으로 가는 잠겨진 관문을 본 것 같아. 그 열쇠로 열 수 있지 않을까?", + "이봐, 풍력 터빈이 켜져 있는 걸 봤는데, 바람이 엄청 세던데! 이 대륙에 어떤 영향이 있지 않을까?", + "이봐 영, 오! 카드를 잔뜩 모았네! 근데 이건 뭐에 쓰는 걸까? 팔면 꽤 돈이 될 것 같은데.", + "빗자루에 붙어있는 게 뭐야? 그걸로 네가 세계의 구조를 변경할 수 있어...? 솔직히, 그건 정말 무서워 영. 그 이상한 게 아무 데서나 작동하지 않는다는 게 정말 다행이네, 근데 깊은 영역 말고도 딴데서도 쓸 수 있지 않을까?", + "새 점프신발은 어때? 꽤 멋지지 않아, 응? 난 내 새 자전거용 신발이 마음에 들어. 이 신발을 만든 회사가 내 상품을 만들었고 나랑 상품은 더 찰떡궁합이 될 거야!", + "멋진데, 영, 또 열쇠를 찾아냈구나! 상품도 그 색이 좋다고 하네! 근데 아직 그 열쇠에 맞는 입구는 찾지 못한거야?") + } +, + card_hints:{ + dialogue:new Array( + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원 근처는 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그러고보니, 관측자의 사원의 뒤쪽 출구에 미로가 있다고 들은 적이 있어.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처에서 뭔가를 찾을 수 있을지도 몰라.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원에 있는 적들이 가득 찬 방이 있었는데, 그곳에 있지 않을까?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원은 전부 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처의 아직 가보지 못한 구역들을 뒤져봐.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n너의 이웃이 알고 있을지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n네 아파트에 살고 있는 사람이 뭔가를 숨기는 것 같던데...", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n네 아파트 입구 주변... 거기에 있을 지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n정말 네 아파트에 있는 *모든 곳*을 다 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n여기에서 바로 남쪽으로 가면 섬이 있어! 난 가본적 없지만, 한 번 가서 찾아보는 게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n강가에는 여러 물건들이 있어. 잘 찾아보는게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n누가 풍차 근처에 카드를 두고 간 것 같은데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n숲에 있는 강 주변을 둘러봐...", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산기슭 주변을 둘러보지그래?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산의 정상에 뭔가 있을 것 같지 않아?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n바닷가의 끝에 무언가 있을지도?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n진홍의 숲을 산책해 보는 건 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n붉은 동굴 중 하나가 잠겨진 문들이 많았었어, 가보는 게 어때?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴은 확인해 봤어? 강을 따라가면서 찾아봐!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴로 가서, 강의 원류로 거슬러 올라가 봐!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n흠...어두운 미로는 다 뒤져봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그러고 보니 불이 뿜어져 나오던 길 있었잖아? 그 안쪽이나 주변에 뭔가 있을 것 같지 않아?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n서커스 단원들이 뭔가를 숨기는 것 같아 보이던데, 그 주변은 찾아 봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n한 커플이 떨어진 구멍 기억나? 그 근처는 둘러봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n구멍 근처에서 뭔가를 하던 커플이 무언가를 숨기고 있는 것 같던데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n깊은 계곡이라던지 어딘가에 뭔가 있을 것 같지않아? - 특히 산의 동굴에 뭔가 있을 것 같아!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n산에 있는 동굴의 꼭대기는 가봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 산에 있던 동굴 안쪽에는 가봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n아마 그곳에 무언가가 있을거야! - 그 이상한 곳에 있던 컬러풀한 큐브라던가,", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 수수께기 공간에 있는 검은 큐브랑을 대화해봤어? 그 큐브라면 뭔가를 알지 않을까?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n그 호텔의 가장 위층은 고급스러워 보이진 않았어, 하지만 거긴 무언가가 있을거야!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔 3층에 있는 방은 다 찾아봤어?", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔 2층에 누군가가 두고간 게 있던데.", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n호텔의 오너가 널 위해 뭔가를 두고 갔을 거야!", + "미트라:이봐 영, 카드를 찾고 있는 거야?\n북동쪽에 있는 부서진 다리... 거기가 수상하지 않아?", + "...뭐? *한 장도* 찾지 못했어? 이봐, 영, 그건 미친 짓이라고! 가끔은 살면서 모험가가 될 필요도 있다고, 지나가다가 보이는 상자들을 열어봐, 알겠어?") + } +, + general_banter:{ + dialogue:new Array( + "산에서 뭔가를 찾고 있는 것같아 보이던 남자는 만나봤어?", + "내 자전거의 성이 뭔지 알아? ...왈도! 힘세고 강한 성이지? 상품 왈도! ...농담이야, 자전거는 성을 가질 수 없어.", + "혹시 자전거 자물쇠를 파는 곳을 알아? 상품을 묶는 건 싫지만 요즘 자전거 도난이 늘고 있다고 해서 말이야...", + "그래서 브라이어는 뭐야? 잃어버린 문명속의 고대유물 같은 거야?", + "난 왜 내가 어둠이 다가오고 있다는 사실을 전혀 몰랐는지 궁금해. 아마도 대륙에 사는 대부분의 사람들이 자신들의 일상과의 투쟁에 사로잡혀 있어서가 아닐까?", + "이봐 영, 이 말을 하고 싶었는데... 너 머리스타일 개쩐다.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "동상:마을의 장로라는건 이름뿐이고, 마을따윈 없고 장로도 아니다.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "동상:전설의 빗자루가 있는 위치... 그건 지도에 표시된 청소부의 옷장에 있다.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "동상:카드를 획득하는 것은 임무를 진행하는 데 아주 중요하다. 물론 다른 임무를 할 때도 중요하고, 예를 들자면 돈을 벌거나 술을 사는 것?") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "동상:현자는 훌륭한 자이다. 짜증내지 않고 자기 도취도 하지 않고 제대로 상용구 같은 말을 하니까!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "네가 더 스트레스를 받고 냉담해 졌을 때, 이 길은 널 브라이어들에게로 이끌거야. 위로의 메세지를 파인트가, 이 패배자야!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "에드워드:저번에 화장실에 거울을 설치하려고 사람을 부른 적이 있었어. 거기에 카메라를 숨겨놔서 들킬까봐 무서웠지. 난 모든 나무틀 사이 사이에 마피 오일 비누칠을 해서 틈새를 막고, 전선을 합선시킬까 생각도 했었지. 하지만 결국, 아무것도 발견되지 못했어.", + "에드워드:이 사원은 관측자를 모시는 사원이야. 내가 여기에 왜 온 건지 모르겠지만, 안에 들어가는 게 무서워.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "에드워드:문제라도 있어? 그런 것 같아 보이는데, 네가 가지고 있는 빗자루, 그리고 전 세계에 있는 모든 빗자루는 먼지를 쓸 수 있어. 알겠어?") + } +, + bedroom_done:{ + dialogue:new Array( + "에드워드:관측자를 막아냈다고? 하. 헛소리하지 마, 넌 그냥 틈새에 오일 비누칠을 하고 있을 뿐이잖아.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "오,영. 사랑스럽고 귀여운 영웅놀이를 하고 있네. 하지만 난 네가 \"대륙\"에서 한 모든 짓을 목격했지, 말해볼까? 영,여기있는 모든 사람이 나처럼 정직하지 않다고. 부디 너가 신뢰하고 있는 사람을 조심해!") + } +, + after_fight:{ + dialogue:new Array( + "네가 혼자일 때마다 난 네 옆에 있을 거야, 영. 그리고 반드시 내 충고를 너의 작은 \"모험\"을 하면서 잊지 마.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "바위:이곳에서 시력이 감소된 이유는 악마의 저주 때문입니다.") + } +, + two:{ + dialogue:new Array( + "바위:해야 할 일:연결체에 이동 수단을 만들어야 함. 지금 상태:중단 - 관측자에게 예산을 얻지 못 할 것 같음. 그 수수께끼의 차원문을 사용해야 함.") + } +, + three:{ + dialogue:new Array( + "바위:실수로 이곳에 갇혀버렸습니다. 이 굴에서 항상 무슨 일들이 일어나고 있고, 약간의 변화들을 매일 조금씩 볼 수 있어요.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "댐을 여는 손잡이다.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957년 6월 24일:공중 그네가 부서졌다. 앨리스 러트거스는 두 정강이가 골절되고 땅으로 떨어졌다.") + } +, + two:{ + dialogue:new Array( + "1957년 7월 17일:일곱명의 광대가 폐가 안 좋아져서 은퇴했다. 랜드블랜드 브랜드의 메이크업이 의심되지만, 형식적인 조사조차 수행되지 않았다.") + } +, + three:{ + dialogue:new Array( + "1957년 7월 21일:동물 우리가 망가지는 바람에, 야생 사자에게 얼굴과 옆구리를 심하게 당했다. 다행히 나는 살아남았다, 하지만 언제나 거울에 비친 내 모습을 보면 그때가 생각나서 공포에 몸이 떨린다.") + } +, + four:{ + dialogue:new Array( + "1957년 8월 5일:꿈에서, 난 사나운 얼굴과 반짝이는 눈을 가진 돌을 보았다. 돌은 나에게 우리의 존재에 대한 진리를 말하며 나를 고통에서 해방시켜주며 자유를 선사하였다.") + } +, + five:{ + dialogue:new Array( + "1957년 8월 7일:얼마나 많은 사람들이 관측자를 따르기 전까지 고통받으면서 살아왔을까?") + } +, + six:{ + dialogue:new Array( + "1957년 8월 8일:결정할 때가 왔다. 몇명은 나를 따르겠다고 했다. 오늘로 이 일기도 마지막 장이다. 관측가의 가호가 있기를.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(처음 보는 문자로 뭔가가 써져 있다)") + } +, + two:{ + dialogue:new Array( + "2010년 12월 7일(이름은 흐릿해서 보이지 않는다)이 거지같은 바위를 빼면 이곳엔 아무것도 없다!") + } +, + three:{ + dialogue:new Array( + "위험하다! 이 동굴은 누군가 들어온 흔적도 없다!") + } +, + four:{ + dialogue:new Array( + "이 절벽은 위쪽으로 길게 뻗어있다. 끝이 보이지도 않아서 위가 어떤지도 모르겠군.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "바위:어떻게?") + } +, + two:{ + dialogue:new Array( + "바위:조심하세요! 떨어지면 그 누구의 탓도 아닙니다.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "가까이 가거나 멀리 떨어지면 문이 열렸다 닫혔다 할거야!", + "난 왜 이걸 쓰지 않았는지 까먹었어. 너무 드라마틱해서인가?") + } +, + two:{ + dialogue:new Array( + "이곳은 다양한 타일과 레이어와 충돌을 테스트했어! 일방통행 타일을 양쪽(i.e., walls)에 두거나 했지만 잘 되지 않아서 뺐다... 랄까.", + "이곳에는 왜 우리가 이것들을 쓰지 않은지 이유가 있어. 설계를 단순하게 하는 것. 이것이 게임을 완성하는 데 중요했기 때문이지.") + } +, + three:{ + dialogue:new Array( + "처음에는 적을 쓰러트리고 열쇠를 얻을 수 있게 하려고 했는데, 이 아이디어는 안 쓰기로 했어. 꽤 마음에 들었었는데.", + "다른 아이디어는 도전 관문을 게임에 넣으려고 한 건데, 이건 대미지를 입지 않고 시련을 클리어 할 때에만 열리는 관문이었지.", + "예전에 모든 던전에서 체력을 없애면 어떨까 하고 생각했는데, 너무 어렵다고 해서 못했어!") + } +, + four:{ + dialogue:new Array( + "감옥이야!!!", + "도와줘!!!", + "부탁해!") + } +, + five:{ + dialogue:new Array( + "디버그 세상에 오신 것을 환영합니다! 이곳은 \"대륙\"이 아니라서, 게임의 진행과는(90%)\"무관합니다\". 잘 쉬다가세요.", + "맵의 타일 세트가 완성 될 때까지 이런 임시 타일 맵을 써. 게임의 던전은 사실 전부 그렇게 만들어서, 마무리로 존이 타일 세트를 넣지.") + } +, + six:{ + dialogue:new Array( + "젊은 여자") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-기록보관소-", + "신중하게 진행하자.") + } +, + four:{ + dialogue:new Array( + "서쪽. 땅에 균열이 생김. 실제 상황! 부동산은 떨어지고, 허리케인이 일어나고, 부식되고, 무너지고. 하... 진정하자.") + } +, + three:{ + dialogue:new Array( + "내가 뭘 할 수 있을지 찾아봐야 게엤- 어으,,,,,,그냥 집에서 행복한 시간이나 보내야 겠군.") + } +, + two:{ + dialogue:new Array( + "냉장실\n\n^ -- 관리") + } +, + one:{ + dialogue:new Array( + "계속") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "서쪽:바닷가\n\n동쪽:숲\n\n동남쪽:\n 비내리는 지역\n\n남쪽:\n사원 안\n\n북서쪽:깊은 틈") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "서쪽:대륙의 호수\n남쪽으로 가서 동쪽으로:낭떠러지") + } +, + two:{ + dialogue:new Array( + "휴식 연못. 잠시 쉬어가세요, 잠시 쉴 시간정돈 있잖아요?") + } +, + three:{ + dialogue:new Array( + "난 내가 영원히 이 작은 모퉁이에 남아있을까 봐 두려워.") + } +, + four:{ + dialogue:new Array( + "동쪽:낭떠러지") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "어두운 수호자 타일을 정사각형의 격자무늬 아래에 있는 영혼의 색을 띤 돌로 바꾼다면, 길이 열릴 것이다.") + } +, + two:{ + dialogue:new Array( + "파란 석상이 움직일 때\n새로운 길이 열렸다.\n절벽을 지나 이상한 차원으로 가니\n여행자의 호텔이 있었다.\n\n\n\"관리인은 누구지?\" 그곳에게 물었다,\n\"파수꾼은 누구지?\"\n많은 사람의 영혼이 있음에도 불구하고\n나는 여전히 외로움을 느낀다.") + } +, + three:{ + dialogue:new Array( + "붉게 녹슨 동상이 움직였다.\n그리고 안으로 통하는 길이 열렸다.\n미로 던전을 따라가니\n커다란 서커스 텐트가 보였다.\n\n\n\"파수꾼은 누구지?\" 물었다,\n\"누가 이곳에서 도망치기 위해 목숨을 버렸지?\"\n내가 고통을 두려워하듯이 그들도 두려워했고\n고통보다 죽음을 더 무서워했다.") + } +, + four:{ + dialogue:new Array( + "녹색 금속 동상이 움직였다.\n난 안쪽으로 들어갔다.\n교외 주택 및 보도 형태\n아파트로 가는 길로.\n\n\n\"파수꾼은 누구지?\" 그곳에게 물었다,\n\"누가 별에서의 편안함을 찾는가?\"\n홀로, 나는 감시당하고 있다는 느낌이 들었다.\n그건은 항상 친근했던 별빛과는 다른 것이었다.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "바위:아직 이곳은 주인없는 대륙의 일부분중 하나인 - 영토입니다.") + } +, + two:{ + dialogue:new Array( + "바위:이 -^ 내것과 나^ - 원은^ - 약속이다....나는^ - 동심원의^ - 정말로 모든 것을 끝내려고...^ - 원. Bzrt, bzrt.") + } +, + three:{ + dialogue:new Array( + "바위:보고 있어^ -...하지만 나는 항상^ - 너의 행보를^ - 네가 다시 이곳에^ - 나타나 줬으면!") + } +, + four:{ + dialogue:new Array( + "바위:내려다 봐^ - 그리고 난 깨달았지:^ - 이곳에서, 너- ^ 나는 그를 사랑해.^ - 사실... 볼 수 없었어, 정말로.") + } +, + five:{ + dialogue:new Array( + "바위:미안해 -^ 그렇지만 우린 -^ 이곳의 엉망 -^ 계속 연락하기로 -^ 하지만 저 관문은^ - 그리고 내 의견을 제시하고 싶어 - ^ 대륙으로 돌아와 줘.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "가끔 사람들에게 여러번 대화를 하면, 그들은 새로운 주제를 가지고 대화를 할 수도 있습니다.", + "하지만 바위는 아니죠. 바위는 그럴 수 없어요.") + } +, + two:{ + dialogue:new Array( + "돌:정말 아쉬웠어! 만약에...") + } +, + three:{ + dialogue:new Array( + "돌:호기심은 좋다고.") + } +, + four:{ + dialogue:new Array( + "돌:오!...?") + } +, + five:{ + dialogue:new Array( + "컴퓨터 터미널에 이메일이 띄워져 있다. 화면 일부분은 박살 나 있다. 그래서 오로지 검은 얼룩들 사이의 몇 부분들만 볼 수 있다. 이메일 내용:\"안녕, 영! 보이네[...] 50번째 카드 [...] 아마도 넌 [...] 의 가치에 대해서 생각해봐! 네가 준비됐다고 생각해? 일어나...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "바위:넌 친구가 한 명도 없어서 이 바위에 적힌 글자를 읽고 있다는 데 내 손모가지를 걸지.") + } +, + two:{ + dialogue:new Array( + "바위:오버월드 정거장에 온 것을 환영합니다. 대륙에서 즐거운 시간을 보내셨길 바랍니다.") + } +, + three:{ + dialogue:new Array( + "바위:탐험가는 당신입니다!", + "바위:남쪽으로 가지 마십시오. 그 곳은 공사중입니다.") + } +, + four:{ + dialogue:new Array( + "바위:5,3에 보물이 있다!") + } +, + five:{ + dialogue:new Array( + "바위:하하, 잡았다!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "우리는 어머니의 부해한 몸에서 태어났다.") + } +, + two:{ + dialogue:new Array( + "어느 날, 우리의 어머니는 그녀의 어머니를 떠났다. 그리고 독 안개속으로 모험을 떠났다.") + } +, + three:{ + dialogue:new Array( + "우리는 물어볼 수 없었지. 우린 그녀의 고통과 우리의 삶을 만들고 싶지 않아.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "바위:표지판은 오랜 시간동안 죽어있던 나무를 나타낸다.") + } +, + two:{ + dialogue:new Array( + "바위:북쪽:???^ 남쪽:???") + } +, + three:{ + dialogue:new Array( + "바위:이 지역의 일그러진 지형은 선주자의 조상이 이룬 것이라고 알려져있다.") + } +, + four:{ + dialogue:new Array( + "바위:그들은 평화로운 생물이다.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "유성 매직 같은 걸로 써져 있다:\"공간\"과 \"시간\"의 여행자여, 환영합니다. 당신이 발을 디딘 곳은 \"영\"의 차원 균열과 인접합니다. 당신은 \"바다\"를 하나둘 넘어왔습니다, 그래서 말하는데. 부디 평소랑 다른 \"차이\"를 두려워하지 마세요, 당신은 곧 다시 당신의 평범한 모험으로 돌아가겠죠. 이 장소는 \"불길\"하고 \"위험\"해 보일 수도 있지만 부디 \"두려워\"하지 마세요, 이곳의 주민들은 모두 매우 \"친절\"합니다.\n -- MGMT", + "(메시지 아래에 문자가 새겨져있다)숲에서 길을 잃은 ____(읽을 수 없다), 이곳에 잠들다.", + "(그 밑에 아직도 메시지가있다)(남쪽으로 너무 멀리 가지 마라.)") + } +, + two:{ + dialogue:new Array( + "무지개에 찔려죽은 ____(읽을 수 없군. 누가 쓴거야?), 이곳에 잠들다.") + } +, + three:{ + dialogue:new Array( + "절벽과 친해지지 못했던 버드, 이곳에 잠들다.") + } +, + four:{ + dialogue:new Array( + "한 번도 쓰인적이 없는 가방이 있다.", + "안쓰럽네!") + } +, + five:{ + dialogue:new Array( + "차고에 있는 컴퓨터를 수리하려고 자리잡고 앉아서 작업했지만 3년이 지나도 수리해지 못하고 어디선가 떨어져 죽은 세비치 이곳에 잠들다.") + } +, + six:{ + dialogue:new Array( + "내세울게 하나도 없던 데이브, 이곳에 잠들다.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---영 타운---^\n영 타운에 오신 것을 환영합니다. 몇몇 시민들은 다른 사람과 잘 어울리지 못하니... 주의해주세요. 영 타운은 시장 잉 씨의 택지 개발 정책의 일환으로 90년대에 개발 된 마을입니다, 마을의 이름은 시장의 이름인 잉(그늘)씨가 자신의 이름을 거절하고 스스로 선택한 영(양지)라고 정한 것에 유래됐습니다. 편히 지내시기 바랍니다.") + } +, + two:{ + dialogue:new Array( + "서쪽에는 전설의 관측자 사원이 있습니다. 동쪽에는 우리의 훌륭하신 시장님 잉씨의 아파트 입니다. 지금 아파트는 개방되지 않고 있습니다. - 방문시 주의해 주세요.") + } +, + three:{ + dialogue:new Array( + "5번째 방문 때, 잉시장은 주차장이 적음에 강한 불만을 느꼈습니다. 이 주차장은 잉시장이 느낀 주차장이 적음을 반영한 것입니다. 이후 잉시장은 방문할 때마다 이 주차장을 이용합니다.") + } +, + four:{ + dialogue:new Array( + "예전에 긴문장을 썼던게 기억나네. 하! 집어쳐!") + } +, + five:{ + dialogue:new Array( + "위험한 상황") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "관측자는 모든것을 알고있고, 깨달음으로 이끈다. 깨달음으로 가는 길을 비추는 빛은 없다.") + } +, + two:{ + dialogue:new Array( + "관측자의 길에서 이탈하면 안 된다. 비록 미로의 구석에 보물상자가 있더라도.") + } +, + three:{ + dialogue:new Array( + "홀로 이동했다.") + } +, + four:{ + dialogue:new Array( + "체이서를 화나게 하지 마세요.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "관광 명소:\"쌍둥이 탑\". 최근에 건설된 이 탑은, 멀리 있는 산까지 볼 수 있습니다. 첫 번째 탑은 망가진 이후로 다른 용도로 사용되고 있습니다. 두 번째 탑은 여전히 동쪽에 위치하며, 하늘까지 뻗어 있습니다. 안전상의 문제로 이 탑으로 가는 길은 추후 공지가 있을 때까지 봉쇄되어 있습니다.") + } +, + two:{ + dialogue:new Array( + "안전에 관한 안내문:^\n이 탑은 손상되지 않았지만 꼭대기에 차원의 균열이 생기고 있습니다. 주의해주세요.^\n -- MGMT") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "맨날 움직일 것 같게 생기지는 않은 동상이군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "이 동상은 움직이지 않고 계속 여기에 서 있을 것 같군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "움직일 것같이 생긴 동상은 아니군.") + } +, + two:{ + dialogue:new Array( + "동상이 움직였군.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "불은 아름다워, 그렇지 않아? 하지만 마을의 불빛들이 별의 빛을 가려 버리는 건 수치스러운 일이야.") + } +, + after_fight:{ + dialogue:new Array( + "그렇구나, 별은 불덩어리가 아니지. ^넌 자세히 알고 있구나...") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "잘 지냈나? 난 이 구역의 통치자이고 이 공간의 성립되는 모든 것 그 자체이네.", + "내가 어떻게 이곳의 통치자가 됐는지 이유를 알고 싶나? 알려주지, 하지만 시간이 필요해. 아마, 긴 시간 말이야. 역겨울 정도로 오랜 시간이.", + "그래, 꽤 오랫동안. 아니, 정말로, 경고하는데! 아, 내가 좀 횡설수설한 경향이 있어. 어쩌면 그냥 바로 저기에 있는 상자 안을 보는 게 더 나을지도 모르겠네. 아니면 멀리 있는 호텔로 향하거나. 그게 거기 있는지는 모르지만, 거기는 상대적으로 저렴한 가격이라고 들었어. 돈 따위 의미 없지만.", + "왜 내가 통치자가 됐나고?^...왜냐고 물으니 확신하기 어렵군, 하지만 주변에 있던 내 친구들이 날 보고 이 적합한 위치에 넣어준거지, 이 공간의 상태에 즉각적인 이유지. 어쩌면 경우일지도 몰라. 왜냐하면 큐브는 평면에 서있기 최적의 형태를 가지고 있지. 왜 누군가가 여기에 앉고 싶어한다고 묻는다면 이렇게 대답하지. - 그건 나랑 상관없는 일이네!", + "그리고 또 - 내 친구들도 - 역시 장점은 있어. 그 친구도 언젠가 통치자가 될 가능성이 있고 지금은 할 수 없어서 내가 하는 것이지. 가끔은, 통치자를 누가 할 것인가 정하기도 해. 하지만 대부분, 우린 공간의 영역을 재해석해야 하네! 다시 말하자면, 신사 또는 숙녀 피라미드는 여기에 온다는 거지. 왜냐하면 우린 왕좌 모양을 가장 잘 맞는 방법으로 만들기로 결심했기 때문이지. 이 세상을 다시 상상함으로 인해서 말이야. 말하자면, 바보같은 소리라고? 그럴지도 모르지. 하지만 그렇지만 이건 방법이야. 그 상황은 매우 빠르게 초, 분, 시로 발생하지. - 필요치 않은 긴 통치. 왕좌 모양.", + "하지만, 내가 통치자가 됐을 때, 약간 이상한 느낌이 들었지...뭔가 고립된 느낌, 다른 사람을 피하고 싶었지...", + "...하지만 고립은 옳지 않아, 그래도 이건 느낌의 일부분을 다루고 있지만. 나는 고독하지 않네. 그리고 다른 사람을 싫어하지도 않지. 우린 모든 친구를 고려해야 하고, 하지만 말일세, 몇 단어를 제외하고 대부분의 사람들이 여기에 오지 않는다네. 그래서 나는 그런 것들에 대해 생각하거나 미쳐가고 있을 걸세! 어쩌면 이것도 고립의 한 부분일지도 모르지.", + "그 이외에 *왜*냐는 어리석은 질문에 대한 답인데, 우린 여기에 이 공간을 점령한채로 있네. 아, 왜 우리가 친구인지 계속 신경쓰이는 거야.", + "나는 우린 항상 내가 통치자에 최고로 적합하다는 해석 아래에 있다고 생각하고 싶네. 그들은 나에게 존재 할 수 있는 곳에서 이 위치를 유지하기 위해 편안함을 제공했지. 다음 차례의 해석을 할때 까지 말일세, 자네도 알다시피, 격려 같은거 말일세, 물리적 존재는 그 위안이 된다네.", + "그것들이 날 만족시키기에 충분하다고 가정한다면, 그래도 멋진 것, 아니 멋진 것들일거야. 내가 왜 통치자가 됐는지 이해되는군. 나는 격려에 대해 불평하고 있지 않네! 하지만 어쩌면 그 다음, 우린 여러명의 통치자가 있을 수...내가 무슨 생각을! 그러니까 내가 통치자가 아닐 때, 같은 방식으로 행동해야 하네, 나는 가끔 그들...그럴 수 있을지 누가 알겠어?", + "난 너무 멀리 가버렸네. 자네가 만약 다른 방향으로 간다면, 거긴 여기랑 다르지만 비슷한 공간의 영역이 있겠지. 그래도 냄새는 약간 다를거라고 생각한다네.", + "만나서 반가웠네.", + "오, 내 이야기를 다시 한 번 듣고 싶나?", + "좋아, 제대로 앉아.") + } +, + gray:{ + dialogue:new Array( + "오, 안녕하신가. 난 이 공간의 통치자이네.", + "뭐? 내가 왜 이곳에 있는지 알고 싶다고? 진심인가? 설명하려면 매우 많은 단어들이 필요할 거야!", + "흠, 내가 이 공간의 통치자긴 하지만 다른 이들에게 그렇게 간섭을 한 적은 없네만.", + "내 친구들 - 그러니까 다 각자 구역을 갖고 있는 친구들도 그렇게 참견은 하지 않아. 그렇게 보자면 우리를 각자 하나의 객체라고 봐도 무방하네만, 우리가 서로 대화 하는 방식이나, 그 외 여러가지를 보자면 하나가 아니기도 하지. 이곳은 단지 내가 있는 장소들 중 하나에 불과하다네.", + "내 친구들과 나 - 그러니까 우리 공간들은 왜 존재하고 어떻게 조직되어있는가에 대한 지대한 공통점이 있다네. 유사한 취향과 욕구, 그리고 취미들같은 것 말일세. 우리는 우리의 지배방식과 같은 여타의 안건에 대해 심도있는 토의를 하는것을 즐겨하지.", + "하지만 슬픈 사실은 우리가 물리적 형태를 취한 상태로는 거의 만나지 못한다는 점일세.", + "그렇지. 자네는 그들의 물리적 신체와 대화 한 것이 아닐세. 그건 그저 어떤 홀로그래픽으로 구현된 대체제였을 뿐이지.", + "이것이 어떤 하나의 불행이라는 것은 나도 잘 알고 있네. 우리가 이렇게 많은 공통점을 가지고 많은것을 공유함에도 불구하고 각자를 하나의 친구로써만 도울 수 있다는 점은 그야말로 큰 불행 아닌가.", + "물리적인 일 대 일 대화를 못하는 것에서 촉발되는 소소한 단점들이지.", + "하지만 나는 불만없네. 아무도 없는 것 보다는 낫지 않은가! 만약 그랬다면 어땠을까 하는 상상은 할 수 조차 없다네. 아마도 끔찍하겠지.", + "대화 즐거웠네. 자네가 하는 일, 모두 잘 풀리길 바라겠네.", + "계속 여기 있겠나? 했던 말을 몇 번이고 계속해줄 수 있네, 만약 자네가 마음에 든다면 말이지.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "크릭슨:야! 크기만 한 깡패 녀석! 너따위 두렵지 않아!", + "크릭슨:야! 크기만 한 바보 녀석! 난 도망치지 않아! 네가 날 한 대 치더라도 절대 도망가지 않아!", + "크릭슨:야! 크기만 한 멍청한 녀석! 그래 이 멍청한 녀석아! 부끄러운줄 알라고!") + } +, + thorax:{ + dialogue:new Array( + "토렉스:나는 토렉스야, 꿀벌의 대변자야.\n^꿀벌들의 운명은 불확실하지, 이건 좋은 일이 아니라고!\n^어떤 곳에 있는 식민지의 노동자들은 투쟁을 했데!\n^결국 그 식민지는 멸망했다고 하고, 투쟁후의 그곳의 모습은 더 좋은 관경을 찾기 힘들정도로 멋질거야!", + "토렉스:아마 이건 바이러스이거나 새로운 농약이야,\n^아니면 파리 애벌래의 짓인가!\n^모든 것들이 꿀벌을 이상하게 만들고 있어.\n^그게 뭐든간에, 반드시 바꿔야만 해!", + "토렉스:좋아, 그래서 난 뭐가 더 좋은지 알고 싶지 않아\n^내가 노력했던 게 헛수고로 돌아가는 게 싫거든.\n^하지만 어떻게 앉아서 가만히 보고만 있겠어?\n^그러니 난 페이스북이랑 트위터에 포스트하고 외칠거야!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "쇼핑은 이곳에서~") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "여기서 뭐 하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고!", + "절대 놓치지 않을거야! 만 년이 지나더라도!") + } +, + inside:{ + dialogue:new Array( + "오, 날 또 공포에 떨게 만드려고 오셨나?", + "넌 그 고양이들 편이지. 왜냐하면 고양이들은 귀엽고 털로 덮혔으니까.") + } +, + etc:{ + dialogue:new Array( + "여기서 뭐하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고!^ 어라아!^ 이건--?^ 또 다른 고양이???^ 이러어어언!!!", + "너... 내 집을 청소했군... 감동했다! 여기, 내가 가지고 있던 것 중 가장 아름다운 녀석을 주지!", + "영은 상자를 열어보았다. 무언가 안에 들어 있다!", + "이키:오. 안녕 미아오.^\n\n미아오:너가 안전한 걸 보니 너무 기뻐!^\n\n이키:음... 도와줘서 고마워, 영.", + "이키:솔직히 말해서, 난 상자위에 앉아 있는 걸 좋아해.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "오!! 당신이 선택받은 사람이라고 하던 영이군요!!! 이런 맙소사, 만나서 영광입니다! 제 이름은 미아오 샤오 투안 어, 선택된 훈련자죠!", + "제가 조금만 당신은 따라다니면서 선택받은 사람의 기술을 볼 수 있을까요?", + "다시 만나서 반가워요, 영! 오늘 당신을 따라다녀도 될까요?") + } +, + randoms:{ + dialogue:new Array( + "미아오:저기요, 영... 당신은 태어나서 한 번도 도둑질을 해본 적이 없나요?", + "미아오:난 미트라가 마음에 드는데요... 잘생긴 자전거 상품 말고요.", + "미아오:저 돌은 뭐죠, 영? 이 돌이 시간을 거슬러 갈 수 있게 해주는 건가요?!", + "미아오:좀 이키에 대한 걱정이 드네요... 영, 최근에 커다란 고양이를 본 적이 있어요? 저번에 이키가 저한테 동쪽에 있는 작은 숲으로 산책하러 간다고 말했거든요.", + "미아오:이키가 위험한 데는 가지 말라고 했어요. 나중에 봐요, 영.", + "미아오:지금 쇼핑백 더미위에 앉아있는 거에요?", + "미아오:이봐요 영, 이게 고양이가 좋아할 캣닙이 맞을까요?", + "미아오:선택받은 사람이 되기 위해서 많은 일을 해야 할거야, 어, 영?") + } +, + philosophy:{ + dialogue:new Array( + "이키가 나를 생각했다는 건 매우 무서운 상황이에요... 우리가 죽은 후 무슨 일이 일어날 거라고 생각해요? 어떻게 단 한 번뿐인 삶에서 모든 목적을 달성할 수 있을까요?", + "어쩌면 우린 운명을 다할 때까지 계속 다시 태어나지 않을까요? 그러면 너무 쉬운걸까요?", + "그리고 그 여정의 끝에는 무엇이 있는 걸까요? 단지 시간에 휩쓸려서 사라지는 것 뿐일까요?", + "흠...") + } +, + icky:{ + dialogue:new Array( + "오, 안녕, 영.", + "사실 내 이름은 이키가 아니야. 그건 남자 이름이지.", + "미아오 샤오 투안 어가 문제를 일으키진 않아?", + "다음에 봐, 영.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "이런, 들켜버렸네, 안녕! 난 여기 남아있을래. 밖은 너무 추워.", + "끔찍한 방들은 마음껏 나를 욕해! 그 방들은 내가 DAME map editor로 만든 거야.", + "난 이 게임을 FlashDevelop IDE 와 Flixel AS3 framework로 만들었어!", + "오 예, 그리고 음악은 REAPER DAW로 만들었어. 가끔은 Audacity도 쓰면서 말이야.", + "사실 모든 컴퓨터들이 내 몸에 방사능을 뿌려서 영향을... ^생물학적으로 정확하지 않다는 건 무슨 소리야?", + "안녕 엄마! ^그리고 아빠도!", + "이 게임을 20분안에 클리어 하는 법을 알아?", + "하! 안 알려 줄건데-에!", + "(...정중하게 물어보면 알려줄지도...)") + } +, + marina:{ + dialogue:new Array( + "우후, 이봐!", + "내가 이 게임의 대사를 대부분 썼어!^(...이 대사는 숀이 쓰고 있지만.)", + "난 Adobe Photoshop CS5, Graphics Gale Free Edition, 그리고 Windows 7 캡쳐 도구를 이용해서 그림을 그려!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "여긴 수분이 많아서 피부에 좋지만, 머리카락에 안 좋네.", + "난 여기 서있는 걸 좋아해. 요즘, 사람들은 여름에 밖에 나갔다가 에어컨 바람을 쬐러 안으로 왔다갔다 한다고. 급격한 온도 변화는 뼈에 좋지 않아.", + "얼음 조각을 씹는 나쁜 버릇처럼. 우리 엄마는 20대 후반에 얼음 조각을 씹어먹었지. 지금 우리 엄마는 어금니에 금이 가있어.") + } +, + second:{ + dialogue:new Array( + "신발을 벋으면 제대로 신문지에 넣어 말려줘. 눅눅한 상태로 두면 박태리아가 번식해 버린다고.", + "왜 뷔페에서 마음대로 가져갈 수 있는건 빨간 젤리 큐브지? 이건 손님을 암에 걸리게 하고 싶다는 것 같아.") + } +, + bomb:{ + dialogue:new Array( + "내게서 떨어져.", + "심각하다고... 지금은 날 내버려둬.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "네 동정따윈 필요없어, 영.", + "좋아, \"관측자\"의 행복한 세상속에서 살아가라고...", + "이봐, 영. 우정 따윈 서로 속이면서 성립되는 거라고. 우린 전부 병신들이고,\n마지막 순간에는 항상 홀로있지.", + "영, 네가 날 싫어하고 있다는 걸 모를 것 같아?", + "난 잘하고 있다고.", + "물론 넌 신경쓰고 있지 않겠지만, 아무도 신경 쓰지 않지.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "거리는 지저분하고 주변은 사람들로 가득하지. 알고 있는데도 가끔은 이곳의 불빛을 보는 걸 좋아해.", + "도시는 도시만의 아름다움이 있는 걸까? 별의 반짝임처럼 영원하진 않지만 인간성이라는 게 아름다움에 깊이를 더하는 것 같아.", + "각각의 불빛들 옆에 기대와 우려, 비밀 같은 걸 안고 있는 사람들이 있어. 그래서 도시의 불빛은 무서운 정도로 고독하지만 사람 다운게 있어.", + "난 창문 뒤에 있는 모든 사람을 사랑하는 것 같아. 모두! 내 별이 돼줘서 사랑해요! 인생이 좇같아지고 바닥까지 떨어졌다고 해도 난 너를 사랑할 거야. 오늘밤은 빛으로 가득 찼어...", + "미안해. 좀 떠들었지? 들어줘서 고마워.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "이봐아아아, 천천히 가라고! 응?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "아! 들켜버렸네!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "골렘:오면서 큰 바위가 떨어지지 않았어? 내가 가끔 화나면 바위를 집어던지거든. 혹시 맞았으면 미안해.", + "골렘:엄만 항상 내게 \"그렇게 계속 바위를 던진다면 널 산에서 던져버리겠어!\"라고 했지. 정말로 그랬을까?") + } +, + second:{ + dialogue:new Array( + "골렘:네가 바위가 된다면, 바위는 수명이 길어서 정말로 오랫동안 수많은 세대의 사람들이 오고 가는 걸 볼 수 있어. 그렇게 나이를 계속 먹다 보면 그 누구보다 현명해지지.", + "골렘:...이라고 말하긴 하지만, 사실 오래전에 쌍안경 부숴버려서 무슨 일이 일어나고 있는지 잘 몰라.", + "골렘:사실, 많은 사람을 보는 것은 지루해.") + } +, + quest_event:{ + dialogue:new Array( + "골렘:오, 맞아, 저번에 뭔가를 잃어버린 사람을 만난 적이 있어... 바닷가로 간다고 했던 것 같은데.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "나는 랍스터가 아니야. 난 랜고스티노. 이름은 휴즈라고.", + "휴즈:바다의 가장 중요한 것이 뭔지 알아? 수평선을 볼 수 있다는 거지.", + "휴즈:바다는 짠맛이 끝없이 느껴지는 곳이야.", + "휴즈:붐비는 바닷가는 흐린 보석과도 같은 거야.") + } +, + second:{ + dialogue:new Array( + "휴즈:갯가재 소리를 들어본 적 있어? 갯가재는 자외선을 감지할 수 있도록 16개의 광수용체가 있다고 해. 무수히 많은 색이 떠오르지 않아?", + "휴즈:분명 매우 아름답겠지. 하지만, 우린 단순히 서로가 가진 색으로 서로 놀리면서 차별하고 있어.") + } +, + quest_event:{ + dialogue:new Array( + "휴즈:누굴 찾고 있다고? 응? 예전에 약간의 구름이 태양을 지날 때 이곳에 앉아 있었던 기억이 나. 태양이 가려진 동안, 누군가 내게 걸어왔고 뭔가가 어디에 있느냐고 물어봤었어. 그게 뭔진 기억나지 않네. 하지만 그 사람이 숲으로 도망치고 있었던 건 확실히 기억나.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "제임스:나무열매들은 좋은 과일이지. 난 나무열매들을 좋아해.", + "제임스:조심해, 소중한 열매들 위에 똥 누지 말라고.", + "제임스:올해엔 짝짓기를 18번 했어. 또, 389개의 나무열매들을 먹었고.", + "제임스:혹시 이 제임스를 위한 열매가 있니?") + } +, + second:{ + dialogue:new Array( + "제임스:내가 시를 한편 써봤어. 들어봐:\n^나는 열매가 좋아\n^열매는 나에게 열정을 주지\n^:얼마나 열렬히 좋아하냐고?\n^ 하루라도 안 먹으면 열받을 만큼!", + "제임스:넌 블루베리를 좋아하니? 아니면 산딸기를 좋아해?", + "제임스:혹시 이 제임스를 위한 딸기가 있니?") + } +, + quest_event:{ + dialogue:new Array( + "제임스:누군가 왔다 갔는데 딸기를 원하지 않었어. 서쪽 호수의 남동쪽으로 가던데.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "올리브:안녕, 난 토끼 올리브야.", + "올리브:난 시리얼이 정말 많이 있어! 나는 시리얼을 사랑해!", + "올리브:시리얼 박스가 너무 커. 시리얼이 절대 떨어지지 않을거야!", + "올리브:끝없는 시리얼이지!", + "올리브:흐으으음...그렇게 나쁜 일이 아니라고.") + } +, + bush:{ + dialogue:new Array( + "랭크:에헤헤, 멍청이 영! 빗자루는 관목을 자를 수 없다고!") + } +, + quest_normal:{ + dialogue:new Array( + "랭크:난 살아가기 위해서 관목을 잘라. 관목을 자르면 가끔 금을 발견할 수 있을거야! 으하하!", + "랭크:부시 이후로 경제는 정말 어려움을 겪고 있어...", + "랭크:관목을 자른다고 해서 항상 아내와 아이들을 먹여 살릴 수 있는 건--아니야. 하지만 난로는 항상 따뜻하지! 으하하!") + } +, + quest_event:{ + dialogue:new Array( + "랭크:어? 맞아! 어떤 사람이 이곳에 들렀다가 갔었어. 아마 지하 미로에 간다고 말했던 것 같은데...거긴 계속 베어도 끝없을 만큼의 관목이 있는 걸까? 으하하!") + } +, + marvin:{ + dialogue:new Array( + "마빈:오, 반가워!", + "마빈:저스틴은 어디갔을까?", + "마빈:주위에 로켓 병은 없는 것 같아...") + } +, + chikapu:{ + dialogue:new Array( + "치카 치!", + "치카 치카!", + "치이이이^\n카아아아^\n푸우우우우우우!!!!") + } +, + hamster:{ + dialogue:new Array( + "밥:햄스터 밥은 자신을 3인칭으로 지칭하는 것을 좋아한다.", + "밥:", + "밥:조용해! 난 햄스터틱한 분위기에 스며드느라 바쁘다고.", + "밥:... 너가 뭔가를 해서 더 나아진다고 가정해보자고... 하지만... 만약 잘못된 일이라도 더 나아질 수 있다면 계속 할 거야?", + "밥:진정한 남자는 절대 울지 않아... 뭐, 할리를 타고 모래사막을 가로지르는 사람이 헬멧도 고글도 없다면 햇볕에 탄 얼굴의 눈에서 한 방울의 눈물이 잠깐 뺨을 타고 흘러내릴 순 있지만. 그래도 남자는 울지 않아.", + "밥:이 게임은 수많은 원숭이가 수많은 타자기를 이용해서 만들었어.", + "밥:제임스가 그리워...") + } +, + electric:{ + dialogue:new Array( + "쿠리부:카레는 노랗고 매워!", + "쿠리부:동전을 넣어!", + "쿠리부:넌 2에서 경험을 얻었어!", + "쿠리부:내 전화번호를 알려주지! 0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "내가 여기서 뭐하고 있었냐고? 좋은 질문이야! 난 우연히 이곳에 오게 됐고, 숨어있었지. 여기는 안전하고 그 이상한 거에 잡히고 싶지 않거든.", + "난 비교적 다행인 것 같네. 이곳은 사방에 죽은 사람들 천지야 - 그러고 보니 이 사람들은 어떻게 죽은 걸까? 조금 흥미로운데, 왜 이 일이 일어났는가 생각해보자고. 괴물의 공격을 받은 걸까? 함정에 걸려 못으로 가득한 곳에 떨어진 건가?", + "슬픈 일이야. 나한테 이런 일이 일어나지 않았으면 좋겠어. 육체적인 고통은 정말로 끔직할거야.") + } +, + quest_event:{ + dialogue:new Array( + "오...지금은 그것에 대해서 생각하자고, 한 사람이 얼마 전에 이곳에 왔다 갔지. 그들이 뭔가를 찾고 있다고 했는데...그리고 조금 너랑 닮을 것 같네! 언제인진 기억나지 않아, 미안. 시간도 잘 기억나지 않네. 하지만 주변에 있는 마을이랑 떨어진 곳에 간다고 했던 것 같아.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "안녕.", + "무언가 찾고 있는 건가?", + "무엇을 보고 있는거지?", + "아니, 난 이 도시의 시민이 아니야. 그러니 마을에서 이상한 걸 보면 나랑 이야기 할 수 있을거야, 하지만 난 마을 사람들과는 대화할 수 없어. 하지만 주변에는 살인자가 돌아다니고, 마을 사람들은 아무도 그 사실을 몰라. 뭔가 이상하지 않아?") + } +, + quest_event:{ + dialogue:new Array( + "응. 지나간 사람이 있었어. 뭔가를 찾고 있다고 말한 것 같은데, 그 '뭔가'가 어디에 있는 지는 모르겠네. 그 사람은 서둘러 가더라. 다른 공간에 간다는 말은 한 것 같은데, 무슨 말인지 몰라도 뭔가 멋진데.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "너어 너어 너어 - - - 너는 누구야 ? ? ?", + "나는 평범한 나그네 . . . 이곳은 A에서 B로 가는 꽤 인기있는 휴식 장소야.", + "'A'가 뭐냐고 ? ? ? 내 고향이야 . . . 오랜 친구를 만나러 가는 길이야 . . . 오랜 여행이였지만 . . . 그건 약간의 희생이지 . . . 너도 그렇게 생각하지 ? ? ? 인생을 더 자극적이게 살아보자고 ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "그런건가 - - - 다른 사람을 찾고 있는 건가 - - - 알겠어 . ^ 내 메모리에 액세스 할게 . . . 읽는중(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n 그 래 . . . \n 그 사람은 갑자기 번쩍 떠올린듯이 어딘가에 있는 오두막으로 간다고 했어. \n 그 사람은 . . . 넌 그사람과 매우 닮았어 ! ! ! 정말로 그 사람이 아닌거야 ? ? 응 ? 음음 ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "너는 정말로... 음, 어. 좋다고.", + "한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다:\'빠르게, 다시 떠나야 하기 전에(점점 밝아지고 있어, 항상 일어나는 일이지)- 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\"") + } +, + quest_event:{ + dialogue:new Array( + "한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다:\'빠르게, 다시 떠나야 하기 전에(점점 밝아지고 있어, 항상 일어나는 일이지)- 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "안녕하신가. 큐브는 만나본건가?", + "큐브는 주변 공간을 통치하는 매우 좋은 통치자이지. 나나 다른 통치자들도 자신의 구역에서 통치를 잘 하고 있지만.") + } +, + gray2:{ + dialogue:new Array( + "이 공간에 대해서 어떻게 생각해? 여긴 멋진 중간 지점이야? 아니면 별로야?", + "세계의 교차로지!") + } +, + gray3:{ + dialogue:new Array( + "회색 피라미드는 사실 여기가 아니야. 특별한 시스템에서 홀로그램으로 비추고 있는 것이지.", + "왜 그런일을 하냐고? 왜냐하면 우리의 친구 큐브와 대화하고 싶거든, 그리고 큐브의 회사를 유지하기 위해서지.") + } +, + graydead:{ + dialogue:new Array( + "*잠자는 소리*") + } +, + grayspin:{ + dialogue:new Array( + "...홀로그램 장치는 제대로 작동중이야?", + "아니야?^...^제기랄!") + } +, + color1:{ + dialogue:new Array( + "큐브를 만나봤어? 그는 정말 멋진 일을 하고 있지! 듣기로 그는 절벽 끝에서 십이 초 동안 서 있을 수 있다던데. 대단하지 않아? '절벽 끝에서 서 있는 자들의 리그' 회원이라면 그 대단함을 이해할 수 있을 거야! 뭐? 모른다고? 아무튼, 대단하다고!") + } +, + color2:{ + dialogue:new Array( + "큐브는 재미있는 일을 많이 해!", + "들려? 분명히, 곧 내가 통치하게 될 차례가 올 거야! 단 몇 분 정도, 그렇게 믿고 있어.") + } +, + color3:{ + dialogue:new Array( + "나는 타이베이에서 운송된, 설탕 덩어리에서 왔어. 내가 왜 여기에 있는 거지? 이런, 큐브에게 인사하려고 들린 거였지!", + "너무 우올해 하지 마! 이곳을 찾는 사람들이 놀라지 않게 하려고 이상한 모습을 하고 있는 거야. 아무런 피해 없다고.") + } +, + colordead:{ + dialogue:new Array( + "(...낮잠 자고 있는 건가?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "모든 세대는 고통 속에서 태어나 고통 속에서 죽는 것을 반복하지. 우린 밖에 나가지 않음으로써 고통받지 않고 살고 있어.") + } +, + after_fight:{ + dialogue:new Array( + "이것이 우리에게 반란을 일으킨 너의 형벌인가?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "당신은 왜 관측자의 희생을 빼앗아 간 거지? 당신은 왜 우리의 구원을 훔쳐간 거지?") + } +, + after_fight:{ + dialogue:new Array( + "...우린 너에게 합당한 보상을 주지 못한 것 같아. 너는 우리에게 자유를 돌려주었어. 정말 고마워. 영. 관측자가 너에게 한 번 더 호의를 베풀며 바라볼 거야.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "다시 봐서 반갑다, 양. 오랜만이야. 아직도 노텐도 가지고 노니?") + } +, + after_fight:{ + dialogue:new Array( + "맙소사, 연, 아직도 어린애니? 알겠지만, 어차피 결국 다른 사람과 사귀게 된다고.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "저희 호텔은 뭐든지 최고의 시설을 갖추었습니다. 수영장은 어떠십니까?") + } +, + middle_fight:{ + dialogue:new Array( + "최첨단 피트니서 센터는 어떠십니까?") + } +, + after_fight:{ + dialogue:new Array( + "즐거운 시간 보내셨길 바랍니다.") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "오늘은 매우 멋진 날이지.", + "목을 긁어줘서 고마워 - 거기에 손이 닿질 않았거든.", + "로컬 디너에서 파는 계란이 맛있다고 들었어. 쿠폰도 가지고 있다고.", + "오늘 자동차 사고를 본 적 있어? 정말 끔찍했지! 운전사가 문자를 쓰다가 순간 훅 갔어. 아직 젊은 남자였는데!", + "내 아들은 주니어 대표팀에 못 들어가서 실망했어. 그토록 스포츠에 투자를 많이 해줬는데...", + "오늘은 추수감사절이라 여러 가지에 감사하고 있어. 내일 새벽에 있을 장사가 너무 기대돼! 화끈한 거래를 많이 하겠지?", + "아, 아마 좀 늦을 것 같아.", + "빨리 집에 가야 해, 친척들이 오기 전에 청소를 마쳐야 하는데...", + "차고에서 물건을 팔아-요!", + "환영해!") + } +, + words_teen:{ + dialogue:new Array( + "최신 영화를 안 봤어.") + } +, + words_kid:{ + dialogue:new Array( + "더이상 만화를 볼 수 없어!") + } +, + family:{ + dialogue:new Array( + "저희 집에 오신 것을 환영합니다. 낮선이여! 어디선가 본적이 있는 것 같은데... 이 마을은 평화로운 마을입니다. 꽤 조용하고, 방문자가 많이 없거든요.", + "혹시 데이브먼트 좋아해요? 데이브 형이 저에게 끝내주는 이 노래를 저에게 알려줬어요!") + } +, + older_kid:{ + dialogue:new Array( + "내 친구들은 'Rayhead'의 'None Surprises'라는 노래를 듣는 걸 좋아해. 이 마을을 불평하는 노래인데, 여기가 지옥이 아니라는 걸 감사해야 한다고! 스스로 바꾸려고 하지 않으면 ...아, 미안. 너무 떠들었네..", + "난 그냥 블로그에 글이나 쓸래.", + "너 좀 피곤해 보이는데.", + "난 TV랑 스포츠에 관련된 이야기를 잘 못하지만, 부모님이 좋아하셔...") + } +, + hanged:{ + dialogue:new Array( + "시체위에 있는 쪽지:\"이제 위험으로부터 해방이다\"") + } +, + festive:{ + dialogue:new Array( + "오, 누가 밖으로 나가나? 축제인가? 아니면 퍼레이드?", + "밖이 너무 조용한 것 같은데? 창밖을 봤어? 무슨 일인지 궁금한데...") + } +, + paranoid:{ + dialogue:new Array( + "제 집은 창문이 많아요. 하지만 전 창문을 좋아하지 않죠. 계속 감시당하는 느낌이 들거든요. 근데 밖에서 무슨 일이 일어나고 있는 것 같은데, 항상 시끄러워서 저한테 방해가 됐었거든요. - 왜 이렇게 조용한거지?", + "살인자? 뭐라고? 밖에서? 대체 무슨 말을 하는 거죠? 장난치는 거예요? 이 마을에는 살인자가 나타난 적이 없어요, 하지만 당신이...계속 조심하라고 경고하니...당신은 당장 이 마을을 떠나야 될 것 같네요.", + "죄송하지만 나가주세요.") + } +, + dead:{ + dialogue:new Array( + "둔기로 얻어맞은 것 같은 여자의 시체이다.", + "남자의 시체이다.") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "오, 너구나! 왠지 익숙한 얼굴인데...난 너가 마을 사람들을 더 죽일 때까진 움직일 수 없어, 기억나지? 조금있다가 봐.", + "이 책자에 따르면... 넌 몇 명만 더 죽이면 돼! 계속 하라고.", + "한 명만 더 죽이면 돼, 그러고 나면 계속 나아갈 수 있다고.", + "잘 했어. 자유로움을 느끼며 안으로 들어가. 안에 무엇이 있는지 모르지만, 아무튼 다시 만나. 내일 같은 시간에 말이야. 알겠지? 아니면 그 다음날 저녁에 볼까?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "나무한테 감시당한다고 해도 상관없어.", + "그년 어딨어?!", + "너가 혼자일 때마다 내가 함께할 것이다, 영.", + "너가 오크샤였어? 엄만 항상 오크샤가 위험하다고 경고했었어.", + "반가워어, 영! 이렇게 만나서 반가워어! 왜 날 올리지 않는 거야? 난 그냥 차 위에 얹어서 먹는 푸딩이라고!", + "퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 성단소, 설교단, 제단, 스테인드글라스 창문...", + "한정 판매중! 오늘만 특별히 하나를 사면 - 하나가 공짜!", + "전기가 나갔을 때 촛불을 밝혔던 때가 기억나나요?", + "으으으음, 어젯밤에 네 베개는 편안했어.", + "날더러 게이새끼라고? 이걸로 맛 좀 보여주지 이새끼들.", + "상품과 나는 좋은 팀이야.", + "난 선택받은 사람 견습생이야!!!", + "가끔, 자신이 무슨 짓을 했는데 세상이 죽어가는 것을 막을 수 없게 된 느낌을 알아?", + "숲의 버섯을 조심해...", + "정말 미안해. 본능적으로...", + "'그냥 바위야'라니?? 바위도 카드가 될 수 있다고!", + "한명의 남자에게 물고기 한 마리를 준다면 하루 만에 다 먹겠지. 하지만 물고기 잡는 법을 알려준다면 아들 지미와 부자 관계가 더욱 돈독해지겠지?", + "때로는 걸으면서 대화하면 답이 생기기도 해.", + "박지는 왜 갑자기 날아올라서, 너의 주변을 돌아야 해?", + "꽃구경 이야기는 이제 그만해!", + "행복해?", + "내 주변엔 폭력이 없어.", + "난 항상 철 요리사가 되고 싶었어.", + "엄만 항상 내게 '허리를 계속 굽히고 있으면 그대로 허리가 굳어버린단다!'라고 말했었지.", + "아직 즐겁지 않은건가, 인간?", + "...", + "과학적으로 말해서, 두꺼비는 개구리의 부분 집합이야.", + "하하하하! 그래! 알고 있어!", + "오, 당신도 카드를 모으는 건가요? 정말 고급스러우시네요, 잉.", + "그들은 항상 내게 \"컴퓨터 끄거라! 아니면 평생 친구를 사귀지 마렴!\"이라고 말했었지.", + "지금 나는 오로지 대화의 범위안을 통치한다.", + "당신은 '내가 일을 즐겁게 하고 있다'라고 생각하는 것 같아요!", + "난 대각선이 싫어.", + "나의 꽃가루? 히스타민따위 듣지 않는다고.", + "당신의 방문 잠금을 풀기 위해서 카드를 스와이프하세요!", + "나만 믿게나.", + ".......??", + "누가 우리를 조각한거지?", + "즐겁게 머물다 가셨길 바랍니다.", + "이때까지 있었던 너의 행적을 봤어. 너 재미있는데,", + "네가 길을 잃게 하도록 여기 있는 거야.", + "우리에겐 너도 피라미드지만 말이야!", + "매일 밤마다 계속대는 지랄맞는 놀이, 월급도 개같지.", + "날 내버려둬! 내 성은 삭스가 아니란 말이야!", + "적어도 나는 막대기 아니에요.", + "돈은 나무에서 나오지 오지 않는다니 무슨 소리야? 으하하!", + "나는 아무것도 아니다. 환각일 뿐이다.", + "그냥 화풀이 하는 거야.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "-", + "을(를)눌러 조작설정", + "을(를)눌러 취소", + "상", + "하", + "좌", + "우", + "점프", + "공격", + "메뉴", + "버튼", + "을(를)눌러 나가기", + "을(를)눌러 조작설정") + } +, + title:{ + dialogue:new Array( + "방향키를 움직여\n화면에 검은 부분이\n안 보이도록\n맞춰 주세요.\n\n", + "을(를)눌러 진행합니다.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "아무버튼이나 누르세요", + "버튼", + "으(로)시작합니다", + "버전", + "계속하기", + "새로시작", + "계속하시겠습니까?\n아니오\n네", + "정말로요?\n아니\n그래", + "다신 되돌릴 수 없습니다!\n지워버려!\n알겠어", + "죽은횟수", + "카드", + "Anodyne은(는)대부분의 컨트롤러를\n지원합니다.\n\n지금 연결된 컨트롤러를 사용하시겠습니까?\n\n네 아니오\n\n만약 사용하신다면.\n\n방향키로 조작이 가능하고\n\nC, SPACE, 또는 ENTER\n로 선택이 가능합니다.\n\n예로 기본설정\n", + "안내문\n\n만약 연결된 장치가 있으시면\n게임플레이중 지연이 있을 수 있습니다,\n게임을 종료한 후\nAnodyne을(를)재실행\n해주세요.\n\nC로 계속 진행\n\nGUI가 올바르지 않게 표시됩니까?\n아래 버튼을 누르면\n장치의 방향을 변경합니다.", + "BACK을(를)다시 눌러\n게임을 종료해주세요.\n저장되지 않은 진행은\n잃게됩니다.") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "저장중...") + } +, + map:{ + dialogue:new Array( + "지도", + "현재 위치", + "문/출구", + "지도 없음", + "연결체로\n돌아가기", + "입구로\n돌아가기") + } +, + items:{ + dialogue:new Array( + "아이템", + "평범한 빗자루", + "변동기", + "확대기", + "확장기", + "스프링이 장착된 신발 한 켤레 -", + "을(를)눌러 점프하세요!", + "자전거용 시발 한 켤레.", + "비어있는 골판지 상자.", + "사원에서 발견한 열쇠.", + "붉은곳의 지하 동굴에서 발견한 열쇠.", + "산의 동굴에서 발견한 열쇠.") + } +, + cards:{ + dialogue:new Array( + "카드", + "카드") + } +, + save:{ + dialogue:new Array( + "저장", + "저장됨!", + "오류", + "저장후 타이틀로\n", + "타이틀로", + "저장하고 종료", + "게임 종료", + "죽은 횟수:") + } +, + config:{ + dialogue:new Array( + "설정", + "조작 설정", + "불륨 설정", + "체크 포인트에서\n자동 저장:", + "켜기", + "끄기", + "보기\n설정:", + "UI 설정", + "화면터치+D-Pad", + "D-Pad 만", + "화면 터치만", + "조작 설정:", + "해상도:", + "창모드", + "전체화면", + "늘리기", + "크기:", + "언어:", + "일본어", + "영어", + "만족하실\n때까지\n버튼으로\n조작해주세요.\n\n그다음,\n메뉴를 탭하여\n계속 진행하세요.\n\n", + "원도우크기 재설정", + "조이패드 설정") + } +, + secrets:{ + dialogue:new Array( + "너 엄청 부자구나!", + "한때 유명한 거품 마법사의 소유물이었지.", + "만약 그래픽이 깨지면", + "이 심장은 이름이 없어.", + "부디 전기 몬스터 세상에도 방문해줘.", + "키티 동상. 귀엽지만 쓸모 없다.", + "오오! 들켜버렸다!!!", + "이런! 들켜버렸다!!!", + "검은색이군.", + "빨간색이군.", + "초록색이군.", + "파란색이군.", + "하얀색이군.", + ":선택", + ":뒤로") + } +, + swap:{ + dialogue:new Array( + "미안해!", + "여긴 변동기를 사용할 수 없다.", + "여기서 변동기를 사용하기엔 힘이 부족하다.") + } +, + keyblock:{ + dialogue:new Array( + "이 문은 잠겨있어.") + } +, + treasure:{ + dialogue:new Array( + "이상한 힘이 보물 상자가 열리는 것을 막고 있다.", + "빗자루의 손잡이에 문자가 새겨져 있다:", + "을(를)누르세요.", + "이 열쇠는 아마도 한 번정도 장벽을 여는 데 사용할 수 있을 것 같아.", + "수수께끼의 신발. 브랜드 이름이 쓰여있다:", + "을(를)눌러 강한 점프\".", + "빗자루에 무언가 써져 있다:\"메뉴에서 확장기를 장비하시면 빗자루의 나쁜 먼지가 좌우로 약간씩 증가합니다.\"", + "빗자루에 무언가 써져 있다:\"메뉴에서 확대기을 장비하시면 빗자루의 나쁜 먼지의 범위가 증가합니다.\"", + "빗자루에 무언가 써져 있는 문장의 다음 부분:\"안녕하세요, 영. 변동기를 사용하면 타일 두 개의 위치를 바꿀 수 있습니다. 어디에서나 사용하려면 아직 시간이 필요하지만, 당분간은 변동기를 유용하게 쓸 수 있을겁니다.\"", + "하트를 발견했다!!! 최대 체력이 0증가했다! ...?", + "골드만:뭐? 거기 없다고? 분명히 그 가게 주인이 훔쳤다고!") + } +, + dust:{ + dialogue:new Array( + "이제 빗자루가 먼지로 뒤덮혔습니다! 먼지를 바닥에 두려면 다시 공격하세요.") + } +, + checkpoint:{ + dialogue:new Array( + "저장하시겠습니까?\n 네\n 아니오", + "체크포인트 위에 서 있을 때,", + "을(를)눌러 진행을 저장하고, 동시에 그곳이 부활 장소로 설정됩니다.") + } +, + rock:{ + dialogue:new Array( + "낙서가 적혀있는 돌:") + } +, + door:{ + dialogue:new Array( + "차원문이 작동하지 않을 것 같다.") + } +, + keyblockgate:{ + dialogue:new Array( + "관문을 겁에 질릴 정도로 빤히 쳐다봤지만 열리지 않았다, 네 장의 카드를 가지고 있기 전까지는 열리지 않을 것 같다...", + "관문이 네 장의 카드를 감지하고, 열리기 시작한다.", + "관문은 고집스러울 만큼 그대로 있다.", + "관문이 모든 카드를 감지하고, 열리기 시작한다.", + "관문이 충분한 카드를 감지하고, 열리기 시작한다.", + "열렸어!", + "닫혔군.") + } +, + solidsprite:{ + dialogue:new Array( + "표지판이 동쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다.", + "표지판이 서쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다.", + "글자들이 바래서 내용을 알 수 없다.") + } +, + mitra:{ + dialogue:new Array( + "이봐, 영!", + "선물로 주는 자전거 신발이라고? 와우! 고마워, 영! 어떻게 신발을 손에 넣을까 생각하고 있었는데, 상품한테 그 자전거 신발에 맞는 클립이 패달에 달려 있거든. 여기, 영. 그냥 받기는 뭐하니까 내 신발이랑 교환하자! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐!", + "을(를)눌러 신발과 점프할 수 있어!", + "안녕 영! 새로운 소식이라도 있어? ^... ^...오, 알았어, 내가 새로운 자전거 신발을 얻었다고, 나도 알아! 이 신발은 상품의 패달에 딱 들어맞지. 이제 더이상 예전에 쓰던 신발이 필요 없어, 그래서 네게 준거지, 영! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐!", + "을(를)눌러 신발과 점프할 수 있어!", + "좋아, 조심해!", + "가라고, 놈들을 무찔러버려! ...하지만 냄새나는 놈들은 아니네.", + "멋지군, 그렇지 않아?", + "와우, 그 자전거 신발은 핀티씨네 가게에서 산거야? 혹시 그 신발을 내게 선물로 주지 않겠니? 고마워, 영, 정말로 고마워! 여기, 보답으로 내가 쓰던 신발을 줄게--정말로 고마워! 잘 쓸게! 아마 신발에 적혀 있을거야. 어디보자, \"", + "을(를)눌러서 파워 점프\". 의미를 모르겠네. 신발 어디에도 \"", + "\"버튼 같은 건 보이지 않아!") + } +, + tradenpc:{ + dialogue:new Array( + "핀티:반가워, 반가워, 내 호갱... 아니 친구 영! 내 이름은 프라산도프--핀티 프라산도프야! 혹시 마음에 드는 게 있어? 사양말고 마음껏 둘러보라고!", + "핀티:그 상자를 줘서 정말 고마워!", + "핀티:아, 상자! 정말 고마워! 이제 퇴근할 때 집으로 남은 재고들을 가져갔다가 아침에 다시 들고올 수 있겠다!", + "잠시만 기다려봐...어? 없잖아! 어디간거지? 음, 여기, 그 물건이 지금 안보여서 대신에 너의 상처라도 완화시켜줄게!", + "감사의 표시로, 이 간지나는 자전거 신발을 가져가!", + "좋은 아침이야. 안 그래, 친구? 장사하기 위한 좋은 아침이지! 이제 내 재고들 들고 다닐 수 있는 상자 하나만 있으면 좋을텐데...", + "저런, 넌 아직 이걸 살 형편이 안돼 보이네! 돈이 생겼을 때, 다시 오도록 해!", + "핀티:오오, 무기를 보는 그 눈빛! 좋아! 넌 더 좋은 무기가 필요해, 내 말 맞지? 단돈 $499.99에 적들을 녹여버려!", + "핀티:그 돈자루는 네가 대륙에서 발견하는 돈을 담아 자기한테 저금하는 걸 허락하겠다고 말하고 있어! 단돈 $869.99만 낸다면 바로 네 거라고!", + "핀티:오 호 호, 여기 특수 품목인 간지나고 초고속으로 달릴 수 있게 해주는 클릿이 달린 자전거 신발! 지금만 특별히 단돈 $299.99에 모십니다아-!", + "핀티:그 빗자루 주변의 먼지때문에 피곤한가? 이 최첨단-진공-청소기와 함께라면 유해한 먼지들의 입자마저 근절시켜 버린다고! 단돈 $749.99에 모십니다~! 아니면 4개월 할부로 달마다 $199.99는 어때?", + "감사의 표시로, 이 못생긴--아니 그러니까 아름다운 이걸 가져가! 바로 콜렉터즈 에디션 카드!^") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\n게임 제작\n\nMelos Han-Tani\n\n그리고\n\nMarina Kittaka\n\n-------------", + "개발 기간\n\n2012년 4월 부터\n\n\n\n2013년 1월 까지", + "디자인\n---\n둘이서 함께", + "프로그래밍\n-----\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\n미술\n--\nMarina\n", + "음악/효과음\n------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\n대사\n--\nMostly Marina\n", + "스토리\n---\n둘이서 함께\n\n현지화\n---\n일본어 현지화\nKakehashi Games\n한국어 현지화\nMiRiKan", + "Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game.", + "O - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways.", + "Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport.(Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina.", + "Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up.", + "Mo, for believing\n in me.\n\nTina, for Introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it.", + "캐스트\n---\n\n\n슬라임\n\n\n짜증나는 놈\n\n\n퓨 퓨\n\n\n방패지기\n\n\n탐구자", + "움직이는 자\n\n\n온 오프\n\n\n사면 발사대\n\n\n슬래셔\n\n\n악당\n", + "개\n\n\n개구리\n\n\n회전자\n\n\n사람\n\n\n벽\n\n", + "쥐\n\n\n가스맨\n\n\n좀벌래\n\n\n돌진기\n\n\n롤러\n\n관측자\n\n\n", + "먼지광\n\n\n폭발 식물\n\n\n매니저\n\n\n", + "사자\n\n\n뒤틀린 자\n\n\n불꽃 기둥\n\n\n두 광대들\n아서\n자비에라", + "추종자\n\n\n에드워드\n\n\n낚시꾼\n\n\n붉은 워커\n\n절단자", + "토끼\n\n\n이키\n\n\n가게 주인\n\n미아오 샤오 투안 어\n\n랭크\n\n골드맨", + "토렉스\n\n제임스\n\n버섯\n\n클릭손\n\n골렘\n\n교외 거주자", + "체이서\n\n\n엔티티\n\n\n공간의 얼굴들\n\n\큐브 왕", + "영\n\n\n미트라\n\n\n현자\n\n\n브라이어", + "그리고 게임을 플레이한\n당신께 감사드립니다!\n끝까지 즐겨주셔서 감사합니다!\n\n\n즐거우셨길\n바랍니다.", + "\n\n\n\n\n\n\n\n", + "이제 당신은\n변동기를 통해\n영의 세상을\n(거의)제한 없이\n탐험하실 수 있는\n능력을 얻었습니다.\n") + } +, + elevator:{ + dialogue:new Array( + "몇층으로 가시겠습니까?", + "1\n", + "2\n", + "3\n", + "4\n", + "취소") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_PT.hx b/intra/source/data/NPC_Data_PT.hx new file mode 100644 index 0000000..ce7b0dd --- /dev/null +++ b/intra/source/data/NPC_Data_PT.hx @@ -0,0 +1,3952 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_PT { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "Gosta de música? Examine aquele terminal!", + "Gosta de sofrer? Dirija-se ao sul!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Aquela acrobata está perdendo o equilíbrio! Onde está a rede de segurança?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "UOAAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "Os leões estão encurralando aquela malabarista!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "Briar:Estou cansado, Young. Estou cansado de todos esses ciclos. Eu me sinto como se estivesse vivendo o mesmo sonho, o mesmo pesadelo, de novo e de novo.", + "Briar:...", + "Briar:Isso não mudará, Young. Isso é tudo que sempre seremos.") + } +, + after_fight:{ + dialogue:new Array( + "Briar:Adeus, Young.") + } +, + final:{ + dialogue:new Array( + "Briar:Cara, Young.", + "Briar:Bata seus pés, mova seus braços. Caramba, você não aguentaria um minuto sem mim!", + "Briar:Bem, vem comigo, vamos comer um sanduíche ou algo assim.", + "Sábio:Você... você agiu adequadamente. Até o nosso próximo encontro.") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "Voz Misteriosa:Olá? ...Young? ^EI! ... ah, você pode me ouvir? Bom, agora escute. Você está prestes a acordar. Você usará as setas para se mover.", + "Você usará a tecla \'", + "\' para Interagir com objetos e pessoas ao seu redor.", + "E você usará a tecla \'", + "\' para acessar o menu, que fornecerá informações sobre você e os seus arredores.") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "Young... Eu só queria consertar tudo para você.", + "Eu espero... Eu espero que você se saia melhor que eu.") + } +, + posthappy_mitra:{ + dialogue:new Array( + "Boa sorte, Young.", + "O Sábio está certo, de certo modo. Eu quero que tudo seja perfeito, e algumas vezes isso me faz ignorar a realidade.", + "Eu não sei o que você precisa fazer para ajudar O Briar. Eu não entendo como esse mundo funciona ou porque tudo aparenta ser tão estranho. ^Mas eu quero ser sua amiga, Young.", + "Você está lutando, Young. Você está tentando entender. Eu espero que você consiga se resolver.") + } +, + one:{ + dialogue:new Array( + "Sábio:Young... esse é meu último aviso... espere, quem é ela?", + "Mitra:Meu nome é Mitra, e esta é minha bicicleta, Wares!", + "Sábio:Eu não perguntei o nome de sua bicicleta, o que você está fazendo aqui? Não me lembro de você.", + "Mitra:Estou aqui para ajudar meu amigo, Young.", + "Sábio:Young não tem amigos. Young sequer tem O Briar. E se você está provocando ele, quero você fora do meu mundo!", + "Mitra:O que você quer dizer? Wares e Eu--", + "Sábio:PARE DE FALAR SOBRE SUA MALDITA BICICLETA!!!") + } +, + hit:{ + dialogue:new Array( + "Sábio:...", + "Mitra:Young! Você está bem?^ Origada pela ajuda. Agora vá e acabe com essa última área de araque! Nós sabemos que você consegue!", + "Mitra:Wares!!!", + "Mitra:Wares...", + "Mitra:Preste atenção, encapuzado misterioso, eu não sei quem você pensa que é, mas que tal nos deixar em paz?", + "Sábio:Você acha que é amiga de Young só porque você irá mentir e dizer para ele que lá no fundo ele é perfeito e que no fim tudo ficará bem. ^Bem, se é isso que você quer, TUDO BEM. Suma da minha frente, Young.", + "Sábio:Vá falar com sua amiga.", + "Mitra:Nós só estamos fazendo o melhor que podemos...") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Homem Encapuzado:Bem, já estava na hora. Er...^Quer dizer...^ Saudações, Young! Eu sou o Sábio, o Ancião do Vilarejo. Você foi invocado aqui pois A Escuridão se espalhou pela Terra. A Escuridão procura O Briar Lendário, para usar seu poder para propósitos malignos. Você deve alcançá-lo primeiro. Você deve proteger O Briar.", + "Entre no portal ativo a sua esquerda para iniciar sua jornada.", + "*suspiro* Não pega bem ficar pasHan-Tanido por aqui. Entre no portal para iniciar sua busca. O Briar, e por extensão, o mundo estão em grande necessidade!", + "Apenas entre no maldito portal!") + } +, + after_ent_str:{ + dialogue:new Array( + "Por que você ainda está aqui?") + } +, + after_bed:{ + dialogue:new Array( + "Siga em frente, Young. Essa chave que encontraste, devem existir outras como ela - vá a procura delas.", + "Vá para os mais longínquos cantos da Terra, Young. Essa é a única maneira de impedir A Escuridão.") + } +, + before_windmill:{ + dialogue:new Array( + "Use essas três chaves, Young, e abra o caminho para os cantos mais profundos da Terra.") + } +, + after_windmill:{ + dialogue:new Array( + "Você fez o que pedi, Young, apesar de ainda existir muito a ser feito. Talvez se você explorar as profundezas da Terra você poderá achar respostas... talvez você será de algum valor para O Briar.") + } +, + all_card_first:{ + dialogue:new Array( + "Bom trabalho, Young. Você encontrou todas as cartas de uma área da Terra, e como resultado uma jóia apareceu no topo do portal dessa área.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Sábio:Em breve suas habilidades serão postas a prova, Young. Para sobreviver a esse templo, você precisará de ambos força e Intelecto. Suponho que você tenha encontrado uma arma, correto?", + "O qu-?? ... Qu-quer dizer... Sim é claro... uma vassoura! Er... exatamente como foi previsto na Lenda...", + "*resmungos* ... de todos os incopeten--Ei! O que você está fazendo aí parado?", + "Juízo, Young.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Sábio:Neste momento, você ainda está fraco. Se você deseja proteger O Briar da Escuridão, você deve enfrentar seus medos. A carta que encontrará neste baú, e outras como ela, são o símbolo do seu crescimento. Adquirir tais cartas é vital para sua jornada.", + "Essa chave também terá um papel importante em sua busca. Você deve procurar outras chaves como ela. Selecione o mapa na tela de menu para se teletransportar de volta para a entrada do templo e dar continuação a sua heróica jornada.", + "Explore o Sudoeste dos terrenos do templo... você encontrará um uso para essa chave.", + "O que, você quer que eu te carregue nas costas para o portão ou algo assim?") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "Sábio:Por que você não me escuta?! Se você se apressar como um idiota, colocará em perigo não só O Briar, mas também A Terra e tudo para o qual trabalhei! Me desculpe Young, mas se você não me escutar, eu terei que convencê-lo de outra forma...") + } +, + after_fight:{ + dialogue:new Array( + "Sábio:Young... Não era para acabar assim... Eu queria que você se tornasse uma pessoa melhor. Eu queria que você ajudasse O Briar. Mas tudo isso é apenas um jogo estúpido... Não posso lhe impedir de chegar ao Briar. Apenas lembre de minhas palavras quando tudo for para o inferno.") + } +, + entrance:{ + dialogue:new Array( + "Sábio:Olá, Young. Quando você se tornar um indivíduo mais forte e sábio, este caminho lhe levará até O Briar.", + "Sábio:Você não está preparado Young, primeiro você ainda precisa enfrentar mais desafios na Terra.", + "Sábio:Você fez algum progresso, Young, mas você deve coletar pelo menos 36 cartas para abrir esse portão.") + } +, + etc:{ + dialogue:new Array( + "Sábio:Ah... umm... você tem pelo menos 36 cartas? Mas eu não acredito de que você esteja pronto para o derradeiro teste. De fato, olhe, nós estávamos lendo este portão errado, você precisa na verdade de\n...\n......\n92 cartas para abrí-lo, e não 36!", + "Sábio:Young, não vá, você não está preparado! Pense no Briar! Na Terra! Tudo será em vão se você não estiver pronto!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Sábio:Excelente trabalho, Young. Você teve não só que conquistar esse monstro mas também seus medos para emergir vitorioso!!!", + "Sábio:Mas é claro, você ainda tem um longo caminho pela frente. Você tem explorado A Terra?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Sábio:Muito bem, Young. No entanto, ainda existem desafios a serem superados. Não perca seu foco.", + "Sábio:Você encontrou todas as chaves, Young? Se não, vá para a praia.") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "Eu não sou como os outros! *auau* Eu não irei machucá-lo...", + "É uma existência pacífica aqui em cima.", + "Você cheira a alcega.", + "*auau*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "Você conseguiu, Young! Você derrotou A Escuridão! Olhe em volta! Que belo!", + "Tão belo...") + } +, + dump:{ + dialogue:new Array( + "Graças a deus você chegou! Estava preocupado pensando que você poderia estar preso naquela birosca congelada... Aquele lugar é depressivo pra caralho!", + "Hahaha. Hahahahaha. HAHAHAHAHAHAHA!") + } +, + drink:{ + dialogue:new Array( + "Ei bonitão, deixa eu comprar um drink pra você.", + "Tome outro drink, seu merda! Hahaha!") + } +, + hot:{ + dialogue:new Array( + "Porra, está quente aqui... Estou suaaaaando...", + "Droga, malhar me deixa com tesão!") + } +, + gold:{ + dialogue:new Array( + "Você sabia que esse lugar é feito de ouro? Ouro de verdade! Nós poderiamos fugir juntos e viver dos tijolos daqui! Wahahahaha!", + "Sério mesmo, porque você está aí parado? Me ajude a tirar esse tijolo aqui.") + } +, + briar:{ + dialogue:new Array( + "???:Young... Você finalmente conSeguIU! VoÊc ME ssalvOU AgOrE TuDo FICARÁ beN dE nOvO!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "CUIDADO!", + "Desculpe pelo que aconteceu... Eu estava indo muito rápido. Hm, Eu nunca vi você antes! Você é um colega viajante? ... Ahm? Você quer proteger o Briar da maligna Escuridão? ^Bem... Eu não tenho idéia do que você está falando, mas me parece legal!", + "Eu viajo por aí, pedalando Wares. Wares é o nome da minha bicicleta!", + "Eu já vou indo, quem sabe a gente se encontra outra hora. Caso eu ouça algo sobre o Briar eu conto pra você.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "CUIDADO! Muito bem Wares, vamos lá!", + "GERÔNIMO!", + "Vá lá, Young, nós seguramos as pontas aqui!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "Lembra de mim? Esqueci de me apresentar da última vez, só apresentei minha bicicleta, Wares. Meu nome é Mitra.", + "Lembra de mim? Eu esqueci de me apresentar da última vez, meu nome é Mitra, e essa jovem bicicleta se chama Wares.", + "Mitra:Com tem ido, Young? ...o que? Como eu sei o seu nome? Você acha estranho? Bem, ele está escrito na parte de trás do seu capuz.", + "Mitra:Nos vemos por aí, Young!") + } +, + quest_event:{ + dialogue:new Array( + "Mitra:Ei, acabei de lembrar - mais cedo alguém falou que estava procurando algo e que iria para as montanhas. Não entendi do que se tratava.") + } +, + game_hints:{ + dialogue:new Array( + "Nada.", + "Hm, está perdido? Tentou procurar algo na praia? Talvez exista alguém lá que possa te ajudar. ^Parece que essa sua chave é de uma coleção. Talvez você precise achar mais delas?", + "Hm, está perdido? Tentou a floresta? ^Essa sua chave - parece que ela é de uma coleção. Talvez você precise achar as outras?", + "Parece que você achou todas as chaves! ^Eu lembro de ter visto alguns portões no sudeste, talvez você deva usá-las lá?", + "Ei, eu vi que você ligou a turbina eólica! Sabe se isso teve algum efeito na Terra?", + "Nossa Young! Você realmente conseguiu uma porrada de cartas! Já descobriu pra que elas servem? Com essa quantidade você pode conseguir um bocado de coisas!", + "O que é esse novo acessório para vassoura que você tem? Ele permite modificar a estrutura do mundo...? Honestamente, isso é assustador Young. Ainda bem que isso parece não funcionar em qualquer lugar. Talvez só nos lugares mais profundos e estranhos da Terra.", + "Está gostando dos seus sapatos de pulo? Bem maneiros, não é? Eu estou amando meus novos sapatos para pedalar. Eles fazem Wares e Eu um time ainda melhor!", + "Maneiro, Young, você achou outra chave. Wares gosta dessa cor! Já descobriu um lugar para usá-la?") + } +, + card_hints:{ + dialogue:new Array( + "Mitra:Young, está a procura de cartas?\Procurou ao redor da área do templo do Aquele que Vê?", + "Mitra:Young, está a procura de cartas?\nOuvi dizer que existe um labirinto na saída traseira do templo de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\nVocê deve achar algo perto do lar de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\nTem uma sala cheia de inimigos no templo de Aquele que Vê, não é?", + "Mitra:Young, está a procura de cartas?\nJá procurou por todos os lugares do templo de Aquele que Vê?", + "Mitra:Young, está a procura de cartas?\nTente procurar na área vestigial perto da saída traseira do tempo de Aquele que Vê", + "Mitra:Young, está a procura de cartas?\Talvez seu vizinho saiba de algo.", + "Mitra:Young, está a procura de cartas?\nEu sei que o cara no seu apartamento estava escondendo algo...", + "Mitra:Young, está a procura de cartas?\nEm algum lugar perto da entrada do seu apartamento... procure por lá!", + "Mitra:Young, está a procura de cartas?\nJá procurou em todos os lugares do seu apartamento?", + "Mitra:Young, está a procura de cartas?\nExistem uma ilha ao sul daqui. Eu nunca fui lá, mas acho que vale a pena você dar uma olhada.", + "Mitra:Young, está a procura de cartas?\nMuitas coisas podem ser encontradas se você seguir os rios. Comece por aí!", + "Mitra:Young, está a procura de cartas?\nEu lembro que alguém deixou uma carta perto da turbina eólica.", + "Mitra:Young, está a procura de cartas?\nProcure pelos rios na floresta.", + "Mitra:Young, está a procura de cartas?\nTente procurar na base das montanhas.", + "Mitra:Young, está a procura de cartas?\nJá tentou procurar no cume das montanhas?", + "Mitra:Young, está a procura de cartas?\nNo lugar mais longínquo da praia deve ter algo.", + "Mitra:Young, está a procura de cartas?\nFaça uma caminhada pela floresta vermelha.", + "Mitra:Young, está a procura de cartas?\As cavernas vermelhas estão cheias de portas trancadas, não é?", + "Mitra:Young, está a procura de cartas?\nTente a caverna vermelha do norte - siga o rio até o fim!", + "Mitra:Young, está a procura de cartas?\nNa caverna vermelha ao norte, procure pela nascente do rio!", + "Mitra:Young, está a procura de cartas?\nHmm... já tentou procurar por todos os lugares do labirinto sombrio?", + "Mitra:Young, está a procura de cartas?\nLembro de um caminho cheio de lança-chamas em algum lugar. Deve haver algo no fim dele!", + "Mitra:Young, está a procura de cartas?\nEsse pessoal do circo devem está escondendo alguma coisa. Já olhou por todos os lados?", + "Mitra:Young, está a procura de cartas?\nJá tentou procurar na área ao redor do poço daquele casal?", + "Mitra:Young, está a procura de cartas?\nTem um casal que gosta de se encontrar perto de um poço. Eles devem estar escondendo algo.", + "Mitra:Young, está a procura de cartas?\nAlgumas vezes coisas são escondidas em locais cercados por abismos - especialmente em cavernas nas montanhas!", + "Mitra:Young, está a procura de cartas?\nTente procurar nos pontos mais altos das cavernas nas montanhas.", + "Mitra:Young, está a procura de cartas?\nSerá que há algo nas profundezas daquelas cavernas na montanha?", + "Mitra:Young, está a procura de cartas?\nAquele cubo colorido naquele lugar estranho - provavelmente ele deve ter algo!", + "Mitra:Young, está a procura de cartas?\nJá tentou falar com aquele cubo cinza naquela área maluca? Talvez ele saiba de algo!", + "Mitra:Young, está a procura de cartas?\nO andar de cima daquele hotel está meio caído, mas ele deve ter algo!", + "Mitra:Young, está a procura de cartas?\nVocê já procurou por todos os lugares do terceiro andar do hotel?", + "Mitra:Young, está a procura de cartas?\nAposto que alguém deixou algo no segundo andar do hotel.", + "Mitra:Young, está a procura de cartas?\nO dono do hotel deve ter deixado algo para você!", + "Mitra:Young, está a procura de cartas?\nAquelas pontes quebradas ao noroeste... procure por lá!", + "...Ahm?! Você não achou *nenhuma* carta? Cara, Young, você está louco! Algumas vezes na vida você tem que ser aventureiro. Abra algumas caixas, saca?") + } +, + general_banter:{ + dialogue:new Array( + "Você achou aquele cara que estava procurando por algo nas montanhas?", + "Você sabe qual é o sobrenome da minha bicicleta? Waldo! Manja? Wares Waldo! ... Brincadeira, bicicletas não tem sobrenomes.", + "Acha que eu devo comprar uma trava para bicicletas? Eu odiaria prender Wares assim, mas ouvi dizer que roubos de bicicletas estão em alta.", + "Então, o que é esse tal de Briar? Algum tipo de artefato de uma cultura perdida?", + "Por que será que eu não ouvi nada sobre a chegada da Escuridão? Talvez a maioria das pessoas estão ocupadas demais com seus problemas do dia a dia.", + "Ei Young, eu só queria te dizer que... seu cabelo é irado.") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "Estátua:O Ancião do Vilarejo é apenas em nome, pois ambos ele não é.") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "Estátua:Eu vi uma vassoura em uma lenda... estava no mapa de um armário de zelador.") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "Estátua:Adquirir cartas é vital para sua jornada. Adquirir cartões é vital para outras jornadas, como conseguir crédito.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Estátua:Excelente trabalho, Sábio. Você teve que conquistar não só o seu temperamento mas também a sua dignidade para dizer uma frase tão manjada!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "Quando você se tornar um indivíduo mais estressado e apático, esse caminho irá lhe levar ao Vinte Sabores.") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "Eduardo:Há um tempo atrás um homem veio e instalou um espelho no nosso banheiro. Eu tinha medo de que uma câmera estivesse dentro dele. Coloquei sabão em cada centímetro da moldura de madeira na esperança de causar um curto-curcuito. Nunca encontrei nada, é claro.", + "Eduardo:Esse templo é dedicado a Aquele que Vê. Eu não sei porque vim aqui, estou assustado demais para entrar.") + } +, + bedroom_not_done:{ + dialogue:new Array( + "Eduardo:Está com problemas? Eu já imaginava. Tudo que você tem é uma vassoura, e tudo que uma vassora pode fazer é mover sujeira.") + } +, + bedroom_done:{ + dialogue:new Array( + "Eduardo:Quer dizer que você derrotou Aquele que Vê? Você não entende que não é assim que as coisas funcionam? Você só está colocando sabão no espelho.") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "Ah, que adorável. Pequenino Young, brincando de ser herói. Testemunhei todos seus passos na Terra, e tenho que dizer, Young, nem todo mundo aqui é tão honesto quanto eu. Tenha cuidado com quem você confia.") + } +, + after_fight:{ + dialogue:new Array( + "Eu estarei com você, Young, onde quer que você esteja. Lembre-se do meu conselho durante sua pequena aventura.") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "Pedra:Visão periférica é o lar do satanás.") + } +, + two:{ + dialogue:new Array( + "Pedra:Lista de Tarefas:Construir um método de transporte para o Nexus. ^Progresso:Aquele que Vê não dará os fundos necessários para realizar esse empreendimento. Teremos que reverter para o método original dos inexplicáveis portais.") + } +, + three:{ + dialogue:new Array( + "Pedra:Estou aprisionado aqui sozinho. O trabalho nesse túnel é constante, e a cada dia consigo ver um pouco de progresso.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Esta é a roda que usamos para construir a barragem.") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "24 de Junho de 1957:Trapézio quebra. Alice Rutgers voa em direção ao chão, resultando em duas canelas fraturadas.") + } +, + two:{ + dialogue:new Array( + "17 de Julho de 1957:Sete palhaços se aposentam com problemas pulmonares quase fatais. Especialistas suspeitam da marca de maquiagens TERRAMAIS, mas nenhuma investigação formal está em andamento.") + } +, + three:{ + dialogue:new Array( + "21 de Julho de 1957:Seguinte ao mau funcionamento de uma jaula, meu rosto e laterais foram severamente desfigurados por um leão não treinado. Eu sobrevivi, mas agora temo o meu próprio reflexo.") + } +, + four:{ + dialogue:new Array( + "5 de Agosto de 1957:No meu sonho, vi um rosto de pedra com fortes, olhos brilhantes. Ele revelava a verdade da nossa existência e foi o primeiro a oferecer a liberdade da dor.") + } +, + five:{ + dialogue:new Array( + "7 de Agosto de 1957:Quantos de nós sofrerão antes de aceitarmos a verdade do Aquele que Vê?") + } +, + six:{ + dialogue:new Array( + "8 de Agosto de 1957:Cheguei a uma decisão. Alguns disseram que iriam me seguir. Essa é minha última anotação. Que o Aquele que Vê olhe favoravelmente para nós.") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(Rabiscos indecifráveis)") + } +, + two:{ + dialogue:new Array( + "7 de Dezembro de 2010.(Nome Ilegível). Não há nada aqui em cima, exceto essa pedra estúpida!") + } +, + three:{ + dialogue:new Array( + "Perigo! Essa caverna ainda não foi explorada.") + } +, + four:{ + dialogue:new Array( + "Esses penhascos se extendem para o alto e avante, se bem que eu nunca fui alto o suficiente para saber onde é que vai dar.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Pedra:Como?") + } +, + two:{ + dialogue:new Array( + "Pedra:Perigo! Queda vertical, pule por sua conta e risco.") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "Essa costumava ser a animação para o portão das cartas. Se aproxime dele mais de uma vez para ver as animações de abrir e fechar!", + "Eu esqueci porque ela foi removida. Talvez por ser dramática demais.") + } +, + two:{ + dialogue:new Array( + "Aqui estão testes para várias camadas de ladrilhos e colisões! Eu não consegui fazer ladrilhos de mão única para os dois lados(como paredes)", + "funcionarem bem e acabei removendo esse conceito do jogo... ou algo assim.", + "Há uma razão para não usá-los. Simplificar o design, o que foi muito importante para nós terminarmos o jogo.") + } +, + three:{ + dialogue:new Array( + "Inimigos costumavam deixar cair chaves. Essa idéia foi removida mesmo sendo bem divertida.", + "Outra ideia que tivemos foi a de existir portões de desafio, que", + "ficariam no final de uma arena e só abririam se você os alcançasse sem se ferir.", + "Queríamos modelar todos os calabouços a partir disso e remover o sistema de vida completamente, mas isso se provou muito difícil!") + } +, + four:{ + dialogue:new Array( + "PRISÃO!!!", + "NOS SALVE!!!", + "Por favor!") + } +, + five:{ + dialogue:new Array( + "Bem-vindo ao MUNDO DE TESTES! Você não está mais na Terra, então considere esse mundo(90 POR-CENTO)não canônico.", + "Antes de muitos conjuntos de ladrinhos estarem completos eu usei ladrilhos bobos como esses para marcar onde as portas deveriam ficar. De fato, todos os calabouços foram projetados com os ladrilhos desta área, e então Marina substituiu pelos seus.") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "- ARQUIVOS -", + "PROSSIGA COM CAUTELA") + } +, + four:{ + dialogue:new Array( + "Oeste. Fenda. Realidade! Baixos valores imobiliários, velho, acabado. Relaxante.") + } +, + three:{ + dialogue:new Array( + "Aquele que Vê pelo que me lem- brbrr,,,,,Momentos Relaxantes em Casa.") + } +, + two:{ + dialogue:new Array( + "CONGELADOR\n\n^ -- A GERÊNCIA") + } +, + one:{ + dialogue:new Array( + "CONTINUE") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "Oeste:Praia\n\nLeste:Floresta\n\nSudeste:\n Área Chuvosa\n\nNorte:\nÁrea do Templo\n\nNordeste:Abismo") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "Oeste:Lago\nSul, em seguida leste:Penhascos") + } +, + two:{ + dialogue:new Array( + "Lagoa do Relaxamento. Fique um pouco, sabemos que você tem tempo.") + } +, + three:{ + dialogue:new Array( + "Eu temo estar preso neste lugar para todo o sempre.") + } +, + four:{ + dialogue:new Array( + "Leste:Penhascos") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "O caminho se abrirá quando as peças dos guardiões sombrios forem substituídas pela sua cor espiritual na formação abaixo.") + } +, + two:{ + dialogue:new Array( + "Quando a pedra azul se locomoveu\nLá um novo caminho se revelou\nPassando dos penhascos, através de dimensões\nExiste um hotel para viajantes\n\n\n\"Quem é o guardião?\"Eu pergunto,\n\"Quem comanda esse abarrotado local de negócios ?\"\nApesar de todas as almas humanas\nEu ainda me sinto só.") + } +, + three:{ + dialogue:new Array( + "A vermelha e enferrujada estátua se moveu\nE abriu caminho para poços profundos\nUm labiríntico calabouço seguiu\nLogo após, uma grande tenda de circo\n\n\n\"Quem são os guardiões?\"Eu pergunto\n\"Quem deu a vida para salvar este local?\"\nEu temo a dor, assim como eles\nMas o que realmente temo, é a morte.") + } +, + four:{ + dialogue:new Array( + "A verde, metálica estátua se deslocou\nDando caminho a uma trilha profunda\nCasas suburbanas e calçadas se formam\nO caminho para um apartamento\n\n\n\"Quem é o guardião?\"Eu pergunto\n\"Quem procura conforto nas estrelas?\"\nSozinho, eu me sinto vigiado.\nNão pela amigável luz das estrelas.") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "Pedra:Este território não foi anexado, portanto ainda não é parte da Terra.") + } +, + two:{ + dialogue:new Array( + "Pedra:Esses -^ círculos são^ promessas... Eu irei^ concêntricos^ tentar completar tudo...^ Brrur, Brur...") + } +, + three:{ + dialogue:new Array( + "Pedra:Veja^ -...mas eu sempre^ - seus passos^ - acabam reaparecendo, não? ^ - quando aqui!") + } +, + four:{ + dialogue:new Array( + "Pedra:Olhando para baixo^ - E eu percebi^ - daqui, você- ^ Eu o amo.^ - consigo ver... nada.") + } +, + five:{ + dialogue:new Array( + "Pedra:Minhas desculpas - ^Sim, nós -^ nessa bagunça aqui -^ devemos manter contato -^ mas aquele portal deve ^ - e eu tentarei dar minhas opiniões para você -^ retornar você para A Terra.") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "Algumas pessoas terão coisas novas a dizer se você falar com elas várias vezes.", + "O mesmo não se aplica para pedras, pedras não curtem esse tipo de coisa.") + } +, + two:{ + dialogue:new Array( + "Pedra:Quase!") + } +, + three:{ + dialogue:new Array( + "Pedra:Curiosidade é algo ótimo.") + } +, + four:{ + dialogue:new Array( + "Pedra:Ah!...?") + } +, + five:{ + dialogue:new Array( + "O terminal do computador tem um e-mail aberto. Partes da tela estão quebradas, assim apenas partes da mensagem estão visíveis entre as manchas pretas\" Olá, Young! Parece que [...] quinquagésima carta [...] talvez você não deva [...] vale a pena considerar! Acha que está pronto? Acorde...\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "Pedra:Aposto que você está lendo uma pedra porque você não tem amigos.") + } +, + two:{ + dialogue:new Array( + "Pedra:Bem vindo a Estação do Sobresolo. Esperamos que tenha desfrutado do seu tempo na Terra.") + } +, + three:{ + dialogue:new Array( + "Pedra:Um explorador você é!", + "Pedra:Por favor não vá em direção ao sul. Está sob construção.") + } +, + four:{ + dialogue:new Array( + "Pedra:Tesouro em 5,3!") + } +, + five:{ + dialogue:new Array( + "Pedra:Haha, bobo!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "NÓS NASCEMOS DENTRO DAS RUÍNAS DO CORPO DE NOSSA MÃE.") + } +, + two:{ + dialogue:new Array( + "UM DIA NOSSA MÃE DEIXOU A MÃE DELA E SE AVENTUROU NO NEVOEIRO VENENOSO.") + } +, + three:{ + dialogue:new Array( + "NÓS NÃO QUERIAMOS ISSO. NÃO TERIAMOS COMPRADO NOSSAS VIDAS AS CUSTAS DO SOFRIMENTO DELA.") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "Pedra:Sinais indicam que as árvores não foram ativadas por um longo período de tempo.") + } +, + two:{ + dialogue:new Array( + "Pedra:Sul:???^ Norte:???") + } +, + three:{ + dialogue:new Array( + "Pedra:Dizem que o terreno irregular foi formado pelos ancestrais dos habitantes desta área.") + } +, + four:{ + dialogue:new Array( + "Pedra:Eles aparentam ser uma espécie pacífica.") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "Escrito em o que aparenta ser um marcador permanente:Saudações, colega viajante do ESPAÇO e TEMPO.^ Você se encontra em uma fenda distante da área justaposta de YOUNG.^ Você atravessou um OCEANO ou dois, por assim dizer.^ Não se preocupe com o CONTRASTE, você pode retornar a sua aventura rapidamente.^ Não TEMA esse local, apesar dele parecer AMEAÇADOR e PERIGOSO você irá ver que seus habitantes são bastante AMIGÁVEIS. \n -- A GERÊNCIA", + "(Abaixo da mensagem, uma escritura:)Aqui jaz(ilegível). Ele se perdeu na floresta.", + "(Ainda mais abaixo da mensagem:)(apenas não vá para tão longe ao sul)") + } +, + two:{ + dialogue:new Array( + "Aqui jaz(ilegível. Quem escreveu isso?). Ele foi impalado por um arco-íris!", + "Seria melhor com conquistas.") + } +, + three:{ + dialogue:new Array( + "Aqui jaz Burd. Os penhascos não estavam se sentindo muito amigáveis.") + } +, + four:{ + dialogue:new Array( + "Aqui jaz mochila. Nunca teve uma chance.", + "Pretensioso!") + } +, + five:{ + dialogue:new Array( + "Aqui jaz Savitch. Ele tentou consertar meu computador na garagem uma vez, e não tomou muito espaço enquanto o fazia. Três anos depois, ele ainda não tinha acabado. Então, ele caiu morto.") + } +, + six:{ + dialogue:new Array( + "Aqui jaz Dave. Ele não era muito inspirador.") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---MUNICÍPIO DE YOUNG---^\nBem vindo ao Município de Young. Por favor tome cuidado com alguns dos cidadãos.^ Eles não sabem brincar... tome cuidado. O Município de Young foi fundado nos anos 90 pelo prefeito Ying como parte de uma série de projetos habitacionais ainda em andamento, o nome foi escolhido levando em conta o fato de que Ying nega possuir o nome de Ying e que afirma possuir o nome Young.^ Esperamos que tenha uma ótima estadia.") + } +, + two:{ + dialogue:new Array( + "Ao Oeste se localizam os lendários templos do Aquele que Vê.^ No leste está a maravilhosa moradia do Prefeito Ying, que está fechada para visitas do público - invasores cuidado.") + } +, + three:{ + dialogue:new Array( + "Em sua quinta visita, Prefeito Ying se frustrou com a falta de estacionamentos. Esse estacionamento reflete a frustração do Prefeito Ying com a falta de estacionamentos. Ying ocasionalmente estacionava nesse estacionamento em suas visitas subsequentes.") + } +, + four:{ + dialogue:new Array( + "Eu lembro das longas frases que eu costumava escrever. Ha! Fragmentadas!") + } +, + five:{ + dialogue:new Array( + "UMA SITUAÇÃO PERIGOSA") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "Aquele que Vê sabe de tudo e conduzirá um para a iluminação. O caminho para a iluminação não é iluminado por tochas.") + } +, + two:{ + dialogue:new Array( + "Não se distancie do caminho do Aquele que Vê, nem mesmo pelos tesouros nos mais distantes cantos do labirinto.") + } +, + three:{ + dialogue:new Array( + "Mova-se.") + } +, + four:{ + dialogue:new Array( + "Não irrite os Procuradores com violência.") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "MARCO CÊNICO:Torres Parceiras. Construídas há algum tempo, as Torres Parceiras negligenciavam as montanhas distantes. A primeira torre foi danificada previamente e desde então foi reaproveitada. A segunda ainda está de pé ao leste, alcançando o céu. Devido a motivos de segurança, o caminho para a torre foi desativado até aviso prévio.") + } +, + two:{ + dialogue:new Array( + "AVISO DE SEGURANÇA PÚBLICA:^\nDizem que esta torre, enquanto não danificada, tem uma fenda dimensional no seu topo. Prossiga com cuidado e mente aberta.^\n -- A GERÊNCIA") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "A estátua não está com cara de que irá mover.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "Parece que a estátua está firme.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "Esta estátua não parece ser móvel.") + } +, + two:{ + dialogue:new Array( + "A estátua se moveu.") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "Fogo é algo belo, não é? Que pena que o brilho dos postes de rua escondam o fogo das estrelas.") + } +, + after_fight:{ + dialogue:new Array( + "Certo, as estrelas não são feitas de fogo. ^Quem se importa?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "Como vai você? Sou o governante dessa partição e Interpretação do espaço.", + "Você quer saber por que eu sou o governante deste local? Eu lhe direi, mas essa é uma longa história. Digo, realmente longa. Ofensivamente longa.", + "Vai demorar mesmo. Não estou brincando! Tenho tendência a tagarelar. Talvez seja melhor você ir atrás daquele baú alí. Ou ir em direção ao hotel lá longe. Não sei como ele chegou aqui, mas sei que eles cobram barato. Não que o dinheiro tenha algum valor aqui.", + "Por que eu sou o governante?^... Eu não tenho certeza, meus amigos que me colocaram nessa posição, devido ao estado imediato deste espaço. Talvez seja isso pois cubos são os melhores quando se trata de ficar parado em superfícies planas. Quanto ao porquê de alguém precisar ficar aqui - eu não faço ideia!", + "Os outros - meus amigos ali - tem seus próprios méritos.^ Não é como se eles não tivessem a capacidade de sentar aqui no futuro, eles apenas são incapazes no momento.^ De vez em quando, nós trocamos de governante, mas todas as vezes, temos de reinterpretar essa região do espaço! Talvez o Sr. ou a Sra. Pirâmide venham até aqui porque decidimos transformar o trono em um formato para melhor encaixá-los, re-imaginando esse mundo, por assim dizer.^ Isso soa meio estranho? Talvez. Mas é assim que as coisas são. Tudo acontece muito rápido. Minutos, horas - náo é necessariamente um longo reinado.", + "Apesar de que, quando eu sou o governante, eu me sinto estranho...^ De alguma forma me sinto isolado, querendo se afastar dos outros...", + "...isolado não é palavra que quero, mas ela cobra parte do sentimento. Eu não estou isolado, e eu não desgosto dos outros. Nós nos consideramos amigos, mas você sabe, ninguém passa por aqui a não ser para falar algumas palavras. Assim eu tenho que pensar sobre alguma coisa ou enlouqueço! Talvez seja por causa do isolamento.", + "Fora as questões fúteis do porque estamos ocupando esse espaço, estou curioso com o porquê de sermos amigos.", + "Eu gosto de pensar que sempre que estamos de acordo com as Interpretações de que sou o melhor para governar, eles me dão conforto em ter a capacidade de manter essa posição pelo tempo que for necessário para atingir a próxima Interpretação. Sabe, encorajamento e coisas do tipo, a presença física deles, essas coisas me confortam.", + "Suponho que isso é o suficiente para me satisfazer, apesar de que seria legal se um ou dois deles entendessem como me sinto como governante. Não que eu esteja reclamando sobre o encorajamento! Talvez um dia, nós possamos ter vários governantes...quem dera! Talvez isso implique que quando eu não sou o governante, devo agir da mesma maneira que às vezes gostaria que agissem...quem sabe se isso pode ser feito.", + "Já falei demais. Se você for na outra direção, encontrará outra região similar do espaço, apesar de eu achar que ela cheire um pouco diferente.", + "Foi um prazer lhe conhecer.", + "Ah, quer ouvir minha história mais uma vez?", + "Tudo bem, vamos lá.") + } +, + gray:{ + dialogue:new Array( + "Olá. Eu sou o governante dessa parte do espaço.", + "O que? Quer saber por que eu estou aqui? Tem certeza? Vou precisar de muitas palavras para explicar!", + "Bem, se você insiste. Embora você se sairia melhor indo para aquele hotel lá longe. Não sei por que o construíram. Se eu tivesse algum dinheiro para ser taxado, certamente reclamaria!", + "Bem, mesmo eu sendo o governante dessa parte do espaço, eu não governo ninguém.", + "Esses meus amigos - todos são governantes de suas próprias partes do espaço. Ninguém governa ninguém, estamos todos sós nesse aspecto. Mas não estamos sós quando se trata de falar uns com os outros, e em outras formas também não estamos sozinhos. Esse é apenas um lugar em que eu existo.", + "Meus amigos e eu - nossas partes do espaço tem muito em comum quando se trata da razão delas existirem e como estão organizadas. Interesses e desejos similares. Nós gostamos de conversar sobre como governar, e coisas do gênero.", + "Mas o trágico é que raramente nós encontramos em forma física.", + "Você não está falando com suas formas físicas, mas com suas representações em forma holográfica.", + "Eu sei, é lamentável. É lamentável porque nós temos tanto em comum, mas estamos limitados em como podemos nos ajudar como amigos.", + "Algo bem pequeno falta quando você não tem conversas físicas frente a frente o tempo todo.", + "Mas eu não estou reclamando. É melhor do que nada! Não consigo imaginar como seria sem isso. Algo terrível.", + "Foi agradável falar com você, boa sorte com o que você estiver fazendo.", + "Você ainda está aqui? Eu posso te contar tudo outra vez, se você quiser.") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "Crickson:Ei valentão! Não tenho medo de você!", + "Crickson:Ei cabeção! Não vou fugir! Nem mesmo se você tentar me bater!", + "Crickson:Você é só um vassoureiro, é isso que você é! Você devia ter vergonha nessa cara!") + } +, + thorax:{ + dialogue:new Array( + "Tórax:Eu sou o tórax, eu falo em nome das abelhas.\n^Seu destino é incerto, não faz parte do conhecimento delas.\n^Trabalhadores de certas colônias decolaram!\n^Com isso tais colônias estão morrendo, não é bonito de se ver!", + "Tórax:Talvez seja um vírus ou um novo pesticida,\n^talvez sejam as larvas das malditas moscas Phoridae!\n^As abelhas estão agindo de forma estranha.\n^O que quer que seja, tem que mudar!", + "Tórax:Certo, eu não sei o que está acontecendo\n^Temo que meus esforços sirvam para nada além de tagarelar.\n^Mas como eu posso ficar aqui sentado e não fazer nada para ajudar?\n^Já sei - irei postar no Facebook, Twitter e Yelp!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Compre meus produtos!") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade!", + "Não irei largar! Nem em um milhão de anos!") + } +, + inside:{ + dialogue:new Array( + "Ah, veio aqui pra me aterrorizar mais um pouco?", + "Você está se aliando aos gatos só porque eles são macios e fofinhos.") + } +, + etc:{ + dialogue:new Array( + "O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade!^ AAAAAA!^ Isso aí--^ OUTRO GATO?!?!^ AAAAAAAAHH!!!", + "Você... você limpou minha casa... Estou emocionado! Aqui, quero lhe dar a minha mais bela posse!", + "Young abre o baú. Algo se encontra dentro dele!", + "Icky:Ah, Ei Miao.^\n\nMiao:Ainda bem que você está a salvo!^\n\nIcky:Ah... obrigado pela ajuda, Young.", + "Icky:Pra ser honesto, eu meio que gosto de sentar em caixas.") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "Ah!! Você é Young, O Escolhido!! Aimeudeus, que honra! Meu nome é Miao Xiao Tuan Er, Escolhido-em-treinamento!", + "Posso acompanhá-lo por um tempo para observar O Escolhido em ação?", + "Olá mais uma vez, Young! Posso ser sua sombra hoje?") + } +, + randoms:{ + dialogue:new Array( + "Miao:Ei, Young... você já roubou algo?", + "Miao:Eu gosto da Mitra... e Wares não é uma bicicleta elegante?", + "Miao:O que é essa coisa feita de pedra, Young? Ela faz você voltar no tempo?", + "Miao:Estou começando a ficar preocupado com Icky... Young, você viu um gato bem grande recentemente? Icky disse que ia fazer uma caminhada pela pequena floresta ao leste.", + "Miao:Icky disse que eu não deveria ir para lugares perigosos. Vejo você depois, Young.", + "Miao:Você já sentou em uma pilha de sacolas de supermercados?", + "Miao:Ei Young, você acha que é errado usar erva-de-gato?", + "Miao:Aposto que deve ter dado muito trabalho se tornar O Escolhido, né, Young?") + } +, + philosophy:{ + dialogue:new Array( + "Aquela situação perigosa com o Icky me fez pensar... O que você acha que acontece depois que morremos? Como alguém consegue atingir um propósito em apenas uma vida?", + "Talvez reencarnemos várias vezes até completar nosso destino. Ou isso deixaria tudo fácil demais?", + "E qual é a recompensa por completar nossa jornada? Nós apenas se dissolvemos no nada?", + "Hmm...") + } +, + icky:{ + dialogue:new Array( + "Ah. Oi, Young.", + "Meu nome real não é Icky. É Ichabod.", + "Espero que Miao Xiao Tuan Er não tenha se metido em muitos problemas.", + "Até logo, Young.") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "E aí firmeza, como vai você? Você me achou! Eu vou continuar aqui, de qualquer forma. Está frio lá fora.", + "Você pode me culpar por todas essas terríveis salas! Eu as fiz com o editor de mapas DAME.", + "Eu criei esse jogo com a IDE FlashDevelop e com o framework Flixel AS3!", + "Ah, é, e eu fiz a trilha sonora com o REAPER. E algumas vezes Audacity.", + "Eu consigo meus nutrientes através da radiação de todos esses computadores... ^Como assim isso não é biologicamente correto?", + "Oi mãe! ^E pai!", + "Quer saber como finalizar o jogo em 20 minutos?", + "Ha! Como se eu fosse contar pra você!", + "(...talvez se você pedir gentilmente...)") + } +, + marina:{ + dialogue:new Array( + "Uau ei!", + "Eu escrevi um monte de diálogos para esse jogo!^(...mas não esse. Melos está fazendo isso.)", + "Eu usei Adobe Photoshop CS5, Graphics Gale Free Edition e a Ferramenta de Captura do Windows 7 para fazer os gráficos!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "A umidade aqui é boa para sua pele, mas ruim para seu cabelo.", + "Eu gosto daqui. Ultimamente, as pessoas passam todo o verão indo do calor infernal para o frio do ar condicionado. Essas mudanças rápidas de temperatura enfranquecem seus ossos.", + "É como aquele maldito hábito de mastigar cubos de gelo. Minha mãe fazia isso lá pros 25 anos. Agora ela tem fissuras por todos os seus molares.") + } +, + second:{ + dialogue:new Array( + "Lembre de trocar de sapatos e enchê-los de jornais para os deixar secos. Você não quer criar um terreno fértil pra bactérias, não é?", + "Por que buffets só servem gelatina vermelha? É como se eles quisessem nos dar câncer.") + } +, + bomb:{ + dialogue:new Array( + "Sai de perto.", + "Falo sério... me deixe em paz.") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "Não preciso da sua piedade, Young.", + "Certo, vá viver no seu mundinho feliz, \"Escolhido\"...", + "Young, amizade é só um truque que as pessoas aplicam em si. Somos todos babacas, e no fim, estamos todos sós.", + "Hah, eu sabia que você me odiava, Young.", + "Eu estou bem.", + "É claro que você não se importa. Ninguém se importa.") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "Eu sei que cidades podem ser sujas, lotadas e tudo mais, mas eu gosto de vir aqui e olhar todas as luzes.", + "É belo de uma forma única. Não é infinito como as estrelas, mas existe algo sobre sua humanidade que adiciona uma camada maravilhosa de complexidade.", + "Atrás de cada luz se encontra uma pessoa com esperanças, medos e segredos... olhando dessa forma é terrivelmente solitário e ferozmente pessoal.", + "Eu acho que amo todas as pessoas por atrás de cada janela. Eu amo vocês, pessoas, por serem minhas estrelas. Eu amo vocês não importando o quão fudida sua vida é ou o quanto vocês acham que caíram. Vocês são amáveis nesta noite...", + "Desculpe, falei demais. Obrigado por escutar.") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "Eiiiii, parceiiiirooo...descanse um pouco, fique por um tempo, que tal?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "Ah! Você me achou!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "Golem:Você foi atingido por um pedregulho na subida? As vezes eu arremesso pedregulhos quando estou com raiva. Me desculpe se foi atacado por algum.", + "Golem:Minha mãe sempre dizia que se eu continuar com isso, um dia eu não teria mais montanhas para arremessar.") + } +, + second:{ + dialogue:new Array( + "Golem:Quando você é uma pedra, você presencia geraçôes de pessoas indo e vindo. Você se torna mais ancião e sábio que o mais sagaz dos humanos.", + "Golem:Pelo menos, essa é a ideia. Eu quebrei meus binóculos um tempo atrás e assim eu não sei mais dizer o que tem ocorrido.", + "Golem:De fato, eu não sinto falta de assistir as pessoas, é muito entediante.") + } +, + quest_event:{ + dialogue:new Array( + "Golem:Ah, sim, eu conheci alguém que estava meio perdido...ele me contou que estava indo para a praia.") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "Não sou uma lagosta, sou um langostino. Meu nome é Hews.", + "Hews:Sabe qual é a melhor parte do oceano? O horizonte.", + "Hews:O oceano é como um pedaço salgado do universo.", + "Hews:Um praia lotada é desprovida de sua graça.") + } +, + second:{ + dialogue:new Array( + "Hews:Já ouviu falar do Estomatópode? Ele possuí 16 fotorreceptores que o permite perceber luz ultravioleta. Você consegue imaginar ver uma grande variedade de cores?", + "Hews:Talvez seja belo. Enfim, nós já achamos razões demais para nos odiar com as cores que temos.") + } +, + quest_event:{ + dialogue:new Array( + "Hews:Está procurando por alguém, é? Lembro que estava sentado aqui quando algumas nuvens taparam o sol. Nesse momento, alguém veio me perguntar sobre algo. não lembro o que era, mas foi embora dizendo que iria em direção a floresta.") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "James:Frutas são um bom tipo de comida. Eu gosto de frutas.", + "James:Por favor, certifique-se de não defecar nas frutas.", + "James:Até agora nessa estação do ano eu tive relações sexuais 18 vezes. E também, eu comi 389 porções de frutas.", + "James:Você tem alguma fruta para James?") + } +, + second:{ + dialogue:new Array( + "James:Eu escrevi um poesia:\n^Eu gosto de comer frutas\n^Elas me deixam batuta\n^Eu gosto muito de frutas\n^Até mais do que trutas!", + "James:Você prefere framboesas ou mirtilos?", + "James:Você tem alguma fruta para James?") + } +, + quest_event:{ + dialogue:new Array( + "James:Uma pessoa passou por aqui. Não queria frutas. Ela foi em direção a parte sudeste do lago a oeste.") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "Olivia:Olá, eu sou Olívia a coelha.", + "Olivia:Eu tenho um monte de cereal para comer ainda! Eu amo cereal.", + "Olivia:Essa caixa é tão grande. Ela nunca acaba!", + "Olivia:Cereal infinito!", + "Olivia:Hmmm...talvez isso não seja algo ruim.") + } +, + bush:{ + dialogue:new Array( + "Rank:Hahaha, Young seu bobo. Uma vassoura não serve para cortar arbustos!") + } +, + quest_normal:{ + dialogue:new Array( + "Rank:Eu corto arbustos para me manter. As vezes quando você corta um arbusto e encontra ouro! Ahaha!", + "Rank:A economia não vai muito bem debaixo deste arbusto aqui.", + "Rank:As vezes é díficil manter minha mulher e filhos apenas cortando arbustos--nem sempre temos o suficiente para comer... mas sempre temos uma lareira acesa! Ahaha!") + } +, + quest_event:{ + dialogue:new Array( + "Rank:Ah? Sim! Uma pessoa passou por aqui. Disse que estava indo para o labirinto subterrâneo...Aposto que lá tem uma vários arbustos, né, Young? Ahaha!") + } +, + marvin:{ + dialogue:new Array( + "Marvin:Ah ei, como está se sentindo?", + "Marvin:Onde está Justin?", + "Marvin:Não tem nenhum foguete de garrafa por aqui...") + } +, + chikapu:{ + dialogue:new Array( + "Chika Chi!", + "Chika Chika!!", + "CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!!") + } +, + hamster:{ + dialogue:new Array( + "Bob:Bob o Hamster gosta de falar de si mesmo na terceira pessoa.", + "Bob:Apóstrofos são artimanhas do s'atanás.", + "Bob:Quieto! Estou ocupado exalando uma aura de ambiência hamstérica.", + "Bob:... Supunho que você só melhora fazendo... Mas... se você faz algo errado, você se torna melhor a fazer esse erro?", + "Bob:Um homem de verdade nunca chora... bem, talvez ele deixe uma única lágrima cair do canto de seus olhos através da sua face enrijecida pelo sol enquanto ele dirige sua estilosa Harley através do deserto de Mohave sem usar capacete ou óculos protetor. Mas ele nunca chora.", + "Bob:Esse jogo foi criado por um número infinito de macacos trabalhando em um número infinito de máquinas de escrever.", + "Bob:Sinto falta do James...") + } +, + electric:{ + dialogue:new Array( + "Kuribu:Curry é amarelo e apimentado!", + "Kuribu:Para o oponente sagaz, ferimento aumenta!", + "Kuribu:Você recebeu a experiência de 2!", + "Kuribu:Tome meu número de telefone! 0800 meiamolemeiadura") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "O QUE eu estou fazendo aqui? Boa pergunta! Encontrei esse lugar por acaso. Estou me escondendo. Aqui é seguro, se você não se aventurar tão longe e deixar esses caras te encontrarem.", + "Parece que sou relativamente afortunado. Todos esses mortos espalhados pelo chão - como eles morreram? É um pouco fascinante, tentar imaginar como tudo ocorreu. Foram atacados por monstros? Tropeçaram e caíram nos espinhos?", + "É um pouco medonho. Espero que isso não aconteça comigo. Dor física é algo térrível para se ter.") + } +, + quest_event:{ + dialogue:new Array( + "Ah... pensando nisso, uma pessoa passou por aqui um tempo atrás. Disse que estava procurando por algo...até parecia um pouco com você! Não lembro quando, desculpe. É díficil manter noção do tempo aqui. Mas lembro que ela estava indo para uma cidade próxima.") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "Olá.", + "Está procurando por algo?", + "O que é que você está olhando?", + "Não, não sou dessa cidade. Estranho, você pode me ver e falar comigo, mas eu não consigo Interagir com nenhum deles. Tem um monte de assassinos por aí, e ninguém parece notar. Isso é estranho.") + } +, + quest_event:{ + dialogue:new Array( + "Sim. Eu vi uma pessoa passar por aqui. Ela estava a procura de algo. Não sei o que esse 'algo' possa ser. Foi embora depressa. Disse que estava indo em direção a uma área alternativa do espaço. Me soou extravagante.") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "EI EI EI - - - QUEM É VOCÊ ? ? ?", + "EU SOU UM VAGANTE . . . ESSA É UMA DAS PARADAS MAIS POPULARES NA JORNADA ENTRE B E A .", + "O QUE É 'A' ? ? ? É MINHA CIDADE NATAL . . . ESTOU VISITANDO UM VELHO AMIGO EM B . . . É UM LONGO CAMINHO . . . MAS EU FAÇO SACRIFÍCIOS . . . VOCÊ NÃO ? ? ? DEIXA A VIDA MAIS ANIMADA ! ! !") + } +, + quest_event:{ + dialogue:new Array( + "AHH - - - PROCURANDO POR OUTRO HUMANO - - - ENTENDO . ^ DEIXE-ME ACESSAR MINHA MEMÓRIA . . . READ(0X0C00400 , STDOUT , 100);\n . . . . . . \n . . . . . . \n A HA . . . \n A PESSOA TEVE UMA IDÉIA SUBITA E DISSE QUE IRIA PARA UMA CABANA EM UM CAMPO BEM CUIDADO. \n PENSANDO NISSO . . . VOCÊ É IDÊNTICO A ESSA PESSOA ! ! ! TEM CERTEZA QUE NÃO ERA VOCÊ ? ? AHN ? MM ?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "Você estava... ah, um. Bom trabalho.", + "A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha que sair de novo(Estava ficando muito claro aqui, isso sempre acontece)- a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\"") + } +, + quest_event:{ + dialogue:new Array( + "A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha de sair de novo(Estava ficando muito claro aqui, isso sempre acontece)- a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "OLÁ. JÁ ENCONTROU O cubo?", + "cubo É UM ÓTIMO GOVERNANTE DESSA PORÇÃO DO ESPAÇO. NÓS OUTROS GOVERNANTES DAMOS NOSSO MELHOR EM NOSSO ESPAÇO TAMBÉM.") + } +, + gray2:{ + dialogue:new Array( + "O QUE VOCÊ ACHA DESSE PEDAÇO DE ESPAÇO? É UM ÓTIMO LUGAR, NÃO É?", + "UMA INTERCESSÃO DE MUNDOS!") + } +, + gray3:{ + dialogue:new Array( + "NENHUM DE NÓS PIRÂMIDES CINZAS ESTAMOS DE FATO AQUI. USAMOS APARELHOS ESPECIAIS QUE NOS PERMITEM NOS PROJETAR AQUI.", + "POR QUE FAZEMOS ISSO? PORQUE QUEREMOS FALAR COM NOSSO AMIGO cubo E FAZÊ-LO COMPANIA.") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "...O APARELHO DE HOLOGRAMA ESTÁ FUNCIONANDO CORRETAMENTE?", + "NÃO?^...^DROGA!") + } +, + color1:{ + dialogue:new Array( + "Já conheceu o CUBO? Ele faz muitas coisas maneiras! Ouvi dizer que uma vez ele ficou na beirada por quase doze segundos! Sabe o que isso significa para a Liga da Beirada? Não? Muito!") + } +, + color2:{ + dialogue:new Array( + "Cubo faz coisas Interessantes!", + "Você sabia? Aparentemente, minha vez de governar está próxima! Faltam apenas alguns minutos, acredito.") + } +, + color3:{ + dialogue:new Array( + "Eu venho do Pão de Açúcar, em direção a Taipei. Por que estou aqui? Eu parei para cumprimentar o CUBO!", + "Não fique triste! Esse lugar é uma representação estranha apenas para não amedrontar os visitantes. É praticamente inofensivo, até onde sabemos.") + } +, + colordead:{ + dialogue:new Array( + "(...está tirando um cochilo?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "CADA GERAÇÃO NASCE DA DOR PARA MORRER EM DOR. NÃO IREMOS SOFRER PARA REPRODUZIR O CICLO. NÓS NÃO IREMOS PARA FORA.") + } +, + after_fight:{ + dialogue:new Array( + "ESTE É O SEU CASTIGO POR NOSSA REBELIÃO?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "Porque você priva o Aquele que Vê de seus sacrifícios? Por que você roubou de nós nossa salvação?") + } +, + after_fight:{ + dialogue:new Array( + "...Nós falhamos em fazer você pagar por sua Interferência. E ainda assim... você nos devolveu a chance de ser livres. Obrigado, Young. Que o Aquele que Vê olhe positivamente para você mais uma vez.") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "Muito bom te ver, Yang. Faz tanto tempo. Ainda jogando esses nantendo, não é?") + } +, + after_fight:{ + dialogue:new Array( + "Meu Deus, Yon, quando é que você vai crescer? Você sabe que terá que aprender a lidar com pessoas mais cedo ou mais tarde.") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "Nós temos as melhores amenidades aqui. O que acha da nossa piscina?") + } +, + middle_fight:{ + dialogue:new Array( + "O que me diz do nosso centro de fitness com tecnologia de ponta?") + } +, + after_fight:{ + dialogue:new Array( + "Esperamos que tenha desfrutado de sua estadia!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "Hoje é um bom dia.", + "Obrigado por coçar meu pescoço - Eu não estava conseguindo alcançar.", + "Ouvi dizer que os ovos do restaurante local são muito bons. E ainda por cima tenho cupons para eles.", + "Viu o acidente de carro de hoje? Horrível! Ele estava usando celular. Que pena, era tão jovem!", + "Meu filho não conseguiu entrar para o time júnior do colégo. Decepcionante. Nós investimos tanto em sua carreira esportiva.", + "Hoje é o dia de ação de graças. Sou grato por muitas coisas. Mal posso esperar para as promoções de amanhã cedo. Vou conseguir um monte de barganhas.", + "Ah, acho que chegarei atrasado no trabalho.", + "Estou apressado para chegar em casa, preciso arrumar tudo antes dos sogros chegarem.", + "Estamos tendo uma venda de garagem!", + "Bem vindo!") + } +, + words_teen:{ + dialogue:new Array( + "Eu não vi o filme mais recente.") + } +, + words_kid:{ + dialogue:new Array( + "Nunca terei a chance de ver o novo desenho animado!") + } +, + family:{ + dialogue:new Array( + "Bem vindo a nossa casa, estranho! Você me parece familiar. Esta é uma cidade pacata. Bem quieta, sem muitos visitantes.", + "Você curte Davement? Meu irmão Dave me mostrou uma música deles muito maneira!") + } +, + older_kid:{ + dialogue:new Array( + "Meus amigos gostam de ouvir 'None Surprises' daquela banda chamada 'Rayhead' e reclamar sobre este local. Tudo bem, é uma espécie de bolha, mas pelo menos mostrem alguém respeito!", + "Acho que vou escrever para meu blog.", + "Você parece estar confuso.", + "Eu tenho problemas para ouvir meus pensamentos quando esportes e coisas do tipo estão passando na TV, mas meus pais gostam disso.") + } +, + hanged:{ + dialogue:new Array( + "Uma anotação no corpo:\"Colocando-me em perigo não mais.\"") + } +, + festive:{ + dialogue:new Array( + "Ah, tem algo acontecendo lá fora? Um festival? Um desfile?", + "Parece que há uma baita comoção lá fora! Já olhou na janela recentemente? O que será que é?") + } +, + paranoid:{ + dialogue:new Array( + "Minha casa tem muitas janelas. Eu não gosto de janelas. É como se alguém estivesse olhando para dentro. E no fundo você sabe que TEM algo acontecendo lá fora. não pode ser apenas silêncio o tempo todo. É pertubador.", + "Assassinos? O que? Lá fora? Você tá de brincadeira?", + "Por favor saia daqui.") + } +, + dead:{ + dialogue:new Array( + "O corpo desta mulher foi atacado por uma arma de ponta cega.", + "O homem, cegamente, bem...") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "Ah, é você! Você me parece familiar...Eu não posso me mover até você matar mais desses habitantes da cidade, lembra? Volte aqui mais tarde.", + "De acordo com esse panfleto...você só tem que matar mais um pouco de pessoas! Continue assim!", + "Só precisamos de mais um corpo, e depois continuamos.", + "Muito bem. Sinta-se livre para entrar. Não faço idéia do que tem lá dentro. Nos vemos depois, mesma hora amanhã, certo? Ou na noite seguinte?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "Não me importo em ser observado pelas árvores.", + "Cadê ela?!", + "Eu estarei com você Young, sempre que estiver sozinho.", + "Você é um Ookchot? Mamãe sempre me avisou para ter cuidado com os perigosos Ookchot.", + "Jello falando, Young! Muito bom finalmente poder lhe conhecer! Por que não fica aqui uns minutos? Eu estou acabando de preparar chá.", + "Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Coro, Púlpito, Altar, Janelas de Vidro Tingido...", + "Oferta por tempo limitado! Compre um, leve dois - apenas hoje!", + "Lembra daquela vez que você acendeu uma vela quando a energia estava falhando?", + "Hmmmm, seu travesseiro estava confortável noite passada.", + "Isso vai lhes mostrar que não devem me chamar do cara da fumi-GAY-ção.", + "Wares e Eu fazemos uma boa equipe.", + "Eu sou o Escolhido-em-treinamento!", + "Você já teve a sensação, de que não importa o que você faça, você não consegue impedir o mundo de morrer?", + "Cuidado com os cogumelos florestais...", + "Me desculpe. Essa é minha natureza.", + "O que você quer dizer com \"só uma pedra\"?? Pedras podem ser cartas também!", + "Dê um peixe para um homem e ele terá comida por um dia. Ensine um homem a pescar, e ele terá bons momentos com seu filho, Jimmy.", + "As vezes a resposta é fazer uma caminhada.", + "Porque morcegos aparecem do nada, sempre quando você chega?", + "NÃO, *VOCÊ* QUE PRECISA DE APARELHO!", + "ESTÁ SATISFEITO?", + "Não venha com violência pra cima de mim.", + "Sempre quis participar do Iron Chef.", + "Minha mãe vivia dizendo, 'Se você fizer esse arco por tempo suficiente, sua coluna ficará assim!'", + "Está entretido, humano?", + "...", + "Existem cerca de 4.800 espécies de sapos.", + "HAHAHAHA! É! Eu sei!", + "Ah, você coleciona cartas também? Que crescido, Ying.", + "Todos vivem dizendo, \"Saia do computador! Ou você nunca vai fazer amigos!\"", + "Eu sou o governante apenas pela duração dessa conversa.", + "Aposto que você acha que está 'tornando meu trabalho mais Interessante'!", + "Odeio diagonais.", + "Nem pensei usar essa droga de claritin perto de mim.", + "Raspe essa carta para destravar a porta para seu quarto!", + "Estou fazendo um ótimo trbalho.", + ".......??", + "Quem foi que nos esculpiu mesmo?", + "Espero que tenha desfrutado de sua estadia.", + "Para você chegar a esse ponto, você deve ser muito Interessante.", + "Só estou aqui para lhe tirar do caminho.", + "Você é como uma pirâmide para nós, também!", + "É a mesma maldita peça, noite após noite, e o salário é uma droga.", + "Me deixe em paz! Meu nome não é Sachs!", + "Pelo menos eu não sou um bastão.", + "Como assim dinheiro não nasce em árvores? Ahahahah!", + "Eu não passo de uma ilusão.", + "EU VOU DESCONTAR TUDO EM VOCÊ.") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "Pressione", + "para configurar\nos controles.", + "para cancelar.", + "Cima", + "Baixo", + "Esquerda", + "Direita", + "Pulo", + "Ataque", + "Menu", + "Pressione", + "para sair", + "para configurar os controles.") + } +, + title:{ + dialogue:new Array( + "Por favor use as setas\npara redimensionar a\njanela até que não\nseja possível visualizar\náreas pretas ao redor\ndas bordas. Pressione\n", + "para finalizar.", + "ANODYNE", + "Melos Han-Tani\nMarina Kittaka", + "any key", + "Pressione", + "para iniciar", + "Versão", + "Continuar", + "Novo Jogo", + "Tem certeza?\nNão\nSim", + "Mesmo?\nNão\nSim", + "Não vai ter volta!\nEsqueça\nEu sei", + "mortes", + "cartas", + "Anodyne suporta\na maioria dos controles.\n\nDeseja usar um?\n\nSim Não\n\nSe sim, conecte-o agora.\n\nMova com as setas\n\nEscolha com\nC, ESPAÇO, ou ENTER\n\nEscolhendo \"sim\" em\n", + "AVISO\n\nSe estiver sofrendo atraso dos comandos durante o jogo,\nfeche e\nabra Anodyne novamente.\n\nPRESSIONE C PARA CONTINUAR", + "Pressione VOLTAR para sair.") + } +, + elevator:{ + dialogue:new Array( + "Andar?", + "1\n", + "2\n", + "3\n", + "4\n", + "Cancelar") + } +, + gui:{ + dialogue:new Array( + "menu=enter", + "Salvando...") + } +, + map:{ + dialogue:new Array( + "Mapa", + "Sala Atual", + "Entrada/Saída", + "Sem Mapa", + "Voltar para\no Nexus", + "Voltar para\na entrada") + } +, + items:{ + dialogue:new Array( + "Itens", + "Normal", + "Troca", + "Extensão", + "Ampliação", + "Um par de sapatos com mola - pressione", + "para pular!", + "Um par de sapatos de ciclismo.", + "Uma caixa de papelão vazia.", + "Uma chave encontrada no Templo do Aquele que Vê.", + "Uma chave encontrada numa caverna subterrânea vermelha.", + "Uma chave encontrada numa caverna nas montanhas.") + } +, + cards:{ + dialogue:new Array( + "Cartas", + "cartas") + } +, + save:{ + dialogue:new Array( + "Salvar", + "Salvo!", + "ERRO", + "Salvar e ir\npara a título", + "Ir para título", + "Salvar e sair", + "Sair do jogo", + "Mortes:") + } +, + config:{ + dialogue:new Array( + "Config", + "Definir control", + "Definir volume", + "Salvar em\ncheckpoints:", + "Ligado", + "Desligado", + "Mudar Resolução:", + "Configurar UI", + "Touch + D-Pad", + "Somente D-Pad", + "Apenas Touch", + "Tipo de Movimento", + "Resolução:", + "Janela", + "Multiplicado", + "Esticado", + "Escala:", + "Idioma:", + "ja", + "en", + "ko", + "arraste os\nbotões\naté estar\n satisfeito.\n\nDepois, toque\no menu\npara continuar.\n\n", + "Redimensionar\nJanela", + "Configurar controle") + } +, + secrets:{ + dialogue:new Array( + "Você está mandando brasa!", + "Antiga propriedade do Mago das Bolhas.", + "Se os gráficos ficarem estranhos, procure pela descrição oficial do Pakidex sobre algum Pakimon.", + "esse coração não tem nome", + "Por favor visite o mundo dos monstros eletrônicos.", + "Uma estátua de um gato. Fofo, mas inútil.", + "Aí meu deus!!!!", + "Ah não!!!", + "É preto.", + "É vermelho.", + "É verde.", + "É azul.", + "É branco.", + ":Selecionar", + ":Voltar") + } +, + swap:{ + dialogue:new Array( + "Desculpe!", + "A troca não funciona aqui.", + "Young não tem forças para usar a troca aqui.") + } +, + keyblock:{ + dialogue:new Array( + "Esta porta está trancada.") + } +, + treasure:{ + dialogue:new Array( + "Alguma força estranha impede que este baú se abra.", + "No cabo da vassoura está escrito:Pressione\"", + "para varrer.\"", + "Essa chave pode ser usada uma única vez para abrir uma barreira trancada.", + "Um misterioso par de sapatos, nele está escrito uma única coisa\"Pressione", + "\".", + "As poucas palavras gravadas nesse artefato dizem:\"Equipe o acessório de AMPLIAÇÃO para fazer com que a vassoura solte poeira nociva para a esquerda e direita.\"", + "As poucas palavras gravadas nesse artefato dizem:\"Equipe o acessório de EXTENÇÃO para fazer com que a vassoura solte poeira nociva para frente.\"", + "As poucas palavras gravadas nesse artefato dizem:\"Olá, Young. Use esse aparelho de TROCA em dois objetos para trocá-los de posição. Ainda está longe do seu alcance poder usar isto em qualquer lugar, mas por hora irá lhe servir bem.\"", + "VOCÊ ACHOU UM CORAÇÃO!!! Saúde aumentou em...zero.", + "Ourudo:O que? Não está aqui? Aquele vendedor deve ter roubado!") + } +, + dust:{ + dialogue:new Array( + "Sua vassoura está cheia de poeira! Ataque novamente para colocá-la.") + } +, + checkpoint:{ + dialogue:new Array( + "Salvar jogo?\n Sim\n Não", + "Quando estiver em um checkpoint, pressione", + "para salvar e marcá-lo como ponto para continuar caso você morra.") + } +, + rock:{ + dialogue:new Array( + "Há algo escrito nesta pedra:", + "CÊ NÃO TEM AMIGOS") + } +, + door:{ + dialogue:new Array( + "O portal não parece estar ativo.") + } +, + keyblockgate:{ + dialogue:new Array( + "O portão permanece, imóvel. Ele não irá abrir até sentir quatro cartas...", + "Sentindo a presença de quatro cartas, o portão decide abrir...", + "O portão permanece teimosamente no lugar.", + "O portão sente a presença de todas as cartas, e decide abrir.", + "O portão sente a presença de um número suficiente de cartas, e decide abrir.", + "Abriu!", + "Permanece fechado.") + } +, + solidsprite:{ + dialogue:new Array( + "A placa aponta para o leste mas as palavras estão muito desbotadas.", + "A placa aponta para o oeste mas as palavras estão muito desbotadas.", + "A as palavras desta placa estão muito desbotadas.") + } +, + mitra:{ + dialogue:new Array( + "Ei, young!", + "Esses sapatos de ciclismo são para mim? Poxa! Obrigado, Young! Eu estava querendo um desses para usar com o Wares. Aqui, Young, tome meus sapatos em troca. Eles tem molas que permitem você pular bem alto! Você pressiona", + "para pular com eles!", + "Oi Young! Notou algo de diferente? ^... ^... Ah, bem, eu comprei um novo par de sapatos de ciclismo! Eles encaixam perfeitamente nos pedáis do Wares. Já que não vou mais precisar dos meus sapatos antigos, quero que você os tenha, Young! Eles tem molas que permitem você pular bem alto! Você pressiona", + "para pular com eles!", + "Enfim, tome cuidado!", + "Vá em frente, experimente-os! ...Eles não fedem TANTO assim.", + "Maneiros, né?", + "Uau, esses são os sapatos de ciclismo da loja do Finty? Você está dando eles para mim? Obrigada, Young, de verdade! Aqui, tome meus sapatos antigos--Acho que eles serão bem úteis para você. Há uma inscrição neles que diz:\"Pressione", + "para pular\". Nunca entendi o significado, porque não há um\"", + "\" em lugar nenhum neles...") + } +, + tradenpc:{ + dialogue:new Array( + "Finty:Bem vindo, bem vindo, meu amigo Young! Meu nome é Prasandhoff--Finty Prasandhoff! Dê uma olhada pela minha loja e veja se algo lhe Interessa.", + "Finty:Eu ainda aprecio essa caixa!", + "Finty:Ah, uma caixa! Muito obrigado! Agora eu posso carregar todo meu inventário para casa a noite e de volta para cá pela manhã! Como símbolo da minha gratidão, tome essa feiosa--Digo, bela edição de colecionador dessa carta^", + "Espere...não está aqui! O que será que aconteceu? Bem, aqui, deixe-me aliviar seus ferimentos.", + "Como símbolo da minha gratidão, tome esses estilosos sapatos de ciclismo!", + "Bela manhã, não é, meu amigo? Uma bela manhã para compras! Como eu gostaria de ter uma caixa para carregar meu inventário comigo.", + "Que pena, parece que você não condições de comprar esse item! Volte mais tarde, quando tiver mais grana!", + "Finty:Ah, você é perspicaz! Você precisa de uma arma nova, não é? Mande seus inimigos para longe por apenas R$1113.73!", + "Finty:Esse saco de dinheiro permitirá que você acumule mais dinheiro que você acha pela Terra. Ele será seu por meros R$1937.90!", + "Finty>Ah ha ha, este sim é um item especial:sapatos de ciclismo para você ser veloz E estiloso! A venda por apenas R$668.23!", + "Finty:Cansado de perder tempo varrendo seu quarto com uma simples vassoura? Erradique toda as partículas de poeira com este aspirador de pó com tecnologia de ponta! Por apenas RS$1670.60 ou por, fáceis, parcelas mensais de R$445.48!", + "Obrigado!") + } +, + ending:{ + dialogue:new Array( + "Anodyne\n-------\n\n\n\nCriado por\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n-------------", + "Criado de\n\nMarço, 2012\n\naté\n\nJaneiro, 2013", + "DESIGN\n------\nAmbos", + "PROGRAMAÇÃO\n-----------\nMelos, usando\nFlixel para\nActionscript 3.\n\n\n\nARTE\n---\nMarina\n", + "MÚSICA/EFEITOS\n---------\nMelos, usando REAPER\ne algumas\nsoundfonts livres.\n\n\n\nDIÁLOGO\n--------------\nPrincipalmente Marina\n", + "HISTÓRIA\n-----\nAmbos\nLocalização\nJaponesa:\nKakehashi Games", + "Um grande obrigado\npara nossos testers\nque sofreram\npor você!\n--------------\n\nMarina, por sobreviver\natravés dos bugs\niniciais.\n\nEtan, pelo\nconstante suporte\ndesde o início, pelos\nmuitos bugs,\ndescobertos e por\nser o terceiro\na jogar a maioria/n do jogo.", + "Olivia - valeu,\nmana!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n", + "Melos gostaria de\nagradecer a:\n\nMãe e Pai, pelo\nsuporte contínuo\nnessa empreitada.\n\nS\n\nMuitos TIGSourcers\ne outros devs\nconhecidos pelo\ncaminho!\n\nMarina, por tornar\nesse jogo possível,\ne por melhora-lo\nde formas incontáveis.", + "Adobe, Adam Saltsman,\ndevs do FlashDevelop,\ndevs do REAPER,\ncriador do DAME,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE meus outros\namigos\nque mostraram\nseu apoio.\n(Obrigado!)\n\nE por último, mas\nnão menos\nimportante,\nTina Chen,\namiga de longa\ndata, pelo suporte\ne por me apresentar\nao Marina.", + "Marina gostaria de\nagradecer...\n\nColin Meloy, por\nexpandir\nmeu vocabulário\n\nTsugumo, por\n\"So You Want to\nBe a Pixel Artist?\"\n\nMinha família,\npelo apoio e comida.\n\nDaniel, por ser um\n\"indie game dev\"\ncomigo no passado.", + "Mo, por acreditar\n em mim.\n\nTina, por me\napresentar ao Melos.\n\nMelos, por fazer\num jogo\ne confiar em mim\ncomo grande parte\ndo processo.", + "ELENCO\n----\n\n\nGosma\n\n\nChato\n\n\nPei Pei\n\n\nEscudito\n\n\nVisionário", + "Movedor\n\n\nLiga Desliga\n\n\nQuatro Tiros\n\n\nCortador\n\n\nRogue\n", + "Cachorro\n\n\nSapo\n\n\nRodador\n\n\nPessoa\n\n\nParede\n\n", + "Rato\n\n\nCara do Gás\n\n\nPeixinho-de-Prata\n\n\nCorrredor\n\n\nRolador\n\nVigia\n\n\n", + "Empregada\n\n\nPlanta Explosiva\n\n\nGerente\n\n\n", + "Leão\n\n\nContorcionista\n\n\nPilar de Fogo\n\n\nServos\nArthur\nJaviera", + "Seguidor\n\n\nEduardo\n\n\nPescador\n\n\nCaminhante Vermelho\n\nHews", + "Coelha\n\n\nIcky\n\n\nVendedor\n\nMiao Xiao Tuan Er\n\nRank\n\nOurudo", + "Tórax\n\nJames\n\nCogumelo\n\nCrickson\n\nGolem\n\nSuburbanos", + "Perseguidor\n\n\nEntidades\n\n\nCaras Espaciais\n\n\Reis Cubo", + "Young\n\n\nMitra\n\n\nSage\n\n\nBriar", + "E nós gostaríamos\nde agradecer a\nVOCÊ!\nPor jogar\nnosso jogo.\nEsperamos que\ntenha gostado.", + "\n\n\n\n\n\n\n\n", + "Agora você tem o\npoder de explorar\no mundo de young\nsem(quase)alguma\nlimitação, através\nda troca.") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/intra/source/data/NPC_Data_ZHS.hx b/intra/source/data/NPC_Data_ZHS.hx new file mode 100644 index 0000000..31f6e75 --- /dev/null +++ b/intra/source/data/NPC_Data_ZHS.hx @@ -0,0 +1,3949 @@ +// This file was automatically generated! Don't touch it! +package data; + +class NPC_Data_ZHS { +public static var test:Dynamic= +{ +DEBUG:{ + scene_1:{ + dialogue:new Array( + "喜欢音乐吗? 那就和那个终端机对话吧!", + "喜欢疼痛吗? 那就一路向南行吧!") + } +} +}; + +public static var test_state:Dynamic= +{ +does_reset:true, +DEBUG:{ + scene_1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var arthur:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "那名杂技演员快要失去平衡了! 安全网在哪里?", + "...") + } +, + holyshit:{ + dialogue:new Array( + "WOOAH") + } +} +}; + +public static var arthur_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + holyshit:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var javiera:Dynamic= +{ +CIRCUS:{ + alone:{ + dialogue:new Array( + "狮子们正在包围那名杂耍人!", + "...") + } +} +}; + +public static var javiera_state:Dynamic= +{ +CIRCUS:{ + alone:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var briar:Dynamic= +{ +GO:{ + before_fight:{ + dialogue:new Array( + "荆棘:我累了,扬。 我已经厌倦了这样的循环。 我感觉自己活在同一个美梦中、同一个噩梦里,不断地循环。", + "荆棘:…", + "荆棘:事情是不会发生改变的,扬。 我们永远都无能为力。") + } +, + after_fight:{ + dialogue:new Array( + "荆棘:再见了,扬。") + } +, + final:{ + dialogue:new Array( + "荆棘:老兄啊,扬呀。", + "荆棘:抬起脚步,挥动手臂吧。 呀,如果没有了我,你一分钟也活不下去!", + "荆棘:好吧,走,我们去弄个三明治或者别的什么好了。", + "贤者:你…你已经做了很多了。") + } +} +}; + +public static var briar_state:Dynamic= +{ +GO:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + final:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sage:Dynamic= +{ +BLANK:{ + intro:{ + dialogue:new Array( + "神秘的声音:喂?…扬? ^嘿!…噢,你能听到我的声音吗? 太好了,听着,你马上就要醒过来了。 你可以使用方向键四周围移动。", + "你需要按下\'", + "\'键来与周围的物体和他人互动。", + "同时,你需要按下\'", + "\'键调出菜单,那里将会提供有关你自身以及周围环境的相关信息。") + } +} +, +GO:{ + posthappy_sage:{ + dialogue:new Array( + "扬…我只是想帮你处理好一切。", + "我希望…我希望你可以做得比我好。") + } +, + posthappy_mitra:{ + dialogue:new Array( + "祝你好运,扬。", + "贤者在某种程度上来说是对的。 我总希望一切既美好又完美,可是有时我却会忽略掉现实。", + "我不知道你应该怎样去帮助荆棘。 我也不知道这个世界究竟是怎样运转,更不知道为什么所有事情都那么奇怪。 可是我真的很想成为你的朋友,扬。", + "你一直在努力,扬。 你在努力去明白这一切。 我希望你能弄清楚这一切。") + } +, + one:{ + dialogue:new Array( + "贤者:扬… 这是我的最后告诫… 等等,是谁?", + "麦卓:我叫麦卓,这是我的自行车,东西!", + "贤者:我没在问你自行车的名字,我是说你在这里干嘛? 我并不记得你。", + "麦卓:我是来这里帮助朋友的啊,扬…", + "贤者:扬可没朋友。 扬也没有“荆棘”。 如果你胆敢怂恿他,我会让你永远滚出我的世界!", + "麦卓:你说这话是什么意思? 东西和我——", + "贤者:闭嘴! 别再和我提你那愚蠢的自行车了!!!") + } +, + hit:{ + dialogue:new Array( + "贤者:…", + "麦卓:扬! 你还好吗? 你干得真是太漂亮了… 你坚持把这个糟糕的地方搞定了! 我们知道你能办到的!", + "麦卓:东西!!!", + "麦卓:东西…", + "麦卓:瞧瞧,神秘的蒙面人,你觉得自己是何等角色? 你就不能让我们静静待一会吗?", + "贤者:你之所以觉得自己是扬的朋友,那是因为你会对他撒谎。 你会对他说,他是完美的。 一切都会得到解决。 好吧,如果你是这样想的话,算了。 从我面前消失吧,扬。", + "贤者:去和你的\"amiga\"说话。", + "麦卓:我们只是在尽力而为…") + } +} +, +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "戴斗篷的男人:好了,是时候了。 呃…^我是说…^你好啊,扬! 我是贤者,村里的长者。 因为这片“大地”被邪恶力量所笼罩,所以你被召唤来此。 邪恶力量正在寻找传说荆棘,企图利用荆棘之力达成他们邪恶的目的。 所以你必须抢先一步找到荆棘,并且保护它。", + "走进你左边那个已经激活的传送门开始任务吧。", + "*叹息* 你还在这里逗留可不是个好兆头啊。 进入传送门然后开始你的任务去呀。 荆棘乃至整个世界都需要你去拯救!", + "你只要走进那扇该死的门就好了!") + } +, + after_ent_str:{ + dialogue:new Array( + "你怎么还在这儿?") + } +, + after_bed:{ + dialogue:new Array( + "继续,扬。 你刚刚找到钥匙也许只是九牛一毛罢了——把它们全都找出来吧。", + "远方就是“大地”了,扬。 这是阻止邪恶力量的唯一途径。") + } +, + before_windmill:{ + dialogue:new Array( + "拿着这三把钥匙,扬。 你可以利用它们前往“大地”更深处。") + } +, + after_windmill:{ + dialogue:new Array( + "你已经达成了我所要求的事情,扬。 尽管你需要做的事情还有太多太多。 也许探索“大地”更深处能帮助你更好地理解… 也许你会懂得你为荆棘做的一切都是值得的。") + } +, + all_card_first:{ + dialogue:new Array( + "好样的,扬。 你已经找齐了“大地”其中一个区域的所有卡片。 这样一来,在该区域的传送门顶部就会出现一颗宝石。") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "贤者:你的技能很快就可以在测试中展现了,扬。 这座神殿是为了考验你而存在。 你需要集力量与智慧才能通过考验。 我想你应该已经找到一件武器了吧?", + "什么玩——?? …我、我是说… 当然了… 你找到了一根扫帚! 呃… 正如同传说所言…", + "*抱怨声* … 简直就是没用的东西——嘿! 你还傻站在这儿干嘛?", + "时刻保持头脑清醒,扬。") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "贤者:现在的你还是很弱小。 如果你希望保护荆棘不受邪恶力量的伤害,你必须面对自己的恐惧。 你在这个箱子里找到的卡片,以及别的类似卡片,都是你成长的象征。 所以找到它们对你完成任务至关重要。", + "那个钥匙对你的任务而言也很重要。 你必须找到其它钥匙。 在菜单界面选择地图可以传送回神殿的入口然后继续你的英雄任务。", + "往东南方向穿过神殿… 你会找到一处使用那把钥匙的地方。", + "什么? 你想要回大门那儿去吗??") + } +} +, +TERMINAL:{ + before_fight:{ + dialogue:new Array( + "贤者:你怎么不听我的话呢?! 如果你像个傻子一样的冲进这里,你只会危及荆棘,“大地”,还有我一直以来在保护的一切! 抱歉,扬。 如果你不听我的话,那我只能用另一种方式来劝你…") + } +, + after_fight:{ + dialogue:new Array( + "贤者:扬… 我并不希望事情变成这样… 我希望你能成为更好的人。 我希望你能帮助荆棘。 但是所有这一切不过是一场愚蠢的游戏… 我没办法阻止你找到荆棘。 只不过当事情变得很糟糕的时候,别忘了我对你说过的话。") + } +, + entrance:{ + dialogue:new Array( + "贤者:你好,扬。 当你变得更加强大而聪慧的时候,这条路便会引导你找到荆棘。", + "贤者:你还没准备好呢,扬。 首先,你需要这片“大地”上接受更多的考验。", + "贤者:你已经有所进展了,扬。 但是你必须收集齐全部36张卡片才能通过这扇大门。") + } +, + etc:{ + dialogue:new Array( + "贤者:哦… 呃… 你已经找齐36张卡片了吗? 但是我还不确定你是否能接受真正的考验。 其实,瞧啊,我们理解错了这扇门的意思,你其实需要…\n…\n…………\n92张卡片才能通过这扇门,而非36张!", + "贤者:扬,别进去,你还没准备好! 为荆棘考虑一下吧! 还有“大地”! 如果你还没准备好,那一切都毫无意义了!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "贤者:干得漂亮,扬。 你需要战胜的不止是这只怪兽,还有你自己的恐惧!!!", + "贤者:当然了,你还有漫漫长路要走呢。 你已经探索过“大地”了吗?") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "贤者:干得好,扬。 可是还有许多试炼等待着你。 千万别放松警惕。", + "贤者:你已经找齐了所有钥匙吗,扬? 如果没有的话,那就去海滩上看看。") + } +} +}; + +public static var sage_state:Dynamic= +{ +BLANK:{ + intro:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + posthappy_sage:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + posthappy_mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hit:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + enter_nexus:{ + top:true, + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + after_ent_str:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_bed:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + before_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_windmill:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + all_card_first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cliff_dog:Dynamic= +{ +CLIFF:{ + top_left:{ + dialogue:new Array( + "我和别人不一样! *低鸣* 我不会伤害你的…", + "这是一个安静的存在。", + "你闻起来就是一股甜菜味儿。", + "*低鸣*") + } +} +}; + +public static var cliff_dog_state:Dynamic= +{ +CLIFF:{ + top_left:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var happy_npc:Dynamic= +{ +HAPPY:{ + beautiful:{ + dialogue:new Array( + "你做到了,扬! 你打败了邪恶力量! 看看这个地方! 多么美丽!", + "实在是太美丽了…") + } +, + dump:{ + dialogue:new Array( + "呀,你在这里真是太好了! 我还担心你被困在雪里了呢… 在那里的时候感觉真是很绝望吧! 哈!", + "哈哈哈。 哈哈哈哈哈。 哈哈哈哈哈哈!") + } +, + drink:{ + dialogue:new Array( + "嘿,小可人儿,我请你喝一杯吧!", + "再和一杯吧,小混球! 哈哈哈!") + } +, + hot:{ + dialogue:new Array( + "我靠,这里好热… 太热了… 我流了好多汗…", + "该死的,我越想弄明白怎么回事却更加饥渴难耐!") + } +, + gold:{ + dialogue:new Array( + "你知道这个地方是用金子做的吗? 跟真金一模一样!我们可以带着那块砖跑掉,然后不愁吃穿一辈子! 哇哈哈哈哈!", + "说真的,你为什么一直站在那儿? 赶快过来帮我撬砖啊!") + } +, + briar:{ + dialogue:new Array( + "???:扬… 你终于做到了! 你救了我! 现在一切都恢复如初了!!!!") + } +} +}; + +public static var happy_npc_state:Dynamic= +{ +HAPPY:{ + beautiful:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dump:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + drink:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hot:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gold:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + briar:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var mitra:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + dialogue:new Array( + "当心!", + "抱歉… 我走路太急了。 嘿,我从来没见过你呢! 你也是旅行者吗? …哈? 你想保护荆棘不受邪恶力量的伤害? … ^好吧… 虽然我不明白你在说些什么,但是听起来蛮酷的呢!", + "我只不过带着我的东西四处走走罢了… 什么? 不不,我可不是商人。 东西是我自行车的名字!", + "也许我们还会再见的。 如果我听说有关荆棘的事情我会告诉你的。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "当心! 好了东西,来吧!", + "赶快!", + "继续前进吧,扬,我们会一直支持你!") + } +} +, +FIELDS:{ + init:{ + dialogue:new Array( + "你还记得我吗? 上次我只顾着介绍我的自行车--东西而忘记介绍我自己了。 我叫麦卓。", + "你还记得我吗?上次我忘记介绍我自己了,我叫麦卓,这是我优秀的自行车,它叫东西。", + "麦卓:你最近过得如何,扬? …什么? 我怎么知道你的名字? 你觉得很奇怪吧? 嗯,其实你衣服背后写着的呢。", + "麦卓:回见,扬!") + } +, + quest_event:{ + dialogue:new Array( + "麦卓:嘿,我只记得--有人说他们在找一些过去的东西。 我不太理解他们在说什么,但是他们急匆匆地往山上去了。") + } +, + game_hints:{ + dialogue:new Array( + "什么也没有。", + "噢,你迷路了吗? 你去过海滩了吗? 也许那儿有东西能帮到你。 看上去你的那些钥匙是有一整组的。 你可能需要找到更多钥匙?", + "噢,你迷路了吗? 你去过东边的森林了吗? 你找到的那把钥匙--看起来应该是有一整组的。 你可能需要找到更多钥匙?", + "看看那些钥匙啊! 我记得我在东南方向看过有许多大门。 也许你可以去那边试试?", + "嘿,我看到你把风力涡轮机开启了! 你知道这会对“大地”产生什么样的影响吗?", + "嘿,扬。 哇! 你已经找到那么多卡片了! 你现在弄明白它们用来干嘛的吗? 看起来你可以用它们来兑换东西呢!", + "那个新的扫帚附件是什么? 它可以让你改变这个世界的结构吗…? 说实话,那可真可怕啊扬。 真庆幸它不是在任何地方都能起作用,也许只能在“大地”最深处发挥效用。", + "我的跳跳鞋你用得怎样了? 一定很棒吧? 我好喜欢我的新自行车鞋。 它们让我和东西成为了更棒的组合!", + "真棒,扬,你又找到一把钥匙! 东西很喜欢这个颜色呢! 你找到用钥匙的地方了吗?") + } +, + card_hints:{ + dialogue:new Array( + "麦卓:嘿,扬,你在找卡片吗?\n你去“观察者”的神殿找过吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我听说“观察者”的神殿的后门有一个迷宫。", + "麦卓:嘿,扬,你在找卡片吗?\n你可以在“观察者”的藏匿之所找到一些东西。", + "麦卓:嘿,扬,你在找卡片吗?\n“观察者”的神殿里有一个满是敌人的房间,对吧?", + "麦卓:嘿,扬,你在找卡片吗?\n你有没有仔细查看一下“观察者”的神殿呢?", + "麦卓:嘿,扬,你在找卡片吗?\n去试试“观察者”的神殿后门附近的那片荒废的区域吧。", + "麦卓:嘿,扬,你在找卡片吗?\n也许你的邻居知道些什么呢。", + "麦卓:嘿,扬,你在找卡片吗?\n我知道在你公寓的那个家伙在隐藏着什么…", + "麦卓:嘿,扬,你在找卡片吗?\n在你公寓入口附近…去那儿看看!", + "麦卓:嘿,扬,你在找卡片吗?\n你有没有检查过你公寓的*里里外外*呢?", + "麦卓:嘿,扬,你在找卡片吗?\n这里以南就是一个岛屿! 我没去过那儿,但是你可以去看看。", + "麦卓:嘿,扬,你在找卡片吗?\n如果你一直沿着河流走,应该能找到好些东西。四周围看看吧!", + "麦卓:嘿,扬,你在找卡片吗?\n我知道有人在风车那儿留了一张卡片。", + "麦卓:嘿,扬,你在找卡片吗?\n去森林里的河流附近找找看吧…", + "麦卓:嘿,扬,你在找卡片吗?\n去山底下找找看吧。", + "麦卓:嘿,扬,你在找卡片吗?\n去山顶找找看吧。", + "麦卓:嘿,扬,你在找卡片吗?\n在海滩的远处也许可以找到点什么。", + "麦卓:嘿,扬,你在找卡片吗?\n去深红色树林里逛逛吧。", + "麦卓:嘿,扬,你在找卡片吗?\n在那些红色洞穴里面有许多上锁的门,对吧?", + "麦卓:嘿,扬,你在找卡片吗?\n去北边的红色洞穴,寻找河流的源头!", + "麦卓:嘿,扬,你在找卡片吗?\n唔…你在黑暗迷宫里仔细找过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我记得某个地方有一条很可怕的、会喷火的路。 在路的尽头应该有些什么!", + "麦卓:嘿,扬,你在找卡片吗?\n那些马戏团的人一定在隐藏着什么。 你有没有仔细找过呢?", + "麦卓:嘿,扬,你在找卡片吗?\n你在那对夫妇的大坑边缘仔细找过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n这对夫妇在大坑附近游走。 他们肯定在隐藏着什么。", + "麦卓:嘿,扬,你在找卡片吗?\n有些时候裂缝中可能会隐藏着些什么--特别是山洞里!", + "麦卓:嘿,扬,你在找卡片吗?\n你有探索过最高处的山洞吗?", + "麦卓:嘿,扬,你在找卡片吗?\n你在山洞深处找到什么东西了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n那个在诡异之处的彩色方块--应该有东西在那儿!", + "麦卓:嘿,扬,你在找卡片吗?\n你和那个在看上去很荒凉的区域里的灰度方块对话了吗? 也许它知道些什么。", + "麦卓:嘿,扬,你在找卡片吗?\n酒店的顶层虽然有些破败,但是应该藏着些什么!", + "麦卓:嘿,扬,你在找卡片吗?\n你去酒店第三层的所有房间看过了吗?", + "麦卓:嘿,扬,你在找卡片吗?\n我敢打赌,有人肯定在酒店第二层留下了什么东西。", + "麦卓:嘿,扬,你在找卡片吗?\n酒店的主人肯定留了些东西给你!", + "麦卓:嘿,扬,你在找卡片吗?\n那些西北方向的断桥…去那儿看看吧!", + "…什么? 你一张卡片都没找到? 拜托,扬,这实在是太扯了吧! 人活一辈子总该有些冒险精神吧,比如开几个箱子什么的,你懂我的意思吧?") + } +, + general_banter:{ + dialogue:new Array( + "你遇见那个在山里寻找东西的家伙了吗?", + "你知道我的自行车姓什么吗? …操纵者! 你知道吗? 东西·操纵者!! …我开玩笑的,自行车怎么会有姓氏呢。", + "你觉得我应该弄一把U型锁吗? 可是我不喜欢把东西锁成那样,可是最近又听说了很多偷自行车的案例…", + "所以荆棘到底是什么? 是从失落文明中遗留下来的古代手工艺品吗?", + "我想知道为什么我从来没听说过什么邪恶力量入侵的事情。 我猜这儿大部分人都只在烦恼各自的琐碎事。", + "嘿,扬,我想告诉你… 你头发真好看。") + } +} +}; + +public static var mitra_state:Dynamic= +{ +OVERWORLD:{ + initial_overworld:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + game_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + card_hints:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + general_banter:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var statue:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + dialogue:new Array( + "雕像:那个村庄长者只不过是名义上的角色罢了。") + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + dialogue:new Array( + "雕像:我见过一把传说的扫帚… 它在看门人衣橱里的地图上。") + } +} +, +BEDROOM:{ + after_boss:{ + dialogue:new Array( + "雕像:获得卡片对你而言至关重要。 当然,它们在其它方面也很重要。 比如获取分数或是购买酒精饮料什么的。") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "雕像:做得好,贤者。 你需要克服的除了你的坏脾气之外,还有你的自尊心! 这样你才能好好讲出你那俗套的对白!!!") + } +} +, +TERMINAL:{ + one:{ + dialogue:new Array( + "当你成为一个更加有压力和冷漠的角色之后,这条路会带你去找布雷耶。 放松一下吧,失败者!") + } +} +}; + +public static var statue_state:Dynamic= +{ +NEXUS:{ + enter_nexus:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + bedroom_entrance:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEDROOM:{ + after_boss:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TERMINAL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sadbro:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + dialogue:new Array( + "爱德华:有一个男人走进来,在我们的浴室里安了一面镜子。 所以我担心里面会有隐藏摄像头。 我把镜子的木框仔细翻找了一下,我喷了一些梅非的油皂在木框的裂口处,我觉得这样应该可以让里面的电路短路。 当然了,虽然我什么也没找到。", + "爱德华:这座神殿是献给“观察者”的。 我不知道我为什么会来这里,我很害怕走进去。") + } +, + bedroom_not_done:{ + dialogue:new Array( + "爱德华:遇到麻烦了吗? 好吧,我能想象到。 你只有一把扫帚而已。 而一把扫帚只能用来扫扫灰尘。") + } +, + bedroom_done:{ + dialogue:new Array( + "爱德华:你说你打败了“观察者”? 哈哈。 你没发觉事情不应该如此吗? 你只不过是把油皂喷在了裂缝上。") + } +} +}; + +public static var sadbro_state:Dynamic= +{ +OVERWORLD:{ + initial_forced:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + bedroom_not_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bedroom_done:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var sun_guy:Dynamic= +{ +BEDROOM:{ + before_fight:{ + dialogue:new Array( + "噢,这难道不可爱吗? 弱小的扬,在扮演着英雄的角色。 但是我见证着你在这片“大地”上所做的每一分努力。 让我来告诉你吧,扬。 这里不是所有人都会诚实对待你。 当心你信任的人!") + } +, + after_fight:{ + dialogue:new Array( + "当你孤单之时,我会与你同在,扬。 别忘了我对你小小“冒险之旅”的建议。") + } +} +}; + +public static var sun_guy_state:Dynamic= +{ +BEDROOM:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var rock:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "石头:周围的幻觉便是恶魔的巢穴。") + } +, + two:{ + dialogue:new Array( + "石头:待办事项:构建运输到节点的方法。 进程:停顿--“观察者”拒绝提供项目运作资金。 我们将不得不使用原始的传送门方法。") + } +, + three:{ + dialogue:new Array( + "石头:我被孤独地困在这里。 这个隧道里的工作很稳定,至少每天都能看到有进展。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "这个轮子曾经被用来升起大坝的。") + } +} +, +CIRCUS:{ + one:{ + dialogue:new Array( + "1957年6月24日:秋千坏掉了。 爱丽丝·罗格斯摔到地里去了。 2根胫骨骨折。") + } +, + two:{ + dialogue:new Array( + "1957年7月17日:七名小丑因为严重的肺部问题而退休。 兰德布兰德牌化妆品非常可疑,可是却没有对其进行任何正式调查。") + } +, + three:{ + dialogue:new Array( + "1957年7月21日:由于有个兽笼出现问题,我的脸和侧身都被一只尚未驯服的狮子所咬伤。 我活了下来,但现在我只要看见自己的模样就会瑟瑟发抖。") + } +, + four:{ + dialogue:new Array( + "1957年8月5日:在我的梦里,我看见了有一双凶猛却闪闪发光的眼睛的石头脸。 他道出了我们存在的真实情况,是第一个在痛苦中给予自由的人。") + } +, + five:{ + dialogue:new Array( + "1957年8月7日:在我们接受“观察者”的真相之前,还有多少人要受苦?") + } +, + six:{ + dialogue:new Array( + "1957年8月8日:我已经做出了决定。 有些人说会追随我。 这是我的最后一搏。 愿“观察者”保佑我们诸事顺利。") + } +} +, +CLIFF:{ + one:{ + dialogue:new Array( + "(难以辨认的记号)") + } +, + two:{ + dialogue:new Array( + "2010年12月7日。(姓名无法知晓)。 这里除了愚蠢的石头已经没有别的东西了!") + } +, + three:{ + dialogue:new Array( + "危险! 这个洞窟未经勘查。") + } +, + four:{ + dialogue:new Array( + "这些峭壁E向远处延伸,然而我从没有爬到高处去看它们通向哪里。") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "石头:怎样?") + } +, + two:{ + dialogue:new Array( + "石头:当心!垂直降落你需要自行承担风险。") + } +} +, +DEBUG:{ + one:{ + dialogue:new Array( + "这个曾经是卡片大门的占位符动画。 碰触两次可以查看锁住或开启的动画!", + "我已经忘记为什么我们将它弃之不用了。也许是因为它太引人注目了。") + } +, + two:{ + dialogue:new Array( + "这里是许多材质图层与碰撞的测试点!我没办法一个素材用到底(比如墙的两面)。所以我完全放弃了这个主意…", + "我们不用它们是有原因的。最主要的原因是为了简化设计,让我们更好地完成游戏制作。") + } +, + three:{ + dialogue:new Array( + "敌人被击败时有几率掉落钥匙。虽然这个主意很有趣,但是我还是放弃了。", + "我们还有一个点子,就是设计一些挑战大门,把它们放在考验的最后。你只有无伤过关后才能开启这些大门。", + "我们想把所有的地牢都放在这周围,然后掉血之后无法恢复。不过这样实在是太难了!") + } +, + four:{ + dialogue:new Array( + "监狱!!!", + "救救我们!!!", + "拜托了!") + } +, + five:{ + dialogue:new Array( + "欢迎来到“调试世界”!现在,你已经走出了\"大地\",所以这个世界可以说(至少有90%)都是\"非正式\"内容。", + "在使用大量地图素材之前,我用了一些很傻的素材来标记出大门的位置。实际上每个地牢都是用这里的地图素材勾勒出大概的。然后Marina再用他的素材去精细构建。") + } +, + six:{ + dialogue:new Array( + "fille") + } +} +, +DRAWER:{ + five:{ + dialogue:new Array( + "-档案-", + "谨慎行事") + } +, + four:{ + dialogue:new Array( + "西部。裂缝。真实!房产价值低、飓风、老旧、缩减。放松。") + } +, + three:{ + dialogue:new Array( + "“观察者”让我记、记起…………在家的美好时光。") + } +, + two:{ + dialogue:new Array( + "冷藏\n\n^ --管理员") + } +, + one:{ + dialogue:new Array( + "继续") + } +} +, +FIELDS:{ + one:{ + dialogue:new Array( + "西部:海滩\n\n东部:森林\n\n东南部:\n 多雨地区\n\n北部:\n神殿遗迹\n\n西北部:峡谷") + } +} +, +FOREST:{ + one:{ + dialogue:new Array( + "西部:湖泊\n南部以东:峭壁") + } +, + two:{ + dialogue:new Array( + "放松池塘。停下来歇息一会吧,我们知道你有时间的。") + } +, + three:{ + dialogue:new Array( + "我担心自己可能永远被困在这个小角落里了。") + } +, + four:{ + dialogue:new Array( + "东部:峭壁") + } +} +, +GO:{ + one:{ + dialogue:new Array( + "当黑暗守卫素材被底下色的方格网替换时,路径才会打开。") + } +, + two:{ + dialogue:new Array( + "当蓝色石像移动\n新的路径将会出现\n翻过峭壁,穿过奇怪的区域\n你将会看到一间旅行者旅店\n\n\n\"谁是守卫?\" 我问道,\n\"谁掌管这个繁忙的地方?\"\n尽管这里有许多人类的灵魂\n我依旧感到很孤单。") + } +, + three:{ + dialogue:new Array( + "锈蚀的红色雕像移动了\n这是在为更深处铺路\n伴随而来的是迷宫般的地牢\n然后是马戏团的大帐篷\n\n\n\"谁是守卫?\"我问道,\n\"谁放弃了生命,逃到这样一个地方来?\"\n我如他们一样害怕痛苦\n但更害怕死亡。") + } +, + four:{ + dialogue:new Array( + "绿色的金属雕像移动了\n更深的道路开启了\n郊外的房屋和道路慢慢形成\n那是通往公寓的道路。\n\n\n\"谁是守卫?\"我问道,\n\"谁在星辰之中找寻慰藉?\"\n虽然孤身一人,但却感觉被人注视\n注视我的定然不是那友好的星光。") + } +} +, +BLANK:{ + one:{ + dialogue:new Array( + "石头:这是一片无人认领的领土--它尚未成为“大地”的一部分。") + } +, + two:{ + dialogue:new Array( + "石头:这些==^ 我和我的^ --圆圈是^ --约定…我会^ --围绕中心^ --努力完成所有使命…^ --圆圈。吱吱、吱吱。") + } +, + three:{ + dialogue:new Array( + "石头:看呀^ --…可我依然^ --你的脚步^ --是否将重新出现?^ --当在这里之时!") + } +, + four:{ + dialogue:new Array( + "石头:往下看^ --我发现:^ --从此开始,你--^ 我爱上了他。^ --于是什么也…看不清。") + } +, + five:{ + dialogue:new Array( + "石头:我很抱歉--^ 但是,嗯,我们--^ 在这里混乱不清--^ 应该保持联系--^ 但是那扇传送门应该^ --我会努力让你知道我的想法--^ 将你带回“大地”。") + } +} +, +NEXUS:{ + one:{ + dialogue:new Array( + "有时如果你和人们对话多次之后,他们可能会和你聊点新话题。", + "但是石头不会这样。 石头才不做那样的事情。") + } +, + two:{ + dialogue:new Array( + "石头:很接近了!只要…") + } +, + three:{ + dialogue:new Array( + "石头:好奇心是个好东西。") + } +, + four:{ + dialogue:new Array( + "石头:噢!…?") + } +, + five:{ + dialogue:new Array( + "电脑终端打开了一封电子邮件。由于部分显示屏已经坏掉,所以只能看见信息的一部分。电子邮件写到:\"你好,扬!似乎[...]第五十张卡片[...]也许你不该…[...]值得思考!你觉得自己已经准备好了吗?醒醒吧…\"") + } +} +, +OVERWORLD:{ + one:{ + dialogue:new Array( + "石头:我打赌你肯定是因为没朋友所以才会度一块石头上的内容。") + } +, + two:{ + dialogue:new Array( + "石头:欢迎来到主世界的站点。希望你很享受在“大地”的时光。") + } +, + three:{ + dialogue:new Array( + "石头:你就是探索者!", + "石头:请不要去南部。因为那里正在施工中。") + } +, + four:{ + dialogue:new Array( + "石头:财宝在5、3!") + } +, + five:{ + dialogue:new Array( + "石头:哈哈,明白了!") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "我们出生于正在衰老的母亲的身体中。") + } +, + two:{ + dialogue:new Array( + "有一天,我们的母亲离开了她的母亲,独自去寻找有毒的青蛙。") + } +, + three:{ + dialogue:new Array( + "我们从没问起过此事。 我们不能让她遭受痛苦。") + } +} +, +REDSEA:{ + one:{ + dialogue:new Array( + "石头:标志上说到,树木们已经有很长一段时间处于沉睡状态了。") + } +, + two:{ + dialogue:new Array( + "石头:南部:???^ 北部:???") + } +, + three:{ + dialogue:new Array( + "石头:这并不平坦的地面据说是由曾经居住在这片土地上的祖先们构成的。") + } +, + four:{ + dialogue:new Array( + "石头:他们似乎是非常热爱和平的物种。") + } +} +, +SPACE:{ + one:{ + dialogue:new Array( + "某人用永不褪色记号笔字迹潦草地写道:你好,时空旅行者同僚。你已经踏入了远离扬所在的平行区域的裂缝中。你大概已经穿越了一片或者两片海洋。别担心有什么差别,你很快会重新回到你正常的冒险中去。别害怕这个地方,尽管这里到处都是禁忌和危险,这儿的人还是相当友善的。\n --管理员", + "(在这条消息下面,刻着这样一段话:)____(看不清)长眠于此。他在森林里迷了路。", + "(消息最下面还写到:)(别往太南边走就好。)") + } +, + two:{ + dialogue:new Array( + "____长眠于此(看不清,究竟是谁写的这个?)他被彩虹刺穿了!", + "原本应有更好的成就。") + } +, + three:{ + dialogue:new Array( + "伯德长眠于此。只因峭壁对其不太友好。") + } +, + four:{ + dialogue:new Array( + "袋子长眠于此。它从没有被人使用的机会。", + "做作!") + } +, + five:{ + dialogue:new Array( + "萨维奇长眠于此。他曾经试着在仓库里帮我修电脑。由于他拥有的空间实在太小,三年之后他还是没有修好。所以,他该死。") + } +, + six:{ + dialogue:new Array( + "戴夫长眠于此。他是一个缺乏灵感的人。") + } +} +, +SUBURB:{ + one:{ + dialogue:new Array( + "---扬市---^\n请多加注意部分市民。他们不太擅长和人打交道…他们行事特别小心。扬市建立于90年代,市长英为了要开展一系列的住房计划而打造了这个城市。英拒绝使用“英”来命名此城市,而坚持要使用“扬”这个字。希望你在这儿玩儿得愉快。") + } +, + two:{ + dialogue:new Array( + "往西走是“观察者”的传说神殿。往东走是我们伟大的市长英的公寓,这里是不对外公开的--擅闯者自重。") + } +, + three:{ + dialogue:new Array( + "在他的第五次造访时,市长英因为找不到停车位而感到不快。后来他再次来访时,他会偶尔把车停在这个停车位。") + } +, + four:{ + dialogue:new Array( + "我记得我曾经写下的长句子。哈!断断续续的。") + } +, + five:{ + dialogue:new Array( + "危险的处境") + } +} +, +TRAIN:{ + one:{ + dialogue:new Array( + "“观察者”知道一切,并会启迪我们。启迪之路是无法用任何火把点燃的。") + } +, + two:{ + dialogue:new Array( + "不要偏离“观察者”之路,就算为了在遥远的迷宫角落里的财宝也不要。") + } +, + three:{ + dialogue:new Array( + "继续前进。") + } +, + four:{ + dialogue:new Array( + "别激怒暴力的追踪者。") + } +} +, +WINDMILL:{ + one:{ + dialogue:new Array( + "景观地标:情人塔。情人塔修建于很早之前。站在塔上可以眺望远山。第一座塔在不久前损坏了,然后被重新改造。第二座塔还在东边屹立不倒、直插云间。出于安全考虑,通往塔的道路被封锁了。什么时候重新开启还需要另行通知。") + } +, + two:{ + dialogue:new Array( + "公共安全须知:^\n这座塔,尽管完好无损,但是据说塔顶有空间裂缝。请对此保持谨慎与宽松的心态。^\n --管理员") + } +} +}; + +public static var rock_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CIRCUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DEBUG:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +DRAWER:{ + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLANK:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +NEXUS:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +OVERWORLD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + six:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + five:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + three:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + four:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +WINDMILL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var dungeon_statue:Dynamic= +{ +BEDROOM:{ + one:{ + dialogue:new Array( + "这座雕像看起来似乎马上就会移动似的。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +, +REDCAVE:{ + one:{ + dialogue:new Array( + "看上去这座雕像非常坚固。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +, +CROWD:{ + one:{ + dialogue:new Array( + "看上去这座雕像不可移动。") + } +, + two:{ + dialogue:new Array( + "雕像移动了。") + } +} +}; + +public static var dungeon_statue_state:Dynamic= +{ +BEDROOM:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CROWD:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + two:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var splitboss:Dynamic= +{ +APARTMENT:{ + before_fight:{ + dialogue:new Array( + "火焰很漂亮,是不是?路灯的光芒把星星的火焰盖过了,实在是太可惜。") + } +, + after_fight:{ + dialogue:new Array( + "好吧,星星其实不是真的由火焰形成的。 ^谁会关心这个啊?") + } +} +}; + +public static var splitboss_state:Dynamic= +{ +APARTMENT:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var cube_king:Dynamic= +{ +SPACE:{ + color:{ + dialogue:new Array( + "你今天怎么样呀?我是这个空间的统治者。", + "你想知道我为什么是这儿的统治者吗?我会让你知道的,不过这还需要一点时间。需要很长一段时间。需要很漫长的一段时间。", + "反正就是挺长的啦。我可先给你提个醒啊!我打算去散散步。你呢,可以去看看那边的箱子里都有些什么。或者去远处的酒店瞧瞧。我不知道那儿有什么,不过我听说那儿的东西还挺便宜的。在那儿不会有什么钱财的问题。", + "我为什么是这儿的统治者?^…我也不知道原因,但是我在这儿的朋友都觉得,基于这里的状态,由我来担任这个职位非常合适。这可能是因为方块比较适合一直坐在平台的表面上把。除了我之外,没人需要一直坐在这儿了!", + "那些人--在那边的我的朋友们--都有各自的优点。他们说不定以后也有机会坐在这儿,只不过现在做不到而已。有时候,我们也会互相交换一下身份,但是每一次,我们都还是需要有人来诠释这个空间啊!也许金字塔先生或者夫人可以坐在我的位置上,因为我们打算为他们打造适合他们形状的王座。这听起来很傻吗?也许吧。但是事情就是如此。一切都发生得那样迅速。几分钟、几小时--统治永远都不是长久的。", + "尽管如此,当我作为统治者的时候,感觉还是有点怪怪的…我有种与世隔绝的感觉,觉得和别人都格格不入…", + "…但是与世隔绝也不能正确去形容我的感受。这只能算是部分感受吧。我没有被孤立,我也不是不喜欢别人。我们都把彼此当朋友,但是你懂的,没人会专门跑来就为了和你随便聊几句。所以我不得不思考事情,否则我会发疯的!也许那也是与世隔离之感的一部分吧。", + "除了那些愚蠢的、关于*为什么*我们会在这儿占据这个空间的问题,我更好奇为什么我们是朋友。", + "我喜欢思考的是,不管是什么时候,大家都认为我是最好的统治者。而他们让我有充分的时间去适应这个角色。你知道的,这就是一种鼓励。这样的存在让我很是宽慰。", + "我觉得仅仅是这样就已经很让我满足了。虽然如果他们能有一两个人明白我作为一个统治者的感受会更好。我不是在抱怨这样的鼓励!但是也许我们会有不同的统治者呀…是吧!也许有一天我不是统治者了,那么我会去做我希望他们现在做到的事情…尽管我也不知道他们是不是会如我所愿。", + "我已经走了很久了。如果你去另外一个方向,那边也有一个和这里类似的区域。不过那儿和这儿的感觉还是有些不同的。", + "见到你我很高兴。", + "噢,你还想再听一遍我的故事吗?", + "好,请好好坐着。") + } +, + gray:{ + dialogue:new Array( + "你好呀,我是这里的统治者。", + "什么?你想知道我为什么会在这儿?你确定吗?我会长话短说给你解释的!", + "既然你这样坚持,那好吧。虽然你最好是先去那个远处的酒店。我都不知道他们为什么要把它修出来。如果任何人要让我交税,那我肯定怨声不断!", + "好吧,虽然我是这儿的统治者,但是没有任何人让我统治。", + "我的那些朋友们--他们都是各自区域的统治者。虽然也都没有实际统治着谁--我们都是孤独的。但是只要我们互相聊天,就不会感到孤独了。毕竟这是我唯一存在过的地方啊。", + "我的朋友和我--我们所在的区域在某些方面都有共通点,比如它们为什么会存在、它们是怎样被安排的。我们在利益和欲望上都是相同的。所以我们喜欢谈论如何去统治。", + "但是,其实我们根本没有从物质形态上见过彼此。", + "所以你也不是在和他们的意识形态对话,而是以全息的形态。", + "我知道,这样有些不幸。不幸的是,我们有太多的共同点。可是这样的我们只能彼此成为朋友呀。", + "当你不能够一对一的实际交谈时,其实也只是欠缺了一小部分真实罢了。", + "我不是在抱怨什么。可是这样聊胜于无啊!要是连一个说话的人都没有,我简直不敢想象那种情况。一定非常糟糕吧。", + "能和你说这些真是太好了,祝你一切都顺利吧。", + "你还在这儿吗?如果你愿意,我可以从头到尾再和你说一遍。") + } +} +}; + +public static var cube_king_state:Dynamic= +{ +SPACE:{ + color:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + gray:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +} +}; + +public static var forest_npc:Dynamic= +{ +FOREST:{ + bunny:{ + dialogue:new Array( + "克里克森:嘿呀,大恶霸! 我可不怕你!", + "克里克森:你个大傻瓜! 我才不会逃跑呢! 就算你要揍我也不会!", + "克里克森:你只不过是个穿着喇叭裤的大傻个!你应该以你自己为耻!") + } +, + thorax:{ + dialogue:new Array( + "胸腔:我是胸腔,我要为蜜蜂们发声。\n^它们的命运充满了不确定性,这不是它们想要的!\n^那些工蜂们不得不到处飞!\n^然后它们就这样白白死掉…这样的场景实在是太残酷了!", + "胸腔:也许这是病毒或是新型杀虫剂造成的,\n^也许这是那些臭苍蝇的幼虫造成的!\n^反正这个原因让这些蜜蜂的行为都变得很古怪。\n^不管原因是什么,这个状况必须被改变!", + "胸腔:好吧,其实我也不清楚事情是如何\n^我也担心我所做的努力都是徒劳。\n^可是试问我怎么能冷眼旁观呢?\n^所以我一定会把这件事放到Facebook、Twitter还有Yelp上去!") + } +} +}; + +public static var forest_npc_state:Dynamic= +{ +FOREST:{ + bunny:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + thorax:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var shopkeeper:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "买我的东西吧") + } +} +}; + +public static var shopkeeper_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var goldman:Dynamic= +{ +FIELDS:{ + outside:{ + dialogue:new Array( + "你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的!", + "我不会就这么罢休的! 永远都不会!") + } +, + inside:{ + dialogue:new Array( + "哦,你来这里是为了再一次恐吓我吗?", + "你支持那些猫咪只是因为它们可爱又毛绒绒。") + } +, + etc:{ + dialogue:new Array( + "你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的!^ 嗷呜!^ 是不是这样--?^ 再来一只猫???^ 嗷呜呜!!!", + "你…你把我的房子打扫了… 我被感动了! 来,我要把我最美丽的东西送给你!", + "扬拿起了盒子。这里面有东西!", + "黏黏:噢。嘿,苗。^\n\n苗:真高兴你安然无恙!^\n\n黏黏:啊…谢谢你的帮忙,扬。", + "黏黏:说实话,我还蛮喜欢坐在盒子里的。") + } +} +}; + +public static var goldman_state:Dynamic= +{ +FIELDS:{ + outside:{ + top:true, + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + inside:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + etc:{ + top:true, + cur:"", + pos:0, + loop:4, + dirty:false, + finished:false + } +} +}; + +public static var miao:Dynamic= +{ +FIELDS:{ + init:{ + dialogue:new Array( + "噢!! 你是扬,那个天选之人啊!!! 天啦噜,真是荣幸啊! 我叫苗小团儿,正在接受培训的天选之人!", + "我能跟着你一小会,看看天选之人是怎样做事的吗?", + "你好啊,扬! 我今天可以跟着你吗?") + } +, + randoms:{ + dialogue:new Array( + "苗:嘿,扬… 你偷过东西吗?", + "苗:我喜欢麦卓… 东西是一辆很帅的自行车吧?", + "苗:那块酷酷的石头是什么,扬? 它可以让你及时回去吗?!", + "苗:我有点担心黏黏…扬,你最近在这周围见到过一只大猫咪吗?黏黏最后一次见我的时候告诉我说他要去东边的森林转转。", + "苗:黏黏说我不应该去危险的地方。所以回见啦,扬。", + "苗:你曾经在购物袋里待过吗?", + "苗:嘿,扬。你觉得用猫薄荷是种错误的行为吗?", + "苗:我敢打赌,要成为天选之人一定要花很多功夫的对吧,扬?") + } +, + philosophy:{ + dialogue:new Array( + "我不禁在想黏黏会遇到怎样可怕的情况… 你觉得我们死后会发生什么事? 你觉得我们如何能在短短一生之内完成所有想做的事情?", + "也许我们会不断重生,直至我们完成所有目标。 这样会不会更容易一些?", + "可是当我们走完旅程之后,有什么样的奖励等着我们呢? 难道我们只是消失无踪吗?", + "唔…") + } +, + icky:{ + dialogue:new Array( + "噢,你好啊,扬。", + "其实我并不叫黏黏。 我叫伊卡博德。", + "我希望苗小团儿没给你造成太多麻烦。", + "回见,扬。") + } +} +}; + +public static var miao_state:Dynamic= +{ +FIELDS:{ + init:{ + cur:"", + pos:0, + loop:2, + dirty:false, + finished:false + } +, + randoms:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + philosophy:{ + cur:"", + pos:0, + loop:3, + dirty:false, + finished:false + } +, + icky:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var generic_npc:Dynamic= +{ +DEBUG:{ + melos:{ + dialogue:new Array( + "你好,一切都还好吗?你找到我了!虽然我准备就待在这儿的。外面实在太冷了。", + "你可以因为这些可怕的房间而责怪我!我是用DAME地图编辑器把它们做出来的。", + "这游戏是我用FlashDevelop IDE和Flixel AS3做出来的!", + "噢,对了,游戏的音乐是我用REAPER DAW做的。有时候我还用Audacity。", + "我是从所有的电脑辐射中获取营养的…^你说的这不符合生物学准确性是什么意思?", + "嗨老妈!^还有老爸!", + "你想知道如何在20分钟之内通关这个游戏吗?", + "哈!你以为我会告诉你吗!", + "(…不过如果你能温柔一点问我的话…)") + } +, + marina:{ + dialogue:new Array( + "哇喔!嘿!", + "这个游戏里好多好多对话都是我写的!^ (…不过这句对话不是。现在是Melos在写哦。)", + "我用了Adobe Photoshop CS5、Graphics Gale Free Edition以及Windows 7的截图工具来制作画面!") + } +} +, +REDSEA:{ + first:{ + dialogue:new Array( + "这里的湿度对你的皮肤很有好处,不过却不利于你的头发。", + "我喜欢站在这儿。 这些日子以来,人们在酷热和极寒之间反复折腾。 气温的急剧变化对你的骨骼可不太好。", + "这就像是咀嚼冰块的坏习惯一样。 我的母亲咀嚼冰块直至她二十多岁。 现在她的发际线已经突破天际。") + } +, + second:{ + dialogue:new Array( + "你得确保换掉蝎子,然后把它们用报纸包住弄干。 你也不想制造出一个细菌滋生地吧。", + "为什么要弄出一个只有红色果冻块儿的自助餐呢? 仿佛他们想让我们得癌症一样。") + } +, + bomb:{ + dialogue:new Array( + "离我远点儿。", + "我认真的… 别靠近我。") + } +} +, +BLUE:{ + one:{ + dialogue:new Array( + "我不需要你的同情,扬。", + "嗯,你就这样在你的快乐小世界中一直生活下去吧,\"天选之人\"…", + "你知道的,扬,友情只是人们相互之间的小把戏罢了。 我们都是混蛋,人生之路走到最后,我们都只是孤身一人。", + "哈,我知道你讨厌我,扬。", + "我做得很好。", + "你当然不关心,也没人关心。") + } +} +, +HOTEL:{ + one:{ + dialogue:new Array( + "我知道城市可以很脏乱差,但是我喜欢看看外面的万家灯火。", + "它以自己独特的方式美丽着。 虽然不像星星那样无穷无尽,但是却又在人情味上增添了一些美妙的复杂性。", + "每盏灯后,都有一个怀揣着希望、恐惧和秘密的人… 往外看是一种充满恐惧和孤独的个人行为。", + "我觉得自己是爱着每一个窗户后面的人的。 我爱你、爱着人们,你们都是我的星星。 不管你的人生轨迹是怎样,不管你认为自己有多么堕落,我都爱着你。 今夜你最可爱…", + "抱歉,我又在胡说八道了。 不过谢谢你的聆听。") + } +} +, +REDCAVE:{ + easter_egg:{ + dialogue:new Array( + "嘿——,伙计…卸下行囊,待一小会儿可好?") + } +} +, +APARTMENT:{ + easter_egg:{ + dialogue:new Array( + "啊!你找到我了!") + } +} +, +CLIFF:{ + quest_normal:{ + dialogue:new Array( + "石人:你来的路上有没有被一块大石头击中? 有时当我生气了,我就会扔石头。 如果你被击中了,那么我得和你道歉。", + "石人:我母亲总说,如果我再这样继续下去,我最好离开山里再丢。 只要在她粉碎之前回来就好。") + } +, + second:{ + dialogue:new Array( + "石人:当你是一块石头,你可以目睹人类很多代的更迭。 你可以比最聪明的人类更加智慧。", + "石人:至少那确实是个办法。 我前不久把我的望远镜弄坏了,所以我没办法给你说到底发生了什么事。", + "石人:其实观察人类一点也不好玩,我觉得很无聊。") + } +, + quest_event:{ + dialogue:new Array( + "石人:噢,是的,我遇见过似乎迷路的人…他们告诉我,他们想去看看海滩。") + } +} +, +BEACH:{ + quest_normal:{ + dialogue:new Array( + "我不是一只龙虾,我是海螯虾。 我的名字是砍砍。", + "砍砍:你知道海洋最棒的地方在哪里吗? 是可以看到地平线。", + "砍砍:海洋就像是充满咸味的无穷大符号。", + "砍砍:可是拥挤的沙滩却剥夺了它的优雅。") + } +, + second:{ + dialogue:new Array( + "砍砍:你听说过虾蛄吗? 它有16个光感受器可以用来感知紫外线。 你能想象看到更加广泛的色彩是什么样的感受吗?", + "砍砍:也许会很漂亮。 然后,我们就会因为各自看到的颜色而用各种理由讨厌起他人来。") + } +, + quest_event:{ + dialogue:new Array( + "砍砍:你在找人对吗?我记得当云朵飘过太阳的时候我就坐在这儿了。当太阳被遮挡住,有人向我走来,向我询问某件东西在哪里。我不记得他们问的是什么了,但是他们离开了,说准备前往森林。") + } +} +, +FOREST:{ + quest_normal:{ + dialogue:new Array( + "詹姆斯:浆果是很棒的一类食物。 我喜欢浆果。", + "詹姆斯:请一定不要在浆果上便便。", + "詹姆斯:这个季节里我已经啪啪啪过18次了。 而且,我已经吃了389串浆果了。", + "詹姆斯:你给詹姆斯带浆果了吗?") + } +, + second:{ + dialogue:new Array( + "詹姆斯:我写了一首诗:\n^我喜欢吃浆果\n^它们让我快乐\n^你要问我喜欢有多深?\n^月亮代表我的心!", + "詹姆斯:你喜欢蓝莓多一点还是树莓多一点?", + "詹姆斯:你给詹姆斯带浆果了吗?") + } +, + quest_event:{ + dialogue:new Array( + "詹姆斯:有人来过。他们不是为了浆果来的。他们去了西边湖泊的东南方向。") + } +} +, +FIELDS:{ + easter_egg:{ + dialogue:new Array( + "奥利弗:嗨,我是兔子奥利弗。", + "奥利弗:我还有好多谷物没吃呢!我超爱谷物的。", + "奥利弗:这个盒子太大了。感觉永远没有尽头!", + "奥利弗:永远吃不完的谷物!", + "奥利弗:唔…也许这样也不错。") + } +, + bush:{ + dialogue:new Array( + "兰克:哦呵呵,愚蠢的扬!扫帚可不是用来砍灌木的工具!") + } +, + quest_normal:{ + dialogue:new Array( + "兰克:我砍掉这些灌木是为了生存。 有时候砍灌木的时候你能找到金子! 哦呵呵!", + "兰克:这里的经济状况不太好…", + "兰克:有时候光靠砍掉灌木真的很难养活妻子和孩子——我们很多时候连足够的食物都没有…不过我们倒是从来不缺可以点火的地方! 哦呵呵呵!") + } +, + quest_event:{ + dialogue:new Array( + "兰克:呃?对!有人来过。他们说要去什么地底迷宫…我敢打赌,他们在那儿能遇到好多灌木,你说是吧,扬?哦呵呵呵!") + } +, + marvin:{ + dialogue:new Array( + "马文:哦,嘿,感觉怎样?", + "马文:贾斯汀在哪儿?", + "马文:这附近并没有六月天乐队啊…") + } +, + chikapu:{ + dialogue:new Array( + "奇卡奇!", + "奇卡 奇卡!", + "奇——^\n卡——^\n噗————————!!!") + } +, + hamster:{ + dialogue:new Array( + "鲍勃:仓鼠鲍勃喜欢以第三人称来形容自己。", + "鲍勃:省略符号是一切不好事情的根源。", + "鲍勃:安静!我忙着散发仓鼠光环呢!", + "鲍勃:……我想你最好是这么做…但是… 如果你做错了,你会因为做错而把事情变得更好吗?", + "鲍勃:真男人从不哭泣…好吧,也许他只是让一滴眼泪在眼眶里来回打转。哈利穿过了刮着大风的莫哈维沙漠,而且没戴头盔和护目镜。可是他从来没流过泪。", + "鲍勃:这个游戏是由为无数多的打字员工作的无数多的猴子们设计的。", + "鲍勃:我想念詹姆斯…") + } +, + electric:{ + dialogue:new Array( + "基路伯:咖喱又黄又辣!", + "基路伯:对聪明的对手使用,伤害将增加!", + "基路伯:你获得2点经验!", + "基路伯:听着,我的电话号码是0*1-51*7-*4386") + } +} +, +TRAIN:{ + quest_normal:{ + dialogue:new Array( + "我在这儿干嘛?问得好!我只是偶然在这儿的。我正在忙着躲藏呢,这儿很安全,只要你不要离开太远,让那些家伙找到你。", + "似乎我还是比较幸运的。这些死去之人的躯体遍布此地——他们是怎么死的?实在让人太想弄明白这件事是怎样发生的。他们是被什么怪兽攻击了吗?所以被推倒,跌落在那些尖刺上?", + "这样真是有些糟糕。我希望这种事情不要发生在我身上。身体上的疼痛实在是太可怕了。") + } +, + quest_event:{ + dialogue:new Array( + "噢…现在我在想啊,方才有人从这儿路过,说他们在寻找什么东西…他们看起来和你有点像呢!抱歉,我不记得是什么时候的事儿了。在这里真的很难有时间概念。但是他们说准备去附近的小镇上。") + } +} +, +SUBURB:{ + quest_normal:{ + dialogue:new Array( + "你好。", + "你在找东西吗?", + "你在看什么?", + "不,我不是这镇上的居民。你能看见我并且和我说话可真是件诡异的事情啊,因为我完全无法和其他人互动。这样的杀手在这儿还有很多,似乎都没被人察觉呢。真是奇怪。") + } +, + quest_event:{ + dialogue:new Array( + "是的,我看到有人路过。他们在找什么东西。我不知道那件“东西”在哪儿能找到。而他们匆匆离开了,说是要去太空的交替区,这听起来好棒啊。") + } +} +, +SPACE:{ + quest_normal:{ + dialogue:new Array( + "哇啊 哇啊 哇啊————你、是、谁???", + "我是一名流浪者…这是从A地到B地的著名的旅途休息站之一。", + "什么是“A”???这是我的故乡…而我要去B看望一位老朋友…旅途很是漫长…但是我已经做好牺牲的准备了…你呢???让生活充满挑战与刺激吧!!!") + } +, + quest_event:{ + dialogue:new Array( + "噢——在找另一个人类——我知道了。^让我读取一下内存…读取(0X0C00400 , STDOUT , 100);\n………………\n………………\n啊、哈…\n 那个人有闪电般敏锐的洞察力,他们说要去一个维护得很好的旷野里的小屋。\n现在我在想啊…你长得真像他们呢!!!你真的不是他们本人吗??哈?嗯?") + } +} +, +GO:{ + quest_normal:{ + dialogue:new Array( + "你真的是…啊,呃。很棒。", + "发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\"") + } +, + quest_event:{ + dialogue:new Array( + "发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\"") + } +} +}; + +public static var generic_npc_state:Dynamic= +{ +DEBUG:{ + melos:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marina:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDSEA:{ + first:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bomb:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BLUE:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +HOTEL:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +REDCAVE:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +APARTMENT:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +CLIFF:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +BEACH:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FOREST:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + second:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +FIELDS:{ + easter_egg:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + bush:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + marvin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + chikapu:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hamster:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + electric:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +TRAIN:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SUBURB:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +SPACE:{ + quest_normal:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +, +GO:{ + quest_normal:{ + cur:"", + pos:0, + loop:1, + dirty:false, + finished:false + } +, + quest_event:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var geoms:Dynamic= +{ +SPACE:{ + gray1:{ + dialogue:new Array( + "你好呀,你见过方块了吗?", + "方块是空间里很棒的统治者。当然,这儿的其他统治者也都在尽力做到最好。") + } +, + gray2:{ + dialogue:new Array( + "你觉得这块空间如何?还算漂亮吧,不是吗?", + "世界的交汇点!") + } +, + gray3:{ + dialogue:new Array( + "我们这里没有灰色金字塔。我们使用了特殊的设备让我们能投射到这儿。", + "我们为什么要那么做?因为我们想要和方块朋友们说话,让所有方块联合起来。") + } +, + graydead:{ + dialogue:new Array( + "*bzrrrrt*") + } +, + grayspin:{ + dialogue:new Array( + "…这个全息投影设备运作正常吗?", + "不正常?^…^靠!") + } +, + color1:{ + dialogue:new Array( + "你见过方块了吗?它做的事情都好酷哦!我听说有一次它站在一个悬崖边上将近12秒这么多。天呐!你知道那对于悬崖挺立者联盟来说意味着什么吗?你不知道?好吧,意味可大了!") + } +, + color2:{ + dialogue:new Array( + "方块做了许多有趣的事情!", + "你听到了吗?很明显,马上就轮到我来统治了!我想,再过几分钟就好。") + } +, + color3:{ + dialogue:new Array( + "我来自塔糖,要被运送到台北。你问我为什么会在这儿?噢,我只是想和方块打声招呼!", + "别这么沮丧啊!这个地方是有点奇怪,所以才没能打动所有的访客吧。可是我们只能给你说,这个地方是全无恶意的。") + } +, + colordead:{ + dialogue:new Array( + "(…它在小憩吗?)") + } +} +}; + +public static var geoms_state:Dynamic= +{ +SPACE:{ + gray1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gray3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + graydead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + grayspin:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color1:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color2:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + color3:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + colordead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var redboss:Dynamic= +{ +REDCAVE:{ + before_fight:{ + dialogue:new Array( + "我们都是从痛苦中出生,又在痛苦中死去。 我们经历着如此的循环。 永远无法逃离。") + } +, + after_fight:{ + dialogue:new Array( + "这就是你对于反抗者的惩罚吗?") + } +} +}; + +public static var redboss_state:Dynamic= +{ +REDCAVE:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var circus_folks:Dynamic= +{ +CIRCUS:{ + before_fight:{ + dialogue:new Array( + "你为什么不让“观察者”牺牲? 你为什么不让我们得到救赎?") + } +, + after_fight:{ + dialogue:new Array( + "…我们没能让你为你对我们造成的干扰而付出代价。 然而…你却回报给我们以自由。 谢谢你,扬。 愿“观察者”永远庇佑你。") + } +} +}; + +public static var circus_folks_state:Dynamic= +{ +CIRCUS:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var wallboss:Dynamic= +{ +CROWD:{ + before_fight:{ + dialogue:new Array( + "见到你正好啊,扬。 好久没见了。 你现在还在玩任地狱的游戏吗?") + } +, + after_fight:{ + dialogue:new Array( + "天啊,扬,你什么时候长大的? 你知道的,你迟早得学会如何他人相处。") + } +} +}; + +public static var wallboss_state:Dynamic= +{ +CROWD:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var eyeboss:Dynamic= +{ +HOTEL:{ + before_fight:{ + dialogue:new Array( + "我们这儿有所有最好的便利设施。 你觉得这个水池怎么样?") + } +, + middle_fight:{ + dialogue:new Array( + "我们最先进的健身中心你觉得如何?") + } +, + after_fight:{ + dialogue:new Array( + "希望你在这儿度过开心的时光!") + } +} +}; + +public static var eyeboss_state:Dynamic= +{ +HOTEL:{ + before_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + middle_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + after_fight:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_walker:Dynamic= +{ +SUBURB:{ + words_adult:{ + dialogue:new Array( + "今天是美好的一天。", + "谢谢你帮我挠背上的痒痒——我根本碰不到那儿。", + "我听说当地餐馆做的蛋挺好吃的。我有优惠券哦。", + "你目睹了今天的车祸没?太可怕了!那人正发着信息呢。太可怜了,他还那么年轻!", + "我儿子没能成功加入初中校队里。实在是太可惜了。我们为他的运动生涯已经投入了太多心血。", + "今天是感恩节。我要感谢的事情有许多。我已经等不及要参加明天早上的甩卖了。我要交易好多东西。", + "啊,我觉得我上班要迟到了。", + "我急着回家呢,在亲家上门之前我得赶紧收拾收拾。", + "走过路过不要错过我们的大甩卖!", + "欢迎大家来看看!") + } +, + words_teen:{ + dialogue:new Array( + "我没有去看最新的电影。") + } +, + words_kid:{ + dialogue:new Array( + "我绝对不会去看新的卡通片!") + } +, + family:{ + dialogue:new Array( + "欢迎来到我们的家,陌生人!你看起来很眼熟啊。这是个和平的小镇。非常宁静,很少有访客到来。", + "你喜欢戴夫状态吗?我的兄弟戴夫给我听了这首他写的超酷的曲子!") + } +, + older_kid:{ + dialogue:new Array( + "我的朋友喜欢听“雷黑德”写的“毫无惊喜”的曲子,然后抱怨着这个地方。是啊,这里是有些缺点,可是,至少你得心存感激啊!或者至少为这个地方做点什么吧!那些人简直是…噢,抱歉。有时候我就想做点什么…", + "我觉得我得去我的博客上写点什么。", + "你看起来很茫然。", + "我在电视上播放的体育新闻里根本听不到和我观点相同的看法,不过我的爸妈就是很喜欢看。") + } +, + hanged:{ + dialogue:new Array( + "尸体上有行字:\"将自己置身危险之中。\"") + } +, + festive:{ + dialogue:new Array( + "噢,外面发生什么事了吗?在庆祝节日还是举办庆典?", + "外面好像有骚动!你最近往窗外看了吗?我好想知道到底是什么情况。") + } +, + paranoid:{ + dialogue:new Array( + "我的房子有许多窗户。我不喜欢窗户。因为总感觉有人在往里看。而且你知道的,外面总是在不停发生着各种事情。我无法总是那么安静——因为外面对我有干扰。", + "杀人犯?什么?外面?你在说什么啊?你在开玩笑吧?这个镇上从来就没出现过谋杀案,但是…你这样一说还真把我吓到了…也许你该离开了。", + "请出去。") + } +, + dead:{ + dialogue:new Array( + "从尸体上看来,这名女性是被人用钝器殴打致死的。", + "伙计,坦白讲,好吧…") + } +} +}; + +public static var suburb_walker_state:Dynamic= +{ +SUBURB:{ + words_adult:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_teen:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + words_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + family:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + older_kid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + hanged:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + festive:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + paranoid:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dead:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var suburb_blocker:Dynamic= +{ +SUBURB:{ + one:{ + dialogue:new Array( + "噢,是你!你看起来好眼熟…在你杀死更多居民之前我是不能动的,你记得吗?过来一点。", + "根据这本小册子所说…你只需要再杀几个人就可以了!继续吧。", + "我们还需要一具尸体就够了,继续吧。", + "做得好。你可以随意进去。我也不知道里面有什么。明天同一时间再见吧,好吗?或者晚上?") + } +} +}; + +public static var suburb_blocker_state:Dynamic= +{ +SUBURB:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var card:Dynamic= +{ +ETC:{ + one:{ + dialogue:new Array( + "我不介意被树木盯着。", + "她在哪里?!", + "当你孤单之时,我会与你同在,扬。", + "你是奥柯乔特吗? 我妈妈总是给我说要当心危险的奥柯乔特。", + "泥猴啊,扬! 在介里见到你真高兴! 泥要不要在这儿坐一会儿? 偶正在泡茶哦!", + "呼、呼、呼、呼、呼、呼、呼、呼、呼、圣坛、讲道坛、祭坛、彩色玻璃窗…", + "限时优惠!买一送一——仅此一天!", + "还记得停电那天你点亮蜡烛的时候吗?", + "唔,昨晚你的枕头真舒适。", + "这样他们就会记得称我为“画着烟熏妆”的家伙。", + "东西和我是超棒的组合。", + "我是正在接受培训的天选之人!!!", + "你会否觉得,不管你做什么,你都无法阻止这个世界消亡?", + "当心森林蘑菇…", + "抱歉。 这是我性格使然。", + "你说“只是一块石头”是什么意思?? 你知道不,石头也有资格上卡牌!", + "授人以鱼不如授人以渔。这样他就可以和他儿子吉米有时间好好相处了。", + "有时候解决问题只需要去散散步。", + "为什么每次你四处走动的时候,蝙蝠就会突然飞下来?", + "不,是*你*需要背带!", + "你现在高兴了吗?", + "别在我周围制造暴力。", + "我一直都想成为料理铁人。", + "我妈妈总是给我说,“如果你弯腰太久,你的脊椎就回不了原样了!”", + "你觉得开心吗,人类?", + "...", + "从科学的角度来讲,蟾蜍是青蛙的一种。", + "哈哈哈! 耶! 我知道!", + "哦,你也在收集卡牌吗? 真棒啊,英。", + "他们总是说:\"离开你的电脑!否则你永远交不到朋友!\"", + "我只是名义上的统治者罢了。", + "我敢打赌,你觉得你“让我的工作变得有趣”了!", + "我讨厌斜线。", + "别给我用抗过敏药物。", + "刷这张卡就可以解锁你房间里的门!", + "我做得很棒。", + "……………??", + "谁雕刻出我们的?", + "希望你在这儿度过开心的时光!", + "既然你能走到这里,证明你还是有点本事的。", + "我来这儿是为了将你带入歧途。", + "你也喜欢金字塔吗!", + "这是个相同的该死游戏,日复一日进行着,而报酬却少得可怜。", + "让我静静!我的姓氏才不是什么萨克斯!", + "至少我不是根棍子。", + "你说钱不会对树造成任何影响是什么意思?哦呵呵呵呵!", + "我只是一个幻觉罢了。", + "我要把气出在你身上。") + } +} +}; + +public static var card_state:Dynamic= +{ +ETC:{ + one:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +public static var misc:Dynamic= +{ +any:{ + controls:{ + dialogue:new Array( + "按下", + "以设置控制选项。", + "以取消。", + "上", + "下", + "左", + "右", + "跳跃", + "攻击", + "菜单", + "按下", + "以退出", + "以设置控制选项。") + } +, + title:{ + dialogue:new Array( + "请使用\n方向键来调整\n窗口大小\n直至你无法看见\n黑框\n\n按下", + "当完成之后。", + "ANODYNE 镇痛", + "Melos Han-Tani\nMarina Kittaka", + "任意键", + "按下", + "以开始", + "版本", + "继续游戏", + "新的游戏", + "你确定吗?\n否\n是", + "真的吗?\n不是\n是呀", + "不能后悔哦!\n算了吧\n我知道", + "死亡数", + "卡牌数", + "《镇痛》支持\n多种手柄。\n\n你打算用手柄玩儿吗?\n\n是 否\n\n如果是的话,请现在连接。\n\n使用方向键移动\n\n使用C键、空格键或回车键\n进行选择\n\n选“是”使用系统默认设置\n", + "注意事项\n\n如果你在游戏中遇到输入延迟\n你需要返回主界面\n重新进入《镇痛》\n\n按下C键以继续\n\n图形用户界面显示错误?\n按下下列键可重调设备。", + "再次按下返回键可退出。\n未保存的进度将丢失。") + } +, + gui:{ + dialogue:new Array( + "菜单=进入", + "保存中…") + } +, + map:{ + dialogue:new Array( + "地图", + "当前房间", + "门/退出", + "无地图", + "返回\n连结处", + "返回\n入口处") + } +, + items:{ + dialogue:new Array( + "物品", + "正常", + "调换", + "延伸", + "宽度", + "一双弹力鞋——按下", + "以跳跃!", + "一双自行车鞋。", + "一个空纸箱。", + "一把在“观察者”的神殿找到的钥匙。", + "一把在红色地底洞穴找到的钥匙。", + "一把在山洞中找到的钥匙。") + } +, + cards:{ + dialogue:new Array( + "卡牌", + "卡牌") + } +, + save:{ + dialogue:new Array( + "保存", + "已保存!", + "错误", + "保存并返回\n标题界面", + "返回标题界面", + "保存并退出", + "退出游戏", + "死亡数:") + } +, + config:{ + dialogue:new Array( + "配置", + "设置键位", + "设置音量", + "在保存点可\n自动保存:", + "开启", + "关闭", + "更改分辨率:", + "UI配置", + "触摸+方向键", + "仅启用方向键", + "仅启用触摸", + "移动输入:", + "分辨率:", + "窗口模式", + "按比例缩小", + "伸展", + "缩放:", + "语言:", + "ja", + "en", + "ko", + "拉拽按钮直至满意为止。\n\n点击菜单以继续。\n\n", + "调整窗口大小", + "配置手柄") + } +, + secrets:{ + dialogue:new Array( + "你正在前往中!", + "曾经是一位著名的泡泡魔法师的财物。", + "如果你的图像受到了干扰", + "这颗心没有名字。", + "请参观电子怪兽的世界。", + "一座猫咪雕像。可爱而无用。", + "噢天啊!!!!", + "噢不!!!!", + "这是黑色的。", + "这是红色的。", + "这是绿色的。", + "这是蓝色的。", + "这是白色的。", + ":选择", + ":返回") + } +, + swap:{ + dialogue:new Array( + "抱歉!", + "在这里无法进行调换。", + "扬无法在此使用力量进行调换。") + } +, + keyblock:{ + dialogue:new Array( + "这扇门上了锁。") + } +, + treasure:{ + dialogue:new Array( + "某种神秘力量阻止了这个宝箱被人打开。", + "扫帚的把手上雕刻着:按下", + "来扫动。", + "这把一次性使用的钥匙可以开启一个锁住的障碍物。", + "一双神秘的靴子,没什么特别的,不过上面写着\"按下", + "\"。", + "扫帚的延伸处上写着\"装备菜单里的宽度升级可以使扫帚朝左右方向释放有害灰尘。\"", + "扫帚的延伸处上写着\"装备菜单里的延伸升级可以使扫帚朝前方释放有害灰尘。\"", + "扫帚的延伸出上写着:\"你好,扬。使用调换升级可以改变两块砖的位置。你可能还需要好一阵才能到处使用此功能,但是它会对你大有帮助。\"", + "你找到了一颗心!!!最大生命值增长了…零。", + "戈德曼:什么?不在这儿?那个店主肯定把它偷了!") + } +, + dust:{ + dialogue:new Array( + "现在你的扫帚已经充满了灰尘!再次攻击可以释放灰尘。") + } +, + checkpoint:{ + dialogue:new Array( + "保存游戏?\n 是\n 否", + "站在检查点上,按下", + "以储存你的游戏进度。如若死亡,此处将为你的重生点。") + } +, + rock:{ + dialogue:new Array( + "石头上潦草地写着:", + "你没朋友") + } +, + door:{ + dialogue:new Array( + "此传送门似乎没有被激活。") + } +, + keyblockgate:{ + dialogue:new Array( + "大门稳稳地立在那里。如果它没有感知到有四张卡牌的存在,它是不会打开的…", + "感知到四张卡牌的存在,大门决定打开。", + "大门倔强地紧闭着。", + "大门感知到了全部卡牌的存在,它决定打开。", + "大门感知到了足够卡牌的存在,它决定打开。", + "大门打开了!", + "大门还是紧闭着。") + } +, + solidsprite:{ + dialogue:new Array( + "路牌指向东方,但是路牌上的文字已经看不太清。", + "路牌指向西方,但是路牌上的文字已经看不太清。", + "路牌上的文字已经看不太清。") + } +, + mitra:{ + dialogue:new Array( + "嘿,扬!", + "这双自行车鞋是给我的吗? 哇哦! 谢谢你,扬! 我一直想要这个呢,这样踩在东西的踏板上就更搭配啦。 这儿,扬,我用我的鞋子和你交换! 它们可以让你跳得很高!只要你按下", + "就可以使用它们跳起来了!", + "你好,扬! 你注意到我有什么不同了吗?^… ^… 哦,好吧,我有一双新的自行车鞋了,你看! 它们可以卡入东西的踏板里面。因为我已经不需要旧的鞋子了,我想把它们送给你!它们可以让你跳得很高!只要你按下", + "就可以使用它们跳起来了!", + "好了,保重吧!", + "来吧,试试它们! …它们没什么味儿的。", + "很酷吧?", + "哇哦,这双自行车鞋是从芬缇的店里买来的吗? 你准备把它们送给我? 谢谢你,扬,太感谢你了! 这儿,我把我的旧鞋子给你作为回报吧——我想它们会对你很有帮助的! 鞋子上面写着\"按下", + "以跳跃\"。 我完全不明白这是什么意思,因为鞋子上面根本没有\"", + "\"键啊…") + } +, + tradenpc:{ + dialogue:new Array( + "芬缇:欢迎欢迎,我亲爱的朋友,扬! 我的名字是帕拉珊德和夫——芬缇帕拉珊德和夫! 在我店里随便看看吧,也许你会发现什么想要的东西!", + "芬缇:感谢给我盒子!", + "芬缇:啊,一个盒子!太谢谢你了!这样我就可以在晚上把我的存货带回家,早上再运过来了!", + "等等…不在这儿!它到哪儿去了?好吧,是这儿,让我来抚平你的伤口!", + "为了表示感谢,你把这双时尚的自行车鞋拿去吧!", + "多么晴朗的造成啊,是吧,我的朋友? 一个适合购物的早晨!我希望能有一个盒子,这样我就可以装着我的货物到处走。", + "太糟糕了,看起来你的钱不够啊! 等你有足够的钱之后再回来吧!", + "芬缇:啊,你眼光真不错!你需要一件更好的武器对吧?只需要$499.99!你就可以将敌人杀个片甲不留!", + "芬缇:那个钱袋可以存放你在“大地”中找到的钱币!仅需$869.99你就可以拥有它!", + "芬缇:哦吼吼,这儿有一件特殊的物品:夹入式自行车鞋,穿上它你就是时尚时尚最时尚的人!现在特价,只要$299.99!", + "芬缇:用你的小扫帚扫开灰尘实在是太累了对吗? 要想根除有害灰尘的烦恼,就使用这款最先进的吸尘器吧!仅需$749.99或者你也可以选择分期付款,每月只要$199.99!", + "为了表示感谢,这个丑陋的——我是说,漂亮的,收藏版的卡牌你就拿去吧^") + } +, + ending:{ + dialogue:new Array( + "Anodyne 镇痛\n-------\n\n\n\n游戏由\n\nMelos Han-Tani\n\n和\n\nMarina Kittaka\n\n为您呈献\n\n-------------", + "游戏于\n\n2012年三月\n\n至\n\n2013年一月间制作", + "游戏设计\n------\n两人协同", + "程序\n-----------\nMelos,使用\nFlixel库来制作\n动作脚本 3.\n\n\n\n美术\n---\nMarina\n", + "音乐和音效\n---------\nMelos,使用REAPER\n和一系列免费音色库。\n\n\n\n对话\n--------------\n大部分由Marina制作\n", + "故事\n-----\n两人协同\n中文本地化:\n一只小雨", + "特别感谢\n我们辛勤工作的测试员!\n--------------\n\nMarina,辛勤地为游戏排错。\n\nEtan,一直以来给予的支持,\n并且帮忙找到许多错漏。", + "Olivia——\n谢谢你,姐姐!\n\nRunnan、Nick\nReineke、\nEmmett、Poe、\nAD1337、\n Dennis、Andrew、\nAndrew MM\n Carl、Max、Amidos、\nLyndsey、Nathan\n", + "Melos想感谢:\n\n母亲和父亲的长期支持。\n\nS\n\n许多TIGSourcers以及\n其他与我们交流过的开发者!\n\nMarina,\n为整个游戏的开发作出了\n不可估量的付出。", + "Adobe、Adam\nSaltsman、\nFlashDevelop开发者、\nREAPER开发者、\nDAME制作者\nDesura、\nGamersgate\nIndieDB、\nTIGSource\n\n\n以及其他支持我的朋友们\n感谢你们!!\n\n最后,我想感谢\nTina Chen\n我一直以来的朋友\n她不仅给予我长期支持\n还介绍我与Marina相识。", + "Marina想感谢\n\nColin Meloy,\n扩展了我的词汇量\n\nTsugumo,问我\n“你想要成为一位像素艺术家吗”?\n\n我的家人,\n给予我支持与食物。\n\nDaniel,作为一名\n\"独立游戏开发者\"\n,一直伴随着我成长。", + "Mo,给予我充分的信任。\n\nTina,\n介绍我与Melos认识。\n\nMelos,和我一同制作游戏\n并且给予我信任。", + "演员表\n----\n\n\n史莱姆\n\n\n烦恼之物\n\n\n呼呼\n\n\n谢尔迪\n\n\n希尔", + "搬运者\n\n\n开开关关\n\n\n四射\n\n\砍伐者\n\n\n流氓\n", + "狗\n\n\n青蛙\n\n\n旋转体\n\n\n人\n\n\n墙\n\n", + "老鼠\n\n\n气态人\n\n\n银鱼\n\n\n冲撞者\n\n\n翻滚者\n\n\n看守人\n\n", + "清洁女工\n\n\n爆炸植物\n\n\n管理者\n\n\n", + "狮子\n\n\n扭曲\n\n\n火焰柱\n\n\n仆人\n亚瑟\n哈韦拉", + "追随者\n\n\n爱德华\n\n\n渔夫\n\n\n红沃克\n\n休斯", + "兔子\n\n\n黏黏\n\n\n店主\n\n苗小团儿\n\n兰克\n\n戈德曼", + "胸腔\n\n詹姆斯\n\n蘑菇\n\n克里克森\n\n石人\n\n居民", + "追踪者\n\n\n实体\n\n\n空间面\n\n\方块王", + "扬\n\n\n麦卓\n\n\n贤者\n\n\n荆棘", + "我们要感谢的还有\n亲爱的你!\n谢谢你玩我们的游戏!\n\n\n希望你喜欢它。", + "\n\n\n\n\n\n\n\n", + "现在,你可以使用调换功能\n无拘无束地探索\n扬的世界。\n") + } +, + elevator:{ + dialogue:new Array( + "要去几楼呢?", + "1\n", + "2\n", + "3\n", + "4\n", + "取消") + } +} +}; + +public static var misc_state:Dynamic= +{ +any:{ + controls:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + title:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + gui:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + map:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + items:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + cards:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + save:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + config:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + secrets:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + swap:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + treasure:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + dust:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + checkpoint:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + rock:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + door:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + keyblockgate:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + solidsprite:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + mitra:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + tradenpc:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + ending:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +, + elevator:{ + cur:"", + pos:0, + loop:0, + dirty:false, + finished:false + } +} +}; + +} \ No newline at end of file diff --git a/intra/source/data/SoundData.hx b/intra/source/data/SoundData.hx new file mode 100644 index 0000000..0f840de --- /dev/null +++ b/intra/source/data/SoundData.hx @@ -0,0 +1,849 @@ +package data +{ +import helper.Cutscene; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSave; +import org.flixel.FlxSprite; +import org.flixel.FlxBasic; +import global.Registry; +import org.flixel.FlxSound; +class SoundData +{ + + + //[Embed(source="../../../mp3/title.mp3")] public static var Title_Song:Class; + public var TITLE:FlxSound=new FlxSound(); + private var Title_Samples:Int=2491776;//checked 9-15-12 + + //[Embed(source="../../../mp3/gameover.mp3")] public static var GameOver_Song:Class; + public var GameOver:FlxSound=new FlxSound(); + private var GameOver_Samples:Int=1397376;//checked 9-15-12 + + //[Embed(source="../../../mp3/blank.mp3")] public static var Blank_Song:Class; + public var BLANK:FlxSound=new FlxSound(); + private var Blank_Samples:Int=1568576;//checked 9-15-12 + + //[Embed(source="../../../mp3/nexus.mp3")] public static var Nexus_Song:Class; + public var NEXUS:FlxSound=new FlxSound(); + private var NEXUSSAMPLES:Int=2983680;//checked 9-15-12 + + //[Embed(source="../../../mp3/street.mp3")] public static var Street_Song:Class;//street + public var STREET:FlxSound=new FlxSound(); + private var Street_Samples:Int=2118528;//checked 9-15-12 + + //[Embed(source="../../../mp3/overworld.mp3")] public static var Overworld_Song:Class;//OVERWORLD + public var OVERWORLD:FlxSound=new FlxSound(); + private var Overworld_Samples:Int=3646080;//checked 9-15-12 + + //[Embed(source="../../../mp3/mitra.mp3")] public static var Mitra_Song:Class; + public var MITRA:FlxSound=new FlxSound(); + private var MITRASAMPLES:Int=2290176;//checked 9-15-12 + + //[Embed(source="../../../mp3/bedroom.mp3")] public static var Bedroom_Song:Class;//Bedroom + public var BEDROOM:FlxSound=new FlxSound(); + private var Bedroom_Samples:Int=5293440;//checked 9-15-12 + + + public var BOSS:FlxSound=new FlxSound(); + + //[Embed(source="../../../mp3/bedroom-boss.mp3")] public static var BedroomBoss_Song:Class; + public var BEDROOMBOSS:FlxSound=new FlxSound(); + private var BEDROOMBOSSSAMPLES:Int=1580491; + + + //[Embed(source="../../../mp3/fields.mp3")] public static var Fields_Song:Class; + public var FIELDS:FlxSound=new FlxSound(); + private var FIELDSSAMPLES:Int=6298125;//checked 9-15-12 + + ///* + //[Embed(source="../../../mp3/beach.mp3")] public static var Beach_Song:Class; + public var BEACH:FlxSound=new FlxSound(); + private var Beach_Samples:Int=3479040; + + + + //[Embed(source="../../../mp3/red_cave.mp3")] public static var Red_Cave_Song:Class; + public var REDCAVE:FlxSound=new FlxSound();//checked 10-7-12 + private var Red_Cave_Samples:Int=4021920; + + + + //[Embed(source="../../../mp3/red_sea.mp3")] public static var Red_Sea_Song:Class; + public var REDSEA:FlxSound=new FlxSound(); + private var Red_Sea_Samples:Int=2723328; + + //[Embed(source="../../../mp3/redcave-boss.mp3")] public static var RedcaveBoss_Song:Class; + public var REDCAVEBOSS:FlxSound=new FlxSound(); + private var REDCAVEBOSSSAMPLES:Int=1881600; + + //[Embed(source="../../../mp3/windmill.mp3")] public static var Windmill_Song:Class; + public var WINDMILL:FlxSound=new FlxSound(); + private var WINDMILLSAMPLES:Int=5019267;// checked 10-20-12 + + // END EXTENDED DEMO + + //[Embed(source="../../../mp3/apartment.mp3")] public static var Apartment_Song:Class; + public var APARTMENT:FlxSound=new FlxSound(); + private var APARTMENTSAMPLES:Int=8192009; + + + //[Embed(source="../../../mp3/forest.mp3")] public static var Forest_Song:Class; + public var FOREST:FlxSound=new FlxSound(); + private var FORESTSAMPLES:Int=6542962;// 10-26 + //[Embed(source="../../../mp3/cliff.mp3")] public static var Cliff_Song:Class; + public var CLIFF:FlxSound=new FlxSound(); + private var CLIFFSAMPLES:Int=5840402;// 10-26 + //[Embed(source="../../../mp3/crowd.mp3")] public static var Crowd_Song:Class; + public var CROWD:FlxSound=new FlxSound();//checked 10-7-12 + private var CROWDSAMPLES:Int=6919426; + //[Embed(source="../../../mp3/space.mp3")] public static var Space_Song:Class; + public var SPACE:FlxSound=new FlxSound();//1-8-12 + private var SPACESAMPLES:Int=4907395; + //[Embed(source="../../../mp3/terminal.mp3")] public static var Terminal_Song:Class; + public var TERMINAL:FlxSound=new FlxSound(); + private var TERMINALSAMPLES:Int=7560503;// 1-8-12 + //[Embed(source="../../../mp3/cell.mp3")] public static var Cell_Song:Class; + public var CELL:FlxSound=new FlxSound(); + private var CELLSAMPLES:Int=5409600;//11-3-12 + + //[Embed(source="../../../mp3/suburb.mp3")] public static var Suburb_Song:Class; + public var SUBURB:FlxSound=new FlxSound(); + private var SUBURBSAMPLES:Int=3182553; + + + //[Embed(source="../../../mp3/roof.mp3")] public static var Roof_Song:Class; + public var ROOF:FlxSound=new FlxSound(); + private var ROOFSAMPLES:Int=7112084; + + + //[Embed(source="../../../mp3/circus.mp3")] public static var Circus_Song:Class; + public var CIRCUS:FlxSound=new FlxSound(); + private var CIRCUSSAMPLES:Int=7566553; + + //[Embed(source="../../../mp3/hotel.mp3")] public static var Hotel_Song:Class; + public var HOTEL:FlxSound=new FlxSound();// 12-2-12 + private var HOTELSAMPLES:Int=9328688; + + //[Embed(source="../../../mp3/happy.mp3")] public static var Happy_Song:Class; + public var HAPPY:FlxSound=new FlxSound(); + private var HAPPYSAMPLES:Int=4456421;//checked 11-3-12 + + + + + //[Embed(source="../../../mp3/blue.mp3")] public static var Blue_Song:Class; + public var BLUE:FlxSound=new FlxSound(); + private var BLUESAMPLES:Int=6755745;//12-8-12 + + + + //[Embed(source="../../../mp3/go.mp3")] public static var Go_Song:Class; + public var GO:FlxSound=new FlxSound(); + private var GOSAMPLES:Int=8090854; + + + //[Embed(source="../../../mp3/sagefight.mp3")] public static var Sagefight_Song:Class; + public var SAGEFIGHT:FlxSound=new FlxSound();// checked 10-20-12 + private var SAGEFIGHTSAMPLES:Int=7467224; + private var SAGEFIGHTLOOP:Int=2061770; + + + + //[Embed(source="../../../mp3/happy-init.mp3")] public static var Happyinit_song:Class; + public var HAPPYINIT:FlxSound=new FlxSound(); + private var HAPPYINITSAMPLES:Int=1128960; + + //[Embed(source="../../../mp3/ending.mp3")] public static var Ending_Song:Class; + public var ENDING:FlxSound=new FlxSound(); + private var ENDINGSAMPLES:Int=15323054; + + //[Embed(source="../../../mp3/briar-fight.mp3")] public static var BriarFight_Song:Class; + public var BRIARFIGHT:FlxSound=new FlxSound(); + private var BRIARFIGHTSAMPLES:Int=5171605;// 11-25-12 + + + //[Embed(source="../../../mp3/pre_terminal.mp3")] public static var PreTerminal_Song:Class; + public var PRETERMINAL:FlxSound=new FlxSound(); + private var PRETERMSAMPLES:Int=1226195; + + + + //[Embed(source="../../../mp3/soft.mp3")] public static var Soft_Song:Class; + public var SOFT:FlxSound=new FlxSound(); + private var SOFTSAMPLES:Int=5007429; + + //[Embed(source="../../../mp3/crowd_boss.mp3")] public static var CrowdBoss_Song:Class; + public var CROWDBOSS:FlxSound=new FlxSound(); + private var CROWDBOSSSAMPLES:Int=1128960; + + //[Embed(source="../../../mp3/apartment-boss.mp3")] public static var ApartmentBoss_Song:Class; + public var APARTMENTBOSS:FlxSound=new FlxSound(); + private var APARTMENTBOSSSAMPLES:Int=1411199; + + //[Embed(source="../../../mp3/hotel-boss.mp3")] public static var HotelBoss_Song:Class; + public var HOTELBOSS:FlxSound=new FlxSound(); + private var HOTELBOSSSAMPLES:Int=1394129; + + //[Embed(source="../../../mp3/circus-boss.mp3")] public static var CircusBoss_Song:Class; + public var CIRCUSBOSS:FlxSound=new FlxSound(); + private var CIRCUSBOSSSAMPLES:Int=1299789; + + //*/ + + + /* Gadgets */ + //[Embed(source="../../../sfx/unlock.mp3")] private var S_UNLOCK:Class;// Open locked door + //[Embed(source="../../../sfx/open.mp3")] private var S_OPEN:Class;// Gate open jingle + //[Embed(source="../../../sfx/pushblock.mp3")] private var S_PUSH_BLOCK:Class; + //[Embed(source="../../../sfx/gettreasure.mp3")] private var S_GET_TREASURE:Class; + //[Embed(source="../../../sfx/keyget.mp3")] private var S_GET_KEY:Class;// + //[Embed(source="../../../sfx/button_up.mp3")] public static var S_BUTTON_UP:Class; + //[Embed(source="../../../sfx/button_down.mp3")] public static var S_BUTTON_DOWN:Class; + //[Embed(source="../../../sfx/floor_crack.mp3")] public static var S_FLOOR_CRACK:Class; + //[Embed(source="../../../sfx/big_door_locked.mp3")] public static var S_Big_Door_Locked:Class; + //[Embed(source="../../../sfx/fall_1.mp3")] public static var sfall1:Class;//Falling - spike roller + //[Embed(source="../../../sfx/hit_ground_1.mp3")] public static var shitground1:Class;//Spike roller hits walls + //[Embed(source="../../../sfx/sparkle_1.mp3")] public static var sparkle_1_c:Class; + //[Embed(source="../../../sfx/sparkle_2.mp3")] public static var sparkle_2_c:Class; + //[Embed(source="../../../sfx/sparkle_3.mp3")] public static var sparkle_3_c:Class; + //[Embed(source="../../../sfx/dash_pad_1.mp3")] public static var embed_dash_pad_1:Class;// + //[Embed(source="../../../sfx/dash_pad_2.mp3")] public static var embed_dash_pad_2:Class; + //[Embed(source="../../../sfx/spring_bounce.mp3")] public static var embed_spring_bounce:Class; + + + + /* Other things */ + //[Embed(source="../../../sfx/cicada_chirp.mp3")] public static var cicada_chirp_c:Class; + //[Embed(source="../../../sfx/cross2.mp3")] public static var embed_cross2:Class; + //[Embed(source="../../../sfx/cross3.mp3")] public static var embed_cross3:Class; + //[Embed(source="../../../sfx/cross4.mp3")] public static var embed_cross4:Class; + + + + + /* Bedroom */ + //[Embed(source="../../../sfx/laser-pew.mp3")] public static var S_LASER_PEW:Class; + //[Embed(source="../../../sfx/shieldy-hit.mp3")] public static var S_SHIELDY_HIT:Class; + //[Embed(source="../../../sfx/shieldy_ineffective.mp3")] public static var shieldy_ineffective_embed:Class; + //[Embed(source="../../../sfx/slime_walk.mp3")] public static var slime_walk_embed:Class; + //[Embed(source="../../../sfx/slime_splash.mp3")] public static var slime_splash_embed:Class; + //[Embed(source="../../../sfx/slime_shoot.mp3")] public static var slime_shoot_embed:Class; + + /* Sun boss */ + //[Embed(source="../../../sfx/sun_guy_scream2.mp3")] public static var S_SUN_GUY_SCREAM:Class;//softer + //[Embed(source="../../../sfx/sun_guy_charge.mp3")] public static var S_SUN_GUY_CHARGE:Class;// + + /* Redcave */ + //[Embed(source="../../../sfx/slasher_atk.mp3")] public static var slasher_atk_embed:Class;// + //[Embed(source="../../../sfx/on_off_laser_shoot.mp3")] public static var on_off_laser_shoot_embed:Class; + //[Embed(source="../../../sfx/4sht_shoot.mp3")] public static var four_shooter_shoot:Class; + //[Embed(source="../../../sfx/4sht_pop.mp3")] public static var four_shooter_pop:Class; + //[Embed(source="../../../sfx/mover_die.mp3")] public static var mover_die:Class; + //[Embed(source="../../../sfx/mover_move.mp3")] public static var mover_move:Class; + //[Embed(source="../../../sfx/red_cave_rise.mp3")] public static var embed_red_cave_rise:Class; + + /* Red boss */ + //[Embed(source="../../../sfx/bubble_loop.mp3")] public static var embed_bubble_loop:Class; + //[Embed(source="../../../sfx/bubble_1.mp3")] public static var embed_bubble_1:Class; + //[Embed(source="../../../sfx/bubble_2.mp3")] public static var embed_bubble_2:Class; + //[Embed(source="../../../sfx/bubble_3.mp3")] public static var embed_bubble_3:Class; + //[Embed(source="../../../sfx/bubble_triple.mp3")] public static var embed_bubble_triple:Class; + //[Embed(source="../../../sfx/redboss_moan.mp3")] public static var embed_redboss_moan:Class; + //[Embed(source="../../../sfx/small_wave.mp3")] public static var embed_small_wave:Class; + //[Embed(source="../../../sfx/big_wave.mp3")] public static var embed_big_wave:Class; + //[Embed(source="../../../sfx/redboss_death.mp3")] public static var embed_redboss_death:Class; + + + /* Crowd */ + //[Embed(source="../../../sfx/dog_bark.mp3")] public static var embed_dog_bark:Class;// + //[Embed(source="../../../sfx/dog_dash.mp3")] public static var embed_dog_dash:Class; + //[Embed(source="../../../sfx/talk_1.mp3")] public static var embed_talk_1:Class; + //[Embed(source="../../../sfx/talk_2.mp3")] public static var embed_talk_2:Class; + //[Embed(source="../../../sfx/talk_3.mp3")] public static var embed_talk_3:Class; + + //wallboss + //[Embed(source="../../../sfx/wb_hit_ground.mp3")] public static var embed_wb_hit_ground:Class; + //[Embed(source="../../../sfx/wb_tap_ground.mp3")] public static var embed_wb_tap_ground:Class; + //[Embed(source="../../../sfx/wb_shoot.mp3")] public static var embed_wb_shoot:Class; + //[Embed(source="../../../sfx/wb_moan.mp3")] public static var embed_wb_moan:Class; + //[Embed(source="../../../sfx/wb_moan_2.mp3")] public static var embed_wb_moan_2:Class; + //[Embed(source="../../../sfx/talk_death.mp3")] public static var embed_talk_death:Class; + + + //apt + + //[Embed(source="../../../sfx/teleguy_up.mp3")] public static var embed_teleguy_up:Class; + //[Embed(source="../../../sfx/teleguy_down.mp3")] public static var embed_teleguy_down:Class; + //[Embed(source="../../../sfx/gasguy_shoot.mp3")] public static var embed_gasguy_shoot:Class; + //[Embed(source="../../../sfx/gasguy_move.mp3")] public static var embed_gasguy_move:Class; + //[Embed(source="../../../sfx/sf_move.mp3")] public static var embed_sf_move:Class; + //[Embed(source="../../../sfx/rat_move.mp3")] public static var embed_rat_move:Class; + + //splitboss + + //[Embed(source="../../../sfx/sb_split.mp3")] public static var embed_sb_split:Class; + //[Embed(source="../../../sfx/sb_ball_appear.mp3")] public static var embed_sb_ball_appear:Class; + //[Embed(source="../../../sfx/sb_hurt.mp3")] public static var embed_sb_hurt:Class; + //[Embed(source="../../../sfx/sb_dash.mp3")] public static var embed_sb_dash:Class; + /* hotel */ + + //[Embed(source="../../../sfx/dustmaid_alert.mp3")] public static var embed_dustmaid_alert:Class; + //[Embed(source="../../../sfx/elevator_open.mp3")] public static var embed_elevator_open:Class; + //[Embed(source="../../../sfx/elevator_close.mp3")] public static var embed_elevator_close:Class; + + + /* Circus */ + + //[Embed(source="../../../sfx/flame_pillar.mp3")] public static var embed_flame_pillar:Class; + //[Embed(source="../../../sfx/fireball.mp3")] public static var embed_fireball:Class; + + /* etc */ + //[Embed(source="../../../sfx/briar_shine.mp3")] public static var embed_briar_shine:Class;// + //[Embed(source="../../../sfx/stream.mp3")] public static var embed_stream:Class; + //[Embed(source="../../../sfx/dust_explode.mp3")] public static var embed_dust_explode:Class; + + + /* Explosions/rumbles */ + //[Embed(source="../../../sfx/hit_wall.mp3")] public static var S_HIT_WALL:Class;//Bat die, sun guy hit wall + //[Embed(source="../../../sfx/sun_guy_death_long.mp3")] public static var S_SUN_GUY_DEATH_L:Class; + //[Embed(source="../../../sfx/sun_guy_death_short.mp3")] public static var S_SUN_GUY_DEATH_S:Class; + //[Embed(source="../../../sfx/broom_hit.mp3")] public static var embed_broom_hit:Class; + + + /* Player */ + //[Embed(source="../../../sfx/player_hit_1.mp3")] public static var S_PLAYER_HIT_1:Class;//Hitting an enemy + //[Embed(source="../../../sfx/noise_step_1.mp3")] public static var S_NOISE_STEP_1:Class; + //[Embed(source="../../../sfx/water_step.mp3")] public static var water_step:Class; + //[Embed(source="../../../sfx/enter_door.mp3")] public static var embed_enter_door:Class; + + //[Embed(source="../../../sfx/fall_in_hole.mp3")] private var S_FALL_IN_HOLE:Class;// + //[Embed(source="../../../sfx/get_small_health.mp3")] public static var S_GET_SMALL_HEALTH:Class; + //[Embed(source="../../../sfx/swing_broom_1.mp3")] public static var swing_broom_1:Class; + //[Embed(source="../../../sfx/swing_broom_2.mp3")] public static var swing_broom_2:Class; + //[Embed(source="../../../sfx/swing_broom_3.mp3")] public static var swing_broom_3:Class; + + //[Embed(source="../../../sfx/player_jump_up.mp3")] private static var player_jump_up_sound:Class; + //[Embed(source="../../../sfx/player_jump_down.mp3")] private static var player_jump_down_sound:Class; + //[Embed(source="../../../sfx/puddle_up.mp3")] private static var embed_puddle_up:Class; + //[Embed(source="../../../sfx/puddle_down.mp3")] private static var embed_puddle_down:Class; + //[Embed(source="../../../sfx/puddle_step.mp3")] private static var embed_puddle_step:Class; + //[Embed(source="../../../sfx/ladder_step_2.mp3")] private static var embed_ladder_step_2:Class; + //[Embed(source="../../../sfx/ladder_step_1.mp3")] private static var embed_ladder_step_1:Class; + + + //[Embed(source="../../../sfx/teleport_up.mp3")] public static var S_TELEPORT_UP:Class;// + //[Embed(source="../../../sfx/teleport_down.mp3")] public static var S_TELEPORT_DOWN:Class; + + /* Ambient */ + //[Embed(source="../../../sfx/wavesandwind.mp3")] private var S_BEACH_WAVES:Class; + //[Embed(source="../../../sfx/rain.mp3")] private var embed_rain:Class; + + /* Menu */ + //[Embed(source="../../../sfx/menu_move.mp3")] public static var S_MENU_MOVE:Class; + //[Embed(source="../../../sfx/menu_select.mp3")] public static var S_MENU_SELECT:Class; + //[Embed(source="../../../sfx/pause_sound.mp3")] public static var S_PAUSE_SOUND:Class; + //[Embed(source="../../../sfx/dialogue_bloop.mp3")] public static var dialogue_bloop_embed:Class; + //[Embed(source="../../../sfx/dialogue_blip.mp3")] public static var dialogue_blip_embed:Class; + + public var unlock:FlxSound=new FlxSound(); + public var open:FlxSound=new FlxSound(); + public var fall_in_hole:FlxSound=new FlxSound(); + public var push_block:FlxSound=new FlxSound(); + public var button_up:FlxSound=new FlxSound(); + public var button_down:FlxSound=new FlxSound(); + public var floor_crack:FlxSound=new FlxSound(); + public var get_treasure:FlxSound=new FlxSound(); + public var get_key:FlxSound=new FlxSound(); + public var dash_pad_1:FlxSound=new FlxSound(); + public var dash_pad_2:FlxSound=new FlxSound(); + public var spring_bounce:FlxSound=new FlxSound(); + public var waves:FlxSound=new FlxSound(); + public var waves_samples:Int=1322496;//why is this here + public var rain:FlxSound=new FlxSound(); + public var puddle_up:FlxSound=new FlxSound(); + public var puddle_down:FlxSound=new FlxSound(); + public var puddle_step:FlxGroup=new FlxGroup(2); + public var rain_samples:Int=236955; + public var ladder_step:FlxGroup=new FlxGroup(2); + + public var sun_guy_death_l:FlxSound=new FlxSound(); + public var sun_guy_death_s:FlxSound=new FlxSound(); + public var sun_guy_scream:FlxSound=new FlxSound(); + public var sun_guy_charge:FlxSound=new FlxSound(); + + public var player_jump_down:FlxSound=new FlxSound(); + public var player_jump_up:FlxSound=new FlxSound(); + public var enter_door:FlxSound=new FlxSound(); + public var player_hit_1:FlxSound=new FlxSound(); + public var broom_hit:FlxSound=new FlxSound(); + + public var teleport_up:FlxSound=new FlxSound(); + public var teleport_down:FlxSound=new FlxSound(); + + public var shieldy_hit:FlxSound=new FlxSound(); + public var shieldy_ineffective:FlxGroup=new FlxGroup(4); + + //redcave + + public var red_cave_rise:FlxSound=new FlxSound(); + + public var bubble_loop:FlxSound=new FlxSound(); + public var redboss_moan:FlxSound=new FlxSound(); + public var small_wave:FlxSound=new FlxSound(); + public var big_wave:FlxSound=new FlxSound(); + public var redboss_death:FlxSound=new FlxSound(); + + //crod + public var dog_dash:FlxGroup=new FlxGroup(3); + + public var talk_group:FlxGroup=new FlxGroup(5); + + public var wb_tap_ground:FlxSound=new FlxSound(); + public var wb_hit_ground:FlxSound=new FlxSound(); + public var wb_shoot:FlxSound=new FlxSound(); + public var wb_moan:FlxSound=new FlxSound(); + public var wb_moan_2:FlxSound=new FlxSound(); + + public var talk_death:FlxSound=new FlxSound(); + + //apt + public var teleguy_up:FlxSound=new FlxSound(); + + public var teleguy_down:FlxSound=new FlxSound(); + public var gasguy_shoot:FlxSound=new FlxSound(); + public var gasguy_move:FlxGroup=new FlxGroup(2); + public var rat_move:FlxGroup=new FlxGroup(2); + + public var sb_split:FlxSound=new FlxSound(); + public var sb_hurt:FlxSound=new FlxSound(); + public var sb_dash:FlxSound=new FlxSound(); + public var sb_ball_appear:FlxGroup=new FlxGroup(5); + + public var sf_move:FlxGroup=new FlxGroup(3); + //hotel + + public var dustmaid_alert:FlxSound=new FlxSound(); + public var elevator_open:FlxSound=new FlxSound(); + public var elevator_close:FlxSound=new FlxSound(); + + //circus + public var flame_pillar_group:FlxGroup=new FlxGroup(2); + public var fireball_group:FlxGroup=new FlxGroup(4); + + public var get_small_health:FlxSound=new FlxSound(); + public var big_door_locked:FlxSound=new FlxSound(); + public var hitground1:FlxSound=new FlxSound(); + public var fall1:FlxSound=new FlxSound(); + public var slasher_atk:FlxSound=new FlxSound(); + public var on_off_laser_shoot:FlxSound=new FlxSound(); + public var dialogue_bloop:FlxSound=new FlxSound(); + public var cicada_chirp:FlxSound=new FlxSound(); + + // Etc + + public var briar_shine_group:FlxGroup=new FlxGroup(8); + public var stream_sound:FlxSound=new FlxSound(); + public var dust_explode_group:FlxGroup=new FlxGroup(3); + public var mushroom_sound_group:FlxGroup=new FlxGroup(3); + + /* Groups of sounds! */ + public var slime_walk_group:FlxGroup=new FlxGroup(5); + public var slime_splash_group:FlxGroup=new FlxGroup(8); + public var slime_shoot_group:FlxGroup=new FlxGroup(2); + + public var four_shooter_shoot_group:FlxGroup=new FlxGroup(2); + public var four_shooter_pop_group:FlxGroup=new FlxGroup(3); + public var mover_move_group:FlxGroup=new FlxGroup(2); + public var mover_die_group:FlxGroup=new FlxGroup(2); + + public var bubble_group:FlxGroup=new FlxGroup(4); + public var bubble_triple_group:FlxGroup=new FlxGroup(4); + + public var laser_pew_group:FlxGroup=new FlxGroup(2); + public var menu_move_group:FlxGroup=new FlxGroup(3); + public var menu_select_group:FlxGroup=new FlxGroup(2); + public var pause_sound_group:FlxGroup=new FlxGroup(2); + public var enemy_explode_1_group:FlxGroup=new FlxGroup(5); + public var swing_broom_group:FlxGroup=new FlxGroup(3); + public var water_step_group:FlxGroup=new FlxGroup(3); + public var dialogue_blip_group:FlxGroup=new FlxGroup(5); + public var sparkle_group:FlxGroup=new FlxGroup(5); + + public var dog_bark_group:FlxGroup=new FlxGroup(2); + + public var current_song_name:String="BEDROOM"; + public var current_song:FlxSound=new FlxSound(); + + public function new(){ + /* Init usually-one-off-noises. */ + unlock.loadEmbedded(S_UNLOCK, false); + open.loadEmbedded(S_OPEN, false); + push_block.loadEmbedded(S_PUSH_BLOCK, false); + get_treasure.loadEmbedded(S_GET_TREASURE, false); + get_key.loadEmbedded(S_GET_KEY, false); + waves.loadEmbedded(S_BEACH_WAVES, true, waves_samples); + rain.loadEmbedded(embed_rain, true, rain_samples); + fall_in_hole.loadEmbedded(S_FALL_IN_HOLE, false); + button_down.loadEmbedded(S_BUTTON_DOWN); + button_up.loadEmbedded(S_BUTTON_UP); + floor_crack.loadEmbedded(S_FLOOR_CRACK); + big_door_locked.loadEmbedded(S_Big_Door_Locked); + hitground1.loadEmbedded(shitground1); + fall1.loadEmbedded(sfall1); + dash_pad_1.loadEmbedded(embed_dash_pad_1); + dash_pad_2.loadEmbedded(embed_dash_pad_2); + spring_bounce.loadEmbedded(embed_spring_bounce); + puddle_up.loadEmbedded(embed_puddle_up, false); + puddle_down.loadEmbedded(embed_puddle_down, false); + init_sound_group(puddle_step, embed_puddle_step); + init_multi_sound_group(ladder_step, new Array(embed_ladder_step_1, embed_ladder_step_2), false); + + slasher_atk.loadEmbedded(slasher_atk_embed, false); + on_off_laser_shoot.loadEmbedded(on_off_laser_shoot_embed, false); + + sun_guy_death_l.loadEmbedded(S_SUN_GUY_DEATH_L); + sun_guy_death_s.loadEmbedded(S_SUN_GUY_DEATH_S); + sun_guy_scream.loadEmbedded(S_SUN_GUY_SCREAM); + sun_guy_charge.loadEmbedded(S_SUN_GUY_CHARGE); + + //redcave + + red_cave_rise.loadEmbedded(embed_red_cave_rise); + bubble_loop.loadEmbedded(embed_bubble_loop, true, 89508); + redboss_moan.loadEmbedded(embed_redboss_moan); + big_wave.loadEmbedded(embed_big_wave, false); + small_wave.loadEmbedded(embed_small_wave, false); + redboss_death.loadEmbedded(embed_redboss_death); + + //crowd + init_sound_group(dog_dash, embed_dog_dash); + + init_multi_sound_group(talk_group, new Array(embed_talk_1, embed_talk_1, embed_talk_2, embed_talk_3, embed_talk_3)); + wb_hit_ground.loadEmbedded(embed_wb_hit_ground); + wb_tap_ground.loadEmbedded(embed_wb_tap_ground); + wb_shoot.loadEmbedded(embed_wb_shoot); + wb_moan.loadEmbedded(embed_wb_moan); + wb_moan_2.loadEmbedded(embed_wb_moan_2); + talk_death.loadEmbedded(embed_talk_death); + + //apt + teleguy_down.loadEmbedded(embed_teleguy_down); + teleguy_up.loadEmbedded(embed_teleguy_up); + gasguy_shoot.loadEmbedded(embed_gasguy_shoot); + init_sound_group(gasguy_move, embed_gasguy_move) + init_sound_group(rat_move, embed_rat_move); + + sb_split.loadEmbedded(embed_sb_split); + init_sound_group(sb_ball_appear, embed_sb_ball_appear); + sb_dash.loadEmbedded(embed_sb_dash); + sb_hurt.loadEmbedded(embed_sb_hurt); + + init_sound_group(sf_move, embed_sf_move); + + + //hotel + dustmaid_alert.loadEmbedded(embed_dustmaid_alert); + elevator_close.loadEmbedded(embed_elevator_close); + elevator_open.loadEmbedded(embed_elevator_open); + //circus + init_sound_group(flame_pillar_group, embed_flame_pillar); + init_sound_group(fireball_group, embed_fireball); + + player_hit_1.loadEmbedded(S_PLAYER_HIT_1); + enter_door.loadEmbedded(embed_enter_door); + player_jump_down.loadEmbedded(player_jump_down_sound); + player_jump_up.loadEmbedded(player_jump_up_sound); + broom_hit.loadEmbedded(embed_broom_hit); + + teleport_down.loadEmbedded(S_TELEPORT_DOWN); + teleport_up.loadEmbedded(S_TELEPORT_UP); + shieldy_hit.loadEmbedded(S_SHIELDY_HIT, false); + init_sound_group(shieldy_ineffective, shieldy_ineffective_embed); + get_small_health.loadEmbedded(S_GET_SMALL_HEALTH, false); + dialogue_bloop.loadEmbedded(dialogue_bloop_embed); + cicada_chirp.loadEmbedded(cicada_chirp_c); + + GameOver.loadEmbedded(GameOver_Song); + + stream_sound.loadEmbedded(embed_stream); + init_sound_group(dust_explode_group, embed_dust_explode); + + /* Init repeated noises */ + init_sound_group(laser_pew_group, S_LASER_PEW,false,0.1); + init_sound_group(slime_walk_group, slime_walk_embed); + init_sound_group(slime_shoot_group, slime_shoot_embed); + init_sound_group(slime_splash_group, slime_splash_embed); + init_sound_group(briar_shine_group, embed_briar_shine); + + init_sound_group(four_shooter_pop_group, four_shooter_pop); + init_sound_group(four_shooter_shoot_group, four_shooter_shoot); + init_sound_group(mover_move_group, mover_move); + init_sound_group(mover_die_group, mover_die); + + init_multi_sound_group(bubble_group, new Array(embed_bubble_1, embed_bubble_1, embed_bubble_2, embed_bubble_3)); + init_sound_group(bubble_triple_group, embed_bubble_triple); + + init_sound_group(dog_bark_group, embed_dog_bark); + + init_multi_sound_group(mushroom_sound_group, new Array(embed_cross2, embed_cross3, embed_cross4), false, 1); + init_sound_group(menu_move_group, S_MENU_MOVE); + init_sound_group(menu_select_group, S_MENU_SELECT); + init_sound_group(dialogue_blip_group, dialogue_blip_embed); + init_sound_group(pause_sound_group, S_PAUSE_SOUND); + init_sound_group(enemy_explode_1_group, S_HIT_WALL, false, 0.3); + init_sound_group(water_step_group, water_step, false, 1); + init_multi_sound_group(swing_broom_group, new Array(swing_broom_1, swing_broom_2, swing_broom_3), false, 1); + init_multi_sound_group(sparkle_group, new Array(sparkle_1_c, sparkle_1_c, sparkle_2_c, sparkle_2_c,sparkle_3_c), false, 1); + + } + + public function init_sound_group(g:FlxGroup, embed_sound:Class, looped:Bool=false,volume:Float=1):Void { + for(i in 0...g.maxSize){ + var s:FlxSound=new FlxSound(); + s.loadEmbedded(embed_sound, looped); + s.volume=volume; + g.add(s); + } + } + + public function init_multi_sound_group(g:FlxGroup, sounds:Array, looped:Bool=false, volume:Float=1):Void { + for(var sound:Class in sounds){ + var s:FlxSound=new FlxSound; + s.loadEmbedded(sound, looped, volume); + g.add(s); + } + } + + /** + * Given a sound object to reference what to play and + * the title of the song, play it. + * + * @param song + * @param title + */ + public var trigger_soft:Bool=false; + public function start_song_from_title(title:String):Void { + if(current_song==null)current_song=new FlxSound(); + if(current_song.playing)current_song.stop(); + + if(!Registry.sound_data.hasOwnProperty(title)){ + if(title=="TRAIN"){ + title="CELL";//<_< + } else if(title=="DRAWER"){ + // No music in post-death area + if(true==Registry.GAMESTATE.in_death_room){ + return; + } + title="SUBURB"; + } else { + title="BEDROOM"; + } + } + if(Registry.E_PLAY_ROOF){ + if(Registry.CURRENT_MAP_NAME=="REDCAVE" || Registry.CURRENT_MAP_NAME=="REDSEA"){ + title="REDCAVE"; + } else { + title="ROOF"; + } + Registry.E_PLAY_ROOF=false; + } + + if(title=="HAPPY"){ + if(!Registry.GE_States[Registry.GE_Happy_Started]){ + title="HAPPYINIT"; + } + } + + + if(title=="TERMINAL"){ + if(false==Registry.GE_States[Registry.GE_Sage_Dead_Idx]){ + title="PRETERMINAL"; + } + } + + if(title=="SUBURB"){ + if(trigger_soft){ + trigger_soft=false; + title="SOFT"; + } + } + + if(title=="BOSS"){ + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + title="BEDROOMBOSS"; + break; + case "REDCAVE": + title="REDCAVEBOSS"; + break; + case "CROWD": + title="CROWDBOSS"; + break; + case "APARTMENT": + title="APARTMENTBOSS"; + break; + case "HOTEL": + title="HOTELBOSS"; + break; + case "CIRCUS": + title="CIRCUSBOSS"; + break; + default: + title="BEDROOMBOSS"; + break; + + } + } + + //title="TITLE";// remove + Registry.sound_data[title]=null; + Registry.sound_data[title]=new FlxSound(); + //Registry.sound_data[title].loadEmbedded(Title_Song, true, Title_Samples);// remove + ///* + if(title=="BEDROOM"){ + Registry.sound_data.BEDROOM.loadEmbedded(Bedroom_Song, true, Bedroom_Samples); + } else if(title=="OVERWORLD"){ + Registry.sound_data.OVERWORLD.loadEmbedded(Overworld_Song, true, Overworld_Samples); + } else if(title=="STREET"){ + Registry.sound_data.STREET.loadEmbedded(Street_Song, true, Street_Samples); + } else if(title=="BLANK"){ + Registry.sound_data.BLANK.loadEmbedded(Blank_Song, true, Blank_Samples); + } else if(title=="TITLE"){ + Registry.sound_data.TITLE.loadEmbedded(Title_Song, true, Title_Samples); + }else if(title=="MITRA"){ + Registry.sound_data.MITRA.loadEmbedded(Mitra_Song, true, MITRASAMPLES); + } else if(title=="FIELDS"){ + Registry.sound_data.FIELDS.loadEmbedded(Fields_Song, true, FIELDSSAMPLES); + }else if(title=="NEXUS"){ + Registry.sound_data.NEXUS.loadEmbedded(Nexus_Song, true, NEXUSSAMPLES); + } else if(title=="BEDROOMBOSS"){ + Registry.sound_data.BEDROOMBOSS.loadEmbedded(BedroomBoss_Song, true, BEDROOMBOSSSAMPLES); + } + ///* + else if(title==="BEACH"){ + Registry.sound_data.BEACH.loadEmbedded(Beach_Song, true, Beach_Samples); + } else if(title=="REDSEA"){ + Registry.sound_data.REDSEA.loadEmbedded(Red_Sea_Song, true, Red_Sea_Samples); + } else if(title=="REDCAVE"){ + Registry.sound_data.REDCAVE.loadEmbedded(Red_Cave_Song, true, Red_Cave_Samples); + } else if(title=="REDCAVEBOSS"){ + Registry.sound_data.REDCAVEBOSS.loadEmbedded(RedcaveBoss_Song, true, REDCAVEBOSSSAMPLES); + } else if(title=="WINDMILL"){ + Registry.sound_data.WINDMILL.loadEmbedded(Windmill_Song, true, WINDMILLSAMPLES); + }else if(title=="APARTMENT"){ + Registry.sound_data.APARTMENT.loadEmbedded(Apartment_Song, true, APARTMENTSAMPLES); + }else if(title=="FOREST"){ + Registry.sound_data.FOREST.loadEmbedded(Forest_Song, true, FORESTSAMPLES); + } else if(title=="SPACE"){ + Registry.sound_data.SPACE.loadEmbedded(Space_Song, true, SPACESAMPLES); + } else if(title=="CLIFF"){ + Registry.sound_data.CLIFF.loadEmbedded(Cliff_Song, true, CLIFFSAMPLES); + } else if(title=="TERMINAL"){ + Registry.sound_data.TERMINAL.loadEmbedded(Terminal_Song, true, TERMINALSAMPLES); + } else if(title=="CROWD"){ + Registry.sound_data.CROWD.loadEmbedded(Crowd_Song, true, CROWDSAMPLES); + } else if(title=="CELL"){ + Registry.sound_data.CELL.loadEmbedded(Cell_Song, true, CELLSAMPLES); + } else if(title=="SUBURB"){ + Registry.sound_data.SUBURB.loadEmbedded(Suburb_Song, true, SUBURBSAMPLES); + } else if(title=="ROOF"){ + Registry.sound_data.ROOF.loadEmbedded(Roof_Song, true, ROOFSAMPLES); + } else if(title=="CIRCUS"){ + Registry.sound_data.CIRCUS.loadEmbedded(Circus_Song, true, CIRCUSSAMPLES,2009500); + } else if(title=="HOTEL"){ + Registry.sound_data.HOTEL.loadEmbedded(Hotel_Song, true, HOTELSAMPLES); + } else if(title=="GO"){ + Registry.sound_data.GO.loadEmbedded(Go_Song, true, GOSAMPLES); + } else if(title=="HAPPY"){ + Registry.sound_data.HAPPY.loadEmbedded(Happy_Song, true, HAPPYSAMPLES); + } else if(title=="BLUE"){ + Registry.sound_data.BLUE.loadEmbedded(Blue_Song, true, BLUESAMPLES); + } else if(title=="SAGEFIGHT"){ + Registry.sound_data.SAGEFIGHT.loadEmbedded(Sagefight_Song, true, SAGEFIGHTSAMPLES,SAGEFIGHTLOOP); + } else if(title=="HAPPYINIT"){ + Registry.sound_data.HAPPYINIT.loadEmbedded(Happyinit_song, true, HAPPYINITSAMPLES); + } else if(title=="ENDING"){ + Registry.sound_data.ENDING.loadEmbedded(Ending_Song,false, ENDINGSAMPLES); + } else if(title=="BRIARFIGHT"){ + Registry.sound_data.BRIARFIGHT.loadEmbedded(BriarFight_Song, true, BRIARFIGHTSAMPLES); + } else if(title=="PRETERMINAL"){ + Registry.sound_data.PRETERMINAL.loadEmbedded(PreTerminal_Song, true, PRETERMSAMPLES); + } else if(title=="DRAWER"){ + Registry.sound_data.SUBURB.loadEmbedded(Suburb_Song, true, SUBURBSAMPLES); + } else if(title=="SOFT"){ + Registry.sound_data.SOFT.loadEmbedded(Soft_Song, true, SOFTSAMPLES); + } else if(title=="CIRCUSBOSS"){ + Registry.sound_data.CIRCUSBOSS.loadEmbedded(CircusBoss_Song, true, CIRCUSBOSSSAMPLES); + } else if(title=="HOTELBOSS"){ + Registry.sound_data.HOTELBOSS.loadEmbedded(HotelBoss_Song, true, HOTELBOSSSAMPLES); + } else if(title=="APARTMENTBOSS"){ + Registry.sound_data.APARTMENTBOSS.loadEmbedded(ApartmentBoss_Song, true, APARTMENTBOSSSAMPLES); + } else if(title=="CROWDBOSS"){ + Registry.sound_data.CROWDBOSS.loadEmbedded(CrowdBoss_Song, true, CROWDBOSSSAMPLES); + } + + //*/ + + current_song=Registry.sound_data[title]; + current_song_name=title; + if(Registry.GAMESTATE !=null){ + Registry.GAMESTATE.last_song_time=0;// avoid issues with changing song midmap + } + //current_song.volume=FlxG.volume; + current_song.play(); + + if(title=="WINDMILL" && Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + current_song.stop(); + } + } + + /** + * + * @param g Group of the(loaded)flxsoudns ya wanna play + * @return 1 if a sound was played, 0 otherwise(too many playing); + */ + + public function play_sound_group(g:FlxGroup,vol:Float=1):Int { + for(var s:FlxSound in g.members){ + if(!s.playing){ + s.volume=vol; + s.play(); + + return 1; + } + + } + return 0; + } + + public function play_sound_group_randomly(g:FlxGroup):Int { + var a:Array=new Array; + for(i in 0...g.length){ + a.push(i); + } + + for(i=0;i=new Array(); + // it looks like you're adding a new tileset. + // did you make sure to add in the new csv in csvdata?? + /* Making a new tileset work + * 1. Make sure it's included above in the list of Embeds + * 2. Add it to the if statement right after this comment + * 3. Remove that maps name from the "no_tiles_yet" array at the beginning of the + * set_tile_properties array + * 4. Add in an else-if block to deal with setting the walkable/solid properties of the tileset + * 5. if there are more detailed things(holes, conveyers), you can try to figure it out + * or i'll just deal with it. */ + + + public static function setTileset(MapName:String):Void { + if(MapName=="BEDROOM"){ + Tiles=_Bedroom_Tiles; + } else if(MapName=="APARTMENT"){ + Tiles=_Apartment_Tiles; + } else if(MapName=="FIELDS"){ + Tiles=_Fields_Tiles; + } else if(MapName=="STREET"){ + Tiles=_Street_Tiles; + } else if(MapName=="OVERWORLD"){ + Tiles=_Overworld_Tiles; + } else if(MapName=="BEACH"){ + Tiles=_Beach_Tiles; + } else if(MapName=="BLANK"){ + Tiles=Blank_Tiles; + } else if(MapName=="REDSEA"){ + Tiles=Red_Sea_Tiles; + } else if(MapName=="DEBUG"){ + Tiles=Debug_Tiles; + } else if(MapName=="REDCAVE"){ + Tiles=REDCAVE_Tiles; + } else if(MapName=="TERMINAL"){ + Tiles=Terminal_Tiles; + } else if(MapName=="HOTEL"){ + Tiles=_Hotel_Tiles; + } else if(MapName=="NEXUS"){ + Tiles=_Nexus_Tiles; + } else if(MapName=="CROWD"){ + Tiles=_Crowd_Tiles; + } else if(MapName=="CIRCUS"){ + Tiles=_Circus_Tiles; + } else if(MapName=="CLIFF"){ + Tiles=Cliff_Tiles; + } else if(MapName=="WINDMILL"){ + Tiles=_Windmill_Tiles; + } else if(MapName=="FOREST"){ + Tiles=Forest_Tiles; + } else if(MapName=="TRAIN"){ + Tiles=Cell_Tiles; + } else if(MapName=="DRAWER"){ + Tiles=BlackWhite_Tiles; + } else if(MapName=="BLUE"){ + Tiles=Blue_Tiles; + } else if(MapName=="HAPPY"){ + Tiles=Happy_Tiles; + } else if(MapName=="SPACE"){ + Tiles=Space_Tiles; + } else if(MapName=="SUBURB"){ + Tiles=Suburb_Tiles; + } else if(MapName=="GO"){ + Tiles=Go_Tiles; + } else { + Tiles=Debug_Tiles; + } + } + + /* EMBEDS, ARRAYS, FUNCTIONS RELATED TO ANIMATED TILES */ + + // Embedded graphics + //[Embed(source="../res/sprites/animtiles/shoreline.png")] private static var Shoreline_Anims:Class; + //[Embed(source="../res/sprites/animtiles/beach_anims.png")] private static var Beach_Anims:Class; + //[Embed(source="../res/sprites/animtiles/conveyer_anim_tiles.png")] private static var Conveyer_Anims:Class; + //[Embed(source="../res/sprites/animtiles/water_edges.png")] private static var Water_Edge_Anims:Class; + //[Embed(source="../res/sprites/animtiles/torch_pillars.png")] private static var Torch_Pillar_Anims:Class; + //[Embed(source="../res/sprites/animtiles/windmill_drops.png")] private static var Windmill_Drops_Anims:Class; + //[Embed(source="../res/sprites/animtiles/terminal.png")] private static var Terminal_Anims:Class; + //[Embed(source="../res/sprites/animtiles/happy_anims.png")] private static var Happy_Anims:Class; + //[Embed(source="../res/sprites/animtiles/cell_anims.png")] private static var Cell_Anims:Class; + //[Embed(source="../res/sprites/animtiles/suburbs_anims.png")] private static var Suburbs_Anims:Class; + //[Embed(source="../res/sprites/animtiles/forest_anims.png")] private static var Forest_Anims:Class; + //[Embed(source="../res/sprites/animtiles/fields_anims.png")] private static var Fields_Anims:Class; + //[Embed(source="../res/sprites/animtiles/go_anims.png")] private static var Go_Anims:Class; + //[Embed(source="../res/sprites/animtiles/flame_anims.png")] private static var Flame_Anims:Class; + + // Add new tile indice here + public static var animtiles_indices_dict:Dynamic={ + BEACH:new Array(109, 116, 117, 118, 119, 141, 142, 143, 144, 145, 150, 151, 250, 251, 252, 253, 254, 255, 256, 257, 260, 261, 262, 270, 272), + DEBUG:new Array(16, 17, 18, 19, 20), + REDCAVE:new Array(16, 17, 18, 19, 30,32, 70, 71, 72, 73, 74, 75, 76), + WINDMILL:new Array(130,130), // as3 arrays make empty arrays with x elements if only one arg x + CIRCUS:new Array(41, 46, 111, 112, 113, 114), + HOTEL:new Array(180, 181, 182, 183, 190, 191, 192, 193, 194), // Don't forget the comma if adding a new row + TERMINAL:new Array(20, 21, 22, 150, 151, 152, 153), + HAPPY:new Array(20,21,30,31,40,41), + BLUE:new Array(30,31,35), + GO:new Array(50, 130,190,191,192,193,194), + FOREST:new Array(110, 110), + SUBURB:new Array(68, 69, 78, 79), + FIELDS:new Array(246, 250, 270, 271, 272, 273), + TRAIN:new Array(3, 3) + } + + /** + * Produce an animated tile sprite based on the map name, and the index of the tile + *(With respect to the tileset) + * @param x x-coord in WORLD SPACE + * @return 1 if sprite added, 0 if not. + */ + public static function make_anim_tile(anim_tile_group:FlxGroup, MapName:String, tileType:Int, x:Int=0, y:Int=0):Int { + + // Check if this map even has animated tiles + if(animtiles_indices_dict.hasOwnProperty(MapName)){ + // Check whether this tile type doesn't need an animated tile + if(animtiles_indices_dict[MapName].indexOf(tileType)==-1){ + return 0; + } + } else { + return 0; + } + + var anim_tile:FlxSprite=new FlxSprite(x, y);// This will be our animated tile. + if(MapName=="BEACH"){ // If we're in the BEACH + if(tileType==250 || tileType==251 || tileType==252 || tileType>=260){ + anim_tile.loadGraphic(Shoreline_Anims, true, false,16,16); + } + switch(tileType){ + case 251: + anim_tile.addAnimation("a", [ 0, 1, 2, 3, 4, 5], 4, true);break; + case 261: + anim_tile.addAnimation("a", [ 6, 7, 8, 9, 10, 11], 4, true);break; + case 252: + anim_tile.addAnimation("a", [30, 31, 32, 33, 34, 35], 4, true);break; + case 262: + anim_tile.addAnimation("a", [36, 37, 38, 39, 40, 41], 4, true);break; + case 272: + anim_tile.addAnimation("a", [42, 43, 44, 45, 46, 47], 4, true);break; + case 250: + anim_tile.addAnimation("a", [12, 13, 14, 15, 16, 17], 4, true);break; + case 260: + anim_tile.addAnimation("a", [18, 19, 20, 21, 22, 23], 4, true);break; + case 270: + anim_tile.addAnimation("a", [24, 25, 26, 27, 28, 29], 4, true);break; + } + if(tileType<=151 ||(tileType>=253 && tileType<=257)){ + anim_tile.loadGraphic(Beach_Anims, true, false, 16, 16); + } + switch(tileType){ + case 109: + anim_tile.addAnimation("a", [0, 1], 4, true);break; + case 116: + anim_tile.addAnimation("a", [2, 3], 4, true);break; + case 117: + anim_tile.addAnimation("a", [4, 5], 4, true);break; + case 118: + anim_tile.addAnimation("a", [6, 7], 4, true);break; + case 119: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + case 141: + anim_tile.addAnimation("a", [10, 11], 4, true);break; + case 142: + anim_tile.addAnimation("a", [12, 13], 4, true);break; + case 143: + anim_tile.addAnimation("a", [14, 15], 4, true);break; + case 144: + anim_tile.addAnimation("a", [16, 17], 4, true);break; + case 145: + anim_tile.addAnimation("a", [18, 19], 4, true);break; + case 150: + anim_tile.addAnimation("a", [20, 21], 4, true);break; + case 151: + anim_tile.addAnimation("a", [22, 23], 4, true);break; + case 253: + anim_tile.addAnimation("a", [24, 25], 4, true);break; + case 254: + anim_tile.addAnimation("a", [26, 27], 4, true);break; + case 255: + anim_tile.addAnimation("a", [28, 29], 4, true);break; + case 256: + anim_tile.addAnimation("a", [30, 31], 4, true);break; + case 257: + anim_tile.addAnimation("a", [32, 33], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="DEBUG"){ + //R D L U NONE + // CONVEYER TILE TEST. + if(tileType<=20 && tileType>=16){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 16: + anim_tile.addAnimation("a", [0, 4], 4, true);break; + case 17: + anim_tile.addAnimation("a", [1, 5], 4, true);break; + case 18: + anim_tile.addAnimation("a", [2, 6], 4, true);break; + case 19: + anim_tile.addAnimation("a", [3, 7], 4, true);break; + case 20: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="REDCAVE"){ + if(tileType>=16 && tileType<=19){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 16: + anim_tile.addAnimation("a", [16, 17, 18], 4, true);break; + case 17: + anim_tile.addAnimation("a", [20, 21, 22], 4, true);break; + case 18: + anim_tile.addAnimation("a", [24, 25, 26], 4, true);break; + case 19: + anim_tile.addAnimation("a", [28, 29, 30], 4, true);break; + } + if(tileType==30 || tileType==32){ + anim_tile.loadGraphic(Flame_Anims, true, false, 16, 16); + } + switch(tileType){ + case 30: + case 32: + anim_tile.addAnimation("a", [0, 1, 2], 6, true);break; + } + if(tileType>=70 && tileType<=76){ + anim_tile.loadGraphic(Water_Edge_Anims, true, false, 16, 16); + } + switch(tileType){ + case 70: + anim_tile.addAnimation("a", [10, 11], 4, true);break; + case 71: + anim_tile.addAnimation("a", [12, 13], 4, true);break; + case 72: + anim_tile.addAnimation("a", [14, 15], 4, true);break; + case 73: + anim_tile.addAnimation("a", [16, 17], 4, true);break; + case 74: + anim_tile.addAnimation("a", [18, 19], 4, true);break; + case 75: + anim_tile.addAnimation("a", [20, 21], 4, true);break; + case 76: + anim_tile.addAnimation("a", [22, 23], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="WINDMILL"){ + if(tileType==130){ + anim_tile.loadGraphic(Windmill_Drops_Anims, true, false, 16, 16); + } + switch(tileType){ + case 130: + anim_tile.addAnimation("a", [0, 1, 2, 3, 4, 5], 10, true);break; + } + anim_tile.play("a"); + } else if(MapName=="FOREST"){ + if(tileType==110){ + anim_tile.loadGraphic(Forest_Anims, true, false, 16, 16); + } + switch(tileType){ + case 110: + anim_tile.addAnimation("a", [0, 1, 2], 3, true);break; + } + anim_tile.play("a"); + } else if(MapName=="GO"){ + if(tileType==50 || tileType==130 || tileType>=190){ + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + } + switch(tileType){ + case 50: + anim_tile.addAnimation("a", [60, 61], 3, true);break; + case 130: + anim_tile.addAnimation("a", [54, 55, 56], 4, true);break; + case 190:// red right + anim_tile.addAnimation("a", [0,1,2], 4, true);break; + case 191:// red up + anim_tile.addAnimation("a", [18,19,20], 4, true);break; + case 192:// blue left + anim_tile.addAnimation("a", [36,37,38], 4, true);break; + case 193:// blue up + anim_tile.addAnimation("a", [42,43,44], 4, true);break; + case 194:// mix up + anim_tile.addAnimation("a", [48,49,50], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="TRAIN"){ + if(tileType==3){ + anim_tile.loadGraphic(Cell_Anims, true, false, 16, 16); + } + switch(tileType){ + case 3: + anim_tile.addAnimation("a", [0, 1], 3, true);break; + } + anim_tile.play("a"); + } else if(MapName=="FIELDS"){ + if(tileType==250 || tileType==246){ + anim_tile.loadGraphic(Fields_Anims, true, false, 16, 16); + } + switch(tileType){ + case 246: + anim_tile.addAnimation("a", [10, 11], 3, true);break; + case 250: + anim_tile.addAnimation("a", [0, 1, 2], 3, true);break; + } + if(tileType>=270 && tileType<=273){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 270: + anim_tile.addAnimation("a", [48, 49, 50], 4, true);break; + case 271: + anim_tile.addAnimation("a", [52, 53, 54], 4, true);break; + case 272: + anim_tile.addAnimation("a", [56, 57, 58], 4, true);break; + case 273: + anim_tile.addAnimation("a", [60, 61, 62], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="SUBURB"){ + if(tileType==68 || tileType==69 || tileType==78 || tileType==79){ + anim_tile.loadGraphic(Suburbs_Anims, true, false, 16, 16); + } + switch(tileType){ + case 68: + anim_tile.addAnimation("a", [0, 2], 4, true);break; + case 69: + anim_tile.addAnimation("a", [1, 3], 4, true);break; + case 78: + anim_tile.addAnimation("a", [4, 6], 4, true);break; + case 79: + anim_tile.addAnimation("a", [5, 7], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="CIRCUS"){ + if(tileType==41 || tileType==46){ + anim_tile.loadGraphic(Torch_Pillar_Anims, true, false, 16, 16); + } + switch(tileType){ + case 41: + anim_tile.addAnimation("a", [3, 4, 5], 7, true);break; + case 46: + anim_tile.addAnimation("a", [0, 1, 2], 7, true);break; + } + if(tileType>=111 && tileType<=114){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 111: + anim_tile.addAnimation("a", [32, 33, 34], 4, true);break; + case 112: + anim_tile.addAnimation("a", [36, 37, 38], 4, true);break; + case 113: + anim_tile.addAnimation("a", [40, 41, 42], 4, true);break; + case 114: + anim_tile.addAnimation("a", [44, 45, 46], 4, true);break; + } + if(tileType>=111 && tileType<=114){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + /*switch(tileType){ + case 111: + anim_tile.addAnimation("a", [16, 17, 18], 4, true);break; + case 112: + anim_tile.addAnimation("a", [20, 21, 22], 4, true);break; + case 113: + anim_tile.addAnimation("a", [24, 25, 26], 4, true);break; + case 114: + anim_tile.addAnimation("a", [28, 29, 30], 4, true);break; + }*/ + anim_tile.play("a"); + } else if(MapName=="HOTEL"){ + if(tileType>=180 && tileType<=183){ + anim_tile.loadGraphic(Conveyer_Anims, true, false, 16, 16); + } + switch(tileType){ + case 180: + anim_tile.addAnimation("a", [32, 33, 34], 4, true);break; + case 181: + anim_tile.addAnimation("a", [36, 37, 38], 4, true);break; + case 182: + anim_tile.addAnimation("a", [40, 41, 42], 4, true);break; + case 183: + anim_tile.addAnimation("a", [44, 45, 46], 4, true);break; + } + if(tileType>=190 && tileType<=194){ + anim_tile.loadGraphic(Water_Edge_Anims, true, false, 16, 16); + } + switch(tileType){ + case 190: + anim_tile.addAnimation("a", [0, 1], 4, true);break; + case 191: + anim_tile.addAnimation("a", [2, 3], 4, true);break; + case 192: + anim_tile.addAnimation("a", [4, 5], 4, true);break; + case 193: + anim_tile.addAnimation("a", [6, 7], 4, true);break; + case 194: + anim_tile.addAnimation("a", [8, 9], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="TERMINAL"){ + if((tileType>=20 && tileType<=22)||(tileType>=150 && tileType<=153)){ + anim_tile.loadGraphic(Terminal_Anims, true, false, 16, 16); + } + switch(tileType){ + case 20: + anim_tile.addAnimation("a", [12, 13, 14], 3, true);break; + case 21: + anim_tile.addAnimation("a", [15, 16, 17], 3, true);break; + case 22: + anim_tile.addAnimation("a", [18, 19, 20], 3, true);break; + case 150: + anim_tile.addAnimation("a", [0, 1, 2], 4, true);break; + case 151: + anim_tile.addAnimation("a", [3, 4, 5], 4, true);break; + case 152: + anim_tile.addAnimation("a", [6, 7, 8], 4, true);break; + case 153: + anim_tile.addAnimation("a", [9, 10, 11], 4, true);break; + } + anim_tile.play("a"); + } else if(MapName=="HAPPY"){ + anim_tile.loadGraphic(Happy_Anims, true, false, 16, 16); + switch(tileType){ + case 21:// burning tree single + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + break; + case 20://normal tree single + case 30:// normal tree multiple + if(Registry.GE_States[Registry.GE_Happy_Started]){ + if(Registry.CURRENT_GRID_X==4 && Registry.CURRENT_GRID_Y==1){ + if(tileType==20){ + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + } else { + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + } + } else if(Registry.CURRENT_GRID_X==1 && Registry.CURRENT_GRID_Y==2){ + if(tileType==20){ + anim_tile.addAnimation("a", [10, 11, 12], 7, true); + } else { + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + } + } else { + anim_tile=null; + } + } else { + anim_tile=null; + } + break; + case 31:// burning tree multiple + + anim_tile.addAnimation("a", [0, 1, 2], 7, true); + break; + case 40:// right + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + anim_tile.addAnimation("a", [0,1], 5); + break; + case 41: + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + anim_tile.addAnimation("a", [6, 7], 5); + break; + } + if(anim_tile !=null)anim_tile.play("a"); + } else if(MapName=="BLUE"){ + anim_tile.loadGraphic(Go_Anims, true, false, 16, 16); + switch(tileType){ + case 30://left + anim_tile.addAnimation("a", [36,37,38], 6); + break; + case 31://down + anim_tile.addAnimation("a", [30, 31, 32], 6); + break; + } + anim_tile.play("a"); + } else { // Catches errors where we forget to add an else if block for some map + anim_tile=null; + } + + // Make sure the tile is valid before we add it + if(anim_tile !=null && anim_tile._curAnim !=null){ + anim_tile_group.add(anim_tile); + return 1; + } + + return 0; + } + + + public static function set_tile_properties(curMapBuf:FlxTilemap):Void { + CUR_MAP_HAS_CONVEYERS=false; + HOLE_INDICES=new Array(); + var j:Int=0; + var no_tiles_yet:Array=new Array("DEBUG"); + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + for(j=TileData.Overworld_Tilemap_Nonsolid_Row_offset*TileData.Overworld_Tileset_Width;jtx + 16)return; + if(o.y + o.height>ty + 13){ + o.y=ty + 13 - o.height; + o.velocity.y=0; + } + } + + + public static function thin_up(tile:FlxTile, o:FlxObject):Void { + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + if(o.x + o.widthtx + 16)return; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + if(o.yty + 16)return; + if(o.xty + 16)return; + if(o.x + o.width>tx + 13){ + o.x=tx + 13 - o.width; + o.velocity.x=0; + } + + } + + // fine tune hitboxes on these + public static function hole(tile:FlxTile, p:Dynamic):Void { + if(!p.has_tile_callbacks)return; + if(!p.hasOwnProperty("cid"))return; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + tx +=4; + ty +=5; + + if(p.cid==CLASS_ID.PLAYER){ + tx -=4; + if(p.state==p.S_AIR)return; + var t_height:Int=4; + if(p.facing==FlxObject.UP)t_height=1; + if((p.yty)&& + (p.xtx + 5)){ // 6 0 + p.isFalling=true; + p.fall_pt.x=tx + 7; + p.fall_pt.y=ty - 5; + } + } else if(p.cid==CLASS_ID.DUST && p !=Registry.GAMESTATE.player.raft){ + if((p.yty)&& + (p.xtx)){ + if(p.frame==0) + p.fell_in_hole=true; + } + } else if(p.cid==CLASS_ID.DASHTRAP){ + if((p.yty)&& + (p.xtx)){ + p.touching=FlxObject.ANY; + + } + } else if(p.cid==CLASS_ID.SILVERFISH){ + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + } else if(p.cid==CLASS_ID.PERSON){ + + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + + + } else { //probably an enemy, try to make them not walk on the hole + // FUCK IT THEY DDISAPPEAR + p.velocity.x *=0.25; + p.velocity.y *=0.25; + if((p.yty)&& + (p.xtx)){ + p.xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + p.exists=false; + } + } + } + public static function slow(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + if(p.state==p.S_AIR)return; + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if((p.yty)&& + (p.xtx)){ + p.slow_mul=0.5; + } + + } + + public static function spike(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + if(p.state==p.S_AIR)return; + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if((p.yty + 6)&& + (p.xtx + 6)){ + p.touchDamage(1); + } + } + + public static function ladder(tile:FlxTile, p:Player):Void { + if(!p.has_tile_callbacks)return; + //add general stuff + + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + ty=(int(tile.mapIndex / Registry.GAMESTATE.map_bg_2.widthInTiles))* 16 + 20; + tx=Std.int(tile.mapIndex % Registry.GAMESTATE.map_bg_2.widthInTiles)* 16; + } + if((p.yty)&& + (p.xtx)){ + // Deal with jumping onto ladder + if(p.state==p.S_AIR){ + return; + var diff:Int=p.offset.y - p.DEFAULT_Y_OFFSET; + p.y -=diff; + p.offset.y=p.DEFAULT_Y_OFFSET; + } + p.state=p.S_LADDER; + } + + } + + static private function pt_in_tile(x:Int,y:Int,tile:FlxTile):Bool + { + var off_x:Int=Registry.CURRENT_GRID_X * 160; + var off_y:Int=Registry.CURRENT_GRID_Y * 160 + 20; + var tx:Int=Std.int(tile.mapIndex % 10)* 16 + off_x; + var ty:Int=(int(tile.mapIndex / 10))* 16 + off_y; + return((y<=ty + 16)&&(y>=ty)&& + (x<=tx + 16)&&(x>=tx)); + } + +} \ No newline at end of file diff --git a/intra/source/data/dialogue_EN.txt b/intra/source/data/dialogue_EN.txt new file mode 100644 index 0000000..dae9680 --- /dev/null +++ b/intra/source/data/dialogue_EN.txt @@ -0,0 +1,1778 @@ +### ENGLISH DIALOGUE ### + +#################### +### INSTRUCTIONS ### +#################### +# 0. If you could comment out the english version when you translate that would be useful for me! +# +# 1. - Any line starting with "#" doesn't need to be translated +# +# 2. SPECIAL KEYWORDS THAT SHOULDN'T BE TRANSLATED: +# Any line starting with: (where "..." is some other keyword , usually an NPC name or area name) +# +# does reset +# LOOP +# TOP +# npc ... +# area ... +# scene ... +# end scene +# end npc +# end area +# DONE +# +# 3. SPECIAL INSTRUCTIONS SYMBOLS +# ---------------------------- +# [SOMEKEY-C] means that this can change depending on what controls the user uses - it would be "C", "A", "ENTER", etc. Sometimes in the dialogue file I write +# Press +# [SOMEKEY-LEFT] +# set controls. +# +# And that implies that in-game, it will read "Press LEFT to set controls." +# +# 4. SPECIAL CHARACTERS IN DIALOGUE TO BE TRANSLATED +# ----------------------------------------------- +# \" and \' are for escaping the quotation characters. You can leave them like that. +# +# ^ Denotes the player will have to press the progress-dialogue-button again to continue the dialogue - you can leave it there (or move it around as needed in the translated sentence) +# \n denotes newline, you can leave it there. + +################## +# BEGIN DIALOGUE # +################## + +### 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +Like music? Talk to that terminal! +Like pain? Head on down south! + end scene + end area +end npc + +### 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +That acrobat is losing balance! Where is the safety net? +... + end scene + + scene holyshit +WOOAH + end scene + end area +end npc + +### 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +The lions are closing in on that juggler! +... + end scene + end area +end npc + +### 'briar' + +npc briar + area GO + scene before_fight +Briar: I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +Briar: ... +Briar: It’s not going to change, Young. This is all we’ll ever be. + end scene + + scene after_fight +Briar: Goodbye, Young. + end scene + + scene final +Briar: Dude, Young. +Briar: Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +Briar: Well, come on, let’s go get a sandwich or something. +Sage: You... you did adequately. Until we meet again. + end scene + end area +end npc + +### 'sage' +npc sage + area BLANK + scene intro +Mysterious voice: Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +You will press the \' +\' key to interact with objects and people around you. +And you will press the \' +\' key to access the menu, which will provide you with information about yourself and your surroundings. + end scene + end area + + area GO + + + scene posthappy_sage +Young... I just wanted to fix everything for you. +I hope... I hope you can do better than me. + end scene + + scene posthappy_mitra +Good luck, Young. +Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +You are fighting, Young. You are trying to understand. I hope you can work things out. + end scene + scene one +TOP +Sage: Young... this is my final warning... wait, who is that? +Mitra: My name is Mitra, and this is my bike, Wares! +Sage: I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +Mitra: I’m here to help my friend, Young.. +Sage: Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +Mitra: What do you mean? Wares and I-- +Sage: SHUT UP ABOUT YOUR STUPID BICYCLE!!! + end scene + + scene hit +TOP +Sage: ... +Mitra: Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +Mitra: Wares!!! +Mitra: Wares... +Mitra: Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +Sage: You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +Sage: Go talk to your \"friend\". +Mitra: We're just doing the best we can... + end scene + end area + area NEXUS + + + scene enter_nexus +TOP +Cloaked Man: Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +Enter the active portal on your left to begin your quest. +*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +LOOP +Just go in the damn door! + end scene + + # After entering STREET for the first time + scene after_ent_str +Why are you still here? + end scene + # After finishing BEDROOM + scene after_bed +Continue on, Young. That key you have found, there may be others like it - seek them out. +Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. + end scene + # After finishing first 3 dungeons + scene before_windmill +Take those three keys, Young, and unlock the way to the deeper realms of The Land. + end scene +#After windmill, but disappears after Sage fight + scene after_windmill +You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. + end scene + + scene all_card_first +Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +Sage: Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? +# Young swipes a few times +Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +LOOP +Keep your wits about you, Young. + end scene + end area + + area BEDROOM + scene after_boss +# Sage fades into room. +Sage: At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +Travel East and South through the temple grounds... you will find a use for that key. +LOOP +What, do you want a piggy back ride to the gate or something?? + end scene + end area + + area TERMINAL + scene before_fight +Sage: Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... + end scene + scene after_fight +Sage: Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. + end scene + scene entrance +Sage: Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +Sage: You’re not ready Young, first you must face more trials in The Land. +Sage: You have made progress, Young, but you must collect at least 36 cards to pass this gate. + end scene +# non idlnig stuff + scene etc +Sage: Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +Sage: Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! + end scene + end area + + + + area REDCAVE + scene one +TOP +Sage: Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +Sage: Of course, you still have a long way to go. Have you been exploring The Land? + end scene + end area + + area CROWD + scene one +Sage: Well done, Young. However, there are still trials to face. Do not let your guard down. +Sage: Have you found all of the keys yet, Young? If not, go to the beach. + end scene + end area + + + +end npc + +npc cliff_dog + area CLIFF + scene top_left +I'm not like the others! *woof* I won't harm you... +It is a quiet existence up here. +You smell like swiss chard. +LOOP +*woof* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +So beautiful... + end scene + + scene dump +Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +Hahaha. Hahahahaha. HAHAHAHAHAHAHA! + end scene + + scene drink +Hey sexy, I’ll buy you a drink! +Have another drink, you little shit! Hahaha! + end scene + + scene hot +Fuck, it’s hot here... I’m so hot... and sweatyyy... +Damn, working out makes me horny! + end scene + + scene gold +Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +Seriously, why are you just standing there? Help me jack this brick! + end scene + + scene briar +???: Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! + end scene + end area +end npc + +### 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +HEADS UP! +#Mitra swerves to avoid you and crashes +Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! +#Plays if you talk 3 times, or if you leave the screen +Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. +#Mitra bikes away + end scene + end area + area BLUE + scene one +HEADS UP! All right Wares, let’s do this! +Annnd presto! +Keep going, Young, we’ve got your back! + end scene + end area + + area FIELDS + scene init +Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +LOOP +Mitra: So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +Mitra: See you around, Young! + end scene + scene quest_event +Mitra: Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. + end scene + +# Hints for the game - not cards + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) +# 0 ignore this +Nothing. +# 1. Beach hint (no dungeons finshed) +Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +# 2. Forest hint (no dungeons finished) +Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +# 3. Windmill hint +Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +# 4. Generic hint to go past statues +Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +# 5. finished 6 bosses, all 36... +Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +# 6. hints for go things +What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +# 7. crowd finished but not redcave +How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! +#8. redcave finished but not crowd +Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +Mitra: Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +Mitra: Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +Mitra: Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +Mitra: Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +Mitra: Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +Mitra: Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +Mitra: Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +Mitra: Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +Mitra: Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +Mitra: Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +Mitra: Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +Mitra: Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +Mitra: Hey Young, looking for a card?\nI know someone left a card near the windmill. +Mitra: Hey Young, looking for a card?\nLook around the rivers in the forest... +Mitra: Hey Young, looking for a card?\nTry poking around the base of the mountains. +Mitra: Hey Young, looking for a card?\nTry going to the summit of the mountains. +Mitra: Hey Young, looking for a card?\nThe far end of the beach may hold something. +Mitra: Hey Young, looking for a card?\nTake a walk in the crimson woods. +Mitra: Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +Mitra: Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end! +Mitra: Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +Mitra: Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +Mitra: Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +Mitra: Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +Mitra: Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +Mitra: Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +Mitra: Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +Mitra: Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +Mitra: Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +Mitra: Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +Mitra: Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +Mitra: Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +Mitra: Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +Mitra: Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +Mitra: Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +Mitra: Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +# and a bonus one if for some reason you make it this far without finding any... +...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? + end scene + +#General random stuff + scene general_banter +Did you find that guy who was looking for something in the mountains? +Do you know what my bike’s surname is? …Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +So what is The Briar? Some sort of ancient artifact from a lost culture? +I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +Hey Young, I just wanted to tell you... your hair is awesome. + end scene + + end area +end npc + +### Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +Statue: The Village Elder in name only, for he is neither. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +Statue: I’ve seen a broom in a legend... it was on the map of a janitor closet. + end scene + end area + + area BEDROOM + scene after_boss +Statue: Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. + end scene + end area + area REDCAVE + scene one +Statue: Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! + end scene + end area + area TERMINAL + scene one +When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! + end scene + end area +end npc + +### sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced +# This line must be played once before anything else can +Edward: Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +LOOP +Edward: This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. + end scene + + scene bedroom_not_done +Edward: Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. + end scene + + scene bedroom_done +Edward: You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. + end scene + + end area +end npc + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in “The Land”, and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! + end scene + scene after_fight +I will be with you, Young, whenever you are alone. And remember my advice on your little “adventure”. + end scene + end area +end npc + +# rock (Rock with words) +npc rock + + area BEDROOM + scene one +Rock: Peripheral vision is the hive of demons. + end scene + scene two +Rock: To-do: Construct method of transportation to Nexus. Progress: Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. + end scene + scene three +Rock: I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. + end scene + end area + + area BLUE + scene one +This wheel is used to lift the dam. + end scene + end area + area CIRCUS + + scene one +June 24th, 1957: Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. + end scene + scene two +July 17th, 1957: Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. + end scene + scene three +July 21st, 1957: Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. + end scene + scene four +August 5th, 1957: In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. + end scene + scene five +August 7th, 1957: How many of us will suffer before we accept the truth of the Seeing One? + end scene + + scene six +August 8th, 1957: I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. + end scene + end area + area CLIFF + scene one +(Indecipherable markings) + end scene + scene two +December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! + end scene + scene three +Danger! This cave is unexplored. + end scene + scene four +These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. + end scene + end area + + + area CROWD + scene one +Rock: How? + end scene + scene two +Rock: Warning! Vertical drop, jump at your own risk. + end scene + end area + + area DEBUG + scene one +This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +I forget why we ended up scrapping it. Perhaps too dramatic. + end scene + + scene two +Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. + end scene + + scene three +Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! + end scene + + scene four +PRISON!!! +Save us!!! +Please! + end scene + + scene five +Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world (90 PER-CENT) \"Non-canon\". Anyways. +Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with her tilesets. + end scene + + scene six +fille + end scene + end area + + area DRAWER + scene five +-ARCHIVES- +PROCEED WITH CAUTION + end scene + scene four +West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. + end scene + scene three +The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. + end scene + scene two +COLD STORAGE\n\n^ -- THE MGMT + end scene + scene one +CONTINUE + end scene + end area + + area FIELDS + scene one +West: Beach\n\nEast: Forest\n\nSoutheast:\n Rainy Area\n\nNorth: \nTemple Grounds\n\nNorthwest: Chasm + end scene + end area + + area FOREST + scene one +West: Land Lake\nSouth, then east: Cliffs + end scene + scene two +Relaxation pond. Stay a while, we know you have the time. + end scene + scene three +I'm afraid I may be stuck on this tiny corner forever. + end scene + scene four +East: Cliffs + end scene + end area + + area GO + scene one + The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. + end scene + + scene two +When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. + end scene + + scene three +The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. + end scene + + scene four +The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. + end scene + + + end area + + area BLANK + #initial entrance from windmill + scene one +Rock: This is unclaimed territory - not yet a part of The Land. + end scene + #concentric circles + scene two +Rock: These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. + end scene + #islands + scene three +Rock: Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! + end scene + #mazeish place, not near the portal + scene four +Rock: Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. + end scene + #left part of the 48 gate + scene five +Rock: My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. + end scene + end area + + + area NEXUS + scene one +Sometimes if you talk to people multiple times, they have new things to say. +But not rocks. Rocks don’t do that. + end scene + #before 49 card agate + scene two +Rock: So close! If only... + end scene + #door that goes nowhere + scene three +Rock: Curiosity is a great thing. + end scene + #below treasure box + scene four +Rock: Oh!...? + end scene + scene five +The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads: \"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" + end scene + end area + + + area OVERWORLD + scene one +Rock: I’ll bet you’re reading a rock because you don’t have any friends. + end scene + scene two +Rock: Welcome to Overworld Station. We hope you enjoyed your time in The Land. + end scene + scene three +Rock: An explorer is you! +Rock: Please don't go south. It's under construction. + end scene + scene four +Rock: Treasure in 5,3! + end scene + scene five +Rock: Haha, gotcha! + end scene + end area + + area REDCAVE + scene one +WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. + end scene + scene two +ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. + end scene + scene three +WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. + end scene + end area +# area for redsea + area REDSEA + scene one +Rock: Signs indicate the trees have not been active for an extended period of time. + end scene + scene two +Rock: South: ???^ North: ??? + end scene + scene three +Rock: The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. + end scene + scene four +Rock: They appear to be a peaceful species. + end scene + end area + + + area SPACE + #middle + scene one + Scribbled in what appears to be permanent marker: Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + (Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (Even further below the message:) (just don't go too far south.) + end scene + # extra color + scene two +Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbows! +Would've been better with achievements. + end scene + #grey graves + scene three +Here lies Burd. The cliffs weren't feeling too friendly. + end scene + scene four +Here lies bag. It never had a chance. +Pretentious! + end scene + # color graves + scene five +Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. + end scene + scene six +Here lies Dave. He wasn't very inspirational. + end scene + + end area + + area SUBURB + scene one + ---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + end scene + + scene two + To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + end scene + + scene three + On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + end scene + + scene four + I remember the long sentences I used to write. Ha! Fragmented. + end scene + + scene five + A DANGEROUS SITUATION + end scene + end area + + +# Area for TRAIN (it's actually CELL sorry) + area TRAIN + scene one +The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. + end scene + scene two +Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. + end scene + scene three +Move along. + end scene + scene four +Do not anger the Chasers with violence. + end scene + end area + + area WINDMILL + scene one +SCENIC LANDMARK: Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. + end scene + scene two +PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT + end scene + end area +end npc + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +The statue does not look like it will be moving anytime soon. + end scene + scene two +The statue has moved. + end scene + end area + + area REDCAVE + scene one +It looks like this statue is firmly in place. + end scene + scene two +The statue has moved. + end scene + end area + + area CROWD + scene one +This statue does not seem to be movable. + end scene + scene two +The statue has moved. + end scene + end area +end npc + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. + end scene + scene after_fight +Okay, so stars aren't really made of fire. ^Who gives a shit anyway? + end scene + end area +end npc + +npc cube_king + area SPACE + # kings are supposed to offer info on + scene color + How are you today? I'm the ruler of this partition and interpretation of space. + You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. + Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. + LOOP + Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! + The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. + Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... + ...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. + Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. + I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. + I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. + I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. + It was nice to meet you. + Oh, you want to hear my story again? + Okay, sit tight. + end scene + + scene gray + Hello there. I'm the ruler of this part of space. + What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! + Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! + LOOP + Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. + Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. + My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. + But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. + So you're not actually talking to their physical forms, but a representation of them in some holographic form. + I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. + There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. + But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. + It was nice talking at you, good luck with whatever you're up to. + You're still here? I can tell you everything again, if you'd like. + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +Crickson: Hey ya big bully! I’m not afraid of you! +Crickson: Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +Crickson: Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! + end scene + + scene thorax +Thorax: I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +Thorax: Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +Thorax: Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +Buy my stuff + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +What are you doing here, punk? Get lost! I caught it fair and square! +I won’t let it go! Not in a million years! + end scene + + scene inside +Oh, did you come here to terrorize me some more? +You’re just siding with the cats because they are cute and furry. + end scene + + scene etc +TOP +What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +Young opens and takes the box. Something is inside it! +Icky: Oh. Hey Miao.^\n\nMiao: I’m so glad you’re safe!^\n\nIcky: Uh... thanks for the hand, Young. +LOOP +Icky: To be honest, I kind of like sitting in boxes. + end scene + end area +end npc + +npc miao + area FIELDS + + scene init +Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +Could I follow you around for a bit to watch a Chosen One in action? +LOOP +Hello again, Young! Can I shadow you today? + end scene + + scene randoms +# 0. after talk to shopkeep +Miao: Hey, Young… have you ever stolen anything? +# 1. AFter talk to mitra +Miao: I like Mitra... and isn’t Wares a handsome bike? +# 2. Nexus pad +Miao: What’s that cool stone thing, Young? Does it make you go back in time?! +# 3. Random if Icky not saved +Miao: I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +# 4. leave map +Miao: Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +# 5, 6, 7 - only after you've seen 0, 1, 2 +Miao: Have you ever sat in a bunch of grocery bags? +Miao: Hey Young, do you think it’s wrong to do catnip? +Miao: I bet it must have taken a lot of work to become The Chosen One, huh, Young? + end scene +# musing after you save icky + scene philosophy +That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +And then what is our reward for completing our journey? Do we just fade away? +LOOP +Hmm... + end scene +# icky talking after yoh save icky + scene icky +Oh. Hi, Young. +My name’s not really Icky. It’s Ichabod. +I hope Miao Xiao Tuan Er hasn’t been too much trouble. +See you later, Young. + end scene + end area +end npc + +npc generic_npc + + area DEBUG + scene melos +Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +You can blame me for all of those awful rooms! I made them with the DAME map editor. +I made this game with FlashDevelop IDE and the Flixel AS3 framework! +Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +Hi mom! ^And dad! +Want to know how to finish the game in 20 minutes? +Ha! Like I'd tell you! +(...maybe if you ask me nicely...) + end scene + scene marina +Woah hey! +I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! + end scene + end area +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +The humidity here is good for your skin, but bad for your hair. +I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. + end scene + + scene second +Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. + end scene + + scene bomb +Get away from me. +I’m serious... leave me alone now. + end scene + + end area + area BLUE + scene one +I don’t need your pity, Young. +Right, just go on living in your happy little world, “Chosen One”... +You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +Hah, I knew you hated me, Young. +I’m doing fine. +Of course you don’t care, no one does. + end scene + end area + + area HOTEL + scene one +I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +I’m sorry, I’m babbling. Thanks for listening. + end scene + end area + + area REDCAVE + scene easter_egg +Heeyyyy, mannn...take a load off, stay a whilleee, eh? + end scene + end area + + area APARTMENT + scene easter_egg +Ah! You found me! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what htey say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + + scene quest_normal +Golem: Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +Golem: My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. + end scene + + scene second +Golem: When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +Golem: At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +Golem: Actually, I don’t miss watching people much, it’s a bore. + end scene + + scene quest_event +Golem: Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. + end scene + end area + + + area BEACH + scene quest_normal +I’m not a lobster, I’m a langostino. The name’s Hews. +LOOP +Hews: You know what the best part of the ocean is? Being able to see the horizon. +Hews: The ocean is like a salty taste of infinity. +Hews: A crowded beach is robbed of its grace. + end scene + + scene second +Hews: Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +Hews: Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. + end scene + + scene quest_event +Hews: You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. + end scene + end area + + area FOREST + scene quest_normal +#npc james +James: Berries are a good kind of food. I like berries. +James: Please make sure not to defecate on the berries. +James: So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +James: Do you have any berries for James? + end scene + + scene second +James: I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +James: Do you like blueberries or raspberries more? +James: Do you have any berries for James? + end scene + + scene quest_event +James: Someone came by. They did not want berries. Went to southeast part of lake to the west. + end scene + + end area +#npc rank +#npc olive + area FIELDS + scene easter_egg +Olive: Hi, I'm Olive the rabbit. +Olive: I have so much cereal left to eat! I love cereal. +Olive: The box is so big. It never ends! +Olive: Neverending cereal! +Olive: Hmmm...maybe that's not such a bad thing. + end scene + + scene bush +Rank: Eheheh, silly Young! A broom’s no tool for cutting bushes! + end scene + scene quest_normal +Rank: I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +Rank: The economy has been really struggling under this bush... +Rank: Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! + end scene + scene quest_event +Rank: Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! + end scene + + scene marvin +Marvin: Oh hey, how are you feeling? +Marvin: Where is Justin? +Marvin: There's no bottle rockets around... + end scene + + scene chikapu +Chika Chi! +Chika Chika!! +CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! + end scene + + scene hamster +Bob: Bob the Hamster likes to refer to himself in the third person. +Bob: Apostrophes are the root of all e'vil. +Bob: quiet! I am busy exuding an aura of hamstery ambiance. +Bob: ... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +Bob: A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +Bob: This game was created by an infinite number of monkeys working on an infinite number of typewriters. +Bob: I miss James... + end scene + + scene electric +Kuribu: Curry is yellow and spicy! +Kuribu: For the clever opponent, injure increase! +Kuribu: You got the experience of 2! +Kuribu: I tell you my phone number! 0*1-51*7-*4386 + end scene + + end area + + + area TRAIN + scene quest_normal +What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. + end scene + scene quest_event +Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. + end scene + end area + + area SUBURB + scene quest_normal +Hello. +Are you looking for something? +What are you looking at? +No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. + end scene + scene quest_event +Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. + end scene + end area + + area SPACE + scene quest_normal +WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! + end scene + scene quest_event +OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? + end scene + end area + + area GO + scene quest_normal +You actually were...uh, ah. Well done. +LOOP +The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + scene quest_event +The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +HELLO. HAVE YOU MET cube YET? +cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. + end scene + + scene gray2 +WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +AN INTERSECTION OF WORLDS! + end scene + scene gray3 +NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. + end scene + + + scene graydead +*bzrrrrt* + end scene + + scene grayspin +...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +NO?^...^DAMN! + end scene + + + scene color1 +Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! + end scene + + scene color2 +CUBE does a lot of interesting work! +Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. + end scene + + scene color3 +I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. + end scene + + scene colordead +(...is it taking a nap?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. + end scene + scene after_fight +IS THIS YOUR PUNISHMENT FOR OUR REBELLION? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? + end scene + scene after_fight +...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +So good to see you, Yang. Been too long. Still playing those nintendos, I see? + end scene + scene after_fight +Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +We have all the finest amenities here. How do you like the Pool? + end scene + scene middle_fight +How about our state-of-the-art fitness center? + end scene + scene after_fight +We hope you enjoyed your stay! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +Today is a nice day. +Thanks for scratching that itch on my neck - I can't seem to reach it. +I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +Ah, I think I might be late for work. +I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +We're having a garage sale! +Welcome! + end scene + + scene words_teen +I didn't see the latest movie. + end scene + + scene words_kid +I never gotta see the new cartoon! + end scene + + scene family +# inside of a house, parent (insightful kid) - 73 +Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +#inside of house, younger kid +Do you like Davement? My brother Dave showed me this really cool song by them! + end scene + + scene older_kid +# inside of a house, olderkid +My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +I guess I'll just go write in my blog. +You sure look like you're in a daze. +I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. + end scene + +#inside of hanged man house 74 + scene hanged +A note on the corpse: \"Placing myself in danger no more.\" + end scene + + scene festive +#Inside of another house, (festival people) - 75 +Oh, is there something going on outside? A festival? A parade? +There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. + end scene +#78 + scene paranoid +My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +Please get out. + end scene +# 76 + scene dead +The body of this woman has been beaten to death by a blunt weapon. +The man, to put it bluntly, well... + end scene + + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +According to this pamphlet...you only need to kill a few more people! Keep it up. +We only need one more body, and then we can keep going. +Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? + end scene + end area +end npc +# dialogue for the cards +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +I don't mind being watched by the trees. +#1 Bat(?) - extra overworld area +Where is she?! +#2 sunguy +I will be with you Young, whenever you are alone. +#3 Shieldy +Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +#4 slime +Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +#5 post-statue area in BEDROOM +Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +#6 SUBURB inside of house past blocker +Limited time offer! Buy one, get one free - only today! +# 7 APT Boss +Remember the time that you lit a candle when the power was out? +# 8 APT Silverfish +Mmmm, your pillow was cozy last night. +# 9 APT gasguy +This'll teach 'em for calling me the fumi-GAY-tion guy. +# 10 FIELDS 1 (island) - mitra +Wares and I make a good team. +# 11 FIELDS 2 (alcove) - Miao +I'm the Chosen One-in-training!!! +#12 Base of WINDMILL windmill +Do you ever feel like, no matter what you do, you can't stop the world from dying? +#13 Hidden up a river in FOREST +Beware the forest mushrooms... +#14 Bottom of ladder-mini-maze on CLIFF +I am sorry. It is my nature. +#15 Top of Cliff +What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +#16 Western end of BEACH past spikes +Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +#17 At end of path through the woods in REDSEA +Sometimes the answer is taking a walk. +#18 MOVER Redcave - Past 2 locks in central redcave +Why do bats suddenly fly down, every time you're around? +#19 SLASHER Redcave - West end of Northern redcveave +NO, *YOU* NEED BRACES! +#20 REDBOSS Redcave - post boss +ARE YOU HAPPY NOW? +#21 NW corner of CELL - chaser +Don't get violent around me. +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +I've always wanted to be on Iron Chef. +#23 CONTORT circus - contort + firepillar room in SW chunk +My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +#24 LION circus - end of northern gauntlet bordering boss room +Are you amused yet, human? +#25 A+J BOSS circus - basement (post boss) +... +#26 FROG crowd - North of entrance +Scientifically speaking, toads are a subset of frogs. +#27 CROWD GUY crowd - 2nd floor +HAHAHAHA! Yeah! I know! +#28 WALL BOSS crowd - post boss +Oh, you collect cards, too? Real classy, Ying. +#29 end of grey end of space, for grey cube king +They always said, \"Get off the computer! Or you'll never make friends!\" +#30 end of colorful end of SPACE, for color cube king +I'm only the ruler for the extent of a conversation. +#31 DUSTER hotel - end of 4th floor moving platform area +I'll bet you think you're 'making my job interesting'! +#32 DASH TRAP hotel - Dash trap room on 3rd floor +I hate diagonals. +#33 BURST PLANT hotel - SE corner floor 2 +Don't even try that claritin clear shit with me. +#34 EYE BOSS hotel - post-boss +Swipe this card to unlock the door to your room! +#35 end of left-most TERMINAL bridge - sage +I'm doing a great job. +#36 Young (drawer APT) +.......?? +#37 old BDRM (dialogue rock) +Who carved all of us anyways? +#38 hotel room +I hope you enjoyed your stay. +#39 end of debug minidungeon (old player sprite) +Seening as you've gotten to this point, you must be quite Intrasting. +#40 end of cell - Torch? +I'm just here to lead you astray. +#41 end of SPACE - faces/entities +You like like a pyramid to us, too! +#42 end uf suburb (killer) +It's the same damn play, night after night, and the pay sucks. +#43 GOldma's room - goldman +Leave me alone! My last name isn't Sachs! +#44 blank, ISlands - Broom +At least I'm not a stick. +#45 fields, bottom right - (Rank) +What do you mean money doesn't grow on trees? Eheheheh! +#46 street, bottom (Follower bro) +I'm nothing but an illusion. +#47 redsea, bottom eft (Bomb npc) +I'LL TAKE IT OUT ON YOU. + end scene + end area +end npc + +npc misc + area any + + scene controls +Press +# [SOMEKEY-LEFT] +to set controls. +# [SOMEKEY-ENTER] +to cancel. +Up +Down +#5 +Left +Right +Jump +Attack +Menu +#10 +Press +# [SOMEKEY-ENTER] +to exit +# [SOMEKEY-LEFT] +to set controls. + end scene + + scene title +Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress +# [SOMEKEY-C] +when done. +ANODYNE +Melos Han-Tani\nMarina Kittaka +any key +#5 +Press +# [SOMEKEY-C] +to start +Version +Continue +New Game +#10 +Are you sure?\nNo\nYes +Really?\nNah\nYeah +No going back!\nForget it\nI know +deaths +cards +#15 +Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device. +Press BACK again\nto exit.\nUnsaved progress\nwill be lost. + end scene + + scene gui +# Note - this below one is a sprite that fits into the gui +menu=enter +# Shows up when you save at a checkpoint +Saving... + end scene + + scene map +Map +Current Room +Door/Exit +No Map +Return to\nNexus +Return to\nentrance + end scene + + scene items +Items +Normal +Swap +Extend +Widen +#5 +A pair of spring-loaded shoes - press +# [SOMEKEY-X] +to jump! +A pair of shoes for biking. +An empty cardboard box. +A key found in the Temple of the Seeing One. +#10 +A key found in a red, underground cave. +A key found in a mountain cave. + end scene + + scene cards +Cards +cards + end scene + + scene save +Save +Saved! +ERROR +Save and go\nto title +Go to title +#5 +Save and quit +Quit game +Deaths: + end scene + + scene config +Config +Set keybinds +Set volume +Autosave at\ncheckpoints: +On +# 5 +Off +Change\nResolution: +Config UI +Touch+D-Pad +D-Pad Only +# 10 +Touch Only +Move Input: +Resolution: +Windowed +Int. Scaled +# 15 +Stretch +Scaling: +Language: +ja +en +# 20 +Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +Resize Window +Config Joypad + end scene + + scene secrets +You\'re rolling in it! +Once the property of a famous Bubble Mage. +If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +This heart has no name. +Please visit the electric monsters\' world. +#5 +A kitty statue. Cute, but useless. +Oh my!!!! +Oh no!!!! +It\'s black. +It\'s red. +#10 +It\'s green. +It\'s blue. +It\'s white. +#SOMEKEY-C +:Select +#SOMEKEY-X +:Back + end scene + + scene swap +Sorry! +The swap won't work here. +Young could not muster the strength to use the swap here. + end scene + + scene keyblock +This door is locked. + end scene + + scene treasure +Some strange force stops this treasure box from being opened. +An engraving on the broom handle reads: Press +#SOMEKEY-C +to sweep. +This key may be used a single time to open up a locked barrier. +A mysterious pair of boots has nothing but the branding on it, which says \"Press +#SOMEKEY-X +#5 +\". +A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +A note next to the broom extension: \"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +YOU FOUND A HEART!!! Maximum Health increased by...zero. +#10 +Goldman: What? It's not there? That shopkeeper must have stolen it! + end scene + + scene dust +Your broom is now full of dust! Attack again to place it. + end scene + + scene checkpoint +Save game?\n Yes\n No +While standing on a checkpoint, press +#SOMEKEY-C +to save your progress and set it as your respawn point if you die. + end scene + + scene rock +There is writing scrawled on this rock: +# YA AINT GOT NO FRIENDS + end scene + + scene door +The portal does not appear to be active. + end scene + + scene keyblockgate +The gate stares, petrified. It won't open until it senses four cards... +Sensing four cards, the gate decides to open. +The gate stubbornly remains in place. +The gate senses all of the cards, and decides to open. +The gate senses enough cards, and decides to open. +#5 +It opens! +It remains closed. + end scene + + scene solidsprite +The sign points to the east but the words on it are faded. +The sign points to the west but the words on it are faded. +The words on the sign are faded. + end scene + + scene mitra +Hey, Young! +Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +to jump with them on! +Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +to jump with them on! +#5 +Alright, take care! +Go on, try them out! ...They're not THAT smelly. +Cool, huh? +Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +#somekey-x +to jump\". I've never understood that, though, because there's no \" +#somekey-x +#10 +\" anywhere on the shoes... + end scene + + scene tradenpc +Finty: Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +Finty: I still appreciate that box! +Finty: Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! +Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +As a token of my gratitude, take these stylish biking shoes! +# 5 +Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +Too bad, looks like you can't afford this item! Come back later, when you have the cash! +Finty: Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +Finty: That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +Finty: Oh ho ho, here's a specialty item indeed: clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +#10 +Finty: Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ + end scene + + #(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a newline in the middle) + scene ending +Anodyne\n-------\n\n\n\nA game created by\n\nMelos Han-Tani\n\nand\n\nMarina Kittaka\n\n------------- +Created from\n\nMarch, 2012\n\nto\n\nJanuary, 2013 +DESIGN\n------\nBoth +PROGRAMMING\n-----------\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\nART\n---\nMarina\n +MUSIC/SFX\n---------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\nDIALOGUE\n--------------\nMostly Marina\n +STORY\n-----\nBoth\nJapanese Localization:\nKakehashi Games +Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game. +O - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways. +Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport. (Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina. +Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up. +Mo, for believing\n in me.\n\nTina, for introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it. +CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer +Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n +Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n +Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n +Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n +Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera +Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews +Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman +Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites +Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +Young\n\n\nMitra\n\n\nSage\n\n\nBriar +And we'd like to\nthank YOU!\nFor playing our game!\n\n\nWe hope you\nenjoyed it. +\n\n\n\n\n\n\n\n +Now you have\nthe ability\nto explore Young's\nworld with (almost) no\nlimitations, via \nthe swap.\n + end scene + + scene elevator +Floor? +1\n +2\n +3\n +4\n +Cancel + end scene + end area +end npc + +# Tell the python script you're done. +DONE diff --git a/intra/source/data/dialogue_ES.txt b/intra/source/data/dialogue_ES.txt new file mode 100644 index 0000000..1dc2f06 --- /dev/null +++ b/intra/source/data/dialogue_ES.txt @@ -0,0 +1,2665 @@ +### ENGLISH DIALOGUE - SPANISH TRANSLATION - by Diego Fenollar ### + +#################### +### INSTRUCTIONS ### +#################### +# 0. If you could comment out the english version when you translate that would be useful for me! +# +# 1. - Any line starting with "#" doesn't need to be translated +# +# 2. SPECIAL KEYWORDS THAT SHOULDN'T BE TRANSLATED: +# Any line starting with: (where "..." is some other keyword , usually an NPC name or area name) +# +# does reset +# LOOP +# TOP +# npc ... +# area ... +# scene ... +# end scene +# end npc +# end area +# DONE +# +# 3. SPECIAL INSTRUCTIONS SYMBOLS +# ---------------------------- +# [SOMEKEY-C] means that this can change depending on what controls the user uses - it would be "C", "A", "ENTER", etc. Sometimes in the dialogue file I write +# Press +# [SOMEKEY-LEFT] +# set controls. +# +# And that implies that in-game, it will read "Press LEFT to set controls." +# +# 4. SPECIAL CHARACTERS IN DIALOGUE TO BE TRANSLATED +# ----------------------------------------------- +# \" and \' are for escaping the quotation characters. You can leave them like that. +# +# ^ Denotes the player will have to press the progress-dialogue-button again to continue the dialogue - you can leave it there (or move it around as needed in the translated sentence) +# \n denotes newline, you can leave it there. + +################### +# BEGIN DIALOGUE # +################### + +### 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +#Like music? Talk to that terminal! +¿Te gusta la música? ¡Habla con ese terminal! +#Like pain? Head on down south! +¿Te gusta el dolor? ¡Ve hacia el sur! + end scene + end area +end npc + +### 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +#That acrobat is losing balance! Where is the safety net? +¡Ese acróbata está perdiendo el equilibrio! ¿Dónde está la red de seguridad? +... + end scene + + scene holyshit +WOOAH + end scene + end area +end npc + +### 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +#The lions are closing in on that juggler! +¡Los leones están acorralando a ese malabarista! +... + end scene + end area +end npc + +### 'briar' + +npc briar + area GO + scene before_fight +#Briar: I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +Briar: Estoy cansado, Young. Estoy cansado de todas estas vueltas. Me siento como si estuviera viviendo el mismo sueño, la misma pesadilla una y otra vez. +Briar: ... +#Briar: It’s not going to change, Young. This is all we’ll ever be. +Briar: No va a cambiar, Young. Esto es lo que seremos por siempre. + end scene + + scene after_fight +#Briar: Goodbye, Young. +Briar: Adiós, Young. + end scene + + scene final +#Briar: Dude, Young. +Briar: Young, colega. +#Briar: Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +Briar: Patalea. Mueve los brazos. Dios, ¡no aguantarías ni un minuto sin mí! +#Briar: Well, come on, let’s go get a sandwich or something. +Briar: Bien, venga, vamos a por un sandwich o algo. +#Sage: You... you did adequately. Until we meet again. +Sage: Lo... lo hiciste adecuadamente. Hasta que nos volvamos a encontrar. + end scene + end area +end npc + +### 'sage' +npc sage + area BLANK + scene intro +#Mysterious voice: Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. +Voz misteriosa: ¿Hola? ¿...Young? ^EY! ... oh, ¿puedes oírme? Bien, ahora escucha. Estás a punto de despertar. Usarás las teclas de dirección para desplazarte. +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +#You will press the \' +Pulsarás la tecla \' +#\' key to interact with objects and people around you. +\' para interactuar con objetos y la gente a tu alrededor. +#And you will press the \' +Y pulsarás la tecla \' +#\' key to access the menu, which will provide you with information about yourself and your surroundings. +\' para acceder al menú, el cual te proporcionará información sobre ti mismo y tus alrededores. + end scene + end area + + area GO + + + scene posthappy_sage +#Young... I just wanted to fix everything for you. +Young... Yo sólo quería arregarlo todo para ti. +#I hope... I hope you can do better than me. +Espero... Espero que puedas hacerlo mejor que yo. + end scene + + scene posthappy_mitra +#Good luck, Young. +Buena suerte, Young. +#Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +Sage tiene razón, en parte. Quiero que todo sea agradable y que funcione a la perfección, y algunas veces eso me hace ignorar la realidad. +#I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +No sé qué necesitas hacer para ayudar a Briar. No entiendo cómo funciona este mundo o por qué todo parece tan extraño. Pero quiero ser tu amiga, en serio, Young. +#You are fighting, Young. You are trying to understand. I hope you can work things out. +Estás luchando, Young. Estás intentando entender. Espero que puedas aclarar las cosas. + end scene + scene one +TOP +#Sage: Young... this is my final warning... wait, who is that? +Sage: Young... esta es mi advertencia final... espera, ¿quién es? +#Mitra: My name is Mitra, and this is my bike, Wares! +Mitra: ¡Mi nombre es Mitra, y esta es mi bici, Wares! +#Sage: I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +Sage: No pregunté por el nombre de tu bicicleta, ¿qué estás haciendo aquí? No te recuerdo. +#Mitra: I’m here to help my friend, Young.. +Mitra: Estoy aquí para ayudar a mi amigo, Young... +#Sage: Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +Sage: Young no tiene amigos. Ni siquiera tiene a Briar. Y si tú estás animándolo, ¡entonces te quiero fuera de mi mundo! +#Mitra: What do you mean? Wares and I-- +Mitra: ¿Qué quieres decir? Wares y yo-- +#Sage: SHUT UP ABOUT YOUR STUPID BICYCLE!!! +Sage: ¡¡¡DEJA DE HABLAR DE TU ESTÚPIDA BICICLETA!!! + end scene + + scene hit +TOP +Sage: ... +#Mitra: Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +Mitra: ¡Young! ¿Estás bien? Lo que acabas de hacer ha sido realmente admirable... ¡Continúa y acaba esta estúpida área! ¡Sabemos que puedes lograrlo! +Mitra: Wares!!! +Mitra: Wares... +#Mitra: Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +Mitra: Mira, misterioso personaje encapuchado, no sé quién te crees que eres, ¿pero por qué no nos dejas a solas y punto? +#Sage: You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +Sage: Te crees amiga de Young porque le mentirás y le dirás que en el fondo él es simplemente perfecto y que todo saldrá bien. Bien, si eso es lo que quieres, VALE. Apártate de mi vista, Young. +#Sage: Go talk to your \"friend\". +Sage: Ve a hablar con tu \"amiga\". +#Mitra: We're just doing the best we can... +Mitra: Estamos haciéndolo lo mejor que podemos... + end scene + end area + area NEXUS + + + scene enter_nexus +TOP +#Cloaked Man: Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +Hombre encapuchado: Bueno, ya va siendo hora. Eh...^Quiero decir...^ Saludos, Young (Joven)! Yo soy Sage (Sabio), el Anciano del Pueblo. Has sido convocado aquí porque La Oscuridad se ha extendido a lo largo de la Región. La Oscuridad anda tras el Legendario Briar (Espino), para usar su poder con fines malvados. Debes encontrarlo antes. Debes proteger el Briar. +#Enter the active portal on your left to begin your quest. +Entra por el portal activo a tu izquierda para empezar tu búsqueda. +#*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +*Suspiro* No es de buen agüero que aún estés rondando por aquí. Entra por el portal para empezar tu búsqueda. ¡El Briar y, por extensión, el mundo están en extrema necesidad! +LOOP +#Just go in the damn door! +¡Entra por la maldita puerta ya! + end scene + + # After entering STREET for the first time + scene after_ent_str +#Why are you still here? +¿Aún estás aquí? + end scene + # After finishing BEDROOM + scene after_bed +#Continue on, Young. That key you have found, there may be others like it - seek them out. +Prosigue, Young. Esa llave que has encontrado, puede que haya otras como esa - encuéntralas. +#Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. +Viaja hasta los límites de La Región, Young. Es la única manera de parar La Oscuridad. + end scene + # After finishing first 3 dungeons + scene before_windmill +#Take those three keys, Young, and unlock the way to the deeper realms of The Land. +Coge esas tres llaves, Young, y abre el camino a las áreas más recónditas de La Región. + end scene +#After windmill, but disappears after Sage fight + scene after_windmill +#You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. +Has hecho lo que te había pedido, Young, aunque aún queda mucho por hacer. Quizás si exploras los terrenos más recónditos de La Región llegarás a conseguir mayores logros... quizás así le sirvas a Briar para algo. + end scene + + scene all_card_first +#Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. +Buen trabajo, Young. Has encontrado todas las cartas de un área de La Región, y como resultado, una gema ha aparecido en lo alto del portal de ese área. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Sage: Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? +Sage: Pronto tus habilidades serán puestas a prueba, Young. Para lograr atravesar este templo con vida, necesitarás fuerza y no menos intelecto. Y llegados a este punto doy por supuesto que has encontrado un arma, ¿no es así? +# Young swipes a few times +#Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +¿¿Pero qu-?? ... Qu-Quiero decir... Sí, por supuesto... ¡una escoba! Esto... justo como fue presagiado en La Leyenda... +#*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +*gruñidos* ... de todos los incompetent--¡Eh! ¿A qué estás esperando aquí parado? +LOOP +#Keep your wits about you, Young. +Ándate con mucho ojo, Young. + end scene + end area + + area BEDROOM + scene after_boss +# Sage fades into room. +#Sage: At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +Sage: Por el momento aún eres débil. Si esperas proteger al Briar de La Oscuridad, debes enfrentarte a tus miedos. La carta que encontrarás en este baúl, y en otros como éste, son símbolos de tu desarrollo, luego adquirirlos es absolutamente vital para tu búsqueda. +#That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +Esa llave jugará también un papel importante en tu búsqueda. Además debes buscar concienzudamente otras llaves. Selecciona el mapa en la pantalla de menú para teletransportarte de vuelta a la entrada del templo, y continúa tu heroica búsqueda. +#Travel East and South through the temple grounds... you will find a use for that key. +Viaja al Este y al Sur a través de los terrenos del templo... encontrarás un uso para esa llave. +LOOP +#What, do you want a piggy back ride to the gate or something?? +¿Qué quieres? ¿Que te lleve a caballito hasta la puerta o qué? + end scene + end area + + area TERMINAL + scene before_fight +#Sage: Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... +Sage: ¡¿Por qué no me escuchas?! ¡Si te precipitas en esto como un idiota, solamente conseguirás poner en peligro al Briar, a La Región, y a todo por lo que he trabajado! Lo siento, Young, pero si no quieres escucharme tendré que convencerte de otra forma... + end scene + scene after_fight +#Sage: Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. +Sage: Young... Así no es como yo quería que sucedieran las cosas... Yo pretendía que te convirtieras en mejor persona. Pretendía que fueras capaz de ayudar al Briar. Pero todo esto es solo un absurdo juego... No puedo evitar que llegues hasta El Briar. Tan solo recuerda lo que dije cuando todo se vaya al infierno. + end scene + scene entrance +#Sage: Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +Sage: Hola, Young. Cuando te conviertas en alguien más fuerte y más sabio, este camino te llevará al Briar. +#Sage: You’re not ready Young, first you must face more trials in The Land. +Sage: No estás preparado, Young, primero debes afrontar más pruebas en La Región. +#Sage: You have made progress, Young, but you must collect at least 36 cards to pass this gate. +Sage: Has hecho progresos, Young, pero debes poseer al menos 36 cartas para pasar a través de esta verja. + end scene +# non idlnig stuff + scene etc +#Sage: Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +Sage: Oh... eh... ¿tienes al menos 36 cartas? Pero no estoy seguro de que estés preparado para la verdadera prueba. De hecho, mira, estábamos leyendo mal esta verja, en realidad necesitas...\n...\n........\n¡92 cartas para atravesarla, no 36! +#Sage: Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! +Sage: Young, no vayas ahí, ¡aún no estás preparado! ¡Piensa en El Briar! ¡La Región! ¡Todo esto no habrá valido para nada si no estás preparado! + end scene + end area + + + + area REDCAVE + scene one +TOP +#Sage: Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +Sage: Un trabajo excelente, Young. Tenías que conquistar no sólo este monstruo, ¡¡¡sino también tus propios miedos para prevalecer!!! +#Sage: Of course, you still have a long way to go. Have you been exploring The Land? +Sage: Por supuesto, aún te queda un largo camino por recorrer. ¿Has estado explorando La Región? + end scene + end area + + area CROWD + scene one +#Sage: Well done, Young. However, there are still trials to face. Do not let your guard down. +Sage: Bien hecho, Young. Sin embargo, aún quedan pruebas por afrontar. No bajes la guardia. +#Sage: Have you found all of the keys yet, Young? If not, go to the beach. +Sage: ¿Has escontrado ya todas las llaves, Young? Si no es así, ve a la playa. + end scene + end area + + + +end npc + +npc cliff_dog + area CLIFF + scene top_left +#I'm not like the others! *woof* I won't harm you... +¡No soy como los otros! *ladrido* No te haré daño... +#It is a quiet existence up here. +Aquí se vive muy tranquilamente. +#You smell like swiss chard. +Hueles como a acelga. +LOOP +*woof* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +#You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +¡Lo hiciste, Young! ¡Derrotaste a La Oscuridad! ¡Mira este sitio! ¡Es precioso! +#So beautiful... +Tan precioso... + end scene + + scene dump +#Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +¡Oh, gracias a Dios que estás aquí! Estaba preocupado por si te habías quedado atrapado en ese vertedero todo nevado... ¡Ahí todo es jodidamente deprimente! ¡Ja! +#Hahaha. Hahahahaha. HAHAHAHAHAHAHA! +Jajaja. Jajajajaja. ¡JAJAJAJAJAJAJA! + end scene + + scene drink +#Hey sexy, I’ll buy you a drink! +Oye encanto, ¡te invito a un trago! +#Have another drink, you little shit! Hahaha! +¡Toma otro trago, mierdecilla! ¡Jajaja! + end scene + + scene hot +#Fuck, it’s hot here... I’m so hot... and sweatyyy... +Joder, qué calor hace aquí... Estoy tan caliente... y sudaaado... +#Damn, working out makes me horny! +¡Maldita sea! ¡Entrenar me pone cachondo! + end scene + + scene gold +#Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +¿Sabías que este lugar está hecho de oro? ¡Oro de verdad! ¡Podríamos escapar juntos y vivir de este ladrillo de aquí! ¡Jajajajaja! +#Seriously, why are you just standing there? Help me jack this brick! +En serio, ¿qué estás haciendo ahí parado? ¡Ayúdame a levantar este ladrillo! + end scene + + scene briar +#???: Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! +???: Young... !Al final lO hiCisTE¡ !ME AHs SalvaDO¡ !!!!!AgoRA ToDo IRa BEIN de NUeVO¡¡¡¡¡ + end scene + end area +end npc + +### 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +#HEADS UP! +¡CUIDADO! +#Mitra swerves to avoid you and crashes +#Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +Siento eso... Iba demasiado deprisa. Oh, ¡no te había visto nunca antes! ¿Tú también eres un viajero como yo? ... ¿Eh? ¿Que quieres proteger al Briar de La Malvada Oscuridad? ... ^Bien... No tengo ni idea de lo que me hablas, ¡pero suena guay, supongo! +#I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! +Voy de acá para allá, llevando mi género... ¿Qué? No, no soy una vendedora ambulante. ¡Wares (Género) es el nombre de mi bicicleta! +#Plays if you talk 3 times, or if you leave the screen +#Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. +Bueno, puede que nos encontremos en otra ocasión. Si oigo lo que sea acerca de ese Briar, te lo haré saber. +#Mitra bikes away + end scene + end area + area BLUE + scene one +#HEADS UP! All right Wares, let’s do this! +¡CUIDADO! Bien, Wares, ¡vamos allá! +#Annnd presto! +Yyyy ¡presto! +#Keep going, Young, we’ve got your back! +No pares, Young, ¡nosotros te cubrimos! + end scene + end area + + area FIELDS + scene init +#Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +¿Te acuerdas de mí? Olvidé presentarme la última vez, solo te presenté a mi bicicleta, Wares. Mi nombre es Mitra. +#Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +¿Te acuerdas de mí? Olvidé presentarme la última vez, soy Mitra, y esta joven bicicleta tan bonita se llama Wares. +LOOP +#Mitra: So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +Mitra: ¿Y cómo te ha ido, Young? ¿...qué? ¿Que cómo sé tu nombre? Te parece extraño, ¿verdad? Bueno, lo vi en la parte trasera de tu sudadera. +#Mitra: See you around, Young! +Mitra: ¡Nos vemos, Young! + end scene + scene quest_event +#Mitra: Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. +Mitra: Eh, acabo de recordar - alguien dijo que estaban intentando encontrar algo antes. No estaba segura de a qué se referían, así que dijeron que irían hacia las montañas - salieron corriendo. + end scene + +# Hints for the game - not cards + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) +# 0 ignore this +#Nothing. +Nada. +# 1. Beach hint (no dungeons finished) +#Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +Oh, ¿estás perdido? ¿Te has pasado por la playa? Quizás alguien de por allí pueda ayudarte. Parece que esa llave tuya forme parte de un manojo. ¿Tendrás que encontrar más? +# 2. Forest hint (no dungeons finished) +#Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +Oh, ¿estás perdido? ¿Has mirado en el bosque, hacia el Este? Esa llave que tienes - parece que forma parte de un manojo. ¿Tendrás que encontrar otras? +# 3. Windmill hint +#Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +¡Mira todas esas llaves! Creo que vi algunas puertas hacia el Sudeste. ¿Tendrás que usarlas allí? +# 4. Generic hint to go past statues +#Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +¡Eh, vi que encendiste el molino de viento! ¿Sabes si ha tenido algún efecto en La Región? +# 5. finished 6 bosses, all 36... +#Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +Eh, Young. ¡Guau! ¡Has estado en verdad reuniendo todas esas cartas! ¿Has descubierto ya para qué sirven? ¡Podrías ganar un pastón vendiéndolas! +# 6. hints for go things +#What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +¿Qué es ese nuevo accesorio que tienes en la escoba? ¿Te permite alterar la estructura del mundo...? La verdad, eso da mucho miedo, Young. Me alegro de que no parezca funcionar en cualquier sitio, quizás solo en los más profundos, extraños recovecos de La Región. +# 7. crowd finished but not redcave +#How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! +¿Qué tal funcionan mis zapatos saltarines? ¿De maravilla, eh? Me están gustando mis nuevos zapatos para ir en bici. ¡Hacen de Wares y de mí un equipo incluso mejor! +#8. redcave finished but not crowd +#Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? +¡Qué guay, Young, encontraste otra llave! ¡A Wares le gusta el color! ¿Has encontrado ya un lugar donde usarlas? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +#Mitra: Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +Mitra: Eh, Young, ¿buscando una carta?\n¿Has buscado bien por el área del templo de El-Que-Todo-Lo-Ve? + +#Mitra: Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +Mitra: Eh, Young, ¿buscando una carta?\nHe oído que hay un laberinto por la salida trasera del templo de El-Que-Todo-Lo-Ve. + +#Mitra: Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +Mitra: Eh, Young, ¿buscando una carta?\nQuizás encuentres algo cerca de la guarida de El-Que-Todo-Lo-Ve. + +#Mitra: Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +Mitra: Eh, Young, ¿buscando una carta?\nHabía una sala repleta de enemigos en el templo de El-Que-Todo-Lo-Ve, ¿me equivoco? + +#Mitra: Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +Mitra: Eh, Young, ¿buscando una carta?\n¿Has mirado bien dentro del templo de El-Que-Todo-Lo-Ve? + +#Mitra: Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +Mitra: Eh, Young, ¿buscando una carta?\nIntenta buscar en el área vestigial cerca de la salida trasera de la guarida de El-Que-Todo-Lo-Ve. + +#Mitra: Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +Mitra: Eh, Young, ¿buscando una carta?\nPuede que tu vecino sepa algo. + +#Mitra: Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +Mitra: Eh, Young, ¿buscando una carta?\nEse tipo de tu cuarto estaba escondiendo algo... + +#Mitra: Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +Mitra: Eh, Young, ¿buscando una carta?\nEn algún lugar cerca de la entrada de tu cuarto...¡mira por allí! + +#Mitra: Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +Mitra: Eh, Young, ¿buscando una carta?\n¿Has buscado *por todos lados* en tu cuarto? + +#Mitra: Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +Mitra: Eh, Young, ¿buscando una carta?\n¡Justo al Sur de aquí hay una isla! No he ido allí, pero deberías inspeccionar el sitio. + +#Mitra: Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +Mitra: Eh, Young, ¿buscando una carta?\nHay un montón de cosas por descubrir si sigues los ríos. ¡Mira bien! + +#Mitra: Hey Young, looking for a card?\nI know someone left a card near the windmill. +Mitra: Eh, Young, ¿buscando una carta?\nSé que alguien dejó una cerca del molino de viento. + +#Mitra: Hey Young, looking for a card?\nLook around the rivers in the forest... +Mitra: Eh, Young, ¿buscando una carta?\nMira cerca de los ríos del bosque... + +#Mitra: Hey Young, looking for a card?\nTry poking around the base of the mountains. +Mitra: Eh, Young, ¿buscando una carta?\nFisgonea alrededor de la base de las montañas. + +#Mitra: Hey Young, looking for a card?\nTry going to the summit of the mountains. +Mitra: Eh, Young, ¿buscando una carta?\nIntenta llegas hasta la cumbre de las montañas. + +#Mitra: Hey Young, looking for a card?\nThe far end of the beach may hold something. +Mitra: Eh, Young, ¿buscando una carta?\nEl extremo alejado de la playa puede que guarde algo. + +#Mitra: Hey Young, looking for a card?\nTake a walk in the crimson woods. +Mitra: Eh, Young, ¿buscando una carta?\nDate una vuelta por el bosque carmesí. + +#Mitra: Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +Mitra: Eh, Young, ¿buscando una carta?\nHabía muchas puertas cerradas con llave en una de esas cuevas rojizas, ¿verdad? + +#Mitra: Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +Mitra: Eh, Young, ¿buscando una carta?\nVe a la cueva rojiza situada más al norte, ¡comprueba el nacimiento del río! + +#Mitra: Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +Mitra: Eh, Young, ¿buscando una carta?\nMmm...¿miraste bien por todo ese laberinto oscuro? + +#Mitra: Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +Mitra: Eh, Young, ¿buscando una carta?\nRecuerdo que había un camino bastante lúgubre de lanzallamas en algún lugar. ¡Algo debe de haber al final del mismo! + +#Mitra: Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +Mitra: Eh, Young, ¿buscando una carta?\nEsa gente del circo tiene que estar ocultando algo. ¿Miraste por todos lados? + +#Mitra: Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +Mitra: Eh, Young, ¿buscando una carta?\n¿Has echado un vistado por el perímetro del gran foso de esa pareja? + +#Mitra: Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +Mitra: Eh, Young, ¿buscando una carta?\nEsa pareja que gusta tanto de estar por un foso. Deben estar escondiendo algo. + +#Mitra: Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +Mitra: Eh, Young, ¿buscando una carta?\nAlgunas veces hay cosas escondidas al otro lado de los abismos - ¡especialmente en cuevas montañosas! + +#Mitra: Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +Mitra: Eh, Young, ¿buscando una carta?\n¿Has registrado las partes más altas de la cueva montañosa? + +#Mitra: Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +Mitra: Eh, Young, ¿buscando una carta?\n¿Habrá algo en las profundidades de esa cueva montañosa? + +#Mitra: Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +Mitra: Eh, Young, ¿buscando una carta?\nEse cubo lleno de colorido que está en ese lugar tan raro - ¡probablemente tenga algo! + +#Mitra: Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +Mitra: Eh, Young, ¿buscando una carta?\n¿Has hablado con el cubo gris de esa zona que parece tan salvaje? Puede que sepa algo. + +#Mitra: Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +Mitra: Eh, Young, ¿buscando una carta?\nEl último piso de ese hotel está un poco desmoronado, ¡pero seguro que allí hay algo! + +#Mitra: Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +Mitra: Eh, Young, ¿buscando una carta?\n¿Entraste a todas las habitaciones de la 3ª planta del hotel? + +#Mitra: Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +Mitra: Eh, Young, ¿buscando una carta?\nApuesto a que alguien dejó algo por ahí tirado en la 2ª planta del hotel. + +#Mitra: Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +Mitra: Eh, Young, ¿buscando una carta?\n¡El propietario del hotel podría haber dejado algo para ti! + +#Mitra: Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +Mitra: Eh, Young, ¿buscando una carta?\nEsos puentes rotos allá por el Noroeste...¡mira por allí! + +# and a bonus one if for some reason you make it this far without finding any... +#...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? +¿...Qué? ¿Que no has encontrado *ninguna* carta? Pero hombre, Young, ¿qué locura es esta? Algunas veces en la vida es necesario ser intrépido, abrir alguna que otra caja, ¿sabes? + end scene + +#General random stuff + scene general_banter +#Did you find that guy who was looking for something in the mountains? +¿Encontraste a ese tipo que estaba buscando algo en las montañas? +#Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +¿Sabes cuál es el apellido de mi bici? ...¡So! ¿Lo pillas? ¡Género So! ...Es broma, las bicicletas no tienen apellidos. +#Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +¿Crees que debería comprarme un candado? No me gustaría tener que atar a Género así, pero se oye tanto hablar sobre bicicletas robadas estos días... +#So what is The Briar? Some sort of ancient artifact from a lost culture? +Así que... ¿qué es El Briar? ¿Algún tipo de artefacto antiguo de una cultura perdida? +#I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +Me pregunto por qué no habré oído nada acerca de la llegada de La Oscuridad. Supongo que mucha gente de la región está concentrada en sus propias luchas diarias. +#Hey Young, I just wanted to tell you... your hair is awesome. +Eh, Young, solo quería decirte que... tu pelo mola un montón. + end scene + + end area +end npc + +### Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +#Statue: The Village Elder in name only, for he is neither. +Estatua: El Anciano del Pueblo sólo en nombre, pues no es ninguno. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Statue: I’ve seen a broom in a legend... it was on the map of a janitor closet. +Estatua: He visto una escoba en una leyenda... que estaba en el plano del armario de un conserje. + end scene + end area + + area BEDROOM + scene after_boss +#Statue: Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. +Estatua: Adquirir tarjetas es vital para tu búsqueda. Adquirir tarjetas también es vital para otros fines, como obtener crédito o comprar bebidas alcohólicas. + end scene + end area + area REDCAVE + scene one +#Statue: Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! +Estatua: Un trabajo excelente, Sage. ¡¡¡Has tenido que conquistar no sólo tu temperamento sino también tu amor propio para decir algo tan cutre!!! + end scene + end area + area TERMINAL + scene one +#When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! +Cuando te hayas convertido en un individuo más estresado y apático, este sendero te llevará a los Breyers. ¡Reconfórtate bebiendo, perdedor! + end scene + end area +end npc + +### sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced +# This line must be played once before anything else can +#Edward: Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +Edward: Una vez un hombre vino e instaló un espejo en nuestro cuarto de baño. Yo tenía miedo de que hubiera una cámara oculta dentro de él. Registré cada pulgada del marco de madera, echando Don Limpio en las grietas, creyendo que eso cortocircuitaría los cables. Por supuesto, nunca encontré nada. +LOOP +#Edward: This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. +Edward: Este templo está dedicado a El-Que-Todo-Lo-Ve. No sé por qué he venido aquí, pero tengo demasiado miedo para entrar dentro. + end scene + + scene bedroom_not_done +#Edward: Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. +Edward: ¿Problemas? Bueno, me imagino. Todo lo que tienes es una escoba, y todo lo que las escobas pueden hacer es mover mugre. + end scene + + scene bedroom_done +#Edward: You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. +Edward: ¿Dices que has vencido a El-Que-Todo-Lo-Ve? Ja. ¿No entiendes que esto no funciona así? Lo único que estás haciendo es echar detergente en las grietas. + end scene + + end area +end npc + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +#Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! +Oh, ¿no es una monada? Nuestro querido y joven Young, jugando a ser el héroe. Pero he estado observando cada paso que has dado en \"La Región\", y déjame decirte, Young, que no todo el mundo de por aquí es tan honesto como yo. ¡Ten cuidado en quien confías! + end scene + scene after_fight +#I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". +Estaré contigo, Young, siempre que estés solo. Y recuerda mi consejo en tu pequeña \"aventura\". + end scene + end area +end npc + +# rock (Rock with words) +npc rock + + area BEDROOM + scene one +#Rock: Peripheral vision is the hive of demons. +Roca: La visión periférica es la colmena de los demonios. + end scene + scene two +#Rock: To-do: Construct method of transportation to Nexus. Progress: Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. +Roca: Por-hacer: Construir un método de teletransporte hasta Nexus. Progreso: Detenido - El-Que-Todo-Lo-Ve no quiere proporcionar los fondos necesarios para hacer posible la empresa. Tendremos que volver al método original del inexplicable portal. + end scene + scene three +#Rock: I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. +Roca: Estoy atrapado aquí a solas. El trabajo no cesa en este túnel, y al menos puedo ver un poco de progreso cada día. + end scene + end area + + area BLUE + scene one +#This wheel is used to lift the dam. +Este torno se usa para levantar el dique. + end scene + end area + area CIRCUS + + scene one +#June 24th, 1957: Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. +24 de junio de 1957: Las cuerdas del trapecio se rompen. Alice Rutgers se precipita violentamente al suelo, acabando con dos espinillas rotas. + end scene + scene two +#July 17th, 1957: Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. +17 de julio de 1957: Siete payasos se retiran con problemas casi fatales de pulmón. Se sospecha de la marca de cosméticos LANDBLEND, pero ninguna investigación oficial se lleva a cabo. + end scene + scene three +#July 21st, 1957: Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. +21 de julio de 1957: Debido a un fallo de la jaula, mi cara y mi costado quedan severamente destrozados por un león indomado. Sobrevivo, pero ahora estremezco al mirar mi propio reflejo. + end scene + scene four +#August 5th, 1957: In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. +5 de agosto de 1957: En mi sueño, vi una cara hecha de piedra con fieros, brillantes ojos. Hablaba de la verdad de nuestra existencia y fue el primero en ofrecer la liberación del dolor. + end scene + scene five +#August 7th, 1957: How many of us will suffer before we accept the truth of the Seeing One? +7 de agosto de 1957: ¿Cuántos de nosotros sufrirán antes de que aceptemos la verdad de El-Que-Todo-Lo-Ve? + end scene + + scene six +#August 8th, 1957: I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. +8 de agosto de 1957: He tomado una decisión. Algunos de los otros han dicho que me seguirán. Esta será mi actuación final. Que El-Que-Todo-Lo-Ve tenga consideración por todos nosotros. + end scene + end area + area CLIFF + scene one +#(Indecipherable markings) +(Marcas indescifrables) + end scene + scene two +#December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! +7 de diciembre de 2010. (nombre ilegible). ¡No hay nada aquí arriba, excepto esta estúpida roca! + end scene + scene three +#Danger! This cave is unexplored. +¡Peligro! Esta cueva está inexplorada. + end scene + scene four +#These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. +Estos precipicios se extienden lejos hacia arriba, aunque nunca he subido lo suficiente como para saber a dónde llevan. + end scene + end area + + + area CROWD + scene one +#Rock: How? +Roca: ¿Cómo? + end scene + scene two +#Rock: Warning! Vertical drop, jump at your own risk. +Roca: ¡Advertencia! Caída en picado, salte bajo su propio riesgo. + end scene + end area + + area DEBUG + scene one +#This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +Esta solía ser una animación comodín para las verjas que se abren con cartas. ¡Acércate dos veces para ver las animaciones de cierre y apertura! +#I forget why we ended up scrapping it. Perhaps too dramatic. +He olvidado por qué acabamos desechándola. Quizás por demasiado dramática. + end scene + + scene two +#Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +¡Aquí hay tests para varias capas de suelos y colisiones! No pude lograr que funcionaran bien los suelos de dirección única desde cada lado (p.ej., muros), así que acabé desechando la idea por completo... creo. + +#There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. +Había alguna razón por la que no las usamos. Simplificar diseño, lo cual era importante para nosotros para acabar el juego. + end scene + + scene three +#Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +Los enemigos solían ser capaces de soltar llaves. Deseché esta idea pese a que tenía algo de encanto. + +#Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +Otra idea que tanteamos fue la de tener puertas de desafío, las cuales se encontraban tras filas de enemigos, y solo se abrían cuando las alcanzabas sin que te hirieran. + +#We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! +Queríamos diseñar todas las mazmorras de esta forma y desechar los puntos de vida por completo, ¡pero resultó ser demasiado difícil! + end scene + + scene four +#PRISON!!! +¡¡¡PRISIÓN!!! +#Save us!!! +¡¡¡Sálvanos!!! +#Please! +¡Por favor! + end scene + + scene five +#Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world (90 PER-CENT) \"Non-canon\". Anyways. +¡Te damos la bienvenida al MUNDO DEBUG! Has salido fuera de \"La Región\", así que considera este mundo (90 POR-CIENTO) \"No canónico\". En fin. +#Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. +Antes de que hubieran sets de suelos para muchas de las áreas, usaba suelos como estos para marcar dónde iban las puertas. De hecho, cada mazmorra fue modelada con el set de suelos de este área, y luego Marina fue sustituyendo estos suelos por las suyas. + end scene + + scene six +# Translator's note: since this word comes from French, I'll leave it as it is +# Equivalence (for reference) --> French: fille -- English: girl -- Spanish: chica +fille + end scene + end area + + area DRAWER + scene five +#-ARCHIVES- +-ARCHIVOS- +#PROCEED WITH CAUTION +PROCEDA CON PRECAUCIÓN + end scene + scene four +#West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. +Oeste. Fisura. ¡Realidad! Valores de condición bajos y reales, huracán, viejo, acabado. Relajante. + end scene + scene three +#The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. +El-Que-Todo-Lo-Ve, por lo que puedo recor- rcrr,,,,,,un Buen Rato En Casa. + end scene + scene two +#COLD STORAGE\n\n^ -- THE MGMT +LUGAR DE ALMACENAMIENTO EN FRÍO\n\n^ -- LA DIRECCIÓN + end scene + scene one +#CONTINUE +CONTINÚA + end scene + end area + + area FIELDS + scene one +#West: Beach\n\nEast: Forest\n\nSoutheast:\n Rainy Area\n\nNorth: \nTemple Grounds\n\nNorthwest: Chasm +Oeste: Playa\n\nEste: Bosque\n\nSudeste:\n Área lluviosa\n\nNorte: \nJardines del templo\n\nNoroeste: Abismo + end scene + end area + + area FOREST + scene one +#West: Land Lake\nSouth, then east: Cliffs +Oeste: Lago\nSur, luego Este: Precipicios + end scene + scene two +#Relaxation pond. Stay a while, we know you have the time. +Estanque de la relajación. Quédate un rato, sabemos que tienes tiempo de sobra. + end scene + scene three +#I'm afraid I may be stuck on this tiny corner forever. +Me temo que me quedaré atrapado en esta diminuta esquina para siempre. + end scene + scene four +#East: Cliffs +Este: Precipicios + end scene + end area + + area GO + scene one +# The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. +El sendero se abrirá cuando las baldosas de los guardianes oscuros Han-Tani reemplazadas por sus respectivos colores espirituales en el tablero de abajo. + end scene + + scene two +#When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. +Cuando la estatua de piedra azulada se apartó\nUn nuevo sendero fue revelado\nMás allá de los precipicios, atravesando extrañas dimensiones\nSe halla un hotel de viajeros\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién gobierna este abarrotado lugar de negocios?\"\nA pesar de las muchas almas humanas\nAún me siento solo. + end scene + + scene three +#The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. +La roja y oxidada estatua se movió\nY abrió el camino hacia más profundas fosas\nUna mazmorra laberíntica a continuación\nY después una gran carpa de circo\n\n\n\"¿Quiénes son los guardianes?\" Pregunto,\n\"¿Quiénes renunciaron a la vida para huir de este lugar?\"\nTemo al dolor, al igual que ellos\nPero temo a la muerte más aún. + end scene + + scene four +#The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. +La verde, metálica estatua se apartó\nAbriendo un sendero más profundo\nHogares suburbanos y aceras forman\nUn camino hacia un apartamento.\n\n\n\"¿Quién es el guardián?\" Pregunto,\n\"¿Quién busca consuelo en las estrellas?\"\nSolo, me siento como si estuviera siendo observado\nY no por la amigable luz de las estrellas. + end scene + + + end area + + area BLANK + #initial entrance from windmill + scene one +#Rock: This is unclaimed territory - not yet a part of The Land. +Roca: Esto es territorio de nadie - ni siquiera de La Región. + end scene + #concentric circles + scene two +#Rock: These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. +Roca: Estos -^ yo y mis^ - círculos son^ - promesas...^ - círculos^ - Intentaré acabarlo todo...^ - concéntricos. Bzrt, bzrt. + end scene + #islands + scene three +#Rock: Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! +Roca: Ten cuidado^ -...pero yo siempre^ - por dónde pisas^ - ¿consigo reaparecer, no?^ - ¡cuando estés aquí! + end scene + #mazeish place, not near the portal + scene four +#Rock: Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. +Roca: Mirando hacia abajo^ - Y me di cuenta:^ - desde aquí, tú- ^ Lo amo.^ - puedes ver...nada, realmente. + end scene + #left part of the 48 gate + scene five +#Rock: My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. +Roca: Mis disculpas -^ Pos claro, -^ por este desorden -^ mantengámonos en contacto-^ pero ese portal debería^ - e intentaré darte mis opiniones - ^ devolverte a La Región. + end scene + end area + + + area NEXUS + scene one +#Sometimes if you talk to people multiple times, they have new things to say. +A veces si hablas con la gente varias veces tiene nuevas cosas que decir. +#But not rocks. Rocks don’t do that. +Pero no las rocas. Las rocas no hacen eso. + end scene + #before 49 card agate + scene two +#Rock: So close! If only... +Roca: ¡Muy cerca! Si tan solo... + end scene + #door that goes nowhere + scene three +#Rock: Curiosity is a great thing. +Roca: La curiosidad es algo grande. + end scene + #below treasure box + scene four +#Rock: Oh!...? +Roca: ¡Oh!¿..? + end scene + scene five +#The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads: \"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" +El ordenador tiene un e-mail abierto. Partes de la pantalla están rotas, por eso solo algunas partes del mensaje son visibles entre manchas negras. El e-mail pone: \"¡Hola, Young!\" Parece que [...] quincuagésima carta [...] quizá no deberías... [...] la pena pensárselo! ¿Crees que estás listo? Despierta...\" + end scene + end area + + + area OVERWORLD + scene one +#Rock: I’ll bet you’re reading a rock because you don’t have any friends. +Roca: Apuesto a que estás leyendo una roca porque no tienes amigos. + end scene + scene two +#Rock: Welcome to Overworld Station. We hope you enjoyed your time in The Land. +Roca: Bienvenido a la estación del Mundo. Esperamos que haya disfrutado de su estancia en La Región. + end scene + scene three +#Rock: An explorer is you! +Roca: ¡Eres todo un explorador! +#Rock: Please don't go south. It's under construction. +Roca: Por favor, no vayas al Sur. Está en construcción. + end scene + scene four +#Rock: Treasure in 5,3! +Roca: ¡Tesoro en 5,3! + end scene + scene five +#Rock: Haha, gotcha! +Roca: Jaja, ¡te pillé! + end scene + end area + + area REDCAVE + scene one +#WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. +NACEMOS ENTRE LA DESCOMPOSICIÓN DEL CUERPO DE NUESTRA MADRE + end scene + scene two +#ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. +UN DÍA NUESTRA MADRE DEJÓ A SU MADRE Y SE AVENTURÓ EN LA NIEBLA VENENOSA. + end scene + scene three +#WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. +NUNCA PEDIMOS ESTO. NO HABRÍAMOS COMPRADO NUESTRAS VIDAS CON SU SUFRIMIENTO. + end scene + end area +# area for redsea + area REDSEA + scene one +#Rock: Signs indicate the trees have not been active for an extended period of time. +Roca: Las señales indican que los árboles no han estado activos por un largo periodo de tiempo. + end scene + scene two +#Rock: South: ???^ North: ??? +Roca: Sur: ???^ Norte: ??? + end scene + scene three +#Rock: The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. +Roca: Se dice que el terreno irregular ha sido formado por los ancestros de los habiantes del área. + end scene + scene four +#Rock: They appear to be a peaceful species. +Roca: Parecen una especie apacible. + end scene + end area + + + area SPACE + #middle + scene one + #Scribbled in what appears to be permanent marker: Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + Garabateado con lo que parece un rotulador permanente: Saludos, compañero viajero del ESPACIO y TIEMPO. Te has adentrado en una grieta muy lejos del área yuxtapuesta de YOUNG. Digamos que has cruzado como un OCÉANO o dos. No te preocupes por el CONTRASTE, podrás volver a tu aventura normal en breve. No TEMAS este lugar, aunque parezca FATÍDICO y PELIGROSO descubrirás que sus habitantes son bastante SIMPÁTICOS.\n -- La Dirección + + #(Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (Bajo el mensaje, un grabado:) Aquí yace ____ (ilegible). Se extravió en los bosques. + + #(Even further below the message:) (just don't go too far south.) + (Aún más abajo del mensaje:) (no vayas muy al Sur.) + + end scene + # extra color + scene two +#Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbows! +Aquí yace ____ (ilegible. ¿Quién ha escrito esto?). ¡Fue empalado por arcoíris! +#Would've been better with achievements. +Habría sido mejor con logros. + end scene + #grey graves + scene three +#Here lies Burd. The cliffs weren't feeling too friendly. +Aquí yace Burd. Los precipicios no fueron muy agradables que digamos. + end scene + scene four +#Here lies bag. It never had a chance. +Aquí yace bolsa. Nunca tuvo oportunidad. +#Pretentious! +¡Pretencioso! + end scene + # color graves + scene five +#Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. +Aquí yace Savitch. Intentó arreglar mi ordenador en el garaje una vez, y no cogió mucho espacio mientras. Tres años después, aún no había terminado. Entonces, cayó muerto. + end scene + scene six +#Here lies Dave. He wasn't very inspirational. +Aquí yace Dave. No era muy inspirador. + end scene + + end area + + area SUBURB + scene one + #---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + ---YOUNG TOWN (CIUDAD JOVEN)---^\nBienvenido a Young Town. Por favor, tenga cuidado con algunos de los ciudadanos. No son muy sociables...camine con precaución. Young Town fue fundada en los 90 por el alcalde Ying como parte de una serie de continuos proyectos de ingeniería civil, cuyo nombre fue elegido como muestra del rechazo de Ying de poseer el nombre Ying, y el beneplácito de poseer el nombre Young. Esperamos que disfrute de su estancia. + end scene + + scene two + #To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + Al Oeste se encuentran los legendarios templos de El-Que-Todo-Lo-Ve. Al Este se encuentra la vivienda de nuestro maravilloso alcalde Ying, que permanece cerrada al público - quedan advertidos. + end scene + + scene three + #On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + En su quinta visita, el alcalde Ying se frustró por la falta de aparcamientos. Este aparcamiento refleja la frustración de Ying por la falta de aparcamientos. Ying aparcaría ocasionalmente en este aparcamiento en subsiguientes visitas. + end scene + + scene four + #I remember the long sentences I used to write. Ha! Fragmented. + Recuerdo las largas frases que solía escribir. ¡Ja! Fragmentado. + end scene + + scene five + #A DANGEROUS SITUATION + UNA SITUACIÓN PELIGROSA + end scene + end area + + +# Area for TRAIN (it's actually CELL sorry) + area TRAIN + scene one +#The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. +El-Que-Todo-Lo-Ve lo sabe todo y llevará a uno a la iluminación. El camino a la iluminación no está iluminado por ninguna antorcha. + end scene + scene two +#Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. +No te apartes del camino de El-Que-Todo-Lo-Ve, ni siquiera por los tesoros que aguardan en las esquinas lejanas del laberinto. + end scene + scene three +#Move along. +Muévete. + end scene + scene four +#Do not anger the Chasers with violence. +No hagas enfadar a los Acosadores con violencia. + end scene + end area + + area WINDMILL + scene one +#SCENIC LANDMARK: Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. +LUGAR CONOCIDO: La Pareja de Torres. Construidas hace algún tiempo, la Pareja de Torres tiene vistas a las montañas lejanas. La primera torre fue dañada hace poco y desde entonces le ha sido asignada otro uso. La segunda está plantada al Este, rozando el cielo. Debido a asuntos de seguridad, el sendero hacia la torre ha sido vedado hasta nuevo aviso. + end scene + scene two +#PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT +AVISO DE SEGURIDAD PÚBLICA:^\nEsta torre, cuando no estaba dañada, decíase poseer una brecha dimensional en lo alto de la misma. Proceda con precaución y una mente abierta.^\n -- La Dirección + end scene + end area +end npc + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +#The statue does not look like it will be moving anytime soon. +No parece que la estatua vaya a moverse en breve. + end scene + scene two +#The statue has moved. +La estatua se ha movido. + end scene + end area + + area REDCAVE + scene one +#It looks like this statue is firmly in place. +Parece que esta estatua permanece firme en su lugar. + end scene + scene two +#The statue has moved. +La estatua se ha movido. + end scene + end area + + area CROWD + scene one +#This statue does not seem to be movable. +Esta estatua no parece que sea movible. + end scene + scene two +#The statue has moved. +La estatua se ha movido. + end scene + end area +end npc + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +#Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. +Qué bonito es el fuego, ¿verdad? Qué lástima que la deslumbrante luz de las farolas eclipse el fuego de las estrellas. + end scene + scene after_fight +#Okay, so stars aren't really made of fire. ^Who gives a shit anyway? +Vale, pues las estrellas no están hechas de fuego. ^De todas formas, ¿a quién coño le importa? + end scene + end area +end npc + +npc cube_king + area SPACE + # kings are supposed to offer info on + scene color + #How are you today? I'm the ruler of this partition and interpretation of space. + ¿Qué tal estás hoy? Soy el soberano de esta partición e interpretación del espacio. + + #You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. + ¿Quieres saber por qué soy el soberano de este lugar? Te lo diré, pero va a llevarnos un rato. Un buen rato. Un aborrecible y largo rato. + + #Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. + En serio, bastante rato. No, de verdad, ¡te estoy advirtiendo! Tiendo a divagar. Quizá sería mejor que te pusieras a vaciar el contenido de ese baúl de ahí. O que te dirigieras al hotel de más allá. No sé cómo llegó hasta ahí, he oído que tienen precios relativamente bajos. No es que el dinero importe aquí. + + LOOP + #Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! + ¿Que por qué soy el soberano?^...No estoy seguro del porqué, pero mis amigos de por aquí vieron apropiado asignarme este cargo, debido al estado apremiante de este espacio. Quizá esta sea la causa de que los cubos sean los mejores en permanecer quietos en superficies planas. En cuanto a por qué alguien necesita estar sentado aquí arriba - ¡eso es algo que me supera! + + #The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. + Los otros - mis amigos de por ahí - tienen sus propios méritos. No es que no puedan sentarse aquí arriba en un futuro, solo que no pueden hacerlo ahora. A veces nos turnamos para ocupar el puesto de gobernante, ¡pero cada vez tenemos que reinterpretar esta región del espacio! Puede ocurrir que el Sr. o la Sra. Pirámide vengan aquí arriba porque hayamos decidido darle al trono una forma tal que se adecúe mejor a ellos, reimaginando este mundo, por decirlo de alguna forma. ¿Parece estúpido? Podría ser. Pero así es como es. Sucede bastante rápido. Minutos, horas - no necesariamente un largo reinado. + + #Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... + Aunque, cuando soy el gobernante, me siento un tanto extraño...Me siento aislado de alguna forma, evitando relacionarme con los demás... + + #...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. + ...pero aislamiento no es la palabra correcta, aunque abarca parte de la sensación. No estoy aislado, y no me disgustan los demás. Todos nos consideramos amigos, pero ya sabes, nadie sube aquí arriba excepto para decir unas palabras. ¡Así que tengo que pensar sobre cosas o puedo volverme loco! Tal vez eso sea parte del aislamiento. + + #Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. + Fuera de esas preguntas sin sentido sobre *por qué* estamos aquí ocupando este espacio, siento curiosidad por saber por qué somos amigos siquiera. + + #I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. + Me gusta pensar que siempre que estamos bajo las interpretaciones para las cuales soy el mejor para gobernar, me alientan a ser capaz de mantener esta posición tanto como se tarde en alcanzar la siguiente interpretación. Ya sabes, ánimos y tal, su presencia física, ese tipo de cosas son reconfortantes. + + #I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. + Supongo que eso es suficiente para satisfacerme, aunque sería genial que uno o dos probaran y entendieran cómo me siento sobre ser un gobernante. ¡No es que me esté quejando sobre los ánimos! Pero quizá entonces podríamos tener varios gobernantes...¡qué desvarío! Tal vez eso implique que cuando no sea gobernante deba actuar de la misma forma en la que a veces deseo que ellos actuaran...quién sabe si eso se puede hacer. + + #I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. + Ya he divagado demasiado. Si te diriges hacia allá, hay otra región del espacio similar, aunque creo que huele un poco distinto. + + #It was nice to meet you. + Un placer haberte conocido. + + #Oh, you want to hear my story again? + Oh, ¿quieres escuchar mi historia de nuevo? + + #Okay, sit tight. + Muy bien, ponte cómodo. + + end scene + + scene gray + #Hello there. I'm the ruler of this part of space. + Qué tal. Soy el soberano de esta parte del espacio. + + #What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! + ¿Cómo está la cosa? ¿Que quieres saber por qué estoy aquí? ¿Estás seguro? ¡Me llevará bastante explicar por qué! + + #Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! + Bien, si insistes. Aunque quizá sería mejor que te dirigieras a ese hotel de ahí. No sé por qué siguieron adelante con su construcción. ¡Si tuviera que pagar impuestos, seguro que me quejaría! + + LOOP + #Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. + Bueno, aunque sea el gobernante de esta parte del espacio, realmente no estoy gobernando sobre nadie. + + #Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. + Mis amigos - todos son gobernantes de sus propias partes del espacio. No gobiernan sobre nadie tampoco - estamos solos en ese aspecto. Pero no estamos solos en tanto que hablamos entre nosotros, ni tampoco estamos solos en otros aspectos. Este es solo un lugar en el que existo. + + #My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. + Mis amigos y yo - nuestras partes del espacio tienen mucho en común con las suyas en tanto a por qué existen y cómo están organizadas. Intereses y deseos similares, y ese tipo de cosas. Nos encanta hablar sobre cómo gobernar y demás. + + #But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. + Pero lo triste es que raramente, si alguna vez se da el caso siquiera, alcanzamos a encontrarnos en persona. + + #So you're not actually talking to their physical forms, but a representation of them in some holographic form. + Así que en realidad no hablas con sus formas físicas, sino con un tipo de representación holográfica suya. + + #I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. + Lo sé, es una lástima. Es una lástima porque tenemos tanto en común, pero tan solo podemos ayudarnos como amigos. + + #There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. + Es una pequeña cosa que echas en falta cuando no puedes tener una conversación cara a cara todo el tiempo. + + #But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. + Pero no me estoy quejando. ¡Eso es mejor que nada en absoluto! No puedo ni imaginar cómo seria de otra forma. Algo terrible. + + #It was nice talking at you, good luck with whatever you're up to. + Ha estado bien hablar contigo, buena suerte con lo que sea que estés haciendo. + + #You're still here? I can tell you everything again, if you'd like. + ¿Aún estás aquí? Puedo contártelo todo de nuevo, si quieres. + + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +#Crickson: Hey ya big bully! I’m not afraid of you! +Crickson: ¡Hey, tú, abusón! ¡No te tengo miedo! +#Crickson: Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +Crickson: ¡Cabeza hueca! ¡No voy a salir corriendo! ¡Ni siquiera si intentas darme una buena! +#Crickson: Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! +Crickson: Tan solo eres un idiota de mierda, ¡eso es lo que eres! ¡Deberías avergonzarte de ti mismo! + end scene + + scene thorax +#Thorax: I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +Tórax: Soy el tórax, y hablo en nombre de las abejas.\n^¡Su destino es incierto, ciertamente!\n^¡En algunas colonias todas las obreras se han ido!\n^Estas colonias morirán, ¡y no es que eso sea algo agradable de ver! + +#Thorax: Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +Tórax: Quizá sea un virus o un nuevo pesticida,\n^¡quizá sean las larvas de esos asquerosos fóridos!\n^Está haciendo que todas las abejas actúen de un modo muy extraño.\n^¡Sea lo que sea, es preciso que cambie! + +#Thorax: Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! +Tórax: Vale, no sé qué está pasando realmente\n^Me preocupa que mis esfuerzos sean nada más que cháchara.\n^¿Pero cómo voy a quedarme de brazos cruzados?\n^¡Voy a escribirlo en Facebook, Twitter y Yelp! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +#Buy my stuff +Cómprame algo + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +#What are you doing here, punk? Get lost! I caught it fair and square! +¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente! +#I won’t let it go! Not in a million years! +¡No voy a soltarla! ¡Ni en un millón de años! + end scene + + scene inside +#Oh, did you come here to terrorize me some more? +Oh, ¿viniste aquí para aterrorizarme más aún? +#You’re just siding with the cats because they are cute and furry. +Estás de parte de los gatos solo porque son monos y peludos. + end scene + + scene etc +TOP +#What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +¿Qué estás haciendo aquí, tío? ¡Piérdete! ¡La conseguí legalmente!^ ¡Hostia!^ ¿Eso es--?^ ¿¿¿OTRO GATO???^ ¡¡¡LA MADRE QUE...!!! + +#You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +Has... has limpiado mi casa... ¡Eso me ha llegado al alma! ¡Toma, quiero darte mi más preciada pertenencia! + +#Young opens and takes the box. Something is inside it! +Young toma y abre la caja. ¡Hay algo dentro de ella! + +#Icky: Oh. Hey Miao.^\n\nMiao: I’m so glad you’re safe!^\n\nIcky: Uh... thanks for the hand, Young. +Icky: Oh. Hey Miao.^\n\nMiao: ¡Me alegro tanto de que estés bien!^\n\nIcky: Uh... gracias por la ayuda, Young. +LOOP +#Icky: To be honest, I kind of like sitting in boxes. +Icky: Si te soy sincero, meterme en cajas es algo que me gusta. + end scene + end area +end npc + +npc miao + area FIELDS + + scene init +#Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +¡¡Oh!! ¡¡¡Tú eres Young, El Elegido!!! Odiosmio, ¡qué gran honor! Mi nombre es Miao Xiao Tuan Er, aspirante a Elegido! + +#Could I follow you around for a bit to watch a Chosen One in action? +¿Puedo seguirte un ratillo para ver a un Elegido en acción? + +LOOP +#Hello again, Young! Can I shadow you today? +¡Hola de nuevo, Young! ¿Puedo seguirte hoy? + end scene + + scene randoms +# 0. after talk to shopkeep +#Miao: Hey, Young... have you ever stolen anything? +Miao: Eh, Young... ¿alguna vez has robado algo? + +# 1. AFter talk to mitra +#Miao: I like Mitra... and isn’t Wares a handsome bike? +Miao: Me gusta Mitra... ¿y no te parece que Género es una bicicleta muy bonita? + +# 2. Nexus pad +#Miao: What’s that cool stone thing, Young? Does it make you go back in time?! +Miao: ¿Qué es esa cosa de piedra tan chula, Young? ¡¿Hace que puedas volver atrás en el tiempo?! + +# 3. Random if Icky not saved +#Miao: I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +Miao: Me estoy empezando a preocupar por Icky... Young, ¿has visto un gato grande merodeando por ahí recientemente? Lo último que Icky dijo fue que iba a dar una vuelta cerca del pequeño bosque que está yendo hacia el Este. + +# 4. leave map +#Miao: Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +Miao: Icky dijo que no debería ir donde no es seguro. Te veo luego, Young. + +# 5, 6, 7 - only after you've seen 0, 1, 2 +#Miao: Have you ever sat in a bunch of grocery bags? +Miao: ¿Alguna vez te has sentado encima de un montón de bolsas de la compra? +#Miao: Hey Young, do you think it’s wrong to do catnip? +Miao: Eh Young, ¿crees que sería buena idea plantar menta de gato? +#Miao: I bet it must have taken a lot of work to become The Chosen One, huh, Young? +Miao: Apuesto a que te ha llevado mucho trabajo convertirte en El Elegido, ¿eh, Young? + end scene +# musing after you save icky + scene philosophy +#That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +Esa espantosa situación con Icky me ha hecho pensar... ¿Qué crees que ocurre después de que muramos? ¿Cómo podríamos cualquiera de nosotros cumplir nuestro propósito en lo que abarca una vida? + +#Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +Puede que nos reencarnemos una y otra vez hasta que cumplamos nuestro destino. ¿O eso sería poner las cosas demasiado fáciles? + +#And then what is our reward for completing our journey? Do we just fade away? +¿Y cuál es nuestra recompensa por completar nuestro trayecto? ¿Simplemente desaparecemos? +LOOP +#Hmm... +Hmm... + end scene +# icky talking after yoh save icky + scene icky +#Oh. Hi, Young. +Oh. Hola, Young. +#My name’s not really Icky. It’s Ichabod. +Mi nombre no es Icky en realidad. Es Ichabod. +#I hope Miao Xiao Tuan Er hasn’t been too much trouble. +Espero que Miao Xiao Tuan Er no te haya causado muchos problemas. +#See you later, Young. +Te veo luego, Young. + end scene + end area +end npc + +npc generic_npc + + area DEBUG + scene melos +#Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +Hola, ¿qué tal? ¡Me has encontrado! Voy a quedarme aquí, fuera hace frío. +#You can blame me for all of those awful rooms! I made them with the DAME map editor. +¡Yo soy el culpable de todas esas terribles salas! Las hice con el editor de mapas DAME. +#I made this game with FlashDevelop IDE and the Flixel AS3 framework! +¡He hecho este juego con FlashDevelop IDE y el framework Flixel AS3! +#Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +Ah sí, e hice la música usando REAPER DAW. Y algunas veces Audacity. +#I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +En realidad me nutro de la radiación de todos estos ordenadores... ^¿qué quieres decir con que eso no es biologicamente acertado? +#Hi mom! ^And dad! +¡Hola mamá! ^¡y papá! +#Want to know how to finish the game in 20 minutes? +¿Queréis saber cómo pasaros el juego en 20 minutos? +#Ha! Like I'd tell you! +¡Ja! ¡Como si os lo fuera a decir! +#(...maybe if you ask me nicely...) +(...quizá si me lo pedís amablemente...) + end scene + scene marina +#Woah hey! +¡Eh wow! +#I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +¡He escrito un montón de diálogos para este juego!^ (...pero no este diálogo. Melos lo está haciendo.) +#I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! +¡He usado Adobe Photoshop CS5, Graphics Gale Free Edition y la Herramienta de Recorte de Windows 7 para hacer el arte! + end scene + end area +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +#The humidity here is good for your skin, but bad for your hair. +Esta humedad es buena para tu piel, pero mala para tu pelo. + +#I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +Me gusta quedarme aquí. Ahora la gente pasa el verano entero yendo de acá para allá cambiando entre un calor sofocante y un aire acondicionado glacial. Esos cambios tan rápidos de temperatura debilitan los huesos. + +#It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. +Es como esa manía tan fea de masticar los cubitos de hielo. Mi madre lo hacía cuando iba hacia los 30. Ahora tiene pequeñas grietas por todos los molares. + end scene + + scene second +#Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +Asegúrate de cambiarte las zapatillas y envolverlas en hojas de periódico para secarlas bien. No vaya a ser que se conviertan en un nido de bacterias. + +#Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. +¿Por qué en todos los buffets hay solamente gelatina ROJA? Es como si quisieran que desarrolláramos cáncer. + end scene + + scene bomb +#Get away from me. +Apártate de mí. +#I’m serious... leave me alone now. +Te lo digo en serio... déjame a solas ya. + end scene + + end area + area BLUE + scene one +#I don’t need your pity, Young. +No necesito tu compasión, Young. + +#Right, just go on living in your happy little world, "Chosen One"... +Venga, continúa viviendo en tu feliz mundillo, \"Elegido\"... + +#You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +Sabes, Young, la amistad es simplemente una mentira que la gente se cree. Todos somos unos gilipollas, y al final, todos estamos solos. + +#Hah, I knew you hated me, Young. +Ja, sabía que me odiarías, Young. + +#I’m doing fine. +Estoy bien. + +#Of course you don’t care, no one does. +Por supuesto que no te importa, a nadie le importa. + end scene + end area + + area HOTEL + scene one +#I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +Sé que las ciudades son sucias, están llenas de gente y todo eso, pero me gusta salir aquí fuera y observar todas estas luces. + +#It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +Es bonito a su manera. No es tan infinito como las estrellas, pero hay algo sobre su humanidad que añade una capa de complejidad maravillosa. + +#Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +Detrás de cada luz hay una persona con esperanzas y miedos y secretos... observar es tan espantosamente solitario como tremendamente personal. + +#I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +Creo que amo cada persona tras cada ventana. Os amo, gente, por ser mis estrellas. Os amo sin importar cómo de jodida sea vuestra vida ni cuán hondo creáis haber caído. Esta noche sois encantadores... + +#I’m sorry, I’m babbling. Thanks for listening. +Lo siento, estoy diciendo tonterías. Gracias por escuchar. + end scene + end area + + area REDCAVE + scene easter_egg +#Heeyyyy, mannn...take a load off, stay a whilleee, eh? +Eeehh, tíiioo...descansa, quédate un raaato, ¿sí? + end scene + end area + + area APARTMENT + scene easter_egg +#Ah! You found me! +¡Ah! ¡Me encontraste! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what they say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + + scene quest_normal +#Golem: Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +Golem: ¿Te golpeó alguna roca mientras subías? Algunas veces lanzo rocas cuando estoy furioso. Lo siento si te di. + +#Golem: My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. +Golem: Mi madre siempre decía que si seguía haciéndolo, no quedaría montaña que lanzar. Antes de eso ya chocheaba. + end scene + + scene second +#Golem: When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +Golem: Cuando eres una roca, ves muchas generaciones de gente ir y venir. Te vuelves más anciano y sabio que el más sabio entre los hombres. + +#Golem: At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +Golem: Al menos, esa es la idea. Rompí mis prismáticos hace poco, así que no sabría decirte qué ha ocurrido desde entonces. + +#Golem: Actually, I don’t miss watching people much, it’s a bore. +Golem: En realidad, no echo mucho de menos observar a la gente, es un aburrimiento. + + end scene + + scene quest_event +#Golem: Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. +Golem: Oh, sí, me encontré con alguien que parecía algo perdido...me dijeron que partían hacia la playa a echar un vistazo. + end scene + end area + + + area BEACH + scene quest_normal +#I’m not a lobster, I’m a langostino. The name’s Hews. +No soy una langosta, soy un langostino. De nombre Hews. +LOOP +#Hews: You know what the best part of the ocean is? Being able to see the horizon. +Hews: ¿Sabes qué es lo mejor del océano? Que puedes ver el horizonte. + +#Hews: The ocean is like a salty taste of infinity. +Hews: El océano es como una probadita salada de infinito. + +#Hews: A crowded beach is robbed of its grace. +Hews: Una playa abarrotada pierde su encanto. + end scene + + scene second +#Hews: Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +Hews: ¿Has oído hablar de la langosta mantis? Tiene 16 fotoreceptores que le permiten percibir luz ultravioleta. ¿Te imaginas ver un rango de colores más ancho? + +#Hews: Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. +Hews: Eso estaría muy bien. Pero vaya, ya hemos encontrado muchísimas formas de odiarnos por los colores que tenemos. + end scene + + scene quest_event +#Hews: You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. +Hews: Así que estás buscando a alguien, ¿eh? Recuerdo que yo estaba sentado aquí cuando unas pocas nubes taparon el Sol. Entonces, alguien se me acercó y me preguntó dónde estaba algo. No recuerdo qué era, pero la persona salió corriendo, diciendo que se dirigían hacia el bosque. + end scene + end area + + area FOREST + scene quest_normal +#npc james +#James: Berries are a good kind of food. I like berries. +James: Las bayas son un buen tipo de comida. Me gustan las bayas. + +#James: Please make sure not to defecate on the berries. +James: Por favor, ten cuidado de no defecar en las bayas. + +#James: So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +James: Hasta ahora he tenido relaciones sexuales 18 veces durante esta estación. Y me he comido 389 zarpadas de bayas. + +#James: Do you have any berries for James? +James: ¿Tienes algo de bayas para James? + end scene + + scene second +# -- Spanish translator's note: Literal meaning changed in order to perform a language trick +#James: I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +James: He escrito un poema:\n^Me gusta comer bayas\n^Me ponen de muy buen humor\n^¿Que cuánto me gustan las bayas?\n^¡Me las como por puro amor! + +#James: Do you like blueberries or raspberries more? +James: ¿Cuáles te gustan más? ¿Los arándanos o las frambuesas? + +#James: Do you have any berries for James? +James: ¿Tienes algo de bayas para James? + end scene + + scene quest_event +#James: Someone came by. They did not want berries. Went to southeast part of lake to the west. +James: Alguien vino. No querían bayas. Fueron a la zona Sudeste del lago que está yendo hacia al Oeste. + end scene + + end area +#npc rank +#npc olive + area FIELDS + scene easter_egg +#Olive: Hi, I'm Olive the rabbit. +Olive: Hola, soy Olive la coneja. + +#Olive: I have so much cereal left to eat! I love cereal. +Olive: ¡Me quedan muchos cereales por comer! Adoro los cereales. + +#Olive: The box is so big. It never ends! +Olive: La caja es tan grande. ¡Nunca se acaba! + +#Olive: Neverending cereal! +Olive: ¡Los cereales del nunca acabar! + +#Olive: Hmmm...maybe that's not such a bad thing. +Olive: Hmmm...quizá eso no sea tan malo. + end scene + + scene bush +#Rank: Eheheh, silly Young! A broom’s no tool for cutting bushes! +Rank: Ejejej, ¡qué tonto este Young! ¡Una escoba no es para cortar arbustos! + end scene + scene quest_normal +#Rank: I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +Rank: Me gano la vida podando arbustos. ¡A veces encuentro oro! ¡Ejejej! + +#Rank: The economy has been really struggling under this bush... +Rank: La economía ha pegado muy duramente bajo este arbusto... + +#Rank: Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! +Rank: A veces es duro mantener a la mujer y a los niños cortando arbustos--no siempre tenemos suficiente comida...¡pero siempre hemos tenido un buen fuego! ¡Ejejej! + end scene + scene quest_event +#Rank: Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! +Rank: ¿Qué? ¡Sí! Alguien vino. Dijeron que se dirigían a un laberinto subterráneo...Apuesto a que allí hay muchos arbustos, ¿eh Young? + end scene + + scene marvin +#Marvin: Oh hey, how are you feeling? +Marvin: Oh, hola, ¿qué tal te encuentras? +#Marvin: Where is Justin? +Marvin: ¿Dónde está Justin? +# -- Spanish translator's note: Literal meaning changed (American band: The Bottle Rockets) (Spanish band: La Oreja de Van Gogh) for joke's sake. +#Marvin: There's no bottle rockets around... +Marvin: Por aquí no hay ninguna oreja de ese tal Van Gogh + end scene + + scene chikapu +#Chika Chi! +¡Chika Chi! +#Chika Chika!! +¡¡Chika Chika!! +#CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! +#¡¡¡¡CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! + end scene + + scene hamster +#Bob: Bob the Hamster likes to refer to himself in the third person. +Bob: A Bob el hámster le gusta referirse a sí mismo en tercera persona. + +#Bob: Apostrophes are the root of all e'vil. +Bob: Los apóstrofos son la raíz de todo ma'l. + +#Bob: quiet! I am busy exuding an aura of hamstery ambiance. +Bob: ¡Quieto! Estoy ocupado rezumando un aura de ambiente hamsteril. + +#Bob: ... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +Bob: ... Supongo que mejoras en algo si lo haces repetidas veces... Pero... si haces algo mal, ¿lo que harás no será mejorar en hacer algo mal? + +#Bob: A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +Bob: Un hombre de verdad nunca llora... bueno, quizá se le escapa una lagrimilla por el rabillo del ojo, deslizándose por su cara acostumbrada al Sol, mientras monta su mala malota Harley a través del venteado desierto de Mojave no llevando ni casco ni gafas protectoras. Pero él nunca llora. + +#Bob: This game was created by an infinite number of monkeys working on an infinite number of typewriters. +Bob: Este juego fue creado por un infinito número de monos trabajando en un infinito número de máquinas de escribir. + +#Bob: I miss James... +Bob: Echo de menos a James... + end scene + + scene electric +#Kuribu: Curry is yellow and spicy! +Kuribu: ¡El curry es amarillo y picante! + +#Kuribu: For the clever opponent, injure increase! +Kuribu: ¡Para el oponente inteligente, incremento de daño! + +#Kuribu: You got the experience of 2! +Kuribu: ¡Conseguiste la experiencia de 2! + +#Kuribu: I tell you my phone number! 0*1-51*7-*4386 +Kuribu: ¡Te digo mi número de teléfono! 0*1-51*7-*4386 + end scene + + end area + + + area TRAIN + scene quest_normal +#What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +¿Que qué ESTOY haciendo aquí? ¡Buena pregunta! Acabo de dar con este sitio. Estoy escondiéndome. Este lugar es seguro, si no te aventuras muy lejos y dejas que esos tipos te cojan. + +#It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +Parece que soy relativamente afortunado. Todos esos muertos desparramados a lo largo y ancho del lugar - ¿cómo murieron? Es un tanto fascinante, divagar sobre cómo ocurrió. ¿Fueron atacados por los monstruos? ¿Tropezaron y cayeron en los pinchos? + +#It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. +Es un poco macabro. Espero que no me pase a mi. El dolor físico es una perspectiva terrible. + + end scene + scene quest_event +#Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. +Ah...ahora que lo pienso, una persona pasó por aquí hace un rato. Dijeron que estaban buscando algo... ¡incluso se parecían un poco a ti! No recuerdo cuando, lo siento. Es difícil adivinar la hora aquí. Pero dijeron que tenían pensado ir a una ciudad de por aquí cerca. + end scene + end area + + area SUBURB + scene quest_normal +#Hello. +Hola. + +#Are you looking for something? +¿Estás buscando algo? + +#What are you looking at? +¿Qué estás mirando? + +#No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. +No, no soy un ciudadano de esta ciudad. Lo que es extraño es que puedes verme y hablar conmigo, pero no puedo interactuar con ninguno de ellos. Todos esos asesinos andan por ahí sueltos, y nadie parece darse cuenta. Es extraño. + + end scene + scene quest_event +#Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. +Sí. Vi una persona acercarse. Estaban buscando algo. No sé dónde podría estar ese 'algo' que buscaban. La persona salió disparada. Dijo que necesitaban ir a un area alternativa del espacio. Suena interesante. + end scene + end area + + area SPACE + scene quest_normal +#WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +SOOOO SOOOO - - - ¿ ¿ ¿ QUIÉN ERES TÚ ? ? ? + +#I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +SOY UN VAGABUNDO . . . ESTA ES UNA DE LAS ÁREAS DE DESCANSO MÁS POPULARES ENTRE EL TRAYECTO DESDE A HASTA B. + +#WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! +¿ ¿ ¿ QUE QUÉ ES 'A' ? ? ? ES MI CIUDAD NATAL . . . VOY A VISITAR A UN VIEJO AMIGO EN B . . . ES UN LARGO RECORRIDO . . . PERO YO HAGO SACRIFICIOS . . . ¿ ¿ ¿ TÚ NO ? ? ? ¡ ¡ ¡ HACE QUE LA VIDA SEA MÁS EXCITANTE ! ! ! + end scene + scene quest_event +#OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? +OHH - - - BUSCANDO A OTRO HUMANO - - - YA VEO . ^ DEJA QUE ACCEDA A MI MEMORIA . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n AJÁ . . . \N LA PERSONA TUVO UNA REVELACIÓN Y DIJO QUE SE DIRIGÍAN HACIA UN COBERTIZO EN ALGÚN CAMPO BIEN CUIDADO. \n AHORA QUE LO PIENSO . . . ¡ ¡ ¡ TE PARECES MUCHO A ELLOS ! ! ! ¿ ¿ ESTÁS SEGURO DE QUE NO ERAS TÚ ? ? ¿EH? ¿ MM ? + end scene + end area + + area GO + scene quest_normal +#You actually were...uh, ah. Well done. +En realidad estabas...uh, ah. Bien hecho. +LOOP +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella: \"Rápido, antes de que me tenga que ir de nuevo (Esto se está iluminando cada vez más por momentos, siempre sucede) - la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\" + end scene + scene quest_event +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +La reluciente roca refleja solo una minúscula parte de la luz de la sala. Hay algo grabado en ella: \"Rápido, antes de que me tenga que ir de nuevo (Esto se está iluminando cada vez más por momentos, siempre sucede) - la parte Noroeste del bosque azul - vi otra entrada al templo desde el norte, pasando esos árboles - si pudiera intercambiar las cosas a placer para llegar hasta allí... quizá haré esto la próxima vez que revisite este mundo.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +#HELLO. HAVE YOU MET cube YET? +HOLA. ¿HAS CONOCIDO A cubo YA? + +#cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. +cubo ES UN MUY BUEN GOBERNANTE DE ESTA PORCIÓN DEL ESPACIO. LOS OTROS GOBERNANTES LO HACEMOS LO MEJOR QUE PODEMOS EN NUESTROS ESPACIOS TAMBIÉN. + end scene + + scene gray2 +#WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +¿QUÉ OPINAS DE ESTE TROZO DE ESPACIO? ¿ES UN BUEN PUNTO EN EL CAMINO, NO? + +#AN INTERSECTION OF WORLDS! +¡UNA INTERSECCIÓN DE MUNDOS! + end scene + scene gray3 +#NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +NINGUNA DE LAS PIRÁMIDES GRISES ESTAMOS REALMENTE AQUÍ. USAMOS DISPOSITIVOS ESPECIALES QUE NOS PERMITEN PROYECTARNOS AQUÍ. + +#WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. +¿QUE POR QUÉ HACEMOS ESO? PORQUE QUEREMOS HABLAR CON NUESTRO AMIGO cubo Y HACERLE COMPAÑÍA. + end scene + + + scene graydead +*bzrrrrt* + end scene + + scene grayspin +#...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +...¿EL DISPOSITIVO HOLOGRÁFICO ESTÁ FUNCIONANDO CORRECTAMENTE? +#NO?^...^DAMN! +¿NO?^...^¡MALDITA SEA! + end scene + + + scene color1 +#Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! +¿Has conocido a CUBO? ¡Hace cosas muy molonas! He oído que una vez se apoyó sobre un borde durante casi doce segundos. ¡Guau tío! ¿Sabes lo que eso significa para la Liga de los Apoyadores Sobre Bordes? ¿No? ¡Bueno, pues mucho! + end scene + + scene color2 +#CUBE does a lot of interesting work! +¡CUBO hace un trabajo muy interesantes! + +#Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. +¿Te has enterado? ¡Parece ser que pronto llegará mi turno para gobernar! En tan solo unos minutos, creo. + end scene + + scene color3 +#I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +Soy de Barra de Azúcar, de camino a Taipei. ¿Que por qué estoy aquí? ¡Oh, he parado para decir hola a CUBO! + +#Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. +¡No mires tanto abajo! Este lugar es simplemente una rara representación para no conmocionar a todos los visitantes. Es mayormente inofensiva, por lo que sabemos. + end scene + + scene colordead +#(...is it taking a nap?) +(¿...está echándose una siesta?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +#EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. +CADA GENERACIÓN NACE DEL DOLOR PARA MORIR EN DOLOR. NO SUFRIREMOS PARA REPRODUCIR EL CICLO. NO SALDREMOS FUERA. + end scene + scene after_fight +#IS THIS YOUR PUNISHMENT FOR OUR REBELLION? +¿ES ESTE TU CASTIGO POR NUESTRA REBELIÓN? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +#Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? +¿Por qué privas a El-Que-Todo-Lo-Ve de sus sacrificios? ¿Por qué nos has arrebatado nuestra salvación? + end scene + scene after_fight +#...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. +...Hemos fallado en hacerte pagar por tu intromisión. Y aun así... nos has devuelto nuestra oportunidad para ser libres. Gracias, Young. Que El-Que-Todo-Lo-Ve tenga consideración por ti una vez más. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +#So good to see you, Yang. Been too long. Still playing those nintendos, I see? +Qué bueno verte, Yang. Ha pasado mucho tiempo. Veo que aún sigues jugando a esas nintendos, ¿eh? + end scene + scene after_fight +#Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. +Por el amor de Dios, Yon, ¿cúando vas a madurar? ¿Sabes? Vas a tener que aprender a tratar con gente tarde o temprano. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +#We have all the finest amenities here. How do you like the Pool? +Aquí disponemos de los mejores servicios. ¿Cómo le gustaría la Piscina? + end scene + scene middle_fight +#How about our state-of-the-art fitness center? +¿Le apetece una sesión en nuestro gimnasio de última generación? + end scene + scene after_fight +#We hope you enjoyed your stay! +¡Esperamos que haya disfrutado de su estancia! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +#Today is a nice day. +Hoy es un buen día. + +#Thanks for scratching that itch on my neck - I can't seem to reach it. +Gracias por rascarme ese picor en la nuca - No lograba alcanzarlo. + +#I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +He oído que los huevos del restaurante de la zona están bastante buenos. Además tengo un cupón para ellos. + +#Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +¿Viste el accidente de automóvil de hoy? ¡Qué horror! Estaba chateando. ¡Qué lástima, tan joven! + +#My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +Mi hijo no ha conseguido entrar al equipo juvenil de la universidad. Qué decepción. Invertimos mucho en su carrera deportiva. + +#Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +Hoy es el día de acción de gracias. Estoy agradecido por muchas cosas. No veo el momento de que llegue mañana para ir a las rebajas matutinas. Voy a pillar gangas a cascoporro. + +#Ah, I think I might be late for work. +Ah, quizás llegue tarde al trabajo. + +#I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +Tengo un poco de prisa por llegar a casa, necesito limpiarlo todo antes de que vengan los suegros. + +#We're having a garage sale! +¡Estamos vendiendo objetos usados en el garaje! + +#Welcome! +¡Bienvenido! + end scene + + scene words_teen +#I didn't see the latest movie. +No vi la última película. + end scene + + scene words_kid +#I never gotta see the new cartoon! +¡Nunca debo ver los nuevos dibujos animados! + end scene + + scene family +# inside of a house, parent (insightful kid) - 73 +#Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +¡Bienvenido a nuestra casa, forastero! Tu cara me suena. Este es un pueblo tranquilo. Bastante tranquilo, sin muchos visitantes. + +#inside of house, younger kid +#Do you like Davement? My brother Dave showed me this really cool song by them! +¿Te gusta Davement? ¡Mi hermano Dave me ha enseñado esta canción tan molona suya! + end scene + + scene older_kid +# inside of a house, olderkid +#My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +A mis amigos les gusta escuchar esa canción de 'Rayhead' llamada 'None Surprises' y quejarse de este lugar. A ver, sí, es un poco aburrido, ¡pero joder, al menos muestra un poco de gratitud! ¡O haz algo para cambiarlo! Son todos unos...oh, perdona. Tiendo a hacer eso a veces... + +#I guess I'll just go write in my blog. +Creo que iré a escribir en mi blog y ya. + +#You sure look like you're in a daze. +Parece que estás atontado, en serio. + +#I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. +Me cuesta oír mis pensamientos cuando dan deportes y tal en la tele, pero a mis padres les gusta. + end scene + +#inside of hanged man house 74 + scene hanged +#A note on the corpse: \"Placing myself in danger no more.\" +Una nota sobre el cadáver: \"No me pondré otra vez en peligro.\" + end scene + + scene festive +#Inside of another house, (festival people) - 75 +#Oh, is there something going on outside? A festival? A parade? +Oh, ¿están haciendo algo ahí fuera? ¿Un festival? ¿Un desfile? + +#There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. +¡Parece que hay bastante alboroto ahí fuera! ¿Has mirado por la ventana? Me pregunto qué será. + end scene +#78 + scene paranoid +#My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +Mi casa tiene muchas ventanas. No me gustan las ventanas. Es como si alguien estuviera siempre mirando dentro. Y sabes que algo DEBE estar pasando ahí fuera. No puede ser que esté todo tan quieto siempre, tan callado y tranquilo - eso me inquieta. + +#Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +¿Asesinos? ¿Qué? ¿En la calle? ¿De qué estás hablando? ¿Estás tomándome el pelo? Nunca antes ha habido ningún asesinato en este pueblo, pero aun así...estás haciendo que empiece a preocuparme...quizá sea mejor que te vayas. + +#Please get out. +Por favor, vete. + end scene +# 76 + scene dead +#The body of this woman has been beaten to death by a blunt weapon. +El cuerpo de esta mujer ha sido golpeado hasta la muerte por un arma contundente. + +# --> Spanish translator's note: if a pun were intended here, no way has been found in order to emulate the relation of both expressions \"blunt weapon\" and \"to put it bluntly\" in Spanish since they share completely different words in all their sayings. +#The man, to put it bluntly, well... +El hombre, francamente, pues... + end scene + + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +#Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +¡Oh, eres tú! Tu cara me suena...No puedo moverme hasta que sigas matando a más de estos ciudadanos, ¿recuerdas? Vuelve en un rato. + +#According to this pamphlet...you only need to kill a few more people! Keep it up. +Según este panfleto...¡solo necesitas matar unas cuantas personas más! Sigue así. + +#We only need one more body, and then we can keep going. +Solo necesitamos otro cuerpo más, y ya podremos continuar. + +#Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? +Bien hecho. Entra si quieres. No tengo ni idea de lo que habrá. Te veré de nuevo mañana a la misma hora, ¿vale? ¿O la noche siguiente? + + end scene + end area +end npc +# dialogue for the cards +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +#I don't mind being watched by the trees. +No me importa ser observado por los árboles. + +#1 Bat(?) - extra overworld area +#Where is she?! +¡¿Dónde está ella?! + +#2 sunguy +#I will be with you Young, whenever you are alone. +Estaré contigo, Young, siempre que estés solo. + +#3 Shieldy +#Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +¿Eres un Ookchot? Mi mamá siempre me advirtió sobre el Peligroso Ookchot. + +#4 slime +# --> Spanish translator's note: Phew! I did my best here! I'm very happy with it! +#Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +¡Gominhola, Young! ¡Entartado de haberte conocido flanmente! Pareces abatido, ¿por qué no te quesadas un rato? ¡No tartaré en servir el té! + +#5 post-statue area in BEDROOM +#Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Banco, Presbiterio, Púlpito, Altar, Vidrieras de colores... + +#6 SUBURB inside of house past blocker +#Limited time offer! Buy one, get one free - only today! +¡Oferta por tiempo limitado! Compra una, y llévate otra gratis - ¡solo hoy! + +# 7 APT Boss +#Remember the time that you lit a candle when the power was out? +¿Te acuerdas de esa vez que encendiste una vela cuando se fue la luz? + +# 8 APT Silverfish +#Mmmm, your pillow was cozy last night. +Mmmm, se estaba bien en tu almohada esta pasada noche. + +# 9 APT gasguy +#This'll teach 'em for calling me the fumi-GAY-tion guy. +Esto les enseñará a no llamarme más el fumi-GAY-dor. + +# 10 FIELDS 1 (island) - mitra +#Wares and I make a good team. +Género y yo hacemos un buen equipo. + +# 11 FIELDS 2 (alcove) - Miao +#I'm the Chosen One-in-training!!! +¡¡¡Soy el aspirante a Elegido!!! + +#12 Base of WINDMILL windmill +#Do you ever feel like, no matter what you do, you can't stop the world from dying? +¿A veces no te sientes como si, hagas lo que hagas, no pudieras evitar que el mundo se fuera muriendo? + +#13 Hidden up a river in FOREST +#Beware the forest mushrooms... +Ten cuidado con las setas del bosque... + +#14 Bottom of ladder-mini-maze on CLIFF +#I am sorry. It is my nature. +Lo siento. Es mi naturaleza. + +#15 Top of Cliff +#What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +¿¿Qué quieres decir con 'Solo una roca'?? ¡¿Las rocas también podemos aparecer en cartas, sabes?! + +#16 Western end of BEACH past spikes +#Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +Dale a un hombre un pez y comerá por un día. Enseña a un hombre a pescar, y pasará ratos felices con su hijo Jimmy. + +#17 At end of path through the woods in REDSEA +#Sometimes the answer is taking a walk. +A veces la respuesta es dar un paseo. + +#18 MOVER Redcave - Past 2 locks in central redcave +#Why do bats suddenly fly down, every time you're around? +¿Por qué los murciélagos pasan volando siempre que estás cerca? + +#19 SLASHER Redcave - West end of Northern redcveave +#NO, *YOU* NEED BRACES! +¡NO, *TÚ* NECESITAS APARATO! + +#20 REDBOSS Redcave - post boss +#ARE YOU HAPPY NOW? +¿YA ESTÁS CONTENTO? + +#21 NW corner of CELL - chaser +#Don't get violent around me. +No te me pongas violento. + +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +#I've always wanted to be on Iron Chef. +Siempre he querido estar en Iron Chef. + +#23 CONTORT circus - contort + firepillar room in SW chunk +#My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +Mi mamá siempre me decía, '¡Si te doblas mucho, tu espalda se quedará así para siempre!' + +#24 LION circus - end of northern gauntlet bordering boss room +#Are you amused yet, human? +¿Te has divertido, humano? + +#25 A+J BOSS circus - basement (post boss) +... + +#26 FROG crowd - North of entrance +#Scientifically speaking, toads are a subset of frogs. +Científicamente hablando, los sapos son una subespecie de las ranas. + +#27 CROWD GUY crowd - 2nd floor +#HAHAHAHA! Yeah! I know! +¡JAJAJAJA! ¡Seh! ¡Lo sé! + +#28 WALL BOSS crowd - post boss +#Oh, you collect cards, too? Real classy, Ying. +¿Oh, coleccionas cartas también? Cuánta elegancia, Ying. + +#29 end of grey end of space, for grey cube king +#They always said, \"Get off the computer! Or you'll never make friends!\" +Siempre me decían, \"¡Quítate del ordenador! ¡O nunca harás amigos!\" + +#30 end of colorful end of SPACE, for color cube king +#I'm only the ruler for the extent of a conversation. +Soy el gobernador tan sólo el tiempo que dure una conversación. + +#31 DUSTER hotel - end of 4th floor moving platform area +#I'll bet you think you're 'making my job interesting'! +¡Apostaría a que estás pensando que estás 'haciendo mi trabajo interesante'! + +#32 DASH TRAP hotel - Dash trap room on 3rd floor +#I hate diagonals. +Odio las diagonales. + +#33 BURST PLANT hotel - SE corner floor 2 +#Don't even try that claritin clear shit with me. +Ningún brebaje para la alergia te salvará de mis esporas. + +#34 EYE BOSS hotel - post-boss +#Swipe this card to unlock the door to your room! +¡Pasa esta carta por un lector de tarjetas para desbloquear la puerta de tu habitación! + +#35 end of left-most TERMINAL bridge - sage +#I'm doing a great job. +Estoy haciendo un gran trabajo. + +#36 Young (drawer APT) +#.......?? +¿¿.......?? + +#37 old BDRM (dialogue rock) +#Who carved all of us anyways? +Por cierto, ¿quién ha sido el que ha grabado encima de nosotras? + +#38 hotel room +#I hope you enjoyed your stay. +Espero que haya disfrutado de su estancia. + +#39 end of debug minidungeon (old player sprite) +#Seening as you've gotten to this point, you must be quite Intrasting. +Biendo cómo has llegado a este punto, debes de ser bastante Interasante. + +#40 end of cell - Torch? +#I'm just here to lead you astray. +Estoy aquí para dirigirte hacia el extravío. + +#41 end of SPACE - faces/entities +#You like like a pyramid to us, too! +¡Tú eres como una pirámide para nosotras también! + +#42 end uf suburb (killer) +#It's the same damn play, night after night, and the pay sucks. +Joder, es siempre lo mismo, noche tras noche, y encima no gano una mierda. + +#43 GOldma's room - goldman +#Leave me alone! My last name isn't Sachs! +¡Déjame en paz! ¡Mi apellido no es Sachs! + +#44 blank, ISlands - Broom +#At least I'm not a stick. +Al menos no soy un simple palo. + +#45 fields, bottom right - (Rank) +#What do you mean money doesn't grow on trees? Eheheheh! +¿Qué quieres decir con que el dinero no crece en los árboles? ¡Ejejejej! + +#46 street, bottom (Follower bro) +#I'm nothing but an illusion. +No soy nada más que una ilusión. + +#47 redsea, bottom eft (Bomb npc) +#I'LL TAKE IT OUT ON YOU. +ME VOY A DESQUITAR CONTIGO. + end scene + end area +end npc + +npc misc + area any + + scene controls +#Press +Pulsa +# [SOMEKEY-LEFT] +#to set controls. +para definir\nlos controles. +# [SOMEKEY-ENTER] +#to cancel. +para cancelar. +#Up +Arriba +#Down +Abajo +#5 +#Left +Izquierda +#Right +Derecha +#Jump +Saltar +#Attack +Atacar +#Menu +Menú +#10 +#Press +Pulsa +# [SOMEKEY-ENTER] +#to exit +para salir +# [SOMEKEY-LEFT] +#to set controls. +para definir los controles. + end scene + + scene title +#Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress +Por favor, usa las\nteclas de dirección para redimensionar\nla ventana hasta que\nno puedas ver\nnada negro alrededor\nde los bordes.\n\nPulsa +# [SOMEKEY-C] +#when done. +cuando acabes. +ANODYNE +Melos Han-Tani\nMarina Kittaka +#any key +cualquier tecla +#5 +#Press +Pulsa +# [SOMEKEY-C] +#to start +para empezar +#Version +Versión +#Continue +Continuar +#New Game +Nueva partida +#10 +#Are you sure?\nNo\nYes +¿Estás seguro?\nNo\nSí +#Really?\nNah\nYeah +¿De verdad?\nNah\nSeh +#No going back!\nForget it\nI know +¡No hay vuelta atrás!\nOlvídalo\nLo sé +#deaths +muertes +#cards +cartas +#15 +#Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +Anodyne soporta\nla mayoría de los mandos.\n\n¿Vas a usar uno?\n\nSí No\n\nSi es así, conéctalo ahora.\n\nMuévete con las teclas de dirección\n\nSelecciona usando\nC, ESPACIO, o INTRO\n\nSe aplicará 'Sí' por defecto en\n + +#NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device. +Press BACK again\nto exit.\nUnsaved progress\nwill be lost. +NOTA\n\nSi sufres de lag al pulsar las teclas\ndurante la partida,\nsal al escritorio y\nvuelve a abrir Anodyne.\n\nPULSA C PARA CONTINUAR\n\n¿La interfaz gráfica no aparece como debería?\nPulsa el botón de abajo\ny luego reorienta el dispositivo. + end scene + + scene gui +# Note - this below one is a sprite that fits into the gui +#menu=enter +menú=intro + +# Shows up when you save at a checkpoint +#Saving... +Guardando... + end scene + + scene map +#Map +Mapa +#Current Room +Sala actual +#Door/Exit +Puerta/Salida +#No Map +Sin mapa +#Return to\nNexus +Volver a\nNexus +#Return to\nentrance +Volver a\nla entrada + end scene + + scene items +#Items +Objetos +#Normal +Normal +#Swap +Swap +#Extend +Alargar +#Widen +Ensanchar +#5 +#A pair of spring-loaded shoes - press +Un par de zapatillas con resortes - ¡pulsa +# [SOMEKEY-X] +#to jump! +para saltar! +#A pair of shoes for biking. +Un par de zapatillas para ir en bicicleta. +#An empty cardboard box. +Una caja de cartón vacía. +#A key found in the Temple of the Seeing One. +Una llave encontrada en el Templo de El-Que-Todo-Lo-Ve. +#10 +#A key found in a red, underground cave. +Una llave encontrada en una roja y subterránea cueva. +#A key found in a mountain cave. +Una llave encontrada en una cueva en las montañas. + end scene + + scene cards +#Cards +Cartas +#cards +cartas + end scene + + scene save +#Save +Guardar +#Saved! +¡Guardado! +#ERROR +ERROR +#Save and go\nto title +Guardar, volver\nal título +#Go to title +Volver al título +#5 +#Save and quit +Guardar y salir +#Quit game +Salir del juego +#Deaths: +Muertes: + end scene + + scene config +#Config +Config +#Set keybinds +Asignar teclas +#Set volume +Ajustar volumen +#Autosave at\ncheckpoints: +Autoguardado en\ncheckpoints: +#On +Activado +# 5 +#Off +Desactivado +#Change\nResolution: +Cambiar resolución: +#Config UI +Configurar interfaz +#Touch+D-Pad +Táctil+Cruceta +#D-Pad Only +Solo cruceta +# 10 +#Touch Only +Solo táctil +#Move Input: +Entrada para movimiento: +#Resolution: +Resolución: +#Windowed +Modo ventana +#Int. Scaled +Escalado int. +# 15 +#Stretch +Estirar +#Scaling: +Escalado: +#Language: +Idioma: +ja +en +ko +# 20 +#Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +Arrastra los\nbotones\nhasta que estés\nsatisfecho.\n\nLuego, toca\nel menú\npara continuar.\n\n +#Resize Window +Redimensionar\nventana +#Config Joypad +Configurar mando + end scene + + scene secrets +#You\'re rolling in it! +¡Estás forrado! +#Once the property of a famous Bubble Mage. +Una vez fue propiedad de un famoso Mago Burbuja. +#If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +Si tus gráficos se entremezclan, mira la entrada de un Pokemon oficial en la pokedex. +#This heart has no name. +Este corazón no tiene nombre. +#Please visit the electric monsters\' world. +Por favor, visita el mundo de los monstruos eléctricos. +#5 +#A kitty statue. Cute, but useless. +Una estatua de un gatito. Mona, pero inútil. +#Oh my!!!! +¡¡¡¡Oh Dios!!!! +#Oh no!!!! +¡¡¡¡Oh no!!!! +#It\'s black. +Es negro +#It\'s red. +Es rojo. +#10 +#It\'s green. +Es verde. +#It\'s blue. +Es azul. +#It\'s white. +Es blanco. +#SOMEKEY-C +#:Select +:Seleccionar +#SOMEKEY-X +#:Back +:Volver + end scene + + scene swap +#Sorry! +¡Lo sentimos! +#The swap won't work here. +El swap no va a funcionar aquí. +#Young could not muster the strength to use the swap here. +Young no logra reunir la suficiente fuerza para poder usar el swap aquí. + + end scene + + scene keyblock +#This door is locked. +Esta puerta está cerrada. + end scene + + scene treasure +#Some strange force stops this treasure box from being opened. +Alguna extraña fuerza impide que este cofre del tesoro pueda abrirse. +#An engraving on the broom handle reads: Press +Un grabado en el palo de la escoba pone: Pulsa +#SOMEKEY-C +#to sweep. +para barrer. +#This key may be used a single time to open up a locked barrier. +Esta llave podrá ser usada solamente una vez para abrir un obstáculo que te bloquee el camino. +#A mysterious pair of boots has nothing but the branding on it, which says \"Press +Un misterioso par de botas que no tiene nada más que la marca en ellas, que dice \"Pulsa +#SOMEKEY-X +#5 +\". +#A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ENSANCHAR en el menú para hacer que la escoba suelte polvo dañino hacia los lados.\" + +#A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +Unas pocas palabras en el accesorio para la escoba dicen \"Equipa la mejora ALARGAR en el menú para hacer que la escoba suelte polvo dañino más allá de su alcance normal.\" + +#A note next to the broom extension: \"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +Una nota fijada en el accesorio para la escoba: \"Hola, Young. Usa esta mejora SWAP en dos suelos para intercambiarlos de lugar. Aun falta un poco antes de que puedas usarla en cualquier lado, pero te servirá por ahora.\" + +#YOU FOUND A HEART!!! Maximum Health increased by...zero. +¡¡¡ENCONTRASTE UN CORAZÓN!!! Vida Máxima incrementada en...cero. +#10 +#Goldman: What? It's not there? That shopkeeper must have stolen it! +Goldman: ¿Qué? ¿No está ahí? ¡Ese tendero debe haberlo robado! + end scene + + scene dust +#Your broom is now full of dust! Attack again to place it. +¡Tu escoba está ahora cargada de polvo! Ataca de nuevo para colocarlo. + end scene + + scene checkpoint +#Save game?\n Yes\n No +¿Guardar partida?\n Sí\n No +#While standing on a checkpoint, press +Mientras estés sobre un punto de control, pulsa +#SOMEKEY-C +#to save your progress and set it as your respawn point if you die. +para guardar tu progreso y hacer que éste sea tu punto de reaparición por si mueres. + end scene + + scene rock +#There is writing scrawled on this rock: +Hay algo garabateado en esta roca: +#YA AINT GOT NO FRIENDS +TU NO TIENES AMIJOS + end scene + + scene door +#The portal does not appear to be active. +El portal no parece estar activo. + end scene + + scene keyblockgate +#The gate stares, petrified. It won't open until it senses four cards... +La verja está quieta, petrificada. No se abrirá hasta que sienta la presencia de cuatro cartas... +#Sensing four cards, the gate decides to open. +Sientiendo la cercanía de cuatro cartas, la verja decide abrirse. +#The gate stubbornly remains in place. +La verja permanece obstinadamente en su lugar. +#The gate senses all of the cards, and decides to open. +La verja siente la totalidad de las cartas y decide abrirse. +#The gate senses enough cards, and decides to open. +La verja siente las suficientes cartas y decide abrirse. +#5 +#It opens! +¡Se abre! +#It remains closed. +Permanece cerrada. + end scene + + scene solidsprite +#The sign points to the east but the words on it are faded. +La señal apunta hacia el Este pero las palabras en ella están borrosas. +#The sign points to the west but the words on it are faded. +La señal apunta hacia el Oeste pero las palabras en ella están borrosas. +#The words on the sign are faded. +Las palabras en la señal están borrosas. + end scene + + scene mitra +#Hey, Young! +¡Eh, Young! + +#Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +¿Esas zapatillas de bicicleta son para mí? ¡Guau! ¡Gracias, Young! Había estado pensando en conseguir unas, puesto que Género tiene esos pedales donde puedes enganchar ese tipo de zapatillas. Toma, Young, ¡coge mis botas a cambio! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa + +#[SOMEKEY-X] +#to jump with them on! +para saltar con ellas puestas! + +#Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +¡Hola, Young! ¿Me notas algo nuevo? ^... ^... Oh, bueno, pues me he comprado estas zapatillas nuevas para ir en bici, ¡mira! Se enganchan en los pedales de Género. Puesto que no voy a necesitar más mis viejas botas, ¡quiero que tú las tengas, Young! ¡Tienen estos muelles tan molones que te permiten saltar muy alto! ¡Pulsa + +#[SOMEKEY-X] +#to jump with them on! +para saltar con ellas puestas! + +#5 +#Alright, take care! +¡Venga, cuídate! +#Go on, try them out! ...They're not THAT smelly. +¡Vamos, pruébatelas! ...No huelen TAN mal. +#Cool, huh? +Molan, ¿eh? +#Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +Guau, ¿no son esas las zapatillas para bici de la tienda de Finty? ¿Que me las regalas? ¡Gracias, Young, te lo aprecio de verdad! Toma, quédate con mis viejas zapatillas a cambio--¡estoy segura de que las encontrarás verdaderamente útiles! Hay algo bordado en las zapatillas que dice \"Pulsa +#somekey-x +#to jump\". I've never understood that, though, because there's no \" +para saltar\" Nunca entendí eso, la verdad, porque no hay ninguna \" +#somekey-x +#10 +#\" anywhere on the shoes... +\" en las zapatillas... + end scene + + scene tradenpc +#Finty: Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +Finty: ¡Bienvenido, bienvenido, Young, amigo mío! ¡Mi nombre es Prasandhoff--Finty Prasandhoff! ¡Echa un vistazo a lo que tengo y hazme saber si algo te interesa! + +#Finty: I still appreciate that box! +Finty: ¡Te sigo estando agradecido por esa caja! + +#Finty: Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! +Finty: ¡Ah, una caja! ¡Muchísimas gracias! ¡Ahora podré llevar todo mi inventario de vuelta a casa por la noche y otra vez aquí por la mañana! + +#Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +Espera un momento...¡no está aquí! ¿Qué le habrá pasado? Bueno, mira, ¡deja que alivie tus heridas entonces! + +#As a token of my gratitude, take these stylish biking shoes! +¡Como muestra de mi gratitud, toma estas elegantes zapatillas para ir en bici! + +# 5 +#Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +Hace una mañana espléndida, ¿no es así, amigo mío? ¡Una buena mañana para ir de compras! Ojalá tuviera una caja para poder transportar mi inventario. + +#Too bad, looks like you can't afford this item! Come back later, when you have the cash! +¡Qué mal, parece que no te puedes permitir este objeto! ¡Vuelve más tarde, cuando tengas el dinero! + +#Finty: Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +Finty: ¡Ah, tienes muy buen ojo! Necesitas un arma mejor, ¿no es así? ¡Vuélales la cabeza a tus enemigos por tan solo $499.99! + +#Finty: That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +Finty: ¡Ese saco de monedas te permitirá acumular dinero que encuentres en La Región! ¡Es tuyo por tan solo unos míseros $869.99! + +#Finty: Oh ho ho, here's a specialty item indeed: clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +Finty: Oh jo jo, este objeto es una especialidad, sí que lo es: ¡unas prácticas zapatillas de ciclista para que puedas ir rápido A LA VEZ QUE elegante! ¡Oferta de hoy, tan solo $299.99! + +#10 +#Finty: Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +Finty: ¿Cansado de remover el polvo con esa ridícula y raquítica escoba? ¡Erradica esas dañinas partículas de polvo con esta aspiradora de ultimísima generación! ¡Por tan solo $749.99, o en cuatro fáciles pagos mensuales de $199.99! + +#As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +Como muestra de mi gratitud, toma esta fea--digo, ¡bella carta de edición coleccionista!^ + end scene + + #(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a newline in the middle) + scene ending +Anodyne\n-------\n\n\n\nUn juego creado por\n\nMelos Han-Tani\n\ny\n\nMarina Kittaka\n\n------------- +Creado entre\n\nmarzo de 2012\n\ny\n\nenero de 2013 +DISEÑO\n------\nAmbos +PROGRAMACIÓN\n-----------\nMelos, usando la\nlibrería Flixel\npara Actionscript 3\n\n\n\nARTE\n---\nMarina\n +MÚSICA/SFX\n---------\nMelos, usando REAPER\ny sonidos de\nlibre uso.\n\n\n\nDIÁLOGO\n--------------\nMayormente Marina\n +TRAMA\n-----\nAmbos\nLocalización\nal japonés:\nKakehashi Games\nTraducción al\nespañol:\nDiego Fenollar +Gracias inmensas a\nnuestros testers,\nque han sufrido\n¡para que vosotros\nno tengáis que\nhacerlo!\n--------------\n\nMarina, por tener que\nsufrir muchos de\nlos bugs iniciales.\n\nEtan,por el apoyo\nconstante desde el\nprincipio, con\nmuchos bugs\nencontrados, y el\ntercer humano en\njugar a casi todo\nel juego entero. +O - ¡gracias,\nhermanita!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Agradecimientos de\nMelos a:\n\nMamá y Papá, por su\napoyo constante\nen esta empresa.\n\nS\n\nVarios TIGSourcers\n¡y otros\ndesarrolladores que\nhe conocido por el\ncamino!\n\nMarina, por hacer este\njuego posible, y\nmejorarlo en\nincontables\nmaneras. +Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nY mis otros amigos\nque me han\ndemostrado su apoyo\n(¡Gracias!)\n\nY por último, pero\nno por eso menos\nimportante,\nTina Chen,\namiga desde hace\nmucho, por el apoyo\nasí como también\npor presentarme\na Marina. +Agradecimientos de\nMarina a...\n\nColin Meloy, por\nexpandir mi\nvocabulario\n\nTsugumo, por\n\"¿Así que quieres\nser un\nPixel Artist?\"\n\nMi familia,\npor el apoyo\ny la comida.\n\nDaniel, por ser un\n\"desarrollador de\njuegos indie\"\ncreciendo juntos. +Mo, por creer\n en mí.\n\nTina, por\npresentarme\na Melos.\n\nMelos, por hacer\nun juego y confiar\nen mí para que\nformara una parte\nimportante de él. +REPARTO\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer +Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n +Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n +Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n +Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n +Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera +Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews +Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman +Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites +Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +Young\n\n\nMitra\n\n\nSage\n\n\nBriar +\n\n\n\n\n\n\n\n +¡Y nos gustaría\nagradecerte A TI\npor jugar a\nnuestro juego!\n\n\nEsperamos que lo\nhayas disfrutado. +Ahora tienes la\ncapacidad de\nexplorar el mundo\nde Young con (casi)\nninguna limitación,\nvia el swap (mover\ncosas de lugar).\n + end scene + + scene elevator +#Floor? +¿Planta? +1\n +2\n +3\n +4\n +#Cancel +Cancelar + end scene + end area +end npc + +# Tell the python script you're done. +DONE + \ No newline at end of file diff --git a/intra/source/data/dialogue_IT.txt b/intra/source/data/dialogue_IT.txt new file mode 100644 index 0000000..5a92d5e --- /dev/null +++ b/intra/source/data/dialogue_IT.txt @@ -0,0 +1,2667 @@ +### ENGLISH DIALOGUE - ITALIAN TRANSLATION - by Francesco D'Aucelli ### + +#################### +### INSTRUCTIONS ### +#################### +# 0. If you could comment out the english version when you translate that would be useful for me! +# +# 1. - Any line starting with "#" doesn't need to be translated +# +# 2. SPECIAL KEYWORDS THAT SHOULDN'T BE TRANSLATED: +# Any line starting with: (where "..." is some other keyword , usually an NPC name or area name) +# +# does reset +# LOOP +# TOP +# npc ... +# area ... +# scene ... +# end scene +# end npc +# end area +# DONE +# +# 3. SPECIAL INSTRUCTIONS SYMBOLS +# ---------------------------- +# [SOMEKEY-C] means that this can change depending on what controls the user uses - it would be "C", "A", "ENTER", etc. Sometimes in the dialogue file I write +# Press +# [SOMEKEY-LEFT] +# set controls. +# +# And that implies that in-game, it will read "Press LEFT to set controls." +# +# 4. SPECIAL CHARACTERS IN DIALOGUE TO BE TRANSLATED +# ----------------------------------------------- +# \" and \' are for escaping the quotation characters. You can leave them like that. +# +# ^ Denotes the player will have to press the progress-dialogue-button again to continue the dialogue - you can leave it there (or move it around as needed in the translated sentence) +# \n denotes newline, you can leave it there. + +################### +# BEGIN DIALOGUE # +################### + +### 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +#Like music? Talk to that terminal! +Ti piace la musica? Parla con questo terminal! +#Like pain? Head on down south! +Ti piace il dolore? Vai a sud! + end scene + end area +end npc + +### 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +#That acrobat is losing balance! Where is the safety net? +Quell'acrobata sta perdendo l'equilibrio! Dov'è la rete di sicurezza? +... + end scene + + scene holyshit +WOOAH + end scene + end area +end npc + +### 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +#The lions are closing in on that juggler! +I leoni si stanno avvicinando a quel giocoliere! +... + end scene + end area +end npc + +### 'briar' + +npc briar + area GO + scene before_fight +#Briar: I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +Briar: Sono stanco, Young. Sono stanco di tutti questi cicli. Mi sembra di rivivere lo stesso sogno, lo stesso incubo ancora e ancora, all'infinito. +Briar: ... +#Briar: It’s not going to change, Young. This is all we’ll ever be. +Briar: Non cambierà, Young. Rimarremo così per sempre. + end scene + + scene after_fight +#Briar: Goodbye, Young. +Briar: Addio, Young. + end scene + + scene final +#Briar: Dude, Young. +Briar: Young, amico. +#Briar: Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +Briar: Scalcia. Muovi le braccia. Diamine, non sai fare niente senza di me! +#Briar: Well, come on, let’s go get a sandwich or something. +Briar: Beh, andiamo a farci un paino. +#Sage: You... you did adequately. Until we meet again. +Sage: Sei stato... bravino. Forse ci rivedremo, un giorno. Addio. + end scene + end area +end npc + +### 'sage' +npc sage + area BLANK + scene intro +#Mysterious voice: Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. +Voce Misteriosa: Ehi... ... Young? EHI! ... oh, riesci a sentirmi? Bene, allora ascolta. Stai per svegliarti. Usa le frecce direzionali per muoverti. +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +#You will press the \' +Premi \' +#\' key to interact with objects and people around you. +\' per interagire con gli oggetti e le persone accanto a te. +#And you will press the \' +Premi \' +#\' key to access the menu, which will provide you with information about yourself and your surroundings. +\' per accedere al menù, che ti darà informazioni su te stesso e su ciò che ti circonda. + end scene + end area + + area GO + + + scene posthappy_sage +#Young... I just wanted to fix everything for you. +Young... Volevo solo che tutto tornasse com'era. +#I hope... I hope you can do better than me. +Spero... Spero che tu saprai fare meglio di me. + end scene + + scene posthappy_mitra +#Good luck, Young. +Buona fortuna, Young. +#Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +Sage non ha tutti i torti. Voglio che tutto sia perfetto, e a volte questo mi fa ignorare la realtà. +#I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +Non so di cosa hai bisogno per aiutare Briar. Non capisco come funziona questo mondo, o perché tutto sembra così strano. Ma so che voglio essere tua amica, Young. +#You are fighting, Young. You are trying to understand. I hope you can work things out. +Tu stai lottando, Young. Stai cercando di capire. Spero che riesca a sistemare le cose. + end scene + scene one +TOP +#Sage: Young... this is my final warning... wait, who is that? +Sage: Young... questo è il mio ultimo avvertimento... aspetta, chi è quella? +#Mitra: My name is Mitra, and this is my bike, Wares! +Mitra: Io sono Mitra, e questa è la mia bici, Manu! +#Sage: I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +Sage: Non ho chiesto il nome della tua bici, che ci fai qui? Non mi ricordo di te. +#Mitra: I’m here to help my friend, Young.. +Mitra: Sono qui per aiutare il mio amico, Young... +#Sage: Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +Sage: Young non ha amici. Young non ha nemmeno Briar. E se tu gli stai dando corda, ti voglio fuori dal mio mondo! +#Mitra: What do you mean? Wares and I-- +Mitra: Che vuoi dire? Manu e io... +#Sage: SHUT UP ABOUT YOUR STUPID BICYCLE!!! +Sage: NON MI INTERESSA DELLA TUA STUPIDA BICICLETTA!!! + end scene + + scene hit +TOP +Sage: ... +#Mitra: Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +Mitra: Young! Va tutto bene? Hai fatto una cosa meravigliosa... Vai avanti e falla finita con questa stupida area! Sappiamo che ce la puoi fare! +Mitra: Manu!!! +Mitra: Manu... +#Mitra: Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +Mitra: Senti, signor personaggio misterioso incappucciato, non so chi tu creda di essere, ma perché non ci lasci in pace? +#Sage: You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +Sage: Dici di essere amica di Young, ma gli mentirai, gli dirai che in fondo lui è perfetto così e tutto si sistemerà. Beh, se è questo quello che vuoi, BENE. Sparisci dalla mia vista, Young. +#Sage: Go talk to your \"friend\". +Sage: Va' a parlare con la tua \"amica\". +#Mitra: We're just doing the best we can... +Mitra: Stiamo solo facendo del nostro meglio... + end scene + end area + area NEXUS + + + scene enter_nexus +TOP +#Cloaked Man: Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +Uomo incappucciato: Ah, era ora. Ehm... ^Volevo dire...^ Benvenuto, Young! Io sono Sage, il saggio del villaggio. Sei stato convocato perché l'Oscurità si è diffusa per tutta la Landa. L'Oscurità cerca il leggendario Briar. Vuole usarne i poteri per scopi malvagi. Devi raggiungerlo per primo. Devi proteggere Briar. +#Enter the active portal on your left to begin your quest. +Entra nel portale attivo alla tua sinistra per iniziare la tua avventura. +#*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +*Sospira* non va bene che tu stia ancora qui a ciondolare. Entra nel portale per iniziare la tua avventura. Briar e, per estensione, il mondo intero è in pericolo! +LOOP +#Just go in the damn door! +Entra in quel maledetto portale! + end scene + + # After entering STREET for the first time + scene after_ent_str +#Why are you still here? +Sei ancora qui? + end scene + # After finishing BEDROOM + scene after_bed +#Continue on, Young. That key you have found, there may be others like it - seek them out. +Continua, Young. Potrebbero esserci altre chiavi come quella che hai trovato. Trovale. +#Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. +Viaggia fino ai confini più remoti della Landa, Young. È l'unico modo di fermare l'Oscurità. + end scene + # After finishing first 3 dungeons + scene before_windmill +#Take those three keys, Young, and unlock the way to the deeper realms of The Land. +Prendi quelle tre chiavi, Young, e apri la strada che porta alle zone più recondite della Landa. + end scene +#After windmill, but disappears after Sage fight + scene after_windmill +#You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. +Hai fatto quello che ho chiesto, Young, ma c'è ancora molto altro da fare. Forse esplorando le zone più remote della Landa diventerai qualcuno... forse addirittura qualcuno degno della considerazione di Briar. + end scene + + scene all_card_first +#Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. +Ottimo lavoro, Young. Hai trovato tutte le carte in un'area della Landa, e una gemma è apparsa sulla cima del portale dell'area. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Sage: Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? +Sage: Presto le tue abilità saranno messe alla prova, Young. Per uscire vivo da questo tempio ti serviranno forza e intelletto. Immagino che tu abbia già trovato un'arma, no? +# Young swipes a few times +#Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +Cos...? ... Volevo dire... Ma sì, certo... una scopa! Proprio come predetto nella Leggenda... +#*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +*sgrunt* di tutti gli incompeten... Ehi! Che stai facendo lì impalato? +LOOP +#Keep your wits about you, Young. +Tieni gli occhi aperti, Young. + end scene + end area + + area BEDROOM + scene after_boss +# Sage fades into room. +#Sage: At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +Sage: Per il momento sei ancora debole. Se speri di proteggere Briar dall'Oscurità, devi affrontare le tue paure. La carta che troverai in questo forziere, e le altre come questa, sono simboli della tua crescita. Ottenerle tutte è di vitale importanza per la tua missione. +#That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +Anche quella chiave è fondamentale per la tua missione. Devi trovare anche le altre chiavi. Seleziona la mappa sul menu per teletrasportarti all'entrata del tempio, e continua la tua eroica impresa. +#Travel East and South through the temple grounds... you will find a use for that key. +Viaggia a est e sud attraversando la zona del tempio... La chiave ti servirà. +LOOP +#What, do you want a piggy back ride to the gate or something?? +Che c'è? Vuoi che ti porti in spalla fino al cancello? + end scene + end area + + area TERMINAL + scene before_fight +#Sage: Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... +Sage: Perché non mi ascolti?! Se fai le cose di fretta come un idiota, metterai in pericolo Briar, la Landa e tutto quello per cui ho lavorato! +Mi dispiace, Young, ma se non intendi ascoltarmi, dovrò convincerti in altri modi... + end scene + scene after_fight +#Sage: Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. +Sage: Young... Non volevo che finisse così... Volevo solo che tu diventassi una persona migliore. Volevo che tu diventassi in grado di aiutare Briar. Ma questo è solo uno stupido gioco... Non posso impedirti di raggiungerlo. Ricordati le mie parole quando andrà tutto a puttane. + end scene + scene entrance +#Sage: Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +Sage: Ciao, Young. Quando diventerai una persona più forte e più saggia, questo sentiero ti condurrà da Briar. +#Sage: You’re not ready Young, first you must face more trials in The Land. +Sage: Non sei pronto, Young. Prima devi affrontare altre prove nella Landa. +#Sage: You have made progress, Young, but you must collect at least 36 cards to pass this gate. +Sage: Hai fatto progressi, Young, ma devi possedere almeno 36 carte per attraversare questo cancello. + end scene +# non idlnig stuff + scene etc +#Sage: Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +Sage: Oh... Uh... hai già almeno 36 carte? Ma io non sono sicuro che tu sia pronto per la vera prova. Infatti guarda, stavamo leggendo male questo cancello, in realtà ti servono...\n...\n........\n92 carte per passare, non 36! +#Sage: Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! +Sage: Young, non andare, non sei ancora pronto! Pensa a Briar! Alla Landa! Tutto questo non sarà servito a nulla se non sarai pronto! + end scene + end area + + + + area REDCAVE + scene one +TOP +#Sage: Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +Sage: Ottimo lavoro, Young. Non solo hai sconfitto questo mostro, ma anche la tua paura di prevalere!!! +#Sage: Of course, you still have a long way to go. Have you been exploring The Land? +Sage: Ovviamente, hai ancora molta strada da fare. Stai esplorando la Landa? + end scene + end area + + area CROWD + scene one +#Sage: Well done, Young. However, there are still trials to face. Do not let your guard down. +Sage: Ben fatto, Young. Tuttavia, ci sono altre prove che dovrai affrontare. Non abbassare la guardia. +#Sage: Have you found all of the keys yet, Young? If not, go to the beach. +Sage: Hai già trovato tutte le chiavi, Young? Se non le hai trovate, vai alla spiaggia. + end scene + end area + + + +end npc + +npc cliff_dog + area CLIFF + scene top_left +#I'm not like the others! *woof* I won't harm you... +Non sono come gli altri! *Bau* non ti farò niente... +#It is a quiet existence up here. +C'è molta pace quassù. +#You smell like swiss chard. +Sai di bietole. +LOOP +*woof* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +#You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +Ce l'hai fatta, Young! Hai sconfitto l'Oscurità! Guarda questo posto! È bellissimo! +#So beautiful... +Così bello... + end scene + + scene dump +#Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +Oh, meno male che sei qui! Temevo rimanessi bloccato in quella discarica di neve... cazzo se è deprimente lì! Ha! +#Hahaha. Hahahahaha. HAHAHAHAHAHAHA! +Ahahahah. Ahahahahahahah. AHAHAHAHAHAHAHA! + end scene + + scene drink +#Hey sexy, I’ll buy you a drink! +Ehi splendore, ti offro da bere! +#Have another drink, you little shit! Hahaha! +Bevi ancora, merdaccia! Ahahah! + end scene + + scene hot +#Fuck, it’s hot here... I’m so hot... and sweatyyy... +Cazzo fa caldo qui... il calore... il sudore... +#Damn, working out makes me horny! +Maledizione! Allenarmi qui mi eccita così tanto! + end scene + + scene gold +#Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +Sai che questo posto è fatto d'oro? Oro vero! Potremmo scappare insieme e vivere di questo mattone! Ahahahahah! +#Seriously, why are you just standing there? Help me jack this brick! +Sul serio, che fai lì impalato? Aiutami a staccare questo mattone! + end scene + + scene briar +#???: Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! + +???: Young... Ce l'hAi FatTa! mI hAi salVaTo! Oora TutTo tOrnErà ComE pRimA!!!!!! + end scene + end area +end npc + +### 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +#HEADS UP! +OCCHIO! +#Mitra swerves to avoid you and crashes +#Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +Scusami... Andavo troppo veloce. Ehi, non ti ho mai visto prima! Sei un viaggiatore come me? ... Eh? Vuoi salvare Briar dalla Malefica Oscurità? ... ^Ehm... Non ci ho capito niente, ma ok, figo! +#I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! +Ero qui, assieme a Manu... Cosa? Certo che non sono da sola, Manu è qui con me. Non hai capito, Manu è il nome della mia bici! +#Plays if you talk 3 times, or if you leave the screen +#Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. +Beh, forse ci incontreremo di nuovo. Ti farò sapere se scoprirò qualcosa di questo Briar. +#Mitra bikes away + end scene + end area + area BLUE + scene one +#HEADS UP! All right Wares, let’s do this! +OCCHIO! Forza Manu, andiamo! +#Annnd presto! +Eeeee via! +#Keep going, Young, we’ve got your back! +Continua Young, siamo con te! + end scene + end area + + area FIELDS + scene init +#Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +Ti ricordi di me? L'altra volta ti ho presentato solo Manu, la mia bici. Il mio nome è Mitra. +#Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +Ti ricordi di me? L'ultima volta ho dimenticato di presentarmi. Sono Mitra, e questa bella bici qui si chiama Manu. +LOOP +#Mitra: So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +Mitra: Come va, Young? ... Cosa? Come so il tuo nome? Pensi che sia strano, eh? Beh, l'ho letto sul retro della tua felpa. +#Mitra: See you around, Young! +Mitra: Ci vediamo, Young! + end scene + scene quest_event +#Mitra: Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. +Mitra: Ah, mi sono appena ricordata. Prima qualcuno ha detto che stava cercando di trovare qualcosa. Non sono sicura di che stesse parlando, ma è andato in tutta fretta verso le montagne. + end scene + +# Hints for the game - not cards + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) +# 0 ignore this +#Nothing. +Niente. +# 1. Beach hint (no dungeons finished) +#Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +Oh, non sai che fare? Hai cercato in giro per la spiaggia? Forse lì qualcuno può aiutarti. Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre? +# 2. Forest hint (no dungeons finished) +#Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +Oh, non sai che fare? Hai cercato nella foresta a est? Sembra che quella tua chiave sia parte di un set. Forse te ne servono altre? +# 3. Windmill hint +#Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +Guarda tutte quelle chiavi! Penso di aver visto dei cancelli a sudest. Forse puoi usarle lì? +# 4. Generic hint to go past statues +#Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +Ehi, ho visto che hai azionato la turbina! Sai se ha avuto effetti sulla Landa? +# 5. finished 6 bosses, all 36... +#Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +Ehi, Young. Wow! Stai accumulando un sacco di carte! Hai già capito a che servono? Potresti farci un sacco di soldi! +# 6. hints for go things +#What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +Cos'è quel nuovo accessorio attaccato alla scopa? Ti permette di alterare la... struttura del mondo? Young, sinceramente mi sembra pericoloso. Per fortuna sembra non funzionare da nessuna parte, forse solo nei più strani e reconditi recessi della Landa. +# 7. crowd finished but not redcave +#How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! +Ti piacciono le mie scarpe da salto? Ingegnose eh? Io adoro le mie nuove scarpe da bici. Con queste io e Manu siamo un team ancora migliore! +#8. redcave finished but not crowd +#Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? +Ottimo Young, hai trovato un'altra chiave! A Manu piace il colore! Hai già trovato un posto dove usarla? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +#Mitra: Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +Mitra: Ehi young, stai cercando una carta?\nHai cercato nell'area attorno al tempio di Colui Che Vede? + +#Mitra: Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +Mitra: Ehi young, stai cercando una carta?\nHo sentito che c'è un labirinto vicino all'uscita sul retro del tempio di Colui Che Vede. + +#Mitra: Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +Mitra: Ehi young, stai cercando una carta?\nPotresti trovare qualcosa vicino all'antro di Colui Che Vede. + +#Mitra: Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +Mitra: Ehi young, stai cercando una carta?\nC'era una stanza piena di nemici nel tempio di Colui Che Vede, no? + +#Mitra: Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +Mitra: Ehi young, stai cercando una carta?\nHai cercato bene in tutto il tempio di Colui Che Vede? + +#Mitra: Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +Mitra: Ehi young, stai cercando una carta?\nProva a cercare nell'area vestigiale vicino all'uscita sul retro dell'antro di Colui Che Vede. + +#Mitra: Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +Mitra: Ehi young, stai cercando una carta?\nForse il tuo vicino ne sa qualcosa. + +#Mitra: Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +Mitra: Ehi young, stai cercando una carta?\nSo che il tipo nel tuo appartamento stava nascondendo qualcosa... + +#Mitra: Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +Mitra: Ehi young, stai cercando una carta?\nProva a cercare vicino all'entrata del tuo appartamento! + +#Mitra: Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +Mitra: Ehi young, stai cercando una carta?\nHai cercato *ovunque* nel tuo appartamento? + +#Mitra: Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +Mitra: Ehi young, stai cercando una carta?\nProprio a sud di qui c'è un'isola! Non ci sono stata, ma dovresti cercare lì. + +#Mitra: Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +Mitra: Ehi young, stai cercando una carta?\nSeguendo i fiumi si trova un sacco di roba. Guarda bene! + +#Mitra: Hey Young, looking for a card?\nI know someone left a card near the windmill. +Mitra: Ehi young, stai cercando una carta?\nSo che qualcuno ha lasciato una carta vicino alla pala eolica. + +#Mitra: Hey Young, looking for a card?\nLook around the rivers in the forest... +Mitra: Ehi young, stai cercando una carta?\nCerca vicino ai fiumi nella foresta... + +#Mitra: Hey Young, looking for a card?\nTry poking around the base of the mountains. +Mitra: Ehi young, stai cercando una carta?\nProva a curiosare vicino alla base delle montagne. + +#Mitra: Hey Young, looking for a card?\nTry going to the summit of the mountains. +Mitra: Ehi young, stai cercando una carta?\nProva a raggiungere la cima delle montagne. + +#Mitra: Hey Young, looking for a card?\nThe far end of the beach may hold something. +Mitra: Ehi young, stai cercando una carta?\nForse qualcosa è nascosto all'estremità della spiaggia. + +#Mitra: Hey Young, looking for a card?\nTake a walk in the crimson woods. +Mitra: Ehi young, stai cercando una carta?\nFai una passeggiata nei boschi cremisi. + +#Mitra: Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +Mitra: Ehi young, stai cercando una carta?\nC'erano molte porte chiuse in una di quelle caverne rosse, giusto? + +#Mitra: Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +Mitra: Ehi young, stai cercando una carta?\nVai alla caverna rossa a nord, controlla la fonte del fiume! + +#Mitra: Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +Mitra: Ehi young, stai cercando una carta?\nHai cercato bene in quel labirinto oscuro? + +#Mitra: Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +Mitra: Ehi young, stai cercando una carta?\nRicordo che da qualche parte c'era un poco rassicurante sentiero di lanciafiamme. Alla fine deve esserci qualcosa! + +#Mitra: Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +Mitra: Ehi young, stai cercando una carta?\nQuei tizi del circo devono star nascondendo qualcosa. Hai cercato ovunque? + +#Mitra: Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +Mitra: Ehi young, stai cercando una carta?\nHai cercato attorno al perimetro del fosso di quella coppia? + +#Mitra: Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +Mitra: Ehi young, stai cercando una carta?\nC'è questa coppia che ama stare vicino a un fosso. Devono nascondere qualcosa. + +#Mitra: Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +Mitra: Ehi young, stai cercando una carta?\nA volte ci sono cose nascoste fra le voragini, soprattutto nelle caverne di montagna! + +#Mitra: Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +Mitra: Ehi young, stai cercando una carta?\nHai setacciato le one più alte della caverna di montagna? + +#Mitra: Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +Mitra: Ehi young, stai cercando una carta?\nC'è qualcosa nelle profondità della caverna di montagna? + +#Mitra: Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +Mitra: Ehi young, stai cercando una carta?\nQuel cubo colorato in quel posto strano... Forse ha qualcosa! + +#Mitra: Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +Mitra: Ehi young, stai cercando una carta?\nHai parlato con il cubo grigio in quel posto strambo? Forse sa qualcosa. + +#Mitra: Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +Mitra: Ehi young, stai cercando una carta?\nL'ultimo piano dell'hotel è un po' dimesso, ma deve esserci qualcosa! + +#Mitra: Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +Mitra: Ehi young, stai cercando una carta?\nSei entrato in tutte le stanze del terzo piano dell'hotel? + +#Mitra: Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +Mitra: Ehi young, stai cercando una carta?\nScommetto che qualcuno ha lasciato qualcosa al secondo piano dell'hotel. + +#Mitra: Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +Mitra: Ehi young, stai cercando una carta?\Il proprietario dell'hotel potrebbe averti lasciato qualcosa! + +#Mitra: Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +Mitra: Ehi young, stai cercando una carta?\nQuei ponti distrutti a nordovest... guarda lì! + +# and a bonus one if for some reason you make it this far without finding any... +#...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? +... Cosa? Non hai trovato *nessuna* carta? Young, amico, ma sei fuori? A volte nella vita bisogna essere avventurosi, aprire qualche scatola, sai? + end scene + +#General random stuff + scene general_banter +#Did you find that guy who was looking for something in the mountains? +Hai incontrato quel tipo che stava cercando qualcosa nelle montagne? +#Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +Sai qual è il cognome della mia bici? ... Brio! L'hai capita? Manu Brio! ... Scherzo, le biciclette non hanno cognomi. +#Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +Pensi che debba comprare una catena? Non mi piacerebbe tenere legata Manu ma sai, se ne sentono tante di bici rubate al giorno d'oggi... +#So what is The Briar? Some sort of ancient artifact from a lost culture? +Allora, cos'è Briar? Una specie di artefatto antico di una cultura perduta? +#I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +Mi chiedo perché non ho sentito niente dell'arrivo dell'Oscurità. Immagino che molta gente nella Landa sia impegnata nelle sue battaglie quotidiane. +#Hey Young, I just wanted to tell you... your hair is awesome. +Ehi Young, volevo solo dirti che... hai dei bellissimi capelli. + end scene + + end area +end npc + +### Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +#Statue: The Village Elder in name only, for he is neither. +Statua: Anziano del villaggio solo di nome, di fatto non è né saggio né anziano. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Statue: I’ve seen a broom in a legend... it was on the map of a janitor closet. +Statua: Ho visto una scopa in una leggenda... era sulla mappa nell'armadietto di un inserviente. + end scene + end area + + area BEDROOM + scene after_boss +#Statue: Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. +Statua: Le carte sono vitali per la tua missione. Le carte, soprattutto quelle di credito, sono vitali anche per altre missioni, come l'acquisto di bevande alcoliche. + end scene + end area + area REDCAVE + scene one +#Statue: Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! +Statua: Ottimo lavoro, Sage. Hai dovuto superare ogni limite del tuo carattere e ogni forma di amor proprio per dire una cosa così imbarazzante!!! + end scene + end area + area TERMINAL + scene one +#When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! +Se continui così, quando sarai diventato un individuo più stressato e apatico finirai per sfogarti sul gelato. Trova conforto nella bottiglia, perdente! + end scene + end area +end npc + +### sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced +# This line must be played once before anything else can +#Edward: Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +Edward: Una volta un uomo venne a installare uno specchio nel nostro bagno. Avevo paura che ci avesse nascosto una telecamera. Ho controllato ogni centimetro della cornice di legno, ho versato del Mastro Ligno in ogni fessura sperando di mandarla in cortocircuito. Ovviamente non ho mai trovato nulla. +LOOP +#Edward: This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. +Edward: Questo tempio è dedicato a Colui Che Vede. Non so perché sono venuto qui, e ho troppa paura di entrare. + end scene + + scene bedroom_not_done +#Edward: Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. +Edward: Ci sono problemi? Immagino di sì. Tutto quello che hai è una scopa, e tutto quello che le scope fanno è spostare la polvere. + end scene + + scene bedroom_done +#Edward: You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. +Edward: hai detto di aver sconfitto Colui Che Vede? Ha. Non hai capito che non funziona così? Stai solo versando Mastro Ligno nelle fessure. + end scene + + end area +end npc + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +#Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! +Oh, sei così dolce. Il piccolo, tenero Young che gioca a fare l'eroe. Ma io ho visto ogni passo che hai mosso nella Landa, e lascia che te lo dica Young, non tutti qui sono onesti come lo sono io. Stai attento a coloro di cui ti fidi! + end scene + scene after_fight +#I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". +Sarò con te, Young, ogni volta che sarai solo. E ricorda il mio consiglio sulla tua piccola \"avventura\". + end scene + end area +end npc + +# rock (Rock with words) +npc rock + + area BEDROOM + scene one +#Rock: Peripheral vision is the hive of demons. +Roccia: La visione periferica è il covo dei demoni. + end scene + scene two +#Rock: To-do: Construct method of transportation to Nexus. Progress: Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. +Roccia: Da fare - Costruire un sistema di teletrasporto al Nexus. Progresso - in stato di fermo. Colui Che Vede non intende fornire i fondi per rendere il progetto possibile. Dovremo tornare a usare il metodo originale, l'inspiegabile portale dimensionale. + end scene + scene three +#Rock: I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. +Roccia: Sono intrappolata qui, tutta sola. Il lavoro procede a buon ritmo in questo tunnel, almeno posso vedere ogni giorno piccoli progressi. + end scene + end area + + area BLUE + scene one +#This wheel is used to lift the dam. +Questa ruota serve a sollevare la diga. + end scene + end area + area CIRCUS + + scene one +#June 24th, 1957: Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. +24 giugno, 1957: Si sono rotte le corde del trapezio. Alice Rutgers è precipitata al suolo e si è fratturata gli stinchi. + end scene + scene two +#July 17th, 1957: Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. +17 luglio, 1957: sette clown si sono ritirati per problemi quasi fatali ai polmoni. Si sospettano responsabilità della linea di makeup Landan Look, ma non è in corso nessuna investigazione. + end scene + scene three +#July 21st, 1957: Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. +21 luglio, 1957: A seguito del malfunzionamento di una gabbia, la mia faccia e il mio fianco sono stati gravemente mutilati da un leone non ancora domato. Sono sopravvissuto, ma rabbrividisco guardandomi allo specchio. + end scene + scene four +#August 5th, 1957: In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. +5 agosto, 1957: In sogno, ho visto un volto di pietra con occhi feroci e luccicanti. Parlava della verità sulla nostra esistenza, ed è stato il primo a offrire libertà dal dolore. + end scene + scene five +#August 7th, 1957: How many of us will suffer before we accept the truth of the Seeing One? +7 agosto, 1957: Quanti altri di noi dovranno soffrire prima che tutti accettino la verità di Colui Che Vede? + end scene + + scene six +#August 8th, 1957: I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. +8 agosto, 1957: Ho preso una decisione. Degli altri, qualcuno ha detto che mi seguirà. Questa sarà la mia ultima annotazione. Possa Colui Che Vede vegliare su tutti noi. + end scene + end area + area CLIFF + scene one +#(Indecipherable markings) +(Segni indecifrabili) + end scene + scene two +#December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! +7 dicembre, 2010. (nome illeggibile). Non c'è niente quassù a parte questa stupida roccia! + end scene + scene three +#Danger! This cave is unexplored. +Pericolo! Questa caverna è inesplorata. + end scene + scene four +#These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. +Questo dirupo va verso l'alto a perdita d'occhio, ma nessuno è mai arrivato abbastanza in alto per capire fin dove arriva. + end scene + end area + + + area CROWD + scene one +#Rock: How? +Roccia: Come? + end scene + scene two +#Rock: Warning! Vertical drop, jump at your own risk. +Roccia: Attenzione! Caduta verticale, saltate a vostro rischio e pericolo. + end scene + end area + + area DEBUG + scene one +#This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +Questo serviva come segnaposto per l'animazione dei cancelli delle carte. Avvicinati due volte per vedere le animazioni di apertura e chiusura! +#I forget why we ended up scrapping it. Perhaps too dramatic. +Ho dimenticato perché non l'abbiamo più usata. Forse era un po' troppo. + end scene + + scene two +#Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +Qui ci sono dei test per vari tipi di terreno e collisioni! Non riuscivo a far funzionare i terreni a direzione unica da ogni lato (tipo i muri), quindi ho lasciato perdere... credo. + +#There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. +Abbiamo lasciato perdere per vari motivi. Semplificare il design era importante per riuscire a finire il gioco. + end scene + + scene three +#Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +All'inizio i nemici potevano droppare chiavi. Poi ho scartato l'idea, anche se poteva essere divertente. + +#Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +Abbiamo anche considerato di creare dei cancelli sfida alla fine di alcuni percorsi, che si aprivano solo se li raggiungevi senza subire danni. + +#We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! +Volevamo basare tutti i dungeon su questo sistema e lasciar perdere completamente i punti vita, ma a quanto pare il gioco era troppo difficile! + end scene + + scene four +#PRISON!!! +PRIGIONE!!! +#Save us!!! +Liberaci!!! +#Please! +Per favore! + end scene + + scene five +#Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world (90 PER-CENT) \"Non-canon\". Anyways. +Benvenuto nel MONDO DI DEBUG! Sei uscito dai confini de \"La Landa\", quindi considera questo mondo (al 90 percento) \"non canonico\". Ad ogni modo. +#Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. +Prima che ci fossero set di tile per molte delle aree, usavo tile stupide tipo queste per segnare dove andavano le porte. Infatti, ogni dungeon è stato arrangiato con i set di quest'area, e poi Marina li ha aggiustati con i suoi set di tile. + end scene + + scene six +# Translator's note: since this word comes from French, I'll leave it as it is +# Equivalence (for reference) --> French: fille -- English: girl -- Italian: ragazza +fille + end scene + end area + + area DRAWER + scene five +#-ARCHIVES- +-ARCHIVI- +#PROCEED WITH CAUTION +PROCEDERE CON CAUTELA + end scene + scene four +#West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. +Ovest. Fessura. Realtà! Basso valore immobiliare, uragano, vecchio, fatiscente. Rilassante. + end scene + scene three +#The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. +Colui Che Vede, da quel che ric- crr,,,,, Bei Momenti in Casa. + end scene + scene two +#COLD STORAGE\n\n^ -- THE MGMT +CELLA FRIGORIFERA\n\n^ -- LA DIREZIONE + end scene + scene one +#CONTINUE +CONTINUA + end scene + end area + + area FIELDS + scene one +#West: Beach\n\nEast: Forest\n\nSoutheast:\n Rainy Area\n\nNorth: \nTemple Grounds\n\nNorthwest: Chasm +Ovest: Spiaggia\n\nEst: Foresta\n\nSudest:\n Area Piovosa\n\nNord: \nZona del tempio\n\nNordovest: Dirupo + end scene + end area + + area FOREST + scene one +#West: Land Lake\nSouth, then east: Cliffs +Ovest: Lago\nSud, poi est: Dirupo + end scene + scene two +#Relaxation pond. Stay a while, we know you have the time. +Laghetto della quiete. Resta un po', sappiamo che hai tempo. + end scene + scene three +#I'm afraid I may be stuck on this tiny corner forever. +Temo di dover rimanere in questo angolino per sempre. + end scene + scene four +#East: Cliffs +Est: Dirupo + end scene + end area + + area GO + scene one +# The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. +Il sentiero si aprirà quando le tessere guardiane nere saranno sostituite con le pietre del loro colore spirituale nella griglia sottostante. + end scene + + scene two +#When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. +Quando la statua di pietra blu si è spostata,\nsi è aperto un nuovo sentiero.\nDopo il dirupo, attraverso strane dimensioni,\nc'è un hotel per viandanti.\n\n\n\"Chi è il guardiano?\" Chiedo,\n\"Chi governa questo affollato luogo d'affari?\"\nMolte anime sono qui riunite,\nma io mi sento comunque solo. + end scene + + scene three +#The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. +La statua rossa e rugginosa si è mossa,\ne ha svelato la via per abissi più profondi.\nNe segue un sotterraneo labirintico\ne un grosso tendone da circo.\n\n\n\"Chi sono i guardiani?\" Chiedo, \n\"Chi ha rinunciato alla vita per fuggire in questo posto?\"\nIo, come loro, temo il dolore.\nMa temo di più la morte. + end scene + + scene four +#The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. +La statua metallica verde si è spostata,\naprendo un sentiero più profondo.\nQuartieri residenziali e marciapiedi formano\nil sentiero per un appartamento.\n\n\n\"Chi è il guardiano?\" Chiedo, \n\"Chi cerca conforto nelle stelle?\"\nSolo, sento che qualcosa mi osserva.\nE non è l'amichevole luce stellare. + end scene + + + end area + + area BLANK + #initial entrance from windmill + scene one +#Rock: This is unclaimed territory - not yet a part of The Land. +Roccia: Questa è terra di nessuno - non ancora parte della Landa. + end scene + #concentric circles + scene two +#Rock: These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. +Roccia: Questi - ^ io e i miei cerchi siamo^ - promesse... Io^ - cerchi^ - cercherò di portare tutto a termine...^ - concentrici. Bzrt, bzrt. + end scene + #islands + scene three +#Rock: Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! +Roccia: Stai attento ^ -...ma riesco sempre^ - a dove metti i piedi^ - a riapparire ,no?^ - in questo posto! + end scene + #mazeish place, not near the portal + scene four +#Rock: Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. +Roccia: Guardando in basso ^ - E ho capito:^ - da qui, - ^ Di amarlo.^ - non si vede... niente, a dire il vero. + end scene + #left part of the 48 gate + scene five +#Rock: My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. +Roccia: Mi scuso -^ Sì ma, -^ per questa confusione -^ dobbiamo rimanere in contatto -^ ma quel portale dovrebbe ^- e cercherò di darti le mie opinioni - ^ riportarti nella Landa. + end scene + end area + + + area NEXUS + scene one +#Sometimes if you talk to people multiple times, they have new things to say. +A volte, se parli più volte con le persone, ti diranno cose diverse. +#But not rocks. Rocks don’t do that. +Le rocce no. Le rocce non lo fanno. + end scene + #before 49 card agate + scene two +#Rock: So close! If only... +Roccia: Così vicino! Se solo... + end scene + #door that goes nowhere + scene three +#Rock: Curiosity is a great thing. +Roccia: La curiosità è una gran cosa. + end scene + #below treasure box + scene four +#Rock: Oh!...? +Roccia: Oh!...? + end scene + scene five +#The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads: \"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" +C'è una mail aperta sul computer. Alcune parti dello schermo sono rotte, e il messaggio è solo parzialmente visibile fra le chiazze nere. La mail dice: \"Ciao Young!\" Sembra che [...] cinquantesima carta [...] forse non dovresti... [...] vale la pena pensarci! Pensi di essere pronto? Svegliati...\" + end scene + end area + + + area OVERWORLD + scene one +#Rock: I’ll bet you’re reading a rock because you don’t have any friends. +Roccia: Scommetto che stai leggendo una roccia perché non hai amici. + end scene + scene two +#Rock: Welcome to Overworld Station. We hope you enjoyed your time in The Land. +Roccia: Benvenuto alla Stazione Oltremondo. Speriamo che ti sia goduto la tua permanenza nella Landa. + end scene + scene three +#Rock: An explorer is you! +Roccia: Em… You are normále? Capeesh? +#Rock: Please don't go south. It's under construction. +Roccia: Per favore, non andare a sud. Ci sono lavori in corso. + end scene + scene four +#Rock: Treasure in 5,3! +Roccia: Tesoro in 5, 3! + end scene + scene five +#Rock: Haha, gotcha! +Roccia: Ahah, fregato! + end scene + end area + + area REDCAVE + scene one +#WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. +NASCIAMO NELLA PUTREFAZIONE DEL CORPO DI NOSTRA MADRE. + end scene + scene two +#ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. +UN GIORNO NOSTRA MADRE HA LASCIATO SUA MADRE E SI È AVVENTURATA NELLA NEBBIA VENEFICA. + end scene + scene three +#WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. +NON LO ABBIAMO VOLUTO NOI. NON AVREMMO COMPRATO LE NOSTRE VITE A COSTO DELLA SUA SOFFERENZA. + end scene + end area +# area for redsea + area REDSEA + scene one +#Rock: Signs indicate the trees have not been active for an extended period of time. +Roccia: I segni indicano che gli alberi non sono stati attivi per un lungo periodo di tempo. + end scene + scene two +#Rock: South: ???^ North: ??? +Roccia: Sud: ???^ Nord: ??? + end scene + scene three +#Rock: The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. +Roccia: Si dice che il terreno irregolare sia opera dei progenitori degli abitanti di questa zona. + end scene + scene four +#Rock: They appear to be a peaceful species. +Roccia: Sembrano essere una specie pacifica. + end scene + end area + + + area SPACE + #middle + scene one + #Scribbled in what appears to be permanent marker: Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + Scarabocchiato in quello che sembra essere pennarello indelebile: Salve, compagno viaggiatore dello SPAZIO e del TEMPO. Ti sei avventurato in uno squarcio lontano dall'aera giustapposta di YOUNG. Hai attraversato un OCEANO o due, per così dire. Non preoccuparti per il CONTRASTO, potrai presto tornare alla tua consueta avventura. non TEMERE questo luogo, anche se può sembrare TENEBROSO e PERICOLOSO i suoi abitanti sono molto AMICHEVOLI \n -- La Direzione + + #(Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (Sotto il messaggio, una incisione:) Qui giace ___ (illeggibile). Si è perso nei boschi. + + #(Even further below the message:) (just don't go too far south.) + (Ancora più sotto il messaggio:) (non andare troppo a sud.) + + end scene + # extra color + scene two +#Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbows! +Qui giace ____ (illeggibile. Chi l'ha scritto?) È stato impalato da arcobaleni! +#Would've been better with achievements. +Sarebbe stato meglio con i trofei. + end scene + #grey graves + scene three +#Here lies Burd. The cliffs weren't feeling too friendly. +Qui giace Burd. I precipizi non gli furono troppo amici. + end scene + scene four +#Here lies bag. It never had a chance. +Qui giace borsa. Non ha mai avuto alcuna possibilità. +#Pretentious! +Arrogante! + end scene + # color graves + scene five +#Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. +Qui giace Savitch. Una volta ha provato ad aggiustarmi il computer in garage, e non occupava molto spazio mentre lo faceva. Dopo tre anni, non aveva ancora finito. Poi, è morto. + end scene + scene six +#Here lies Dave. He wasn't very inspirational. +Qui giace Dave. Non era molto d'ispirazione. + end scene + + end area + + area SUBURB + scene one + #---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + --- YOUNG TOWN --- ^\nBenvenuto a Young Town. Per piacere, stai attento ad alcuni dei cittadini. Non sono molto amichevoli. Procedi con cautela. Young Town è stata fondata negli anni '90 dal sindaco Ying come parte di un progetto di edilizia urbana. Il nome è stato scelto in base al rifuto di Ying di chiamarsi Ying, e in base al suo affermare di chiamarsi Young. Ti auguriamo un piacevole soggiorno. + end scene + + scene two + #To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + A ovest ci sono i leggendari templi di Colui Che Vede. A est c'è l'appartamento del nostro fantastico sindaco Ying, che è chiuso al pubblico - i trasgressori sono avvisati. + end scene + + scene three + #On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + Durante la sua quinta visita, Ying mostrò frustrazione per la mancanza di parcheggi. Questo parcheggio riflette la frustrazione di Ying per la mancanza di parcheggi. Ying ha occasionalmente parcheggiato in questo parcheggio nelle sue visite seguenti. + end scene + + scene four + #I remember the long sentences I used to write. Ha! Fragmented. + Ricordo le lunghe frasi che scrivevo. Ha! Frammentato. + end scene + + scene five + #A DANGEROUS SITUATION + UNA SITUAZIONE PERICOLOSA + end scene + end area + + +# Area for TRAIN (it's actually CELL sorry) + area TRAIN + scene one +#The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. +Colui Che Vede sa tutto, e conduce all'illuminazione. Il cammino per l'illuminazione non è illuminato da alcuna torcia. + end scene + scene two +#Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. +Non allontanarti dal cammino di Colui Che Vede, neanche per i tesori che si trovano agli angoli remoti del labirinto. + end scene + scene three +#Move along. +Cammina. + end scene + scene four +#Do not anger the Chasers with violence. +Non far adirare gli inseguitori con la violenza. + end scene + end area + + area WINDMILL + scene one +#SCENIC LANDMARK: Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. +PUNTO PANORAMICO: Torri sorelle. Costruite tempo fa, le torri sorelle svettano sulle montagne in lontananza. La prima torre è stata precedentemente danneggiata, e da allora è stata destinata ad altri usi. La seconda si erge a est, toccando il cielo. Per ragioni di sicurezza, il sentiero per la torre è stato chiuso fino a nuovo avviso. + end scene + scene two +#PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT +AVVISO PER LA PUBBLICA SICUREZZA:^\nSebbene non danneggiata, pare che in cima a questa torre ci sia uno squarcio dimensionale. Procedete con cautela e con una mente aperta.^\n -- La Direzione + end scene + end area +end npc + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +#The statue does not look like it will be moving anytime soon. +Sembra che questa statua non abbia intenzione di spostarsi. + end scene + scene two +#The statue has moved. +La statua si è spostata. + end scene + end area + + area REDCAVE + scene one +#It looks like this statue is firmly in place. +Sembra che questa statua sia saldamente a posto. + end scene + scene two +#The statue has moved. +La statua si è spostata. + end scene + end area + + area CROWD + scene one +#This statue does not seem to be movable. +La statua non sembra essere spostabile. + end scene + scene two +#The statue has moved. +La statua si è spostata. + end scene + end area +end npc + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +#Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. +Il fuoco è affascinante, non è vero? È un vero peccato che il bagliore dei lampioni nasconda il fuoco delle stelle. + end scene + scene after_fight +#Okay, so stars aren't really made of fire. ^Who gives a shit anyway? +Ok, le stelle non sono davvero fatte di fuoco. ^Ma tanto non fotte nulla a nessuno. + end scene + end area +end npc + +npc cube_king + area SPACE + # kings are supposed to offer info on + scene color + #How are you today? I'm the ruler of this partition and interpretation of space. + Come va? Sono il sovrano di questa partizione e interpretazione di spazio. + + #You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. + Vuoi sapere perché sono il sovrano di questo posto? Te lo dirò, ma ci vorrà un po'. Un bel po'. Tipo un sacco di tempo. + + #Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. + Sul serio, ci metterò molto. Davvero eh, ti sto avvisando! Ho la tendenza a divagare. Forse faresti meglio a prendere il contenuto di quel forziere laggiù. O ad andare verso quell'hotel in lontananza. Non so come ci è finito lì, ma ho sentito che fanno dei prezzi abbastanza buoni. Non che il denaro abbia importanza qui. + + LOOP + #Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! + Perché sono il sovrano?^... Non ne sono sicuro, ma i miei amici hanno deciso che fosse appropriato mettermi qui, date le condizioni attuali di questo spazio. Forse è perché i cubi sono i migliori nel restare seduti sulle superfici piatte. Sul perché è necessario che qualcuno sia seduto qui - ah, non ne ho idea! + + #The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. + Gli altri - i miei amici laggiù - hanno ognuno i propri meriti. Non è impossibile che in futuro siano loro a sedersi qui, è che non possono farlo ora. A volte cambiamo chi fa il sovrano, ma ogni volta dobbiamo reinterpretare questa porzione di spazio! Può succedere che il Signor o la Signora Piramide vengano qui perché decidiamo di dare al trono una forma che si confà meglio alla loro forma, reimmaginando questo mondo, per così dire. Ti sembra stupido? Può essere. Però qui funziona così. Succede abbastanza in fretta. Minuti, ore - i regni non sono necessariamente lunghi. + + #Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... + Però, quando sono il sovrano, mi sento strano... come se fossi isolato, come se volessi evitare gli altri... + + #...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. + ... ma isolamento non è la parola giusta, anche se descrive in parte la sensazione. Non sono isolato, e non odio gli altri. Ci consideriamo tutti amici, ma sai, nessuno viene effettivamente qui se non per scambiare qualche parola. Quindi devo mettermi a pensare, o rischio di impazzire! Forse è parte dell'isolamento. + + #Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. + A parte domande folli sul *perché* siamo qui a occupare questo spazio, sarei anche curioso di capire perché siamo amici. + + #I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. + Mi piace pensare che quando siamo sotto l'interpretazione che sia io la migliore scelta come sovrano, loro mi danno conforto permettendomi di mantenere la mia posizione per tutto il tempo che serve a raggiungere l'interpretazione successiva. Sai, i loro incoraggiamenti, la loro presenza fisica, quelle cose mi danno conforto. + + #I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. + Immagino che siano abbastanza per soddisfarmi, anche se sarebbe bello che qualcuno provasse a capire come mi sento a essere sovrano. Non che mi stia lamentando degli incoraggiamenti! Però forse potremmo avere più sovrani... che idea! Il che forse implica che quando non sono sovrano devo agire come ogni tanto vorrei che loro facessero... chissà se si può fare. + + #I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. + Mi sono dilungato troppo. Se vai nella direzione opposta, c'è una regione di spazio simile a questa, anche se penso abbia un odore diverso. + + #It was nice to meet you. + È stato un piacere incontrarti. + + #Oh, you want to hear my story again? + Oh, vuoi ascoltare di nuovo la mia storia? + + #Okay, sit tight. + Bene, mettiti comodo. + + end scene + + scene gray + #Hello there. I'm the ruler of this part of space. + Ciao. Sono il sovrano di questa parte di spazio. + + #What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! + Cosa? Vuoi sapere perché sono qui? Sei sicuro? Ci vorrà un po' per spiegarti perché! + + #Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! + Beh, se insisti. Anche se faresti meglio ad andare verso quell'hotel in lontananza. Non so perché abbiano deciso di costruirlo. Se dovessi pagarci delle tasse, sicuramente protesterei! + + LOOP + #Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. + Allora, anche se sono il sovrano di questa parte di spazio, non sto effetivamente regnando su nessuno. + + #Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. + I miei amici sono tutti sovrani delle loro parti di spazio. Neanche loro regnano su qualcuno - in un certo senso siamo tutti soli. Ma non nel senso che non possiamo parlare fra noi. In quel senso, non siamo soli. Questo è solo un posto in cui io esisto. + + #My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. + La mia parte di spazio e quelle dei miei amici sono molto simili nel modo in cui esistono e per come sono organizzate. Abbiamo interessi e desideri simili. Ci piace parlare molto su come regnare e così via. + + #But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. + Ma è triste che non riusciamo quasi mai a incontrarci di persona. + + #So you're not actually talking to their physical forms, but a representation of them in some holographic form. + In realtà non stai parlando con loro nella loro forma fisica, ma con una loro rappresentazione olografica. + + #I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. + Lo so, è un peccato. È un peccato perché abbiamo così tanto in comune, ma possiamo aiutarci a vicenda così poco. + + #There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. + Quando non puoi parlare sempre faccia a faccia con qualcuno sembra come se manchi qualcosa. + + #But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. + Ma non mi sto lamentando. È meglio del nulla assoluto! Non riesco a immaginare come sarebbe diversamente. Sarebbe terribile. + + #It was nice talking at you, good luck with whatever you're up to. + È stato bello parlare con te, buona fortuna per qualunque cosa tu stia facendo. + + #You're still here? I can tell you everything again, if you'd like. + Sei ancora qui? Posso dirti tutto di nuovo, se vuoi. + + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +#Crickson: Hey ya big bully! I’m not afraid of you! +Crickson: Ehi tu, brutto bullo! Non ho paura di te! +#Crickson: Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +Crickson: Zucca vuota! Non scapperò! Neanche se me le darai di santa ragione! +#Crickson: Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! +Crickson: Sei solo un grosso bruto con una scopa, ecco cosa sei! Dovresti vergognarti di te stesso! + end scene + + scene thorax +#Thorax: I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +Thorax: Io sono il Thorax, e lasciamelo dire\n^Le api stan male, non fan che patire!\n^Alcune operaie son volate via\n^E nelle loro colonie ora c'è una moria! + +#Thorax: Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +Thorax: Forse è un virus, o forse un veleno\n^Che qualcuno ha gettato nel loro terreno!\n^Qualche grossa azienda, per fare più soldi\n^Sporchi assassini, ladri, manigoldi! + +#Thorax: Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! +Thorax: Ok, non ho idea di che stia succedendo\n^Ma le api davvero stanno morendo.\n^Che posso fare, agire a casaccio?\n^... Trovato! Lo posto su Facebook, oh se lo faccio! + end scene + end area +end npc + + +npc shopkeeper + area FIELDS + scene init +#Buy my stuff +Comprami qualcosa + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +#What are you doing here, punk? Get lost! I caught it fair and square! +Che ci fai qui, delinquente? Vai via! È mia di diritto! +#I won’t let it go! Not in a million years! +Non mollo mica! Mai, nemmeno fra un milione di anni! + end scene + + scene inside +#Oh, did you come here to terrorize me some more? +Oh, sei tornato qui per terrorizzarmi ancora? +#You’re just siding with the cats because they are cute and furry. +Sei dalla parte dei gatti solo perché sono tutti carini e pelosi. + end scene + + scene etc +TOP +#What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +Che ci fai qui, delinquente? Vai via! È mio di diritto!^ Coooos?^ È un...?^ ALTRO GATTO???^ AAAAAHHHHHH!!! + +#You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +Tu hai... pulito casa mia... sono commosso! Prendi, voglio donarti la cosa più bella che ho! + +#Young opens and takes the box. Something is inside it! +Young prende e apre la scatola. C'è qualcosa dentro! + +#Icky: Oh. Hey Miao.^\n\nMiao: I’m so glad you’re safe!^\n\nIcky: Uh... thanks for the hand, Young. +Icky: Oh. Ehi Miao.^\n\nMiao: Sono così felice che tu sia salvo!^\n\nIcky: Ehm... grazie per l'aiuto, Young. +LOOP +#Icky: To be honest, I kind of like sitting in boxes. +Icky: A essere sincero, mi piace sedere nelle scatole. + end scene + end area +end npc + +npc miao + area FIELDS + + scene init +#Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +Oh!! Tu sei Young, Il Prescelto!!!! Ommioddio, che onore! Io sono Miao Xiao Tuan Er, aspirante Prescelto! + +#Could I follow you around for a bit to watch a Chosen One in action? +Posso seguirti un po' per vedere un Prescelto in azione? + +LOOP +#Hello again, Young! Can I shadow you today? +Ciao di nuovo, Young! Posso seguirti? + end scene + + scene randoms +# 0. after talk to shopkeep +#Miao: Hey, Young... have you ever stolen anything? +Miao: Ehi, Young... hai mai rubato qualcosa? + +# 1. AFter talk to mitra +#Miao: I like Mitra... and isn’t Wares a handsome bike? +Miao: Mi piace Mitra... e Manu è una bicicletta bellissima, non è vero? + +# 2. Nexus pad +#Miao: What’s that cool stone thing, Young? Does it make you go back in time?! +Miao: Cos'è quella specie di pietra fighissima, Young? Ti fa tornare indietro nel tempo?! + +# 3. Random if Icky not saved +#Miao: I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +Miao: Sto iniziando a preoccuparmi per Icky... Young, hai visto un gatto più grande di recente? L'ultima volta Icky ha detto che sarebbe andato a fare una passeggiata nella piccola foresta a est. + +# 4. leave map +#Miao: Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +Miao: Icky ha detto che non dovrei andare in posti pericolosi. Ci vediamo, Young. + +# 5, 6, 7 - only after you've seen 0, 1, 2 +#Miao: Have you ever sat in a bunch of grocery bags? +Miao: Ti sei mai seduto in un mucchio di buste della spesa? +#Miao: Hey Young, do you think it’s wrong to do catnip? +Miao: Ehi Young, secondo te è sbagliato farsi di erba gatta? +#Miao: I bet it must have taken a lot of work to become The Chosen One, huh, Young? +Miao: Scommetto che ci è voluto un sacco di lavoro per diventare il Prescelto, eh Young? + end scene +# musing after you save icky + scene philosophy +#That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +Quella situazione spaventosa con Icky mi ha dato da pensare... Secondo te che succede dopo che muoriamo? Come è possibile riuscire a portare a compimento il nostro scopo nel corso di una sola vita? + +#Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +È possibile che ci reincarniamo fino a compiere il nostro destino. O renderebbe le cose troppo facili? + +#And then what is our reward for completing our journey? Do we just fade away? +E qual è la nostra ricompensa per aver portato a termine il percorso? O semplicemente svaniamo nel nulla? +LOOP +#Hmm... +Hmm... + end scene +# icky talking after yoh save icky + scene icky +#Oh. Hi, Young. +Oh. Ciao, Young. +#My name’s not really Icky. It’s Ichabod. +Il mio nome in realtà non è Icky. È Ichabod. +#I hope Miao Xiao Tuan Er hasn’t been too much trouble. +Spero che Miao Xiao Tuan Er non ti abbia dato troppo fastidio. +#See you later, Young. +Ci vediamo, Young. + end scene + end area +end npc + +npc generic_npc + + area DEBUG + scene melos +#Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +Ehi ciao, come va? Mi hai trovato! Io rimango qui, fuori fa troppo freddo. +#You can blame me for all of those awful rooms! I made them with the DAME map editor. +Puoi dare la colpa a me per tutte quelle stanze orribili! Le ho create con il DAME map editor. +#I made this game with FlashDevelop IDE and the Flixel AS3 framework! +Ho creato questo gioco con L'IDE FlashDevelop e il framework Flixel AS3! +#Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +Ah sì, e ho creato la musica con REAPER DAW E a volte Audacity. +#I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +In realtà prendo il mio nutrimento dal calore di tutti questi computer... ^Che vuol dire \"non è biologicamente possibile\"? +#Hi mom! ^And dad! +Ciao mamma! ^e papà! +#Want to know how to finish the game in 20 minutes? +Vuoi sapere come finire il gioco in 20 minuti? +#Ha! Like I'd tell you! +Ha! E pensi che te lo dica? + +#(...maybe if you ask me nicely...) +(...forse se me lo chiedi cortesemente...) + end scene + scene marina +#Woah hey! +Ehi woah! +#I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +Ho scritto un sacco di dialoghi per questo gioco!^ (...non questo dialogo però. Di questo se ne è occupato Melos.) +#I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! +Per la parte artistica ho usato Adobe Photoshop CS5 , Graphics Gale Free Edition e lo Snipping Tool di Windows 7! + end scene + end area +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +#The humidity here is good for your skin, but bad for your hair. +L'umidità qui è ottima per la pelle, ma pessima per i capelli. + +#I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +Mi piace stare qui. Al giorno d'oggi, la gente passa l'intera estate correndo avanti e indietro fra il sole cocente e l'aria condizionata glaciale. Quei cambi di temperatura repentini indeboliscono le ossa. + +#It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. +È come quella maledetta mania di masticare i cubetti di ghiaccio. Mia madre masticava i cubetti di ghiaccio quando aveva quasi 30 anni. Ora i suoi molari sono pieni di microfratture. + end scene + + scene second +#Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +Mi raccomando a cambiarti le scarpe e a riempirle con carta di giornale per farle asciugare. Non vorrai creare un nido di batteri. + +#Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. +Perché nei buffet servono solo gelatina ROSSA? È come se volessero farci venire il cancro. + end scene + + scene bomb +#Get away from me. +Allontanati da me. +#I’m serious... leave me alone now. +Dico davvero... lasciami in pace. + end scene + + end area + area BLUE + scene one +#I don’t need your pity, Young. +Non mi serve la tua pietà, Young. + +#Right, just go on living in your happy little world, "Chosen One"... +Certo, continua a vivere nel tuo piccolo mondo felice, \"Prescelto\"... + +#You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +Sai Young, l'amicizia è solo un modo che la gente usa per ingannarsi. La verità è che siamo dei pezzi di merda, e alla fine siamo tutti soli. + +#Hah, I knew you hated me, Young. +Hah, sapevo che mi odiavi, Young. + +#I’m doing fine. +Sto bene. + +#Of course you don’t care, no one does. +Chiaramente non ti importa, a nessuno importa. + end scene + end area + + area HOTEL + scene one +#I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +So che le città sono sporche e caotiche, ma a me piace venire qui e guardare tutte queste luci. + +#It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +È bello, a modo suo. Non è una bellezza infinita come quella delle stelle, ma nella loro umanità queste luci hanno un fascino più profondo, più complesso. + +#Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +Dietro ogni luce c'è una persona, ci sono speranze, paure e segreti... Guardare mi fa sentire terribilmente solo, ma in profonda intimità. + +#I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +Credo di amare ogni persona dietro ogni finestra. Io vi amo, perché siete le mie stelle. Vi amo, e non importa quanto di merda sia la vostra vita, o quanto in basso pensate di essere caduti. Stanotte siete stupendi... + +#I’m sorry, I’m babbling. Thanks for listening. +Scusami, sto blaterando. Grazie per avermi ascoltato. + end scene + end area + + area REDCAVE + scene easter_egg +#Heeyyyy, mannn...take a load off, stay a whilleee, eh? +Eeeehiiii... rilassati e rimani un pooooo', eh? + end scene + end area + + area APARTMENT + scene easter_egg +#Ah! You found me! +Ah! Mi hai trovato! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what they say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + + scene quest_normal +#Golem: Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +Golem: Ti ho colpito con un masso mentre salivi? A volte lancio massi quando sono arrabbiato. Scusami se ti ho colpito. + +#Golem: My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. +Golem: Mia madre diceva sempre che se avessi continuato a farlo, avrei finito la montagna. Prima che la trivellassero. + end scene + + scene second +#Golem: When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +Golem: Se sei una roccia, vedi molte generazioni andare e venire. Diventi antico, e più saggio del più saggio fra gli uomini. + +#Golem: At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +Golem: O almeno, quella è l'idea. Ho rotto in mio binocolo un po' di tempo fa e da allora non riesco a capire che sta succedendo. + +#Golem: Actually, I don’t miss watching people much, it’s a bore. +Golem: In realtà non mi manca molto guardare la gente. È una noia. + + end scene + + scene quest_event +#Golem: Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. +Golem: Oh sì, ho incontrato qualcuno che si era un po' perso... mi ha detto che sarebbe andato a dare un'occhiata alla spiaggia. + end scene + end area + + + area BEACH + scene quest_normal +#I’m not a lobster, I’m a langostino. The name’s Hews. +Non sono un'aragosta, sono un gambero. Mi chiamo Hews. +LOOP +#Hews: You know what the best part of the ocean is? Being able to see the horizon. +Hews: Sai qual è la cosa migliore dell'oceano? Poter guardare l'orizzonte. + +#Hews: The ocean is like a salty taste of infinity. +Hews: L'oceano è come un piccolo assaggio salato di infinito. + +#Hews: A crowded beach is robbed of its grace. +Hews: Una spiaggia affollata perde la sua magia. + end scene + + scene second +#Hews: Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +Hews: Hai mai sentito parlare degli stomatopodi? Hanno 16 fotorecettori che permettono loro di vedere la luce ultravioletta. Riesci a immaginare di poter vedere altri colori? + +#Hews: Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. +Hews: Penso che sarebbe bellissimo. O forse no, abbiamo già abbastanza modi di odiarci l'un l'altro con i colori che abbiamo. + end scene + + scene quest_event +#Hews: You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. +Hews: Stai cercando qualcuno? Ero seduto qui quando alcune nuvole sono passate davanti al sole. Mentre il sole era coperto, qualcuno è venuto vicino a me e mi ha chiesto dove fosse qualcosa. Non ricordo cosa fosse, ma la persona è corsa via dicendo di andare verso la foresta. + end scene + end area + + area FOREST + scene quest_normal +#npc james +#James: Berries are a good kind of food. I like berries. +James: I frutti di bosco sono un buon cibo. Mi piacciono i frutti di bosco. + +#James: Please make sure not to defecate on the berries. +James: Per piacere, stai attento a non defecare sui frutti di bosco. + +#James: So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +James: Finora, in questa stagione ho avuto rapporti sessuali 18 volte. E ho mangiato 389 zampate di frutti di bosco. + +#James: Do you have any berries for James? +James: Hai dei frutti di bosco per James? + end scene + + scene second + +#James: I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +James: Ho scritto una poesia:\n^Quanto amo i frutti bosco\n^Quando son triste mi mettono a posto\n^Le farei a pezzettini e ne mangerei un pozzo\n^Di crostate ai frutti di... bosco! + +#James: Do you like blueberries or raspberries more? +James: Cosa preferisci? Mirtilli o lamponi? + +#James: Do you have any berries for James? +James: Hai dei frutti di bosco per James? + end scene + + scene quest_event +#James: Someone came by. They did not want berries. Went to southeast part of lake to the west. +James: È venuto qualcuno. Non voleva i frutti di bosco. È andato nella zona sudest del lago a ovest. + end scene + + end area +#npc rank +#npc olive + area FIELDS + scene easter_egg +#Olive: Hi, I'm Olive the rabbit. +Olivia: Ciao, sono Olivia la coniglietta. + +#Olive: I have so much cereal left to eat! I love cereal. +Olivia: Mi sono rimasti così tanti cereali da mangiare! Amo i cereali. + +#Olive: The box is so big. It never ends! +Olivia: La scatola è così grande. Non finisce mai! + +#Olive: Neverending cereal! +Olivia: Cereali infiniti! + +#Olive: Hmmm...maybe that's not such a bad thing. +Olivia: Mhhhh... forse non è così male. + end scene + + scene bush +#Rank: Eheheh, silly Young! A broom’s no tool for cutting bushes! +Lonk: Eheheh, che scemo che sei, Young! Una scopa non è fatta per tagliare i cespugli! + end scene + scene quest_normal +#Rank: I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +Lonk: Mi guadagno da vivere tagliando cespugli. A volte trovi oro nei cespugli tagliati! Eheheh! + +#Rank: The economy has been really struggling under this bush... +Lonk: L'economia sta andando davvero male sotto questo cespuglio... + +#Rank: Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! +Lonk: A volte è difficile mantenere moglie e figli tagliando i cespugli... non sempre abbiamo da mangiare... ma il nostro focolare è sempre acceso! Eheheh! + end scene + scene quest_event +#Rank: Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! +Lonk: Come? Sì! È venuto qualcuno. Ha detto che stava andando in un labirinto sotterraneo... scommetto che ci sono molti cespugli lì, eh Young? Eheheh! + end scene + + scene marvin +#Marvin: Oh hey, how are you feeling? +Marvin: Ehi ciao, come va? +#Marvin: Where is Justin? +Marvin: Dov'è Justin? +#Marvin: There's no bottle rockets around... +Marvin: Non c'è nessuno qui attorno... + end scene + + scene chikapu +Chika Chi! +#Chika Chika!! +Chika Chika!! +#CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! +CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! + end scene + + scene hamster +#Bob: Bob the Hamster likes to refer to himself in the third person. +Bob: A Bob il criceto piace parlare di sé in terza persona. + +#Bob: Apostrophes are the root of all e'vil. +Bob: Gli apostrofi sono la radice di tutti i ma'li. + +#Bob: quiet! I am busy exuding an aura of hamstery ambiance. +Bob: Silenzio! Sono impegnato a emanare un'aura cricetosa. + +#Bob: ... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +Bob: ... Immagino che il modo migliore per imparare qualcosa è farla... Però... se facciamo qualcosa male, non stiamo solo migliorando nel farla male? + +#Bob: A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +Bob: Un vero uomo non piange mai... beh, al massimo lascia scorrere una singola lacrima dall'angolo del suo occhio lungo la sua faccia inaridita dal sole, mentre guida la sua Harley nel deserto senza usare casco né occhialoni. Ma non piange mai. + +#Bob: This game was created by an infinite number of monkeys working on an infinite number of typewriters. +Bob: Questo gioco è stato creato da un infinito numero di scimmie che hanno lavorato su un infinito numero di macchine da scrivere. + +#Bob: I miss James... + +Bob: Mi manca James... + end scene + + scene electric +#Kuribu: Curry is yellow and spicy! +Kuribu: Il curry è giallo e piccante! + +#Kuribu: For the clever opponent, injure increase! +Kuribu: Per l'avversario intelligente, danni aumentati! + +#Kuribu: You got the experience of 2! +Kuribu: Hai guadagnato un'esperienza di 2! + +#Kuribu: I tell you my phone number! 0*1-51*7-*4386 +Kuribu: Ti dico il mio numero di telefono! 0*1-51*7-*4386 + end scene + + end area + + + area TRAIN + scene quest_normal +#What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +Che STO FACENDO qui? Bella domanda! Sono capitato qui per caso. Mi sto nascondendo. Questo posto è sicuro, se non ti avventuri troppo lontano e lasci che quei tizi ti prendano. + +#It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +Sembra che io sia relativamente fortunato. Tutti questi morti appesi alle pareti - come sono morti? È un po' affascinante pensare a come sia successo. Sono stati attaccati dai mostri? Sono inciampati e caduti sugli spuntoni? + +#It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. +È un po' macabro. Spero che non mi succeda. Il dolore fisico è una terribile prospettiva. + + end scene + scene quest_event +#Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. +Ah... ora che ci penso, una persona è passata di qui un po' di tempo fa. Ha detto che stava cercando qualcosa... e ti somigliava anche! Non ricordo quando, scusami. Qui si perde la cognizione del tempo. Però ha detto di essere diretto verso una città vicina. + end scene + end area + + area SUBURB + scene quest_normal +#Hello. +Ciao. + +#Are you looking for something? +Stai cercando qualcosa? + +#What are you looking at? +Che stai guardando? + +#No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. +No, non sono di qui. La cosa strana è che tu puoi vedermi e parlarmi, ma io non posso interagire con nessuno di loro. Ci sono tutti quegli assassini in giro, e nessuno sembra accorgersene. È strano. + + end scene + scene quest_event +#Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. +Sì. Ho visto una persona passare. Stava cercando qualcosa. Non so cosa fosse questo \"qualcosa\". Il tipo è andato via di fretta. Ha detto di dover andare in un'area di spazio alternativa. Sembra interessante. + end scene + end area + + area SPACE + scene quest_normal +#WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +EHI EHI EHIIIII - - - CHI SEI TU? ? ? + +#I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +IO SONO UN VIANDANTE. . . QUESTO È UNO DEI PUNTI DI SOSTA PIÙ POPOLARI LUNGO IL TRAGITTO DA A VERSO B. + +#WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! +COSA È \"A\"? ? ? È LA MIA CITTÀ NATALE. . . VADO A VISITARE UN VECCHIO AMICO A B. . . È UN LUNGO VIAGGIO. . . MA FACCIO SACRIFICI. . . TU NO? ? ? RENDONO LA VITA PIÙ INTERESSANTE! ! ! + end scene + scene quest_event +#OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? +OHH - - - CERCHI UN ALTRO UMANO - - - CAPISCO. ^ LASCIA CHE ACCEDA ALLA MIA MEMORIA. . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA. . . \n QUEL TIPO HA AVUTO UN LAMPO DI GENIO E HA DETTO CHE SAREBBE ANDATO VERSO UNA CASETTA IN UN GIARDINO BEN CURATO. \n ORA CHE CI PENSO. . . TU GLI SOMIGLI MOLTO! ! ! SEI SICURO CHE LUI NON FOSSE TE? ? EH? MMH? + end scene + end area + + area GO + scene quest_normal +#You actually were...uh, ah. Well done. +In realtà stavi... ehm, ah. Ben fatto. +LOOP +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +La roccia riflette parzialmente la luce accecante della stanza. C'è inciso qualcosa: \"Presto, prima di dovermene andare di nuovo (si sta illuminando sempre di più, succede ogni volta) - la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\" + end scene + scene quest_event +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +La roccia lucente riflette solo parzialmente la luce della stanza. C'è inciso qualcosa: \"Presto, prima di dovermene andare di nuovo (si sta illuminando sempre di più, succede ogni volta) - la parte a nordovest della foresta blu - Ho visto un'altra entrata del tempio appena a nord, dopo quegli alberi - se solo potessi scambiare le cose a piacimento potrei raggiungerla... forse lo farò la prossima volta che tornerò in questo mondo.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +#HELLO. HAVE YOU MET cube YET? +CIAO. HAI GIÀ INCONTRATO cubo? + +#cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. +cubo È UN OTTIMO SOVRANO DI QUESTA PORZIONE DI SPAZIO. ANCHE NOI ALTRI SOVRANI FACCIAMO DEL NOSTRO MEGLIO NEI NOSTRI SPAZI. + end scene + + scene gray2 +#WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +CHE NE PENSI DI QUESTA PARTE DI SPAZIO? È UN BUON PUNTO DI INCONTRO, NO? + +#AN INTERSECTION OF WORLDS! +UNA INTERSEZIONE DI MONDI! + end scene + scene gray3 +#NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +NESSUNA DI NOI PIRAMIDI GRIGIE È DAVVERO QUI. USIAMO DEI CONGEGNI SPECIALI CHE CI PERMETTONO DI PROIETTARCI QUI. + +#WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. +PERCHÉ LO FACCIAMO? PERCHÉ VOGLIAMO PARLARE CON IL NOSTRO AMICO cubo E TENERE COMPAGNIA A cubo. + end scene + + + scene graydead +*bzrrrrt* + end scene + + scene grayspin +#...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +... IL DISPOSITIVO OLOGRAFICO STA FUNZIONANDO CORRETTAMENTE? +#NO?^...^DAMN! +NO?^...^MALEDIZIONE! + end scene + + + scene color1 +#Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! +Hai conosciuto CUBO? Fa delle cose fantastiche! Ho sentito che una volta è rimasto appoggiato su uno spigolo per circa dodici secondi. Oh cielo! Sai che significa per la Lega degli Appoggiatori sugli Spigoli? No? Beh, molto! + end scene + + scene color2 +#CUBE does a lot of interesting work! +CUBO fa un sacco di lavoro interessante! + +#Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. +Hai sentito? Pare che fra poco toccherà a me fare il sovrano! Fra qualche minuto, credo. + end scene + + scene color3 +#I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +Vengo da Pan di Zucchero, vado verso Taipei. Perché sono qui? Oh, sono passato a salutare CUBO! + +#Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. +Non essere così abbattuto! Questo posto è solo una strana rappresentazione per non shockare tutti i visitatori. Per quanto ne sappiamo, è per la maggior parte innocuo. + end scene + + scene colordead +#(...is it taking a nap?) +(... sta facendo un pisolino?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +#EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. +OGNI GENERAZIONE NASCE NEL DOLORE PER MORIRE NEL DOLORE. NON SOFFRIREMO PER CONTINUARE IL CICLO. NON ANDREMO ALL'ESTERNO. + end scene + scene after_fight +#IS THIS YOUR PUNISHMENT FOR OUR REBELLION? +È QUESTO IL TUO CASTIGO PER LA NOSTRA RIBELLIONE? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +#Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? +Perché privi Colui Che Vede dei suoi sacrifici? Perché ci hai rubato la nostra salvezza? + end scene + scene after_fight +#...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. +... Abbiamo fallito nel fartela pagare per la tua interferenza. Eppure... ci hai ridato la possibilità di essere liberi. Grazie, Young. Possa Colui Che Vede concederti nuovamente il suo favore. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +#So good to see you, Yang. Been too long. Still playing those nintendos, I see? +Che bello vederti, Yang. Ne è passato di tempo. Stai ancora giocando a quei nintendo, eh? + end scene + scene after_fight +#Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. +Per amor del cielo, Yon, quando ti deciderai a crescere? Sai, dovrai imparare ad avere a che fare con la gente prima o poi. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +#We have all the finest amenities here. How do you like the Pool? +Qui disponiamo di tutti i comfort. Ti piace la nostra piscina? + end scene + scene middle_fight +#How about our state-of-the-art fitness center? +Che ne pensi del nostro centro fitness di ultima generazione? + end scene + scene after_fight +#We hope you enjoyed your stay! +Speriamo che ti sia goduto il soggiorno! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +#Today is a nice day. +Oggi è una bella giornata. + +#Thanks for scratching that itch on my neck - I can't seem to reach it. +Grazie per avermi grattato la parte che mi prudeva sul collo - non riuscivo a raggiungerla. + +#I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +Ho sentito che il ristorante qui in zona fa delle ottime uova. Ho anche un coupon per prenderle. + +#Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +Hai visto l'incidente d'auto di oggi? È stato orribile! Lui era al cellulare. Che peccato, così giovane! + +#My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +Mio figlio non è riuscito a entrare nella squadra giovanile dell'università. Che delusione. Abbiamo investito così tanto nella sua carriera sportiva. + +#Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +Oggi è il giorno del ringraziamento. Sono grato per molte cose. Non vedo l'ora che arrivi domani mattina per i saldi. Farò un sacco di affari. + +#Ah, I think I might be late for work. +Ah, penso che potrei far tardi a lavoro. + +#I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +Vado un po' di fretta, devo tornare a casa per mettere in ordine prima che arrivino i miei suoceri. + +#We're having a garage sale! +Stiamo facendo un mercatino dell'usato in garage! + +#Welcome! +Benvenuto! + end scene + + scene words_teen +#I didn't see the latest movie. +Non ho visto l'ultimo film. + end scene + + scene words_kid +#I never gotta see the new cartoon! +Non devo mai vedere l'ultimo cartone! + end scene + + scene family +# inside of a house, parent (insightful kid) - 73 +#Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +Benvenuto nella nostra casa, straniero! Mi sembri familiare. Questa è una cittadina pacifica. Abbastanza tranquilla, senza molti visitatori. + +#inside of house, younger kid +#Do you like Davement? My brother Dave showed me this really cool song by them! +Ti piacciono i Davement? Mio fratello Dave mi ha fatto sentire una loro canzone molto bella! + end scene + + scene older_kid +# inside of a house, olderkid +#My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +I miei amici amano ascoltare \"Nessuna sopresa\" delle \"Teste di radio\" e lamentarsi di questo posto. Non sarà fantastico, ma che diamine, almeno mostra un po' di gratitudine! O fa' qualcosa per cambiarlo! Sono tutti dei... Oh, scusa. A volte tendo a fare così... + +#I guess I'll just go write in my blog. +Andrò a scrivere sul mio blog. + +#You sure look like you're in a daze. +Certo che sembri intontito. + +#I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. +Ho difficoltà a sentire i miei stessi pensieri con gli sport a tutto volume alla TV, ma ai miei genitori piace. + end scene + +#inside of hanged man house 74 + scene hanged +#A note on the corpse: \"Placing myself in danger no more.\" +Un biglietto sul cadavere: \"Così non sarò più in pericolo.\" + end scene + + scene festive +#Inside of another house, (festival people) - 75 +#Oh, is there something going on outside? A festival? A parade? +Oh, che succede fuori? Un festival? Una parata? + +#There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. +Sembra che ci sia una bella confusione lì fuori! Hai guardato fuori dalla finestra di recente? Mi chiedo cosa possa essere. + end scene +#78 + scene paranoid +#My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +In casa mia ci sono molte finestre. Non mi piacciono le finestre. È come se qualcuno stesse sempre guardando dentro. E tu sai che CI DEVE essere qualcosa là fuori. Non può essere sempre così silenzioso, così silenzioso e tranquillo - mi inquieta. + +#Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +Assassini? Cosa? Fuori? Di che stai parlando? Mi stai prendendo in giro? Non ci sono mai stati assassinii in questa città prima d'ora, ma... stai iniziando a farmi preoccupare... penso che forse dovresti andartene. + +#Please get out. +Per piacere, vai via. + end scene +# 76 + scene dead +#The body of this woman has been beaten to death by a blunt weapon. +Questa donna è stata colpita a morte con un corpo contundente. + +# --> Italian translator's note: I had to change the literal sentence to include the blunt weapon-bluntly reference. +#The man, to put it bluntly, well... +È stato davvero un duro colpo... + end scene + + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +#Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +Oh, sei tu! Mi sembri familiare... non posso muovermi finché non uccidi abbastanza cittadini, ricordi? Torna fra un po'. + +#According to this pamphlet...you only need to kill a few more people! Keep it up. +Secondo questo volantino... devi uccidere ancora qualche persona! Continua così. + +#We only need one more body, and then we can keep going. +Ci serve solo un altro corpo, poi potremo continuare. + +#Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? +Ben fatto. Sentiti libero di entrare. Non ho idea di cosa ci sia lì dentro. Ci vediamo domani a quest'ora, giusto? O la notte successiva? + + end scene + end area +end npc +# dialogue for the cards +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +#I don't mind being watched by the trees. +Non mi importa se gli alberi mi guardano. + +#1 Bat(?) - extra overworld area +#Where is she?! +Dov'è lei?! + +#2 sunguy +#I will be with you Young, whenever you are alone. +Sarò con te, Young, ogni volta che sarai solo. + +#3 Shieldy +#Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +Sei un Ookchot? Mia madre mi ha sempre messo in guardia contro il Pericoloso Ookchot. + +#4 slime +# --> Italian translator's note: This was VERY tough, but I'm pretty happy with the result! +#Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +È da un gel po' che non ci vediamo, Young! Blobabilmente non dovrei pensarci ma... Mi trovi flaccido? Mi hanno dato del Buddhino! + +#5 post-statue area in BEDROOM +#Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Meno, Per, Diviso, Fratto... + +#6 SUBURB inside of house past blocker +#Limited time offer! Buy one, get one free - only today! +Offerta limitata! Compra uno, prendi uno gratis - solo per oggi! + +# 7 APT Boss +#Remember the time that you lit a candle when the power was out? +Ricordi quella volta che hai acceso una candela perché era andata via la luce? + +# 8 APT Silverfish +#Mmmm, your pillow was cozy last night. +Mmmm, si stava comodi sul tuo cuscino ieri notte. + +# 9 APT gasguy +#This'll teach 'em for calling me the fumi-GAY-tion guy. +Questo gli insegnerà a non chiamarmi fumi-GAY-tore. + +# 10 FIELDS 1 (island) - mitra +#Wares and I make a good team. +Manu e io facciamo una bella squadra. + +# 11 FIELDS 2 (alcove) - Miao +#I'm the Chosen One-in-training!!! +Sono l'Aspirante Prescelto!!! + +#12 Base of WINDMILL windmill +#Do you ever feel like, no matter what you do, you can't stop the world from dying? +A volte non ti sembra che, qualunque cosa tu faccia, non puoi impedire la fine del mondo? + +#13 Hidden up a river in FOREST +#Beware the forest mushrooms... +Attento ai funghi della foresta... + +#14 Bottom of ladder-mini-maze on CLIFF +#I am sorry. It is my nature. +Mi dispiace. È la mia natura. + +#15 Top of Cliff +#What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +In che senso, SOLO una roccia?? Anche le rocce possono stare sulle carte, sai?! + +#16 Western end of BEACH past spikes +#Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +Dai un pesce a un uomo, e lui mangerà per un giorno. Insegna a pescare a un uomo, e gli darai dei momenti in cui legare con suo figlio Jimmy. + +#17 At end of path through the woods in REDSEA +#Sometimes the answer is taking a walk. +A volte la risposta è fare una passeggiata. + +#18 MOVER Redcave - Past 2 locks in central redcave +#Why do bats suddenly fly down, every time you're around? +Perché i pipistrelli volano basso ogni volta che ti avvicini? + +#19 SLASHER Redcave - West end of Northern redcveave +#NO, *YOU* NEED BRACES! +NO, *TU* HAI BISOGNO DELL'APPARECCHIO! + +#20 REDBOSS Redcave - post boss +#ARE YOU HAPPY NOW? +SEI FELICE ORA? + +#21 NW corner of CELL - chaser +#Don't get violent around me. +Non usare la violenza vicino a me. + +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +#I've always wanted to be on Iron Chef. +Ho sempre voluto partecipare a Master Chef. + +#23 CONTORT circus - contort + firepillar room in SW chunk +#My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +La mamma diceva sempre, 'se inarchi così la schiena finirai per rimanere così!' + +#24 LION circus - end of northern gauntlet bordering boss room +#Are you amused yet, human? +Ti stai divertendo, umano? + +#25 A+J BOSS circus - basement (post boss) +... + +#26 FROG crowd - North of entrance +#Scientifically speaking, toads are a subset of frogs. +Scientificamente parlando, i rospi sono un sottoinsieme delle rane. + +#27 CROWD GUY crowd - 2nd floor +#HAHAHAHA! Yeah! I know! +AHAHAHAH! Sì! LO SO! + +#28 WALL BOSS crowd - post boss +#Oh, you collect cards, too? Real classy, Ying. +Oh, anche tu collezioni carte? È molto di classe, Ying. + +#29 end of grey end of space, for grey cube king +#They always said, \"Get off the computer! Or you'll never make friends!\" +Mi dicevano sempre, \"Smettila di stare al computer! O non avrai nessun amico!\" + +#30 end of colorful end of SPACE, for color cube king +#I'm only the ruler for the extent of a conversation. +Sono il sovrano solo per la durata di una conversazione. + +#31 DUSTER hotel - end of 4th floor moving platform area +#I'll bet you think you're 'making my job interesting'! +Scommetto che pensi di 'star rendendo il mio lavoro interessante'! + +#32 DASH TRAP hotel - Dash trap room on 3rd floor +#I hate diagonals. +Odio le diagonali. + +#33 BURST PLANT hotel - SE corner floor 2 +#Don't even try that claritin clear shit with me. +Non pensare che uno stupido antistaminico funzioni con me. + +#34 EYE BOSS hotel - post-boss +#Swipe this card to unlock the door to your room! +Usa questa carta per sbloccare la porta della tua stanza! + +#35 end of left-most TERMINAL bridge - sage +#I'm doing a great job. +Sto facendo un ottimo lavoro. + +#36 Young (drawer APT) +#.......?? +........?? + +#37 old BDRM (dialogue rock) +#Who carved all of us anyways? +Chi diavolo ci ha scolpiti? + +#38 hotel room +#I hope you enjoyed your stay. +Spero che tu abbia trascorso un piacevole soggiorno. + +#39 end of debug minidungeon (old player sprite) +#Seening as you've gotten to this point, you must be quite Intrasting. +Visto che sei arvrivato fin qui, devi essere un tipo interassante. + +#40 end of cell - Torch? +#I'm just here to lead you astray. +Sono qui solo per portarti fuori strada. + +#41 end of SPACE - faces/entities +#You like like a pyramid to us, too! +Tu ci sembri una piramide! + +#42 end uf suburb (killer) +#It's the same damn play, night after night, and the pay sucks. +È sempre lo stesso maledetto spettacolo, notte dopo notte, e la paga fa schifo. + +#43 GOldma's room - goldman +#Leave me alone! My last name isn't Sachs! +Lasciami in pace! Il mio cognome non è Sachs! + +#44 blank, ISlands - Broom +#At least I'm not a stick. +Almeno non sono solo una mazza. + +#45 fields, bottom right - (Rank) +#What do you mean money doesn't grow on trees? Eheheheh! +Il denaro non cresce sugli alberi? Che vuoi dire? Eheheheh! + +#46 street, bottom (Follower bro) +#I'm nothing but an illusion. +Non sono altro che un'illusione. + +#47 redsea, bottom eft (Bomb npc) +#I'LL TAKE IT OUT ON YOU. +MI SFOGHERO' CON TE. + end scene + end area +end npc + + +npc misc + area any + + scene controls +#Press +Premi +# [SOMEKEY-LEFT] +#to set controls. +Per selez. comandi. +# [SOMEKEY-ENTER] +#to cancel. +Per cancellare. +#Up +Su +#Down +Giù +#5 +#Left +Sinistra +#Right +Destra +#Jump +Salta +#Attack +Attacca +#Menu +Menù +#10 +#Press +Premi +# [SOMEKEY-ENTER] +#to exit +per uscire +# [SOMEKEY-LEFT] +#to set controls. +per impostare i comandi. + end scene + + scene title +#Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress +Premi le\nfrecce direzionali per ridimensionare\nla finestra finché\nnon riesci a vedere\nzone nere sui\nbordi.\n\nPremi +# [SOMEKEY-C] +#when done. +Quando hai terminato. +ANODYNE +Melos Han-Tani\nMarina Kittaka +#any key +Qualunque tasto +#5 +#Press +Premi +# [SOMEKEY-C] +#to start +Per iniziare +#Version +Versione +#Continue +Continua +#New Game +Nuovo gioco +#10 +#Are you sure?\nNo\nYes +Sei sicuro?\nNo\nSì +#Really?\nNah\nYeah +Davvero?\nNah\nDai, sì +#No going back!\nForget it\nI know +Davvero davvero??\nScherzavo\nCerto +#deaths +morti +#cards +carte +#15 +#Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +Anodyne supporta\nla maggior parte dei controller.\n\nNe userai uno?\n\nSì No\n\nSe sì, connettilo adesso.\n\nMuoviti con le frecce direzionali\n\nSeleziona usando\nC, SPAZIO, o ENTER\n\nSi applicherà sì di default in\n + +#NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device. +Press BACK again\nto exit.\nUnsaved progress\nwill be lost. +NOTA\n\nSe ci sono lag di movimento\ndurante la partita,\nritorna alla schermata inziale e\nrientra in Anodyne.\n\nPREMI C PER CONTINUARE\n\nL'interfaccia grafica non appare come dovrebbe?\nPremi il tasto qui sotto\n\ne orienta di nuovo il dispositivo. + end scene + + scene gui +# Note - this below one is a sprite that fits into the gui +#menu=enter +menù=enter + +# Shows up when you save at a checkpoint +#Saving... +Salvataggio... + end scene + + scene map +#Map +Mappa +#Current Room +Stanza attuale +#Door/Exit +Porta/Uscita +#No Map +Ness. mappa +#Return to\nNexus +Ritorna al\nNexus +#Return to\nentrance +Ritorna\nall' entrata + end scene + + scene items +#Items +Oggetti +#Normal +Normale +#Swap +Scambia +#Extend +Estendi +#Widen +Amplia +#5 +#A pair of spring-loaded shoes - press +Un paio di scarpe a molla - premi +# [SOMEKEY-X] +#to jump! +per saltare! +#A pair of shoes for biking. +Un paio di scarpe da ciclismo. +#An empty cardboard box. +Una scatola di cartone vuota. +#A key found in the Temple of the Seeing One. +Una chiave trovata nel tempio di Colui Che Vede. +#10 +#A key found in a red, underground cave. +Una chiave trovata in una caverna sotterranea rossa. +#A key found in a mountain cave. +Una chiave trovata in una caverna di montagna. + end scene + + scene cards +#Cards +Carte +#cards +carte + end scene + + scene save +#Save +Salva +#Saved! +Salvato! +#ERROR +ERRORE +#Save and go\nto title +Salva e torna\nalla schermata iniziale +#Go to title +Vai alla schermata iniziale +#5 +#Save and quit +Salva ed esci +#Quit game +Esci dal gioco +#Deaths: +Morti: + end scene + + scene config +#Config +Config +#Set keybinds +Imposta comandi +#Set volume +Imposta volume +#Autosave at\ncheckpoints: +Autosalvataggio nei\ncheckpoint: +#On +Attivato +# 5 +#Off +Disattivato +#Change\nResolution: +Cambia\nRisoluzione: +#Config UI +Config. interfaccia +#Touch+D-Pad +Touch + Frecce +#D-Pad Only +Solo frecce +# 10 +#Touch Only +Solo touch +#Move Input: +Impostazioni movimento: +#Resolution: +Risoluzione: +#Windowed +Mod. finestra +#Int. Scaled +Regola int. +# 15 +#Stretch +Estendi +#Scaling: +risoluz.: +#Language: +Lingua: +ja +en +# 20 +#Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +Trascina i\npulsanti\nfino a raggiungere\n una posizione ideale.\n\nPoi, tocca il\nmenù\nper continuare.\n\n +#Resize Window +Dimensione\nfinestra +#Config. Joypad +Config. joypad + end scene + + scene secrets +#You\'re rolling in it! +Ci sei dentro fino al collo! +#Once the property of a famous Bubble Mage. +Un tempo di proprietà di un famoso Mago delle Bolle. +#If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +Se la grafica sembra criptata, cerca la definizione del pokedex di un pokemon ufficiale. +#This heart has no name. +Questo cuore non ha nome. +#Please visit the electric monsters\' world. +Prego, fai visita al mondo dei mostri elettrici. +#5 +#A kitty statue. Cute, but useless. +La statua di un gattino. Carina, ma inutile. +#Oh my!!!! +Oh cielo!!!! +#Oh no!!!! +Oh no!!!! +#It\'s black. +È nero. +#It\'s red. +È rosso. +#10 +#It\'s green. +È verde. +#It\'s blue. +È blu. +#It\'s white. +È bianco. +#SOMEKEY-C +#:Select +:Seleziona +#SOMEKEY-X +#:Back +:Indietro + end scene + + scene swap +#Sorry! +Scusa! +#The swap won't work here. +Lo swap non funzionerà qui. +#Young could not muster the strength to use the swap here. +Young non è riuscito a raccogliere forze a sufficienza per usare lo swap qui. + + end scene + + scene keyblock +#This door is locked. +Questa porta è chiusa. + end scene + + scene treasure +#Some strange force stops this treasure box from being opened. +Una forza misteriosa ti impedisce di aprire questo forziere. +#An engraving on the broom handle reads: Press +L'incisione sul manico della scopa recita: Premi +#SOMEKEY-C +#to sweep. +per spazzare. +#This key may be used a single time to open up a locked barrier. +Questa chiave può essere usata una sola volta per aprire un ostacolo che blocca il tuo percorso. +#A mysterious pair of boots has nothing but the branding on it, which says \"Press +Un misterioso paio di scarpe di marca con su scritto\"Premi +#SOMEKEY-X +#5 +\". +#A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria AMPLIA dal menù per permettere alla scopa di rilasciare polvere nociva a destra e sinistra.\" + +#A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +Le poche parole sulla miglioria della scopa recitano\"Equipaggia la miglioria ESTENDI dal menù per permettere alla scopa di rilasciare polvere nociva in avanti, oltre il suo normale raggio.\" + +#A note next to the broom extension: \"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +Una nota accanto alla miglioria della scopa:\"Ciao, Young. Usa questa miglioria SWAP per scambiare di posto due pezzi di terreno. Potrebbe volerci un po' affinché tu possa usarla ovunque, ma dovrebbe esserti utile per ora.\" + +#YOU FOUND A HEART!!! Maximum Health increased by...zero. +HAI TROVATO UN CUORE!!!! Vita massima aumentata di... zero. +#10 +#Goldman: What? It's not there? That shopkeeper must have stolen it! +Goldman: Cosa? Non è qui? Quel negoziante deve averlo rubato! + end scene + + scene dust +#Your broom is now full of dust! Attack again to place it. +La tua scopa ora è piena di polvere! Attacca di nuovo per farla posare. + end scene + + scene checkpoint +#Save game?\n Yes\n No +Vuoi salvare?\n Sì\n No +#While standing on a checkpoint, press +Mentre sei su un checkpoint, premi +#SOMEKEY-C +#to save your progress and set it as your respawn point if you die. +Per salvare i tuoi progressi e ripartire da qui se dovessi morire. + end scene + + scene rock +#There is writing scrawled on this rock: +C'è qualcosa scarabocchiato su questa roccia: +#YA AINT GOT NO FRIENDS + end scene + + scene door +#The portal does not appear to be active. +Il portale non sembra essere attivo. + end scene + + scene keyblockgate +#The gate stares, petrified. It won't open until it senses four cards... +Il cancello non si muove. Non si aprirà finché non percepirà la presenza di quattro carte... +#Sensing four cards, the gate decides to open. +Avendo percepito la presenza di quattro carte, il cancello decide di aprirsi. +#The gate stubbornly remains in place. +Il cancello rimane ostinatamente chiuso. +#The gate senses all of the cards, and decides to open. +Il cancello percepisce tutte le carte e decide di aprirsi. +#The gate senses enough cards, and decides to open. +Il cancello percepisce abbastanza carte e decide di aprirsi. +#5 +#It opens! +Si apre! +#It remains closed. +Rimane chiuso. + end scene + + scene solidsprite +#The sign points to the east but the words on it are faded. +Il cartello indica a est ma le parole sono sbiadite. +#The sign points to the west but the words on it are faded. +Il cartello indica a ovest ma le parole sono sbiadite. +#The words on the sign are faded. +Le parole sul cartello sono sbiadite. + end scene + + scene mitra +#Hey, Young! +Ehi Young! + +#Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +Queste scarpe da ciclismo sono per me? Wow! Grazie, Young! Stavo proprio pensando di prenderne un paio, visto che Manu ha dei pedali ai quali puoi attaccare questo tipo di scarpe. Tieni Young, prendi le mie scarpe in cambio! Hanno queste molle fighissime che ti fanno saltare molto in alto! Premi + +#[SOMEKEY-X] +#to jump with them on! +per saltare mentre le indossi! + +#Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! +Ciao, Young! Noti niente di nuovo? ^... ^... Oh beh, vedi, ho comprato questo nuovo paio di scarpe da ciclismo! Si attaccano ai pedali di Manu. Visto che non mi serviranno più le mie vecchie scarpe, voglio che le abbia tu, Young! Hanno queste molle fighissime che ti fanno saltare molto in alto! + +#[SOMEKEY-X] +#to jump with them on! +per saltare mentre le indossi! + +#5 +#Alright, take care! +Beh, ciao! +#Go on, try them out! ...They're not THAT smelly. +Forza, provale! ... Non puzzano COSì tanto. +#Cool, huh? +Belle, eh? +#Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +Ehi, quelle sono le scarpe da ciclismo del negozio di Flinty? Le stai dando a me? Grazie Young, lo apprezzo moltissimo! Tieni, in cambio prova queste scarpe -- Sono sicura che le troverai molto utili! Sulle scarpe c'è scritto \"Premi +#somekey-x +#to jump\". I've never understood that, though, because there's no \" +per saltare\" Non è molto chiaro però, non c'è nessun \" +#somekey-x +#10 +#\" anywhere on the shoes... +\" sulle scarpe... + end scene + + scene tradenpc +#Finty: Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +Finty: Benvenuto, benvenuto Young, amico mio! Io sono Prasandhoff--Finty Prasandhoff! Dai un'occhiata e fammi sapere se ti interessa qualcosa! + +#Finty: I still appreciate that box! +Finty: Ti sono ancora grato per quella scatola! + +#Finty: Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! +Finty: Ah, una scatola! Grazie mille! Ora posso portare la mia merce a casa di notte e di nuovo qui al mattino! + +#Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +Aspetta un momento... non è qui! Che è successo? Aspetta, lasciami tamponare le tue ferite! + +#As a token of my gratitude, take these stylish biking shoes! +Come segno della mia gratitudine, prendi queste eleganti scarpe da ciclismo! + +# 5 +#Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +Buongiorno, amico mio! Una splendida mattinata, non trovi? Un'ottima giornata per fare compere! Vorrei solo avere una scatola per poter trasportare la mia merce. + +#Too bad, looks like you can't afford this item! Come back later, when you have the cash! +Peccato, pare che non ti possa permettere questo oggetto! Torna più tardi, quando avrai il denaro! + +#Finty: Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +Finty: Ah, hai buon occhio! Hai bisogno di un'arma migliore, non è così? Fai saltare in aria i tuoi nemici per soli $499.99! + +#Finty: That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +Finty: Quel sacco per le monete ti permetterà di accumulare il denaro che trovi nella Landa! È tuo per soli $869.99! + +#Finty: Oh ho ho, here's a specialty item indeed: clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +Finty: Oh ho ho, questo è un oggetto assolutamente speciale: scarpe da ciclismo che si attaccano ai pedali, per essere veloci ED eleganti! È in offerta a soli $299.99! + +#10 +#Finty: Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +Finty: Stanco di spostare la polvere con la tua misera, piccola scopa? Oblitera le particelle di polvere nociva con questo aspirapolvere all'avanguardia! A soli $749.99, o in quattro piccole, comode rate mensili da $199.99! + +#As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +Come segno della mia gratitudine, ti dono questa orribile--volevo dire, stupenda carta da collezione!^ + end scene + + #(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a newline in the middle) + scene ending +Anodyne\n-------\n\n\n\nUn gioco creato da\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n------------- +Creato fra\n\nmarzo 2012\n\ne\n\ngennaio 2013 +DESIGN\n------\nEntrambi +PROGRAMMAZIONE\n-----------\nMelos, con la\nlibreria di Flixel\nper Actionscript 3\n\n\n\nART\n---\nMarina\n +MUSICA/SFX\n---------\nMelos, con REAPER\ne soundfonts\ngratuiti.\n\n\n\nDIALOGHI\n--------------\nPrincipalmente Marina\n +TRAMA\n-----\nEntrambi\nLocalizzazione\ngiapponese:\nKakehashi Games\nLocalizzazione\nspagnola:\nDiego Fenollar\nLocalizzazione\nitaliana:\nFrancesco D'Aucelli +Un immenso grazie ai\nnostri testers,\nche hanno sofferto\naffinché voi\nnon doveste\nfarlo!\n--------------\n\nMarina, che ha\nsofferto molto\nper i bug iniziali.\n\nEtan, per il sostegno\ncostante, fin dal\nprincipio, con\nmolti bug \ntrovati, e il\nterzo umano a\ngiocare a quasi tutto\nil gioco. +O - grazie,\nsorellina!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Melos vorrebbe\nringraziare:\n\nMamma e Papà, per il\nloro sostegno costante\nin questa impresa.\n\nS\n\nMolti TIGSourcers\ne altri\ndevs incontrati!\n\nMarina, per aver reso\nquesto gioco possibile,\ne per averlo\nmigliorato in\nmille aspetti. +Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE i mei altri amici\nche mi hanno\nmostrato sostegno\n(Grazie!)\n\nInfine, ma non \n per importanza,\nTina Chen.\nVecchia amica,\ngraze per il sostegno\ne anche per\navermi presentato\na Marina. +I ringraziamenti\n di Marina vanno a...\n\nColin Meloy, per\naver ampliato\nil mio vocabolario\n\nTsugumo, per\n\"E così vuoi fare il\nPixel Artist?\"\n\nAlla mia famiglia,\nper il sostegno\ne il cibo.\n\nA Daniel, per essere un\n\"Indie games dev\"\ncrescendo insieme. +Mo, per aver creduto\n in me.\n\nTina, per\navermi presentato\na Melos.\n\nMelos, per aver creato\nun gioco e per esserti\nfidato così\ntanto\ndi me. +CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer +Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n +Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n +Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n +Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n +Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera +Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews +Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman +Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites +Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +Young\n\n\nMitra\n\n\nSage\n\n\nBriar +\n\n\n\n\n\n\n\n +Vorremmo infine\nringraziare TE!\nPer aver giocato!\n\n\nSperiamo che\nti sia piaciuto. + +Ora sei in grado\n di esplorare il mondo\ndi Young senza\n(quasi) alcuna\nlimitazione, spostando\nil terreno con\nlo swap.\n + end scene + + scene elevator +#Floor? +Piano? +1\n +2\n +3\n +4\n +#Cancel +Cancella + end scene + end area +end npc + +# Tell the python script you're done. +DONE diff --git a/intra/source/data/dialogue_ZHS.txt b/intra/source/data/dialogue_ZHS.txt new file mode 100644 index 0000000..bcc88fd --- /dev/null +++ b/intra/source/data/dialogue_ZHS.txt @@ -0,0 +1,2665 @@ +### ENGLISH DIALOGUE - CHINESE TRANSLATION - by 一只小雨### + +#################### +### INSTRUCTIONS ### +#################### +# 0. If you could comment out the english version when you translate that would be useful for me! +# +# 1. - Any line starting with "#" doesn't need to be translated +# +# 2. SPECIAL KEYWORDS THAT SHOULDN'T BE TRANSLATED: +# Any line starting with: (where "..." is some other keyword , usually an NPC name or area name) +# +# does reset +# LOOP +# TOP +# npc ... +# area ... +# scene ... +# end scene +# end npc +# end area +# DONE +# +# 3. SPECIAL INSTRUCTIONS SYMBOLS +# ---------------------------- +# [SOMEKEY-C] means that this can change depending on what controls the user uses - it would be "C", "A", "ENTER", etc. Sometimes in the dialogue file I write +# Press +# [SOMEKEY-LEFT] +# set controls. +# +# And that implies that in-game, it will read "Press LEFT to set controls." +# +# 4. SPECIAL CHARACTERS IN DIALOGUE TO BE TRANSLATED +# ----------------------------------------------- +# \" and \' are for escaping the quotation characters. You can leave them like that. +# +# ^ Denotes the player will have to press the progress-dialogue-button again to continue the dialogue - you can leave it there (or move it around as needed in the translated sentence) +# \n denotes newline, you can leave it there. + +################## +# BEGIN DIALOGUE # +################## + +### 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +#Like music? Talk to that terminal! +喜欢音乐吗? 那就和那个终端机对话吧! +#Like pain? Head on down south! +喜欢疼痛吗? 那就一路向南行吧! + end scene + end area +end npc + +### 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +#That acrobat is losing balance! Where is the safety net? +那名杂技演员快要失去平衡了! 安全网在哪里? +... + end scene + + scene holyshit +WOOAH + end scene + end area +end npc + +### 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +#The lions are closing in on that juggler! +狮子们正在包围那名杂耍人! +... + end scene + end area +end npc + +### 'briar' + +npc briar + area GO + scene before_fight +#Briar: I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +荆棘:我累了,扬。 我已经厌倦了这样的循环。 我感觉自己活在同一个美梦中、同一个噩梦里,不断地循环。 +荆棘:… +#Briar: It’s not going to change, Young. This is all we’ll ever be. +荆棘:事情是不会发生改变的,扬。 我们永远都无能为力。 + end scene + + scene after_fight +#Briar: Goodbye, Young. +荆棘:再见了,扬。 + end scene + + scene final +#Briar: Dude, Young. +荆棘:老兄啊,扬呀。 +#Briar: Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +荆棘:抬起脚步,挥动手臂吧。 呀,如果没有了我,你一分钟也活不下去! +#Briar: Well, come on, let’s go get a sandwich or something. +荆棘:好吧,走,我们去弄个三明治或者别的什么好了。 +#Sage: You... you did adequately. Until we meet again. +贤者:你…你已经做了很多了。 + end scene + end area +end npc + +### 'sage' +npc sage + area BLANK + scene intro +#Mysterious voice: Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. +神秘的声音:喂?…扬? ^嘿!…噢,你能听到我的声音吗? 太好了,听着,你马上就要醒过来了。 你可以使用方向键四周围移动。 +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +#You will press the \' +你需要按下\' +#\' key to interact with objects and people around you. +\'键来与周围的物体和他人互动。 +#And you will press the \' +同时,你需要按下\' +#\' key to access the menu, which will provide you with information about yourself and your surroundings. +\'键调出菜单,那里将会提供有关你自身以及周围环境的相关信息。 + end scene + end area + + area GO + + + scene posthappy_sage +#Young... I just wanted to fix everything for you. +扬…我只是想帮你处理好一切。 +#I hope... I hope you can do better than me. +我希望…我希望你可以做得比我好。 + end scene + + scene posthappy_mitra +#Good luck, Young. +祝你好运,扬。 +#Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +贤者在某种程度上来说是对的。 我总希望一切既美好又完美,可是有时我却会忽略掉现实。 +#I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +我不知道你应该怎样去帮助荆棘。 我也不知道这个世界究竟是怎样运转,更不知道为什么所有事情都那么奇怪。 可是我真的很想成为你的朋友,扬。 +#You are fighting, Young. You are trying to understand. I hope you can work things out. +你一直在努力,扬。 你在努力去明白这一切。 我希望你能弄清楚这一切。 + end scene + scene one +TOP +#Sage: Young... this is my final warning... wait, who is that? +贤者:扬… 这是我的最后告诫… 等等,是谁? +#Mitra: My name is Mitra, and this is my bike, Wares! +麦卓:我叫麦卓,这是我的自行车,东西! +#Sage: I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +贤者:我没在问你自行车的名字,我是说你在这里干嘛? 我并不记得你。 +#Mitra: I’m here to help my friend, Young.. +麦卓:我是来这里帮助朋友的啊,扬… +#Sage: Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +贤者:扬可没朋友。 扬也没有“荆棘”。 如果你胆敢怂恿他,我会让你永远滚出我的世界! +#Mitra: What do you mean? Wares and I-- +麦卓:你说这话是什么意思? 东西和我—— +#Sage: SHUT UP ABOUT YOUR STUPID BICYCLE!!! +贤者:闭嘴! 别再和我提你那愚蠢的自行车了!!! + end scene + + scene hit +TOP +贤者:… +#Mitra: Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +麦卓:扬! 你还好吗? 你干得真是太漂亮了… 你坚持把这个糟糕的地方搞定了! 我们知道你能办到的! +麦卓:东西!!! +麦卓:东西… +#Mitra: Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +麦卓:瞧瞧,神秘的蒙面人,你觉得自己是何等角色? 你就不能让我们静静待一会吗? +#Sage: You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +贤者:你之所以觉得自己是扬的朋友,那是因为你会对他撒谎。 你会对他说,他是完美的。 一切都会得到解决。 好吧,如果你是这样想的话,算了。 从我面前消失吧,扬。 +#Sage: Go talk to your \"friend\". +贤者:去和你的\"amiga\"说话。 +#Mitra: We're just doing the best we can... +麦卓:我们只是在尽力而为… + end scene + end area + area NEXUS + + + scene enter_nexus +TOP +#Cloaked Man: Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +戴斗篷的男人:好了,是时候了。 呃…^我是说…^你好啊,扬! 我是贤者,村里的长者。 因为这片“大地”被邪恶力量所笼罩,所以你被召唤来此。 邪恶力量正在寻找传说荆棘,企图利用荆棘之力达成他们邪恶的目的。 所以你必须抢先一步找到荆棘,并且保护它。 +#Enter the active portal on your left to begin your quest. +走进你左边那个已经激活的传送门开始任务吧。 +#*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +*叹息* 你还在这里逗留可不是个好兆头啊。 进入传送门然后开始你的任务去呀。 荆棘乃至整个世界都需要你去拯救! +LOOP +#Just go in the damn door! +你只要走进那扇该死的门就好了! + end scene + + # After entering STREET for the first time + scene after_ent_str +#Why are you still here? +你怎么还在这儿? + end scene + # After finishing BEDROOM + scene after_bed +#Continue on, Young. That key you have found, there may be others like it - seek them out. +继续,扬。 你刚刚找到钥匙也许只是九牛一毛罢了——把它们全都找出来吧。 +#Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. +远方就是“大地”了,扬。 这是阻止邪恶力量的唯一途径。 + end scene + # After finishing first 3 dungeons + scene before_windmill +#Take those three keys, Young, and unlock the way to the deeper realms of The Land. +拿着这三把钥匙,扬。 你可以利用它们前往“大地”更深处。 + end scene +#After windmill, but disappears after Sage fight + scene after_windmill +#You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. +你已经达成了我所要求的事情,扬。 尽管你需要做的事情还有太多太多。 也许探索“大地”更深处能帮助你更好地理解… 也许你会懂得你为荆棘做的一切都是值得的。 + end scene + + scene all_card_first +#Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. +好样的,扬。 你已经找齐了“大地”其中一个区域的所有卡片。 这样一来,在该区域的传送门顶部就会出现一颗宝石。 + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Sage: Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? +贤者:你的技能很快就可以在测试中展现了,扬。 这座神殿是为了考验你而存在。 你需要集力量与智慧才能通过考验。 我想你应该已经找到一件武器了吧? +# Young swipes a few times +#Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +什么玩——?? …我、我是说… 当然了… 你找到了一根扫帚! 呃… 正如同传说所言… +#*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +*抱怨声* … 简直就是没用的东西——嘿! 你还傻站在这儿干嘛? +LOOP +#Keep your wits about you, Young. +时刻保持头脑清醒,扬。 + end scene + end area + + area BEDROOM + scene after_boss +# Sage fades into room. +#Sage: At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +贤者:现在的你还是很弱小。 如果你希望保护荆棘不受邪恶力量的伤害,你必须面对自己的恐惧。 你在这个箱子里找到的卡片,以及别的类似卡片,都是你成长的象征。 所以找到它们对你完成任务至关重要。 +#That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +那个钥匙对你的任务而言也很重要。 你必须找到其它钥匙。 在菜单界面选择地图可以传送回神殿的入口然后继续你的英雄任务。 +#Travel East and South through the temple grounds... you will find a use for that key. +往东南方向穿过神殿… 你会找到一处使用那把钥匙的地方。 +LOOP +#What, do you want a piggy back ride to the gate or something?? +什么? 你想要回大门那儿去吗?? + end scene + end area + + area TERMINAL + scene before_fight +#Sage: Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... +贤者:你怎么不听我的话呢?! 如果你像个傻子一样的冲进这里,你只会危及荆棘,“大地”,还有我一直以来在保护的一切! 抱歉,扬。 如果你不听我的话,那我只能用另一种方式来劝你… + end scene + scene after_fight +#Sage: Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. +贤者:扬… 我并不希望事情变成这样… 我希望你能成为更好的人。 我希望你能帮助荆棘。 但是所有这一切不过是一场愚蠢的游戏… 我没办法阻止你找到荆棘。 只不过当事情变得很糟糕的时候,别忘了我对你说过的话。 + end scene + scene entrance +#Sage: Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +贤者:你好,扬。 当你变得更加强大而聪慧的时候,这条路便会引导你找到荆棘。 +#Sage: You’re not ready Young, first you must face more trials in The Land. +贤者:你还没准备好呢,扬。 首先,你需要这片“大地”上接受更多的考验。 +#Sage: You have made progress, Young, but you must collect at least 36 cards to pass this gate. +贤者:你已经有所进展了,扬。 但是你必须收集齐全部36张卡片才能通过这扇大门。 + end scene +# non idlnig stuff + scene etc +#Sage: Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +贤者:哦… 呃… 你已经找齐36张卡片了吗? 但是我还不确定你是否能接受真正的考验。 其实,瞧啊,我们理解错了这扇门的意思,你其实需要…\n…\n…………\n92张卡片才能通过这扇门,而非36张! +#Sage: Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! +贤者:扬,别进去,你还没准备好! 为荆棘考虑一下吧! 还有“大地”! 如果你还没准备好,那一切都毫无意义了! + end scene + end area + + + + area REDCAVE + scene one +TOP +#Sage: Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +贤者:干得漂亮,扬。 你需要战胜的不止是这只怪兽,还有你自己的恐惧!!! +#Sage: Of course, you still have a long way to go. Have you been exploring The Land? +贤者:当然了,你还有漫漫长路要走呢。 你已经探索过“大地”了吗? + end scene + end area + + area CROWD + scene one +#Sage: Well done, Young. However, there are still trials to face. Do not let your guard down. +贤者:干得好,扬。 可是还有许多试炼等待着你。 千万别放松警惕。 +#Sage: Have you found all of the keys yet, Young? If not, go to the beach. +贤者:你已经找齐了所有钥匙吗,扬? 如果没有的话,那就去海滩上看看。 + end scene + end area + + + +end npc + +npc cliff_dog + area CLIFF + scene top_left +#I'm not like the others! *woof* I won't harm you... +我和别人不一样! *低鸣* 我不会伤害你的… +#It is a quiet existence up here. +这是一个安静的存在。 +#You smell like swiss chard. +你闻起来就是一股甜菜味儿。 +LOOP +*低鸣* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +#You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +你做到了,扬! 你打败了邪恶力量! 看看这个地方! 多么美丽! +#So beautiful... +实在是太美丽了… + end scene + + scene dump +#Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +呀,你在这里真是太好了! 我还担心你被困在雪里了呢… 在那里的时候感觉真是很绝望吧! 哈! +#Hahaha. Hahahahaha. HAHAHAHAHAHAHA! +哈哈哈。 哈哈哈哈哈。 哈哈哈哈哈哈! + end scene + + scene drink +#Hey sexy, I’ll buy you a drink! +嘿,小可人儿,我请你喝一杯吧! +#Have another drink, you little shit! Hahaha! +再和一杯吧,小混球! 哈哈哈! + end scene + + scene hot +#Fuck, it’s hot here... I’m so hot... and sweatyyy... +我靠,这里好热… 太热了… 我流了好多汗… +#Damn, working out makes me horny! +该死的,我越想弄明白怎么回事却更加饥渴难耐! + end scene + + scene gold +#Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +你知道这个地方是用金子做的吗? 跟真金一模一样!我们可以带着那块砖跑掉,然后不愁吃穿一辈子! 哇哈哈哈哈! +#Seriously, why are you just standing there? Help me jack this brick! +说真的,你为什么一直站在那儿? 赶快过来帮我撬砖啊! + end scene + + scene briar +#???: Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! +???:扬… 你终于做到了! 你救了我! 现在一切都恢复如初了!!!! + end scene + end area +end npc + +### 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +#HEADS UP! +当心! +#Mitra swerves to avoid you and crashes +#Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +抱歉… 我走路太急了。 嘿,我从来没见过你呢! 你也是旅行者吗? …哈? 你想保护荆棘不受邪恶力量的伤害? … ^好吧… 虽然我不明白你在说些什么,但是听起来蛮酷的呢! +#I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! +我只不过带着我的东西四处走走罢了… 什么? 不不,我可不是商人。 东西是我自行车的名字! +#Plays if you talk 3 times, or if you leave the screen +#Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. +也许我们还会再见的。 如果我听说有关荆棘的事情我会告诉你的。 +#Mitra bikes away + end scene + end area + area BLUE + scene one +#HEADS UP! All right Wares, let’s do this! +当心! 好了东西,来吧! +#Annnd presto! +赶快! +#Keep going, Young, we’ve got your back! +继续前进吧,扬,我们会一直支持你! + end scene + end area + + area FIELDS + scene init +#Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +你还记得我吗? 上次我只顾着介绍我的自行车--东西而忘记介绍我自己了。 我叫麦卓。 +#Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +你还记得我吗?上次我忘记介绍我自己了,我叫麦卓,这是我优秀的自行车,它叫东西。 +LOOP +#Mitra: So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +麦卓:你最近过得如何,扬? …什么? 我怎么知道你的名字? 你觉得很奇怪吧? 嗯,其实你衣服背后写着的呢。 +#Mitra: See you around, Young! +麦卓:回见,扬! + end scene + scene quest_event +#Mitra: Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. +麦卓:嘿,我只记得--有人说他们在找一些过去的东西。 我不太理解他们在说什么,但是他们急匆匆地往山上去了。 + end scene + +# Hints for the game - not cards + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) +# 0 ignore this +#Nothing. +什么也没有。 +# 1. Beach hint (no dungeons finished) +#Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +噢,你迷路了吗? 你去过海滩了吗? 也许那儿有东西能帮到你。 看上去你的那些钥匙是有一整组的。 你可能需要找到更多钥匙? +# 2. Forest hint (no dungeons finished) +#Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +噢,你迷路了吗? 你去过东边的森林了吗? 你找到的那把钥匙--看起来应该是有一整组的。 你可能需要找到更多钥匙? +# 3. Windmill hint +#Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +看看那些钥匙啊! 我记得我在东南方向看过有许多大门。 也许你可以去那边试试? +# 4. Generic hint to go past statues +#Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +嘿,我看到你把风力涡轮机开启了! 你知道这会对“大地”产生什么样的影响吗? +# 5. finished 6 bosses, all 36... +#Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +嘿,扬。 哇! 你已经找到那么多卡片了! 你现在弄明白它们用来干嘛的吗? 看起来你可以用它们来兑换东西呢! +# 6. hints for go things +#What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +那个新的扫帚附件是什么? 它可以让你改变这个世界的结构吗…? 说实话,那可真可怕啊扬。 真庆幸它不是在任何地方都能起作用,也许只能在“大地”最深处发挥效用。 +# 7. crowd finished but not redcave +#How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! +我的跳跳鞋你用得怎样了? 一定很棒吧? 我好喜欢我的新自行车鞋。 它们让我和东西成为了更棒的组合! +#8. redcave finished but not crowd +#Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? +真棒,扬,你又找到一把钥匙! 东西很喜欢这个颜色呢! 你找到用钥匙的地方了吗? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +#Mitra: Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +麦卓:嘿,扬,你在找卡片吗?\n你去“观察者”的神殿找过吗? + +#Mitra: Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +麦卓:嘿,扬,你在找卡片吗?\n我听说“观察者”的神殿的后门有一个迷宫。 + +#Mitra: Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +麦卓:嘿,扬,你在找卡片吗?\n你可以在“观察者”的藏匿之所找到一些东西。 + +#Mitra: Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +麦卓:嘿,扬,你在找卡片吗?\n“观察者”的神殿里有一个满是敌人的房间,对吧? + +#Mitra: Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +麦卓:嘿,扬,你在找卡片吗?\n你有没有仔细查看一下“观察者”的神殿呢? + +#Mitra: Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +麦卓:嘿,扬,你在找卡片吗?\n去试试“观察者”的神殿后门附近的那片荒废的区域吧。 + +#Mitra: Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +麦卓:嘿,扬,你在找卡片吗?\n也许你的邻居知道些什么呢。 + +#Mitra: Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +麦卓:嘿,扬,你在找卡片吗?\n我知道在你公寓的那个家伙在隐藏着什么… + +#Mitra: Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +麦卓:嘿,扬,你在找卡片吗?\n在你公寓入口附近…去那儿看看! + +#Mitra: Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +麦卓:嘿,扬,你在找卡片吗?\n你有没有检查过你公寓的*里里外外*呢? + +#Mitra: Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +麦卓:嘿,扬,你在找卡片吗?\n这里以南就是一个岛屿! 我没去过那儿,但是你可以去看看。 + +#Mitra: Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +麦卓:嘿,扬,你在找卡片吗?\n如果你一直沿着河流走,应该能找到好些东西。四周围看看吧! + +#Mitra: Hey Young, looking for a card?\nI know someone left a card near the windmill. +麦卓:嘿,扬,你在找卡片吗?\n我知道有人在风车那儿留了一张卡片。 + +#Mitra: Hey Young, looking for a card?\nLook around the rivers in the forest... +麦卓:嘿,扬,你在找卡片吗?\n去森林里的河流附近找找看吧… + +#Mitra: Hey Young, looking for a card?\nTry poking around the base of the mountains. +麦卓:嘿,扬,你在找卡片吗?\n去山底下找找看吧。 + +#Mitra: Hey Young, looking for a card?\nTry going to the summit of the mountains. +麦卓:嘿,扬,你在找卡片吗?\n去山顶找找看吧。 + +#Mitra: Hey Young, looking for a card?\nThe far end of the beach may hold something. +麦卓:嘿,扬,你在找卡片吗?\n在海滩的远处也许可以找到点什么。 + +#Mitra: Hey Young, looking for a card?\nTake a walk in the crimson woods. +麦卓:嘿,扬,你在找卡片吗?\n去深红色树林里逛逛吧。 + +#Mitra: Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +麦卓:嘿,扬,你在找卡片吗?\n在那些红色洞穴里面有许多上锁的门,对吧? + +#Mitra: Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +麦卓:嘿,扬,你在找卡片吗?\n去北边的红色洞穴,寻找河流的源头! + +#Mitra: Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +麦卓:嘿,扬,你在找卡片吗?\n唔…你在黑暗迷宫里仔细找过了吗? + +#Mitra: Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +麦卓:嘿,扬,你在找卡片吗?\n我记得某个地方有一条很可怕的、会喷火的路。 在路的尽头应该有些什么! + +#Mitra: Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +麦卓:嘿,扬,你在找卡片吗?\n那些马戏团的人一定在隐藏着什么。 你有没有仔细找过呢? + +#Mitra: Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +麦卓:嘿,扬,你在找卡片吗?\n你在那对夫妇的大坑边缘仔细找过了吗? + +#Mitra: Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +麦卓:嘿,扬,你在找卡片吗?\n这对夫妇在大坑附近游走。 他们肯定在隐藏着什么。 + +#Mitra: Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +麦卓:嘿,扬,你在找卡片吗?\n有些时候裂缝中可能会隐藏着些什么--特别是山洞里! + +#Mitra: Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +麦卓:嘿,扬,你在找卡片吗?\n你有探索过最高处的山洞吗? + +#Mitra: Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +麦卓:嘿,扬,你在找卡片吗?\n你在山洞深处找到什么东西了吗? + +#Mitra: Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +麦卓:嘿,扬,你在找卡片吗?\n那个在诡异之处的彩色方块--应该有东西在那儿! + +#Mitra: Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +麦卓:嘿,扬,你在找卡片吗?\n你和那个在看上去很荒凉的区域里的灰度方块对话了吗? 也许它知道些什么。 + +#Mitra: Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +麦卓:嘿,扬,你在找卡片吗?\n酒店的顶层虽然有些破败,但是应该藏着些什么! + +#Mitra: Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +麦卓:嘿,扬,你在找卡片吗?\n你去酒店第三层的所有房间看过了吗? + +#Mitra: Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +麦卓:嘿,扬,你在找卡片吗?\n我敢打赌,有人肯定在酒店第二层留下了什么东西。 + +#Mitra: Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +麦卓:嘿,扬,你在找卡片吗?\n酒店的主人肯定留了些东西给你! + +#Mitra: Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +麦卓:嘿,扬,你在找卡片吗?\n那些西北方向的断桥…去那儿看看吧! + +# and a bonus one if for some reason you make it this far without finding any... +#...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? +…什么? 你一张卡片都没找到? 拜托,扬,这实在是太扯了吧! 人活一辈子总该有些冒险精神吧,比如开几个箱子什么的,你懂我的意思吧? + end scene + +#General random stuff + scene general_banter +#Did you find that guy who was looking for something in the mountains? +你遇见那个在山里寻找东西的家伙了吗? +#Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +你知道我的自行车姓什么吗? …操纵者! 你知道吗? 东西·操纵者!! …我开玩笑的,自行车怎么会有姓氏呢。 +#Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +你觉得我应该弄一把U型锁吗? 可是我不喜欢把东西锁成那样,可是最近又听说了很多偷自行车的案例… +#So what is The Briar? Some sort of ancient artifact from a lost culture? +所以荆棘到底是什么? 是从失落文明中遗留下来的古代手工艺品吗? +#I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +我想知道为什么我从来没听说过什么邪恶力量入侵的事情。 我猜这儿大部分人都只在烦恼各自的琐碎事。 +#Hey Young, I just wanted to tell you... your hair is awesome. +嘿,扬,我想告诉你… 你头发真好看。 + end scene + + end area +end npc + +### Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +#Statue: The Village Elder in name only, for he is neither. +雕像:那个村庄长者只不过是名义上的角色罢了。 + end scene + end area + + area OVERWORLD + scene bedroom_entrance +#Statue: I’ve seen a broom in a legend... it was on the map of a janitor closet. +雕像:我见过一把传说的扫帚… 它在看门人衣橱里的地图上。 + end scene + end area + + area BEDROOM + scene after_boss +#Statue: Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. +雕像:获得卡片对你而言至关重要。 当然,它们在其它方面也很重要。 比如获取分数或是购买酒精饮料什么的。 + end scene + end area + area REDCAVE + scene one +#Statue: Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! +雕像:做得好,贤者。 你需要克服的除了你的坏脾气之外,还有你的自尊心! 这样你才能好好讲出你那俗套的对白!!! + end scene + end area + area TERMINAL + scene one +#When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! +当你成为一个更加有压力和冷漠的角色之后,这条路会带你去找布雷耶。 放松一下吧,失败者! + end scene + end area +end npc + +### sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced +# This line must be played once before anything else can +#Edward: Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +爱德华:有一个男人走进来,在我们的浴室里安了一面镜子。 所以我担心里面会有隐藏摄像头。 我把镜子的木框仔细翻找了一下,我喷了一些梅非的油皂在木框的裂口处,我觉得这样应该可以让里面的电路短路。 当然了,虽然我什么也没找到。 +LOOP +#Edward: This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. +爱德华:这座神殿是献给“观察者”的。 我不知道我为什么会来这里,我很害怕走进去。 + end scene + + scene bedroom_not_done +#Edward: Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. +爱德华:遇到麻烦了吗? 好吧,我能想象到。 你只有一把扫帚而已。 而一把扫帚只能用来扫扫灰尘。 + end scene + + scene bedroom_done +#Edward: You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. +爱德华:你说你打败了“观察者”? 哈哈。 你没发觉事情不应该如此吗? 你只不过是把油皂喷在了裂缝上。 + end scene + + end area +end npc + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +#Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! +噢,这难道不可爱吗? 弱小的扬,在扮演着英雄的角色。 但是我见证着你在这片“大地”上所做的每一分努力。 让我来告诉你吧,扬。 这里不是所有人都会诚实对待你。 当心你信任的人! + end scene + scene after_fight +#I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". +当你孤单之时,我会与你同在,扬。 别忘了我对你小小“冒险之旅”的建议。 + end scene + end area +end npc + +# rock (Rock with words) +npc rock + + area BEDROOM + scene one +#Rock: Peripheral vision is the hive of demons. +石头:周围的幻觉便是恶魔的巢穴。 + end scene + scene two +#Rock: To-do: Construct method of transportation to Nexus. Progress: Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. +石头:待办事项:构建运输到节点的方法。 进程:停顿--“观察者”拒绝提供项目运作资金。 我们将不得不使用原始的传送门方法。 + end scene + scene three +#Rock: I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. +石头:我被孤独地困在这里。 这个隧道里的工作很稳定,至少每天都能看到有进展。 + end scene + end area + + area BLUE + scene one +#This wheel is used to lift the dam. +这个轮子曾经被用来升起大坝的。 + end scene + end area + area CIRCUS + + scene one +#June 24th, 1957: Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. +1957年6月24日:秋千坏掉了。 爱丽丝·罗格斯摔到地里去了。 2根胫骨骨折。 + end scene + scene two +#July 17th, 1957: Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. +1957年7月17日:七名小丑因为严重的肺部问题而退休。 兰德布兰德牌化妆品非常可疑,可是却没有对其进行任何正式调查。 + end scene + scene three +#July 21st, 1957: Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. +1957年7月21日:由于有个兽笼出现问题,我的脸和侧身都被一只尚未驯服的狮子所咬伤。 我活了下来,但现在我只要看见自己的模样就会瑟瑟发抖。 + end scene + scene four +#August 5th, 1957: In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. +1957年8月5日:在我的梦里,我看见了有一双凶猛却闪闪发光的眼睛的石头脸。 他道出了我们存在的真实情况,是第一个在痛苦中给予自由的人。 + end scene + scene five +#August 7th, 1957: How many of us will suffer before we accept the truth of the Seeing One? +1957年8月7日:在我们接受“观察者”的真相之前,还有多少人要受苦? + end scene + + scene six +#August 8th, 1957: I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. +1957年8月8日:我已经做出了决定。 有些人说会追随我。 这是我的最后一搏。 愿“观察者”保佑我们诸事顺利。 + end scene + end area + area CLIFF + scene one +#(Indecipherable markings) +(难以辨认的记号) + end scene + scene two +#December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! +2010年12月7日。(姓名无法知晓)。 这里除了愚蠢的石头已经没有别的东西了! + end scene + scene three +#Danger! This cave is unexplored. +危险! 这个洞窟未经勘查。 + end scene + scene four +#These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. +这些峭壁E向远处延伸,然而我从没有爬到高处去看它们通向哪里。 + end scene + end area + + + area CROWD + scene one +#Rock: How? +石头:怎样? + end scene + scene two +#Rock: Warning! Vertical drop, jump at your own risk. +石头:当心!垂直降落你需要自行承担风险。 + end scene + end area + + area DEBUG + scene one +#This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +这个曾经是卡片大门的占位符动画。 碰触两次可以查看锁住或开启的动画! +#I forget why we ended up scrapping it. Perhaps too dramatic. +我已经忘记为什么我们将它弃之不用了。也许是因为它太引人注目了。 + end scene + + scene two +#Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +这里是许多材质图层与碰撞的测试点!我没办法一个素材用到底(比如墙的两面)。所以我完全放弃了这个主意… + +#There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. +我们不用它们是有原因的。最主要的原因是为了简化设计,让我们更好地完成游戏制作。 + end scene + + scene three +#Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +敌人被击败时有几率掉落钥匙。虽然这个主意很有趣,但是我还是放弃了。 + +#Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +我们还有一个点子,就是设计一些挑战大门,把它们放在考验的最后。你只有无伤过关后才能开启这些大门。 + +#We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! +我们想把所有的地牢都放在这周围,然后掉血之后无法恢复。不过这样实在是太难了! + end scene + + scene four +#PRISON!!! +监狱!!! +#Save us!!! +救救我们!!! +#Please! +拜托了! + end scene + + scene five +#Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world (90 PER-CENT) \"Non-canon\". Anyways. +欢迎来到“调试世界”!现在,你已经走出了\"大地\",所以这个世界可以说(至少有90%)都是\"非正式\"内容。 +#Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. +在使用大量地图素材之前,我用了一些很傻的素材来标记出大门的位置。实际上每个地牢都是用这里的地图素材勾勒出大概的。然后Marina再用他的素材去精细构建。 + end scene + + scene six +# Translator's note: since this word comes from French, I'll leave it as it is +# Equivalence (for reference) --> French: fille -- English: girl -- Spanish: chica +fille + end scene + end area + + area DRAWER + scene five +#-ARCHIVES- +-档案- +#PROCEED WITH CAUTION +谨慎行事 + end scene + scene four +#West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. +西部。裂缝。真实!房产价值低、飓风、老旧、缩减。放松。 + end scene + scene three +#The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. +“观察者”让我记、记起…………在家的美好时光。 + end scene + scene two +#COLD STORAGE\n\n^ -- THE MGMT +冷藏\n\n^ --管理员 + end scene + scene one +#CONTINUE +继续 + end scene + end area + + area FIELDS + scene one +#West: Beach\n\nEast: Forest\n\nSoutheast:\n Rainy Area\n\nNorth: \nTemple Grounds\n\nNorthwest: Chasm +西部:海滩\n\n东部:森林\n\n东南部:\n 多雨地区\n\n北部:\n神殿遗迹\n\n西北部:峡谷 + end scene + end area + + area FOREST + scene one +#West: Land Lake\nSouth, then east: Cliffs +西部:湖泊\n南部以东:峭壁 + end scene + scene two +#Relaxation pond. Stay a while, we know you have the time. +放松池塘。停下来歇息一会吧,我们知道你有时间的。 + end scene + scene three +#I'm afraid I may be stuck on this tiny corner forever. +我担心自己可能永远被困在这个小角落里了。 + end scene + scene four +#East: Cliffs +东部:峭壁 + end scene + end area + + area GO + scene one +# The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. +当黑暗守卫素材被底下色的方格网替换时,路径才会打开。 + end scene + + scene two +#When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. +当蓝色石像移动\n新的路径将会出现\n翻过峭壁,穿过奇怪的区域\n你将会看到一间旅行者旅店\n\n\n\"谁是守卫?\" 我问道,\n\"谁掌管这个繁忙的地方?\"\n尽管这里有许多人类的灵魂\n我依旧感到很孤单。 + end scene + + scene three +#The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. +锈蚀的红色雕像移动了\n这是在为更深处铺路\n伴随而来的是迷宫般的地牢\n然后是马戏团的大帐篷\n\n\n\"谁是守卫?\"我问道,\n\"谁放弃了生命,逃到这样一个地方来?\"\n我如他们一样害怕痛苦\n但更害怕死亡。 + end scene + + scene four +#The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. +绿色的金属雕像移动了\n更深的道路开启了\n郊外的房屋和道路慢慢形成\n那是通往公寓的道路。\n\n\n\"谁是守卫?\"我问道,\n\"谁在星辰之中找寻慰藉?\"\n虽然孤身一人,但却感觉被人注视\n注视我的定然不是那友好的星光。 + end scene + + + end area + + area BLANK + #initial entrance from windmill + scene one +#Rock: This is unclaimed territory - not yet a part of The Land. +石头:这是一片无人认领的领土--它尚未成为“大地”的一部分。 + end scene + #concentric circles + scene two +#Rock: These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. +石头:这些==^ 我和我的^ --圆圈是^ --约定…我会^ --围绕中心^ --努力完成所有使命…^ --圆圈。吱吱、吱吱。 + end scene + #islands + scene three +#Rock: Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! +石头:看呀^ --…可我依然^ --你的脚步^ --是否将重新出现?^ --当在这里之时! + end scene + #mazeish place, not near the portal + scene four +#Rock: Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. +石头:往下看^ --我发现:^ --从此开始,你--^ 我爱上了他。^ --于是什么也…看不清。 + end scene + #left part of the 48 gate + scene five +#Rock: My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. +石头:我很抱歉--^ 但是,嗯,我们--^ 在这里混乱不清--^ 应该保持联系--^ 但是那扇传送门应该^ --我会努力让你知道我的想法--^ 将你带回“大地”。 + end scene + end area + + + area NEXUS + scene one +#Sometimes if you talk to people multiple times, they have new things to say. +有时如果你和人们对话多次之后,他们可能会和你聊点新话题。 +#But not rocks. Rocks don’t do that. +但是石头不会这样。 石头才不做那样的事情。 + end scene + #before 49 card agate + scene two +#Rock: So close! If only... +石头:很接近了!只要… + end scene + #door that goes nowhere + scene three +#Rock: Curiosity is a great thing. +石头:好奇心是个好东西。 + end scene + #below treasure box + scene four +#Rock: Oh!...? +石头:噢!…? + end scene + scene five +#The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads: \"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" +电脑终端打开了一封电子邮件。由于部分显示屏已经坏掉,所以只能看见信息的一部分。电子邮件写到:\"你好,扬!似乎[...]第五十张卡片[...]也许你不该…[...]值得思考!你觉得自己已经准备好了吗?醒醒吧…\" + end scene + end area + + + area OVERWORLD + scene one +#Rock: I’ll bet you’re reading a rock because you don’t have any friends. +石头:我打赌你肯定是因为没朋友所以才会度一块石头上的内容。 + end scene + scene two +#Rock: Welcome to Overworld Station. We hope you enjoyed your time in The Land. +石头:欢迎来到主世界的站点。希望你很享受在“大地”的时光。 + end scene + scene three +#Rock: An explorer is you! +石头:你就是探索者! +#Rock: Please don't go south. It's under construction. +石头:请不要去南部。因为那里正在施工中。 + end scene + scene four +#Rock: Treasure in 5,3! +石头:财宝在5、3! + end scene + scene five +#Rock: Haha, gotcha! +石头:哈哈,明白了! + end scene + end area + + area REDCAVE + scene one +#WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. +我们出生于正在衰老的母亲的身体中。 + end scene + scene two +#ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. +有一天,我们的母亲离开了她的母亲,独自去寻找有毒的青蛙。 + end scene + scene three +#WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. +我们从没问起过此事。 我们不能让她遭受痛苦。 + end scene + end area +# area for redsea + area REDSEA + scene one +#Rock: Signs indicate the trees have not been active for an extended period of time. +石头:标志上说到,树木们已经有很长一段时间处于沉睡状态了。 + end scene + scene two +#Rock: South: ???^ North: ??? +石头:南部:???^ 北部:??? + end scene + scene three +#Rock: The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. +石头:这并不平坦的地面据说是由曾经居住在这片土地上的祖先们构成的。 + end scene + scene four +#Rock: They appear to be a peaceful species. +石头:他们似乎是非常热爱和平的物种。 + end scene + end area + + + area SPACE + #middle + scene one + #Scribbled in what appears to be permanent marker: Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + 某人用永不褪色记号笔字迹潦草地写道:你好,时空旅行者同僚。你已经踏入了远离扬所在的平行区域的裂缝中。你大概已经穿越了一片或者两片海洋。别担心有什么差别,你很快会重新回到你正常的冒险中去。别害怕这个地方,尽管这里到处都是禁忌和危险,这儿的人还是相当友善的。\n --管理员 + + #(Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (在这条消息下面,刻着这样一段话:) ____(看不清)长眠于此。他在森林里迷了路。 + + #(Even further below the message:) (just don't go too far south.) + (消息最下面还写到:) (别往太南边走就好。) + + end scene + # extra color + scene two +#Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbows! +____长眠于此(看不清,究竟是谁写的这个?)他被彩虹刺穿了! +#Would've been better with achievements. +原本应有更好的成就。 + end scene + #grey graves + scene three +#Here lies Burd. The cliffs weren't feeling too friendly. +伯德长眠于此。只因峭壁对其不太友好。 + end scene + scene four +#Here lies bag. It never had a chance. +袋子长眠于此。它从没有被人使用的机会。 +#Pretentious! +做作! + end scene + # color graves + scene five +#Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. +萨维奇长眠于此。他曾经试着在仓库里帮我修电脑。由于他拥有的空间实在太小,三年之后他还是没有修好。所以,他该死。 + end scene + scene six +#Here lies Dave. He wasn't very inspirational. +戴夫长眠于此。他是一个缺乏灵感的人。 + end scene + + end area + + area SUBURB + scene one + #---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + ---扬市---^\n请多加注意部分市民。他们不太擅长和人打交道…他们行事特别小心。扬市建立于90年代,市长英为了要开展一系列的住房计划而打造了这个城市。英拒绝使用“英”来命名此城市,而坚持要使用“扬”这个字。希望你在这儿玩儿得愉快。 + end scene + + scene two + #To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + 往西走是“观察者”的传说神殿。往东走是我们伟大的市长英的公寓,这里是不对外公开的--擅闯者自重。 + end scene + + scene three + #On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + 在他的第五次造访时,市长英因为找不到停车位而感到不快。后来他再次来访时,他会偶尔把车停在这个停车位。 + end scene + + scene four + #I remember the long sentences I used to write. Ha! Fragmented. + 我记得我曾经写下的长句子。哈!断断续续的。 + end scene + + scene five + #A DANGEROUS SITUATION + 危险的处境 + end scene + end area + + +# Area for TRAIN (it's actually CELL sorry) + area TRAIN + scene one +#The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. +“观察者”知道一切,并会启迪我们。启迪之路是无法用任何火把点燃的。 + end scene + scene two +#Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. +不要偏离“观察者”之路,就算为了在遥远的迷宫角落里的财宝也不要。 + end scene + scene three +#Move along. +继续前进。 + end scene + scene four +#Do not anger the Chasers with violence. +别激怒暴力的追踪者。 + end scene + end area + + area WINDMILL + scene one +#SCENIC LANDMARK: Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. +景观地标:情人塔。情人塔修建于很早之前。站在塔上可以眺望远山。第一座塔在不久前损坏了,然后被重新改造。第二座塔还在东边屹立不倒、直插云间。出于安全考虑,通往塔的道路被封锁了。什么时候重新开启还需要另行通知。 + end scene + scene two +#PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT +公共安全须知:^\n这座塔,尽管完好无损,但是据说塔顶有空间裂缝。请对此保持谨慎与宽松的心态。^\n --管理员 + end scene + end area +end npc + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +#The statue does not look like it will be moving anytime soon. +这座雕像看起来似乎马上就会移动似的。 + end scene + scene two +#The statue has moved. +雕像移动了。 + end scene + end area + + area REDCAVE + scene one +#It looks like this statue is firmly in place. +看上去这座雕像非常坚固。 + end scene + scene two +#The statue has moved. +雕像移动了。 + end scene + end area + + area CROWD + scene one +#This statue does not seem to be movable. +看上去这座雕像不可移动。 + end scene + scene two +#The statue has moved. +雕像移动了。 + end scene + end area +end npc + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +#Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. +火焰很漂亮,是不是?路灯的光芒把星星的火焰盖过了,实在是太可惜。 + end scene + scene after_fight +#Okay, so stars aren't really made of fire. ^Who gives a shit anyway? +好吧,星星其实不是真的由火焰形成的。 ^谁会关心这个啊? + end scene + end area +end npc + +npc cube_king + area SPACE + # kings are supposed to offer info on + scene color + #How are you today? I'm the ruler of this partition and interpretation of space. + 你今天怎么样呀?我是这个空间的统治者。 + + #You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. + 你想知道我为什么是这儿的统治者吗?我会让你知道的,不过这还需要一点时间。需要很长一段时间。需要很漫长的一段时间。 + + #Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. + 反正就是挺长的啦。我可先给你提个醒啊!我打算去散散步。你呢,可以去看看那边的箱子里都有些什么。或者去远处的酒店瞧瞧。我不知道那儿有什么,不过我听说那儿的东西还挺便宜的。在那儿不会有什么钱财的问题。 + + LOOP + #Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! + 我为什么是这儿的统治者?^…我也不知道原因,但是我在这儿的朋友都觉得,基于这里的状态,由我来担任这个职位非常合适。这可能是因为方块比较适合一直坐在平台的表面上把。除了我之外,没人需要一直坐在这儿了! + + #The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. + 那些人--在那边的我的朋友们--都有各自的优点。他们说不定以后也有机会坐在这儿,只不过现在做不到而已。有时候,我们也会互相交换一下身份,但是每一次,我们都还是需要有人来诠释这个空间啊!也许金字塔先生或者夫人可以坐在我的位置上,因为我们打算为他们打造适合他们形状的王座。这听起来很傻吗?也许吧。但是事情就是如此。一切都发生得那样迅速。几分钟、几小时--统治永远都不是长久的。 + + #Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... + 尽管如此,当我作为统治者的时候,感觉还是有点怪怪的…我有种与世隔绝的感觉,觉得和别人都格格不入… + + #...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. + …但是与世隔绝也不能正确去形容我的感受。这只能算是部分感受吧。我没有被孤立,我也不是不喜欢别人。我们都把彼此当朋友,但是你懂的,没人会专门跑来就为了和你随便聊几句。所以我不得不思考事情,否则我会发疯的!也许那也是与世隔离之感的一部分吧。 + + #Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. + 除了那些愚蠢的、关于*为什么*我们会在这儿占据这个空间的问题,我更好奇为什么我们是朋友。 + + #I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. + 我喜欢思考的是,不管是什么时候,大家都认为我是最好的统治者。而他们让我有充分的时间去适应这个角色。你知道的,这就是一种鼓励。这样的存在让我很是宽慰。 + + #I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. + 我觉得仅仅是这样就已经很让我满足了。虽然如果他们能有一两个人明白我作为一个统治者的感受会更好。我不是在抱怨这样的鼓励!但是也许我们会有不同的统治者呀…是吧!也许有一天我不是统治者了,那么我会去做我希望他们现在做到的事情…尽管我也不知道他们是不是会如我所愿。 + + #I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. + 我已经走了很久了。如果你去另外一个方向,那边也有一个和这里类似的区域。不过那儿和这儿的感觉还是有些不同的。 + + #It was nice to meet you. + 见到你我很高兴。 + + #Oh, you want to hear my story again? + 噢,你还想再听一遍我的故事吗? + + #Okay, sit tight. + 好,请好好坐着。 + + end scene + + scene gray + #Hello there. I'm the ruler of this part of space. + 你好呀,我是这里的统治者。 + + #What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! + 什么?你想知道我为什么会在这儿?你确定吗?我会长话短说给你解释的! + + #Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! + 既然你这样坚持,那好吧。虽然你最好是先去那个远处的酒店。我都不知道他们为什么要把它修出来。如果任何人要让我交税,那我肯定怨声不断! + + LOOP + #Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. + 好吧,虽然我是这儿的统治者,但是没有任何人让我统治。 + + #Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. + 我的那些朋友们--他们都是各自区域的统治者。虽然也都没有实际统治着谁--我们都是孤独的。但是只要我们互相聊天,就不会感到孤独了。毕竟这是我唯一存在过的地方啊。 + + #My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. + 我的朋友和我--我们所在的区域在某些方面都有共通点,比如它们为什么会存在、它们是怎样被安排的。我们在利益和欲望上都是相同的。所以我们喜欢谈论如何去统治。 + + #But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. + 但是,其实我们根本没有从物质形态上见过彼此。 + + #So you're not actually talking to their physical forms, but a representation of them in some holographic form. + 所以你也不是在和他们的意识形态对话,而是以全息的形态。 + + #I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. + 我知道,这样有些不幸。不幸的是,我们有太多的共同点。可是这样的我们只能彼此成为朋友呀。 + + #There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. + 当你不能够一对一的实际交谈时,其实也只是欠缺了一小部分真实罢了。 + + #But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. + 我不是在抱怨什么。可是这样聊胜于无啊!要是连一个说话的人都没有,我简直不敢想象那种情况。一定非常糟糕吧。 + + #It was nice talking at you, good luck with whatever you're up to. + 能和你说这些真是太好了,祝你一切都顺利吧。 + + #You're still here? I can tell you everything again, if you'd like. + 你还在这儿吗?如果你愿意,我可以从头到尾再和你说一遍。 + + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +#Crickson: Hey ya big bully! I’m not afraid of you! +克里克森:嘿呀,大恶霸! 我可不怕你! +#Crickson: Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +克里克森:你个大傻瓜! 我才不会逃跑呢! 就算你要揍我也不会! +#Crickson: Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! +克里克森:你只不过是个穿着喇叭裤的大傻个!你应该以你自己为耻! + end scene + + scene thorax +#Thorax: I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +胸腔:我是胸腔,我要为蜜蜂们发声。\n^它们的命运充满了不确定性,这不是它们想要的!\n^那些工蜂们不得不到处飞!\n^然后它们就这样白白死掉…这样的场景实在是太残酷了! + +#Thorax: Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +胸腔:也许这是病毒或是新型杀虫剂造成的,\n^也许这是那些臭苍蝇的幼虫造成的!\n^反正这个原因让这些蜜蜂的行为都变得很古怪。\n^不管原因是什么,这个状况必须被改变! + +#Thorax: Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! +胸腔:好吧,其实我也不清楚事情是如何\n^我也担心我所做的努力都是徒劳。\n^可是试问我怎么能冷眼旁观呢?\n^所以我一定会把这件事放到Facebook、Twitter还有Yelp上去! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +#Buy my stuff +买我的东西吧 + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +#What are you doing here, punk? Get lost! I caught it fair and square! +你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的! +#I won’t let it go! Not in a million years! +我不会就这么罢休的! 永远都不会! + end scene + + scene inside +#Oh, did you come here to terrorize me some more? +哦,你来这里是为了再一次恐吓我吗? +#You’re just siding with the cats because they are cute and furry. +你支持那些猫咪只是因为它们可爱又毛绒绒。 + end scene + + scene etc +TOP +#What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +你在这儿干嘛,废材? 滚开! 我做的事情都是公平公正的!^ 嗷呜!^ 是不是这样--?^ 再来一只猫???^ 嗷呜呜!!! + +#You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +你…你把我的房子打扫了… 我被感动了! 来,我要把我最美丽的东西送给你! + +#Young opens and takes the box. Something is inside it! +扬拿起了盒子。这里面有东西! + +#Icky: Oh. Hey Miao.^\n\n苗:I’m so glad you’re safe!^\n\nIcky: Uh... thanks for the hand, Young. +黏黏:噢。嘿,苗。^\n\n苗:真高兴你安然无恙!^\n\n黏黏:啊…谢谢你的帮忙,扬。 +LOOP +#Icky: To be honest, I kind of like sitting in boxes. +黏黏:说实话,我还蛮喜欢坐在盒子里的。 + end scene + end area +end npc + +npc miao + area FIELDS + + scene init +#Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +噢!! 你是扬,那个天选之人啊!!! 天啦噜,真是荣幸啊! 我叫苗小团儿,正在接受培训的天选之人! + +#Could I follow you around for a bit to watch a Chosen One in action? +我能跟着你一小会,看看天选之人是怎样做事的吗? + +LOOP +#Hello again, Young! Can I shadow you today? +你好啊,扬! 我今天可以跟着你吗? + end scene + + scene randoms +# 0. after talk to shopkeep +#Miao: Hey, Young... have you ever stolen anything? +苗:嘿,扬… 你偷过东西吗? + +# 1. AFter talk to mitra +#Miao: I like Mitra... and isn’t Wares a handsome bike? +苗:我喜欢麦卓… 东西是一辆很帅的自行车吧? + +# 2. Nexus pad +#Miao: What’s that cool stone thing, Young? Does it make you go back in time?! +苗:那块酷酷的石头是什么,扬? 它可以让你及时回去吗?! + +# 3. Random if Icky not saved +#Miao: I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +苗:我有点担心黏黏…扬,你最近在这周围见到过一只大猫咪吗?黏黏最后一次见我的时候告诉我说他要去东边的森林转转。 + +# 4. leave map +#Miao: Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +苗:黏黏说我不应该去危险的地方。所以回见啦,扬。 + +# 5, 6, 7 - only after you've seen 0, 1, 2 +#Miao: Have you ever sat in a bunch of grocery bags? +苗:你曾经在购物袋里待过吗? +#Miao: Hey Young, do you think it’s wrong to do catnip? +苗:嘿,扬。你觉得用猫薄荷是种错误的行为吗? +#Miao: I bet it must have taken a lot of work to become The Chosen One, huh, Young? +苗:我敢打赌,要成为天选之人一定要花很多功夫的对吧,扬? + end scene +# musing after you save icky + scene philosophy +#That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +我不禁在想黏黏会遇到怎样可怕的情况… 你觉得我们死后会发生什么事? 你觉得我们如何能在短短一生之内完成所有想做的事情? + +#Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +也许我们会不断重生,直至我们完成所有目标。 这样会不会更容易一些? + +#And then what is our reward for completing our journey? Do we just fade away? +可是当我们走完旅程之后,有什么样的奖励等着我们呢? 难道我们只是消失无踪吗? +LOOP +#Hmm... +唔… + end scene +# icky talking after yoh save icky + scene icky +#Oh. Hi, Young. +噢,你好啊,扬。 +#My name’s not really Icky. It’s Ichabod. +其实我并不叫黏黏。 我叫伊卡博德。 +#I hope Miao Xiao Tuan Er hasn’t been too much trouble. +我希望苗小团儿没给你造成太多麻烦。 +#See you later, Young. +回见,扬。 + end scene + end area +end npc + +npc generic_npc + + area DEBUG + scene melos +#Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +你好,一切都还好吗?你找到我了!虽然我准备就待在这儿的。外面实在太冷了。 +#You can blame me for all of those awful rooms! I made them with the DAME map editor. +你可以因为这些可怕的房间而责怪我!我是用DAME地图编辑器把它们做出来的。 +#I made this game with FlashDevelop IDE and the Flixel AS3 framework! +这游戏是我用FlashDevelop IDE和Flixel AS3做出来的! +#Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +噢,对了,游戏的音乐是我用REAPER DAW做的。有时候我还用Audacity。 +#I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +我是从所有的电脑辐射中获取营养的…^你说的这不符合生物学准确性是什么意思? +#Hi mom! ^And dad! +嗨老妈!^还有老爸! +#Want to know how to finish the game in 20 minutes? +你想知道如何在20分钟之内通关这个游戏吗? +#Ha! Like I'd tell you! +哈!你以为我会告诉你吗! +#(...maybe if you ask me nicely...) +(…不过如果你能温柔一点问我的话…) + end scene + scene marina +#Woah hey! +哇喔!嘿! +#I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +这个游戏里好多好多对话都是我写的!^ (…不过这句对话不是。现在是Melos在写哦。) +#I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! +我用了Adobe Photoshop CS5、Graphics Gale Free Edition以及Windows 7的截图工具来制作画面! + end scene + end area +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +#The humidity here is good for your skin, but bad for your hair. +这里的湿度对你的皮肤很有好处,不过却不利于你的头发。 + +#I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +我喜欢站在这儿。 这些日子以来,人们在酷热和极寒之间反复折腾。 气温的急剧变化对你的骨骼可不太好。 + +#It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. +这就像是咀嚼冰块的坏习惯一样。 我的母亲咀嚼冰块直至她二十多岁。 现在她的发际线已经突破天际。 + end scene + + scene second +#Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +你得确保换掉蝎子,然后把它们用报纸包住弄干。 你也不想制造出一个细菌滋生地吧。 + +#Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. +为什么要弄出一个只有红色果冻块儿的自助餐呢? 仿佛他们想让我们得癌症一样。 + end scene + + scene bomb +#Get away from me. +离我远点儿。 +#I’m serious... leave me alone now. +我认真的… 别靠近我。 + end scene + + end area + area BLUE + scene one +#I don’t need your pity, Young. +我不需要你的同情,扬。 + +#Right, just go on living in your happy little world, "Chosen One"... +嗯,你就这样在你的快乐小世界中一直生活下去吧,\"天选之人\"… + +#You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +你知道的,扬,友情只是人们相互之间的小把戏罢了。 我们都是混蛋,人生之路走到最后,我们都只是孤身一人。 + +#Hah, I knew you hated me, Young. +哈,我知道你讨厌我,扬。 + +#I’m doing fine. +我做得很好。 + +#Of course you don’t care, no one does. +你当然不关心,也没人关心。 + end scene + end area + + area HOTEL + scene one +#I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +我知道城市可以很脏乱差,但是我喜欢看看外面的万家灯火。 + +#It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +它以自己独特的方式美丽着。 虽然不像星星那样无穷无尽,但是却又在人情味上增添了一些美妙的复杂性。 + +#Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +每盏灯后,都有一个怀揣着希望、恐惧和秘密的人… 往外看是一种充满恐惧和孤独的个人行为。 + +#I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +我觉得自己是爱着每一个窗户后面的人的。 我爱你、爱着人们,你们都是我的星星。 不管你的人生轨迹是怎样,不管你认为自己有多么堕落,我都爱着你。 今夜你最可爱… + +#I’m sorry, I’m babbling. Thanks for listening. +抱歉,我又在胡说八道了。 不过谢谢你的聆听。 + end scene + end area + + area REDCAVE + scene easter_egg +#Heeyyyy, mannn...take a load off, stay a whilleee, eh? +嘿——,伙计…卸下行囊,待一小会儿可好? + end scene + end area + + area APARTMENT + scene easter_egg +#Ah! You found me! +啊!你找到我了! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what they say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + + scene quest_normal +#Golem: Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +石人:你来的路上有没有被一块大石头击中? 有时当我生气了,我就会扔石头。 如果你被击中了,那么我得和你道歉。 + +#Golem: My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. +石人:我母亲总说,如果我再这样继续下去,我最好离开山里再丢。 只要在她粉碎之前回来就好。 + end scene + + scene second +#Golem: When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +石人:当你是一块石头,你可以目睹人类很多代的更迭。 你可以比最聪明的人类更加智慧。 + +#Golem: At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +石人:至少那确实是个办法。 我前不久把我的望远镜弄坏了,所以我没办法给你说到底发生了什么事。 + +#Golem: Actually, I don’t miss watching people much, it’s a bore. +石人:其实观察人类一点也不好玩,我觉得很无聊。 + + end scene + + scene quest_event +#Golem: Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. +石人:噢,是的,我遇见过似乎迷路的人…他们告诉我,他们想去看看海滩。 + end scene + end area + + + area BEACH + scene quest_normal +#I’m not a lobster, I’m a langostino. The name’s Hews. +我不是一只龙虾,我是海螯虾。 我的名字是砍砍。 +LOOP +#Hews: You know what the best part of the ocean is? Being able to see the horizon. +砍砍:你知道海洋最棒的地方在哪里吗? 是可以看到地平线。 + +#Hews: The ocean is like a salty taste of infinity. +砍砍:海洋就像是充满咸味的无穷大符号。 + +#Hews: A crowded beach is robbed of its grace. +砍砍:可是拥挤的沙滩却剥夺了它的优雅。 + end scene + + scene second +#Hews: Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +砍砍:你听说过虾蛄吗? 它有16个光感受器可以用来感知紫外线。 你能想象看到更加广泛的色彩是什么样的感受吗? + +#Hews: Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. +砍砍:也许会很漂亮。 然后,我们就会因为各自看到的颜色而用各种理由讨厌起他人来。 + end scene + + scene quest_event +#Hews: You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. +砍砍:你在找人对吗?我记得当云朵飘过太阳的时候我就坐在这儿了。当太阳被遮挡住,有人向我走来,向我询问某件东西在哪里。我不记得他们问的是什么了,但是他们离开了,说准备前往森林。 + end scene + end area + + area FOREST + scene quest_normal +#npc james +#James: Berries are a good kind of food. I like berries. +詹姆斯:浆果是很棒的一类食物。 我喜欢浆果。 + +#James: Please make sure not to defecate on the berries. +詹姆斯:请一定不要在浆果上便便。 + +#James: So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +詹姆斯:这个季节里我已经啪啪啪过18次了。 而且,我已经吃了389串浆果了。 + +#James: Do you have any berries for James? +詹姆斯:你给詹姆斯带浆果了吗? + end scene + + scene second +# -- Spanish translator's note: Literal meaning changed in order to perform a language trick +#James: I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +詹姆斯:我写了一首诗:\n^我喜欢吃浆果\n^它们让我快乐\n^你要问我喜欢有多深?\n^月亮代表我的心! + +#James: Do you like blueberries or raspberries more? +詹姆斯:你喜欢蓝莓多一点还是树莓多一点? + +#James: Do you have any berries for James? +詹姆斯:你给詹姆斯带浆果了吗? + end scene + + scene quest_event +#James: Someone came by. They did not want berries. Went to southeast part of lake to the west. +詹姆斯:有人来过。他们不是为了浆果来的。他们去了西边湖泊的东南方向。 + end scene + + end area +#npc rank +#npc olive + area FIELDS + scene easter_egg +#Olive: Hi, I'm Olive the rabbit. +奥利弗:嗨,我是兔子奥利弗。 + +#Olive: I have so much cereal left to eat! I love cereal. +奥利弗:我还有好多谷物没吃呢!我超爱谷物的。 + +#Olive: The box is so big. It never ends! +奥利弗:这个盒子太大了。感觉永远没有尽头! + +#Olive: Neverending cereal! +奥利弗:永远吃不完的谷物! + +#Olive: Hmmm...maybe that's not such a bad thing. +奥利弗:唔…也许这样也不错。 + end scene + + scene bush +#Rank: Eheheh, silly Young! A broom’s no tool for cutting bushes! +兰克:哦呵呵,愚蠢的扬!扫帚可不是用来砍灌木的工具! + end scene + scene quest_normal +#Rank: I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +兰克:我砍掉这些灌木是为了生存。 有时候砍灌木的时候你能找到金子! 哦呵呵! + +#Rank: The economy has been really struggling under this bush... +兰克:这里的经济状况不太好… + +#Rank: Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! +兰克:有时候光靠砍掉灌木真的很难养活妻子和孩子——我们很多时候连足够的食物都没有…不过我们倒是从来不缺可以点火的地方! 哦呵呵呵! + end scene + scene quest_event +#Rank: Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! +兰克:呃?对!有人来过。他们说要去什么地底迷宫…我敢打赌,他们在那儿能遇到好多灌木,你说是吧,扬?哦呵呵呵! + end scene + + scene marvin +#Marvin: Oh hey, how are you feeling? +马文:哦,嘿,感觉怎样? +#Marvin: Where is Justin? +马文:贾斯汀在哪儿? +# -- Chinese translator's note: Literal meaning changed +#Marvin: There's no bottle rockets around... +马文:这附近并没有六月天乐队啊… + end scene + + scene chikapu +#Chika Chi! +奇卡奇! +#Chika Chika!! +奇卡 奇卡! +#CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! +奇——^\n卡——^\n噗————————!!! + end scene + + scene hamster +#Bob: Bob the Hamster likes to refer to himself in the third person. +鲍勃:仓鼠鲍勃喜欢以第三人称来形容自己。 + +#Bob: Apostrophes are the root of all e'vil. +鲍勃:省略符号是一切不好事情的根源。 + +#Bob: quiet! I am busy exuding an aura of hamstery ambiance. +鲍勃:安静!我忙着散发仓鼠光环呢! + +#Bob: ... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +鲍勃:……我想你最好是这么做…但是… 如果你做错了,你会因为做错而把事情变得更好吗? + +#Bob: A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +鲍勃:真男人从不哭泣…好吧,也许他只是让一滴眼泪在眼眶里来回打转。哈利穿过了刮着大风的莫哈维沙漠,而且没戴头盔和护目镜。可是他从来没流过泪。 + +#Bob: This game was created by an infinite number of monkeys working on an infinite number of typewriters. +鲍勃:这个游戏是由为无数多的打字员工作的无数多的猴子们设计的。 + +#Bob: I miss James... +鲍勃:我想念詹姆斯… + end scene + + scene electric +#Kuribu: Curry is yellow and spicy! +基路伯:咖喱又黄又辣! + +#Kuribu: For the clever opponent, injure increase! +基路伯:对聪明的对手使用,伤害将增加! + +#Kuribu: You got the experience of 2! +基路伯:你获得2点经验! + +#Kuribu: I tell you my phone number! 0*1-51*7-*4386 +基路伯:听着,我的电话号码是0*1-51*7-*4386 + end scene + + end area + + + area TRAIN + scene quest_normal +#What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +我在这儿干嘛?问得好!我只是偶然在这儿的。我正在忙着躲藏呢,这儿很安全,只要你不要离开太远,让那些家伙找到你。 + +#It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +似乎我还是比较幸运的。这些死去之人的躯体遍布此地——他们是怎么死的?实在让人太想弄明白这件事是怎样发生的。他们是被什么怪兽攻击了吗?所以被推倒,跌落在那些尖刺上? + +#It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. +这样真是有些糟糕。我希望这种事情不要发生在我身上。身体上的疼痛实在是太可怕了。 + + end scene + scene quest_event +#Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. +噢…现在我在想啊,方才有人从这儿路过,说他们在寻找什么东西…他们看起来和你有点像呢!抱歉,我不记得是什么时候的事儿了。在这里真的很难有时间概念。但是他们说准备去附近的小镇上。 + end scene + end area + + area SUBURB + scene quest_normal +#Hello. +你好。 + +#Are you looking for something? +你在找东西吗? + +#What are you looking at? +你在看什么? + +#No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. +不,我不是这镇上的居民。你能看见我并且和我说话可真是件诡异的事情啊,因为我完全无法和其他人互动。这样的杀手在这儿还有很多,似乎都没被人察觉呢。真是奇怪。 + + end scene + scene quest_event +#Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. +是的,我看到有人路过。他们在找什么东西。我不知道那件“东西”在哪儿能找到。而他们匆匆离开了,说是要去太空的交替区,这听起来好棒啊。 + end scene + end area + + area SPACE + scene quest_normal +#WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +哇啊 哇啊 哇啊————你、是、谁??? + +#I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +我是一名流浪者…这是从A地到B地的著名的旅途休息站之一。 + +#WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! +什么是“A”???这是我的故乡…而我要去B看望一位老朋友…旅途很是漫长…但是我已经做好牺牲的准备了…你呢???让生活充满挑战与刺激吧!!! + end scene + scene quest_event +#OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? +噢——在找另一个人类——我知道了。^让我读取一下内存…读取(0X0C00400 , STDOUT , 100 );\n………………\n………………\n啊、哈…\n 那个人有闪电般敏锐的洞察力,他们说要去一个维护得很好的旷野里的小屋。\n现在我在想啊…你长得真像他们呢!!!你真的不是他们本人吗??哈?嗯? + end scene + end area + + area GO + scene quest_normal +#You actually were...uh, ah. Well done. +你真的是…啊,呃。很棒。 +LOOP +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\" + end scene + scene quest_event +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +发光的石头反射出房间里的一点点光芒。石头上蚀刻着:\"快点,在我再次离开之前(这里将变得非常明亮,这样的事情总是不断发生着)——蓝色森林的西北部——我看见另一座神殿的入口,入口就在穿过那些树木的北边——要是我能有转换事物的能力该有多好,我就能到达那里…也许下一次当我重新造访这个世界的时候可以一试。\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +#HELLO. HAVE YOU MET cube YET? +你好呀,你见过方块了吗? + +#cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. +方块是空间里很棒的统治者。当然,这儿的其他统治者也都在尽力做到最好。 + end scene + + scene gray2 +#WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +你觉得这块空间如何?还算漂亮吧,不是吗? + +#AN INTERSECTION OF WORLDS! +世界的交汇点! + end scene + scene gray3 +#NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +我们这里没有灰色金字塔。我们使用了特殊的设备让我们能投射到这儿。 + +#WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. +我们为什么要那么做?因为我们想要和方块朋友们说话,让所有方块联合起来。 + end scene + + + scene graydead +*bzrrrrt* + end scene + + scene grayspin +#...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +…这个全息投影设备运作正常吗? +#NO?^...^DAMN! +不正常?^…^靠! + end scene + + + scene color1 +#Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! +你见过方块了吗?它做的事情都好酷哦!我听说有一次它站在一个悬崖边上将近12秒这么多。天呐!你知道那对于悬崖挺立者联盟来说意味着什么吗?你不知道?好吧,意味可大了! + end scene + + scene color2 +#CUBE does a lot of interesting work! +方块做了许多有趣的事情! + +#Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. +你听到了吗?很明显,马上就轮到我来统治了!我想,再过几分钟就好。 + end scene + + scene color3 +#I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +我来自塔糖,要被运送到台北。你问我为什么会在这儿?噢,我只是想和方块打声招呼! + +#Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. +别这么沮丧啊!这个地方是有点奇怪,所以才没能打动所有的访客吧。可是我们只能给你说,这个地方是全无恶意的。 + end scene + + scene colordead +#(...is it taking a nap?) +(…它在小憩吗?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +#EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. +我们都是从痛苦中出生,又在痛苦中死去。 我们经历着如此的循环。 永远无法逃离。 + end scene + scene after_fight +#IS THIS YOUR PUNISHMENT FOR OUR REBELLION? +这就是你对于反抗者的惩罚吗? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +#Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? +你为什么不让“观察者”牺牲? 你为什么不让我们得到救赎? + end scene + scene after_fight +#...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. +…我们没能让你为你对我们造成的干扰而付出代价。 然而…你却回报给我们以自由。 谢谢你,扬。 愿“观察者”永远庇佑你。 + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +#So good to see you, Yang. Been too long. Still playing those nintendos, I see? +见到你正好啊,扬。 好久没见了。 你现在还在玩任地狱的游戏吗? + end scene + scene after_fight +#Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. +天啊,扬,你什么时候长大的? 你知道的,你迟早得学会如何他人相处。 + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +#We have all the finest amenities here. How do you like the Pool? +我们这儿有所有最好的便利设施。 你觉得这个水池怎么样? + end scene + scene middle_fight +#How about our state-of-the-art fitness center? +我们最先进的健身中心你觉得如何? + end scene + scene after_fight +#We hope you enjoyed your stay! +希望你在这儿度过开心的时光! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +#Today is a nice day. +今天是美好的一天。 + +#Thanks for scratching that itch on my neck - I can't seem to reach it. +谢谢你帮我挠背上的痒痒——我根本碰不到那儿。 + +#I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +我听说当地餐馆做的蛋挺好吃的。我有优惠券哦。 + +#Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +你目睹了今天的车祸没?太可怕了!那人正发着信息呢。太可怜了,他还那么年轻! + +#My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +我儿子没能成功加入初中校队里。实在是太可惜了。我们为他的运动生涯已经投入了太多心血。 + +#Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +今天是感恩节。我要感谢的事情有许多。我已经等不及要参加明天早上的甩卖了。我要交易好多东西。 + +#Ah, I think I might be late for work. +啊,我觉得我上班要迟到了。 + +#I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +我急着回家呢,在亲家上门之前我得赶紧收拾收拾。 + +#We're having a garage sale! +走过路过不要错过我们的大甩卖! + +#Welcome! +欢迎大家来看看! + end scene + + scene words_teen +#I didn't see the latest movie. +我没有去看最新的电影。 + end scene + + scene words_kid +#I never gotta see the new cartoon! +我绝对不会去看新的卡通片! + end scene + + scene family +# inside of a house, parent (insightful kid) - 73 +#Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +欢迎来到我们的家,陌生人!你看起来很眼熟啊。这是个和平的小镇。非常宁静,很少有访客到来。 + +#inside of house, younger kid +#Do you like Davement? My brother Dave showed me this really cool song by them! +你喜欢戴夫状态吗?我的兄弟戴夫给我听了这首他写的超酷的曲子! + end scene + + scene older_kid +# inside of a house, olderkid +#My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +我的朋友喜欢听“雷黑德”写的“毫无惊喜”的曲子,然后抱怨着这个地方。是啊,这里是有些缺点,可是,至少你得心存感激啊!或者至少为这个地方做点什么吧!那些人简直是…噢,抱歉。有时候我就想做点什么… + +#I guess I'll just go write in my blog. +我觉得我得去我的博客上写点什么。 + +#You sure look like you're in a daze. +你看起来很茫然。 + +#I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. +我在电视上播放的体育新闻里根本听不到和我观点相同的看法,不过我的爸妈就是很喜欢看。 + end scene + +#inside of hanged man house 74 + scene hanged +#A note on the corpse: \"Placing myself in danger no more.\" +尸体上有行字:\"将自己置身危险之中。\" + end scene + + scene festive +#Inside of another house, (festival people) - 75 +#Oh, is there something going on outside? A festival? A parade? +噢,外面发生什么事了吗?在庆祝节日还是举办庆典? + +#There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. +外面好像有骚动!你最近往窗外看了吗?我好想知道到底是什么情况。 + end scene +#78 + scene paranoid +#My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +我的房子有许多窗户。我不喜欢窗户。因为总感觉有人在往里看。而且你知道的,外面总是在不停发生着各种事情。我无法总是那么安静——因为外面对我有干扰。 + +#Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +杀人犯?什么?外面?你在说什么啊?你在开玩笑吧?这个镇上从来就没出现过谋杀案,但是…你这样一说还真把我吓到了…也许你该离开了。 + +#Please get out. +请出去。 + end scene +# 76 + scene dead +#The body of this woman has been beaten to death by a blunt weapon. +从尸体上看来,这名女性是被人用钝器殴打致死的。 + +# --> Spanish translator's note: if a pun were intended here, no way has been found in order to emulate the relation of both expressions \"blunt weapon\" and \"to put it bluntly\" in Spanish since they share completely different words in all their sayings. +#The man, to put it bluntly, well... +伙计,坦白讲,好吧… + end scene + + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +#Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +噢,是你!你看起来好眼熟…在你杀死更多居民之前我是不能动的,你记得吗?过来一点。 + +#According to this pamphlet...you only need to kill a few more people! Keep it up. +根据这本小册子所说…你只需要再杀几个人就可以了!继续吧。 + +#We only need one more body, and then we can keep going. +我们还需要一具尸体就够了,继续吧。 + +#Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? +做得好。你可以随意进去。我也不知道里面有什么。明天同一时间再见吧,好吗?或者晚上? + + end scene + end area +end npc +# dialogue for the cards +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +#I don't mind being watched by the trees. +我不介意被树木盯着。 + +#1 Bat(?) - extra overworld area +#Where is she?! +她在哪里?! + +#2 sunguy +#I will be with you Young, whenever you are alone. +当你孤单之时,我会与你同在,扬。 + +#3 Shieldy +#Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +你是奥柯乔特吗? 我妈妈总是给我说要当心危险的奥柯乔特。 + +#4 slime +# --> Spanish translator's note: Phew! I did my best here! I'm very happy with it! +#Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +泥猴啊,扬! 在介里见到你真高兴! 泥要不要在这儿坐一会儿? 偶正在泡茶哦! + +#5 post-statue area in BEDROOM +#Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +呼、呼、呼、呼、呼、呼、呼、呼、呼、圣坛、讲道坛、祭坛、彩色玻璃窗… + +#6 SUBURB inside of house past blocker +#Limited time offer! Buy one, get one free - only today! +限时优惠!买一送一——仅此一天! + +# 7 APT Boss +#Remember the time that you lit a candle when the power was out? +还记得停电那天你点亮蜡烛的时候吗? + +# 8 APT Silverfish +#Mmmm, your pillow was cozy last night. +唔,昨晚你的枕头真舒适。 + +# 9 APT gasguy +#This'll teach 'em for calling me the fumi-GAY-tion guy. +这样他们就会记得称我为“画着烟熏妆”的家伙。 + +# 10 FIELDS 1 (island) - mitra +#Wares and I make a good team. +东西和我是超棒的组合。 + +# 11 FIELDS 2 (alcove) - Miao +#I'm the Chosen One-in-training!!! +我是正在接受培训的天选之人!!! + +#12 Base of WINDMILL windmill +#Do you ever feel like, no matter what you do, you can't stop the world from dying? +你会否觉得,不管你做什么,你都无法阻止这个世界消亡? + +#13 Hidden up a river in FOREST +#Beware the forest mushrooms... +当心森林蘑菇… + +#14 Bottom of ladder-mini-maze on CLIFF +#I am sorry. It is my nature. +抱歉。 这是我性格使然。 + +#15 Top of Cliff +#What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +你说“只是一块石头”是什么意思?? 你知道不,石头也有资格上卡牌! + +#16 Western end of BEACH past spikes +#Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +授人以鱼不如授人以渔。这样他就可以和他儿子吉米有时间好好相处了。 + +#17 At end of path through the woods in REDSEA +#Sometimes the answer is taking a walk. +有时候解决问题只需要去散散步。 + +#18 MOVER Redcave - Past 2 locks in central redcave +#Why do bats suddenly fly down, every time you're around? +为什么每次你四处走动的时候,蝙蝠就会突然飞下来? + +#19 SLASHER Redcave - West end of Northern redcveave +#NO, *YOU* NEED BRACES! +不,是*你*需要背带! + +#20 REDBOSS Redcave - post boss +#ARE YOU HAPPY NOW? +你现在高兴了吗? + +#21 NW corner of CELL - chaser +#Don't get violent around me. +别在我周围制造暴力。 + +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +#I've always wanted to be on Iron Chef. +我一直都想成为料理铁人。 + +#23 CONTORT circus - contort + firepillar room in SW chunk +#My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +我妈妈总是给我说,“如果你弯腰太久,你的脊椎就回不了原样了!” + +#24 LION circus - end of northern gauntlet bordering boss room +#Are you amused yet, human? +你觉得开心吗,人类? + +#25 A+J BOSS circus - basement (post boss) +... + +#26 FROG crowd - North of entrance +#Scientifically speaking, toads are a subset of frogs. +从科学的角度来讲,蟾蜍是青蛙的一种。 + +#27 CROWD GUY crowd - 2nd floor +#HAHAHAHA! Yeah! I know! +哈哈哈! 耶! 我知道! + +#28 WALL BOSS crowd - post boss +#Oh, you collect cards, too? Real classy, Ying. +哦,你也在收集卡牌吗? 真棒啊,英。 + +#29 end of grey end of space, for grey cube king +#They always said, \"Get off the computer! Or you'll never make friends!\" +他们总是说:\"离开你的电脑!否则你永远交不到朋友!\" + +#30 end of colorful end of SPACE, for color cube king +#I'm only the ruler for the extent of a conversation. +我只是名义上的统治者罢了。 + +#31 DUSTER hotel - end of 4th floor moving platform area +#I'll bet you think you're 'making my job interesting'! +我敢打赌,你觉得你“让我的工作变得有趣”了! + +#32 DASH TRAP hotel - Dash trap room on 3rd floor +#I hate diagonals. +我讨厌斜线。 + +#33 BURST PLANT hotel - SE corner floor 2 +#Don't even try that claritin clear shit with me. +别给我用抗过敏药物。 + +#34 EYE BOSS hotel - post-boss +#Swipe this card to unlock the door to your room! +刷这张卡就可以解锁你房间里的门! + +#35 end of left-most TERMINAL bridge - sage +#I'm doing a great job. +我做得很棒。 + +#36 Young (drawer APT) +#.......?? +……………?? + +#37 old BDRM (dialogue rock) +#Who carved all of us anyways? +谁雕刻出我们的? + +#38 hotel room +#I hope you enjoyed your stay. +希望你在这儿度过开心的时光! + +#39 end of debug minidungeon (old player sprite) +#Seening as you've gotten to this point, you must be quite Intrasting. +既然你能走到这里,证明你还是有点本事的。 + +#40 end of cell - Torch? +#I'm just here to lead you astray. +我来这儿是为了将你带入歧途。 + +#41 end of SPACE - faces/entities +#You like like a pyramid to us, too! +你也喜欢金字塔吗! + +#42 end uf suburb (killer) +#It's the same damn play, night after night, and the pay sucks. +这是个相同的该死游戏,日复一日进行着,而报酬却少得可怜。 + +#43 GOldma's room - goldman +#Leave me alone! My last name isn't Sachs! +让我静静!我的姓氏才不是什么萨克斯! + +#44 blank, ISlands - Broom +#At least I'm not a stick. +至少我不是根棍子。 + +#45 fields, bottom right - (Rank) +#What do you mean money doesn't grow on trees? Eheheheh! +你说钱不会对树造成任何影响是什么意思?哦呵呵呵呵! + +#46 street, bottom (Follower bro) +#I'm nothing but an illusion. +我只是一个幻觉罢了。 + +#47 redsea, bottom eft (Bomb npc) +#I'LL TAKE IT OUT ON YOU. +我要把气出在你身上。 + end scene + end area +end npc + +npc misc + area any + + scene controls +#Press +按下 +# [SOMEKEY-LEFT] +#to set controls. +以设置控制选项。 +# [SOMEKEY-ENTER] +#to cancel. +以取消。 +#Up +上 +#Down +下 +#5 +#Left +左 +#Right +右 +#Jump +跳跃 +#Attack +攻击 +#Menu +菜单 +#10 +#Press +按下 +# [SOMEKEY-ENTER] +#to exit +以退出 +# [SOMEKEY-LEFT] +#to set controls. +以设置控制选项。 + end scene + + scene title +#Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress +请使用\n方向键来调整\n窗口大小\n直至你无法看见\n黑框\n\n按下 +# [SOMEKEY-C] +#when done. +当完成之后。 +ANODYNE 镇痛 +Melos Han-Tani\nMarina Kittaka +#any key +任意键 +#5 +#Press +按下 +# [SOMEKEY-C] +#to start +以开始 +#Version +版本 +#Continue +继续游戏 +#New Game +新的游戏 +#10 +#Are you sure?\nNo\nYes +你确定吗?\n否\n是 +#Really?\nNah\nYeah +真的吗?\n不是\n是呀 +#No going back!\nForget it\nI know +不能后悔哦!\n算了吧\n我知道 +#deaths +死亡数 +#cards +卡牌数 +#15 +#Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +《镇痛》支持\n多种手柄。\n\n你打算用手柄玩儿吗?\n\n是 否\n\n如果是的话,请现在连接。\n\n使用方向键移动\n\n使用C键、空格键或回车键\n进行选择\n\n选“是”使用系统默认设置\n + +#NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device. +#Press BACK again\nto exit.\nUnsaved progress\nwill be lost. +注意事项\n\n如果你在游戏中遇到输入延迟\n你需要返回主界面\n重新进入《镇痛》\n\n按下C键以继续\n\n图形用户界面显示错误?\n按下下列键可重调设备。 +再次按下返回键可退出。\n未保存的进度将丢失。 + end scene + + scene gui +# Note - this below one is a sprite that fits into the gui +#menu=enter +菜单=进入 + +# Shows up when you save at a checkpoint +#Saving... +保存中… + end scene + + scene map +#Map +地图 +#Current Room +当前房间 +#Door/Exit +门/退出 +#No Map +无地图 +#Return to\nNexus +返回\n连结处 +#Return to\nentrance +返回\n入口处 + end scene + + scene items +#Items +物品 +#Normal +正常 +#Swap +调换 +#Extend +延伸 +#Widen +宽度 +#5 +#A pair of spring-loaded shoes - press +一双弹力鞋——按下 +# [SOMEKEY-X] +#to jump! +以跳跃! +#A pair of shoes for biking. +一双自行车鞋。 +#An empty cardboard box. +一个空纸箱。 +#A key found in the Temple of the Seeing One. +一把在“观察者”的神殿找到的钥匙。 +#10 +#A key found in a red, underground cave. +一把在红色地底洞穴找到的钥匙。 +#A key found in a mountain cave. +一把在山洞中找到的钥匙。 + end scene + + scene cards +#Cards +卡牌 +#cards +卡牌 + end scene + + scene save +#Save +保存 +#Saved! +已保存! +#ERROR +错误 +#Save and go\nto title +保存并返回\n标题界面 +#Go to title +返回标题界面 +#5 +#Save and quit +保存并退出 +#Quit game +退出游戏 +#Deaths: +死亡数: + end scene + + scene config +#Config +配置 +#Set keybinds +设置键位 +#Set volume +设置音量 +#Autosave at\ncheckpoints: +在保存点可\n自动保存: +#On +开启 +# 5 +#Off +关闭 +#Change\nResolution: +更改分辨率: +#Config UI +UI配置 +#Touch+D-Pad +触摸+方向键 +#D-Pad Only +仅启用方向键 +# 10 +#Touch Only +仅启用触摸 +#Move Input: +移动输入: +#Resolution: +分辨率: +#Windowed +窗口模式 +#Int. Scaled +按比例缩小 +# 15 +#Stretch +伸展 +#Scaling: +缩放: +#Language: +语言: +ja +en +ko +# 20 +#Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +拉拽按钮直至满意为止。\n\n点击菜单以继续。\n\n +#Resize Window +调整窗口大小 +#Config Joypad +配置手柄 + end scene + + scene secrets +#You\'re rolling in it! +你正在前往中! +#Once the property of a famous Bubble Mage. +曾经是一位著名的泡泡魔法师的财物。 +#If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +如果你的图像受到了干扰,就去看看官方口袋妖怪图鉴。 +#This heart has no name. +这颗心没有名字。 +#Please visit the electric monsters\' world. +请参观电子怪兽的世界。 +#5 +#A kitty statue. Cute, but useless. +一座猫咪雕像。可爱而无用。 +#Oh my!!!! +噢天啊!!!! +#Oh no!!!! +噢不!!!! +#It\'s black. +这是黑色的。 +#It\'s red. +这是红色的。 +#10 +#It\'s green. +这是绿色的。 +#It\'s blue. +这是蓝色的。 +#It\'s white. +这是白色的。 +#SOMEKEY-C +#:Select +:选择 +#SOMEKEY-X +#:Back +:返回 + end scene + + scene swap +#Sorry! +抱歉! +#The swap won't work here. +在这里无法进行调换。 +#Young could not muster the strength to use the swap here. +扬无法在此使用力量进行调换。 + + end scene + + scene keyblock +#This door is locked. +这扇门上了锁。 + end scene + + scene treasure +#Some strange force stops this treasure box from being opened. +某种神秘力量阻止了这个宝箱被人打开。 +#An engraving on the broom handle reads: Press +扫帚的把手上雕刻着:按下 +#SOMEKEY-C +#to sweep. +来扫动。 +#This key may be used a single time to open up a locked barrier. +这把一次性使用的钥匙可以开启一个锁住的障碍物。 +#A mysterious pair of boots has nothing but the branding on it, which says \"Press +一双神秘的靴子,没什么特别的,不过上面写着\"按下 +#SOMEKEY-X +#5 +\"。 +#A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +扫帚的延伸处上写着\"装备菜单里的宽度升级可以使扫帚朝左右方向释放有害灰尘。\" + +#A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +扫帚的延伸处上写着\"装备菜单里的延伸升级可以使扫帚朝前方释放有害灰尘。\" + +#A note next to the broom extension: \"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +扫帚的延伸出上写着:\"你好,扬。使用调换升级可以改变两块砖的位置。你可能还需要好一阵才能到处使用此功能,但是它会对你大有帮助。\" + +#YOU FOUND A HEART!!! Maximum Health increased by...zero. +你找到了一颗心!!!最大生命值增长了…零。 +#10 +#Goldman: What? It's not there? That shopkeeper must have stolen it! +戈德曼:什么?不在这儿?那个店主肯定把它偷了! + end scene + + scene dust +#Your broom is now full of dust! Attack again to place it. +现在你的扫帚已经充满了灰尘!再次攻击可以释放灰尘。 + end scene + + scene checkpoint +#Save game?\n Yes\n No +保存游戏?\n 是\n 否 +#While standing on a checkpoint, press +站在检查点上,按下 +#SOMEKEY-C +#to save your progress and set it as your respawn point if you die. +以储存你的游戏进度。如若死亡,此处将为你的重生点。 + end scene + + scene rock +#There is writing scrawled on this rock: +石头上潦草地写着: +#YA AINT GOT NO FRIENDS +你没朋友 + end scene + + scene door +#The portal does not appear to be active. +此传送门似乎没有被激活。 + end scene + + scene keyblockgate +#The gate stares, petrified. It won't open until it senses four cards... +大门稳稳地立在那里。如果它没有感知到有四张卡牌的存在,它是不会打开的… +#Sensing four cards, the gate decides to open. +感知到四张卡牌的存在,大门决定打开。 +#The gate stubbornly remains in place. +大门倔强地紧闭着。 +#The gate senses all of the cards, and decides to open. +大门感知到了全部卡牌的存在,它决定打开。 +#The gate senses enough cards, and decides to open. +大门感知到了足够卡牌的存在,它决定打开。 +#5 +#It opens! +大门打开了! +#It remains closed. +大门还是紧闭着。 + end scene + + scene solidsprite +#The sign points to the east but the words on it are faded. +路牌指向东方,但是路牌上的文字已经看不太清。 +#The sign points to the west but the words on it are faded. +路牌指向西方,但是路牌上的文字已经看不太清。 +#The words on the sign are faded. +路牌上的文字已经看不太清。 + end scene + + scene mitra +#Hey, Young! +嘿,扬! + +#Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +这双自行车鞋是给我的吗? 哇哦! 谢谢你,扬! 我一直想要这个呢,这样踩在东西的踏板上就更搭配啦。 这儿,扬,我用我的鞋子和你交换! 它们可以让你跳得很高!只要你按下 + +#[SOMEKEY-X] +#to jump with them on! +就可以使用它们跳起来了! + +#Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +你好,扬! 你注意到我有什么不同了吗?^… ^… 哦,好吧,我有一双新的自行车鞋了,你看! 它们可以卡入东西的踏板里面。因为我已经不需要旧的鞋子了,我想把它们送给你!它们可以让你跳得很高!只要你按下 + +#[SOMEKEY-X] +#to jump with them on! +就可以使用它们跳起来了! + +#5 +#Alright, take care! +好了,保重吧! +#Go on, try them out! ...They're not THAT smelly. +来吧,试试它们! …它们没什么味儿的。 +#Cool, huh? +很酷吧? +#Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +哇哦,这双自行车鞋是从芬缇的店里买来的吗? 你准备把它们送给我? 谢谢你,扬,太感谢你了! 这儿,我把我的旧鞋子给你作为回报吧——我想它们会对你很有帮助的! 鞋子上面写着\"按下 +#somekey-x +#to jump\". I've never understood that, though, because there's no \" +以跳跃\"。 我完全不明白这是什么意思,因为鞋子上面根本没有\" +#somekey-x +#10 +#\" anywhere on the shoes... +\"键啊… + end scene + + scene tradenpc +#Finty: Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +芬缇:欢迎欢迎,我亲爱的朋友,扬! 我的名字是帕拉珊德和夫——芬缇帕拉珊德和夫! 在我店里随便看看吧,也许你会发现什么想要的东西! + +#Finty: I still appreciate that box! +芬缇:感谢给我盒子! + +#Finty: Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! +芬缇:啊,一个盒子!太谢谢你了!这样我就可以在晚上把我的存货带回家,早上再运过来了! + +#Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +等等…不在这儿!它到哪儿去了?好吧,是这儿,让我来抚平你的伤口! + +#As a token of my gratitude, take these stylish biking shoes! +为了表示感谢,你把这双时尚的自行车鞋拿去吧! + +# 5 +#Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +多么晴朗的造成啊,是吧,我的朋友? 一个适合购物的早晨!我希望能有一个盒子,这样我就可以装着我的货物到处走。 + +#Too bad, looks like you can't afford this item! Come back later, when you have the cash! +太糟糕了,看起来你的钱不够啊! 等你有足够的钱之后再回来吧! + +#Finty: Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +芬缇:啊,你眼光真不错!你需要一件更好的武器对吧?只需要$499.99!你就可以将敌人杀个片甲不留! + +#Finty: That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +芬缇:那个钱袋可以存放你在“大地”中找到的钱币!仅需$869.99你就可以拥有它! + +#Finty: Oh ho ho, here's a specialty item indeed: clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +芬缇:哦吼吼,这儿有一件特殊的物品:夹入式自行车鞋,穿上它你就是时尚时尚最时尚的人!现在特价,只要$299.99! + +#10 +#Finty: Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +芬缇:用你的小扫帚扫开灰尘实在是太累了对吗? 要想根除有害灰尘的烦恼,就使用这款最先进的吸尘器吧!仅需$749.99或者你也可以选择分期付款,每月只要$199.99! + +#As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +为了表示感谢,这个丑陋的——我是说,漂亮的,收藏版的卡牌你就拿去吧^ + end scene + + #(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a newline in the middle) + scene ending +Anodyne 镇痛\n-------\n\n\n\n游戏由\n\nMelos Han-Tani\n\n和\n\nMarina Kittaka\n\n为您呈献\n\n------------- +游戏于\n\n2012年三月\n\n至\n\n2013年一月间制作 +游戏设计\n------\n两人协同 +程序\n-----------\nMelos,使用\nFlixel库来制作\n动作脚本 3.\n\n\n\n美术\n---\nMarina\n +音乐和音效\n---------\nMelos,使用REAPER\n和一系列免费音色库。\n\n\n\n对话\n--------------\n大部分由Marina制作\n +故事\n-----\n两人协同\n中文本地化:\n一只小雨 +特别感谢\n我们辛勤工作的测试员!\n--------------\n\nMarina,辛勤地为游戏排错。\n\nEtan,一直以来给予的支持,\n并且帮忙找到许多错漏。 +O——\n谢谢你,姐姐!\n\nRunnan、Nick\nReineke、\nEmmett、Poe、\nAD1337、\n Dennis、Andrew、\nAndrew MM\n Carl、Max、Amidos、\nLyndsey、Nathan\n +Melos想感谢:\n\n母亲和父亲的长期支持。\n\nSandy\n\n许多TIGSourcers以及\n其他与我们交流过的开发者!\n\nMarina,\n为整个游戏的开发作出了\n不可估量的付出。 +Adobe、Adam\nSaltsman、\nFlashDevelop开发者、\nREAPER开发者、\nDAME制作者\nDesura、\nGamersgate\nIndieDB、\nTIGSource\n\n\n以及其他支持我的朋友们\n感谢你们!!\n\n最后,我想感谢\nTina Chen\n我一直以来的朋友\n她不仅给予我长期支持\n还介绍我与Marina相识。 +Marina想感谢\n\nColin Meloy,\n扩展了我的词汇量\n\nTsugumo,问我\n“你想要成为一位像素艺术家吗”?\n\n我的家人,\n给予我支持与食物。\n\nDaniel,作为一名\n\"独立游戏开发者\"\n,一直伴随着我成长。 +Mo,给予我充分的信任。\n\nTina,\n介绍我与Melos认识。\n\nMelos,和我一同制作游戏\n并且给予我信任。 +演员表\n----\n\n\n史莱姆\n\n\n烦恼之物\n\n\n呼呼\n\n\n谢尔迪\n\n\n希尔 +搬运者\n\n\n开开关关\n\n\n四射\n\n\砍伐者\n\n\n流氓\n +狗\n\n\n青蛙\n\n\n旋转体\n\n\n人\n\n\n墙\n\n +老鼠\n\n\n气态人\n\n\n银鱼\n\n\n冲撞者\n\n\n翻滚者\n\n\n看守人\n\n +清洁女工\n\n\n爆炸植物\n\n\n管理者\n\n\n +狮子\n\n\n扭曲\n\n\n火焰柱\n\n\n仆人\n亚瑟\n哈韦拉 +追随者\n\n\n爱德华\n\n\n渔夫\n\n\n红沃克\n\n休斯 +兔子\n\n\n黏黏\n\n\n店主\n\n苗小团儿\n\n兰克\n\n戈德曼 +胸腔\n\n詹姆斯\n\n蘑菇\n\n克里克森\n\n石人\n\n居民 +追踪者\n\n\n实体\n\n\n空间面\n\n\方块王 +扬\n\n\n麦卓\n\n\n贤者\n\n\n荆棘 +我们要感谢的还有\n亲爱的你!\n谢谢你玩我们的游戏!\n\n\n希望你喜欢它。 +\n\n\n\n\n\n\n\n +现在,你可以使用调换功能\n无拘无束地探索\n扬的世界。\n + end scene + + scene elevator +#Floor? +要去几楼呢? +1\n +2\n +3\n +4\n +#Cancel +取消 + end scene + end area +end npc + +# Tell the python script you're done. +DONE diff --git a/intra/source/data/dialogue_jp.txt b/intra/source/data/dialogue_jp.txt new file mode 100644 index 0000000..eecb11f --- /dev/null +++ b/intra/source/data/dialogue_jp.txt @@ -0,0 +1,2396 @@ + +# +# +# 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +音楽好きなら,ターミナルに話しかけてみよう! +#Like music? Talk to that terminal! +イタイの好きなら,南へ行ってみよう! +#Like pain? Head on down south! + end scene + end area +end npc + + +# +# +# 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +サーカスの団員が落ちそうだ! 安全ネットはどこに? +#That acrobat is losing balance! Where is the safety net? +... + end scene + scene holyshit + +ウワーー +#WOOAH + end scene + end area +end npc + + +# +# +# 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +ライオンたちがジャグラーに近づいてる! +#The lions are closing in on that juggler! +... + end scene + end area +end npc + + +# +# +# 'briar' + +npc briar + area GO + scene before_fight +ブライア:ボクはねヤング つかれたんだ 同じ事のくり返し 同じ夢のくり返し... 終わらない悪夢だ +#Briar:I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +ブライア:... +#Briar:... +ブライア:永遠に変わらないんだよ ヤング ずっとこのままなんだ +#Briar:It’s not going to change, Young. This is all we’ll ever be. + end scene + scene after_fight + +ブライア:さよならだ ヤング +#Briar:Goodbye, Young. + end scene + scene final + +ブライア:おいおい ヤング +#Briar:Dude, Young. +ブライア:ほら足動かして 手もだ オレがいないと何にもできないのかよ! +#Briar:Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +ブライア:ほら 行こうぜ サンドイッチかなんか食おう +#Briar:Well, come on, let’s go get a sandwich or something. +賢者:まあ... 及第点だよ... 次に会うまではな +# Sage:You... you did adequately. Until we meet again. + end scene + end area +end npc + + +# +# +# 'sage' +npc sage + area BLANK + scene intro +なぞの声:こほん... ヤングよ... 私の声が聞こえるかね? ^もしもーし! お 聞こえるようだね... いいかい 間もなくキミは目をさます そうしたら 矢印キーで歩き回れるはずだ +#Mysterious voice:Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. + +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +人と話したりモノを使ったりするには \' +#You will press the \' +\' キーを押すように +#\' key to interact with objects and people around you. +それからメニューを開くには \' +#And you will press the \' +\' キーだ ここでは自分や世界についての情報が見られる +#\' key to access the menu, which will provide you with information about yourself and your surroundings. + end scene + end area + area GO + + scene posthappy_sage + + +ヤング... 私はただキミのためにすべてを正したかったのだ +#Young... I just wanted to fix everything for you. +キミは... もっとうまくやってくれることをねがうよ +#I hope... I hope you can do better than me. + end scene + scene posthappy_mitra + +ヤング... がんばってね +#Good luck, Young. +賢者の言ったこと それなりに合ってる わたしはすべてがステキで完ぺきであってほしくて そのせいで ときには現実だって無視してた +#Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +ブライアを助けるために何するべきかなんて わからない 世界のしくみも...ここが色々おかしく見える原因だって...でもねヤング わたしはキミの友だちになりたいよ +#I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +キミはたたかってる 分かろうとしてるじゃない 早くカイケツできるといいね +#You are fighting, Young. You are trying to understand. I hope you can work things out. + end scene + scene one +TOP +賢者:ヤングよ... 私からのさいごのけいこくだ... ん?なんだ だれだ? +#Sage:Young... this is my final warning... wait, who is that? +ミトラ:わたしはミトラっていうの こちらはわたしの自転車でウェアズ! +#Mitra:My name is Mitra, and this is my bike, Wares! +賢者:自転車の名前など聞いておらんよ 知らないかおだな ここで何をしている? +#Sage:I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +ミトラ:友だちのヤングを助けにきたのよ +#Mitra:I’m here to help my friend, Young.. +賢者:ヤングに友だちなどおらんよ ブライアもおらんというのに ヤングにいらぬことを吹きこむのなら私の世界から出て行ってもらおう! +#Sage:Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +ミトラ:どういうイミ? わたしとウェアズは -- +#Mitra:What do you mean? Wares and I-- +賢者:アホみたいな自転車のことは 聞いておらんと言っている!!! +#Sage:SHUT UP ABOUT YOUR STUPID BICYCLE!!! + end scene + scene hit + +TOP +賢者:... +#Sage:... +ミトラ:ヤング! 大丈夫?! ウェアズのために...ありがとう... さあ このろくでもない場所を おわらせちゃって! キミならできるよ! +#Mitra:Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +ミトラ:ウェアズ!!!! +#Mitra:Wares!!! +ミトラ:ウェアズ...... +#Mitra:Wares... +ミトラ:ちょっとフードのヒト! アナタがなにさまか知らないけど わたしたちのことはほっといてよ! +#Mitra:Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +賢者:きさまがヤングの友だちだと? ヤングは本当は完ぺきで 最後には何もかもうまくいくとウソをつくことが友だちだとでも? そうか いいだろう それがお前の望みだというのなら 勝手にすればいい さっさと失せるがいい +#Sage:You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +賢者:\"友だち\"と話せばよかろう +#Sage:Go talk to your friend. +ミトラ:わたしたちはただベストを尽くしてるだけなのに... +#Mitra:We're just doing the best we can... + end scene + end area + area NEXUS + scene enter_nexus + + +TOP +フードをかぶった男:さてと そろそろ時間かな ええと...^その...^ やあヤング! 私は賢者 まあ村の長老だ 君に来てもらったのは他でもない 実はセカイに広まった\"クラヤミ\"が 伝説のブライアをさがしているのだ その力を邪悪なことに使うためにね キミにはクラヤミよりも先にブライアを見つけて 守ってほしい +#Cloaked Man:Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +さあ 左に使えるようになったポータルがある そこから冒険に出かけなさい +#Enter the active portal on your left to begin your quest. +ハァ... 何だってまだ うろついてるんだね 早くポータルから出かけてくれ ブライアの ひいては世界の ききだというのに! +#*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +LOOP +さあ さっさと行かんか! +#Just go in the damn door! + end scene + +# After entering STREET for the first time + + scene after_ent_str +どうしたのだ?早く進みたまえ +#Why are you still here? + end scene + +# After finishing BEDROOM + scene after_bed +いいぞ ヤング そのようなカギは 他にもあるはず すべてさがし出すんだ +#Continue on, Young. That key you have found, there may be others like it - seek them out. +さあヤング この世界を歩きつくすのだ \"クラヤミ\"を止めるにはそれしかないのだから +#Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. + end scene + +# After finishing first 3 dungeons + scene before_windmill +その3つのカギがあれば \"ザ ランド\"のさらに おくまで 歩みを進められるだろう +#Take those three keys, Young, and unlock the way to the deeper realms of The Land. + end scene + +#After windmill, but disappears after Sage fight + scene after_windmill +たのんだ通りにやってくれたようだね ヤング だがまだザ ランドでやるべき事は残ってる ザ ランドをくまなく冒険し より多くを成しとげれば... ブライアにまた近づくことになるかもしれん +#You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. + end scene + scene all_card_first + +フム エリアにあるカードをすべて集めたようだね ポータルの上にある宝石が赤くかがやくのは カードを集めた あかし なのだ +#Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. + end scene + end area + area OVERWORLD + + scene bedroom_entrance +賢者:間もなくキミは 力をためされることになるだろう この寺院を生き抜くには 力と知性の両方が求められる さて もう武器は手に入れたかね? +#Sage:Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? + +# Young swipes a few times +ハァ?... ちがっ いや もちろんホウキだとも! えーっと... まさに言い伝えの通りだ +#Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +... 何でよりによってゴニョゴニョ... おい! 何を突っ立っているだね! +#*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +LOOP +気を引き締めてな ヤング +#Keep your wits about you, Young. + end scene + end area + area BEDROOM + + scene after_boss + +# Sage fades into room. +賢者:キミはまだ とてもよわい クラヤミからブライアを守るには 己の恐怖を克服しなければならん そこのハコに入っているようなカードは キミの成長のあかしだ たびの間は できるだけ集めるようにしなさい +#Sage:At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +それからカギ これも大事だ カギは他にもあるから よくさがしなさい ああ それからメニューの\"マップ\"からは寺院の入り口までテレポートできる さあ先をいそぎなさい +#That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +寺院庭園の東と南にすすめば カギがやくだつ 場所があるだろう +#Travel East and South through the temple grounds... you will find a use for that key. +LOOP +何だ? 私にくっついて ゲートにもぐりこもうとでも? +#What, do you want a piggy back ride to the gate or something?? + end scene + end area + area TERMINAL + + scene before_fight +なぜ言うことを聞かない! バカみたいに突っ込めば ブライアとザ ランドを危険にさらすだけなのだぞ! これまでの じゅんびもオシャカだ! すまんがヤング キミが話を聞かぬなら 別の方法で聞かせるしかないようだ +#Sage:Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... + end scene + scene after_fight +賢者:ヤング... こんなハズではなかったのだ... 私はただ キミにより良い人間になって欲しかった ブライアを助けられるようになって欲しかった しかしすべては くだらぬゲームにすぎない... もう私には キミがブライアのもとへ行くのを止められぬ すべてが じごくになったとき 私が今言ったことを思い出すといい +#Sage:Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. + end scene + scene entrance +賢者:やあ ヤングよ キミがよりつよく よりかしこくなったとき ブライアへとつづくこの道は開かれるだろう +#Sage:Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +賢者:だが今はまだ早い まずは\"ザ ランド\"にのこる試練を のりこえねばな +#Sage:You’re not ready Young, first you must face more trials in The Land. +賢者:ずいぶん成長したな ヤングよ しかしこの門をくぐるには カードが36枚はひつようだぞ +#Sage:You have made progress, Young, but you must collect at least 36 cards to pass this gate. + end scene + +# non idlnig stuff + scene etc +賢者:ううむ...フム... 36枚以上カードを集めてきたと? しかし本当の試練に立ち向かうには まだ早い気がせんでもない... そうだ... 門に書いてある数字も...36じゃないし...\n...\n......\nほら門には92枚ひつようって書いてあるな! +#Sage:Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +賢者:ヤング 行ってはならん まだ早いのだ! ブライアも ザ ランドも 早まってしまっては ぜんぶ おわってしまう! +#Sage:Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! + end scene + end area + area REDCAVE + + + + scene one +TOP +賢者:見事だったぞ ヤング モンスターを倒すだけでなく 己の恐怖にも 打ち勝ったのだから! +#Sage:Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +賢者:もちろん道のりはまだ長い ザ ランドのぼうけんは進んでいるかね? +#Sage:Of course, you still have a long way to go. Have you been exploring The Land? + end scene + end area + area CROWD + + scene one +賢者:見事だったよ ヤング しかし しれんはまだまだ続く 気をぬかんようにな +#Sage:Well done, Young. However, there are still trials to face. Do not let your guard down. +賢者:ところでカギはぜんぶ集まったかね? まだならビーチに行ってみなさい +#Sage:Have you found all of the keys yet, Young? If not, go to the beach. + end scene + end area + end npc + + + + +npc cliff_dog + area CLIFF + scene top_left +ぼくはほかの犬とはちがうよ! ワフワフ おそったりしないから... +#I'm not like the others! *woof* I won't harm you... +ぼくは ちょうわとしずけさを好むからね +#It is a quiet existence up here. +きみの匂い スイスチャードのはっぱ みたいだね +#You smell like swiss chard. +LOOP +わんわん! +#*woof* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +やったわね ヤング! ついに\"クラヤミ\"をたおしたのね! ほら見てこの場所 本当にうつくしいわ! +#You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +本当に美しいわ... +#So beautiful... + end scene + scene dump + +ああ良かった! 無事だったか! あの雪だったから うもれちまったのかと思ったよ... それにしてもココは気が めいるよなあ! まいるぜ! +#Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +アハハハ ウハハハハハ アヒャヒャヒャヒャヒャヒャ! +#Hahaha. Hahahahaha. HAHAHAHAHAHAHA! + end scene + scene drink + +キミかわいいねー 一杯おごっちゃうよ! +#Hey sexy, I’ll buy you a drink! +もう一杯どうだい このクソヤロー! ハハハハハ! +#Have another drink, you little shit! Hahaha! + end scene + scene hot + +ここ クッソあつい... ホット!ホット! 汗ダラダラ... +#Fuck, it’s hot here... I’m so hot... and sweatyyy... +あー チキショー ワークアウトするとムラムラしてくる! +#Damn, working out makes me horny! + end scene + scene gold + +この世界って金で できてるって知ってた? かね じゃなくて きん で! そこのレンガひとつ もらって かけおちしましょ 一生あそんでくらせるわよ! アハーハハハー! +#Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +マジで つったってないで このレンガ外すの手伝ってよ! +#Seriously, why are you just standing there? Help me jack this brick! + end scene + scene briar + +???:ヤング... ついやにったな! よやうく たかすった! もにうどと もにとは もらどんぞ!!!! +#???:Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! + end scene + end area +end npc + + +# +# +# 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +どーいてー! +#HEADS UP! + +#Mitra swerves to avoid you and crashes +ごめんね... ちょっととばしすぎてたわ... あれ 見ないカオね! キミも旅行中? へ? くらやみからブライアを守る...?^えーっと 何の話かサッパリだけど なんかカッコイイんじゃない! +#Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +わたしはこのへんをウェアズで走ってたの え...? ちがうよ服のハナシじゃなくて わたしの自転車の名前! +#I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! + +#Plays if you talk 3 times, or if you leave the screen +きっとまた どこかで会うわよね ブライアのハナシを聞いたらちゃんとおぼえとくね +#Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. + +#Mitra bikes away + end scene + end area + area BLUE + scene one +よっし! ウェアズ! いっくよーーー! +#HEADS UP! All right Wares, let’s do this! +ドォーーン! +#Annnd presto! +ヤング がんばって! わたしたちも ついてるよ! +#Keep going, Young, we’ve got your back! + end scene + end area + area FIELDS + + scene init +わたしのコト 覚えてる? この前は自己紹介してなかったね 自転車のウェアズだけ紹介して... わたしはミトラっていうの +#Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +わたしのコト 覚えてる? この前は自己紹介してなかったね わたしはミトラ それからこのハンサムでカッコイイ自転車はウェアズっていうの +#Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +LOOP +ミトラ:で ヤングは元気だった? へ? なんで名前を知ってるかって? フシギ? えっと その服 背中に名前が書いてあったから +#Mitra:So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +ミトラ:それじゃ またね!ヤング +#Mitra:See you around, Young! + end scene + scene quest_event +ミトラ:あ 今思い出した... 誰かがね 何かを先に見つけないととか言ってたの 何のハナシかは分からなかったんだけど とにかく山に行くって言ってた すごく急いでたよ +#Mitra:Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. + end scene + +# Hints for the game - not cards + + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) + +# 0 ignore this +んー 何でもない +#Nothing. + +# 1. Beach hint (no dungeons finshed) +ん? まよったの? ビーチのほうは もう行ってみた? だれか助けてくれるかもよ カギの使える場所もありそうだけど ほかのカギがいるかもね +#Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +# 2. Forest hint (no dungeons finished) +ん? まよったの? 東にある森はもう行ってみた? あそこ カギの使える場所もありそうだけど ほかのカギがいるかもね +#Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +# 3. Windmill hint +わぁ カギそろったのね! そういえば南東に カギがかかった門がいくつかあったような... そのカギで開けられるんじゃない? +#Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +# 4. Generic hint to go past statues +ふうりょくタービンを動かしたの見たよー! すごいね! あれだけ強いカゼだとさ 自然への影響とかもありそうじゃない? +#Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +# 5. finished 6 bosses, all 36... +やっほ ヤング! わわ カードいっぱい集めたねえ! ところでこれって何につかえるのかな? 売ったらいいおかねになりそうだよね +#Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +# 6. hints for go things +わー そのホウキの新しいアタッチメント 何? え? 世界のありかたを...変える? ヤング それなんかコワイよ でも何でもってわけじゃ ないみたいで良かった きっと ザ ランドでもホントにおくでしか使えないんじゃないかな +#What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +# 7. crowd finished but not redcave +ジャンプシューズのちょうしは どう? ケッコウ良いでしょ? わたしも新しいクツ気に入ってるよ ウェアズとの一体感もさらにアップしたし! +#How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! + +#8. redcave finished but not crowd +わあヤング またカギ見つけたの? ウェアズもその色好きだって言ってる! それで カギが使えるトビラとかは見つかった? +#Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院のあたりはさがしてみた? +#Mitra:Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +ミトラ:あ ヤング カードさがしてるの?\nそういえば見通せし者の寺院のうらぐちに迷路があるって聞いたなあ +#Mitra:Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかの近くで何か見つかるかもよ +#Mitra:Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院にさ てきが一杯の部屋 なかった? +#Mitra:Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +ミトラ:あ ヤング カードさがしてるの?\n見通せし者の寺院はくまなく さがしてみた? +#Mitra:Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +ミトラ:あ ヤング カードさがしてるの?\n見通せし者のすみかにウラぐちあったでしょ?あの近くにある はいきょ はさがしてみた? +#Mitra:Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +ミトラ:あ ヤング カードさがしてるの?\nキミのご近所さんが 何か知ってるかもよ? +#Mitra:Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +ミトラ:あ ヤング カードさがしてるの?\nキミのアパートに住んでるヒト,何か かくしてるみたいだけど... +#Mitra:Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +ミトラ:あ ヤング カードさがしてるの?\nキミのアパートの入口近く...よーくさがしてみたら!? +#Mitra:Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +ミトラ:あ ヤング カードさがしてるの?\nキミのアパート ホントにすみずみまで さがしてみた? +#Mitra:Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +ミトラ:あ ヤング カードさがしてるの?\nここから南に行くと 島があるみたいなの わたしは行ったことないけど 行ってみたらどう? +#Mitra:Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +ミトラ:あ ヤング カードさがしてるの?\n川ぞいには 色んなものが あるみたいよ よーくさがしてみたらどうかな! +#Mitra:Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +ミトラ:あ ヤング カードさがしてるの?\nふうしゃの近くに 誰かがカードを置いていったって聞いたけどなあ +#Mitra:Hey Young, looking for a card?\nI know someone left a card near the windmill. +ミトラ:あ ヤング カードさがしてるの?\n森の中にある川のあたり さがしてみるといいよ... +#Mitra:Hey Young, looking for a card?\nLook around the rivers in the forest... +ミトラ:あ ヤング カードさがしてるの?\n山のふもとあたりは もう回ってみた? +#Mitra:Hey Young, looking for a card?\nTry poking around the base of the mountains. +ミトラ:あ ヤング カードさがしてるの?\n山の頂上って 何かありそうよね +#Mitra:Hey Young, looking for a card?\nTry going to the summit of the mountains. +ミトラ:あ ヤング カードさがしてるの?\nビーチのはしっこって 何かありそうよね +#Mitra:Hey Young, looking for a card?\nThe far end of the beach may hold something. +ミトラ:あ ヤング カードさがしてるの?\n赤い森をさんぽしてみるってのはどうかな? +#Mitra:Hey Young, looking for a card?\nTake a walk in the crimson woods. +ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 赤のどうくつのひとつに カギのかかったトビラがいっぱいあるトコロあったよねえ +#Mitra:Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつはもうチェックした? 川に沿って進んでみるといいよ! +#Mitra:Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end! +ミトラ:あ ヤング カードさがしてるの?\n北にある赤のどうくつから 川の源泉までさかのぼってみたら? +#Mitra:Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +ミトラ:あ ヤング カードさがしてるの?\nえっと... やみの迷宮は すみずみまで回ったのよね? +#Mitra:Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +ミトラ:あ ヤング カードさがしてるの?\nそういえばさ 火がわんさか吹き出してる道あったじゃない? あのおくとか ゼッタイ何かありそうだよね! +#Mitra:Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +ミトラ:あ ヤング カードさがしてるの?\nサーカスの団員たち 何かかくしているみたいだったけど あのへんはさがしてみた? +#Mitra:Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +ミトラ:あ ヤング カードさがしてるの?\n男女の二人組が落っこちた大きな穴あったじゃない?あの近くはさがしてみた? +#Mitra:Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +ミトラ:あ ヤング カードさがしてるの?\n穴の近くでグルグルしてたあのカップル ゼッタイ何かかくしてるよ +#Mitra:Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +ミトラ:あ ヤング カードさがしてるの?\n深い谷とか いかにも何かありそうよね とくに山にあるどうくつとか! +#Mitra:Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +ミトラ:あ ヤング カードさがしてるの?\n山にあるどうくつの いちばん高いところとか もう行ってみた? +#Mitra:Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +ミトラ:あ ヤング カードさがしてるの?\n山にあるあのどうくつ... あのおくって何があるのかな? +#Mitra:Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +ミトラ:あ ヤング カードさがしてるの?\nあの変な空間にいるカラフルなキューブとか ゼッタイ何かかくしてるよ! +#Mitra:Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +ミトラ:あ ヤング カードさがしてるの?\nあのナゾ空間にいるモノクロのキューブとはもう話した? あのキューブなら何か知ってるんじゃないかな +#Mitra:Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +ミトラ:あ ヤング カードさがしてるの?\nあのホテルのいちばん上のフロアさ 高級感はなかったけど 何か かくされてるかもよ! +#Mitra:Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +ミトラ:あ ヤング カードさがしてるの?\nホテル3かいの部屋はくまなくさがした? +#Mitra:Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +ミトラ:あ ヤング カードさがしてるの?\nホテルの2かいフロアには誰か何か置いてきてると思うんだけどなあ +#Mitra:Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +ミトラ:あ ヤング カードさがしてるの?\nホテルのオーナーさん,キミに何か置いていってくれたかもよ! +#Mitra:Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +ミトラ:あ ヤング カードさがしてるの?\n北西のこわれたハシのとこ あのへんてアヤシイよね! +#Mitra:Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +# and a bonus one if for some reason you make it this far without finding any... +...えー!? い ち ま い も カード見つけてないの? ヤング そんなの絶対 おかしいよ!人生たまには冒険しなきゃ!ハコをあけてみるとかさ! +#...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? + end scene + +#General random stuff + + scene general_banter +そういえば 山で何かさがしてたヒトには会えたの? +#Did you find that guy who was looking for something in the mountains? +ウェアズのみょうじってねー...ウォーリーっていうの ウェアーズ・ウォーリー なんちゃって!ハハン 自転車に みょうじはないから! +#Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +ねねヤング U字ロック売ってるとこ知らない? ウェアズをしばりつけたくは ないけど 自転車のとうなん 最近多いらしいから... +#Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +ところでブライアって何なの? 古代文明の失われた いさんとか そういうの? +#So what is The Briar? Some sort of ancient artifact from a lost culture? +クラヤミが迫ってるとかって話 全然聞かないのよね みんな自分のコトで忙しいってコトなのかな +#I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +ヤング 今度会ったら言おうと思ってたんだけど キミのヘアスタイルって ステキよ +#Hey Young, I just wanted to tell you... your hair is awesome. + end scene + end area + +end npc + + +# +# +# Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +石像:村の長老というのは名前だけ 村などないし 長老でもない +#Statue:The Village Elder in name only, for he is neither. + end scene + end area + area OVERWORLD + + scene bedroom_entrance +石像:ホウキについての言い伝え 用具入れロッカーに入っているとか +#Statue:I’ve seen a broom in a legend... it was on the map of a janitor closet. + end scene + end area + area BEDROOM + + scene after_boss +石像:冒険においてカード集めはとても大事 カードはいろいろ役に立つ クレジットとか みぶんしょうめいとか +#Statue:Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. + end scene + end area + area REDCAVE + scene one +石像:見事だったぞ 賢者 かんしゃくを起こさず 自己陶酔もしないで ちゃんと定型文みたいなセリフを言ったのだから! +#Statue:Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! + end scene + end area + area TERMINAL + scene one +キミが より冷たく けれども より甘くなったとき キミはアイスクリームかもしれんだろう +#When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! + end scene + end area +end npc + + +# +# +# sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced + +# This line must be played once before anything else can +エドワード:トイレにかがみを取り付けてもらったときにさ 中にかくしカメラがついてるんじゃないかって不安で 不安で とにかくしらべまくって すきまというすきまに オイルソープをすり込んだんだ 回路をショートさせようと思って でも 当然というか カメラなんて入ってなかったんだけど +#Edward:Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +LOOP +エドワード:ここは見通せし者をまつる寺院なんだ なんでここに来たのかよく 覚えてないけど とにかく こわくて 中には入れないんだ +#Edward:This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. + end scene + scene bedroom_not_done +エドワード:お困りかい? たぶんそうだよね キミはホウキしか もってなくて ホウキはほこりを移動させる道具だ だよね? +#Edward:Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. + end scene + scene bedroom_done +エドワード:見通せし者をたおしたって? ハハッ ちがうよ キミはいわば すきまにオイルソープすり込んだ だけなんだ +#Edward:You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. + end scene + end area +end npc + + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +おお ヤング なんとかわいらしい えいゆうごっこかね だがね 私はキミが\"ザ ランド\"に来てからの行ないをすべて知っている それから...この世界で私以上に正直なものはいない だれを信頼するのか よく考えることだね +#Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! + end scene + scene after_fight +ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる この先の冒険...私からのアドバイスを よくかみしめることだね +#I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". + end scene + end area +end npc + +# rock (Rock with words) +npc rock + area BEDROOM + scene one +岩:周辺視野はアクマの巣 +#Rock:Peripheral vision is the hive of demons. + end scene + scene two +岩:次の仕事:ネクサスへの移動手段を建設する 現在の状況:中断 - 見通せし者から予算を得られず続行不可 今後もあの 謎のポータルを使用し続けるしか方法なし +#Rock:To-do:Construct method of transportation to Nexus. Progress:Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. + end scene + scene three +岩:一人だけ残されてしまった トンネルの作業はじゅんちょうだ 少なくとも 毎日少しずつはすすんでいる +#Rock:I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. + end scene + end area + area BLUE + scene one +ダムを開けるハンドル +#This wheel is used to lift the dam. + end scene + end area + area CIRCUS + scene one +1957年6月24日:空中ブランコこわれる アリス・ラトガーズが地面に落ちる 両足のスネを骨折 +#June 24th, 1957:Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. + end scene + scene two +1957年7月17日:道化師7人が引退 深刻な呼吸器の病 ランドブレンド社のメイク道具が原因と思われるが 公式なそうさは行なわれず +#July 17th, 1957:Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. + end scene + scene three +1957年7月21日:オリの誤作動あり 調教前のライオンにおそわれ顔と体に深いキズを負った 生きてはいるがカガミを見るのが こわい +#July 21st, 1957:Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. + end scene + scene four +1957年8月5日:夢の中で 顔だけの石像と話す 目を光らせたそれは 私たちの存在理由を話すと 次にいたみから解き放つと言った +#August 5th, 1957:In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. + end scene + scene five +1957年8月7日:見通せし者が明かしてくださった真実 それを受け入れるまで どれだけの者が苦しむことになるのか +#August 7th, 1957:How many of us will suffer before we accept the truth of the Seeing One? + end scene + scene six + +1957年8月8日:ついに決めた ついてくると言ってくれる者も何人かいる この日記もこれで最後だろう 見通せし者のご加護があらんことを +#August 8th, 1957:I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. + end scene + end area + area CLIFF + scene one +(知らない文字で何かが書いてある) +#(Indecipherable markings) + end scene + scene two +2010年12月7日(名前はよめない):何もない場所じゃないか!このろくでもない岩しかない! +#December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! + end scene + scene three +キケン! このどうくつは せいびされていません +#Danger! This cave is unexplored. + end scene + scene four +このガケははるか上まで伸びているが その先がどうなっているかを見たことはないなあ +#These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. + end scene + end area + area CROWD + + + scene one +岩:どうやって? +#Rock:How? + end scene + scene two +岩:キケン! ガケあり 飛び込みは自己責任で +#Rock:Warning! Vertical drop, jump at your own risk. + end scene + end area + area DEBUG + + scene one +これはカードゲートの仮アニメーションとして つかってたものなんだ 近づいたりはなれたりすると ゲートが開いたり閉じたりするよ +#This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +なんでコレ使わなかったのかは忘れちゃったな... ドラマチックすぎたとかかな +#I forget why we ended up scrapping it. Perhaps too dramatic. + end scene + scene two + +これは色んなタイルのレイヤーとかコリジョンをためしたところ! 一方通行タイルを両サイドに置いたりしていじってたんだけど 上手くいかなかったから ボツにした... とかだった気がする +#Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +これをつかわなかったのは デザインをシンプルにしたからなんだ ゲームを完成させるには大事なことだったんだよ +#There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. + end scene + scene three + +さいしょはてきを倒すとカギを手に入れられたんだけど けっきょくボツにしたんだ それなりに気に入っていたんだけど +#Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +他にもチャレンジゲートっていうアイデアもあったんだ これはダメージを食らわずに試練をクリアできた ときだけ開くってやつだったっけ +#Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +いちじは 全部のダンジョンにつけて HPをなくしちゃおうかみたいな話もあったんだけど けっきょく なんいどが高すぎてダメだったんだ! +#We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! + end scene + scene four +ろうやです! +#PRISON!!! +助けて! +#Save us!!! +おねがい! +#Please! + end scene + scene five +デバッグワールドへようこそ!ここはザ ランドではないので ゲームのストーリーとは(9割がた)関係ないけれど ゆっくりしていってね +#Welcome to the DEBUG WORLD! You've stepped outside of The Land, so consider this world (90 PER-CENT) Non-canon. Anyways. +マップのタイルセットが完成するまでは こういう仮タイルでマップを仮組みしていたんだ このゲームのダンジョンは 実はぜんぶそうやって仮組みして それからジョンが本番用タイルで置きかえていったんだよ +#Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. + end scene + scene six +若い女性 +#fille + end scene + end area + area DRAWER + + scene five +- 記録保存庫 - +#-ARCHIVES- +注意してお進みください +#PROCEED WITH CAUTION + end scene + scene four +西:裂け目->現実へ! 不動産価値ひくめ ハリケーンあり 年代物 荒れほうだい リラックス効果 +#West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. + end scene + scene three +見通せし者は おぼえているかぎりでばばばば......ヤー ヤッパリ ウチハ オチツクネー +#The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. + end scene + scene two +れいぞうしつ\n\n^ -- MGMT +#COLD STORAGE\n\n^ -- THE MGMT + end scene + scene one +つづきから +#CONTINUE + end scene + end area + area FIELDS + + scene one +西:ビーチ\n\n東:森\n\n南東:\n 熱帯雨林\n\n北:\n寺院庭園\n\n北の果て:ふかい谷 +#West:Beach\n\nEast:Forest\n\nSoutheast:\n Rainy Area\n\nNorth:\nTemple Grounds\n\nNorthwest:Chasm + end scene + end area + area FOREST + + scene one +西:ランド湖\n南のち東:がけ +#West:Land Lake\nSouth, then east:Cliffs + end scene + scene two +森の小さなくつろぎの池 ちょっとひといき いかがです? +#Relaxation pond. Stay a while, we know you have the time. + end scene + scene three +おそらく私は このへんぴな場所にずっと いるんだろう +#I'm afraid I may be stuck on this tiny corner forever. + end scene + scene four +東:がけ +#East:Cliffs + end scene + end area + area GO + + scene one + 灰色のガーディアンタイルを そのスピリットカラーに対応する色の石で置きかえれば 道は開けるだろう +#The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. + end scene + scene two + +青い石像が動く時\n新たな道が開ける\nガケを抜けてきみょうな次元へ\nその先にはホテルがある\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所を取り仕切っているのは?\"\nこれほど人の魂に囲まれているのに\nぼくはこどくを感じる +#When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. + end scene + scene three + +赤くさびた像が動いた\nおくへと つづく道が開く\nその先には迷路のようなダンジョンがある\nそしてサーカスへ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"この場所から逃げるために 命をすてたのは誰だ?\"\nぼくはいたみを恐れる 他の人と同じように\nでも それよりも 死が怖い +#The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. + end scene + scene four + +にぶいかがやきを放つ緑色の像が動いた\nさらにおくへと進む\nこぢんまりとした町を抜けて\nとある住宅へ\n\n\n\"見守る者とは誰だ?\"ぼくはたずねる\n\"星になぐさめを求めるのは誰だ?\"\n誰かに見られている気がする\nそしてそれは やさしい星々のそれではない +#The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. + end scene + end area + area BLANK + +#initial entrance from windmill + scene one +岩:ここは未開の地 ザ ランドの外側 +#Rock:This is unclaimed territory - not yet a part of The Land. + end scene + +#concentric circles + scene two +岩:これら^円と私は^やくそく^同心円に^全力でおわらせて...^...円が^ ビビービー... +#Rock:These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. + end scene + +#islands + scene three +岩:見ててくれ^ -...でも僕はいつも^ - キミの歩みを^ - 再びキミがここに ^ - 現れてくれたらと +#Rock:Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! + end scene + +#mazeish place, not near the portal + scene four +岩:ここから見下ろして^ - 私は気がついた^ - ここから見るあなたは^私は彼を愛している^ - 実は何も見えない +#Rock:Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. + end scene + +#left part of the 48 gate + scene five +岩:申し訳ない - ^でもそうだね 僕らは -^このちらかった -^連絡は取ろうね -^でもポータルは^ - そしたら僕もいけんを -^君をザ ランドに帰すよ +#Rock:My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. + end scene + end area + area NEXUS + + + scene one +人によっては 何度も話すと ちがうことを言ってくれる ことがある +#Sometimes if you talk to people multiple times, they have new things to say. +岩はちがうけど 岩は いつも 同じ +#But not rocks. Rocks don’t do that. + end scene + +#before 49 card agate + scene two +岩:本当に惜しかったんだ ああ もしも... +#Rock:So close! If only... + end scene + +#door that goes nowhere + scene three +岩:好奇心てのはすばらしいね +#Rock:Curiosity is a great thing. + end scene + +#below treasure box + scene four +岩:おおっ...!? +#Rock:Oh!...? + end scene + scene five +コンピューターたんまつには メールが開かれている 画面が一部こわれているので一部のテキストは よめない メールの中身は...\" やあ ヤング!どうやら [...] 15番目のカード [...] から さけたほうが [...] 考えてみてほしい さて じゅんびはいいかい? 起きてくれ\" +#The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads:\"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" + end scene + end area + area OVERWORLD + + + scene one +岩:岩に書かれた文字を よんでるなんて 友だち いないの +#I’ll bet you’re reading a rock because you don’t have any friends. + end scene + scene two +岩:オーバーロードステーションへようこそ ザ ランドはお楽しみいただけましたか? +#Rock:Welcome to Overworld Station. We hope you enjoyed your time in The Land. + end scene + scene three +岩:たんけんー はっけんー ぼくのせかーい! +#Rock:An explorer is you! +岩:南には行かないでください 建設中です +#Rock:Please don't go south. It's under construction. + end scene + scene four +岩:5,3にお宝! +#Rock:Treasure in 5,3! + end scene + scene five +岩:おお!見つけたねえ! +#Rock:Haha, gotcha! + end scene + end area + area REDCAVE + + scene one +くずれゆく母の体内に 生まれ落ちた わたしたち +#WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. + end scene + scene two +私たちの母はある時 自らの母をすてて どくのキリの中へと歩み入った +#ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. + end scene + scene three +こんなこと 私たちは のぞんでなかった 母の苦しみの中に 産みおとされることなんて +#WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. + end scene + end area + +# area for redsea + area REDSEA + scene one +岩:状況から考えるに これらの植物はかなり長いあいだ かつどうをていし しているようだ +#Rock:Signs indicate the trees have not been active for an extended period of time. + end scene + scene two +岩:南:???^ 北:??? +#Rock:South:???^ North:??? + end scene + scene three +岩:このちいきのいびつな地形は 先住者の祖先が形作ったものだと言われている +#Rock:The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. + end scene + scene four +岩:かれらは平和的な生物のようだ +#Rock:They appear to be a peaceful species. + end scene + end area + area SPACE +#middle + scene one +油性マジックらしきもので書いてある:\"空間\"と\"時間\"の旅人よ かんげいします あなたが足を踏み入れたのは次元の裂け目 りんせつする\"ヤング\"の世界からはるか はなれた場所 いわばあなたは\"海\"をひとつふたつ こえてきたわけです この場所はいろいろ\"ちがい\"ますが恐れないでください あなたはすぐに元の世界にもどるのですから \"不吉\"あるいは\"危険\"に見えるかもしれませんが恐れないでください ここの住民はみなとても\"フレンドリー\"ですので\n -- MGMT +#Scribbled in what appears to be permanent marker:Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + (メッセージの下には文字が刻まれている)森で迷った ____(よめない)ここに眠る +#(Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (その下にまだメッセージがある)(とにかく南には行きすぎるな) +#(Even further below the message:) (just don't go too far south.) + end scene + +# extra color + scene two +虹に刺された____(よめない)ここに眠る +#Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbow! +ここに書けるようなじっせきがあれば 良かったんだけど +#Would've been better with achievements. + end scene + +#grey graves + scene three +ガケに八つ当たりされちゃったバードここに眠る +#Here lies Burd. The cliffs weren't feeling too friendly. + end scene + scene four +一回も使われなかったバッグ ここに眠る +#Here lies bag. It never had a chance. +大事にされすぎたね! +#Pretentious! + end scene + +# color graves + scene five +サヴィッチここに眠る - ぼくのPCを修理してくれると言ってガレージに来て きゅうくつそうに座り込んで作業しだした 3年後 修理はまだ終わっていなかった そしてかれはコロリと死んでしまった +#Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. + end scene + scene six +とりたてて書くことのない男 デイブ ここに眠る +#Here lies Dave. He wasn't very inspirational. + end scene + end area + + area SUBURB + scene one + ---ヤング タウン---^\nヤングタウンへようこそ 他人とうまくやれない者もいますので\n 移動のさいはご注意ください... ヤングタウンは市長のイン氏による\n 宅地開発政策の一環として90年代に開発された町です 町の名前は市長の\n イン(陰)氏が自らの名前を拒絶し 自ら選んだヤング(陽)と名乗ったことに由来します\n ごゆっくりお過ごしください +#---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + end scene + scene two + 西には伝説の見通せし者の寺院があり 東には我らがイン市長のアパートがあります なお市長のアパートは一般開放されていません 訪れるさいはご注意ください +#To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + end scene + scene three + 5回めの訪問時 イン市長は駐車場の少なさに強い不満をおぼえました この駐車場は市長が感じた駐車場の少なさを表しています イン市長はそれ以来 来訪時にはこの駐車場を使うことがあります +#On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + end scene + scene four + 昔は長い文章書いてたの思い出すなあ 全然まとまりなかったけど! +#I remember the long sentences I used to write. Ha! Fragmented. + end scene + scene five + A DANGEROUS SITUATION + end scene + end area + +# Area for TRAIN (it's actually CELL sorry) + + + area TRAIN + scene one +見通せし者はすべてを知り なんじを悟りへとみちびく者 悟りへの道のりを照らす明かりはない +#The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. + end scene + scene two +見通せし者の示す道から それてはならない たとえ迷路のかたすみに 宝箱があっても +#Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. + end scene + scene three +立ち止まるな +#Move along. + end scene + scene four +チェイサーは らんぼうすると おこり出す +#Do not anger the Chasers with violence. + end scene + end area + area WINDMILL + scene one +かんこうスポット:\"双子の塔\"しばらく前にけんせつされたこの塔からは 遠くの山々まで見渡すことができます 第一の塔は はそんして以来 別の目的に使われるようになりました 第二の塔は いまだ東にあり 天高くそびえています なお東の塔へ続く道は 安全上の理由から 現在ふうさされています +#SCENIC LANDMARK:Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. + end scene + scene two +安全上のお知らせ:^\nこの塔は はそんしていませんが 最上部に次元の裂け目が生じています ちゅういして 広い心をもって すすんでください^\n -- MGMT +#PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT + end scene + end area +end npc + + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +この像は動かせそうにないし 動いてもくれなそうだ +#The statue does not look like it will be moving anytime soon. + end scene + scene two +像は動いたようだ +#The statue has moved. + end scene + end area + area REDCAVE + scene one +この像はしっかり固定されているようだ +#It looks like this statue is firmly in place. + end scene + scene two +像は動いたようだ +#The statue has moved. + end scene + end area + area CROWD + scene one +この像は 動かせそうにない +#This statue does not seem to be movable. + end scene + scene two +像は動いたようだ +#The statue has moved. + end scene + end area +end npc + + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +火は美しい そう思わんかね? だが町のあかりは 星のはなつ火のかがやきを かくしてしまう なげかわしいことだ +#Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. + end scene + scene after_fight +そうかね 星は火のかたまりじゃ ないのかね^キミは細かいな... +#Okay, so stars aren't really made of fire. ^Who gives a shit anyway? + end scene + end area +end npc + +npc cube_king + area SPACE +# kings are supposed to offer info on + scene color +やあ 調子どう? 僕はこのパーティションの支配者であり この空間の成り立ちそのものだよ +#How are you today? I'm the ruler of this partition and interpretation of space. +なんで僕がこの場所の支配者か知りたい? いいけど長い話になるよ てか 超長いよ? じんじょうじゃないくらい長いよ +#You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. +マジで 相当かかるけど いやマジで 忠告はしたからね! 僕すぐ話をだっせんさせちゃうしさあ 多分そこにある宝箱の中身さらってサッサと先進んだほうがいいよ それかチョイ遠いけどあっちのホテルに向かうとか なんでココにつながってるのかは分かんないけど 値段はけっこう安いみたいよ まあココではお金とか意味ないんだけど +#Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. +LOOP +なんで僕が支配者なのかって?^...じつは僕もよく分かんないんだよね ここらの友だちが この空間の現状を考えるとオマエがピッタリだよって言うからやってるんだけど アレかな? ココの支配者ってずっとここに座ってなきゃいけないんだけど キューブって平らな面に置くと安定するじゃない? そういうこと? 分かんないけど +#Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! +あっちの友だちにも やっぱり長所はあるワケ その友だちもいつか支配者になる可能性はあるし 今はできないってだけなのね 僕らってときどき支配者交代するからさ まあそのときは空間のなりたちを変えるわけだけど! たとえば次に定める世界の形によっては ピラミッドさんだか ピラミッドくんが次の支配者になることもあるんよ 彼らが世界にハマる形さえしてればね なりたちを変えるってのはそういう意味なのね アホっぽく聞こえる? まあそうなのかもね でもまあ そういうもんだからしゃあない 世界のなりたちなんて数分とか数時間で変わるしね 長い時間がかかるわけじゃないのよ +#The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. +ともあれ支配者ってのは やっぱ変な気分になるよ 何というか孤立してる感じとか 他人をさけたくなる というかさ +#Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... +...ああ 孤立ってのはちょっと ちがうかな 部分的には合ってるんだけどね じっさい孤立はしてないし 他人も苦手なわけじゃないんだ 僕らはみんな友だちだと思ってるし でもさー みんなココに来ないし 来ても二言三言しか話さないし そういう点では孤立してるなあって思うよね +#...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. +まあ そういう\"どうしてこの空間に僕らが存在してるか\"みたいな話よりさ どうして僕らが友だちなのかのほうが気になるよ +#Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. +まあ今の空間のなりたちでは 僕が支配者やるのがベストってことで なりたちが新しく変わるまでは みんな僕が支配者でいられるように気をつかってくれるし... 物理的にそこに存在してくれる事とかね そういうのは はげみになるよね +#I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. +僕としては それで十分みたいだ まあ一人か二人くらい 支配者の気持ちを理解してくれる友だちがいたらベターだけど でも別に文句言ってるわけじゃないよ! でももしそんな友だちがいたら 支配者が一人じゃない空間とかもありじゃないかって... うわ これすごいアイデアじゃない?! まあ僕が支配者じゃなくなったら 今言ったみたいに ふるまうつもりだよ... できるのかどうかは分かんないけど +#I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. +でも支配者も これ以上はいいかなあ あ そうだ あっちの方向に進むと また似たような空間があるよ まあ匂いはちょっと ちがうだろうけど +#I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. +いやあ でも会えてよかったよ +#It was nice to meet you. +ん? また僕の話ききたいの? +#Oh, you want to hear my story again? +オッケー んじゃ ココにすわっとく +#Okay, sit tight. + end scene + scene gray +やあ ボクはこの空間の支配者なんだー +#Hello there. I'm the ruler of this part of space. +ん? 何? なんでボクがここにいるか知りたいって? マジで言ってる? 説明し始めたら ちょう長いよ? +#What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! +うーん どうしてもって言うならね... ただ それよりホテルに向かったほうがいいとは思うけどね どうしてホテルを建設することにしたのかはサッパリ分かんないけどさ もし税金かかるとか言われたら ぜったい文句言わないと! +#Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! +LOOP +やあ ボクはこの空間の支配者やってるんだ でも空間だけで人を支配してるわけじゃないよ +#Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. +友だちもみんな それぞれの空間で支配者やってるけどさ あいつらも人を支配してはいないんだ そういうイミではみんな孤立してんのよね もちろんお互い話したりはするのよ? だからそういうイミでは全然孤立してないんだけど まあここは ボクが存在する空間のひとつってこと +#Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. +ボクと友だちが支配してる空間には 共通点がたくさんあるんだ 存在する理由とか こうぞう あるいはきょうみ よくぼう そういうものがね よく支配のしかたについても話し合うんだよ +#My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. +ひとつ切ないのは 物理的に会うきかいが ほぼ ないってことかな +#But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. +だから話しあうっていっても 物理的に会ってるわけじゃなくて ホログラムに話しかけるカンジなんだ +#So you're not actually talking to their physical forms, but a representation of them in some holographic form. +そうなんだよ 切ないでしょ? こんなに共通のわだいがあって 助け合いもするのに 会えないんだからさ +#I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. +面と向かって話さないと伝わらない部分て どうしてもあるじゃない? そういうのがねえ... +#There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. +あ 文句言ってるわけじゃないんよ? 話せるだけでもすごくウレシイし! 話せもしなかったら...それこそサイテーじゃん? +#But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. +いやあ 話せてよかったよ キミのほうもうまくいくといいね +#It was nice talking at you, good luck with whatever you're up to. +あれ まだいるの? もう一回話を聞きたいとか そういう系? +#You're still here? I can tell you everything again, if you'd like. + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +クリックソン:来たなイジワル野郎! オメなんか怖くねえぞ! +#Crickson:Hey ya big bully! I’m not afraid of you! +クリックソン:バーカバーカ!オラは逃げたりしねっぞ! さあなぐるなら なぐれー! +#Crickson:Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +クリックソン:アホー!とんまー! やーいやーい! こンの恥知らず! +#Crickson:Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! + end scene + scene thorax +ソラックス:オレはソラックス ハチたちの代弁者\n^ハチのうんめい いつも こんめい\n^はたらきバチが逃げ出したよ コロニー\n^そしてほろびたよ 切ないね 心に! +#Thorax:I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +ソラックス:新種のウイルスか あるいはのうやくか\n^はたまた タイコバエの幼虫のしわざか!\n^ミツバチみんな うごき オカシイな\n^こんな状況 変えなきゃ オワリだ! +#Thorax:Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +ソラックス:オゥケィ オレも原因サッパリ分からねえ\n^じゃあ このMCもたぶんムダじゃねえ?\n^だからってココに 座ってたら 結果はそう ゼツボウです!\n^ならTwitterで!Facebookで!さけぶぜオレらのSOS! +#Thorax:Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +お買いものは こちらで +#Buy my stuff + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ! +#What are you doing here, punk? Get lost! I caught it fair and square! +ぜったい 逃がさないぞ! 何百年たっても ぜったい! +#I won’t let it go! Not in a million years! + end scene + scene inside +何だよう またおどかすつもりかよう? +#Oh, did you come here to terrorize me some more? +どうせオメーだって ネコがモフモフでかわいいから 味方してるんだろう +#You’re just siding with the cats because they are cute and furry. + end scene + scene etc +TOP +何見てる? あっち行け! 正々堂々と捕まえたんだから いいだろ!^ えっ ウワッ!^ それって...?^ ネコがもういっぴき!???^ ウワアアアアアアアアア!!!! +#What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +オメ... ウチをキレーにしてくれたのか...? うおおん オラ カンドーした! お礼にオラのたからもの あげるよ! +#You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +ヤングはハコをあけた 中には何か入っている! +#Young opens and takes the box. Something is inside it! +イッキィ:あらま ミャオか^\n\nミャオ:無事でよかったよう!^\n\nイッキィ:えっと... ヤング 助けてくれてありがとうね +#Icky:Oh. Hey Miao.^\n\nMiao:I’m so glad you’re safe!^\n\nIcky:Uh... thanks for the hand, Young. +LOOP +イッキィ:正直言えば ハコの中も悪くなかったんだけどね +#Icky:To be honest, I kind of like sitting in boxes. + end scene + end area +end npc + +npc miao + area FIELDS + scene init +うわ...! 選ばれし者 ヤングさん!? ウワオ!光栄です!ボクはミャオ・シャオ・テュアン・アイ 選ばれし者見習いです! +#Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +ぜひ少し お供させてください 選ばれし者のカツヤクを生で見たいです! +#Could I follow you around for a bit to watch a Chosen One in action? +LOOP +ヤングさん! どうもです 今日もお供していいですか? +#Hello again, Young! Can I shadow you today? + end scene + scene randoms +# 0. after talk to shopkeep +ミャオ:ドモーっす! そうだヤングさん 何か ぬすんだことって あります? +#Miao:Hey, Young... have you ever stolen anything? +# 1. AFter talk to mitra +ミャオ:ボク ミトラさん好きっス... ウェアズもハンサムな自転車ですよねぇ +#Miao:I like Mitra... and isn’t Wares a handsome bike? +# 2. Nexus pad +ミャオ:ヤングさん そのカッコイイ石なんスカ? タイムスリップとかできるヤツッスか? +#Miao:What’s that cool stone thing, Young? Does it make you go back in time?! +# 3. Random if Icky not saved +ミャオ:だんだんイッキィのこと心配になってきたッス... ヤングさん このへんで大きなネコ見ませんでした?イッキィは 東の森をサンポしてくるって言ってたッスが... +#Miao:I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +# 4. leave map +ミャオ:イッキィから 危ないところには行っちゃダメって言われてるンス... ボクはここで帰るッス! +#Miao:Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +# 5, 6, 7 - only after you've seen 0, 1, 2 +ミャオ:ヤングさんは ダンボールの中に入ったことあります? +#Miao:Have you ever sat in a bunch of grocery bags? +ミャオ:ヤングさん マタタビってやっぱ やっちゃだめスかね? +#Miao:Hey Young, do you think it’s wrong to do catnip? +ミャオ:やっぱ選ばれし者になるには イッパイしゅぎょうしたんスカ...? +#Miao:I bet it must have taken a lot of work to become The Chosen One, huh, Young? + end scene + +# musing after you save icky + scene philosophy +イッキィが怖い目にあって 考えたんスけど ボクらは死んだらどこへ行くんスかね? そんで 人生の目標をやりとげることなんて可能なンスかね? +#That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +それともボクらは 運命をまっとうするまで 生まれ変わり続けるんスかね? あ... それじゃ簡単すぎッスか? +#Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +そしてその旅路の果てには何があるんでしょう? ただ時間に流されて 消え去るんスかね? +#And then what is our reward for completing our journey? Do we just fade away? +LOOP +フムー... +#Hmm... + end scene + +# icky talking after yoh save icky + scene icky +やあ ヤング +#Oh. Hi, Young. +実はボク ホントの名前はイッキィじゃなくて イカボッドなんだ +#My name’s not really Icky. It’s Ichabod. +ミャオ・シャオ・テュアン・アイは迷惑かけてない? +#I hope Miao Xiao Tuan Er hasn’t been too much trouble. +それじゃあね ヤング +#See you later, Young. + end scene + end area +end npc + +npc generic_npc + area DEBUG + scene melos +やあやあ 見つかっちゃったねえ! まあボクはここに残るよ 外はさむいしね +#Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +部屋がキタナいのはカンベンしてね このへんはボクが DAME マップエディタで作ったんだ +#You can blame me for all of those awful rooms! I made them with the DAME map editor. +あと このゲームはFlashDevelop IDEとFlixel AS3フレームワークを使って作ったよ! +#I made this game with FlashDevelop IDE and the Flixel AS3 framework! +ああ あと音楽は主にREAPER DAWで ときどきAudacityを使って作ったかな +#Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +ボクはまわりのコンピューターから出る放射線から栄養をとってるんだ^ん? それは生物学的に正しくない?...ってどういうこと? +#I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +やあ母さん^それから父さんも! +#Hi mom! ^And dad! +このゲーム20分でクリアする方法知りたい? +#Want to know how to finish the game in 20 minutes? +そりゃー教えらんないなー! +#Ha! Like I'd tell you! +(丁寧にきかれたら別かもだけど...) +#(...maybe if you ask me nicely...) + end scene + scene marina +うおー! やあやあ! +#Woah hey! +このゲームのセリフはだいたいボクがガリガリ書きまくったんだよ^(このセリフはショーンが書いてるけど) +#I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +このゲームのアートはAdobe Photoshop CS5とGraphics Gale Free Edition,それからWindows 7 Snipping Toolを使って作ったんだ +#I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! + end scene + end area + +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +ここはシットリしててお肌にはいいんだけど 髪の毛にはサイテーよね... +#The humidity here is good for your skin, but bad for your hair. +こうして立ってるのが好きなの 夏になるとさ みんな うだるように暑い外とエアコンの効きすぎた部屋を 行ったり来たり きゅうげきな温度変化は骨に良くないよ +#I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +氷をかむクセと同じよ わるいクセ うちのママとか 大人になっても氷をかんでたんだけど おかげで今じゃ おくば ヒビだらけなんだよ +#It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. + end scene + + scene second +クツは脱いだらちゃんと新聞紙つめて かわかしてね ジメジメのままだとバクテリアがはんしょくしちゃうからね +#Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +なんで食べほうだいのデザートって赤いゼリーばっかりなのかな? お客さんをガンにしたいとしか思えないよ +#Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. + end scene + + scene bomb +ボクに関わるな +#Get away from me. +マジで... ほっといて +#I’m serious... leave me alone now. + end scene + + end area + area BLUE + scene one +同情はいらねえよ ヤング +#I don’t need your pity, Young. +そうかい そうやって幸せな世界の中で生きてりゃいいよ\"選ばれし者\"さんよ... +#Right, just go on living in your happy little world, "Chosen One"... +なあ ヤング 友情なんてさ みんなが自分をだましてるから成立するんだぜ オレたちはみんなクソヤローだし 最後にはみんな一人なんだ +#You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +ハッ! お前がオレをキラいなのは知ってたよ +#Hah, I knew you hated me, Young. +オレは調子よくやってるよ +#I’m doing fine. +もちろんお前は気にしないよな 誰も気にしやしない +#Of course you don’t care, no one does. + end scene + end area + + area HOTEL + scene one +街は汚れて人だらけ それは分かってるんだけどさ それでもときどき ここに来て街の明かりを見るのが好きなんだ +#I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +街には街の美しさがあるだろう? 星のかがやきみたいに永遠じゃないけれど 人間くささっていうのかな それが美しさに深みを持たせてると思うんだ +#It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +明かり一つひとつのかたわらには だれかがいて 期待や恐れ 秘密なんかをかかえてて だから街の明かりは怖いほどこどくで だけどくっきりと人らしい +#Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +ここから見えるまどのおくにいる すべての人を 僕は愛してる 一人ひとりが僕の星だからね きみの人生がどれほど ろくでもなくても どこまで落ちていったと思ってても 僕はきみを愛してるんだよ 夜はかがやきにみちてるんだ +#I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +くだらない おしゃべりを聞かせちゃったね 聞いてくれてありがとう +#I’m sorry, I’m babbling. Thanks for listening. + end scene + end area + area REDCAVE + + scene easter_egg +ヘーーーーイ! まあゆっくりして行きなよ!な!? +#Heeyyyy, mannn...take a load off, stay a whilleee, eh? + end scene + end area + area APARTMENT + scene easter_egg +わっ! 見つかっちゃったか! +#Ah! You found me! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what htey say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + scene quest_normal +ゴーレム:来るとちゅう でっかい岩が降ってきたりしなかった? イライラするとどうしても岩投げちゃうんだよねえ 当たったらゴメンね +#Golem:Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +ゴーレム:よく母さんに\"そんな事してたら そのうち山がなくなっちまうよ\"って言われたよ まさかポッキリいっちまうなんてなあ +#Golem:My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. + end scene + scene second +ゴーレム:岩って長生きだから 何世代にもわたって人間を見ることになるんだ そうして年を重ねて どんな人よりもかしこくなる +#Golem:When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +ゴーレム:...というのがリクツなんだけど ずいぶん前に双眼鏡こわしちゃってさ じつは人の営みもそんなに見てないんだ +#Golem:At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +ゴーレム:じっさい 見ててもタイクツだから 別にいいんだけどね +#Golem:Actually, I don’t miss watching people much, it’s a bore. + end scene + scene quest_event +ゴーレム:ああ うん たしかに人が来たよ 困ってたみたいだった たしか ビーチに向かうって言ってたかな +#Golem:Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. + end scene + end area + area BEACH + + + scene quest_normal +ロブスター? ちがうよ オレはランゴスティーノさ 名前はヒュウズってんだ +#I’m not a lobster, I’m a langostino. The name’s Hews. +LOOP +ヒュウズ:海はいい... 何がいいって 水平線が見えるだろう +#Hews:You know what the best part of the ocean is? Being able to see the horizon. +ヒュウズ:海ってのはいわば 塩味のついた無限の可能性なんだよ +#Hews:The ocean is like a salty taste of infinity. +ヒュウズ:混んでるビーチなんてのは くもった宝石みたいなもんさ +#Hews:A crowded beach is robbed of its grace. + end scene + scene second +ヒュウズ:シャコって知ってるかい? シャコには\"じゅようたい\"が16コもあって しがいせんも見えるらしいんだ たくさん色が見えるってどんなだろうね? +#Hews:Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +ヒュウズ:きっと美しいんだろうな でも色がちがうだけで憎しみ合う今の世界を考えれば そうシンプルなハナシでもないのかね +#Hews:Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. + end scene + scene quest_event + +ヒュウズ:だれか 探してるのかい? そういえばオレがここで空を見てたとき あれはちょうど太陽が雲にかくれちまった時だったか 誰かが来て 何か探してるんだがって聞いてきたな 何だったか覚えてないが... そいつは森へ行かねばって言って走り去っちまったよ +#Hews:You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. + end scene + end area + area FOREST + + scene quest_normal +#npc james +ジェームズ:木イチゴはいいよね 好物なんだ +#James:Berries are a good kind of food. I like berries. +ジェームズ:木イチゴにオシッコかけないようにね +#James:Please make sure not to defecate on the berries. +ジェームズ:今年は今のところ18回交尾したかな それから木イチゴは389回食べたかな +#James:So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +ジェームズ:ジェームズに木イチゴのおみやげは ない? +#James:Do you have any berries for James? + end scene + scene second +ジェームズ:ポエムを かいたよ\n^食べたよ 木イチゴ\n^ハッピーな キモチよ\n^笑顔こぼれて みのり たわわに\n^冬が来るから さらに おかわり +#James:I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +ジェームズ:ブルーベリーとラズベリーだと どっちが好き? +#James:Do you like blueberries or raspberries more? +ジェームズ:ジェームズに木イチゴのおみやげは ない? +#James:Do you have any berries for James? + end scene + scene quest_event +ジェームズ:誰か来たよ 木イチゴいらないって言ってた 湖の南まで行って 西に行ったよ +#James:Someone came by. They did not want berries. Went to southeast part of lake to the west. + end scene + end area + + +#npc rank +#npc olive + area FIELDS + scene easter_egg +オリーヴ:やほ アタシはウサギのオリーヴっていうの +#Olive:Hi, I'm Olive the rabbit. +オリーヴ:アタシ すっごくたくさん シリアル持ってるんだ シリアルって大好き +#Olive:I have so much cereal left to eat! I love cereal. +オリーヴ:アタシのもってるシリアルのハコ すっごく大きいの もうネバーエンディングなのよ! +#Olive:The box is so big. It never ends! +オリーヴ:ネバエンディン シーリアール! +#Olive:Neverending cereal! +オリーヴ:...うーん これじゃ ちっとも悪いことに聞こえないわね +#Olive:Hmmm...maybe that's not such a bad thing. + end scene + scene bush +ランク:ウハハ ヤング おめえバカだなー ホウキじゃ草は刈れねえって! +#Rank:Eheheh, silly Young! A broom’s no tool for cutting bushes! + end scene + scene quest_normal +ランク:オラはここで 低木を切って くらしてる 低木を刈ってると ゴールドが見つかる時があるんだぜ ウハハハ! +#Rank:I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +ランク:このあたりの低木も さいきんは景気が低迷しててな... +#Rank:The economy has been really struggling under this bush... +ランク:低木を切って ヨメと子供を食わせるのは 楽じゃねえよ ただ暖炉のマキだけは いつでもたっぷりあるがな ウハハハ! +#Rank:Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! + end scene + scene quest_event +ランク:ん? ああ そういやあ 誰か来たなァ 地下の迷宮に行くとかなんとか きっとそこには 刈り切れないほど草木があるんだろうなあ ウハハ! +#Rank:Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! + end scene + scene marvin +マーヴィン:おっ やあやあ! +#Marvin:Oh hey, how are you feeling? +マーヴィン:ジャスティンどこだろ...? +#Marvin:Where is Justin? +マーヴィン:このへんにはボトルロケットはないみたいだね... +#Marvin:There's no bottle rockets around... + end scene + scene chikapu +チカチィー! +#Chika Chi! +チカ チカ! +#Chika Chika!! +チーー^\nカーー^\nプゥウーーー!!! +#CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! + end scene + scene hamster +ボブ:ハムスターのボブは 自分のことを三人称で呼ぶんだ +#Bob:Bob the Hamster likes to refer to himself in the third person. +しかし句点ってむず,かしいよね +#Bob:Apostrophes are the root of all e'vil. +ボブ:しずかに! 私は今 ハムスター的オーラをかもしだすべく 集中しているんだ +#Bob:quiet! I am busy exuding an aura of hamstery ambiance. +ボブ:...ものごとは実際にやらないと じょうたつしないらしいけれどさ... もしまちがった場合はやっぱり まちがえかたが上手になるのかな? +#Bob:... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +ボブ:本物の男は泣かない... ああ 本物のハーレーに乗り かぜの強いモハーヴェさばくを走り抜ける男が たとえばヘルメットもゴーグルもかけてなかったら 日に焼けた顔についたその目から 涙がひとしずく スッとほほを流れたりするかもしれないけど うん 男は泣かないよね +#Bob:A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +ボブ:このゲームはぼうだいな数のサルが 同じくぼうだいな数のタイプライターを使って作ったものなんだ +#Bob:This game was created by an infinite number of monkeys working on an infinite number of typewriters. +ボブ:ジェームズが恋しいなあ... +#Bob:I miss James... + end scene + scene electric +クリブー:ざんぎゃくこうい手当 ほしいなあ! +#Kuribu:Curry is yellow and spicy! +クリブー:コイン いっこ いれて! +#Kuribu:For the clever opponent, injure increase! +クリブー:こだま分隊 に入りたい! +#Kuribu:You got the experience of 2! +クリブー:じゅーびょー! +#Kuribu:I tell you my phone number! 0*1-51*7-*4386 + end scene + end area + area TRAIN + + scene quest_normal +ここで何してるのかって? いい質問ですね! たまたまココに来ちゃって この場所にかくれているんだ ここは安全だし あの変なのに つかまりたくないからね +#What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +どうも私は ひかく的 うんがいいようだ あのゾンビみたいなのはそこら中ウロウロしてるし... しかし彼らはどうして どうやって死んだのか気になるねえ モンスターにやられた? ラリってトゲにやられた? フムー +#It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +何にしても 楽しくはなさそうだ 僕はごめんこうむりたいね 物理的にイタいのはいやだもの +#It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. + end scene + scene quest_event +ああ そういえば思い出した... たしかにしばらく前 だれか来ましたね 何かをさがしてると言ってたような... キミに似ていた気がするよ ん? いつだったかは思い出せないなあ ここにいると じかんってよくわからなくなるから... あ でも たしか ちかくの町に行くと 言っていたよ +#Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. + end scene + end area + area SUBURB + + scene quest_normal +やあ +#Hello. +何かさがしているの? +#Are you looking for something? +何見てるの? +#What are you looking at? +いや ちがうよ ボクはココの住人じゃない しかし何でかな キミはボクが見えるし話せるのに 他の人はムリなんだ... さつじん者がウロウロしているっていうのに だれも気づかないし... 変だよ... +#No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. + end scene + scene quest_event +うん 通りかかった人は いたよ 何かさがしてるって言ってた 何をかは分からなかったけど いそいでた ようすだったなあ 別の空間に行くとか言ってたけど... なんかヘンな言い方だよね +#Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. + end scene + end area + area SPACE + scene quest_normal +ちょっと え? え? キミ誰? +#WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +ぼくは たんなる旅人だよ ここはAからBへ行く途中にある けっこう人気のあるきゅうけいスポットなんだ +#I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +Aって何かって? ? ? ぼくの地元だよ . . . 古い友だちに会いに行く途中なんだ . . . 長い旅だけど . . . ぎせいも払うさ . . . キミもだろ? ? ? そのほうが人生しげき的だしね! ! ! +#WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! + end scene + scene quest_event +ナルホド - - - ホカノ ニンゲン サガシテルノ^チョット メモリ ケンサク シテミマショ - READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \nフムフム. . . \nソノ ニンゲンハ トツゼン ナニカ ヒラメイタ ヨウスデ ナニヤラ テイレノ イキトドイタ タテモノニ ムカウト イッテマシタ\nイワレテミレバ アナタ ソックリ デシタヨ!! ホントニ アナタジャ ナカッタ? ホントニ? アレレ +#OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? + end scene + end area + area GO + scene quest_normal +あれ 今...あれ? うん まあ おみごと...! +#You actually were...uh, ah. Well done. +LOOP +つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\" +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it:\"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + scene quest_event +つるりとした岩が部屋の明かりを反射している 表面に何か刻んである:\"手短に すぐに出発することになるから(どんどん明るくなってきている いつものことだ)青い森の北西で 別の寺院の入り口を見た 北に森を抜けた先だ スイッチが自由に押せたらいいのだが... おそらく次にこの世界を訪れたときにでも\" +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it:\"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +やあー! キューブにはもう会った? +#HELLO. HAVE YOU MET cube YET? +キューブはこのあたりの空間を支配してる すごくいい支配者なんだ ボクや他の支配者も自分の空間ではけっこう うまくやってるけどね +#cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. + end scene + scene gray2 + +このあたりの空間どう思う? 旅の途中に 立ちよるには けっこういいよね? +#WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +世界と世界の中間地点! +#AN INTERSECTION OF WORLDS! + end scene + scene gray3 +ボクら灰色のピラミッドは ホントはここにはいないんだ 特別なマシンでホログラムを うつしてるってワケ +#NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +どうしてそんな事するかって? 友だちのキューブと話したり アイツを一人にしたくないからさ +#WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. + end scene + scene graydead +zzz... ムニャ... +#*bzrrrrt* + end scene + scene grayspin +...ホログラムマシン ちゃんと動作してる? +#...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +してない?^...^あーもう!! +#NO?^...^DAMN! + end scene + scene color1 +キューブにはもう会った? すごくクールなんだよ! 聞いた話じゃあ\n ガケぎりぎりの場所に12びょう近く立っていられるとか!ハンパないよね!\n\"ガケぎり立ちリーグ\"のメンバーならそのスゴさが分かると思うけど! え?\n 分かんない? うーん スゲエってことさ! +#Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! + end scene + scene color2 +キューブはいろいろ 面白いことしてるんだよ! +#CUBE does a lot of interesting work! +聞いた? どうやら次の支配者 ボクみたいなんだよね! たぶんあと何分かしたらじゃないかなあ! +#Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. + end scene + scene color3 +僕はシュガーローフから来たんだ タイペイへ行く途中なんだ ここにいる理由? キューブにあいさつしていこうと思ってね! +#I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +そんなに落ち込んだカオしないで! ここを訪れる人をおどろかさないように変なすがたしてるだけで キホン的には むがいだからさ +#Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. + end scene + scene colordead +(...寝てるのかな...?) +#(...is it taking a nap?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +くつうのうちに生まれ くつうのうちに死ぬ そのくり返し 私たちは その苦しみを たち切る 私たちは 二度と外には出ない +#EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. + end scene + scene after_fight +これが 私たちの反逆にたいする ばつなのか... +#IS THIS YOUR PUNISHMENT FOR OUR REBELLION? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +どうして見通せし者の いけにえに なるのを拒む!? どうして私たちのきゅうさいを うばう!? +#Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? + end scene + scene after_fight +...われらは しかるべき むくいを与えられなかった だが...きみは私たちをふたたび自由をくれた ありがとう ヤング 見通せし者のおみちびきが キミに再びあらんことを +#...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +しばらくぶりだねえ ヤン 本当に久しぶりだ まだあのファミコンで遊んでるようだねえ? +#So good to see you, Yang. Been too long. Still playing those nintendos, I see? + end scene + scene after_fight +ええい! いいかげん大人になれ ヤン! どうせさいごには 他人と付き合わなきゃ ならないというのに +#Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +私どもではさいこうのアメニティをご用意 しています プールはいかがでした? +#We have all the finest amenities here. How do you like the Pool? + end scene + scene middle_fight +私どもの さいしんフィットネスセンターは いかがだったでしょうか? +#How about our state-of-the-art fitness center? + end scene + scene after_fight +おくつろぎ いただけましたでしょうか!!! +#We hope you enjoyed your stay! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +やあ 今日もいい日だね +#Today is a nice day. +背中をかいてくれてありがとう どうも届かなくてね +#Thanks for scratching that itch on my neck - I can't seem to reach it. +地元のダイナーで出してるタマゴが美味しいって聞いたんだ クーポンも持ってる +#I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +今日の交通事故見たかい? ヒドい話だよ! メールしてたらしい...当てられたのは小さな男の子だったとか 気の毒に +#Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +ウチの息子 ジュニア代表チームに入れなかったんだ ガッカリだよ あれだけ 力を入れてきたのに +#My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +今日は感謝祭だから 色んなものに感謝しないとなあ 明日は早朝セールがあるから たくさん買い物するぞー +#Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +ああー 仕事に遅刻しちゃう +#Ah, I think I might be late for work. +早く家に帰らないと 義理の母さんが来るから そうじしないと!! +#I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +ガレージセールやってまーす! +#We're having a garage sale! +ようこそ! +#Welcome! + end scene + scene words_teen +最新の映画まだ見てないのに +#I didn't see the latest movie. + end scene + scene words_kid +もう アニメのつづき 見られないよ! +#I never gotta see the new cartoon! + end scene + scene family +# inside of a house, parent (insightful kid) - 73 +見ず知らずの方 我が家へようこそ! 見たことのあるカオね... ここは平和で しずかな町だから 外から来る人はほとんど いないのよ +#Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +#inside of house, younger kid +ねーねー デイブメントは好き? デイブ兄ちゃんが デイブメントのカッコイイ曲をきかせてくれたんだー! +#Do you like Davement? My brother Dave showed me this really cool song by them! + end scene + scene older_kid +# inside of a house, olderkid +友だちはみんなレイヘッドの\"ノー・サプライズ\"って曲が好きなんだ この町の文句を言ってる歌なんだけど そりゃあ ここは天国じゃないけどさ 感謝くらいすべきだよ! それか自分で変えようとしなきゃ! みんなときたら... あ スミマセン ついアツくなっちゃいました +#My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +これは自分のブログに書くことにします +#I guess I'll just go write in my blog. +なんかフラフラしてません? +#You sure look like you're in a daze. +スポーツとかテレビ番組について話すの どうもニガテなんだけど 父さんも母さんも大好きなんだよね... +#I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. + end scene + +#inside of hanged man house 74 + scene hanged +死体の上にメモがある\"これで危険から はなれられる\" +#A note on the corpse:\"Placing myself in danger no more.\" + end scene + scene festive + + +#Inside of another house, (festival people) - 75 +ねえ 外は何かやってるの? お祭りとかパレードとか? +#Oh, is there something going on outside? A festival? A parade? +何だか外がおおさわぎだけど 最近マドの外のぞいたことある? 何がどうなってるのか... +#There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. + end scene + +#78 + scene paranoid +ウチにはマドがたくさんあるんだ マドは好きじゃない ずっと誰かにのぞかれてるみたいじゃないか 外で何かが起きてるのは間違いない あまりに長い間しずかすぎるよ こんなにしずかじゃ 気がちって しょうがない +#My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +さつじん? はあ? 外で? 何を言ってるんだ? からかってるのか? この町でさつじんなんか起きたことがないよ いや...君を見ているとなんだか不安になるよ 早く町を出たほうがいい +#Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +早く出て行ってくれ +#Please get out. + end scene + +# 76 + scene dead +女性の死体だ 鈍器で殴られたのが死因のようだ +#The body of this woman has been beaten to death by a blunt weapon. +男性の死体だ +#The man, to put it bluntly, well... + end scene + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +ああ キミか! 見覚えのあるカオだね... いやー ここはまだ通せないよ キミがもっと町の人を ころしまくらないと そういう話だったろう? じゃあ また後でな +#Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +このパンフレットによれば あと何人か ころせばOKだ さあその調子で行った行った +#According to this pamphlet...you only need to kill a few more people! Keep it up. +いいぞ あと1人だ さあチャッチャとやって先へ進もう +#We only need one more body, and then we can keep going. +いいぞ! さあ中へどうぞ 中に何があるのかは知らんけれど それじゃあまた明日 同じ時間に あ 明後日だったかな? +#Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? + end scene + end area +end npc + +# dialogue for the cards + +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +もりの木々がボクを見てる でも ボクは気にしない +#I don't mind being watched by the trees. +#1 Bat(?) - extra overworld area +ジョーカーを止めなければ... +#Where is she?! +#2 sunguy +ヤングよ 私は常にキミと共にある キミが一人のとき 私はそこにいる +#I will be with you Young, whenever you are alone. +#3 Shieldy +キミってオークチョット? ママからオークチョットはあぶないって言われてるんだ +#Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +#4 slime +ぷるぷる ヤングさん お会いできてこうえいです あ そうだ ゼリーたべます? +#Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +#5 post-statue area in BEDROOM +ピーピーピーピーピーピーピーピーピーピーピーピー ...別にヒワイなことは言ってないです +#Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +#6 SUBURB inside of house past blocker +本日限り!なんト!ひとつぶんのお値段デ!ふたつ!ごていきょウ! +#Limited time offer! Buy one, get one free - only today! +# 7 APT Boss +停電の夜に ロウソクを灯したあの頃を 覚えているかね? +#Remember the time that you lit a candle when the power was out? +# 8 APT Silverfish +カサカサカサッ +#Mmmm, your pillow was cozy last night. +# 9 APT gasguy +もやせ もやせ いーろいろ もやーせーええー +#This'll teach 'em for calling me the fumi-GAY-tion guy. +# 10 FIELDS 1 (island) - mitra +ウェアズとわたしはいつでも一緒! +#Wares and I make a good team. +# 11 FIELDS 2 (alcove) - Miao +選ばれし者見習いです! +#I'm the Chosen One-in-training!!! +#12 Base of WINDMILL windmill +たまにさ 自分が何をしたところで 世界が死にゆくのは止められない なんて感じないかい? +#Do you ever feel like, no matter what you do, you can't stop the world from dying? +#13 Hidden up a river in FOREST +森のキノコに ご用心... +#Beware the forest mushrooms... +#14 Bottom of ladder-mini-maze on CLIFF +本当にすみません 本能なんです +#I am sorry. It is my nature. +#15 Top of Cliff +\"ただの岩じゃん\"ってどういうこと!? 岩だってカードになるよ!いいじゃん! +#What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +#16 Western end of BEACH past spikes +男に魚を一匹やれば一日食いつなぐが,魚の取り方を教えてやれば息子の\n ジミーとの父子のじかんプライスレス +#Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +#17 At end of path through the woods in REDSEA +歩こう 歩こう こたえは 歩いた先にあるよ +#Sometimes the answer is taking a walk. +#18 MOVER Redcave - Past 2 locks in central redcave +なんでコウモリって いつも飛びかかってくるのかな? +#Why do bats suddenly fly down, every time you're around? +#19 SLASHER Redcave - West end of Northern redcveave +歯ならびの話はやめろ!! +#NO, *YOU* NEED BRACES! +#20 REDBOSS Redcave - post boss +幸せって何だったのかな? +#ARE YOU HAPPY NOW? +#21 NW corner of CELL - chaser +私のー 見ている前で 叩かないでくださいー +#Don't get violent around me. +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +リョーリの鉄人に出るのが夢だったんだよねえ +#I've always wanted to be on Iron Chef. +#23 CONTORT circus - contort + firepillar room in SW chunk +母さんにはよく\"背中曲げてると ずっとその形になっちゃうよ!\"って言われてたなあ +#My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +#24 LION circus - end of northern gauntlet bordering boss room +お楽しみいただけましたでしょうか +#Are you amused yet, human? +#25 A+J BOSS circus - basement (post boss) +... +#26 FROG crowd - North of entrance +げんみつに言えば ヒキガエルはカエル目にぞくする科のひとつなんだ +#Scientifically speaking, toads are a subset of frogs. +#27 CROWD GUY crowd - 2nd floor +アハハハハ!!! うん! 知ってた! +#HAHAHAHA! Yeah! I know! +#28 WALL BOSS crowd - post boss +カードとか集めてるのかい? いいシュミだね インくん +#Oh, you collect cards, too? Real classy, Ying. +#29 end of grey end of space, for grey cube king +たまにはコンピューターやめなさい! 友だちできないよ!ってよく言われたなあ +#They always said, \"Get off the computer! Or you'll never make friends!\" +#30 end of colorful end of SPACE, for color cube king +今んとこ支配者やってます +#I'm only the ruler for the extent of a conversation. +#31 DUSTER hotel - end of 4th floor moving platform area +アンタ アタシの仕事を面白くしてるとか思ってるでしょ! +#I'll bet you think you're 'making my job interesting'! +#32 DASH TRAP hotel - Dash trap room on 3rd floor +ななめとか やめろよ +#I hate diagonals. +#33 BURST PLANT hotel - SE corner floor 2 +オレの花粉だぜ? ヒスタミンなんか効かねえよ +#Don't even try that claritin clear shit with me. +#34 EYE BOSS hotel - post-boss +お部屋のカギは こちらのカードになっております +#Swipe this card to unlock the door to your room! +#35 end of left-most TERMINAL bridge - sage +私に任せておきたまえ +#I'm doing a great job. +#36 Young (drawer APT) +.......?? +#37 old BDRM (dialogue rock) +ところで私たちに 文字を刻んだのは 誰なのだろう? +#Who carved all of us anyways? +#38 hotel room +おくつろぎ いただけましたか? +#I hope you enjoyed your stay. +#39 end of debug minidungeon (old player sprite) +ここまでの道のり見てたよ キミ面白いね +#Seening as you've gotten to this point, you must be quite Intrasting. +#40 end of cell - Torch? +迷わせるために 存在してます +#I'm just here to lead you astray. +#41 end of SPACE - faces/entities +ボクらにとってはキミもピラミッドなんだけどね! +#You like like a pyramid to us, too! +#42 end uf suburb (killer) +毎夜 毎夜 同じことのくり返し おまけに給料も安いと きたもんだ +#It's the same damn play, night after night, and the pay sucks. +#43 GOldma's room - goldman +ほっといて! あと名字はサックスじゃないから! +#Leave me alone! My last name isn't Sachs! +#44 blank, ISlands - Broom +ただのぼう じゃないだけ いいか +#At least I'm not a stick. +#45 fields, bottom right - (Rank) +お金のなる木なんかない? オメ何言ってんだ! ウハハハ! +#What do you mean money doesn't grow on trees? Eheheheh! +#46 street, bottom (Follower bro) +私はまぼろしに すぎない +#I'm nothing but an illusion. +#47 redsea, bottom eft (Bomb npc) +八つ当たりするよ +#I'LL TAKE IT OUT ON YOU. + end scene + end area +end npc + +npc misc + area any + scene controls +操作設定をするには +#Press +# [SOMEKEY-LEFT] +を,キャンセルするには +#to set controls. +# [SOMEKEY-ENTER] +を押してください +#to cancel. +上 +#Up +下 +#Down +左 +#Left +右 +#Right +ジャンプ +#Jump +こうげき +#Attack +メニュー +#Menu +しゅうりょうするには +#Press +# [SOMEKEY-ENTER] +を,操作設定をするには +#to exit +# [SOMEKEY-LEFT] +を押してください +#to set controls. + end scene + scene title +黒いエリアが見えなくなるまで\n矢印キーをつかって\nウィンドウの大きさを調節してください\nおわったら +#Please use the arrow keys to resize the window until you cannot see any black around the borders. Press +# [SOMEKEY-C] +を押してください +#when done. +ANODYNE +#This is intentionally left in English +Melos Han-Tani\nMarina Kittaka +#This is intentionally left in English +any key +#This is intentionally left in English, as these strings usually stay in English in Japanese games as well. +Press +# [SOMEKEY-C] +to start +バージョン +#Version 1.508 +つづきから +#Continue +はじめから +#New Game +よろしいですか?\nいいえ\nはい +#Are you sure?\nNo\nYes +ホントに?\nやっぱダメ\nホントに +#Really?\nNah\nYeah +取り消せませんからね?!\nやっぱやめる\nわかってるって +#No going back!\nForget it\nI know +回死亡しました +#0 deaths +枚カードを集めました +#0 cards +Anodyneは\nコントローラー\nに対応しています\n\n使用しますか?はい いいえ\n\n使用する場合は\n接続してください\n\n矢印キーで移動\nC / スペース / Enterで決定\n\n自動で\"はい\"に設定: +#Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +注意\n\n入力にラグが\nある場合は\n一度ホームに\n戻ってください\n\nCで次に進みます +#NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE +戻るをもう一度\n押すと終了します\n保存されてないデータは\n失われます +#Press BACK again\nto exit.\nUnsaved progress\nwill be lost. + end scene + scene elevator +何階へ行きますか? +#Floor? +1\n +2\n +3\n +4\n +キャンセル +#Cancel + end scene + scene gui +# Note - this below one is a sprite that fits into the gui +menu=enter +#This is intentionally left in English +# Shows up when you save at a checkpoint +セーブ中... +#Saving... + end scene + scene map +マップ +#Map +げんざいち +#Current Room +ドア/でぐち +#Door/Exit +マップなし +#No Map +ネクサスにもどる +#Return to Nexus +いりぐちにもどる +#Return to entrance + end scene + scene items +アイテム +#Items +ふつうのホウキ +#Normal +いれかえ +#Swap +えんちょう +#Extend +はばひろ +#Widen +バネが仕込まれたクツ。 +#A pair of spring-loaded shoes - press +# [SOMEKEY-X] +を押すとジャンプ! +#to jump! +じてんしゃ用シューズ +#A pair of shoes for biking. +カラのダンボールばこ +#An empty cardboard box. +見通せし者の寺院で見つけたカギ +#A key found in the Temple of the Seeing One. +地下にある赤い海で見つけたカギ +#A key found in a red, underground cave. +山にあるどうくつで見つけたカギ +#A key found in a mountain cave. + end scene + scene cards +カード +#Cards +xカード +#0 cards + end scene + scene save +セーブ +#Save +セーブかんりょう! +#Saved! +エラー +#ERROR +セーブして\nタイトルへ +#Save and go to title +タイトル画面へ +#Go to title +セーブして終了 +#Save and quit +ゲームを終了 +#Quit game +死亡回数: +#Deaths:0 + end scene + scene config +設定 +#Config +キー割り当て +#Set keybinds +音の大きさ +#Set volume +チェックポイントで\n自動セーブ: +#Autosave at checkpoints +オン +#On +# 5 +オフ +#Off +解像度\n変更 +#Change Resolution +UI 設定 +#Config UI +タッチ+方向キー +#Touch+D-Pad +方向キーのみ +#D-Pad Only +# 10 +タッチのみ +#Touch Only +いどうそうさのタイプ +#Move Input Type +解像度: +#Resolution: +ウィンドウ +#Windowed +倍率 +#Integer Scaled +# 15 +拡大 +#Stretch +スケーリング: +#Scaling + 言語: +#Language: +ja +en +# 20 +ボタンを\nドラッグ\nしおわったら\nメニューを\n\nタップして\nください\n\n +#Drag the buttons until you're satisfied. Then, tap the menu to continue. +ウィンドウサイズ変更 +#Resize Window +コントローラー設定 +#Config Joypad + end scene + scene secrets +まいて まいてー! +#You\'re rolling in it! +しおづけのおにくのかんづめ すききらいがわかれる +#Once the property of a famous Bubble Mage. +グラフィックがおかしいときは パキモンずかんでチェックしてみよう! +#If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +このハートには特に名前はない +#This heart has no name. +きみもデラモンワールドにおいでよ! +#Please visit the electric monsters\' world. +こねこの像 かわいいけど役には立たない +#A kitty statue. Cute, but useless. +ウワーーー! 見つかった! +#Oh my!!!! +ヤベー! 見つかった! +#Oh no!!!! +黒色だ +#It\'s black. +赤色だ +#It\'s red. +緑色だ +#It\'s green. +青色だ +#It\'s blue. +白色だ +#It\'s white. +#SOMEKEY-C +:決定 +#:Select +#SOMEKEY-X +:戻る +#:Back + end scene + scene swap +ゴメンなさい! +#Sorry! +ここでは いれかえ できません +#The swap won't work here. +ここをスワップするには力が足りない +#Young could not muster the strength to use the swap here. + end scene + scene keyblock +とびらはカギがかかっている +#This door is locked. + end scene + scene treasure +なぞの力により 宝箱はふういんされている +#Some strange force stops this treasure box from being opened. +ホウキの取っ手に文字がきざまれている\" +#An engraving on the broom handle reads:Press +#SOMEKEY-C +を押すとホウキを 振るいます\" +#to sweep. +このカギは一回使うとこわれてしまうようだ +#This key may be used a single time to open up a locked barrier. +ナゾのブーツ。ブランド名は\" +#A mysterious pair of boots has nothing but the branding on it, which says \"Press +#SOMEKEY-X +ヲ オスト ジャンプ\" +#\". +ホウキのアタッチメントに何か書いてある\"メニューで\"はばひろ\"をえらぶと ホウキの左右にほこりが広がり こうげきはんいが広くなる\" +#A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +ホウキのアタッチメントに何か書いてある\"メニューで\"えんちょう\"をえらぶと ホウキの前方にほこりが広がり こうげきはんいが広くなる\" +#A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +ホウキのアタッチメントに何か書いてある\"やあ ヤング \"いれかえ\"アタッチメントは2つのものを入れ替えられる どこでも使えるわけじゃないけど とりあえずは 役に立つはず\" +#A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +ハートを見つけた!最大体力がゼロぞうかした! +#YOU FOUND A HEART!!! Maximum Health increased by...zero. +ゴールドマン:ええ? ない?! きっとあの商人がぬすんだんだ! +#Goldman:What? It's not there? That shopkeeper must have stolen it! + end scene + scene dust +ホウキはほこりまみれになった!もう一度ふれば ほこりを置けそうだ +#Your broom is now full of dust! Attack again to place it. + end scene + scene checkpoint +セーブする?\n はい\n いいえ +#Save game?\n Yes\n No +チェックポイントの上で +#While standing on a checkpoint, press +#SOMEKEY-C +を押すとセーブされ そこが復活ポイントに設定されます +#to save your progress and set it as your respawn point if you die. + end scene + scene rock +岩には何かがなぐり書きされている: +#There is writing scrawled on this rock: +# YA AINT GOT NO FRIENDS + end scene + scene door +このポータルは作動していないようだ +#The portal does not appear to be active. + end scene + scene keyblockgate +門の一部が石化している これを開くにはカードが4まい必要そうだ... +#The gate stares, petrified. It won't open until it senses four cards... +4まいのカードを感知した門が 開きはじめる... +#Sensing four cards, the gate decides to open. +門はズッシリとたたずんでいる +#The gate stubbornly remains in place. +すべてのカードを感知した門が 開きはじめる... +#The gate senses all of the cards, and decides to open. +カードを感知した門が 開きはじめる... +#The gate senses enough cards, and decides to open. +開いた! +#It opens! +トビラはまだ とじている +#It remains closed. + end scene + scene solidsprite +東を指すひょうしきだ 文字は消えてしまっている +#The sign points to the east but the words on it are faded. +西を指すひょうしきだ 文字は消えてしまっている +#The sign points to the east but the words on it are faded. +ひょうしきの文字は消えてしまっている +#The words on the sign are faded. + end scene + scene mitra +あっ ヤング! +#Hey, Young! +え この自転車用シューズ わたしに? スゴい!ありがとうヤング!ウェアズのペダルには固定金具がついてるから ちょうどソレに合うクツを買おうかなって思ってたの じゃあ代わりに このクツあげるよ!バネがついててね すごく高くジャンプできるんだよ +#Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +を押せばジャンプできるよ! +#to jump with them on! +やっほ ヤング!何か気づくコトない...?^... ^...正解は じゃーん! クツが新しくなってる でしたー! 見て見て ウェアズのペダルにカチッとはまるの! それでね 前のクツはいらなくなっちゃったから キミにあげるよ! バネがついててね すごく高くジャンプできるんだよ +#Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +を押せばジャンプできるよ! +#to jump with them on! +オッケ!そんじゃね! +#Alright, take care! +ホラホラ はいてみて! ...そんなにクサくないはずだし! +#Go on, try them out! ...They're not THAT smelly. +ね? よくない? +#Cool, huh? +わわっ! それってフィンティのお店にあった自転車シューズじゃない? えっ!? わたしに? ヤング ありがとうー! すごくうれしい! そうだ お礼にわたしのクツあげるよ すごく便利なんだよ えーっとねブランドは...\" +#Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +#somekey-x +ヲ オスト ジャンプ\"だって。イミわかんないよね クツのどこにも +#to jump\". I've never understood that, though, because there's no \" +#somekey-x +ボタンなんか ついてないし! +#\" anywhere on the shoes... + end scene + scene tradenpc +フィンティ:いやあ よく来たネ ヤング あなた 私のトモダチ!ワタシは プラサンドフ・フィンティ・プラサンドフ! さあ見ていってネ いい品イッパイよ +#Finty:Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +フィンティ:あの箱 ホントに助かってるヨ! +#Finty:I still appreciate that box! +フィンティ:ヤヤ!この箱は!アリガト アリガト! これで在庫をもちはこべるヨ お礼にこのキモい... じゃないステキなカードをあげマス! +#Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +ってアレ? ないデス! 一体ドコに... まあいいデス 代わりにキズを手当てしまスヨ +#Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +ソレでは感謝のシルシに このカッコイイ 自転車用シューズを差し上げマス! +#As a token of my gratitude, take these stylish biking shoes! +# 5 +イヤア いい日でス 買い物にはもってこいでス! あとは商品を持ち運ぶ箱があったらサイコウなんですガ... +#Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +ざんねんネ! お客さん お金 たりない! お金をためて また来てクダサイ +#Too bad, looks like you can't afford this item! Come back later, when you have the cash! +フィンティ:おお お客さん お目がたかい! いい武器は旅に欠かせナイ! 敵も一発で肉片に!この品がナント! オドロキの! 499ドルよ! +#Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +フィンティ:このマネーバッグがあれば ザ ランドで集めたお金をもっとたくさん持ち歩けマス! それがたったの869.99ドル! +#Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +フィンティ:ホッホッホ! とくべつ品が見つかっちゃいマシタ クリップイン式自転車シューズでス もっとはやく カッコよくデスよ 今ならセールで299.99ドル! +#Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +#10 +フィンティ:ホウキにまとわりつく ほこり お手入れタイヘンでショウ? イヤなほこりは最新掃除機でイチモーダジン! 今なら749.99ドル! 月々199.99ドルの4回払いもお選びいただけマス! +#Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +アリガト! +#thank you...whoops + end scene +#(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a new e in the middle) + + scene ending +Anodyne\n-------\n\n\n\nせいさくしゃ:\n\nMelos Han-Tani\n\n\n\nMarina Kittaka\n\n------------- +#Anodyne\n-------\n\n\n\nA game created by\n\nMelos Han-Tani\n\nand\n\nMarina Kittaka\n\n------------- +せいさくきかん:\n\n2012 年 3 月\n\nから\n\n2013 年 1 月 +#Created from\n\nMarch, 2012\n\nto\n\nJanuary, 2013 +ゲームデザイン\n------\nふたりとも +#DESIGN\n------\nBoth +プログラミング\n-----------\nMelos:Actionscript 3\nと Flixel ライブラリ\nを使用\n\n\n\nアート\n---\nMarina\n +#PROGRAMMING\n-----------\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\nART\n---\nMarina\n +おんがく/SFX\n---------\nMelos:REAPER と\n無料のサウンドフォント\nを使用\n\n\n\n会話文\n--------------\nだいたい Marina\n +#MUSIC/SFX\n---------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\nDIALOGUE\n--------------\nMostly Marina\n +ストーリー\n-----\nふたりとも\n日本語ローカライズ:\nKakehashi Games +#STORY\n-----\nBoth\nJapanese Localization:\nKakehashi Games +テスターのみんなに\nありがとう\nちょうタイヘン\nだったよね!\n--------------\n\nMarina,初期のバグ\n対応 すごくタイヘン\nだったよね\n\nEtan,さいしょから\nずっと支えてくれて\nバグもたくさん\n見つけてくれて\nさいごまで手伝って\nくれて ありがとう\n +#Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game. +それから妹の Olivia も!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +#O - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Melos からの謝辞:\n\n父と母へ - ずっと\n支えてくれてありがとう\n\nS\n\nTIGSource のみんな\n開発者の仲間たちに\nありがとう\n\nそして Marina キミが\nいなければ完成\nしなかったよ +#Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways. +Adobe,Adam Saltsman氏\nFlashDevelop の人たち\nREAPER の人たち\nDAME 開発者さん\nDesura,Gamersgate,\nIndieDB,TIGSource\n\n\nそれから友だちみんな\n支えてくれて ホントに\nありがとう\n\nさいごに... 親友の\nTina Chen へ\n\nいつも 支えてくれて\nそして Marina を紹介して\nくれて ありがとう +#Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport. (Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina. +Marina からの謝辞:\n\nColin Meloy へ\n僕の表現力を高めて\nくれて ありがとう\n\nTsugumo へ\n\"え,オマエ ドット絵\nアーティストやるの?\"\n\n家族のみんな\n支えてくれて \nご飯食わせてくれて\nありがとうでした\n\nDaniel へ\n小さな頃から\n僕と一緒に\n\"インディー開発者\"\nでいてくれてありがとう +#Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up. +Molly へ\n信じてくれてありがとう\n\nTina へ\nMelos を紹介してくれて\n本当にありがとう\n\nMelos へ\n一緒にゲームを作って\nくれて そして僕を\nしんらい してくれて\nありがとう +#Molly, for believing\n in me.\n\nTina, for introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it. +出演\n----\n\n\nスライム\n\n\nじゃまなアレ\n\n\nポウポウ\n\n\nシールディ\n\n\n見通せし者 +#CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer +押してくるアレ\n\n\nオン オフ\n\n\nフォーシューター\n\n\nスラッシャー\n\n\nローグ\n +#Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n +イヌ\n\n\nカエル\n\n\n回るヤツ\n\n\nヒト\n\n\nカベ\n\n +#Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n +ネズミ\n\n\nガス男\n\n\nカサカサ虫\n\n\nダッシュマシン\n\n\nローラー\n\nウォッチャー\n\n\n +#Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n +ダストメイド\n\n\nはきだし草\n\n\n支配人\n\n\n +#Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n +ライオン\n\n\n曲芸の人たち\n\n\n燃える柱\n\n\nしもべ\nアーサー\nハビエラ +#Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera +ついてくる人\n\n\nエドワード\n\n\n釣り師\n\n\nレッドウォーカー\n\nヒュウズ +#Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews +ウサギ\n\n\nイッキィ\n\n\n商人\n\nミャオ・シャオ・テュアン・アイ\n\nランク\n\nゴールドマン +#Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman +ソラックス\n\nジェームズ\n\nキノコ\n\nクリックソン\n\nゴーレム\n\n住民 +#Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites +チェイサー\n\n\nホログラムのアレ\n\n\nあの空間の住人\n\nキューブキングたち +#Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +#Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +#Chaser\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +ヤング\n\n\nミトラ\n\n\n賢者\n\n\nブライア +#Young\n\n\nMitra\n\n\nSage\n\n\nBriar +そして...\nあそんでくれた\nあなたに... ありがとう!\n\n\n楽しんでもらえたなら\nウレシイです +#And we'd like to\nthank YOU!\nFor playing our game!\n\n\nWe hope you\nenjoyed it. +\n\n\n\n\n\n\n\n +スワップを活用して ヤングの世界を\n(ほとんど)制限なくぼうけん\nできるようになった! +#Now you have the ability to explore Young's world with (almost) no limitations, via the swap. + end scene + end area +end npc +# Tell the python script you're done. +DONE diff --git a/intra/source/data/dialogue_pt-br.txt b/intra/source/data/dialogue_pt-br.txt new file mode 100644 index 0000000..f92bcc0 --- /dev/null +++ b/intra/source/data/dialogue_pt-br.txt @@ -0,0 +1,2373 @@ +# ãáàâçéêíõóôúüñ¿¡ +# +# +# 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +Gosta de música? Examine aquele terminal! +#Like music? Talk to that terminal! +Gosta de sofrer? Dirija-se ao sul! +#Like pain? Head on down south! + end scene + end area +end npc + + +# +# +# 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +Aquela acrobata está perdendo o equilíbrio! Onde está a rede de segurança? +#That acrobat is losing balance! Where is the safety net? +... + end scene + scene holyshit + +UOAAH +#WOOAH + end scene + end area +end npc + + +# +# +# 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +Os leões estão encurralando aquela malabarista! +#The lions are closing in on that juggler! +... + end scene + end area +end npc + + +# +# +# 'briar' + +npc briar + area GO + scene before_fight +Briar:Estou cansado, Young. Estou cansado de todos esses ciclos. Eu me sinto como se estivesse vivendo o mesmo sonho, o mesmo pesadelo, de novo e de novo. +#Briar:I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +Briar: ... +#Briar:... +Briar:Isso não mudará, Young. Isso é tudo que sempre seremos. +#Briar:It’s not going to change, Young. This is all we’ll ever be. + end scene + scene after_fight + +Briar:Adeus, Young. +#Briar:Goodbye, Young. + end scene + scene final + +Briar:Cara, Young. +#Briar:Dude, Young. +Briar:Bata seus pés, mova seus braços. Caramba, você não aguentaria um minuto sem mim! +#Briar:Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +Briar:Bem, vem comigo, vamos comer um sanduíche ou algo assim. +#Briar:Well, come on, let’s go get a sandwich or something. +Sábio:Você... você agiu adequadamente. Até o nosso próximo encontro. +# Sage:You... you did adequately. Until we meet again. + end scene + end area +end npc + + +# +# +# 'sage' +npc sage + area BLANK + scene intro +Voz Misteriosa: Olá? ...Young? ^EI! ... ah, você pode me ouvir? Bom, agora escute. Você está prestes a acordar. Você usará as setas para se mover. +#Mysterious voice:Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. + +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +Você usará a tecla \' +#You will press the \' +\' para interagir com objetos e pessoas ao seu redor. +#\' key to interact with objects and people around you. +E você usará a tecla \' +#And you will press the \' +\' para acessar o menu, que fornecerá informações sobre você e os seus arredores. +#\' key to access the menu, which will provide you with information about yourself and your surroundings. + end scene + end area + area GO + + scene posthappy_sage + + +Young... Eu só queria consertar tudo para você. +#Young... I just wanted to fix everything for you. +Eu espero... Eu espero que você se saia melhor que eu. +#I hope... I hope you can do better than me. + end scene + scene posthappy_mitra + +Boa sorte, Young. +#Good luck, Young. +O Sábio está certo, de certo modo. Eu quero que tudo seja perfeito, e algumas vezes isso me faz ignorar a realidade. +#Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +Eu não sei o que você precisa fazer para ajudar O Briar. Eu não entendo como esse mundo funciona ou porque tudo aparenta ser tão estranho. ^Mas eu quero ser sua amiga, Young. +#I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +Você está lutando, Young. Você está tentando entender. Eu espero que você consiga se resolver. +#You are fighting, Young. You are trying to understand. I hope you can work things out. + end scene + scene one +TOP +Sábio:Young... esse é meu último aviso... espere, quem é ela? +#Sage:Young... this is my final warning... wait, who is that? +Mitra:Meu nome é Mitra, e esta é minha bicicleta, Wares! +#Mitra:My name is Mitra, and this is my bike, Wares! +Sábio:Eu não perguntei o nome de sua bicicleta, o que você está fazendo aqui? Não me lembro de você. +#Sage:I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +Mitra:Estou aqui para ajudar meu amigo, Young. +#Mitra:I’m here to help my friend, Young.. +Sábio:Young não tem amigos. Young sequer tem O Briar. E se você está provocando ele, quero você fora do meu mundo! +#Sage:Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +Mitra:O que você quer dizer? Wares e Eu-- +#Mitra:What do you mean? Wares and I-- +Sábio:PARE DE FALAR SOBRE SUA MALDITA BICICLETA!!! +#Sage:SHUT UP ABOUT YOUR STUPID BICYCLE!!! + end scene + scene hit + +TOP +Sábio:... +#Sage:... +Mitra:Young! Você está bem?^ Origada pela ajuda. Agora vá e acabe com essa última área de araque! Nós sabemos que você consegue! +#Mitra:Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +Mitra:Wares!!! +#Mitra:Wares!!! +Mitra:Wares... +#Mitra:Wares... +Mitra:Preste atenção, encapuzado misterioso, eu não sei quem você pensa que é, mas que tal nos deixar em paz? +#Mitra:Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +Sábio:Você acha que é amiga de Young só porque você irá mentir e dizer para ele que lá no fundo ele é perfeito e que no fim tudo ficará bem. ^Bem, se é isso que você quer, TUDO BEM. Suma da minha frente, Young. +#Sage:You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +Sábio:Vá falar com sua amiga. +#Sage:Go talk to your friend. +Mitra:Nós só estamos fazendo o melhor que podemos... +#Mitra:We're just doing the best we can... + end scene + end area + area NEXUS + scene enter_nexus + + +TOP +Homem Encapuzado: Bem, já estava na hora. Er...^Quer dizer...^ Saudações, Young! Eu sou o Sábio, o Ancião do Vilarejo. Você foi invocado aqui pois A Escuridão se espalhou pela Terra. A Escuridão procura O Briar Lendário, para usar seu poder para propósitos malignos. Você deve alcançá-lo primeiro. Você deve proteger O Briar. +#Cloaked Man:Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +Entre no portal ativo a sua esquerda para iniciar sua jornada. +#Enter the active portal on your left to begin your quest. +*suspiro* Não pega bem ficar passeando por aqui. Entre no portal para iniciar sua busca. O Briar, e por extensão, o mundo estão em grande necessidade! +#*Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +LOOP +Apenas entre no maldito portal! +#Just go in the damn door! + end scene + +# After entering STREET for the first time + + scene after_ent_str +Por que você ainda está aqui? +#Why are you still here? + end scene + +# After finishing BEDROOM + scene after_bed +Siga em frente, Young. Essa chave que encontraste, devem existir outras como ela - vá a procura delas. +#Continue on, Young. That key you have found, there may be others like it - seek them out. +Vá para os mais longínquos cantos da Terra, Young. Essa é a única maneira de impedir A Escuridão. +#Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. + end scene + +# After finishing first 3 dungeons + scene before_windmill +Use essas três chaves, Young, e abra o caminho para os cantos mais profundos da Terra. +#Take those three keys, Young, and unlock the way to the deeper realms of The Land. + end scene + +#After windmill, but disappears after Sage fight + scene after_windmill +Você fez o que pedi, Young, apesar de ainda existir muito a ser feito. Talvez se você explorar as profundezas da Terra você poderá achar respostas... talvez você será de algum valor para O Briar. +#You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. + end scene + scene all_card_first + +Bom trabalho, Young. Você encontrou todas as cartas de uma área da Terra, e como resultado uma jóia apareceu no topo do portal dessa área. +#Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. + end scene + end area + area OVERWORLD + + scene bedroom_entrance +Sábio:Em breve suas habilidades serão postas a prova, Young. Para sobreviver a esse templo, você precisará de ambos força e intelecto. Suponho que você tenha encontrado uma arma, correto? +#Sage:Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? + +# Young swipes a few times +O qu-?? ... Qu-quer dizer... Sim é claro... uma vassoura! Er... exatamente como foi previsto na Lenda... +#Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +*resmungos* ... de todos os incopeten--Ei! O que você está fazendo aí parado? +#*grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +LOOP +Juízo, Young. +#Keep your wits about you, Young. + end scene + end area + area BEDROOM + + scene after_boss + +# Sage fades into room. +Sábio:Neste momento, você ainda está fraco. Se você deseja proteger O Briar da Escuridão, você deve enfrentar seus medos. A carta que encontrará neste baú, e outras como ela, são o símbolo do seu crescimento. Adquirir tais cartas é vital para sua jornada. +#Sage:At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +Essa chave também terá um papel importante em sua busca. Você deve procurar outras chaves como ela. Selecione o mapa na tela de menu para se teletransportar de volta para a entrada do templo e dar continuação a sua heróica jornada. +#That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +Explore o Sudoeste dos terrenos do templo... você encontrará um uso para essa chave. +#Travel East and South through the temple grounds... you will find a use for that key. +LOOP +O que, você quer que eu te carregue nas costas para o portão ou algo assim? +#What, do you want a piggy back ride to the gate or something?? + end scene + end area + area TERMINAL + + scene before_fight +Sábio:Por que você não me escuta?! Se você se apressar como um idiota, colocará em perigo não só O Briar, mas também A Terra e tudo para o qual trabalhei! Me desculpe Young, mas se você não me escutar, eu terei que convencê-lo de outra forma... +#Sage:Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... + end scene + scene after_fight +Sábio:Young... Não era para acabar assim... Eu queria que você se tornasse uma pessoa melhor. Eu queria que você ajudasse O Briar. Mas tudo isso é apenas um jogo estúpido... Não posso lhe impedir de chegar ao Briar. Apenas lembre de minhas palavras quando tudo for para o inferno. +#Sage:Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. + end scene + scene entrance +Sábio:Olá, Young. Quando você se tornar um indivíduo mais forte e sábio, este caminho lhe levará até O Briar. +#Sage:Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +Sábio:Você não está preparado Young, primeiro você ainda precisa enfrentar mais desafios na Terra. +#Sage:You’re not ready Young, first you must face more trials in The Land. +Sábio:Você fez algum progresso, Young, mas você deve coletar pelo menos 36 cartas para abrir esse portão. +#Sage:You have made progress, Young, but you must collect at least 36 cards to pass this gate. + end scene + +# non idlnig stuff + scene etc +Sábio:Ah... umm... você tem pelo menos 36 cartas? Mas eu não acredito de que você esteja pronto para o derradeiro teste. De fato, olhe, nós estávamos lendo este portão errado, você precisa na verdade de\n...\n......\n92 cartas para abrí-lo, e não 36! +#Sage:Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +Sábio:Young, não vá, você não está preparado! Pense no Briar! Na Terra! Tudo será em vão se você não estiver pronto! +#Sage:Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! + end scene + end area + area REDCAVE + + + + scene one +TOP +Sábio:Excelente trabalho, Young. Você teve não só que conquistar esse monstro mas também seus medos para emergir vitorioso!!! +#Sage:Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +Sábio:Mas é claro, você ainda tem um longo caminho pela frente. Você tem explorado A Terra? +#Sage:Of course, you still have a long way to go. Have you been exploring The Land? + end scene + end area + area CROWD + + scene one +Sábio:Muito bem, Young. No entanto, ainda existem desafios a serem superados. Não perca seu foco. +#Sage:Well done, Young. However, there are still trials to face. Do not let your guard down. +Sábio:Você encontrou todas as chaves, Young? Se não, vá para a praia. +#Sage:Have you found all of the keys yet, Young? If not, go to the beach. + end scene + end area + end npc + + + + +npc cliff_dog + area CLIFF + scene top_left +Eu não sou como os outros! *auau* Eu não irei machucá-lo... +#I'm not like the others! *woof* I won't harm you... +É uma existência pacífica aqui em cima. +#It is a quiet existence up here. +Você cheira a alcega. +#You smell like swiss chard. +LOOP +*auau* +#*woof* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +Você conseguiu, Young! Você derrotou A Escuridão! Olhe em volta! Que belo! +#You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +Tão belo... +#So beautiful... + end scene + scene dump + +Graças a deus você chegou! Estava preocupado pensando que você poderia estar preso naquela birosca congelada... Aquele lugar é depressivo pra caralho! +#Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +Hahaha. Hahahahaha. HAHAHAHAHAHAHA! +#Hahaha. Hahahahaha. HAHAHAHAHAHAHA! + end scene + scene drink + +Ei bonitão, deixa eu comprar um drink pra você. +#Hey sexy, I’ll buy you a drink! +Tome outro drink, seu merda! Hahaha! +#Have another drink, you little shit! Hahaha! + end scene + scene hot + +Porra, está quente aqui... Estou suaaaaando... +#Fuck, it’s hot here... I’m so hot... and sweatyyy... +Droga, malhar me deixa com tesão! +#Damn, working out makes me horny! + end scene + scene gold + +Você sabia que esse lugar é feito de ouro? Ouro de verdade! Nós poderiamos fugir juntos e viver dos tijolos daqui! Wahahahaha! +#Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahahaha! +Sério mesmo, porque você está aí parado? Me ajude a tirar esse tijolo aqui. +#Seriously, why are you just standing there? Help me jack this brick! + end scene + scene briar + +???:Young... Você finalmente conSeguIU! VoÊc ME ssalvOU AgOrE TuDo FICARÁ beN dE nOvO!!!! +#???:Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! + end scene + end area +end npc + + +# +# +# 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +CUIDADO! +#HEADS UP! + +#Mitra swerves to avoid you and crashes +Desculpe pelo que aconteceu... Eu estava indo muito rápido. Hm, Eu nunca vi você antes! Você é um colega viajante? ... Ahm? Você quer proteger o Briar da maligna Escuridão? ^Bem... Eu não tenho idéia do que você está falando, mas me parece legal! +#Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +Eu viajo por aí, pedalando Wares. Wares é o nome da minha bicicleta! +#I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! + +#Plays if you talk 3 times, or if you leave the screen +Eu já vou indo, quem sabe a gente se encontra outra hora. Caso eu ouça algo sobre o Briar eu conto pra você. +#Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. + +#Mitra bikes away + end scene + end area + area BLUE + scene one +CUIDADO! Muito bem Wares, vamos lá! +#HEADS UP! All right Wares, let’s do this! +GERÔNIMO! +#Annnd presto! +Vá lá, Young, nós seguramos as pontas aqui! +#Keep going, Young, we’ve got your back! + end scene + end area + area FIELDS + + scene init +Lembra de mim? Esqueci de me apresentar da última vez, só apresentei minha bicicleta, Wares. Meu nome é Mitra. +#Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +Lembra de mim? Eu esqueci de me apresentar da última vez, meu nome é Mitra, e essa jovem bicicleta se chama Wares. +#Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +LOOP +Mitra:Com tem ido, Young? ...o que? Como eu sei o seu nome? Você acha estranho? Bem, ele está escrito na parte de trás do seu capuz. +#Mitra:So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +Mitra:Nos vemos por aí, Young! +#Mitra:See you around, Young! + end scene + scene quest_event +Mitra:Ei, acabei de lembrar - mais cedo alguém falou que estava procurando algo e que iria para as montanhas. Não entendi do que se tratava. +#Mitra:Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. + end scene + +# Hints for the game - not cards + + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) + +# 0 ignore this +Nada. +#Nothing. + +# 1. Beach hint (no dungeons finshed) +Hm, está perdido? Tentou procurar algo na praia? Talvez exista alguém lá que possa te ajudar. ^Parece que essa sua chave é de uma coleção. Talvez você precise achar mais delas? +#Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +# 2. Forest hint (no dungeons finished) +Hm, está perdido? Tentou a floresta? ^Essa sua chave - parece que ela é de uma coleção. Talvez você precise achar as outras? +#Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +# 3. Windmill hint +Parece que você achou todas as chaves! ^Eu lembro de ter visto alguns portões no sudeste, talvez você deva usá-las lá? +#Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +# 4. Generic hint to go past statues +Ei, eu vi que você ligou a turbina eólica! Sabe se isso teve algum efeito na Terra? +#Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +# 5. finished 6 bosses, all 36... +Nossa Young! Você realmente conseguiu uma porrada de cartas! Já descobriu pra que elas servem? Com essa quantidade você pode conseguir um bocado de coisas! +#Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +# 6. hints for go things +O que é esse novo acessório para vassoura que você tem? Ele permite modificar a estrutura do mundo...? Honestamente, isso é assustador Young. Ainda bem que isso parece não funcionar em qualquer lugar. Talvez só nos lugares mais profundos e estranhos da Terra. +#What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +# 7. crowd finished but not redcave +Está gostando dos seus sapatos de pulo? Bem maneiros, não é? Eu estou amando meus novos sapatos para pedalar. Eles fazem Wares e Eu um time ainda melhor! +#How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! + +#8. redcave finished but not crowd +Maneiro, Young, você achou outra chave. Wares gosta dessa cor! Já descobriu um lugar para usá-la? +#Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +Mitra:Young, está a procura de cartas?\Procurou ao redor da área do templo do Aquele que Vê? +#Mitra:Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +Mitra:Young, está a procura de cartas?\nOuvi dizer que existe um labirinto na saída traseira do templo de Aquele que Vê +#Mitra:Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +Mitra:Young, está a procura de cartas?\nVocê deve achar algo perto do lar de Aquele que Vê +#Mitra:Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +Mitra:Young, está a procura de cartas?\nTem uma sala cheia de inimigos no templo de Aquele que Vê, não é? +#Mitra:Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +Mitra:Young, está a procura de cartas?\nJá procurou por todos os lugares do templo de Aquele que Vê? +#Mitra:Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +Mitra:Young, está a procura de cartas?\nTente procurar na área vestigial perto da saída traseira do tempo de Aquele que Vê +#Mitra:Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +Mitra:Young, está a procura de cartas?\Talvez seu vizinho saiba de algo. +#Mitra:Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +Mitra:Young, está a procura de cartas?\nEu sei que o cara no seu apartamento estava escondendo algo... +#Mitra:Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +Mitra:Young, está a procura de cartas?\nEm algum lugar perto da entrada do seu apartamento... procure por lá! +#Mitra:Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +Mitra:Young, está a procura de cartas?\nJá procurou em todos os lugares do seu apartamento? +#Mitra:Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +Mitra:Young, está a procura de cartas?\nExistem uma ilha ao sul daqui. Eu nunca fui lá, mas acho que vale a pena você dar uma olhada. +#Mitra:Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +Mitra:Young, está a procura de cartas?\nMuitas coisas podem ser encontradas se você seguir os rios. Comece por aí! +#Mitra:Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +Mitra:Young, está a procura de cartas?\nEu lembro que alguém deixou uma carta perto da turbina eólica. +#Mitra:Hey Young, looking for a card?\nI know someone left a card near the windmill. +Mitra:Young, está a procura de cartas?\nProcure pelos rios na floresta. +#Mitra:Hey Young, looking for a card?\nLook around the rivers in the forest... +Mitra:Young, está a procura de cartas?\nTente procurar na base das montanhas. +#Mitra:Hey Young, looking for a card?\nTry poking around the base of the mountains. +Mitra:Young, está a procura de cartas?\nJá tentou procurar no cume das montanhas? +#Mitra:Hey Young, looking for a card?\nTry going to the summit of the mountains. +Mitra:Young, está a procura de cartas?\nNo lugar mais longínquo da praia deve ter algo. +#Mitra:Hey Young, looking for a card?\nThe far end of the beach may hold something. +Mitra:Young, está a procura de cartas?\nFaça uma caminhada pela floresta vermelha. +#Mitra:Hey Young, looking for a card?\nTake a walk in the crimson woods. +Mitra:Young, está a procura de cartas?\As cavernas vermelhas estão cheias de portas trancadas, não é? +#Mitra:Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +Mitra:Young, está a procura de cartas?\nTente a caverna vermelha do norte - siga o rio até o fim! +#Mitra:Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end! +Mitra:Young, está a procura de cartas?\nNa caverna vermelha ao norte, procure pela nascente do rio! +#Mitra:Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +Mitra:Young, está a procura de cartas?\nHmm... já tentou procurar por todos os lugares do labirinto sombrio? +#Mitra:Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +Mitra:Young, está a procura de cartas?\nLembro de um caminho cheio de lança-chamas em algum lugar. Deve haver algo no fim dele! +#Mitra:Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +Mitra:Young, está a procura de cartas?\nEsse pessoal do circo devem está escondendo alguma coisa. Já olhou por todos os lados? +#Mitra:Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +Mitra:Young, está a procura de cartas?\nJá tentou procurar na área ao redor do poço daquele casal? +#Mitra:Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +Mitra:Young, está a procura de cartas?\nTem um casal que gosta de se encontrar perto de um poço. Eles devem estar escondendo algo. +#Mitra:Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +Mitra:Young, está a procura de cartas?\nAlgumas vezes coisas são escondidas em locais cercados por abismos - especialmente em cavernas nas montanhas! +#Mitra:Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +Mitra:Young, está a procura de cartas?\nTente procurar nos pontos mais altos das cavernas nas montanhas. +#Mitra:Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +Mitra:Young, está a procura de cartas?\nSerá que há algo nas profundezas daquelas cavernas na montanha? +#Mitra:Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +Mitra:Young, está a procura de cartas?\nAquele cubo colorido naquele lugar estranho - provavelmente ele deve ter algo! +#Mitra:Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +Mitra:Young, está a procura de cartas?\nJá tentou falar com aquele cubo cinza naquela área maluca? Talvez ele saiba de algo! +#Mitra:Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +Mitra:Young, está a procura de cartas?\nO andar de cima daquele hotel está meio caído, mas ele deve ter algo! +#Mitra:Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +Mitra:Young, está a procura de cartas?\nVocê já procurou por todos os lugares do terceiro andar do hotel? +#Mitra:Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +Mitra:Young, está a procura de cartas?\nAposto que alguém deixou algo no segundo andar do hotel. +#Mitra:Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +Mitra:Young, está a procura de cartas?\nO dono do hotel deve ter deixado algo para você! +#Mitra:Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +Mitra:Young, está a procura de cartas?\nAquelas pontes quebradas ao noroeste... procure por lá! +#Mitra:Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +# and a bonus one if for some reason you make it this far without finding any... +...Ahm?! Você não achou *nenhuma* carta? Cara, Young, você está louco! Algumas vezes na vida você tem que ser aventureiro. Abra algumas caixas, saca? +#...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? + end scene + +#General random stuff + + scene general_banter +Você achou aquele cara que estava procurando por algo nas montanhas? +#Did you find that guy who was looking for something in the mountains? +Você sabe qual é o sobrenome da minha bicicleta? Waldo! Manja? Wares Waldo! ... Brincadeira, bicicletas não tem sobrenomes. +#Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +Acha que eu devo comprar uma trava para bicicletas? Eu odiaria prender Wares assim, mas ouvi dizer que roubos de bicicletas estão em alta. +#Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +Então, o que é esse tal de Briar? Algum tipo de artefato de uma cultura perdida? +#So what is The Briar? Some sort of ancient artifact from a lost culture? +Por que será que eu não ouvi nada sobre a chegada da Escuridão? Talvez a maioria das pessoas estão ocupadas demais com seus problemas do dia a dia. +#I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +Ei Young, eu só queria te dizer que... seu cabelo é irado. +#Hey Young, I just wanted to tell you... your hair is awesome. + end scene + end area + +end npc + + +# +# +# Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +Estátua:O Ancião do Vilarejo é apenas em nome, pois ambos ele não é. +#Statue:The Village Elder in name only, for he is neither. + end scene + end area + area OVERWORLD + + scene bedroom_entrance +Estátua:Eu vi uma vassoura em uma lenda... estava no mapa de um armário de zelador. +#Statue:I’ve seen a broom in a legend... it was on the map of a janitor closet. + end scene + end area + area BEDROOM + + scene after_boss +Estátua:Adquirir cartas é vital para sua jornada. Adquirir cartões é vital para outras jornadas, como conseguir crédito. +#Statue:Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. + end scene + end area + area REDCAVE + scene one +Estátua:Excelente trabalho, Sábio. Você teve que conquistar não só o seu temperamento mas também a sua dignidade para dizer uma frase tão manjada!!! +#Statue:Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! + end scene + end area + area TERMINAL + scene one +Quando você se tornar um indivíduo mais estressado e apático, esse caminho irá lhe levar ao Vinte Sabores. +#When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! + end scene + end area +end npc + + +# +# +# sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced + +# This line must be played once before anything else can +Eduardo:Há um tempo atrás um homem veio e instalou um espelho no nosso banheiro. Eu tinha medo de que uma câmera estivesse dentro dele. Coloquei sabão em cada centímetro da moldura de madeira na esperança de causar um curto-curcuito. Nunca encontrei nada, é claro. +#Edward:Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +LOOP +Eduardo:Esse templo é dedicado a Aquele que Vê. Eu não sei porque vim aqui, estou assustado demais para entrar. +#Edward:This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. + end scene + scene bedroom_not_done +Eduardo:Está com problemas? Eu já imaginava. Tudo que você tem é uma vassoura, e tudo que uma vassora pode fazer é mover sujeira. +#Edward:Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. + end scene + scene bedroom_done +Eduardo:Quer dizer que você derrotou Aquele que Vê? Você não entende que não é assim que as coisas funcionam? Você só está colocando sabão no espelho. +#Edward:You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. + end scene + end area +end npc + + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +Ah, que adorável. Pequenino Young, brincando de ser herói. Testemunhei todos seus passos na Terra, e tenho que dizer, Young, nem todo mundo aqui é tão honesto quanto eu. Tenha cuidado com quem você confia. +#Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! + end scene + scene after_fight +Eu estarei com você, Young, onde quer que você esteja. Lembre-se do meu conselho durante sua pequena aventura. +#I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". + end scene + end area +end npc + +# rock (Rock with words) +npc rock + area BEDROOM + scene one +Pedra:Visão periférica é o lar do satanás. +#Rock:Peripheral vision is the hive of demons. + end scene + scene two +Pedra:Lista de Tarefas:Construir um método de transporte para o Nexus. ^Progresso: Aquele que Vê não dará os fundos necessários para realizar esse empreendimento. Teremos que reverter para o método original dos inexplicáveis portais. +#Rock:To-do:Construct method of transportation to Nexus. Progress:Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. + end scene + scene three +Pedra:Estou aprisionado aqui sozinho. O trabalho nesse túnel é constante, e a cada dia consigo ver um pouco de progresso. +#Rock:I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. + end scene + end area + area BLUE + scene one +Esta é a roda que usamos para construir a barragem. +#This wheel is used to lift the dam. + end scene + end area + area CIRCUS + scene one +24 de Junho de 1957:Trapézio quebra. Alice Rutgers voa em direção ao chão, resultando em duas canelas fraturadas. +#June 24th, 1957:Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. + end scene + scene two +17 de Julho de 1957:Sete palhaços se aposentam com problemas pulmonares quase fatais. Especialistas suspeitam da marca de maquiagens TERRAMAIS, mas nenhuma investigação formal está em andamento. +#July 17th, 1957:Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. + end scene + scene three +21 de Julho de 1957:Seguinte ao mau funcionamento de uma jaula, meu rosto e laterais foram severamente desfigurados por um leão não treinado. Eu sobrevivi, mas agora temo o meu próprio reflexo. +#July 21st, 1957:Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. + end scene + scene four +5 de Agosto de 1957:No meu sonho, vi um rosto de pedra com fortes, olhos brilhantes. Ele revelava a verdade da nossa existência e foi o primeiro a oferecer a liberdade da dor. +#August 5th, 1957:In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. + end scene + scene five +7 de Agosto de 1957:Quantos de nós sofrerão antes de aceitarmos a verdade do Aquele que Vê? +#August 7th, 1957:How many of us will suffer before we accept the truth of the Seeing One? + end scene + scene six + +8 de Agosto de 1957:Cheguei a uma decisão. Alguns disseram que iriam me seguir. Essa é minha última anotação. Que o Aquele que Vê olhe favoravelmente para nós. +#August 8th, 1957:I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. + end scene + end area + area CLIFF + scene one +(Rabiscos indecifráveis) +#(Indecipherable markings) + end scene + scene two +7 de Dezembro de 2010. (Nome Ilegível). Não há nada aqui em cima, exceto essa pedra estúpida! +#December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! + end scene + scene three +Perigo! Essa caverna ainda não foi explorada. +#Danger! This cave is unexplored. + end scene + scene four +Esses penhascos se extendem para o alto e avante, se bem que eu nunca fui alto o suficiente para saber onde é que vai dar. +#These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. + end scene + end area + area CROWD + + + scene one +Pedra:Como? +#Rock:How? + end scene + scene two +Pedra:Perigo! Queda vertical, pule por sua conta e risco. +#Rock:Warning! Vertical drop, jump at your own risk. + end scene + end area + area DEBUG + + scene one +Essa costumava ser a animação para o portão das cartas. Se aproxime dele mais de uma vez para ver as animações de abrir e fechar! +#This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +Eu esqueci porque ela foi removida. Talvez por ser dramática demais. +#I forget why we ended up scrapping it. Perhaps too dramatic. + end scene + scene two + +Aqui estão testes para várias camadas de ladrilhos e colisões! Eu não consegui fazer ladrilhos de mão única para os dois lados (como paredes) +funcionarem bem e acabei removendo esse conceito do jogo... ou algo assim. +#Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +Há uma razão para não usá-los. Simplificar o design, o que foi muito importante para nós terminarmos o jogo. +#There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. + end scene + scene three + +Inimigos costumavam deixar cair chaves. Essa idéia foi removida mesmo sendo bem divertida. +#Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +Outra ideia que tivemos foi a de existir portões de desafio, que +ficariam no final de uma arena e só abririam se você os alcançasse sem se ferir. +#Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +Queríamos modelar todos os calabouços a partir disso e remover o sistema de vida completamente, mas isso se provou muito difícil! +#We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! + end scene + scene four +PRISÃO!!! +#PRISON!!! +NOS SALVE!!! +#Save us!!! +Por favor! +#Please! + end scene + scene five +Bem-vindo ao MUNDO DE TESTES! Você não está mais na Terra, então considere esse mundo(90 POR-CENTO) não canônico. +#Welcome to the DEBUG WORLD! You've stepped outside of The Land, so consider this world (90 PER-CENT) Non-canon. Anyways. +Antes de muitos conjuntos de ladrinhos estarem completos eu usei ladrilhos bobos como esses para marcar onde as portas deveriam ficar. De fato, todos os calabouços foram projetados com os ladrilhos desta área, e então Marina substituiu pelos seus. +#Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. + end scene + scene six +fille +#fille + end scene + end area + area DRAWER + + scene five +- ARQUIVOS - +#-ARCHIVES- +PROSSIGA COM CAUTELA +#PROCEED WITH CAUTION + end scene + scene four +Oeste. Fenda. Realidade! Baixos valores imobiliários, velho, acabado. Relaxante. +#West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. + end scene + scene three +Aquele que Vê pelo que me lem- brbrr,,,,,Momentos Relaxantes em Casa. +#The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. + end scene + scene two +CONGELADOR\n\n^ -- A GERÊNCIA +#COLD STORAGE\n\n^ -- THE MGMT + end scene + scene one +CONTINUE +#CONTINUE + end scene + end area + area FIELDS + + scene one +Oeste:Praia\n\nLeste:Floresta\n\nSudeste:\n Área Chuvosa\n\nNorte:\nÁrea do Templo\n\nNordeste:Abismo +#West:Beach\n\nEast:Forest\n\nSoutheast:\n Rainy Area\n\nNorth:\nTemple Grounds\n\nNorthwest:Abismo + end scene + end area + area FOREST + + scene one +Oeste:Lago\nSul, em seguida leste:Penhascos +#West:Land Lake\nSouth, then east:Cliffs + end scene + scene two +Lagoa do Relaxamento. Fique um pouco, sabemos que você tem tempo. +#Relaxation pond. Stay a while, we know you have the time. + end scene + scene three +Eu temo estar preso neste lugar para todo o sempre. +#I'm afraid I may be stuck on this tiny corner forever. + end scene + scene four +Leste:Penhascos +#East:Cliffs + end scene + end area + area GO + + scene one +O caminho se abrirá quando as peças dos guardiões sombrios forem substituídas pela sua cor espiritual na formação abaixo. +#The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. + end scene + scene two + +Quando a pedra azul se locomoveu\nLá um novo caminho se revelou\nPassando dos penhascos, através de dimensões\nExiste um hotel para viajantes\n\n\n\"Quem é o guardião?\"Eu pergunto,\n\"Quem comanda esse abarrotado local de negócios ?\"\nApesar de todas as almas humanas\nEu ainda me sinto só. +#When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. + end scene + scene three + +A vermelha e enferrujada estátua se moveu\nE abriu caminho para poços profundos\nUm labiríntico calabouço seguiu\nLogo após, uma grande tenda de circo\n\n\n\"Quem são os guardiões?\"Eu pergunto\n\"Quem deu a vida para salvar este local?\"\nEu temo a dor, assim como eles\nMas o que realmente temo, é a morte. +#The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. + end scene + scene four + +A verde, metálica estátua se deslocou\nDando caminho a uma trilha profunda\nCasas suburbanas e calçadas se formam\nO caminho para um apartamento\n\n\n\"Quem é o guardião?\"Eu pergunto\n\"Quem procura conforto nas estrelas?\"\nSozinho, eu me sinto vigiado.\nNão pela amigável luz das estrelas. +#The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. + end scene + end area + area BLANK + +#initial entrance from windmill + scene one +Pedra:Este território não foi anexado, portanto ainda não é parte da Terra. +#Rock:This is unclaimed territory - not yet a part of The Land. + end scene + +#concentric circles + scene two +Pedra:Esses -^ círculos são^ promessas... Eu irei^ concêntricos^ tentar completar tudo...^ Brrur, Brur... +#Rock:These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. + end scene + +#islands + scene three +Pedra:Veja^ -...mas eu sempre^ - seus passos^ - acabam reaparecendo, não? ^ - quando aqui! +#Rock:Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! + end scene + +#mazeish place, not near the portal + scene four +Pedra:Olhando para baixo^ - E eu percebi^ - daqui, você- ^ Eu o amo.^ - consigo ver... nada. +#Rock:Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. + end scene + +#left part of the 48 gate + scene five +Pedra:Minhas desculpas - ^Sim, nós -^ nessa bagunça aqui -^ devemos manter contato -^ mas aquele portal deve ^ - e eu tentarei dar minhas opiniões para você -^ retornar você para A Terra. +#Rock:My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. + end scene + end area + area NEXUS + + + scene one +Algumas pessoas terão coisas novas a dizer se você falar com elas várias vezes. +#Sometimes if you talk to people multiple times, they have new things to say. +O mesmo não se aplica para pedras, pedras não curtem esse tipo de coisa. +#But not rocks. Rocks don’t do that. + end scene + +#before 49 card agate + scene two +Pedra:Quase! +#Rock:So close! If only... + end scene + +#door that goes nowhere + scene three +Pedra:Curiosidade é algo ótimo. +#Rock:Curiosity is a great thing. + end scene + +#below treasure box + scene four +Pedra:Ah!...? +#Rock:Oh!...? + end scene + scene five +O terminal do computador tem um e-mail aberto. Partes da tela estão quebradas, assim apenas partes da mensagem estão visíveis entre as manchas pretas\" Olá, Young! Parece que [...] quinquagésima carta [...] talvez você não deva [...] vale a pena considerar! Acha que está pronto? Acorde...\" +#The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads:\"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" + end scene + end area + area OVERWORLD + + + scene one +Pedra:Aposto que você está lendo uma pedra porque você não tem amigos. +#I’ll bet you’re reading a rock because you don’t have any friends. + end scene + scene two +Pedra:Bem vindo a Estação do Sobresolo. Esperamos que tenha desfrutado do seu tempo na Terra. +#Rock:Welcome to Overworld Station. We hope you enjoyed your time in The Land. + end scene + scene three +Pedra:Um explorador você é! +#Rock:An explorer is you! +Pedra:Por favor não vá em direção ao sul. Está sob construção. +#Rock:Please don't go south. It's under construction. + end scene + scene four +Pedra:Tesouro em 5,3! +#Rock:Treasure in 5,3! + end scene + scene five +Pedra:Haha, bobo! +#Rock:Haha, gotcha! + end scene + end area + area REDCAVE + + scene one +NÓS NASCEMOS DENTRO DAS RUÍNAS DO CORPO DE NOSSA MÃE. +#WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. + end scene + scene two +UM DIA NOSSA MÃE DEIXOU A MÃE DELA E SE AVENTUROU NO NEVOEIRO VENENOSO. +#ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. + end scene + scene three +NÓS NÃO QUERIAMOS ISSO. NÃO TERIAMOS COMPRADO NOSSAS VIDAS AS CUSTAS DO SOFRIMENTO DELA. +#WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. + end scene + end area + +# area for redsea + area REDSEA + scene one +Pedra:Sinais indicam que as árvores não foram ativadas por um longo período de tempo. +#Rock:Signs indicate the trees have not been active for an extended period of time. + end scene + scene two +Pedra:Sul:???^ Norte:??? +#Rock:South:???^ North:??? + end scene + scene three +Pedra:Dizem que o terreno irregular foi formado pelos ancestrais dos habitantes desta área. +#Rock:The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. + end scene + scene four +Pedra:Eles aparentam ser uma espécie pacífica. +#Rock:They appear to be a peaceful species. + end scene + end area + area SPACE +#middle + scene one +Escrito em o que aparenta ser um marcador permanente:Saudações, colega viajante do ESPAÇO e TEMPO.^ Você se encontra em uma fenda distante da área justaposta de YOUNG.^ Você atravessou um OCEANO ou dois, por assim dizer.^ Não se preocupe com o CONTRASTE, você pode retornar a sua aventura rapidamente.^ Não TEMA esse local, apesar dele parecer AMEAÇADOR e PERIGOSO você irá ver que seus habitantes são bastante AMIGÁVEIS. \n -- A GERÊNCIA +#Scribbled in what appears to be permanent marker:Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + (Abaixo da mensagem, uma escritura:)Aqui jaz (ilegível). Ele se perdeu na floresta. +#(Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (Ainda mais abaixo da mensagem:)(apenas não vá para tão longe ao sul) +#(Even further below the message:) (just don't go too far south.) + end scene + +# extra color + scene two +Aqui jaz (ilegível. Quem escreveu isso?). Ele foi impalado por um arco-íris! +#Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbow! +Seria melhor com conquistas. +#Would've been better with achievements. + end scene + +#grey graves + scene three +Aqui jaz Burd. Os penhascos não estavam se sentindo muito amigáveis. +#Here lies Burd. The cliffs weren't feeling too friendly. + end scene + scene four +Aqui jaz mochila. Nunca teve uma chance. +#Here lies bag. It never had a chance. +Pretensioso! +#Pretentious! + end scene + +# color graves + scene five +Aqui jaz Savitch. Ele tentou consertar meu computador na garagem uma vez, e não tomou muito espaço enquanto o fazia. Três anos depois, ele ainda não tinha acabado. Então, ele caiu morto. +#Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. + end scene + scene six +Aqui jaz Dave. Ele não era muito inspirador. +#Here lies Dave. He wasn't very inspirational. + end scene + end area + + area SUBURB + scene one +---MUNICÍPIO DE YOUNG---^\nBem vindo ao Município de Young. Por favor tome cuidado com alguns dos cidadãos.^ Eles não sabem brincar... tome cuidado. O Município de Young foi fundado nos anos 90 pelo prefeito Ying como parte de uma série de projetos habitacionais ainda em andamento, o nome foi escolhido levando em conta o fato de que Ying nega possuir o nome de Ying e que afirma possuir o nome Young.^ Esperamos que tenha uma ótima estadia. +#---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + end scene + scene two +Ao Oeste se localizam os lendários templos do Aquele que Vê.^ No leste está a maravilhosa moradia do Prefeito Ying, que está fechada para visitas do público - invasores cuidado. +#To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + end scene + scene three +Em sua quinta visita, Prefeito Ying se frustrou com a falta de estacionamentos. Esse estacionamento reflete a frustração do Prefeito Ying com a falta de estacionamentos. Ying ocasionalmente estacionava nesse estacionamento em suas visitas subsequentes. +#On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + end scene + scene four +Eu lembro das longas frases que eu costumava escrever. Ha! Fragmentadas! +#I remember the long sentences I used to write. Ha! Fragmented. + end scene + scene five +UMA SITUAÇÃO PERIGOSA +#A DANGEROUS SITUATION + end scene + end area + +# Area for TRAIN (it's actually CELL sorry) + + + area TRAIN + scene one +Aquele que Vê sabe de tudo e conduzirá um para a iluminação. O caminho para a iluminação não é iluminado por tochas. +#The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. + end scene + scene two +Não se distancie do caminho do Aquele que Vê, nem mesmo pelos tesouros nos mais distantes cantos do labirinto. +#Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. + end scene + scene three +Mova-se. +#Move along. + end scene + scene four +Não irrite os Procuradores com violência. +#Do not anger the Chasers with violence. + end scene + end area + area WINDMILL + scene one +MARCO CÊNICO:Torres Parceiras. Construídas há algum tempo, as Torres Parceiras negligenciavam as montanhas distantes. A primeira torre foi danificada previamente e desde então foi reaproveitada. A segunda ainda está de pé ao leste, alcançando o céu. Devido a motivos de segurança, o caminho para a torre foi desativado até aviso prévio. +#SCENIC LANDMARK:Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. + end scene + scene two +AVISO DE SEGURANÇA PÚBLICA:^\nDizem que esta torre, enquanto não danificada, tem uma fenda dimensional no seu topo. Prossiga com cuidado e mente aberta.^\n -- A GERÊNCIA +#PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT + end scene + end area +end npc + + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +A estátua não está com cara de que irá mover. +#The statue does not look like it will be moving anytime soon. + end scene + scene two +A estátua se moveu. +#The statue has moved. + end scene + end area + area REDCAVE + scene one +Parece que a estátua está firme. +#It looks like this statue is firmly in place. + end scene + scene two +A estátua se moveu. +#The statue has moved. + end scene + end area + area CROWD + scene one +Esta estátua não parece ser móvel. +#This statue does not seem to be movable. + end scene + scene two +A estátua se moveu. +#The statue has moved. + end scene + end area +end npc + + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +Fogo é algo belo, não é? Que pena que o brilho dos postes de rua escondam o fogo das estrelas. +#Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. + end scene + scene after_fight +Certo, as estrelas não são feitas de fogo. ^Quem se importa? +#Okay, so stars aren't really made of fire. ^Who gives a shit anyway? + end scene + end area +end npc + +npc cube_king + area SPACE +# kings are supposed to offer info on + scene color +Como vai você? Sou o governante dessa partição e interpretação do espaço. +#How are you today? I'm the ruler of this partition and interpretation of space. +Você quer saber por que eu sou o governante deste local? Eu lhe direi, mas essa é uma longa história. Digo, realmente longa. Ofensivamente longa. +#You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. +Vai demorar mesmo. Não estou brincando! Tenho tendência a tagarelar. Talvez seja melhor você ir atrás daquele baú alí. Ou ir em direção ao hotel lá longe. Não sei como ele chegou aqui, mas sei que eles cobram barato. Não que o dinheiro tenha algum valor aqui. +#Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. +LOOP +Por que eu sou o governante?^... Eu não tenho certeza, meus amigos que me colocaram nessa posição, devido ao estado imediato deste espaço. Talvez seja isso pois cubos são os melhores quando se trata de ficar parado em superfícies planas. Quanto ao porquê de alguém precisar ficar aqui - eu não faço ideia! +#Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! +Os outros - meus amigos ali - tem seus próprios méritos.^ Não é como se eles não tivessem a capacidade de sentar aqui no futuro, eles apenas são incapazes no momento.^ De vez em quando, nós trocamos de governante, mas todas as vezes, temos de reinterpretar essa região do espaço! Talvez o Sr. ou a Sra. Pirâmide venham até aqui porque decidimos transformar o trono em um formato para melhor encaixá-los, re-imaginando esse mundo, por assim dizer.^ Isso soa meio estranho? Talvez. Mas é assim que as coisas são. Tudo acontece muito rápido. Minutos, horas - náo é necessariamente um longo reinado. +#The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. +Apesar de que, quando eu sou o governante, eu me sinto estranho...^ De alguma forma me sinto isolado, querendo se afastar dos outros... +#Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... +...isolado não é palavra que quero, mas ela cobra parte do sentimento. Eu não estou isolado, e eu não desgosto dos outros. Nós nos consideramos amigos, mas você sabe, ninguém passa por aqui a não ser para falar algumas palavras. Assim eu tenho que pensar sobre alguma coisa ou enlouqueço! Talvez seja por causa do isolamento. +#...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. +Fora as questões fúteis do porque estamos ocupando esse espaço, estou curioso com o porquê de sermos amigos. +#Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. +Eu gosto de pensar que sempre que estamos de acordo com as interpretações de que sou o melhor para governar, eles me dão conforto em ter a capacidade de manter essa posição pelo tempo que for necessário para atingir a próxima interpretação. Sabe, encorajamento e coisas do tipo, a presença física deles, essas coisas me confortam. +#I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. +Suponho que isso é o suficiente para me satisfazer, apesar de que seria legal se um ou dois deles entendessem como me sinto como governante. Não que eu esteja reclamando sobre o encorajamento! Talvez um dia, nós possamos ter vários governantes...quem dera! Talvez isso implique que quando eu não sou o governante, devo agir da mesma maneira que às vezes gostaria que agissem...quem sabe se isso pode ser feito. +#I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. +Já falei demais. Se você for na outra direção, encontrará outra região similar do espaço, apesar de eu achar que ela cheire um pouco diferente. +#I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. +Foi um prazer lhe conhecer. +#It was nice to meet you. +Ah, quer ouvir minha história mais uma vez? +#Oh, you want to hear my story again? +Tudo bem, vamos lá. +#Okay, sit tight. + end scene + scene gray +Olá. Eu sou o governante dessa parte do espaço. +#Hello there. I'm the ruler of this part of space. +O que? Quer saber por que eu estou aqui? Tem certeza? Vou precisar de muitas palavras para explicar! +#What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! +Bem, se você insiste. Embora você se sairia melhor indo para aquele hotel lá longe. Não sei por que o construíram. Se eu tivesse algum dinheiro para ser taxado, certamente reclamaria! +#Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! +LOOP +Bem, mesmo eu sendo o governante dessa parte do espaço, eu não governo ninguém. +#Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. +Esses meus amigos - todos são governantes de suas próprias partes do espaço. Ninguém governa ninguém, estamos todos sós nesse aspecto. Mas não estamos sós quando se trata de falar uns com os outros, e em outras formas também não estamos sozinhos. Esse é apenas um lugar em que eu existo. +#Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. +Meus amigos e eu - nossas partes do espaço tem muito em comum quando se trata da razão delas existirem e como estão organizadas. Interesses e desejos similares. Nós gostamos de conversar sobre como governar, e coisas do gênero. +#My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. +Mas o trágico é que raramente nós encontramos em forma física. +#But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. +Você não está falando com suas formas físicas, mas com suas representações em forma holográfica. +#So you're not actually talking to their physical forms, but a representation of them in some holographic form. +Eu sei, é lamentável. É lamentável porque nós temos tanto em comum, mas estamos limitados em como podemos nos ajudar como amigos. +#I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. +Algo bem pequeno falta quando você não tem conversas físicas frente a frente o tempo todo. +#There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. +Mas eu não estou reclamando. É melhor do que nada! Não consigo imaginar como seria sem isso. Algo terrível. +#But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. +Foi agradável falar com você, boa sorte com o que você estiver fazendo. +#It was nice talking at you, good luck with whatever you're up to. +Você ainda está aqui? Eu posso te contar tudo outra vez, se você quiser. +#You're still here? I can tell you everything again, if you'd like. + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +Crickson:Ei valentão! Não tenho medo de você! +#Crickson:Hey ya big bully! I’m not afraid of you! +Crickson:Ei cabeção! Não vou fugir! Nem mesmo se você tentar me bater! +#Crickson:Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +Crickson:Você é só um vassoureiro, é isso que você é! Você devia ter vergonha nessa cara! +#Crickson:Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! + end scene + scene thorax +Tórax:Eu sou o tórax, eu falo em nome das abelhas.\n^Seu destino é incerto, não faz parte do conhecimento delas.\n^Trabalhadores de certas colônias decolaram!\n^Com isso tais colônias estão morrendo, não é bonito de se ver! +#Thorax:I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +Tórax:Talvez seja um vírus ou um novo pesticida,\n^talvez sejam as larvas das malditas moscas Phoridae!\n^As abelhas estão agindo de forma estranha.\n^O que quer que seja, tem que mudar! +#Thorax:Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +Tórax:Certo, eu não sei o que está acontecendo\n^Temo que meus esforços sirvam para nada além de tagarelar.\n^Mas como eu posso ficar aqui sentado e não fazer nada para ajudar?\n^Já sei - irei postar no Facebook, Twitter e Yelp! +#Thorax:Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +Compre meus produtos! +#Buy my stuff + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade! +#What are you doing here, punk? Get lost! I caught it fair and square! +Não irei largar! Nem em um milhão de anos! +#I won’t let it go! Not in a million years! + end scene + scene inside +Ah, veio aqui pra me aterrorizar mais um pouco? +#Oh, did you come here to terrorize me some more? +Você está se aliando aos gatos só porque eles são macios e fofinhos. +#You’re just siding with the cats because they are cute and furry. + end scene + scene etc +TOP +O que você está fazendo aqui, mermão? Caí fora! Eu consegui na honestidade!^ AAAAAA!^ Isso aí--^ OUTRO GATO?!?!^ AAAAAAAAHH!!! +#What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +Você... você limpou minha casa... Estou emocionado! Aqui, quero lhe dar a minha mais bela posse! +#You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +Young abre o baú. Algo se encontra dentro dele! +#Young opens and takes the box. Something is inside it! +Icky:Ah, Ei Miao.^\n\nMiao:Ainda bem que você está a salvo!^\n\nIcky:Ah... obrigado pela ajuda, Young. +#Icky:Oh. Hey Miao.^\n\nMiao:I’m so glad you’re safe!^\n\nIcky:Uh... thanks for the hand, Young. +LOOP +Icky:Pra ser honesto, eu meio que gosto de sentar em caixas. +#Icky:To be honest, I kind of like sitting in boxes. + end scene + end area +end npc + +npc miao + area FIELDS + scene init +Ah!! Você é Young, O Escolhido!! Aimeudeus, que honra! Meu nome é Miao Xiao Tuan Er, Escolhido-em-treinamento! +#Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +Posso acompanhá-lo por um tempo para observar O Escolhido em ação? +#Could I follow you around for a bit to watch a Chosen One in action? +LOOP +Olá mais uma vez, Young! Posso ser sua sombra hoje? +#Hello again, Young! Can I shadow you today? + end scene + scene randoms +# 0. after talk to shopkeep +Miao:Ei, Young... você já roubou algo? +#Miao:Hey, Young... have you ever stolen anything? +# 1. After talk to mitra +Miao:Eu gosto da Mitra... e Wares não é uma bicicleta elegante? +#Miao:I like Mitra... and isn’t Wares a handsome bike? +# 2. Nexus pad +Miao:O que é essa coisa feita de pedra, Young? Ela faz você voltar no tempo? +#Miao:What’s that cool stone thing, Young? Does it make you go back in time?! +# 3. Random if Icky not saved +Miao:Estou começando a ficar preocupado com Icky... Young, você viu um gato bem grande recentemente? Icky disse que ia fazer uma caminhada pela pequena floresta ao leste. +#Miao:I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +# 4. leave map +Miao:Icky disse que eu não deveria ir para lugares perigosos. Vejo você depois, Young. +#Miao:Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +# 5, 6, 7 - only after you've seen 0, 1, 2 +Miao:Você já sentou em uma pilha de sacolas de supermercados? +#Miao:Have you ever sat in a bunch of grocery bags? +Miao:Ei Young, você acha que é errado usar erva-de-gato? +#Miao:Hey Young, do you think it’s wrong to do catnip? +Miao:Aposto que deve ter dado muito trabalho se tornar O Escolhido, né, Young? +#Miao:I bet it must have taken a lot of work to become The Chosen One, huh, Young? + end scene + +# musing after you save icky + scene philosophy +Aquela situação perigosa com o Icky me fez pensar... O que você acha que acontece depois que morremos? Como alguém consegue atingir um propósito em apenas uma vida? +#That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +Talvez reencarnemos várias vezes até completar nosso destino. Ou isso deixaria tudo fácil demais? +#Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +E qual é a recompensa por completar nossa jornada? Nós apenas se dissolvemos no nada? +#And then what is our reward for completing our journey? Do we just fade away? +LOOP +Hmm... +#Hmm... + end scene + +# icky talking after yoh save icky + scene icky +Ah. Oi, Young. +#Oh. Hi, Young. +Meu nome real não é Icky. É Ichabod. +#My name’s not really Icky. It’s Ichabod. +Espero que Miao Xiao Tuan Er não tenha se metido em muitos problemas. +#I hope Miao Xiao Tuan Er hasn’t been too much trouble. +Até logo, Young. +#See you later, Young. + end scene + end area +end npc + +npc generic_npc + area DEBUG + scene melos +E aí firmeza, como vai você? Você me achou! Eu vou continuar aqui, de qualquer forma. Está frio lá fora. +#Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +Você pode me culpar por todas essas terríveis salas! Eu as fiz com o editor de mapas DAME. +#You can blame me for all of those awful rooms! I made them with the DAME map editor. +Eu criei esse jogo com a IDE FlashDevelop e com o framework Flixel AS3! +#I made this game with FlashDevelop IDE and the Flixel AS3 framework! +Ah, é, e eu fiz a trilha sonora com o REAPER. E algumas vezes Audacity. +#Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +Eu consigo meus nutrientes através da radiação de todos esses computadores... ^Como assim isso não é biologicamente correto? +#I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +Oi mãe! ^E pai! +#Hi mom! ^And dad! +Quer saber como finalizar o jogo em 20 minutos? +#Want to know how to finish the game in 20 minutes? +Ha! Como se eu fosse contar pra você! +#Ha! Like I'd tell you! +(...talvez se você pedir gentilmente...) +#(...maybe if you ask me nicely...) + end scene + scene marina +Uau ei! +#Woah hey! +Eu escrevi um monte de diálogos para esse jogo!^ (...mas não esse. Melos está fazendo isso.) +#I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +Eu usei Adobe Photoshop CS5, Graphics Gale Free Edition e a Ferramenta de Captura do Windows 7 para fazer os gráficos! +#I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! + end scene + end area + +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +A umidade aqui é boa para sua pele, mas ruim para seu cabelo. +#The humidity here is good for your skin, but bad for your hair. +Eu gosto daqui. Ultimamente, as pessoas passam todo o verão indo do calor infernal para o frio do ar condicionado. Essas mudanças rápidas de temperatura enfranquecem seus ossos. +#I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +É como aquele maldito hábito de mastigar cubos de gelo. Minha mãe fazia isso lá pros 25 anos. Agora ela tem fissuras por todos os seus molares. +#It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. + end scene + + scene second +Lembre de trocar de sapatos e enchê-los de jornais para os deixar secos. Você não quer criar um terreno fértil pra bactérias, não é? +#Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +Por que buffets só servem gelatina vermelha? É como se eles quisessem nos dar câncer. +#Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. + end scene + + scene bomb +Sai de perto. +#Get away from me. +Falo sério... me deixe em paz. +#I’m serious... leave me alone now. + end scene + + end area + area BLUE + scene one +Não preciso da sua piedade, Young. +#I don’t need your pity, Young. +Certo, vá viver no seu mundinho feliz, \"Escolhido\"... +#Right, just go on living in your happy little world, "Chosen One"... +Young, amizade é só um truque que as pessoas aplicam em si. Somos todos babacas, e no fim, estamos todos sós. +#You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +Hah, eu sabia que você me odiava, Young. +#Hah, I knew you hated me, Young. +Eu estou bem. +#I’m doing fine. +É claro que você não se importa. Ninguém se importa. +#Of course you don’t care, no one does. + end scene + end area + + area HOTEL + scene one +Eu sei que cidades podem ser sujas, lotadas e tudo mais, mas eu gosto de vir aqui e olhar todas as luzes. +#I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +É belo de uma forma única. Não é infinito como as estrelas, mas existe algo sobre sua humanidade que adiciona uma camada maravilhosa de complexidade. +#It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +Atrás de cada luz se encontra uma pessoa com esperanças, medos e segredos... olhando dessa forma é terrivelmente solitário e ferozmente pessoal. +#Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +Eu acho que amo todas as pessoas por atrás de cada janela. Eu amo vocês, pessoas, por serem minhas estrelas. Eu amo vocês não importando o quão fudida sua vida é ou o quanto vocês acham que caíram. Vocês são amáveis nesta noite... +#I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +Desculpe, falei demais. Obrigado por escutar. +#I’m sorry, I’m babbling. Thanks for listening. + end scene + end area + area REDCAVE + + scene easter_egg +Eiiiii, parceiiiirooo...descanse um pouco, fique por um tempo, que tal? +#Heeyyyy, mannn...take a load off, stay a whilleee, eh? + end scene + end area + area APARTMENT + scene easter_egg +Ah! Você me achou! +#Ah! You found me! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what htey say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + scene quest_normal +Golem:Você foi atingido por um pedregulho na subida? As vezes eu arremesso pedregulhos quando estou com raiva. Me desculpe se foi atacado por algum. +#Golem:Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +Golem:Minha mãe sempre dizia que se eu continuar com isso, um dia eu não teria mais montanhas para arremessar. +#Golem:My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. + end scene + scene second +Golem:Quando você é uma pedra, você presencia geraçôes de pessoas indo e vindo. Você se torna mais ancião e sábio que o mais sagaz dos humanos. +#Golem:When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +Golem:Pelo menos, essa é a ideia. Eu quebrei meus binóculos um tempo atrás e assim eu não sei mais dizer o que tem ocorrido. +#Golem:At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +Golem:De fato, eu não sinto falta de assistir as pessoas, é muito entediante. +#Golem:Actually, I don’t miss watching people much, it’s a bore. + end scene + scene quest_event +Golem:Ah, sim, eu conheci alguém que estava meio perdido...ele me contou que estava indo para a praia. +#Golem:Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. + end scene + end area + area BEACH + + + scene quest_normal +Não sou uma lagosta, sou um langostino. Meu nome é Hews. +#I’m not a lobster, I’m a langostino. The name’s Hews. +LOOP +Hews:Sabe qual é a melhor parte do oceano? O horizonte. +#Hews:You know what the best part of the ocean is? Being able to see the horizon. +Hews:O oceano é como um pedaço salgado do universo. +#Hews:The ocean is like a salty taste of infinity. +Hews:Um praia lotada é desprovida de sua graça. +#Hews:A crowded beach is robbed of its grace. + end scene + scene second +Hews:Já ouviu falar do Estomatópode? Ele possuí 16 fotorreceptores que o permite perceber luz ultravioleta. Você consegue imaginar ver uma grande variedade de cores? +#Hews:Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +Hews:Talvez seja belo. Enfim, nós já achamos razões demais para nos odiar com as cores que temos. +#Hews:Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. + end scene + scene quest_event + +Hews:Está procurando por alguém, é? Lembro que estava sentado aqui quando algumas nuvens taparam o sol. Nesse momento, alguém veio me perguntar sobre algo. não lembro o que era, mas foi embora dizendo que iria em direção a floresta. +#Hews:You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. + end scene + end area + area FOREST + + scene quest_normal +#npc james +James:Frutas são um bom tipo de comida. Eu gosto de frutas. +#James:Berries are a good kind of food. I like berries. +James:Por favor, certifique-se de não defecar nas frutas. +#James:Please make sure not to defecate on the berries. +James:Até agora nessa estação do ano eu tive relações sexuais 18 vezes. E também, eu comi 389 porções de frutas. +#James:So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +James:Você tem alguma fruta para James? +#James:Do you have any berries for James? + end scene + scene second +James:Eu escrevi um poesia:\n^Eu gosto de comer frutas\n^Elas me deixam batuta\n^Eu gosto muito de frutas\n^Até mais do que trutas! +#James:I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +James:Você prefere framboesas ou mirtilos? +#James:Do you like blueberries or raspberries more? +James:Você tem alguma fruta para James? +#James:Do you have any berries for James? + end scene + scene quest_event +James:Uma pessoa passou por aqui. Não queria frutas. Ela foi em direção a parte sudeste do lago a oeste. +#James:Someone came by. They did not want berries. Went to southeast part of lake to the west. + end scene + end area + + +#npc rank +#npc olive + area FIELDS + scene easter_egg +Olivia:Olá, eu sou Olívia a coelha. +#Olive:Hi, I'm Olive the rabbit. +Olivia:Eu tenho um monte de cereal para comer ainda! Eu amo cereal. +#Olive:I have so much cereal left to eat! I love cereal. +Olivia:Essa caixa é tão grande. Ela nunca acaba! +#Olive:The box is so big. It never ends! +Olivia:Cereal infinito! +#Olive:Neverending cereal! +Olivia:Hmmm...talvez isso não seja algo ruim. +#Olive:Hmmm...maybe that's not such a bad thing. + end scene + scene bush +Rank:Hahaha, Young seu bobo. Uma vassoura não serve para cortar arbustos! +#Rank:Eheheh, silly Young! A broom’s no tool for cutting bushes! + end scene + scene quest_normal +Rank:Eu corto arbustos para me manter. As vezes quando você corta um arbusto e encontra ouro! Ahaha! +#Rank:I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +Rank:A economia não vai muito bem debaixo deste arbusto aqui. +#Rank:The economy has been really struggling under this bush... +Rank:As vezes é díficil manter minha mulher e filhos apenas cortando arbustos--nem sempre temos o suficiente para comer... mas sempre temos uma lareira acesa! Ahaha! +#Rank:Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! + end scene + scene quest_event +Rank:Ah? Sim! Uma pessoa passou por aqui. Disse que estava indo para o labirinto subterrâneo...Aposto que lá tem uma vários arbustos, né, Young? Ahaha! +#Rank:Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! + end scene + scene marvin +Marvin:Ah ei, como está se sentindo? +#Marvin:Oh hey, how are you feeling? +Marvin:Onde está Justin? +#Marvin:Where is Justin? +Marvin:Não tem nenhum foguete de garrafa por aqui... +#Marvin:There's no bottle rockets around... + end scene + scene chikapu +Chika Chi! +#Chika Chi! +Chika Chika!! +#Chika Chika!! +CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! +#CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! + end scene + scene hamster +Bob:Bob o Hamster gosta de falar de si mesmo na terceira pessoa. +#Bob:Bob the Hamster likes to refer to himself in the third person. +Bob:Apóstrofos são artimanhas do s'atanás. +#Bob:Apostrophes are the root of all e'vil. +Bob:Quieto! Estou ocupado exalando uma aura de ambiência hamstérica. +#Bob:quiet! I am busy exuding an aura of hamstery ambiance. +Bob:... Supunho que você só melhora fazendo... Mas... se você faz algo errado, você se torna melhor a fazer esse erro? +#Bob:... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +Bob:Um homem de verdade nunca chora... bem, talvez ele deixe uma única lágrima cair do canto de seus olhos através da sua face enrijecida pelo sol enquanto ele dirige sua estilosa Harley através do deserto de Mohave sem usar capacete ou óculos protetor. Mas ele nunca chora. +#Bob:A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +Bob:Esse jogo foi criado por um número infinito de macacos trabalhando em um número infinito de máquinas de escrever. +#Bob:This game was created by an infinite number of monkeys working on an infinite number of typewriters. +Bob:Sinto falta do James... +#Bob:I miss James... + end scene + scene electric +Kuribu:Curry é amarelo e apimentado! +#Kuribu:Curry is yellow and spicy! +Kuribu:Para o oponente sagaz, ferimento aumenta! +#Kuribu:For the clever opponent, injure increase! +Kuribu:Você recebeu a experiência de 2! +#Kuribu:You got the experience of 2! +Kuribu:Tome meu número de telefone! 0800 meiamolemeiadura +#Kuribu:I tell you my phone number! 0*1-51*7-*4386 + end scene + end area + area TRAIN + + scene quest_normal +O QUE eu estou fazendo aqui? Boa pergunta! Encontrei esse lugar por acaso. Estou me escondendo. Aqui é seguro, se você não se aventurar tão longe e deixar esses caras te encontrarem. +#What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +Parece que sou relativamente afortunado. Todos esses mortos espalhados pelo chão - como eles morreram? É um pouco fascinante, tentar imaginar como tudo ocorreu. Foram atacados por monstros? Tropeçaram e caíram nos espinhos? +#It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +É um pouco medonho. Espero que isso não aconteça comigo. Dor física é algo térrível para se ter. +#It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. + end scene + scene quest_event +Ah... pensando nisso, uma pessoa passou por aqui um tempo atrás. Disse que estava procurando por algo...até parecia um pouco com você! Não lembro quando, desculpe. É díficil manter noção do tempo aqui. Mas lembro que ela estava indo para uma cidade próxima. +#Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. + end scene + end area + area SUBURB + + scene quest_normal +Olá. +#Hello. +Está procurando por algo? +#Are you looking for something? +O que é que você está olhando? +#What are you looking at? +Não, não sou dessa cidade. Estranho, você pode me ver e falar comigo, mas eu não consigo interagir com nenhum deles. Tem um monte de assassinos por aí, e ninguém parece notar. Isso é estranho. +#No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. + end scene + scene quest_event +Sim. Eu vi uma pessoa passar por aqui. Ela estava a procura de algo. Não sei o que esse 'algo' possa ser. Foi embora depressa. Disse que estava indo em direção a uma área alternativa do espaço. Me soou extravagante. +#Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. + end scene + end area + area SPACE + scene quest_normal +EI EI EI - - - QUEM É VOCÊ ? ? ? +#WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +EU SOU UM VAGANTE . . . ESSA É UMA DAS PARADAS MAIS POPULARES NA JORNADA ENTRE B E A . +#I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +O QUE É 'A' ? ? ? É MINHA CIDADE NATAL . . . ESTOU VISITANDO UM VELHO AMIGO EM B . . . É UM LONGO CAMINHO . . . MAS EU FAÇO SACRIFÍCIOS . . . VOCÊ NÃO ? ? ? DEIXA A VIDA MAIS ANIMADA ! ! ! +#WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! + end scene + scene quest_event +AHH - - - PROCURANDO POR OUTRO HUMANO - - - ENTENDO . ^ DEIXE-ME ACESSAR MINHA MEMÓRIA . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n A PESSOA TEVE UMA IDÉIA SUBITA E DISSE QUE IRIA PARA UMA CABANA EM UM CAMPO BEM CUIDADO. \n PENSANDO NISSO . . . VOCÊ É IDÊNTICO A ESSA PESSOA ! ! ! TEM CERTEZA QUE NÃO ERA VOCÊ ? ? AHN ? MM ? +#OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? + end scene + end area + area GO + scene quest_normal +Você estava... ah, um. Bom trabalho. +#You actually were...uh, ah. Well done. +LOOP +A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha que sair de novo (Estava ficando muito claro aqui, isso sempre acontece) - a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\" +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it:\"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + scene quest_event +A reluzente pedra reflete um pouco da luz vinda da sala. Nela há a inscrição:\"Rápido, antes que eu tenha de sair de novo (Estava ficando muito claro aqui, isso sempre acontece) - a parte noroeste da floresta azul - Eu vi outra entrada do templo um pouco mais ao norte, depois dessas árvores - se eu pudesse mover as coisas com o pensamento eu poderia chegar lá...talvez eu faça isso na próxima vez em que eu for visitar esse mundo.\" +#The shiny rock reflects only a bit of the light from the room. There is writing etched into it:\"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +OLÁ. JÁ ENCONTROU O cubo? +#HELLO. HAVE YOU MET cube YET? +cubo É UM ÓTIMO GOVERNANTE DESSA PORÇÃO DO ESPAÇO. NÓS OUTROS GOVERNANTES DAMOS NOSSO MELHOR EM NOSSO ESPAÇO TAMBÉM. +#cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. + end scene + scene gray2 + +O QUE VOCÊ ACHA DESSE PEDAÇO DE ESPAÇO? É UM ÓTIMO LUGAR, NÃO É? +#WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +UMA INTERCESSÃO DE MUNDOS! +#AN INTERSECTION OF WORLDS! + end scene + scene gray3 +NENHUM DE NÓS PIRÂMIDES CINZAS ESTAMOS DE FATO AQUI. USAMOS APARELHOS ESPECIAIS QUE NOS PERMITEM NOS PROJETAR AQUI. +#NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +POR QUE FAZEMOS ISSO? PORQUE QUEREMOS FALAR COM NOSSO AMIGO cubo E FAZÊ-LO COMPANIA. +#WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. + end scene + scene graydead +*bzrrrrt* +#*bzrrrrt* + end scene + scene grayspin +...O APARELHO DE HOLOGRAMA ESTÁ FUNCIONANDO CORRETAMENTE? +#...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +NÃO?^...^DROGA! +#NO?^...^DAMN! + end scene + scene color1 +Já conheceu o CUBO? Ele faz muitas coisas maneiras! Ouvi dizer que uma vez ele ficou na beirada por quase doze segundos! Sabe o que isso significa para a Liga da Beirada? Não? Muito! +#Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! + end scene + scene color2 +Cubo faz coisas interessantes! +#CUBE does a lot of interesting work! +Você sabia? Aparentemente, minha vez de governar está próxima! Faltam apenas alguns minutos, acredito. +#Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. + end scene + scene color3 +Eu venho do Pão de Açúcar, em direção a Taipei. Por que estou aqui? Eu parei para cumprimentar o CUBO! +#I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +Não fique triste! Esse lugar é uma representação estranha apenas para não amedrontar os visitantes. É praticamente inofensivo, até onde sabemos. +#Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. + end scene + scene colordead +(...está tirando um cochilo?) +#(...is it taking a nap?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +CADA GERAÇÃO NASCE DA DOR PARA MORRER EM DOR. NÃO IREMOS SOFRER PARA REPRODUZIR O CICLO. NÓS NÃO IREMOS PARA FORA. +#EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. + end scene + scene after_fight +ESTE É O SEU CASTIGO POR NOSSA REBELIÃO? +#IS THIS YOUR PUNISHMENT FOR OUR REBELLION? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +Porque você priva o Aquele que Vê de seus sacrifícios? Por que você roubou de nós nossa salvação? +#Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? + end scene + scene after_fight +...Nós falhamos em fazer você pagar por sua interferência. E ainda assim... você nos devolveu a chance de ser livres. Obrigado, Young. Que o Aquele que Vê olhe positivamente para você mais uma vez. +#...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +Muito bom te ver, Yang. Faz tanto tempo. Ainda jogando esses nintendo, não é? +#So good to see you, Yang. Been too long. Still playing those nintendos, I see? + end scene + scene after_fight +Meu Deus, Yon, quando é que você vai crescer? Você sabe que terá que aprender a lidar com pessoas mais cedo ou mais tarde. +#Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +Nós temos as melhores amenidades aqui. O que acha da nossa piscina? +#We have all the finest amenities here. How do you like the Pool? + end scene + scene middle_fight +O que me diz do nosso centro de fitness com tecnologia de ponta? +#How about our state-of-the-art fitness center? + end scene + scene after_fight +Esperamos que tenha desfrutado de sua estadia! +#We hope you enjoyed your stay! + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +Hoje é um bom dia. +#Today is a nice day. +Obrigado por coçar meu pescoço - Eu não estava conseguindo alcançar. +#Thanks for scratching that itch on my neck - I can't seem to reach it. +Ouvi dizer que os ovos do restaurante local são muito bons. E ainda por cima tenho cupons para eles. +#I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +Viu o acidente de carro de hoje? Horrível! Ele estava usando celular. Que pena, era tão jovem! +#Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +Meu filho não conseguiu entrar para o time júnior do colégo. Decepcionante. Nós investimos tanto em sua carreira esportiva. +#My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +Hoje é o dia de ação de graças. Sou grato por muitas coisas. Mal posso esperar para as promoções de amanhã cedo. Vou conseguir um monte de barganhas. +#Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +Ah, acho que chegarei atrasado no trabalho. +#Ah, I think I might be late for work. +Estou apressado para chegar em casa, preciso arrumar tudo antes dos sogros chegarem. +#I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +Estamos tendo uma venda de garagem! +#We're having a garage sale! +Bem vindo! +#Welcome! + end scene + scene words_teen +Eu não vi o filme mais recente. +#I didn't see the latest movie. + end scene + scene words_kid +Nunca terei a chance de ver o novo desenho animado! +#I never gotta see the new cartoon! + end scene + scene family +# inside of a house, parent (insightful kid) - 73 +Bem vindo a nossa casa, estranho! Você me parece familiar. Esta é uma cidade pacata. Bem quieta, sem muitos visitantes. +#Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +#inside of house, younger kid +Você curte Davement? Meu irmão Dave me mostrou uma música deles muito maneira! +#Do you like Davement? My brother Dave showed me this really cool song by them! + end scene + scene older_kid +# inside of a house, olderkid +Meus amigos gostam de ouvir 'None Surprises' daquela banda chamada 'Rayhead' e reclamar sobre este local. Tudo bem, é uma espécie de bolha, mas pelo menos mostrem alguém respeito! +#My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +Acho que vou escrever para meu blog. +#I guess I'll just go write in my blog. +Você parece estar confuso. +#You sure look like you're in a daze. +Eu tenho problemas para ouvir meus pensamentos quando esportes e coisas do tipo estão passando na TV, mas meus pais gostam disso. +#I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. + end scene + +#inside of hanged man house 74 + scene hanged +Uma anotação no corpo:\"Colocando-me em perigo não mais.\" +#A note on the corpse:\"Placing myself in danger no more.\" + end scene + scene festive + + +#Inside of another house, (festival people) - 75 +Ah, tem algo acontecendo lá fora? Um festival? Um desfile? +#Oh, is there something going on outside? A festival? A parade? +Parece que há uma baita comoção lá fora! Já olhou na janela recentemente? O que será que é? +#There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. + end scene + +#78 + scene paranoid +Minha casa tem muitas janelas. Eu não gosto de janelas. É como se alguém estivesse olhando para dentro. E no fundo você sabe que TEM algo acontecendo lá fora. não pode ser apenas silêncio o tempo todo. É pertubador. +#My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +Assassinos? O que? Lá fora? Você tá de brincadeira? +#Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +Por favor saia daqui. +#Please get out. + end scene + +# 76 + scene dead +O corpo desta mulher foi atacado por uma arma de ponta cega. +#The body of this woman has been beaten to death by a blunt weapon. +O homem, cegamente, bem... +#The man, to put it bluntly, well... + end scene + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +Ah, é você! Você me parece familiar...Eu não posso me mover até você matar mais desses habitantes da cidade, lembra? Volte aqui mais tarde. +#Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +De acordo com esse panfleto...você só tem que matar mais um pouco de pessoas! Continue assim! +#According to this pamphlet...you only need to kill a few more people! Keep it up. +Só precisamos de mais um corpo, e depois continuamos. +#We only need one more body, and then we can keep going. +Muito bem. Sinta-se livre para entrar. Não faço idéia do que tem lá dentro. Nos vemos depois, mesma hora amanhã, certo? Ou na noite seguinte? +#Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? + end scene + end area +end npc + +# dialogue for the cards + +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +Não me importo em ser observado pelas árvores. +#I don't mind being watched by the trees. +#1 Bat(?) - extra overworld area +Cadê ela?! +#Where is she?! +#2 sunguy +Eu estarei com você Young, sempre que estiver sozinho. +#I will be with you Young, whenever you are alone. +#3 Shieldy +Você é um Ookchot? Mamãe sempre me avisou para ter cuidado com os perigosos Ookchot. +#Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +#4 slime +Jello falando, Young! Muito bom finalmente poder lhe conhecer! Por que não fica aqui uns minutos? Eu estou acabando de preparar chá. +#Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +#5 post-statue area in BEDROOM +Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Pei, Coro, Púlpito, Altar, Janelas de Vidro Tingido... +#Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +#6 SUBURB inside of house past blocker +Oferta por tempo limitado! Compre um, leve dois - apenas hoje! +#Limited time offer! Buy one, get one free - only today! +# 7 APT Boss +Lembra daquela vez que você acendeu uma vela quando a energia estava falhando? +#Remember the time that you lit a candle when the power was out? +# 8 APT Silverfish +Hmmmm, seu travesseiro estava confortável noite passada. +#Mmmm, your pillow was cozy last night. +# 9 APT gasguy +Isso vai lhes mostrar que não devem me chamar do cara da fumi-GAY-ção. +#This'll teach 'em for calling me the fumi-GAY-tion guy. +# 10 FIELDS 1 (island) - mitra +Wares e Eu fazemos uma boa equipe. +#Wares and I make a good team. +# 11 FIELDS 2 (alcove) - Miao +Eu sou o Escolhido-em-treinamento! +#I'm the Chosen One-in-training!!! +#12 Base of WINDMILL windmill +Você já teve a sensação, de que não importa o que você faça, você não consegue impedir o mundo de morrer? +#Do you ever feel like, no matter what you do, you can't stop the world from dying? +#13 Hidden up a river in FOREST +Cuidado com os cogumelos florestais... +#Beware the forest mushrooms... +#14 Bottom of ladder-mini-maze on CLIFF +Me desculpe. Essa é minha natureza. +#I am sorry. It is my nature. +#15 Top of Cliff +O que você quer dizer com \"só uma pedra\"?? Pedras podem ser cartas também! +#What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +#16 Western end of BEACH past spikes +Dê um peixe para um homem e ele terá comida por um dia. Ensine um homem a pescar, e ele terá bons momentos com seu filho, Jimmy. +#Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +#17 At end of path through the woods in REDSEA +As vezes a resposta é fazer uma caminhada. +#Sometimes the answer is taking a walk. +#18 MOVER Redcave - Past 2 locks in central redcave +Porque morcegos aparecem do nada, sempre quando você chega? +#Why do bats suddenly fly down, every time you're around? +#19 SLASHER Redcave - West end of Northern redcveave +NÃO, *VOCÊ* QUE PRECISA DE APARELHO! +#NO, *YOU* NEED BRACES! +#20 REDBOSS Redcave - post boss +ESTÁ SATISFEITO? +#ARE YOU HAPPY NOW? +#21 NW corner of CELL - chaser +Não venha com violência pra cima de mim. +#Don't get violent around me. +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +Sempre quis participar do Iron Chef. +#I've always wanted to be on Iron Chef. +#23 CONTORT circus - contort + firepillar room in SW chunk +Minha mãe vivia dizendo, 'Se você fizer esse arco por tempo suficiente, sua coluna ficará assim!' +#My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +#24 LION circus - end of northern gauntlet bordering boss room +Está entretido, humano? +#Are you amused yet, human? +#25 A+J BOSS circus - basement (post boss) +... +#26 FROG crowd - North of entrance +Existem cerca de 4.800 espécies de sapos. +#Scientifically speaking, toads are a subset of frogs. +#27 CROWD GUY crowd - 2nd floor +HAHAHAHA! É! Eu sei! +#HAHAHAHA! Yeah! I know! +#28 WALL BOSS crowd - post boss +Ah, você coleciona cartas também? Que crescido, Ying. +#Oh, you collect cards, too? Real classy, Ying. +#29 end of grey end of space, for grey cube king +Todos vivem dizendo, \"Saia do computador! Ou você nunca vai fazer amigos!\" +#They always said, \"Get off the computer! Or you'll never make friends!\" +#30 end of colorful end of SPACE, for color cube king +Eu sou o governante apenas pela duração dessa conversa. +#I'm only the ruler for the extent of a conversation. +#31 DUSTER hotel - end of 4th floor moving platform area +Aposto que você acha que está 'tornando meu trabalho mais interessante'! +#I'll bet you think you're 'making my job interesting'! +#32 DASH TRAP hotel - Dash trap room on 3rd floor +Odeio diagonais. +#I hate diagonals. +#33 BURST PLANT hotel - SE corner floor 2 +Nem pensei usar essa droga de claritin perto de mim. +#Don't even try that claritin clear shit with me. +#34 EYE BOSS hotel - post-boss +Raspe essa carta para destravar a porta para seu quarto! +#Swipe this card to unlock the door to your room! +#35 end of left-most TERMINAL bridge - sage +Estou fazendo um ótimo trbalho. +#I'm doing a great job. +#36 Young (drawer APT) +.......?? +#37 old BDRM (dialogue rock) +Quem foi que nos esculpiu mesmo? +#Who carved all of us anyways? +#38 hotel room +Espero que tenha desfrutado de sua estadia. +#I hope you enjoyed your stay. +#39 end of debug minidungeon (old player sprite) +Para você chegar a esse ponto, você deve ser muito interessante. +#Seening as you've gotten to this point, you must be quite Intrasting. +#40 end of cell - Torch? +Só estou aqui para lhe tirar do caminho. +#I'm just here to lead you astray. +#41 end of SPACE - faces/entities +Você é como uma pirâmide para nós, também! +#You like like a pyramid to us, too! +#42 end uf suburb (killer) +É a mesma maldita peça, noite após noite, e o salário é uma droga. +#It's the same damn play, night after night, and the pay sucks. +#43 GOldma's room - goldman +Me deixe em paz! Meu nome não é Sachs! +#Leave me alone! My last name isn't Sachs! +#44 blank, ISlands - Broom +Pelo menos eu não sou um bastão. +#At least I'm not a stick. +#45 fields, bottom right - (Rank) +Como assim dinheiro não nasce em árvores? Ahahahah! +#What do you mean money doesn't grow on trees? Eheheheh! +#46 street, bottom (Follower bro) +Eu não passo de uma ilusão. +#I'm nothing but an illusion. +#47 redsea, bottom eft (Bomb npc) +EU VOU DESCONTAR TUDO EM VOCÊ. +#I'LL TAKE IT OUT ON YOU. + end scene + end area +end npc + +npc misc + area any + scene controls +Pressione +#Press +# [SOMEKEY-LEFT] +para configurar\nos controles. +#to set controls. +# [SOMEKEY-ENTER] +para cancelar. +#to cancel. +Cima +#Up +Baixo +#Down +Esquerda +#Left +Direita +#Right +Pulo +#Jump +Ataque +#Attack +Menu +#Menu +Pressione +#Press +# [SOMEKEY-ENTER] +para sair +#to exit +# [SOMEKEY-LEFT] +para configurar os controles. +#to set controls. + end scene + scene title +Por favor use as setas para redimensionar a janela até que não seja possível visualizar áreas pretas ao redor das bordas. Pressione +#Please use the arrow keys to resize the window until you cannot see any black around the borders. Press +# [SOMEKEY-C] +para finalizar. +#when done. +ANODYNE +#This is intentionally left in English +Melos Han-Tani\nMarina Kittaka +#This is intentionally left in English +any key +#This is intentionally left in English, as these strings usually stay in English in Japanese games as well. +Pressione +# [SOMEKEY-C] +para iniciar +Versão +#Version 1.508 +Continuar +#Continue +Novo Jogo +#New Game +Tem certeza?\nNão\nSim +#Are you sure?\nNo\nYes +Mesmo?\nNão\nSim +#Really?\nNah\nYeah +Não vai ter volta!\nEsqueça\nEu sei +#No going back!\nForget it\nI know +mortes +#0 deaths +cartas +#0 cards +Anodyne suporta\na maioria dos controles.\n\nDeseja usar um?\n\nSim Não\n\nSe sim, conecte-o agora.\n\nMova com as setas\n\nEscolha com\nC, ESPAÇO, ou ENTER\n\nEscolhendo \"sim\" em\n +#Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +AVISO\n\nSe estiver sofrendo atraso dos comandos durante o jogo,\nfeche e\nabra Anodyne novamente.\n\nPRESSIONE C PARA CONTINUAR +#NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE +Pressione VOLTAR para sair. +#Press BACK again\nto exit.\nUnsaved progress\nwill be lost. + end scene + scene elevator +Andar? +#Floor? +1\n +2\n +3\n +4\n +Cancelar +#Cancel + end scene + scene gui +# Note - this below one is a sprite that fits into the gui +menu=enter +#This is intentionally left in English +# Shows up when you save at a checkpoint +Salvando... +#Saving... + end scene + scene map +Mapa +#Map +Sala Atual +#Current Room +Entrada/Saída +#Door/Exit +Sem Mapa +#No Map +Voltar para\no Nexus +#Return to Nexus +Voltar para\na entrada +#Return to entrance + end scene + scene items +Itens +#Items +Normal +#Normal +Troca +#Swap +Extensão +#Extend +Ampliação +#Widen +Um par de sapatos com mola - pressione +#A pair of spring-loaded shoes - press +# [SOMEKEY-X] +para pular! +#to jump! +Um par de sapatos de ciclismo. +#A pair of shoes for biking. +Uma caixa de papelão vazia. +#An empty cardboard box. +Uma chave encontrada no Templo do Aquele que Vê. +#A key found in the Temple of the Seeing One. +Uma chave encontrada numa caverna subterrânea vermelha. +#A key found in a red, underground cave. +Uma chave encontrada numa caverna nas montanhas. +#A key found in a mountain cave. + end scene + scene cards +Cartas +#Cards +cartas +#0 cards + end scene + scene save +Salvar +#Save +Salvo! +#Saved! +ERRO +#ERROR +Salvar e ir\npara a título +#Save and go to title +Ir para título +#Go to title +Salvar e sair +#Save and quit +Sair do jogo +#Quit game +Mortes: +#Deaths:0 + end scene + scene config +Config +#Config +Definir control +#Set keybinds +Definir volume +#Set volume +Salvar em\ncheckpoints: +#Autosave at checkpoints +Ligado +#On +# 5 +Desligado +#Off +Mudar Resolução: +#Change Resolution +Configurar UI +#Config UI +Touch + D-Pad +#Touch+D-Pad +Somente D-Pad +#D-Pad Only +# 10 +Apenas Touch +#Touch Only +Tipo de Movimento +#Move Input Type +Resolução: +#Resolution: +Janela +#Windowed +Multiplicado +#Integer Scaled +# 15 +Esticado +#Stretch +Escala: +#Scaling +Idioma: +#Language: +ja +en +ko +# 20 +arraste os\nbotões\naté estar\n satisfeito.\n\nDepois, toque\no menu\npara continuar.\n\n +#Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +Redimensionar\nJanela +#Resize Window +Configurar controle +#Config Joypad + end scene + scene secrets +Você está mandando brasa! +#You\'re rolling in it! +Antiga propriedade do Mago das Bolhas. +#Once the property of a famous Bubble Mage. +Se os gráficos ficarem estranhos, procure pela descrição oficial do Pokedex sobre algum Pokemon. +#If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +esse coração não tem nome +#This heart has no name. +Por favor visite o mundo dos monstros eletrônicos. +#Please visit the electric monsters\' world. +Uma estátua de um gato. Fofo, mas inútil. +#A kitty statue. Cute, but useless. +Aí meu deus!!!! +#Oh my!!!! +Ah não!!! +#Oh no!!!! +É preto. +#It\'s black. +É vermelho. +#It\'s red. +É verde. +#It\'s green. +É azul. +#It\'s blue. +É branco. +#It\'s white. +#SOMEKEY-C +:Selecionar +#:Select +#SOMEKEY-X +:Voltar +#:Back + end scene + scene swap +Desculpe! +#Sorry! +A troca não funciona aqui. +#The swap won't work here. +Young não tem forças para usar a troca aqui. +#Young could not muster the strength to use the swap here. + end scene + scene keyblock +Esta porta está trancada. +#This door is locked. + end scene + scene treasure +Alguma força estranha impede que este baú se abra. +#Some strange force stops this treasure box from being opened. +No cabo da vassoura está escrito:Pressione\" +#An engraving on the broom handle reads:Press +#SOMEKEY-C +para varrer.\" +#to sweep. +Essa chave pode ser usada uma única vez para abrir uma barreira trancada. +#This key may be used a single time to open up a locked barrier. +Um misterioso par de sapatos, nele está escrito uma única coisa\"Pressione +#A mysterious pair of boots has nothing but the branding on it, which says \"Press +#SOMEKEY-X +\". +As poucas palavras gravadas nesse artefato dizem: \"Equipe o acessório de AMPLIAÇÃO para fazer com que a vassoura solte poeira nociva para a esquerda e direita.\" +#A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +As poucas palavras gravadas nesse artefato dizem: \"Equipe o acessório de EXTENÇÃO para fazer com que a vassoura solte poeira nociva para frente.\" +#A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +As poucas palavras gravadas nesse artefato dizem: \"Olá, Young. Use esse aparelho de TROCA em dois objetos para trocá-los de posição. Ainda está longe do seu alcance poder usar isto em qualquer lugar, mas por hora irá lhe servir bem.\" +#A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +VOCÊ ACHOU UM CORAÇÃO!!! Saúde aumentou em...zero. +#YOU FOUND A HEART!!! Maximum Health increased by...zero. +Ourudo:O que? Não está aqui? Aquele vendedor deve ter roubado! +#Goldman:What? It's not there? That shopkeeper must have stolen it! + end scene + scene dust +Sua vassoura está cheia de poeira! Ataque novamente para colocá-la. +#Your broom is now full of dust! Attack again to place it. + end scene + scene checkpoint +Salvar jogo?\n Sim\n Não +#Save game?\n Yes\n No +Quando estiver em um checkpoint, pressione +#While standing on a checkpoint, press +#SOMEKEY-C +para salvar e marcá-lo como ponto para continuar caso você morra. +#to save your progress and set it as your respawn point if you die. + end scene + scene rock +Há algo escrito nesta pedra: +#There is writing scrawled on this rock: +CÊ NÃO TEM AMIGOS +# YA AINT GOT NO FRIENDS + end scene + scene door +O portal não parece estar ativo. +#The portal does not appear to be active. + end scene + scene keyblockgate +O portão permanece, imóvel. Ele não irá abrir até sentir quatro cartas... +#The gate stares, petrified. It won't open until it senses four cards... +Sentindo a presença de quatro cartas, o portão decide abrir... +#Sensing four cards, the gate decides to open. +O portão permanece teimosamente no lugar. +#The gate stubbornly remains in place. +O portão sente a presença de todas as cartas, e decide abrir. +#The gate senses all of the cards, and decides to open. +O portão sente a presença de um número suficiente de cartas, e decide abrir. +#The gate senses enough cards, and decides to open. +Abriu! +#It opens! +Permanece fechado. +#It remains closed. + end scene + scene solidsprite +A placa aponta para o leste mas as palavras estão muito desbotadas. +#The sign points to the east but the words on it are faded. +A placa aponta para o oeste mas as palavras estão muito desbotadas. +#The sign points to the west but the words on it are faded. +A as palavras desta placa estão muito desbotadas. +#The words on the sign are faded. + end scene + scene mitra +Ei, young! +#Hey, Young! +Esses sapatos de ciclismo são para mim? Poxa! Obrigado, Young! Eu estava querendo um desses para usar com o Wares. Aqui, Young, tome meus sapatos em troca. Eles tem molas que permitem você pular bem alto! Você pressiona +#Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +para pular com eles! +#to jump with them on! +Oi Young! Notou algo de diferente? ^... ^... Ah, bem, eu comprei um novo par de sapatos de ciclismo! Eles encaixam perfeitamente nos pedáis do Wares. Já que não vou mais precisar dos meus sapatos antigos, quero que você os tenha, Young! Eles tem molas que permitem você pular bem alto! Você pressiona +#Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +#[SOMEKEY-X] +para pular com eles! +#to jump with them on! +Enfim, tome cuidado! +#Alright, take care! +Vá em frente, experimente-os! ...Eles não fedem TANTO assim. +#Go on, try them out! ...They're not THAT smelly. +Maneiros, né? +#Cool, huh? +Uau, esses são os sapatos de ciclismo da loja do Finty? Você está dando eles para mim? Obrigada, Young, de verdade! Aqui, tome meus sapatos antigos--Acho que eles serão bem úteis para você. Há uma inscrição neles que diz: \"Pressione +#Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +#somekey-x +para pular\". Nunca entendi o significado, porque não há um\" +#to jump\". I've never understood that, though, because there's no \" +#somekey-x +\" em lugar nenhum neles... +#\" anywhere on the shoes... + end scene + scene tradenpc +Finty:Bem vindo, bem vindo, meu amigo Young! Meu nome é Prasandhoff--Finty Prasandhoff! Dê uma olhada pela minha loja e veja se algo lhe interessa. +#Finty:Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +Finty:Eu ainda aprecio essa caixa! +#Finty:I still appreciate that box! +Finty:Ah, uma caixa! Muito obrigado! Agora eu posso carregar todo meu inventário para casa a noite e de volta para cá pela manhã! Como símbolo da minha gratidão, tome essa feiosa--Digo, bela edição de colecionador dessa carta^ +#Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +Espere...não está aqui! O que será que aconteceu? Bem, aqui, deixe-me aliviar seus ferimentos. +#Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +Como símbolo da minha gratidão, tome esses estilosos sapatos de ciclismo! +#As a token of my gratitude, take these stylish biking shoes! +# 5 +Bela manhã, não é, meu amigo? Uma bela manhã para compras! Como eu gostaria de ter uma caixa para carregar meu inventário comigo. +#Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +Que pena, parece que você não condições de comprar esse item! Volte mais tarde, quando tiver mais grana! +#Too bad, looks like you can't afford this item! Come back later, when you have the cash! +Finty:Ah, você é perspicaz! Você precisa de uma arma nova, não é? Mande seus inimigos para longe por apenas R$1113.73! +#Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +Finty:Esse saco de dinheiro permitirá que você acumule mais dinheiro que você acha pela Terra. Ele será seu por meros R$1937.90! +#Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +Finty>Ah ha ha, este sim é um item especial: sapatos de ciclismo para você ser veloz E estiloso! A venda por apenas R$668.23! +#Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +#10 +Finty:Cansado de perder tempo varrendo seu quarto com uma simples vassoura? Erradique toda as partículas de poeira com este aspirador de pó com tecnologia de ponta! Por apenas RS$1670.60 ou por, fáceis, parcelas mensais de R$445.48! +#Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +Obrigado! +#thank you...whoops + end scene +#(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a new e in the middle) + + scene ending +Anodyne\n-------\n\n\n\nCriado por\n\nMelos Han-Tani\n\ne\n\nMarina Kittaka\n\n------------- +Criado de\n\nMarço, 2012\n\naté\n\nJaneiro, 2013 +DESIGN\n------\nAmbos +PROGRAMAÇÃO\n-----------\nMelos, usando\nFlixel para\nActionscript 3.\n\n\n\nARTE\n---\nMarina\n +MÚSICA/EFEITOS\n---------\nMelos, usando REAPER\ne algumas\nsoundfonts livres.\n\n\n\nDIÁLOGO\n--------------\nPrincipalmente Marina\n +HISTÓRIA\n-----\nAmbos\nLocalização\nJaponesa:\nKakehashi Games +Um grande obrigado\npara nossos testers\nque sofreram\npor você!\n--------------\n\nMarina, por sobreviver\natravés dos bugs\niniciais.\n\nEtan, pelo\nconstante suporte\ndesde o início, pelos\nmuitos bugs,\ndescobertos e por\nser o terceiro\na jogar a maioria/n do jogo. +O - valeu,\nmana!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Melos gostaria de\nagradecer a:\n\nMãe e Pai, pelo\nsuporte contínuo\nnessa empreitada.\n\nS\n\nMuitos TIGSourcers\ne outros devs\nconhecidos pelo\ncaminho!\n\nMarina, por tornar\nesse jogo possível,\ne por melhora-lo\nde formas incontáveis. +Adobe, Adam Saltsman,\ndevs do FlashDevelop,\ndevs do REAPER,\ncriador do DAME,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nE meus outros\namigos\nque mostraram\nseu apoio.\n(Obrigado!)\n\nE por último, mas\nnão menos\nimportante,\nTina Chen,\namiga de longa\ndata, pelo suporte\ne por me apresentar\nao Marina. +Marina gostaria de\nagradecer...\n\nColin Meloy, por\nexpandir\nmeu vocabulário\n\nTsugumo, por\n\"So You Want to\nBe a Pixel Artist?\"\n\nMinha família,\npelo apoio e comida.\n\nDaniel, por ser um\n\"indie game dev\"\ncomigo no passado. +Mo, por acreditar\n em mim.\n\nTina, por me\napresentar ao Melos.\n\nMelos, por fazer\num jogo\ne confiar em mim\ncomo grande parte\ndo processo. +ELENCO\n----\n\n\nGosma\n\n\nChato\n\n\nPei Pei\n\n\nEscudito\n\n\nVisionário +Movedor\n\n\nLiga Desliga\n\n\nQuatro Tiros\n\n\nCortador\n\n\nRogue\n +Cachorro\n\n\nSapo\n\n\nRodador\n\n\nPessoa\n\n\nParede\n\n +Rato\n\n\nCara do Gás\n\n\nPeixinho-de-Prata\n\n\nCorrredor\n\n\nRolador\n\nVigia\n\n\n +Empregada\n\n\nPlanta Explosiva\n\n\nGerente\n\n\n +Leão\n\n\nContorcionista\n\n\nPilar de Fogo\n\n\nServos\nArthur\nJaviera +Seguidor\n\n\nEduardo\n\n\nPescador\n\n\nCaminhante Vermelho\n\nHews +Coelha\n\n\nIcky\n\n\nVendedor\n\nMiao Xiao Tuan Er\n\nRank\n\nOurudo +Tórax\n\nJames\n\nCogumelo\n\nCrickson\n\nGolem\n\nSuburbanos +Perseguidor\n\n\nEntidades\n\n\nCaras Espaciais\n\n\Reis Cubo +Young\n\n\nMitra\n\n\nSage\n\n\nBriar +E nós gostaríamos\nde agradecer a\nVOCÊ!\nPor jogar\nnosso jogo.\nEsperamos que\ntenha gostado. +\n\n\n\n\n\n\n\n +Agora você tem o\npoder de explorar\no mundo de young\nsem (quase) alguma\nlimitação, através\nda troca. + end scene + end area +end npc +# Tell the python script you're done. +DONE diff --git a/intra/source/data/gen_npc.py b/intra/source/data/gen_npc.py new file mode 100644 index 0000000..63545e6 --- /dev/null +++ b/intra/source/data/gen_npc.py @@ -0,0 +1,147 @@ +import os +import sys + +if len(sys.argv) > 1: + input_filename = sys.argv[1] +else: + input_filename = "dialogue.py" +output_filename = sys.argv[2]; +f_in = open(input_filename,"r"); +f = open(output_filename,"w") + +s_start = 0 +s_halt = -1 +s_npc = 1 +s_area = 2 +s_scene = 3 + +state = s_start +is_first_scene_dialogue = True +is_first_scene = True +is_first_area = True + +t1 = "\t" +t2 = "\t\t" +t3 = "\t\t\t" + +tokens = [] +cur_loop = 0 +found_loop = False +align_top = False + +# Output vars for the state object +# as well as the object holding the dialogue +state_string = "" +dialogue_string = "" + +f.write("// This file was automatically generated! Don't touch it!\n") +print output_filename.split(".")[0] +f.write( +"package data{\n\ +public class "+output_filename.split(".")[0]+" {\n") + +for line in f_in: + line = line.rstrip() + line = line.lstrip() + tokens = line.split() + + if len(tokens) == 0: + continue + + if tokens[0][0] == "#": + continue + + if state == s_start : + if line == "DONE": + state = s_halt + if tokens[0] == "npc": + dialogue_string += "public static var "+tokens[1]+":Object =\n{\n" + state_string += "public static var "+tokens[1]+"_state:Object =\n{\n" + state = s_npc + continue + elif state == s_npc: + if line == "end npc": + # Close the npc object + dialogue_string += "};\n\n" + state_string += "};\n\n" + dialogue_string += state_string + state_string = "" + state = s_start + is_first_area = True + elif tokens[0] == "area": + # Areas within NPC are commaseparated + if not is_first_area: + dialogue_string += t1+",\n" + state_string += t1+",\n" + is_first_area = False + # Open up a new area object + dialogue_string += t1+tokens[1]+": {\n" + state_string += t1+tokens[1]+": {\n" + state = s_area + elif line == "does reset": + # Make this npc resettable + state_string += t1 + "does_reset: true,\n" + + elif state == s_area: + if line == "end area" : + #print "END AREA" + is_first_scene = True + # Close the area object + dialogue_string += "\t}\n" + state_string += "\t}\n" + state = s_npc + elif tokens[0] == "scene": + # Print scene name + if not is_first_scene: + dialogue_string += ",\n" + state_string += ",\n" + is_first_scene = False + # Open up new scene object + dialogue_string += t2+tokens[1]+": {\n" + state_string += t2+tokens[1]+": {\n" + dialogue_string += t3+"dialogue: new Array(\n" + state = s_scene + continue + elif state == s_scene: + if line == "end scene": + state = s_area + # Close the array declaration + dialogue_string += ")\n" + dialogue_string += t2+"}\n" + # Scene state vars, close this scene object + if not found_loop: + cur_loop = 0 + # Whether text should display on top + top_status = "" + if (align_top == True): + top_status = t3+"top: true,\n" + state_string += top_status+t3+"cur: \"\",\n"+t3+"pos: 0,\n"+t3+"loop: "+str(cur_loop)+",\n"+t3+"dirty: false,\n"+t3+"finished: false\n"+t2+"}\n" + cur_loop = 0 + is_first_scene_dialogue = True + found_loop = False + align_top = False + elif line == "LOOP": + found_loop = True + elif line == "TOP": + align_top = True + else: + # Arrays values are comma-separated + if not is_first_scene_dialogue: + dialogue_string += ",\n" + is_first_scene_dialogue = False + # Add on new string of dialogue + dialogue_string += t3+"\t\""+line+"\"" + if not found_loop: + cur_loop += 1 + else: + break + + +#print dialogue_string +f.write(dialogue_string) +# Close the class/package declaration +f.write("}\n}") +f.close() +f_in.close() + + diff --git a/intra/source/data/kr/dialogue_kr.py b/intra/source/data/kr/dialogue_kr.py new file mode 100644 index 0000000..5bd446a --- /dev/null +++ b/intra/source/data/kr/dialogue_kr.py @@ -0,0 +1,2464 @@ +### ENGLISH DIALOGUE ### + +#################### +### INSTRUCTIONS ### +#################### +# 0. If you could comment out the english version when you translate that would be useful for me! +# +# 1. - Any line starting with "#" doesn\'t need to be translated +# +# 2. SPECIAL KEYWORDS THAT SHOULDN\'T BE TRANSLATED: +# Any line starting with: (where "..." is some other keyword , usually an NPC name or area name) +# +# does reset +# LOOP +# TOP +# npc ... +# area ... +# scene ... +# end scene +# end npc +# end area +# DONE +# +# 3. SPECIAL INSTRUCTIONS SYMBOLS +# ---------------------------- +# [SOMEKEY-C] means that this can change depending on what controls the user uses - it would be "C", "A", "ENTER", etc. Sometimes in the dialogue file I write +# Press +# [SOMEKEY-LEFT] +# set controls. +# +# And that implies that in-game, it will read "Press LEFT to set controls." +# +# 4. SPECIAL CHARACTERS IN DIALOGUE TO BE TRANSLATED +# ----------------------------------------------- +# \" and \' are for escaping the quotation characters. You can leave them like that. +# +# ^ Denotes the player will have to press the progress-dialogue-button again to continue the dialogue - you can leave it there (or move it around as needed in the translated sentence) +# \n denotes newline, you can leave it there. + +################## +# BEGIN DIALOGUE # +################## + +### 'test' NPC - In DEBUG +npc test +does reset + area DEBUG + scene scene_1 +# Like music? Talk to that terminal! +음악을 좋아한다고? 터미널이랑 대화해봐! +# Like pain? Head on down south! +고통을 좋아한다고? 남쪽으로 가봐 + end scene + end area +end npc + +### 'arthur' - In CIRCUS +npc arthur + area CIRCUS + scene alone +# That acrobat is losing balance! Where is the safety net? +저 곡예사는 균형을 잃고 있어! 안전망은 어디있는 거지? +... + end scene + + scene holyshit +# WOOAH +우와! + end scene + end area +end npc + +### 'javiera' - In CIRCUS +npc javiera + area CIRCUS + scene alone +# The lions are closing in on that juggler! +사자가 곡예사랑 가까워지고 있어! +... + end scene + end area +end npc + +### 'briar' + +npc briar + area GO + scene before_fight +# Briar: I’m tired, Young. I’m tired of all of these cycles. I feel like I’m living the same dream, the same nightmare over and over again. +브라이어: 피곤하군, 영. 난 이럴 때가 피곤해. 마치 같은 악몽속에 다시, 또 다시 살고 있는 것 같아, +# Briar: ... +브라이어: ... +# Briar: It’s not going to change, Young. This is all we’ll ever be. +브라이어: 아무리 해도 바뀌지 않을거야, 영. 계속 그대로일 거라고. + end scene + + scene after_fight +# Briar: Goodbye, Young. +브라이어: 작별이네, 영. + end scene + + scene final +# Briar: Dude, Young. +브라이어: 이봐, 영. +# Briar: Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! +브라이어: 천천히 다리랑 손을 움직여봐. 이런, 나 없인 움직일 수도 없는 거야?! +# Briar: Well, come on, let’s go get a sandwich or something. +브라이어: 좋아, 가자, 샌드위치인지 뭔지를 먹으로 가자고. +# Sage: You... you did adequately. Until we meet again. +현자: 자네... 그 사이에 잘 해낸 것 같아 보이는군. + end scene + end area +end npc + +### 'sage' +npc sage + area BLANK + scene intro +# Mysterious voice: Hello? ...Young? ^HEY! ... oh, you can hear me? Good, now listen. You are about to wake up. You will use the arrow keys to move around. +의문의 목소리: 이봐? ...영? ^이봐!!! ... 오, 내 말이 들리나? 좋아, 내 말 잘 듣게. 우선 움직이는 법을 알려주겠네. 방향키를 사용해서 움직일 수 있네. +# Note, these next two lines should be assumed to have the keybinding between them when translated (hence the single quotes) +# You will press the \' +아마 \' +# \' key to interact with objects and people around you. +\' 버튼을 눌러서 앞에 있는 사물이나 사람들이랑 상호 작용을 할 수 있을 걸세. +# And you will press the \' +그리고 \' +# \' key to access the menu, which will provide you with information about yourself and your surroundings. +\' 버튼을 눌러서 메뉴로 갈 수 있네, 메뉴에서 자네에 대한 정보와 환경을 볼 수 있을걸세. + end scene + end area + + area GO + + + scene posthappy_sage +# Young... I just wanted to fix everything for you. +영... 난 그냥 자넬 위해 모든 것을 되돌리고 싶네. +# I hope... I hope you can do better than me. +부디... 자네가 나보다 더 나을 거라고 믿네. + end scene + + scene posthappy_mitra +# Good luck, Young. +행운을 빌어. 영. +# Sage is right, in a way. I want everything to be nice and work out perfectly, and sometimes that makes me ignore reality. +현자의 말이 어느 정도는 맞아. 난 모든 것이 깔끔하고 완벽하게 해결됐으면 좋겠어, 그리고 난 나의 이러한 점 때문에 현실을 무시하게 되버리기도 해. +# I don’t know what you need to do to help The Briar. I don’t understand how this world works or why everything seems so strange. But I do want to be your friend, Young. +난 네가 브라이어를 돕기 위해 무엇을 할지 몰라. 난 어떻게 이 세상이 계속 앞을 향해서 나아 가는지, 아니면 왜 모든 것이 신비스럽고 이상한지 이해할 수 없어. 하지만 난 너의 친구가 되고 싶어, 영. +# You are fighting, Young. You are trying to understand. I hope you can work things out. +넌 싸우고 있어, 영. 넌 이해하려고 노력하고 있어. 난 네가 해낼 수 있기를 희망해. + end scene + scene one +TOP +# Sage: Young... this is my final warning... wait, who is that? +현자: 영... 이건 내 마지막 경고네... 기다려, 저 자는 누구지? +# Mitra: My name is Mitra, and this is my bike, Wares! +미트라: 내 이름은 미트라다. 그리고 이건 내 자전거, 이름은 상품이지! +# Sage: I didn’t ask the name of your bicycle, what are you doing here? I don’t remember you. +현자: 난 네녀석의 자전거 이름을 묻지 않았다. 여기서 뭐 하는 건가? 처음보는 것 같은데. +# Mitra: I’m here to help my friend, Young.. +미트라: 난 내 친구 영을 도우러 이곳에 왔지.. +# Sage: Young doesn’t have friends. Young doesn’t even have Briar. And if you’re egging him on, then I want you out of my world! +현자: 영은 친구를 사귄 적이 없네. 브라이어랑 친구를 한 적은 더더욱 없네. 그리고 만약 자네가 영을 부추긴다면, 자넬 내 세계에서 내쫓겠네! +# Mitra: What do you mean? Wares and I-- +미트라: 뭐라고 지껄이는 거야? 상품이랑 나는-- +# Sage: SHUT UP ABOUT YOUR STUPID BICYCLE!!! +현자: 너의 좇같은 자전거에 관한 이야기는 그만 짓껄여!! + end scene + + scene hit +TOP +# Sage: ... +현자: ... +#Mitra: Young! Are you okay? That was a beautiful thing you just did... You go on and finish this final punk-ass area! We know you can do it! +미트라: 영! 괜찮아? 고맙다, 상품아... 자, 가서 이 빌어먹을 곳을 끝내버리자고! 넌 할 수 있어! +# Mitra: Wares!!! +미트라: 상품!!! +# Mitra: Wares... +미트라: 상품... +# Mitra: Look, mysterious hooded character, I don’t know who you think you are, but why don’t you just leave us alone? +미트라: 이봐, 정체불명의 후드모자 양반, 당신이 누군진 모르겠지만, 왜 우리를 내버려두지 않는거야? +# Sage: You think you’re Young’s friend because you’ll lie to him and tell him that deep down he’s just perfect and everything will work out. Well, if that’s what you want, FINE. Get out of my face, Young. +현자: 자넨 영에게 뭐든지 완벽하고 잘 한다고 거짓말 한 주제에 자신이 영의 친구라고 생각하고 있나보군. 뭐, 그것이 자네가 원하는 거라면, 좋네. 내 눈앞에서 사라지게, 영. +# Sage: Go talk to your \"friend\". +현자: 네 \"친구\" 하고 떠들어 봐. +# Mitra: We're just doing the best we can... +미트라: 우린 그냥 우리가 할 수 있는 최선의 방법을 선택한 거야... + end scene + end area + area NEXUS + + + scene enter_nexus +TOP +# Cloaked Man: Well, it’s about time. Er...^I mean...^ Greetings, Young! I am Sage, the Village Elder. You have been summoned here because The Darkness has spread across The Land. The Darkness seeks The Legendary Briar, to use The Briar’s power for evil. You must reach it first. You must protect The Briar. +망토른 두른 남자: 좋아, 인사할 시간이군. 음...^내 말은...^ 반갑네, 영! 나는 현자라고 하네. 마을의 장로지. 어둠이 대륙으로 손을 뻗어가고 있어서 자넬 이곳으로 소환했네. 어둠이 전설의 브라이어를 찾고 있네. 브라이어들의 힘을 악에게 쓰기 위해서지. 자넨 반드시 어둠보다 먼저 브라이어들에게로 가야하네. +# Enter the active portal on your left to begin your quest. +자네의 임무를 시작하기 위해 왼쪽에 있는 차원문으로 들어가게. +# *Sigh* it doesn’t bode well that you’re still dallying about here. Enter the portal to begin your quest. The Briar and, by extension, the world are in dire need! +*한숨* 아직도 꾸물거리는 건가? 차원문으로 들어가서 임무를 시작하게. 브라이어와, 더 나아가 세계는 매우 도움이 필요하네! +LOOP +# Just go in the damn door! +그냥 빨리 저 망할 문에 가라고! + end scene + + # After entering STREET for the first time + scene after_ent_str +# Why are you still here? +아직도 여기서 뭐하는 건가? + end scene + # After finishing BEDROOM + scene after_bed +# Continue on, Young. That key you have found, there may be others like it - seek them out. +계속 앞으로 나아가게나, 영. 자네가 찾은 열쇠, 그것과 비슷한 게 다른 장소에 있을 수도 있네. +# Travel to the far reaches of The Land, Young. This is the only way to stop The Darkness. +이 대륙의 머나먼 곳까지 여행하게, 영. 어둠을 멈추려면 이 방법만이 유일한 길이니까. + end scene + # After finishing first 3 dungeons + scene before_windmill +# Take those three keys, Young, and unlock the way to the deeper realms of The Land. +이 세개의 열쇠를 가지고 가게, 영, 그리고 대륙의 깊은 영역으로 가는 길을 열게. + end scene +#After windmill, but disappears after Sage fight + scene after_windmill +# You have done what I have asked, Young, though there is still much to be done. Perhaps if you explore the deeper realms of The Land you will come to greater realizations... perhaps you'll be worth anything to Briar. +부탁한 일을 잘 마무리했군, 영, 아직 대륙의 깊은 영역에서 할 일들이 남아 있지만. 자넨 아마 대륙의 깊은 영역을 탐험하면서 큰 깨달음을 얻을 걸세... 어쩌면 자네가 브라이어에게 가치가 있게 될 수도 있지. + end scene + + scene all_card_first +# Good work, Young. You have found all of the cards in one area of The Land, and as a result, a gem has appeared on top of the area's portal. +잘했네, 영. 이곳의 모든 카드를 찾아냈군, 그 증거로, 보석이 이 지역의 차원문 위에 나타났네. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +# Sage: Soon your skills will be put to the test, Young. In order to make it through this temple alive, you will need both strength and intellect. And I assume that by this point you have found a weapon? +현자: 곧 자네의 능력을 시험해 봐야 할 거네. 영. 이 사원에서 살아남기 위해서는 힘과 지성이 모두 필요하네. 혹시 쓸만한 무기를 찾았나? +# Young swipes a few times +# Wha-?? ... I-I mean... Yes of course... a broom! Er... just as was foretold in The Legend... +뭐-?? ... 내-내 말은... 그래 물론이지... 빗자루! 어... 전설에 예언된 그대로... +# *grumble grumble* ... of all the incompetent--Hey! What are you still standing here for? +*툴툴거리며* ... 이 무능한--자네! 왜 아직도 거기에 서 있는 건가? +LOOP +# Keep your wits about you, Young. +정신 바짝 차리게, 영 + end scene + end area + + area BEDROOM + scene after_boss +# Sage fades into room. +# Sage: At this point, you are still weak. If you hope to protect The Briar from The Darkness, you must face your fears. The card you will find in this chest, and others like it, are symbols of your growth, so acquiring them is absolutely vital to your quest. +현자: 아직도 자넨 여전히 약하군. 자네가 어둠한테서 브라이어를 보호하고 싶다면, 자넨 자네의 두려움을 극복해야만 하네. 저기 있는 상자에서 카드를 발견할 수 있을걸세, 카드는 자네의 성장을 상징하지, 그러니 카드를 모으는 것은 임무를 수행하는 데 매우 중요하네. +# That key will also play an important role in your quest. You must seek out other keys, as well. Select the map on the menu screen to teleport back to the temple's entrance, and continue your heroic quest. +열쇠 역시 자네의 임무에 중요한 역할을 하지. 자넨 반드시 문을 열기 위한 여러 열쇠를 찾아야만 하네. 메뉴화면으로 간 다음 맵을 선택해서 사원의 입구로 돌아가기 위해 텔레포트하게나, 그리고 자네의 영웅적인 임무를 계속하게나. +# Travel East and South through the temple grounds... you will find a use for that key. +사원의 정원을 통해 남쪽 또는 북쪽으로 여행을 할 수 있네... 열쇠는 어딘가에서 찾을 수 있을걸세. +LOOP +# What, do you want a piggy back ride to the gate or something?? +뭔가, 내가 자네를 목마 태워 관문까지 데려다 주길 바라는 건가?? + end scene + end area + + area TERMINAL + scene before_fight +# Sage: Why won’t you listen to me?! If you rush into this like an idiot, you’ll only endanger The Briar, The Land, and everything I’ve worked for! I’m sorry Young, but if you won’t listen to me, then I’ll have to convince you another way... +현자: 왜 말을 듣지 않는 건가?! 멍청이처럼 돌진했다간 브라이어와 대륙을 위험에 빠뜨리게 될걸세. 이때까지 했던 일들이 헛수고가 되어버리는...! 미안하네, 영. 하지만 자네가 내 말을 듣지 않는다면, 다른 방법으로 내말을 듣게 하는 수밖에 없네.. + end scene + scene after_fight +# Sage: Young... This is not how I mean things to be... I meant for you to become a better person. I meant for you to be able to help The Briar. But all of this is just a silly game... I can’t stop you from reaching The Briar. Just remember what I said when it all goes to hell. +현자: 영... 이럴려던 게 아니었네... 단지 자네가 브라이어들을 도울 수 있을 정도까지 자넬 성장시키기 위해서였지. 하지만 이건 멍청한 놀이에 불가했어... 난 자네가 브라이어에게 가는 걸 막을 수 없네. 그냥 모두가 지옥에 갈 때 내가 했던 말을 기억하게나. + end scene + scene entrance +# Sage: Hello, Young. When you have become a stronger and wiser individual, this path will lead you to The Briar. +현자: 반갑네, 영. 자네가 더욱 강해지고 현명해질 때, 이 길은 자넬 브라이어에게로 인도할 걸세. +# Sage: You’re not ready Young, first you must face more trials in The Land. +현자: 하지만 영, 자넨 아직 준비되지 않았어. 우선 이 대륙에서 더 많은 시련을 극복해야만 하네. +# Sage: You have made progress, Young, but you must collect at least 36 cards to pass this gate. +현자: 많이 성장했군, 영, 하지만 이 관문을 통과하기 위해서는 반드시 36장의 카드를 모아야만 하네. + end scene +# non idlnig stuff + scene etc +# Sage: Oh... uh... you have at least 36 cards? But I am not certain that you are ready for the true test. In fact, look, we were reading this gate wrong, you actually need...\n...\n........\n92 cards to pass this gate, not 36! +현자: 오... 음... 36장의 카드를 가지고 온건가? 하지만 아직 난 자네가 진정한 시련과 맞설 때가 되지 않았다고 생각하네. 사실, 이걸 보게, 우리가 잘못 읽고 있었네, 진짜로 필요한 카드의 양은...\n...\n........\n36장이 아닌 92장이라고 써져있네! +# Sage: Young, don’t go there, you’re not ready yet! Think of The Briar! The Land! All of this will be for nothing if you are not ready! +현자: 영, 자넨 아직 준비되지 않았네! 이 대륙과 브라이어를 생각해보게! 만약 자네가 준비되지 않았다면 이 모든 것들은 물거품이 되어버릴걸세! + end scene + end area + + + + area REDCAVE + scene one +TOP +# Sage: Excellent work, Young. You had to conquer not only this monster but also your own fears to prevail!!! +현자: 훌륭하군, 영. 자넨 괴물들 뿐만 아니라 자신의 두려움도 이겨냈군!!! +# Sage: Of course, you still have a long way to go. Have you been exploring The Land? +현자: 물론, 아직 가야할 길이 머네. 대륙을 전부 탐험해봤나? + end scene + end area + + area CROWD + scene one +# Sage: Well done, Young. However, there are still trials to face. Do not let your guard down. +현자: 훌륭하군, 영. 하지만, 아직도 시련이 보이는군. 긴장을 풀지 말게나. +# Sage: Have you found all of the keys yet, Young? If not, go to the beach. +현자: 아직도 모든 열쇠를 찾지 못한 건가, 영? 아직 다 모으지 못했다면, 바닷가로 가보게나. + end scene + end area + + + +end npc + +npc cliff_dog + area CLIFF + scene top_left +# I'm not like the others! *woof* I won't harm you... +나는 다른 놈들과는 달라! *멍멍* 당신을 해치지 않을게... +# It is a quiet existence up here. +난 조용함과 평화로운 걸 좋아한다고. +# You smell like swiss chard. +당신의 냄새가 근대같은데. +LOOP +# *woof* +*멍멍* + end scene + end area +end npc + +npc happy_npc + area HAPPY + scene beautiful +# You did it, Young! You defeated The Darkness! Look at this place! It’s beautiful! +해냈군, 영! 마침내 어둠을 막아냈어! 여길 봐! 정말로 아름다워! +# So beautiful... +너무나 아름다워... + end scene + + scene dump +# Oh thank god you’re here! I was worried you’d get stuck in that snowy dump... It’s fucking depressing over there! Ha! +오 다행이야! 무사했구나! 그 눈더미에 덮혀서 꼼짝못하고 있을거라고 생각했어... 만약 그랬다면 존나 우울했겠지! 하! +# Hahaha. Hahahahaha. HAHAHAHAHAHAHA! +하하하. 하하하하하. 하하하하하하하! + end scene + + scene drink +# Hey sexy, I’ll buy you a drink! +이봐 거기, 귀여운데? 한잔 할래? 내가 쏠게! +# Have another drink, you little shit! Hahaha! +한잔 더 할래? 거지같은 새끼야! 하하하! + end scene + + scene hot +# Fuck, it’s hot here... I’m so hot... and sweatyyy... +씨발, 여기 존나 뜨겁군... 나도 뜨겁고... 땀범벅이 되버렸네... +# Damn, working out makes me horny! +젠장, 운동은 날 불끈불끈하게 하지!! + end scene + + scene gold +# Did you know this place is made of gold? Like actual gold! We could run away together and live off this brick right here! Wahahaha! +이 세계가 금으로 만들어진 곳이라는 걸 알아? 진짜 금 말이야! 둘이서 도망쳐도 이 벽돌로 평생을 놀고먹고 할 수 있는 거지! 와하하하하! +# Seriously, why are you just standing there? Help me jack this brick! +나 진지하다고, 왜 아직도 거기 서있어? 어서 벽돌 나르는 것을 도와줘! + end scene + + scene briar +# ???: Young... You finally maDe IT! YuO SsavED ME! nOE EvERtyhinG WILL bE OKYA AGaIN!!!!! +???: 영... 드디어 해냈구우나! 가너 나를 구줬해어! 이제 든모 일이 시다 잘 풀거릴야!!!!! + end scene + end area +end npc + +### 'mitra' +npc mitra + area OVERWORLD + scene initial_overworld +# HEADS UP! +조심해! +#Mitra swerves to avoid you and crashes +# Sorry about that... I was going way too fast. Oh, I’ve never seen you before! Are you a fellow traveller? ... Huh? You want to protect the Briar from the Evil Darkness? ... ^Well... I have no clue what you’re talking about, but sounds cool, I guess! +아 미안해... 너무 흥분했었나 봐. 오, 처음 보는 얼굴인데! 넌 여행자야? ... 뭐? 악한 어둠에게 브라이어를 지키겠다고? ... ^음... 네가 무슨 말을 하는지 잘 모르겠지만, 왠지 멋진데! +# I’ve just been out and about, peddling my wares.... What? No, I’m not a salesman. Wares is the name of my bicycle! +방금 막 나와서, 상품을 좀 타려고 했는데.... 뭐? 아니, 난 잡상인이 아니라고. 상품은 내 자전거 이름이야! +#Plays if you talk 3 times, or if you leave the screen +# Well, maybe we’ll run into each other again sometime. I’ll let you know if I hear anything about that Briar. +분명히 다시 만나게 될 거야, 혹시 내가 브라이어에 관한 정보를 듣게 되면 너한테 알려줄게. +#Mitra bikes away + end scene + end area + area BLUE + scene one +# HEADS UP! All right Wares, let’s do this! +꼼작 마! 좋아 상품아, 시작하자! +# Annnd presto! +쨔자안! +# Keep going, Young, we’ve got your back! +계속 가라고, 영. 우린 네 뒤에 있을게! + end scene + end area + + area FIELDS + scene init +# Remember me? I forgot to introduce myself the last time, I only introduced my bicycle, Wares. My name is Mitra. +날 기억해? 저번에 자기소개하는 걸 까먹었었지, 내 자전거 상품만 소개 했었어. 그래, 내 이름은 미트라야. +# Remember me? I forgot to introduce myself the last time, I’m Mitra, and this fine young bicycle is named Wares. +날 기억해? 저번에 자기소개하는 걸 까먹었었지, 나는 미트라야, 그리고 이 크고 아름다운 자전거 이름은 상품이고! +LOOP +# Mitra: So how have you been, Young? ...what? How did I know your name? You think it’s weird, eh? Well, I saw it on the back of your hoodie. +미트라: 그래서, 어떻게 지냈어 영? ...잠시만? 내가 어떻게 네 이름을 알지? 이상하다고 생각하지 않아, 응? 뭐, 사실 네 옷 뒤에 적힌 걸 봤었어. +# Mitra: See you around, Young! +미트라: 다음에 또 봐, 영! + end scene + scene quest_event +# Mitra: Hey, I just remembered - someone said they were trying to find something earlier. I wasn't sure what they were talking about, so they said they were going to the mountains - ran off in a hurry. +미트라: 이봐, 기억났어 - 누군가 무엇을 빨리 찾는 중이라고 했어. 그 사람들이 무엇에 대해 말 했는지 확신하진 못 하겠지만, 그사람들이 산으로 간다는 말을 하고 - 서둘러 도망치듯 가던데. + end scene + +# Hints for the game - not cards + scene game_hints +# The ordering matters in these (indexed in-game, so just keep them numbered) +# 0 ignore this +# Nothing. +아무것도 아니다. +# 1. Beach hint (no dungeons finshed) +# Oh, you're lost? Have you looked around the beach? Maybe someone there can help you out. It looks like that key of yours comes in a set. Maybe you need to find more? +오, 포기하려는 거야? 바닷가는 둘러봤어? 혹시 그곳에 있는 누군가가 널 도와줄 수도 있지 않을까? 어쩌면 열쇠를 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까? +# 2. Forest hint (no dungeons finished) +# Oh, you're lost? Have you looked in the forest to the east? That key you have - it looks like it comes in a set. Maybe you need to find others? +오, 포기하려는 거야? 동쪽의 숲은 둘러봤어? 어쩌면 열쇠를 - 사용할 장소를 발견할 수도 있고 다른 열쇠가 있지도 있지 않을까? +# 3. Windmill hint +# Look at all of those keys! I think I saw some gates to the southeast. Maybe you could use them there? +열쇠를 찾았네! 아까 남동쪽으로 가는 잠겨진 관문을 본 것 같아. 그 열쇠로 열 수 있지 않을까? +# 4. Generic hint to go past statues +# Hey, I saw that you turned on the wind turbine! Do you know if it had any effect on The Land? +이봐, 풍력 터빈이 켜져 있는 걸 봤는데, 바람이 엄청 세던데! 이 대륙에 어떤 영향이 있지 않을까? +# 5. finished 6 bosses, all 36... +# Hey Young. Wow! You've really been racking up those cards! Have you figured out what they're for yet? Seems like you could really cash in with all those! +이봐 영, 오! 카드를 잔뜩 모았네! 근데 이건 뭐에 쓰는 걸까? 팔면 꽤 돈이 될 것 같은데. +# 6. hints for go things +# What is that new broom attachment you have? It lets you alter the structure of the world...? Honestly, that is really scary Young. I'm glad it doesn't seem to work anywhere, perhaps just in the deepest, strangest recesses of the Land +빗자루에 붙어있는 게 뭐야? 그걸로 네가 세계의 구조를 변경할 수 있어...? 솔직히, 그건 정말 무서워 영. 그 이상한 게 아무 데서나 작동하지 않는다는 게 정말 다행이네, 근데 깊은 영역 말고도 딴데서도 쓸 수 있지 않을까? +# 7. crowd finished but not redcave +# How are my jump shoes working for you? Pretty nifty, eh? I’m loving my new bike shoes. They make Wares and I an even better team! +새 점프신발은 어때? 꽤 멋지지 않아, 응? 난 내 새 자전거용 신발이 마음에 들어. 이 신발을 만든 회사가 내 상품을 만들었고 나랑 상품은 더 찰떡궁합이 될 거야! +#8. redcave finished but not crowd +# Cool, Young, you found another key! Wares likes the color! Have you found a place to use them yet? +멋진데, 영, 또 열쇠를 찾아냈구나! 상품도 그 색이 좋다고 하네! 근데 아직 그 열쇠에 맞는 입구는 찾지 못한거야? + end scene +# Hints for the cards. Play after the 6 dungeons are finished. + scene card_hints +# Mitra: Hey Young, looking for a card?\nHave you checked around the area of the Seeing One's temple? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원 근처는 둘러봤어? +# Mitra: Hey Young, looking for a card?\nI heard there's a maze around the back exit of the Seeing One's temple. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n그러고보니, 관측자의 사원의 뒤쪽 출구에 미로가 있다고 들은 적이 있어. +# Mitra: Hey Young, looking for a card?\nYou might find something near the Seeing One's lair. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처에서 뭔가를 찾을 수 있을지도 몰라. +# Mitra: Hey Young, looking for a card?\nThere was a room filled with enemies in the Seeing One's temple, right? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원에 있는 적들이 가득 찬 방이 있었는데, 그곳에 있지 않을까? +# Mitra: Hey Young, looking for a card?\nHave you looked all over the Seeing One's temple? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n관측자의 사원은 전부 둘러봤어? +# Mitra: Hey Young, looking for a card?\nTry looking in the vestigial area near the back exit of the Seeing One's lair. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n관측자의 은신처 근처의 아직 가보지 못한 구역들을 뒤져봐. +# Mitra: Hey Young, looking for a card?\nMaybe your neighbor knows something about it. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n너의 이웃이 알고 있을지도? +# Mitra: Hey Young, looking for a card?\nI know the guy in your apartment was hiding something... +미트라: 이봐 영, 카드를 찾고 있는 거야?\n네 아파트에 살고 있는 사람이 뭔가를 숨기는 것 같던데... +# Mitra: Hey Young, looking for a card?\nSomewhere near the entrance of your apartment...look around there! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n네 아파트 입구 주변... 거기에 있을 지도? +# Mitra: Hey Young, looking for a card?\nHave you looked *everywhere* in your apartment? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n정말 네 아파트에 있는 *모든 곳*을 다 둘러봤어? +# Mitra: Hey Young, looking for a card?\nJust south of here is an island! I haven't gone there, but you should check it out. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n여기에서 바로 남쪽으로 가면 섬이 있어! 난 가본적 없지만, 한 번 가서 찾아보는 게 어때? +# Mitra: Hey Young, looking for a card?\nThere's a lot of stuff to be found if you follow the rivers. Look around! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n강가에는 여러 물건들이 있어. 잘 찾아보는게 어때? +# Mitra: Hey Young, looking for a card?\nI know someone left a card near the windmill. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n누가 풍차 근처에 카드를 두고 간 것 같은데. +# Mitra: Hey Young, looking for a card?\nLook around the rivers in the forest... +미트라: 이봐 영, 카드를 찾고 있는 거야?\n숲에 있는 강 주변을 둘러봐... +# Mitra: Hey Young, looking for a card?\nTry poking around the base of the mountains. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n산기슭 주변을 둘러보지그래? +# Mitra: Hey Young, looking for a card?\nTry going to the summit of the mountains. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n산의 정상에 뭔가 있을 것 같지 않아? +# Mitra: Hey Young, looking for a card?\nThe far end of the beach may hold something. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n바닷가의 끝에 무언가 있을지도? +# Mitra: Hey Young, looking for a card?\nTake a walk in the crimson woods. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n진홍의 숲을 산책해 보는 건 어때? +# Mitra: Hey Young, looking for a card?\nThere were a lot of locked doors in one of those red caves, right? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n붉은 동굴 중 하나가 잠겨진 문들이 많았었어, 가보는 게 어때? +# Mitra: Hey Young, looking for a card?\nTry looking around the northern red cave - follow the river to its end! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴은 확인해 봤어? 강을 따라가면서 찾아봐! +# Mitra: Hey Young, looking for a card?\nGo to the northern red cave, check out the source of the river! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n북쪽에 있는 붉은 동굴로 가서, 강의 원류로 거슬러 올라가 봐! +# Mitra: Hey Young, looking for a card?\nHmm...did you look all over that dark labyrinth? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n흠...어두운 미로는 다 뒤져봤어? +# Mitra: Hey Young, looking for a card?\nI remember there was a pretty grim looking path of flamethrowers somewhere. Something's gotta be at the end of it! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n그러고 보니 불이 뿜어져 나오던 길 있었잖아? 그 안쪽이나 주변에 뭔가 있을 것 같지 않아? +# Mitra: Hey Young, looking for a card?\nThose circus folks have got to be hiding something. Did you look everywhere? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n서커스 단원들이 뭔가를 숨기는 것 같아 보이던데, 그 주변은 찾아 봤어? +# Mitra: Hey Young, looking for a card?\nHave you looked around the area on the perimeter of that couple's large pit? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n한 커플이 떨어진 구멍 기억나? 그 근처는 둘러봤어? +# Mitra: Hey Young, looking for a card?\nThere's this couple that like to hang around a pit. They must be hiding something. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n구멍 근처에서 뭔가를 하던 커플이 무언가를 숨기고 있는 것 같던데. +# Mitra: Hey Young, looking for a card?\nSometimes there are things hidden across chasms - especially in mountain caves! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n깊은 계곡이라던지 어딘가에 뭔가 있을 것 같지않아? - 특히 산의 동굴에 뭔가 있을 것 같아! +# Mitra: Hey Young, looking for a card?\nHave you scoured the highest parts of the mountain cave? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n산에 있는 동굴의 꼭대기는 가봤어? +# Mitra: Hey Young, looking for a card?\nIs there anything in the depths of that mountain cave? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n그 산에 있던 동굴 안쪽에는 가봤어? +# Mitra: Hey Young, looking for a card?\nThat colorful cube in that weird place - it has probably got something! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n아마 그곳에 무언가가 있을거야! - 그 이상한 곳에 있던 컬러풀한 큐브라던가, +# Mitra: Hey Young, looking for a card?\nHave you talked to that grayscale cube in that wild-lookin' area? Maybe it knows something. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n그 수수께기 공간에 있는 검은 큐브랑을 대화해봤어? 그 큐브라면 뭔가를 알지 않을까? +# Mitra: Hey Young, looking for a card?\nThe top floor of that hotel is a little run down, but it's gotta have something! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n그 호텔의 가장 위층은 고급스러워 보이진 않았어, 하지만 거긴 무언가가 있을거야! +# Mitra: Hey Young, looking for a card?\nDid you walk into all of the rooms on the 3rd floor of the hotel? +미트라: 이봐 영, 카드를 찾고 있는 거야?\n호텔 3층에 있는 방은 다 찾아봤어? +# Mitra: Hey Young, looking for a card?\nI bet someone left something lying around the 2nd floor of the hotel. +미트라: 이봐 영, 카드를 찾고 있는 거야?\n호텔 2층에 누군가가 두고간 게 있던데. +# Mitra: Hey Young, looking for a card?\nThe owner of the hotel might have left something for you! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n호텔의 오너가 널 위해 뭔가를 두고 갔을 거야! +# Mitra: Hey Young, looking for a card?\nThose broken bridges to the northwest...look around there! +미트라: 이봐 영, 카드를 찾고 있는 거야?\n북동쪽에 있는 부서진 다리... 거기가 수상하지 않아? +# and a bonus one if for some reason you make it this far without finding any... +# ...What? You haven't found *any* cards? Man, Young, that's crazy! Sometimes in life you just need to be adventurous, open a few boxes, you know? +...뭐? *한 장도* 찾지 못했어? 이봐, 영, 그건 미친 짓이라고! 가끔은 살면서 모험가가 될 필요도 있다고, 지나가다가 보이는 상자들을 열어봐, 알겠어? + end scene + +#General random stuff + scene general_banter +# Did you find that guy who was looking for something in the mountains? +산에서 뭔가를 찾고 있는 것같아 보이던 남자는 만나봤어? +# Do you know what my bike’s surname is? ...Waldo! Get it? Wares Waldo! ...Just kidding, bicycles don’t have surnames. +내 자전거의 성이 뭔지 알아? ...왈도! 힘세고 강한 성이지? 상품 왈도! ...농담이야, 자전거는 성을 가질 수 없어. +# Do you think I should get a U-Lock? I’d hate to tie up Wares like that, but you do hear a lot about stolen bikes these days... +혹시 자전거 자물쇠를 파는 곳을 알아? 상품을 묶는 건 싫지만 요즘 자전거 도난이 늘고 있다고 해서 말이야... +# So what is The Briar? Some sort of ancient artifact from a lost culture? +그래서 브라이어는 뭐야? 잃어버린 문명속의 고대유물 같은 거야? +# I wonder why I haven't heard anything about The Darkness coming. I guess most people in the land are just caught up in their own daily struggles. +난 왜 내가 어둠이 다가오고 있다는 사실을 전혀 몰랐는지 궁금해. 아마도 대륙에 사는 대부분의 사람들이 자신들의 일상과의 투쟁에 사로잡혀 있어서가 아닐까? +# Hey Young, I just wanted to tell you... your hair is awesome. +이봐 영, 이 말을 하고 싶었는데... 너 머리스타일 개쩐다. + end scene + + end area +end npc + +### Statue (wise crackin' statue) +npc statue + area NEXUS + scene enter_nexus +# Statue: The Village Elder in name only, for he is neither. +동상: 마을의 장로라는건 이름뿐이고, 마을따윈 없고 장로도 아니다. + end scene + end area + + area OVERWORLD + scene bedroom_entrance +# Statue: I’ve seen a broom in a legend... it was on the map of a janitor closet. +동상: 전설의 빗자루가 있는 위치... 그건 지도에 표시된 청소부의 옷장에 있다. + end scene + end area + + area BEDROOM + scene after_boss +# Statue: Acquiring cards is vital to your quest. Acquiring cards is also vital for other quests, such as earning credit or purchasing alcoholic beverages. +동상: 카드를 획득하는 것은 임무를 진행하는 데 아주 중요하다. 물론 다른 임무를 할 때도 중요하고, 예를 들자면 돈을 벌거나 술을 사는 것? + end scene + end area + area REDCAVE + scene one +# Statue: Excellent work, Sage. You had to conquer not only your temperament but also your own self-respect to deliver such a cheesy line!!! +동상: 현자는 훌륭한 자이다. 짜증내지 않고 자기 도취도 하지 않고 제대로 상용구 같은 말을 하니까!!! + end scene + end area + area TERMINAL + scene one +# When you have become a more stressed and apathetic individual, this path will lead you to the Breyers. Comfort by the pint, loser! +네가 더 스트레스를 받고 냉담해 졌을 때, 이 길은 널 브라이어들에게로 이끌거야. 위로의 메세지를 파인트가, 이 패배자야! + end scene + end area +end npc + +### sadbro (outside of bedroom) +npc sadbro + area OVERWORLD + scene initial_forced +# This line must be played once before anything else can +# Edward: Once a man came and installed a mirror in our bathroom. I was afraid that there was a hidden camera inside of it. I scoured every inch of the wooden frame, spraying Merphi’s Oil Soap into the cracks, thinking I might short-circuit the wires. Of course, I never found anything. +에드워드: 저번에 화장실에 거울을 설치하려고 사람을 부른 적이 있었어. 거기에 카메라를 숨겨놔서 들킬까봐 무서웠지. 난 모든 나무틀 사이 사이에 마피 오일 비누칠을 해서 틈새를 막고, 전선을 합선시킬까 생각도 했었지. 하지만 결국, 아무것도 발견되지 못했어. +LOOP +# Edward: This temple is dedicated to The Seeing One. I don’t know why I came here, and I’m too afraid to go inside. +에드워드: 이 사원은 관측자를 모시는 사원이야. 내가 여기에 왜 온 건지 모르겠지만, 안에 들어가는 게 무서워. + end scene + + scene bedroom_not_done +# Edward: Having trouble? Well I’d imagine so. All you have is a broom, and all brooms can do is move dirt. +에드워드: 문제라도 있어? 그런 것 같아 보이는데, 네가 가지고 있는 빗자루, 그리고 전 세계에 있는 모든 빗자루는 먼지를 쓸 수 있어. 알겠어? + end scene + + scene bedroom_done +# Edward: You say you defeated the Seeing One? Ha. Don’t you get that it doesn’t work that way? You’re just spraying oil soap in the cracks. +에드워드: 관측자를 막아냈다고? 하. 헛소리하지 마, 넌 그냥 틈새에 오일 비누칠을 하고 있을 뿐이잖아. + end scene + + end area +end npc + +# sun_guy (Bedroom boss) +npc sun_guy + area BEDROOM + scene before_fight +# Oh, isn’t it cute? Precious little Young, playing the hero. But I have witnessed every step you have taken in "The Land", and let me tell you, Young, not everyone here is as honest as me. Be careful who you trust! +오,영. 사랑스럽고 귀여운 영웅놀이를 하고 있네. 하지만 난 네가 \"대륙\"에서 한 모든 짓을 목격했지, 말해볼까? 영,여기있는 모든 사람이 나처럼 정직하지 않다고. 부디 너가 신뢰하고 있는 사람을 조심해! + end scene + scene after_fight +# I will be with you, Young, whenever you are alone. And remember my advice on your little "adventure". +네가 혼자일 때마다 난 네 옆에 있을 거야, 영. 그리고 반드시 내 충고를 너의 작은 \"모험\"을 하면서 잊지 마. + end scene + end area +end npc + +# rock (Rock with words) +npc rock + + area BEDROOM + scene one +# Rock: Peripheral vision is the hive of demons. +바위: 이곳에서 시력이 감소된 이유는 악마의 저주 때문입니다. + end scene + scene two +# Rock: To-do: Construct method of transportation to Nexus. Progress: Halted - Seeing One will not give the required funds to make the venture possible. We will have to revert to the original method of the inexplicable door portal. +바위: 해야 할 일: 연결체에 이동 수단을 만들어야 함. 지금 상태: 중단 - 관측자에게 예산을 얻지 못 할 것 같음. 그 수수께끼의 차원문을 사용해야 함. + end scene + scene three +# Rock: I'm trapped here all by myself. Work is steady on this tunnel, and at least I can see a little bit of progress every day. +바위: 실수로 이곳에 갇혀버렸습니다. 이 굴에서 항상 무슨 일들이 일어나고 있고, 약간의 변화들을 매일 조금씩 볼 수 있어요. + end scene + end area + + area BLUE + scene one +# This wheel is used to lift the dam. +댐을 여는 손잡이다. + end scene + end area + area CIRCUS + + scene one +# June 24th, 1957: Trapeze swing breaks. Alice Rutgers is flung into the ground, resulting in two fractured shins. +1957년 6월 24일: 공중 그네가 부서졌다. 앨리스 러트거스는 두 정강이가 골절되고 땅으로 떨어졌다. + end scene + scene two +# July 17th, 1957: Seven clowns retire with near fatal lung issues. LANDBLEND brand makeup is suspect, but no formal investigation occurs. +1957년 7월 17일: 일곱명의 광대가 폐가 안 좋아져서 은퇴했다. 랜드블랜드 브랜드의 메이크업이 의심되지만, 형식적인 조사조차 수행되지 않았다. + end scene + scene three +# July 21st, 1957: Following a cage malfunction, my face and side are severely mauled by an untamed lion. I survive, but now shudder to look at my own reflection. +1957년 7월 21일: 동물 우리가 망가지는 바람에, 야생 사자에게 얼굴과 옆구리를 심하게 당했다. 다행히 나는 살아남았다, 하지만 언제나 거울에 비친 내 모습을 보면 그때가 생각나서 공포에 몸이 떨린다. + end scene + scene four +# August 5th, 1957: In my dream, I saw a stone face with fierce, shining eyes. He spoke of the truth of our existence and was the first to offer freedom from the pain. +1957년 8월 5일: 꿈에서, 난 사나운 얼굴과 반짝이는 눈을 가진 돌을 보았다. 돌은 나에게 우리의 존재에 대한 진리를 말하며 나를 고통에서 해방시켜주며 자유를 선사하였다. + end scene + scene five +# August 7th, 1957: How many of us will suffer before we accept the truth of the Seeing One? +1957년 8월 7일: 얼마나 많은 사람들이 관측자를 따르기 전까지 고통받으면서 살아왔을까? + end scene + + scene six +# August 8th, 1957: I have come to my decision. A few of the others have said they will follow me. This will be my final entry. May the Seeing One look favorably upon us all. +1957년 8월 8일: 결정할 때가 왔다. 몇명은 나를 따르겠다고 했다. 오늘로 이 일기도 마지막 장이다. 관측가의 가호가 있기를. + end scene + end area + area CLIFF + scene one +# (Indecipherable markings) +(처음 보는 문자로 뭔가가 써져 있다) + end scene + scene two +# December 7th, 2010. (name unreadable). There's nothing up here, except this stupid rock! +2010년 12월 7일 (이름은 흐릿해서 보이지 않는다) 이 거지같은 바위를 빼면 이곳엔 아무것도 없다! + end scene + scene three +# Danger! This cave is unexplored. +위험하다! 이 동굴은 누군가 들어온 흔적도 없다! + end scene + scene four +# These cliffs extend far and upwards, though I've never gone high enough to find out where they lead. +이 절벽은 위쪽으로 길게 뻗어있다. 끝이 보이지도 않아서 위가 어떤지도 모르겠군. + end scene + end area + + + area CROWD + scene one +# Rock: How? +바위: 어떻게? + end scene + scene two +# Rock: Warning! Vertical drop, jump at your own risk. +바위: 조심하세요! 떨어지면 그 누구의 탓도 아닙니다. + end scene + end area + + area DEBUG + scene one +# This used to be a placeholder animation for the card gates. Approach it twice to see the locked and open animations! +가까이 가거나 멀리 떨어지면 문이 열렸다 닫혔다 할거야! +# I forget why we ended up scrapping it. Perhaps too dramatic. +난 왜 이걸 쓰지 않았는지 까먹었어. 너무 드라마틱해서인가? + end scene + + scene two +# Here are tests for various tile layers and collisions! I couldn't get one way tiles from both sides (i.e., walls) working very well so I just ended up scrapping the idea entirely...or something. +이곳은 다양한 타일과 레이어와 충돌을 테스트했어! 일방통행 타일을 양쪽(i.e., walls)에 두거나 했지만 잘 되지 않아서 뺐다... 랄까. +# There was some reason why we didn't use them. Simplifying design, which was important for us to finish the game. +이곳에는 왜 우리가 이것들을 쓰지 않은지 이유가 있어. 설계를 단순하게 하는 것. 이것이 게임을 완성하는 데 중요했기 때문이지. + end scene + + scene three +# Enemies used to be able to drop keys. I scrapped this idea even though it was slightly amusing. +처음에는 적을 쓰러트리고 열쇠를 얻을 수 있게 하려고 했는데, 이 아이디어는 안 쓰기로 했어. 꽤 마음에 들었었는데. +# Another idea we played with was having challenge gates, which lay at the end of a gauntlet, and only opened when you reached them without getting hurt. +다른 아이디어는 도전 관문을 게임에 넣으려고 한 건데, 이건 대미지를 입지 않고 시련을 클리어 할 때에만 열리는 관문이었지. +# We wanted to model all dungeons around this and scrap health entirely, but that turned out to be far too hard! +예전에 모든 던전에서 체력을 없애면 어떨까 하고 생각했는데, 너무 어렵다고 해서 못했어! + end scene + + scene four +# PRISON!!! +감옥이야!!! +# Save us!!! +도와줘!!! +# Please! +부탁해! + end scene + + scene five +# Welcome to the DEBUG WORLD! You've stepped outside of \"The Land\", so consider this world (90 PER-CENT) \"Non-canon\". Anyways. +디버그 세상에 오신 것을 환영합니다! 이곳은 \"대륙\"이 아니라서, 게임의 진행과는 (90%) \"무관합니다\". 잘 쉬다가세요. +# Before there were tilesets for many of the areas I used silly tiles like these to mark where doors went. In fact, every dungeon was mocked up in this area's tileset, and then Marina tiled over them with his tilesets. +맵의 타일 세트가 완성 될 때까지 이런 임시 타일 맵을 써. 게임의 던전은 사실 전부 그렇게 만들어서, 마무리로 존이 타일 세트를 넣지. + end scene + + scene six +# fille +젊은 여자 + end scene + end area + + area DRAWER + scene five +# -ARCHIVES- +-기록보관소- +# PROCEED WITH CAUTION +신중하게 진행하자. + end scene + scene four +# West. Rift. Reality! Low real estate values, hurricane, old, run down. Relaxing. +서쪽. 땅에 균열이 생김. 실제 상황! 부동산은 떨어지고, 허리케인이 일어나고, 부식되고, 무너지고. 하... 진정하자. + end scene + scene three +# The Seeing One from what I can rem- rmrr,,,,,,a Good Time At The Home. +내가 뭘 할 수 있을지 찾아봐야 게엤- 어으,,,,,,그냥 집에서 행복한 시간이나 보내야 겠군. + end scene + scene two +# COLD STORAGE\n\n^ -- THE MGMT +냉장실\n\n^ -- 관리 + end scene + scene one +# CONTINUE +계속 + end scene + end area + + area FIELDS + scene one +# West: Beach\n\nEast: Forest\n\nSoutheast:\n Rainy Area\n\nNorth: \nTemple Grounds\n\nNorthwest: Chasm +서쪽: 바닷가\n\n동쪽: 숲\n\n동남쪽:\n 비내리는 지역\n\n남쪽: \n사원 안\n\n북서쪽: 깊은 틈 + end scene + end area + + area FOREST + scene one +# West: Land Lake\nSouth, then east: Cliffs +서쪽: 대륙의 호수\n남쪽으로 가서 동쪽으로: 낭떠러지 + end scene + scene two +# Relaxation pond. Stay a while, we know you have the time. +휴식 연못. 잠시 쉬어가세요, 잠시 쉴 시간정돈 있잖아요? + end scene + scene three +# I'm afraid I may be stuck on this tiny corner forever. +난 내가 영원히 이 작은 모퉁이에 남아있을까 봐 두려워. + end scene + scene four +# East: Cliffs +동쪽: 낭떠러지 + end scene + end area + + area GO + scene one +# The path will open when the dark guardian tiles are replaced by the stone of their spirit color on the square grid below. + 어두운 수호자 타일을 정사각형의 격자무늬 아래에 있는 영혼의 색을 띤 돌로 바꾼다면, 길이 열릴 것이다. + end scene + + scene two +# When the blue stone statue shifted\nThere a new path was revealed\nPast the cliffs, through strange dimensions\nStands a travelers' hotel\n\n\n\"Who is the guardian?\" I ask,\n\"Who rules this crowded business place?\"\nDespite the many human souls\nI still feel alone. +파란 석상이 움직일 때\n새로운 길이 열렸다.\n절벽을 지나 이상한 차원으로 가니\n여행자의 호텔이 있었다.\n\n\n\"관리인은 누구지?\" 그곳에게 물었다,\n\"파수꾼은 누구지?\"\n많은 사람의 영혼이 있음에도 불구하고\n나는 여전히 외로움을 느낀다. + end scene + + scene three +# The red and rusty statue moved\nAnd paved the way to deeper pits\nA labyrinthine dungeon follows\nThen a big-top circus tent\n\n\n\"Who are the guardians?\" I ask,\n\"Who gave up life to flee this place?\"\nI fear the pain, the same as they\nBut fear it more to die. +붉게 녹슨 동상이 움직였다.\n그리고 안으로 통하는 길이 열렸다.\n미로 던전을 따라가니\n커다란 서커스 텐트가 보였다.\n\n\n\"파수꾼은 누구지?\" 물었다,\n\"누가 이곳에서 도망치기 위해 목숨을 버렸지?\"\n내가 고통을 두려워하듯이 그들도 두려워했고\n고통보다 죽음을 더 무서워했다. + end scene + + scene four +# The green, metallic statue shifted\nOpening a deeper trail\nSuburban homes and sidewalks form\nA path to an apartment.\n\n\n\"Who is the guardian?\" I ask,\n\"Who looks for comfort in the stars?\"\nAlone, I feel like I am watched\nAnd not by friendly starlight. +녹색 금속 동상이 움직였다.\n난 안쪽으로 들어갔다.\n교외 주택 및 보도 형태\n아파트로 가는 길로.\n\n\n\"파수꾼은 누구지?\" 그곳에게 물었다,\n\"누가 별에서의 편안함을 찾는가?\"\n홀로, 나는 감시당하고 있다는 느낌이 들었다.\n그건은 항상 친근했던 별빛과는 다른 것이었다. + end scene + + + end area + + area BLANK + #initial entrance from windmill + scene one +# Rock: This is unclaimed territory - not yet a part of The Land. +바위: 아직 이곳은 주인없는 대륙의 일부분중 하나인 - 영토입니다. + end scene + #concentric circles + scene two +# Rock: These -^ me and my^ - circles are^ - promises...I'll^ - concentric^ - really try to get everything done...^ - circles. Bzrt, bzrt. +바위: 이 -^ 내것과 나^ - 원은^ - 약속이다....나는^ - 동심원의^ - 정말로 모든 것을 끝내려고...^ - 원. Bzrt, bzrt. + end scene + #islands + scene three +# Rock: Watch^ -...but I always^ - your step^ - manage to reappear no?^ - when here! +바위: 보고 있어^ -...하지만 나는 항상^ - 너의 행보를^ - 네가 다시 이곳에^ - 나타나 줬으면! + end scene + #mazeish place, not near the portal + scene four +# Rock: Looking down^ - And I realized:^ - from here, you- ^ I'm in love with him.^ - can see...nothing, really. +바위: 내려다 봐^ - 그리고 난 깨달았지:^ - 이곳에서, 너- ^ 나는 그를 사랑해.^ - 사실... 볼 수 없었어, 정말로. + end scene + #left part of the 48 gate + scene five +# Rock: My apologies -^ But yeah, we -^ on the mess here -^ ought to keep in touch-^ but that portal should^ - and I will try give you my opinions - ^ return you to to The Land. +바위: 미안해 -^ 그렇지만 우린 -^ 이곳의 엉망 -^ 계속 연락하기로 -^ 하지만 저 관문은^ - 그리고 내 의견을 제시하고 싶어 - ^ 대륙으로 돌아와 줘. + end scene + end area + + + area NEXUS + scene one +# Sometimes if you talk to people multiple times, they have new things to say. +가끔 사람들에게 여러번 대화를 하면, 그들은 새로운 주제를 가지고 대화를 할 수도 있습니다. +# But not rocks. Rocks don’t do that. +하지만 바위는 아니죠. 바위는 그럴 수 없어요. + end scene + #before 49 card agate + scene two +# Rock: So close! If only... +돌: 정말 아쉬웠어! 만약에... + end scene + #door that goes nowhere + scene three +# Rock: Curiosity is a great thing. +돌: 호기심은 좋다고. + end scene + #below treasure box + scene four +# Rock: Oh!...? +돌: 오!...? + end scene + scene five +# The computer terminal has an e-mail open. Parts of the screen are broken, so only parts of the message are visible in between black blotches. The e-mail reads: \"Hello, Young! It seems that [...] fiftieth card [...] maybe you shouldn't... [...] worth thinking about! Do you think you're ready? Wake up...\" +컴퓨터 터미널에 이메일이 띄워져 있다. 화면 일부분은 박살 나 있다. 그래서 오로지 검은 얼룩들 사이의 몇 부분들만 볼 수 있다. 이메일 내용: \"안녕, 영! 보이네[...] 50번째 카드 [...] 아마도 넌 [...] 의 가치에 대해서 생각해봐! 네가 준비됐다고 생각해? 일어나...\" + end scene + end area + + + area OVERWORLD + scene one +# Rock: I’ll bet you’re reading a rock because you don’t have any friends. +바위: 넌 친구가 한 명도 없어서 이 바위에 적힌 글자를 읽고 있다는 데 내 손모가지를 걸지. + end scene + scene two +# Rock: Welcome to Overworld Station. We hope you enjoyed your time in The Land. +바위: 오버월드 정거장에 온 것을 환영합니다. 대륙에서 즐거운 시간을 보내셨길 바랍니다. + end scene + scene three +# Rock: An explorer is you! +바위: 탐험가는 당신입니다! +# Rock: Please don't go south. It's under construction. +바위: 남쪽으로 가지 마십시오. 그 곳은 공사중입니다. + end scene + scene four +# Rock: Treasure in 5,3! +바위: 5,3에 보물이 있다! + end scene + scene five +# Rock: Haha, gotcha! +바위: 하하, 잡았다! + end scene + end area + + area REDCAVE + scene one +# WE ARE BORN INTO THE DECAY OF OUR MOTHER’S BODY. +우리는 어머니의 부해한 몸에서 태어났다. + end scene + scene two +# ONE DAY OUR MOTHER LEFT HER MOTHER AND VENTURED INTO THE POISONOUS FOG. +어느 날, 우리의 어머니는 그녀의 어머니를 떠났다. 그리고 독 안개속으로 모험을 떠났다. + end scene + scene three +# WE NEVER ASKED FOR THIS. WE WOULD NOT HAVE BOUGHT OUR LIVES WITH HER SUFFERING. +우리는 물어볼 수 없었지. 우린 그녀의 고통과 우리의 삶을 만들고 싶지 않아. + end scene + end area +# area for redsea + area REDSEA + scene one +# Rock: Signs indicate the trees have not been active for an extended period of time. +바위: 표지판은 오랜 시간동안 죽어있던 나무를 나타낸다. + end scene + scene two +# Rock: South: ???^ North: ??? +바위: 북쪽: ???^ 남쪽: ??? + end scene + scene three +# Rock: The uneven terrain is said to have been formed by the ancestors of the area's inhabitants. +바위: 이 지역의 일그러진 지형은 선주자의 조상이 이룬 것이라고 알려져있다. + end scene + scene four +# Rock: They appear to be a peaceful species. +바위: 그들은 평화로운 생물이다. + end scene + end area + + + area SPACE + #middle + scene one +# Scribbled in what appears to be permanent marker: Greetings, fellow traveler of SPACE and TIME. You have stepped into a rift far away from the juxtaposing area of YOUNG. You've crossed an OCEAN or two, so to speak. Don't worry about the CONTRAST, you can return to your normal adventure shortly. Do not FEAR this place, though it appears FORBODING and DANGEROUS you will find its denizens to be quite FRIENDLY.\n -- The MGMT + 유성 매직 같은 걸로 써져 있다: \"공간\"과 \"시간\"의 여행자여, 환영합니다. 당신이 발을 디딘 곳은 \"영\"의 차원 균열과 인접합니다. 당신은 \"바다\"를 하나둘 넘어왔습니다, 그래서 말하는데. 부디 평소랑 다른 \"차이\"를 두려워하지 마세요, 당신은 곧 다시 당신의 평범한 모험으로 돌아가겠죠. 이 장소는 \"불길\"하고 \"위험\"해 보일 수도 있지만 부디 \"두려워\"하지 마세요, 이곳의 주민들은 모두 매우 \"친절\"합니다.\n -- MGMT +# (Below the message, an engraving:) Here lies ____ (unreadable). He got lost in the woods. + (메시지 아래에 문자가 새겨져있다) 숲에서 길을 잃은 ____ (읽을 수 없다), 이곳에 잠들다. +# (Even further below the message:) (just don't go too far south.) + (그 밑에 아직도 메시지가있다) (남쪽으로 너무 멀리 가지 마라.) + end scene + # extra color + scene two +# Here lies ____ (unreadable. Who wrote this?). He was impaled by rainbows! +무지개에 찔려죽은 ____ (읽을 수 없군. 누가 쓴거야?), 이곳에 잠들다. +# Would've been better with achievements. + + end scene + #grey graves + scene three +# Here lies Burd. The cliffs weren't feeling too friendly. +절벽과 친해지지 못했던 버드, 이곳에 잠들다. + end scene + scene four +# Here lies bag. It never had a chance. +한 번도 쓰인적이 없는 가방이 있다. +# Pretentious! +안쓰럽네! + end scene + # color graves + scene five +# Here lies Savitch. He tried to fix my computer in the garage once, and didn't take up much space while doing so. Three years later, he still hadn't finished. Then, he dropped dead. +차고에 있는 컴퓨터를 수리하려고 자리잡고 앉아서 작업했지만 3년이 지나도 수리해지 못하고 어디선가 떨어져 죽은 세비치 이곳에 잠들다. + end scene + scene six +# Here lies Dave. He wasn't very inspirational. +내세울게 하나도 없던 데이브, 이곳에 잠들다. + end scene + + end area + + area SUBURB + scene one +# ---YOUNG TOWN---^\nWelcome to Young Town. Please beware of some of the citizens. They do not play well with others...tread carefully. Now, Young Town was founded sometime in the '90s by Mayor Ying as a part of a series of ongoing housing projects, the name chosen as a reflection of Ying's denial of possessing the name Ying, and assertion of possessing the name Young. We'll hope you enjoy your stay. + ---영 타운---^\n영 타운에 오신 것을 환영합니다. 몇몇 시민들은 다른 사람과 잘 어울리지 못하니... 주의해주세요. 영 타운은 시장 잉 씨의 택지 개발 정책의 일환으로 90년대에 개발 된 마을입니다, 마을의 이름은 시장의 이름인 잉(그늘)씨가 자신의 이름을 거절하고 스스로 선택한 영(양지)라고 정한 것에 유래됐습니다. 편히 지내시기 바랍니다. + end scene + + scene two +# To the west are the legendary temples of the Seeing One. To the east is our wonderful Mayor Ying's apartment, which has been since closed off from visits to the public - trespassers beware. + 서쪽에는 전설의 관측자 사원이 있습니다. 동쪽에는 우리의 훌륭하신 시장님 잉씨의 아파트 입니다. 지금 아파트는 개방되지 않고 있습니다. - 방문시 주의해 주세요. + end scene + + scene three +# On his fifth visit, Mayor Ying grew frustrated at the lack of parking lots. This parking lot reflects Ying's frustration of the lack of parking lots. Ying would occasionally park in this parking lot on subsequent visits. + 5번째 방문 때, 잉시장은 주차장이 적음에 강한 불만을 느꼈습니다. 이 주차장은 잉시장이 느낀 주차장이 적음을 반영한 것입니다. 이후 잉시장은 방문할 때마다 이 주차장을 이용합니다. + end scene + + scene four +# I remember the long sentences I used to write. Ha! Fragmented. + 예전에 긴문장을 썼던게 기억나네. 하! 집어쳐! + end scene + + scene five +# A DANGEROUS SITUATION + 위험한 상황 + end scene + end area + + +# Area for TRAIN (it's actually CELL sorry) + area TRAIN + scene one +# The Seeing One knows all and will lead one to enlightenment. The road to enlightenment is unlit by any torches. +관측자는 모든것을 알고있고, 깨달음으로 이끈다. 깨달음으로 가는 길을 비추는 빛은 없다. + end scene + scene two +# Do not stray from the way of the Seeing One, not even for the treasures lying at the far corners of the maze. +관측자의 길에서 이탈하면 안 된다. 비록 미로의 구석에 보물상자가 있더라도. + end scene + scene three +# Move along. +홀로 이동했다. + end scene + scene four +# Do not anger the Chasers with violence. +체이서를 화나게 하지 마세요. + end scene + end area + + area WINDMILL + scene one +# SCENIC LANDMARK: Partner Towers. Built some time ago, the Partner Towers overlook the distant mountains. The first tower was damaged a while ago and has since been repurposed. The second still stands to the east, reaching into the sky. Due to safety concerns, the path to the tower has been cut off until further notice. +관광 명소: \"쌍둥이 탑\". 최근에 건설된 이 탑은, 멀리 있는 산까지 볼 수 있습니다. 첫 번째 탑은 망가진 이후로 다른 용도로 사용되고 있습니다. 두 번째 탑은 여전히 동쪽에 위치하며, 하늘까지 뻗어 있습니다. 안전상의 문제로 이 탑으로 가는 길은 추후 공지가 있을 때까지 봉쇄되어 있습니다. + end scene + scene two +# PUBLIC SAFETY NOTICE:^\nThis tower, while not damaged, has been said to have a dimensional rift at the top. Proceed with caution and an open mind.^\n -- The MGMT +안전에 관한 안내문:^\n이 탑은 손상되지 않았지만 꼭대기에 차원의 균열이 생기고 있습니다. 주의해주세요.^\n -- MGMT + end scene + end area +end npc + +# dungeon statue (Dungeon statue) +npc dungeon_statue + area BEDROOM + scene one +# The statue does not look like it will be moving anytime soon. +맨날 움직일 것 같게 생기지는 않은 동상이군. + end scene + scene two +# The statue has moved. +동상이 움직였군. + end scene + end area + + area REDCAVE + scene one +# It looks like this statue is firmly in place. +이 동상은 움직이지 않고 계속 여기에 서 있을 것 같군. + end scene + scene two +# The statue has moved. +동상이 움직였군. + end scene + end area + + area CROWD + scene one +# This statue does not seem to be movable. +움직일 것같이 생긴 동상은 아니군. + end scene + scene two +# The statue has moved. +동상이 움직였군. + end scene + end area +end npc + +# APT splitboss +npc splitboss + area APARTMENT + scene before_fight +# Fire is beautiful, isn't it? What a shame that the glow and glare of streetlights hides the fire of the stars. +불은 아름다워, 그렇지 않아? 하지만 마을의 불빛들이 별의 빛을 가려 버리는 건 수치스러운 일이야. + end scene + scene after_fight +# Okay, so stars aren't really made of fire. ^Who gives a shit anyway? +그렇구나, 별은 불덩어리가 아니지. ^넌 자세히 알고 있구나... + end scene + end area +end npc + +npc cube_king + area SPACE + # kings are supposed to offer info on + scene color +# How are you today? I'm the ruler of this partition and interpretation of space. + 잘 지냈나? 난 이 구역의 통치자이고 이 공간의 성립되는 모든 것 그 자체이네. +# You want to know why I'm the ruler of this place? I'll tell you, but it will take a while. Like, a long while. An obnoxiously long while. + 내가 어떻게 이곳의 통치자가 됐는지 이유를 알고 싶나? 알려주지, 하지만 시간이 필요해. 아마, 긴 시간 말이야. 역겨울 정도로 오랜 시간이. +# Like, quite a while. No really, I'm warning you! I tend to ramble. Maybe you'd be better off just scooping out the contents of that chest over there. Or heading off to the hotel in the distance. Don't know how that got there, I heard they have relatively cheap rates. Not that money matters here. + 그래, 꽤 오랫동안. 아니, 정말로, 경고하는데! 아, 내가 좀 횡설수설한 경향이 있어. 어쩌면 그냥 바로 저기에 있는 상자 안을 보는 게 더 나을지도 모르겠네. 아니면 멀리 있는 호텔로 향하거나. 그게 거기 있는지는 모르지만, 거기는 상대적으로 저렴한 가격이라고 들었어. 돈 따위 의미 없지만. + LOOP +# Why am I the ruler?^...I'm not sure why, but my friends around here saw it fit to put me in this position, because of the immediate state of this space. Maybe this is the case because cubes are best at sitting still on flat surfaces. As for why someone needs to sit up here - that's beyond me! + 왜 내가 통치자가 됐나고?^...왜냐고 물으니 확신하기 어렵군, 하지만 주변에 있던 내 친구들이 날 보고 이 적합한 위치에 넣어준거지, 이 공간의 상태에 즉각적인 이유지. 어쩌면 경우일지도 몰라. 왜냐하면 큐브는 평면에 서있기 최적의 형태를 가지고 있지. 왜 누군가가 여기에 앉고 싶어한다고 묻는다면 이렇게 대답하지. - 그건 나랑 상관없는 일이네! +# The others - my friends over there - have merits of their own. It's not like they couldn't sit up here in the future, they just can't do it now. Sometimes, we switch off who is the ruler, but every time, we always have to reinterpret this region of space! Perhaps Mr. or Ms. Pyramid comes up here because we decide to make the throne shaped in a way that best fits them, by re-imagining this world, so to speak. Does that sound silly? It might be. But that's how it is. It happens quite fast. Minutes, hours - not necessarily a long reign. + 그리고 또 - 내 친구들도 - 역시 장점은 있어. 그 친구도 언젠가 통치자가 될 가능성이 있고 지금은 할 수 없어서 내가 하는 것이지. 가끔은, 통치자를 누가 할 것인가 정하기도 해. 하지만 대부분, 우린 공간의 영역을 재해석해야 하네! 다시 말하자면, 신사 또는 숙녀 피라미드는 여기에 온다는 거지. 왜냐하면 우린 왕좌 모양을 가장 잘 맞는 방법으로 만들기로 결심했기 때문이지. 이 세상을 다시 상상함으로 인해서 말이야. 말하자면, 바보같은 소리라고? 그럴지도 모르지. 하지만 그렇지만 이건 방법이야. 그 상황은 매우 빠르게 초, 분, 시로 발생하지. - 필요치 않은 긴 통치. 왕좌 모양. +# Though, when I am ruler, it feels slightly strange...I somewhat feel isolated, wanting to be avoidant of others... + 하지만, 내가 통치자가 됐을 때, 약간 이상한 느낌이 들었지...뭔가 고립된 느낌, 다른 사람을 피하고 싶었지... +# ...but isolation is not the right word, though it covers parts of the feeling. I'm not isolated, and I don't dislike the others. We consider ourselves all friends, but you know, no one really comes up here except to say a few words. So I have to think about things or I might go crazy! Maybe that's part of the isolation. + ...하지만 고립은 옳지 않아, 그래도 이건 느낌의 일부분을 다루고 있지만. 나는 고독하지 않네. 그리고 다른 사람을 싫어하지도 않지. 우린 모든 친구를 고려해야 하고, 하지만 말일세, 몇 단어를 제외하고 대부분의 사람들이 여기에 오지 않는다네. 그래서 나는 그런 것들에 대해 생각하거나 미쳐가고 있을 걸세! 어쩌면 이것도 고립의 한 부분일지도 모르지. +# Outside of those inane questions about *why* we're here occupying this space, I'm curious as to why we're even friends. + 그 이외에 *왜*냐는 어리석은 질문에 대한 답인데, 우린 여기에 이 공간을 점령한채로 있네. 아, 왜 우리가 친구인지 계속 신경쓰이는 거야. +# I like to think that whenever we're under the interpretations that I'm best to rule, that they give me comfort in being able to hold this position for as long as it takes to reach the next interpretation. You know, encouragement and the like, their physical presence, those are comforting. + 나는 우린 항상 내가 통치자에 최고로 적합하다는 해석 아래에 있다고 생각하고 싶네. 그들은 나에게 존재 할 수 있는 곳에서 이 위치를 유지하기 위해 편안함을 제공했지. 다음 차례의 해석을 할때 까지 말일세, 자네도 알다시피, 격려 같은거 말일세, 물리적 존재는 그 위안이 된다네. +# I suppose that's enough to satisfy me, though it would be nice to have one or two of them try and understand how I feel about being a ruler. Not that I'm complaining about encouragement! But maybe then, we could have multiple rulers...what a thought! Maybe that implies that when I am not ruler, I must act the same way I sometimes wish they would...who knows if that can be done. + 그것들이 날 만족시키기에 충분하다고 가정한다면, 그래도 멋진 것, 아니 멋진 것들일거야. 내가 왜 통치자가 됐는지 이해되는군. 나는 격려에 대해 불평하고 있지 않네! 하지만 어쩌면 그 다음, 우린 여러명의 통치자가 있을 수...내가 무슨 생각을! 그러니까 내가 통치자가 아닐 때, 같은 방식으로 행동해야 하네, 나는 가끔 그들...그럴 수 있을지 누가 알겠어? +# I've gone on too long. If you head off in the other direction, there's another similar region of space, though I think it smells a bit different. + 난 너무 멀리 가버렸네. 자네가 만약 다른 방향으로 간다면, 거긴 여기랑 다르지만 비슷한 공간의 영역이 있겠지. 그래도 냄새는 약간 다를거라고 생각한다네. +# It was nice to meet you. + 만나서 반가웠네. +# Oh, you want to hear my story again? + 오, 내 이야기를 다시 한 번 듣고 싶나? +# Okay, sit tight. + 좋아, 제대로 앉아. + end scene + + scene gray +# Hello there. I'm the ruler of this part of space. + 오, 안녕하신가. 난 이 공간의 통치자이네. +# What's that? You want to know why I'm here? Are you sure? It'll take me quite a few words to explain why! + 뭐? 내가 왜 이곳에 있는지 알고 싶다고? 진심인가? 설명하려면 매우 많은 단어들이 필요할 거야! +# Well, if you insist. Though you might be better off just walking off to that hotel in the distance. Don't know why they went through with the construction of it. If I had any money to be taxed, I'd surely be complaining! + + LOOP +# Well, even though I'm the ruler of this part of space, I am not really ruling over anyone. + 흠, 내가 이 공간의 통치자긴 하지만 다른 이들에게 그렇게 간섭을 한 적은 없네만. +# Those friends of mine - they're all rulers of their own parts of space. Ruling no one really, either - we're all alone in that respect. But we're not alone in that we talk to each other, and in other ways we are not alone, too. This is just one place in which I exist. + 내 친구들 - 그러니까 다 각자 구역을 갖고 있는 친구들도 그렇게 참견은 하지 않아. 그렇게 보자면 우리를 각자 하나의 객체라고 봐도 무방하네만, 우리가 서로 대화 하는 방식이나, 그 외 여러가지를 보자면 하나가 아니기도 하지. 이곳은 단지 내가 있는 장소들 중 하나에 불과하다네. +# My friends and I - our parts of space have a lot of commonality to them in why they exist and how they're organized. Similar interests and desires, and the like. We like to talk a lot about how to rule, and so forth. + 내 친구들과 나 - 그러니까 우리 공간들은 왜 존재하고 어떻게 조직되어있는가에 대한 지대한 공통점이 있다네. 유사한 취향과 욕구, 그리고 취미들같은 것 말일세. 우리는 우리의 지배방식과 같은 여타의 안건에 대해 심도있는 토의를 하는것을 즐겨하지. +# But the tragic thing is that we rarely, if ever, get to meet eachother in the physical form. + 하지만 슬픈 사실은 우리가 물리적 형태를 취한 상태로는 거의 만나지 못한다는 점일세. +# So you're not actually talking to their physical forms, but a representation of them in some holographic form. + 그렇지. 자네는 그들의 물리적 신체와 대화 한 것이 아닐세. 그건 그저 어떤 홀로그래픽으로 구현된 대체제였을 뿐이지. +# I know, it's unfortunate. It's unfortunate because we share so much in common, but we can only help eachother as friends so much. + 이것이 어떤 하나의 불행이라는 것은 나도 잘 알고 있네. 우리가 이렇게 많은 공통점을 가지고 많은것을 공유함에도 불구하고 각자를 하나의 친구로써만 도울 수 있다는 점은 그야말로 큰 불행 아닌가. +# There's just a small thing lacking when you can't have a one-on-one physical conversation all the time. + 물리적인 일 대 일 대화를 못하는 것에서 촉발되는 소소한 단점들이지. +# But I'm not complaining. It's better than nothing at all! I can't imagine what it would be like otherwise. Something terrible. + 하지만 나는 불만없네. 아무도 없는 것 보다는 낫지 않은가! 만약 그랬다면 어땠을까 하는 상상은 할 수 조차 없다네. 아마도 끔찍하겠지. +# It was nice talking at you, good luck with whatever you're up to. + 대화 즐거웠네. 자네가 하는 일, 모두 잘 풀리길 바라겠네. +# You're still here? I can tell you everything again, if you'd like. + 계속 여기 있겠나? 했던 말을 몇 번이고 계속해줄 수 있네, 만약 자네가 마음에 든다면 말이지. + end scene + end area +end npc + +npc forest_npc + area FOREST + scene bunny +# Crickson: Hey ya big bully! I’m not afraid of you! +크릭슨: 야! 크기만 한 깡패 녀석! 너따위 두렵지 않아! +# Crickson: Ya big lunkhead! I won’t run away! Not even if you try to slug me a good one! +크릭슨: 야! 크기만 한 바보 녀석! 난 도망치지 않아! 네가 날 한 대 치더라도 절대 도망가지 않아! +# Crickson: Yer just a big dumb broomy pants, that’s what you are! You oughtta be ashamed of yourself! +크릭슨: 야! 크기만 한 멍청한 녀석! 그래 이 멍청한 녀석아! 부끄러운줄 알라고! + end scene + + scene thorax +# Thorax: I am the thorax, I speak for the bees.\n^Their fate is uncertain, it’s not the bee’s knees!\n^Some colonies’ workers have all took to flight!\n^These colonies die then, it’s no pretty sight! +토렉스: 나는 토렉스야, 꿀벌의 대변자야.\n^꿀벌들의 운명은 불확실하지, 이건 좋은 일이 아니라고!\n^어떤 곳에 있는 식민지의 노동자들은 투쟁을 했데!\n^결국 그 식민지는 멸망했다고 하고, 투쟁후의 그곳의 모습은 더 좋은 관경을 찾기 힘들정도로 멋질거야! +# Thorax: Perhaps it’s a virus or new pesticide,\n^perhaps it’s the larva of foul phorid flies!\n^That’s making these honeybees all act so strange.\n^Whatever it is, it must certainly change! +토렉스: 아마 이건 바이러스이거나 새로운 농약이야,\n^아니면 파리 애벌래의 짓인가!\n^모든 것들이 꿀벌을 이상하게 만들고 있어.\n^그게 뭐든간에, 반드시 바꿔야만 해! +# Thorax: Okay, so I don’t really know what’s the matter\n^I worry my efforts are nothing but chatter.\n^But how can I sit and do nothing to help?\n^So I’ll post it to Facebook and Twitter and Yelp! +토렉스: 좋아, 그래서 난 뭐가 더 좋은지 알고 싶지 않아\n^내가 노력했던 게 헛수고로 돌아가는 게 싫거든.\n^하지만 어떻게 앉아서 가만히 보고만 있겠어?\n^그러니 난 페이스북이랑 트위터에 포스트하고 외칠거야! + end scene + end area +end npc + +npc shopkeeper + area FIELDS + scene init +# Buy my stuff +쇼핑은 이곳에서~ + end scene + end area +end npc + +npc goldman + area FIELDS + scene outside +TOP +# What are you doing here, punk? Get lost! I caught it fair and square! +여기서 뭐 하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고! +# I won’t let it go! Not in a million years! +절대 놓치지 않을거야! 만 년이 지나더라도! + end scene + + scene inside +# Oh, did you come here to terrorize me some more? +오, 날 또 공포에 떨게 만드려고 오셨나? +# You’re just siding with the cats because they are cute and furry. +넌 그 고양이들 편이지. 왜냐하면 고양이들은 귀엽고 털로 덮혔으니까. + end scene + + scene etc +TOP +# What are you doing here, punk? Get lost! I caught it fair and square!^ Wauugh!^ Is that--?^ ANOTHER CAT???^ WAUUGHHH!!! +여기서 뭐하는 거야, 임마? 당장 나가! 내가 정정당당하게 잡았다고!^ 어라아!^ 이건--?^ 또 다른 고양이???^ 이러어어언!!! +# You... you cleaned up my house... I’m touched! Here, I want to give you my most beautiful possession! +너... 내 집을 청소했군... 감동했다! 여기, 내가 가지고 있던 것 중 가장 아름다운 녀석을 주지! +# Young opens and takes the box. Something is inside it! +영은 상자를 열어보았다. 무언가 안에 들어 있다! +# Icky: Oh. Hey Miao.^\n\nMiao: I’m so glad you’re safe!^\n\nIcky: Uh... thanks for the hand, Young. +이키: 오. 안녕 미아오.^\n\n미아오: 너가 안전한 걸 보니 너무 기뻐!^\n\n이키: 음... 도와줘서 고마워, 영. +LOOP +# Icky: To be honest, I kind of like sitting in boxes. +이키: 솔직히 말해서, 난 상자위에 앉아 있는 걸 좋아해. + end scene + end area +end npc + +npc miao + area FIELDS + + scene init +# Oh!! You are Young, The Chosen One!!! Omigosh, what an honor! My name is Miao Xiao Tuan Er, Chosen One-in-training! +오!! 당신이 선택받은 사람이라고 하던 영이군요!!! 이런 맙소사, 만나서 영광입니다! 제 이름은 미아오 샤오 투안 어, 선택된 훈련자죠! +# Could I follow you around for a bit to watch a Chosen One in action? +제가 조금만 당신은 따라다니면서 선택받은 사람의 기술을 볼 수 있을까요? +LOOP +# Hello again, Young! Can I shadow you today? +다시 만나서 반가워요, 영! 오늘 당신을 따라다녀도 될까요? + end scene + + scene randoms +# 0. after talk to shopkeep +# Miao: Hey, Young... have you ever stolen anything? +미아오: 저기요, 영... 당신은 태어나서 한 번도 도둑질을 해본 적이 없나요? +# 1. AFter talk to mitra +# Miao: I like Mitra... and isn’t Wares a handsome bike? +미아오: 난 미트라가 마음에 드는데요... 잘생긴 자전거 상품 말고요. +# 2. Nexus pad +# Miao: What’s that cool stone thing, Young? Does it make you go back in time?! +미아오: 저 돌은 뭐죠, 영? 이 돌이 시간을 거슬러 갈 수 있게 해주는 건가요?! +# 3. Random if Icky not saved +# Miao: I’m starting to get worried about Icky... Young, have you seen a bigger cat around recently? Icky last said he was going to walk around the small forest to the east. +미아오: 좀 이키에 대한 걱정이 드네요... 영, 최근에 커다란 고양이를 본 적이 있어요? 저번에 이키가 저한테 동쪽에 있는 작은 숲으로 산책하러 간다고 말했거든요. +# 4. leave map +# Miao: Icky said I shouldn’t go where it's unsafe. I’ll see you later, Young. +미아오: 이키가 위험한 데는 가지 말라고 했어요. 나중에 봐요, 영. +# 5, 6, 7 - only after you've seen 0, 1, 2 +# Miao: Have you ever sat in a bunch of grocery bags? +미아오: 지금 쇼핑백 더미위에 앉아있는 거에요? +# Miao: Hey Young, do you think it’s wrong to do catnip? +미아오: 이봐요 영, 이게 고양이가 좋아할 캣닙이 맞을까요? +# Miao: I bet it must have taken a lot of work to become The Chosen One, huh, Young? +미아오: 선택받은 사람이 되기 위해서 많은 일을 해야 할거야, 어, 영? + end scene +# musing after you save icky + scene philosophy +# That scary situation with Icky got me thinking... What do you think happens after we die? How could any of us fulfill our full purpose in the span of one life? +이키가 나를 생각했다는 건 매우 무서운 상황이에요... 우리가 죽은 후 무슨 일이 일어날 거라고 생각해요? 어떻게 단 한 번뿐인 삶에서 모든 목적을 달성할 수 있을까요? +# Maybe we are reincarnated again and again until we fulfill our destiny. Or would that make things too easy? +어쩌면 우린 운명을 다할 때까지 계속 다시 태어나지 않을까요? 그러면 너무 쉬운걸까요? +# And then what is our reward for completing our journey? Do we just fade away? +그리고 그 여정의 끝에는 무엇이 있는 걸까요? 단지 시간에 휩쓸려서 사라지는 것 뿐일까요? +LOOP +# Hmm... +흠... + end scene +# icky talking after yoh save icky + scene icky +# Oh. Hi, Young. +오, 안녕, 영. +# My name’s not really Icky. It’s Ichabod. +사실 내 이름은 이키가 아니야. 그건 남자 이름이지. +# I hope Miao Xiao Tuan Er hasn’t been too much trouble. +미아오 샤오 투안 어가 문제를 일으키진 않아? +# See you later, Young. +다음에 봐, 영. + end scene + end area +end npc + +npc generic_npc + + area DEBUG + scene melos +# Oh howdy, how is it going? You found me! I'm going to stay here, though. It's cold outside. +이런, 들켜버렸네, 안녕! 난 여기 남아있을래. 밖은 너무 추워. +# You can blame me for all of those awful rooms! I made them with the DAME map editor. +끔찍한 방들은 마음껏 나를 욕해! 그 방들은 내가 DAME map editor로 만든 거야. +# I made this game with FlashDevelop IDE and the Flixel AS3 framework! +난 이 게임을 FlashDevelop IDE 와 Flixel AS3 framework로 만들었어! +# Oh yeah, and I made the music using the REAPER DAW. And sometimes Audacity. +오 예, 그리고 음악은 REAPER DAW로 만들었어. 가끔은 Audacity도 쓰면서 말이야. +# I actually get my nutrition from the radiation from all of these computers... ^what do you mean that's not biologically accurate? +사실 모든 컴퓨터들이 내 몸에 방사능을 뿌려서 영향을... ^생물학적으로 정확하지 않다는 건 무슨 소리야? +# Hi mom! ^And dad! +안녕 엄마! ^그리고 아빠도! +# Want to know how to finish the game in 20 minutes? +이 게임을 20분안에 클리어 하는 법을 알아? +# Ha! Like I'd tell you! +하! 안 알려 줄건데-에! +# (...maybe if you ask me nicely...) + (...정중하게 물어보면 알려줄지도...) + end scene + scene marina +# Woah hey! +우후, 이봐! +# I wrote a ton of dialogue for this game!^ (...but not this dialogue. Melos is doing this.) +내가 이 게임의 대사를 대부분 썼어!^ (...이 대사는 숀이 쓰고 있지만.) +# I used Adobe Photoshop CS5 , Graphics Gale Free Edition and Windows 7 Snipping Tool to do the art! +난 Adobe Photoshop CS5, Graphics Gale Free Edition, 그리고 Windows 7 캡쳐 도구를 이용해서 그림을 그려! + end scene + end area +# both redsea done in Redsea_NPC.as + area REDSEA + scene first +# The humidity here is good for your skin, but bad for your hair. +여긴 수분이 많아서 피부에 좋지만, 머리카락에 안 좋네. +# I like standing here. These days, people spend the whole summer rushing back and forth between sweltering heat and freezing cold AC. Those quick temperature changes weaken your bones. +난 여기 서있는 걸 좋아해. 요즘, 사람들은 여름에 밖에 나갔다가 에어컨 바람을 쬐러 안으로 왔다갔다 한다고. 급격한 온도 변화는 뼈에 좋지 않아. +# It’s like that rotten habit of chewing your ice cubes. My mother chewed her ice cubes into her late 20s. Now she’s got hairline cracks all over her molars. +얼음 조각을 씹는 나쁜 버릇처럼. 우리 엄마는 20대 후반에 얼음 조각을 씹어먹었지. 지금 우리 엄마는 어금니에 금이 가있어. + end scene + + scene second +# Make sure you change out of those shoes and stuff them with newspapers to dry them out. Wouldn’t want to create a breeding ground for bacteria. +신발을 벋으면 제대로 신문지에 넣어 말려줘. 눅눅한 상태로 두면 박태리아가 번식해 버린다고. +# Why do buffets only ever have RED jello cubes? It’s like they want us to get cancer. +왜 뷔페에서 마음대로 가져갈 수 있는건 빨간 젤리 큐브지? 이건 손님을 암에 걸리게 하고 싶다는 것 같아. + end scene + + scene bomb +# Get away from me. +내게서 떨어져. +# I’m serious... leave me alone now. +심각하다고... 지금은 날 내버려둬. + end scene + + end area + area BLUE + scene one +# I don’t need your pity, Young. +네 동정따윈 필요없어, 영. +# Right, just go on living in your happy little world, "Chosen One"... +좋아, \"관측자\"의 행복한 세상속에서 살아가라고... +# You know, Young, friendship is just a trick people play on themselves. We’re all assholes, and in the end, we’re all alone. +이봐, 영. 우정 따윈 서로 속이면서 성립되는 거라고. 우린 전부 병신들이고,\n마지막 순간에는 항상 홀로있지. +# Hah, I knew you hated me, Young. +영, 네가 날 싫어하고 있다는 걸 모를 것 같아? +# I’m doing fine. +난 잘하고 있다고. +# Of course you don’t care, no one does. +물론 넌 신경쓰고 있지 않겠지만, 아무도 신경 쓰지 않지. + end scene + end area + + area HOTEL + scene one +# I know cities can be dirty and crowded and everything, but I like to come out here and look out over all the lights. +거리는 지저분하고 주변은 사람들로 가득하지. 알고 있는데도 가끔은 이곳의 불빛을 보는 걸 좋아해. +# It's beautiful in its own way. It’s not nearly as infinite as the stars, but there is something about its humanness that adds a layer of wonderful complexity. +도시는 도시만의 아름다움이 있는 걸까? 별의 반짝임처럼 영원하진 않지만 인간성이라는 게 아름다움에 깊이를 더하는 것 같아. +# Behind every light is a person with hopes and fears and secrets... looking out is both terrifyingly lonely and fiercely personal. +각각의 불빛들 옆에 기대와 우려, 비밀 같은 걸 안고 있는 사람들이 있어. 그래서 도시의 불빛은 무서운 정도로 고독하지만 사람 다운게 있어. +# I think I love every person behind every window. I love you, people, for being my stars. I love you no matter how fucked up your life is or how far you think you’ve fallen. You are lovely for tonight... +난 창문 뒤에 있는 모든 사람을 사랑하는 것 같아. 모두! 내 별이 돼줘서 사랑해요! 인생이 좇같아지고 바닥까지 떨어졌다고 해도 난 너를 사랑할 거야. 오늘밤은 빛으로 가득 찼어... +# I’m sorry, I’m babbling. Thanks for listening. +미안해. 좀 떠들었지? 들어줘서 고마워. + end scene + end area + + area REDCAVE + scene easter_egg +# Heeyyyy, mannn...take a load off, stay a whilleee, eh? +이봐아아아, 천천히 가라고! 응? + end scene + end area + + area APARTMENT + scene easter_egg +# Ah! You found me! +아! 들켜버렸네! + end scene + end area + +# quest_normal and quest_event are the dialogue quest (pseudo-trading) people. +# quest_normal is what htey say normally, quest_event is what they say when it's their turn for a clue. + area CLIFF + + scene quest_normal +# Golem: Did you get hit by a boulder on your way up? Sometimes I throw boulders when I’m angry. I’m sorry if I hit you. +골렘: 오면서 큰 바위가 떨어지지 않았어? 내가 가끔 화나면 바위를 집어던지거든. 혹시 맞았으면 미안해. +# Golem: My mother always said that if I kept doing it, I’d run out of mountain to throw. Back before she was fracked. +골렘: 엄만 항상 내게 \"그렇게 계속 바위를 던진다면 널 산에서 던져버리겠어!\"라고 했지. 정말로 그랬을까? + end scene + + scene second +# Golem: When you’re a rock, you see many generations of people come and go. You become ancient and wiser than the wisest among men. +골렘: 네가 바위가 된다면, 바위는 수명이 길어서 정말로 오랫동안 수많은 세대의 사람들이 오고 가는 걸 볼 수 있어. 그렇게 나이를 계속 먹다 보면 그 누구보다 현명해지지. +# Golem: At least, that’s the idea. I broke my binoculars a while back so I haven’t been able to tell what’s going on. +골렘: ...이라고 말하긴 하지만, 사실 오래전에 쌍안경 부숴버려서 무슨 일이 일어나고 있는지 잘 몰라. +# Golem: Actually, I don’t miss watching people much, it’s a bore. +골렘: 사실, 많은 사람을 보는 것은 지루해. + end scene + + scene quest_event +# Golem: Oh, yes, I met someone who was little lost...they told me they were going off to look around the beach. +골렘: 오, 맞아, 저번에 뭔가를 잃어버린 사람을 만난 적이 있어... 바닷가로 간다고 했던 것 같은데. + end scene + end area + + + area BEACH + scene quest_normal +# I’m not a lobster, I’m a langostino. The name’s Hews. +나는 랍스터가 아니야. 난 랜고스티노. 이름은 휴즈라고. +LOOP +# Hews: You know what the best part of the ocean is? Being able to see the horizon. +휴즈: 바다의 가장 중요한 것이 뭔지 알아? 수평선을 볼 수 있다는 거지. +# Hews: The ocean is like a salty taste of infinity. +휴즈: 바다는 짠맛이 끝없이 느껴지는 곳이야. +# Hews: A crowded beach is robbed of its grace. +휴즈: 붐비는 바닷가는 흐린 보석과도 같은 거야. + end scene + + scene second +# Hews: Have you heard of the mantis shrimp? It has 16 photoreceptors that allow it to perceive ultraviolet light. Can you imagine seeing a wider range of colors? +휴즈: 갯가재 소리를 들어본 적 있어? 갯가재는 자외선을 감지할 수 있도록 16개의 광수용체가 있다고 해. 무수히 많은 색이 떠오르지 않아? +# Hews: Maybe it would be beautiful. Then again, we’ve found plenty of ways to hate each other with just the colors we have. +휴즈: 분명 매우 아름답겠지. 하지만, 우린 단순히 서로가 가진 색으로 서로 놀리면서 차별하고 있어. + end scene + + scene quest_event +# Hews: You're looking for someone, huh? I remember I was sitting here when a few clouds passed by the sun. While the sun was occluded, someone walked up to me and asked where something was. I don't remember what it was, but the person ran off, saying they were heading to the forest. +휴즈: 누굴 찾고 있다고? 응? 예전에 약간의 구름이 태양을 지날 때 이곳에 앉아 있었던 기억이 나. 태양이 가려진 동안, 누군가 내게 걸어왔고 뭔가가 어디에 있느냐고 물어봤었어. 그게 뭔진 기억나지 않네. 하지만 그 사람이 숲으로 도망치고 있었던 건 확실히 기억나. + end scene + end area + + area FOREST + scene quest_normal +#npc james +# James: Berries are a good kind of food. I like berries. +제임스: 나무열매들은 좋은 과일이지. 난 나무열매들을 좋아해. +# James: Please make sure not to defecate on the berries. +제임스: 조심해, 소중한 열매들 위에 똥 누지 말라고. +# James: So far I have had sexual intercourse 18 times this season. Also, I have eaten 389 pawfuls of berries. +제임스: 올해엔 짝짓기를 18번 했어. 또, 389개의 나무열매들을 먹었고. +# James: Do you have any berries for James? +제임스: 혹시 이 제임스를 위한 열매가 있니? + end scene + + scene second +# James: I wrote a poem:\n^I like to eat berries\n^They make me merry\n^How much do I like berries?\n^I would have to say very! +제임스: 내가 시를 한편 써봤어. 들어봐:\n^나는 열매가 좋아\n^열매는 나에게 열정을 주지\n^: 얼마나 열렬히 좋아하냐고?\n^ 하루라도 안 먹으면 열받을 만큼! +# James: Do you like blueberries or raspberries more? +제임스: 넌 블루베리를 좋아하니? 아니면 산딸기를 좋아해? +# James: Do you have any berries for James? +제임스: 혹시 이 제임스를 위한 딸기가 있니? + end scene + + scene quest_event +# James: Someone came by. They did not want berries. Went to southeast part of lake to the west. +제임스: 누군가 왔다 갔는데 딸기를 원하지 않었어. 서쪽 호수의 남동쪽으로 가던데. + end scene + + end area +#npc rank +#npc olive + area FIELDS + scene easter_egg +# Olive: Hi, I'm Olive the rabbit. +올리브: 안녕, 난 토끼 올리브야. +# Olive: I have so much cereal left to eat! I love cereal. +올리브: 난 시리얼이 정말 많이 있어! 나는 시리얼을 사랑해! +# Olive: The box is so big. It never ends! +올리브: 시리얼 박스가 너무 커. 시리얼이 절대 떨어지지 않을거야! +# Olive: Neverending cereal! +올리브: 끝없는 시리얼이지! +# Olive: Hmmm...maybe that's not such a bad thing. +올리브: 흐으으음...그렇게 나쁜 일이 아니라고. + end scene + + scene bush +# Rank: Eheheh, silly Young! A broom’s no tool for cutting bushes! +랭크: 에헤헤, 멍청이 영! 빗자루는 관목을 자를 수 없다고! + end scene + scene quest_normal +# Rank: I cut down the bushes for a living. Sometimes when you cut the bushes you find gold! Eheheh! +랭크: 난 살아가기 위해서 관목을 잘라. 관목을 자르면 가끔 금을 발견할 수 있을거야! 으하하! +# Rank: The economy has been really struggling under this bush... +랭크: 부시 이후로 경제는 정말 어려움을 겪고 있어... +# Rank: Sometimes it’s tough to support the wife and kids on bush cutting--we don’t always have enough to eat... but we’ve always got a roaring fireplace! Eheheh! +랭크: 관목을 자른다고 해서 항상 아내와 아이들을 먹여 살릴 수 있는 건--아니야. 하지만 난로는 항상 따뜻하지! 으하하! + end scene + scene quest_event +# Rank: Eh? Yes! Someone came by here. Said they were going to an underground labyrinth...I bet they've got a lot of bushes there, eh Young? Eheheh! +랭크: 어? 맞아! 어떤 사람이 이곳에 들렀다가 갔었어. 아마 지하 미로에 간다고 말했던 것 같은데...거긴 계속 베어도 끝없을 만큼의 관목이 있는 걸까? 으하하! + end scene + + scene marvin +# Marvin: Oh hey, how are you feeling? +마빈: 오, 반가워! +# Marvin: Where is Justin? +마빈: 저스틴은 어디갔을까? +# Marvin: There's no bottle rockets around... +마빈: 주위에 로켓 병은 없는 것 같아... + end scene + + scene chikapu +# Chika Chi! +치카 치! +# Chika Chika!! +치카 치카! +# CHIIIII^\nKAAAA^\nPUUUUUUUUUU!!!! +치이이이^\n카아아아^\n푸우우우우우우!!!! + end scene + + scene hamster +# Bob: Bob the Hamster likes to refer to himself in the third person. +밥: 햄스터 밥은 자신을 3인칭으로 지칭하는 것을 좋아한다. +# Bob: Apostrophes are the root of all e'vil. +밥: +# Bob: quiet! I am busy exuding an aura of hamstery ambiance. +밥: 조용해! 난 햄스터틱한 분위기에 스며드느라 바쁘다고. +# Bob: ... I suppose you only get better by doing... But... if you do something wrong, are you just getting better at doing it wrong? +밥: ... 너가 뭔가를 해서 더 나아진다고 가정해보자고... 하지만... 만약 잘못된 일이라도 더 나아질 수 있다면 계속 할 거야? +# Need more fix(Korean) +# Bob: A real man never cries... well, maybe he lets a single tear slide back from the corner of his eye across his sun-hardened face as he rides his bad, bad, Harley across the wind-swept Mohave desert wearing no helmet or goggles. But he never cries. +밥: 진정한 남자는 절대 울지 않아... 뭐, 할리를 타고 모래사막을 가로지르는 사람이 헬멧도 고글도 없다면 햇볕에 탄 얼굴의 눈에서 한 방울의 눈물이 잠깐 뺨을 타고 흘러내릴 순 있지만. 그래도 남자는 울지 않아. +# Bob: This game was created by an infinite number of monkeys working on an infinite number of typewriters. +밥: 이 게임은 수많은 원숭이가 수많은 타자기를 이용해서 만들었어. +# Bob: I miss James... +밥: 제임스가 그리워... + end scene + + scene electric +# Kuribu: Curry is yellow and spicy! +쿠리부: 카레는 노랗고 매워! +# Kuribu: For the clever opponent, injure increase! +쿠리부: 동전을 넣어! +# Kuribu: You got the experience of 2! +쿠리부: 넌 2에서 경험을 얻었어! +# Kuribu: I tell you my phone number! 0*1-51*7-*4386 +쿠리부: 내 전화번호를 알려주지! 0*1-51*7-*4386 + end scene + + end area + + + area TRAIN + scene quest_normal +# What AM I doing here? Good question! I just stumbled upon here. I'm in hiding. It's safe here, if you don't venture too far out and let those guys get you. +내가 여기서 뭐하고 있었냐고? 좋은 질문이야! 난 우연히 이곳에 오게 됐고, 숨어있었지. 여기는 안전하고 그 이상한 거에 잡히고 싶지 않거든. +# It looks like I'm relatively fortunate. All these dead people strewn all over the place - how did they die? It's a little fascinating, to try and think of how it happened. Were they attacked by the monsters? Tripped and fell onto the spikes? +난 비교적 다행인 것 같네. 이곳은 사방에 죽은 사람들 천지야 - 그러고 보니 이 사람들은 어떻게 죽은 걸까? 조금 흥미로운데, 왜 이 일이 일어났는가 생각해보자고. 괴물의 공격을 받은 걸까? 함정에 걸려 못으로 가득한 곳에 떨어진 건가? +# It is a a bit grim. I hope it doesn't happen to me. Physical pain is a terrible prospect. +슬픈 일이야. 나한테 이런 일이 일어나지 않았으면 좋겠어. 육체적인 고통은 정말로 끔직할거야. + end scene + scene quest_event +# Oh...now that I think about it, a person walked by here a while ago. Said they were looking for something...even looked a bit like you! I don't remember when, sorry. It's hard to tell the time in here. But they said they were going to head off to a nearby town. +오...지금은 그것에 대해서 생각하자고, 한 사람이 얼마 전에 이곳에 왔다 갔지. 그들이 뭔가를 찾고 있다고 했는데...그리고 조금 너랑 닮을 것 같네! 언제인진 기억나지 않아, 미안. 시간도 잘 기억나지 않네. 하지만 주변에 있는 마을이랑 떨어진 곳에 간다고 했던 것 같아. + end scene + end area + + area SUBURB + scene quest_normal +# Hello. +안녕. +# Are you looking for something? +무언가 찾고 있는 건가? +# What are you looking at? +무엇을 보고 있는거지? +# No, I'm not a citizen of this town. What's weird is you can see and talk to me, but I can't interact with any of them. There are all of these killers running around, and no one seems to notice. It is strange. +아니, 난 이 도시의 시민이 아니야. 그러니 마을에서 이상한 걸 보면 나랑 이야기 할 수 있을거야, 하지만 난 마을 사람들과는 대화할 수 없어. 하지만 주변에는 살인자가 돌아다니고, 마을 사람들은 아무도 그 사실을 몰라. 뭔가 이상하지 않아? + end scene + scene quest_event +# Yes. I observed a person walk by. They were looking for something. I don't know where their 'something' could be. The person went off in a hurry. Said they needed to head to an alternate area of space. Sounds fancy. +응. 지나간 사람이 있었어. 뭔가를 찾고 있다고 말한 것 같은데, 그 '뭔가'가 어디에 있는 지는 모르겠네. 그 사람은 서둘러 가더라. 다른 공간에 간다는 말은 한 것 같은데, 무슨 말인지 몰라도 뭔가 멋진데. + end scene + end area + + area SPACE + scene quest_normal +# WHOA WHOA WHOA - - - WHO ARE YOU ? ? ? +너어 너어 너어 - - - 너는 누구야 ? ? ? +# I AM A DRIFTER . . . THIS IS ONE OF THE MORE POPULAR PIT STOPS ALONG THE JOURNEY FROM A TO B . +나는 평범한 나그네 . . . 이곳은 A에서 B로 가는 꽤 인기있는 휴식 장소야. +# WHAT IS 'A' ? ? ? IT'S MY HOME TOWN . . . I AM VISITING AN OLD FRIEND IN B . . . IT IS A LONG JOURNEY . . . BUT I MAKE SACRIFICES . . . DON'T YOU ? ? ? MAKES LIFE MORE EXCITING ! ! ! +'A'가 뭐냐고 ? ? ? 내 고향이야 . . . 오랜 친구를 만나러 가는 길이야 . . . 오랜 여행이였지만 . . . 그건 약간의 희생이지 . . . 너도 그렇게 생각하지 ? ? ? 인생을 더 자극적이게 살아보자고 ! ! ! + end scene + scene quest_event +# OHH - - - LOOKING FOR ANOTHER HUMAN - - - I SEE . ^ LET ME ACCESS MY MEMORY . . . READ ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n A HA . . . \n THE PERSON HAD A FLASH OF INSIGHT AND SAID THEY WERE HEADING OFF TO A SHED IN SOME WELL-KEPT FIELD. \n NOW THAT I THINK ABOUT IT . . . YOU LOOK SIMILAR TO THEM ! ! ! ARE YOU SURE IT WASN'T YOU ? ? HUH ? MM ? +그런건가 - - - 다른 사람을 찾고 있는 건가 - - - 알겠어 . ^ 내 메모리에 액세스 할게 . . . 읽는중 ( 0X0C00400 , STDOUT , 100 ) ; \n . . . . . . \n . . . . . . \n 그 래 . . . \n 그 사람은 갑자기 번쩍 떠올린듯이 어딘가에 있는 오두막으로 간다고 했어. \n 그 사람은 . . . 넌 그사람과 매우 닮았어 ! ! ! 정말로 그 사람이 아닌거야 ? ? 응 ? 음음 ? + end scene + end area + + area GO + scene quest_normal +# You actually were...uh, ah. Well done. +너는 정말로... 음, 어. 좋다고. +LOOP +# The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다: \'빠르게, 다시 떠나야 하기 전에 (점점 밝아지고 있어, 항상 일어나는 일이지) - 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\" + end scene + scene quest_event +# The shiny rock reflects only a bit of the light from the room. There is writing etched into it: \"Quickly, before I have to leave again (It is getting very light in here, this always happens) - the northwest part of the blue forest - I saw another temple entrance just to the north, past those trees - if only I could switch things at will to get through there...maybe I'll do this the next time I revisit this world.\" +한 바위가 방의 불빛을 반사시키고 있다. 표면에 무언가 써져있다: \'빠르게, 다시 떠나야 하기 전에 (점점 밝아지고 있어, 항상 일어나는 일이지) - 푸른 숲의 북서쪽 부분 - 나는 나무들을 지나 북쪽에서, 처음보는 사원의 입구를 보게 되었다 - 버튼을 마음대로 누를 수 있다면 좋겠지만...아마도 난 다시 이 세계를 방문해서 그것을 할 것이다.\" + end scene + end area +end npc +npc geoms + area SPACE + scene gray1 +# HELLO. HAVE YOU MET cube YET? +안녕하신가. 큐브는 만나본건가? +# cube IS A VERY GOOD RULER OF THIS PORTION OF SPACE. US OTHER RULERS DO OUR BEST IN OUR SPACES AS WELL. +큐브는 주변 공간을 통치하는 매우 좋은 통치자이지. 나나 다른 통치자들도 자신의 구역에서 통치를 잘 하고 있지만. + end scene + + scene gray2 +# WHAT DO YOU THINK OF THIS CHUNK OF SPACE? IT IS A NICE WAYPOINT, NO? +이 공간에 대해서 어떻게 생각해? 여긴 멋진 중간 지점이야? 아니면 별로야? +# AN INTERSECTION OF WORLDS! +세계의 교차로지! + end scene + scene gray3 +# NONE OF US GRAY PYRAMIDS ARE ACTUALLY HERE. WE USE SPECIAL DEVICES THAT LET US PROJECT OURSELVES HERE. +회색 피라미드는 사실 여기가 아니야. 특별한 시스템에서 홀로그램으로 비추고 있는 것이지. +# WHY DO WE DO THAT? BECAUSE WE WANT TO TALK TO OUR FRIEND cube AND KEEP cube COMPANY. +왜 그런일을 하냐고? 왜냐하면 우리의 친구 큐브와 대화하고 싶거든, 그리고 큐브의 회사를 유지하기 위해서지. + end scene + + + scene graydead +# *bzrrrrt* +*잠자는 소리* + end scene + + scene grayspin +# ...IS THE HOLOGRAM DEVICE WORKING CORRECTLY? +...홀로그램 장치는 제대로 작동중이야? +# NO?^...^DAMN! +아니야?^...^제기랄! + end scene + + + scene color1 +# Have you met CUBE? It does such cool things! I heard once it stood on an edge for nearly twelve seconds. Oh man! Do you know what that means for the League of Edge Standers? No? Well, a lot! +큐브를 만나봤어? 그는 정말 멋진 일을 하고 있지! 듣기로 그는 절벽 끝에서 십이 초 동안 서 있을 수 있다던데. 대단하지 않아? '절벽 끝에서 서 있는 자들의 리그' 회원이라면 그 대단함을 이해할 수 있을 거야! 뭐? 모른다고? 아무튼, 대단하다고! + end scene + + scene color2 +# CUBE does a lot of interesting work! +큐브는 재미있는 일을 많이 해! +# Did you hear? Apparently, it will be my turn to rule soon! In just a few minutes, I believe. +들려? 분명히, 곧 내가 통치하게 될 차례가 올 거야! 단 몇 분 정도, 그렇게 믿고 있어. + end scene + + scene color3 +# I'm from Sugar Loaf, in transit to Taipei. Why am I here? Oh, I stopped by to say hi to CUBE! +나는 타이베이에서 운송된, 설탕 덩어리에서 왔어. 내가 왜 여기에 있는 거지? 이런, 큐브에게 인사하려고 들린 거였지! +# Don't look so down! This place is just an odd representation so as to not shock all of the visitors. It's mostly harmless, as far as we can tell. +너무 우올해 하지 마! 이곳을 찾는 사람들이 놀라지 않게 하려고 이상한 모습을 하고 있는 거야. 아무런 피해 없다고. + end scene + + scene colordead +# (...is it taking a nap?) +(...낮잠 자고 있는 건가?) + end scene + end area +end npc + +npc redboss + area REDCAVE + scene before_fight +# EACH GENERATION IS BORN FROM PAIN TO DIE IN PAIN. WE WILL NOT SUFFER TO REPRODUCE THE CYCLE. WE WILL NOT GO OUTSIDE. +모든 세대는 고통 속에서 태어나 고통 속에서 죽는 것을 반복하지. 우린 밖에 나가지 않음으로써 고통받지 않고 살고 있어. + end scene + scene after_fight +# IS THIS YOUR PUNISHMENT FOR OUR REBELLION? +이것이 우리에게 반란을 일으킨 너의 형벌인가? + end scene + end area +end npc + +npc circus_folks + area CIRCUS + scene before_fight +# Why did you deprive the Seeing One of his sacrifices? Why did you steal from us our salvation? +당신은 왜 관측자의 희생을 빼앗아 간 거지? 당신은 왜 우리의 구원을 훔쳐간 거지? + end scene + scene after_fight +# ...We have failed to make you pay for your interference. And yet... you have given us back our chance to be free. Thank you, Young. May the Seeing One look upon you in favor once more. +...우린 너에게 합당한 보상을 주지 못한 것 같아. 너는 우리에게 자유를 돌려주었어. 정말 고마워. 영. 관측자가 너에게 한 번 더 호의를 베풀며 바라볼 거야. + end scene + end area +end npc + +npc wallboss + area CROWD + scene before_fight +# So good to see you, Yang. Been too long. Still playing those nintendos, I see? +다시 봐서 반갑다, 양. 오랜만이야. 아직도 닌텐도 가지고 노니? + end scene + scene after_fight +# Jesus, Yon, when are you just going to grow up? You know, you're going to have to learn to deal with people sooner or later. +맙소사, 연, 아직도 어린애니? 알겠지만, 어차피 결국 다른 사람과 사귀게 된다고. + end scene + end area +end npc + +npc eyeboss + area HOTEL + scene before_fight +# We have all the finest amenities here. How do you like the Pool? +저희 호텔은 뭐든지 최고의 시설을 갖추었습니다. 수영장은 어떠십니까? + end scene + scene middle_fight +# How about our state-of-the-art fitness center? +최첨단 피트니서 센터는 어떠십니까? + end scene + scene after_fight +# We hope you enjoyed your stay! +즐거운 시간 보내셨길 바랍니다. + end scene + end area +end npc + +npc suburb_walker + area SUBURB + scene words_adult +# Today is a nice day. +오늘은 매우 멋진 날이지. +# Thanks for scratching that itch on my neck - I can't seem to reach it. +목을 긁어줘서 고마워 - 거기에 손이 닿질 않았거든. +# I've heard the eggs at the local diner are quite good. I have a coupon for them, too. +로컬 디너에서 파는 계란이 맛있다고 들었어. 쿠폰도 가지고 있다고. +# Did you see the car accident today? So horrible! He was texting. Such a shame, so young! +오늘 자동차 사고를 본 적 있어? 정말 끔찍했지! 운전사가 문자를 쓰다가 순간 훅 갔어. 아직 젊은 남자였는데! +# My son did not make the junior varsity team. Such a disappointment. We invested so much in his sports career. +내 아들은 주니어 대표팀에 못 들어가서 실망했어. 그토록 스포츠에 투자를 많이 해줬는데... +# Thanksgiving is today. I am thankful for a lot of things. Can't wait for tomorrow's early morning sales. Gonna get a lot of bargains. +오늘은 추수감사절이라 여러 가지에 감사하고 있어. 내일 새벽에 있을 장사가 너무 기대돼! 화끈한 거래를 많이 하겠지? +# Ah, I think I might be late for work. +아, 아마 좀 늦을 것 같아. +# I am in a bit of a rush to get home, I need to tidy up before the in-laws come over. +빨리 집에 가야 해, 친척들이 오기 전에 청소를 마쳐야 하는데... +# We're having a garage sale! +차고에서 물건을 팔아-요! +# Welcome! +환영해! + end scene + + scene words_teen +# I didn't see the latest movie. +최신 영화를 안 봤어. + end scene + + scene words_kid +# I never gotta see the new cartoon! +더이상 만화를 볼 수 없어! + end scene + + scene family +# inside of a house, parent (insightful kid) - 73 +# Welcome to our house, stranger! You look familiar. This is a peaceful town. Pretty quiet, not many visitors. +저희 집에 오신 것을 환영합니다. 낮선이여! 어디선가 본적이 있는 것 같은데... 이 마을은 평화로운 마을입니다. 꽤 조용하고, 방문자가 많이 없거든요. +#inside of house, younger kid +# Do you like Davement? My brother Dave showed me this really cool song by them! +혹시 데이브먼트 좋아해요? 데이브 형이 저에게 끝내주는 이 노래를 저에게 알려줬어요! + end scene + + scene older_kid +# inside of a house, olderkid +# My friends like to listen to that 'None Surprises' song by 'Rayhead' and complain about this place. Sure, it's a bit of a bubble, but hell, at least show some gratitude! Or do something about it! They're all just...oh, sorry. I tend to do that sometimes.. +내 친구들은 'Rayhead'의 'None Surprises'라는 노래를 듣는 걸 좋아해. 이 마을을 불평하는 노래인데, 여기가 지옥이 아니라는 걸 감사해야 한다고! 스스로 바꾸려고 하지 않으면 ...아, 미안. 너무 떠들었네.. +# I guess I'll just go write in my blog. +난 그냥 블로그에 글이나 쓸래. +# You sure look like you're in a daze. +너 좀 피곤해 보이는데. +# I have trouble hearing my thoughts with sports and the like playing on the TV, but my parents like it. +난 TV랑 스포츠에 관련된 이야기를 잘 못하지만, 부모님이 좋아하셔... + end scene + +#inside of hanged man house 74 + scene hanged +# A note on the corpse: \"Placing myself in danger no more.\" +시체위에 있는 쪽지: \"이제 위험으로부터 해방이다\" + end scene + + scene festive +#Inside of another house, (festival people) - 75 +# Oh, is there something going on outside? A festival? A parade? +오, 누가 밖으로 나가나? 축제인가? 아니면 퍼레이드? +# There seems to be quite the commotion outside! Have you looked out the window recently? I wonder what it could be. +밖이 너무 조용한 것 같은데? 창밖을 봤어? 무슨 일인지 궁금한데... + end scene +#78 + scene paranoid +# My house has a lot of windows. I don't like windows. It's as if someone is always looking in. And you know there HAS to be something going on outside there. It can't just be that silent all the time, so silent and calm - it's disturbing to me. +제 집은 창문이 많아요. 하지만 전 창문을 좋아하지 않죠. 계속 감시당하는 느낌이 들거든요. 근데 밖에서 무슨 일이 일어나고 있는 것 같은데, 항상 시끄러워서 저한테 방해가 됐었거든요. - 왜 이렇게 조용한거지? +# Murderers? What? Outside? What are you talking about? Are you kidding me? There haven't been any murders in this town before, but still...you're starting to worry me...maybe you should just leave. +살인자? 뭐라고? 밖에서? 대체 무슨 말을 하는 거죠? 장난치는 거예요? 이 마을에는 살인자가 나타난 적이 없어요, 하지만 당신이...계속 조심하라고 경고하니...당신은 당장 이 마을을 떠나야 될 것 같네요. +# Please get out. +죄송하지만 나가주세요. + end scene +# 76 + scene dead +# The body of this woman has been beaten to death by a blunt weapon. +둔기로 얻어맞은 것 같은 여자의 시체이다. +# The man, to put it bluntly, well... +남자의 시체이다. + end scene + + end area +end npc + +npc suburb_blocker + area SUBURB + scene one +# Oh, it's you! You look familiar...I can't move until you keep killing more of these townsfolk, remember? Come back in a bit. +오, 너구나! 왠지 익숙한 얼굴인데...난 너가 마을 사람들을 더 죽일 때까진 움직일 수 없어, 기억나지? 조금있다가 봐. +# According to this pamphlet...you only need to kill a few more people! Keep it up. +이 책자에 따르면... 넌 몇 명만 더 죽이면 돼! 계속 하라고. +# We only need one more body, and then we can keep going. +한 명만 더 죽이면 돼, 그러고 나면 계속 나아갈 수 있다고. +# Well done. Feel free to go inside. I have no idea what's there. I'll see you again, same time tomorrow, right? Or the night after? +잘 했어. 자유로움을 느끼며 안으로 들어가. 안에 무엇이 있는지 모르지만, 아무튼 다시 만나. 내일 같은 시간에 말이야. 알겠지? 아니면 그 다음날 저녁에 볼까? + end scene + end area +end npc +# dialogue for the cards +# don't enclose in quotes +npc card + area ETC + scene one +#0 sadbro +# I don't mind being watched by the trees. +나무한테 감시당한다고 해도 상관없어. +#1 Bat(?) - extra overworld area +# Where is she?! +그년 어딨어?! +#2 sunguy +# I will be with you Young, whenever you are alone. +너가 혼자일 때마다 내가 함께할 것이다, 영. +#3 Shieldy +# Are you an Ookchot? My mom always warned me about the Dangerous Ookchot. +너가 오크샤였어? 엄만 항상 오크샤가 위험하다고 경고했었어. +#4 slime +# Jello there, Young! So goo to flanly meet you! Why don't you set for a minute? I was just pudding on some tea! +반가워어, 영! 이렇게 만나서 반가워어! 왜 날 올리지 않는 거야? 난 그냥 차 위에 얹어서 먹는 푸딩이라고! +#5 post-statue area in BEDROOM +# Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Pew, Chancel, Pulpit, Altar, Stained Glass Windows... +퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 퓨, 성단소, 설교단, 제단, 스테인드글라스 창문... +#6 SUBURB inside of house past blocker +# Limited time offer! Buy one, get one free - only today! +한정 판매중! 오늘만 특별히 하나를 사면 - 하나가 공짜! +# 7 APT Boss +# Remember the time that you lit a candle when the power was out? +전기가 나갔을 때 촛불을 밝혔던 때가 기억나나요? +# 8 APT Silverfish +# Mmmm, your pillow was cozy last night. +으으으음, 어젯밤에 네 베개는 편안했어. +# 9 APT gasguy +# This'll teach 'em for calling me the fumi-GAY-tion guy. +날더러 게이새끼라고? 이걸로 맛 좀 보여주지 이새끼들. +# 10 FIELDS 1 (island) - mitra +# Wares and I make a good team. +상품과 나는 좋은 팀이야. +# 11 FIELDS 2 (alcove) - Miao +# I'm the Chosen One-in-training!!! +난 선택받은 사람 견습생이야!!! +#12 Base of WINDMILL windmill +# Do you ever feel like, no matter what you do, you can't stop the world from dying? +가끔, 자신이 무슨 짓을 했는데 세상이 죽어가는 것을 막을 수 없게 된 느낌을 알아? +#13 Hidden up a river in FOREST +# Beware the forest mushrooms... +숲의 버섯을 조심해... +#14 Bottom of ladder-mini-maze on CLIFF +# I am sorry. It is my nature. +정말 미안해. 본능적으로... +#15 Top of Cliff +# What do you mean, 'Only a rock'?? Rocks can be on cards too, you know! +'그냥 바위야'라니?? 바위도 카드가 될 수 있다고! +#16 Western end of BEACH past spikes +# Give a man a fish and he will eat for a day. Teach a man to fish, and he will have bonding times with his son, Jimmy. +한명의 남자에게 물고기 한 마리를 준다면 하루 만에 다 먹겠지. 하지만 물고기 잡는 법을 알려준다면 아들 지미와 부자 관계가 더욱 돈독해지겠지? +#17 At end of path through the woods in REDSEA +# Sometimes the answer is taking a walk. +때로는 걸으면서 대화하면 답이 생기기도 해. +#18 MOVER Redcave - Past 2 locks in central redcave +# Why do bats suddenly fly down, every time you're around? +박지는 왜 갑자기 날아올라서, 너의 주변을 돌아야 해? +#19 SLASHER Redcave - West end of Northern redcveave +# NO, *YOU* NEED BRACES! +꽃구경 이야기는 이제 그만해! +#20 REDBOSS Redcave - post boss +# ARE YOU HAPPY NOW? +행복해? +#21 NW corner of CELL - chaser +# Don't get violent around me. +내 주변엔 폭력이 없어. +#22 FIRE PILLAR circus - the field of fire pillars north of entrance +# I've always wanted to be on Iron Chef. +난 항상 철 요리사가 되고 싶었어. +#23 CONTORT circus - contort + firepillar room in SW chunk +# My mom always told me, 'If you do that arch long enough, your spine will stay that way!' +엄만 항상 내게 '허리를 계속 굽히고 있으면 그대로 허리가 굳어버린단다!'라고 말했었지. +#24 LION circus - end of northern gauntlet bordering boss room +# Are you amused yet, human? +아직 즐겁지 않은건가, 인간? +#25 A+J BOSS circus - basement (post boss) +... +#26 FROG crowd - North of entrance +# Scientifically speaking, toads are a subset of frogs. +과학적으로 말해서, 두꺼비는 개구리의 부분 집합이야. +#27 CROWD GUY crowd - 2nd floor +# HAHAHAHA! Yeah! I know! +하하하하! 그래! 알고 있어! +#28 WALL BOSS crowd - post boss +# Oh, you collect cards, too? Real classy, Ying. +오, 당신도 카드를 모으는 건가요? 정말 고급스러우시네요, 잉. +#29 end of grey end of space, for grey cube king +# They always said, \"Get off the computer! Or you'll never make friends!\" +그들은 항상 내게 \"컴퓨터 끄거라! 아니면 평생 친구를 사귀지 마렴!\"이라고 말했었지. +#30 end of colorful end of SPACE, for color cube king +# I'm only the ruler for the extent of a conversation. +지금 나는 오로지 대화의 범위안을 통치한다. +#31 DUSTER hotel - end of 4th floor moving platform area +# I'll bet you think you're 'making my job interesting'! +당신은 '내가 일을 즐겁게 하고 있다'라고 생각하는 것 같아요! +#32 DASH TRAP hotel - Dash trap room on 3rd floor +# I hate diagonals. +난 대각선이 싫어. +#33 BURST PLANT hotel - SE corner floor 2 +# Don't even try that claritin clear shit with me. +나의 꽃가루? 히스타민따위 듣지 않는다고. +#34 EYE BOSS hotel - post-boss +# Swipe this card to unlock the door to your room! +당신의 방문 잠금을 풀기 위해서 카드를 스와이프하세요! +#35 end of left-most TERMINAL bridge - sage +# I'm doing a great job. +나만 믿게나. +#36 Young (drawer APT) +.......?? +#37 old BDRM (dialogue rock) +# Who carved all of us anyways? +누가 우리를 조각한거지? +#38 hotel room +# I hope you enjoyed your stay. +즐겁게 머물다 가셨길 바랍니다. +#39 end of debug minidungeon (old player sprite) +# Seening as you've gotten to this point, you must be quite Intrasting. +이때까지 있었던 너의 행적을 봤어. 너 재미있는데, +#40 end of cell - Torch? +# I'm just here to lead you astray. +네가 길을 잃게 하도록 여기 있는 거야. +#41 end of SPACE - faces/entities +# You like like a pyramid to us, too! +우리에겐 너도 피라미드지만 말이야! +#42 end uf suburb (killer) +# It's the same damn play, night after night, and the pay sucks. +매일 밤마다 계속대는 지랄맞는 놀이, 월급도 개같지. +#43 GOldma's room - goldman +# Leave me alone! My last name isn't Sachs! +날 내버려둬! 내 성은 삭스가 아니란 말이야! +#44 blank, ISlands - Broom +# At least I'm not a stick. +적어도 나는 막대기 아니에요. +#45 fields, bottom right - (Rank) +# What do you mean money doesn't grow on trees? Eheheheh! +돈은 나무에서 나오지 오지 않는다니 무슨 소리야? 으하하! +#46 street, bottom (Follower bro) +# I'm nothing but an illusion. +나는 아무것도 아니다. 환각일 뿐이다. +#47 redsea, bottom eft (Bomb npc) +# I'LL TAKE IT OUT ON YOU. +그냥 화풀이 하는 거야. + end scene + end area +end npc + +npc misc + area any + + scene controls +# Press +- +# [SOMEKEY-LEFT] +# to set controls. +을(를) 눌러 조작설정 +# [SOMEKEY-ENTER] +# to cancel. +을(를) 눌러 취소 +# Up +상 +# Down +하 +#5 +# Left +좌 +# Right +우 +# Jump +점프 +# Attack +공격 +# Menu +메뉴 +#10 +# Press +버튼 +# [SOMEKEY-ENTER] +# to exit +을(를) 눌러 나가기 +# [SOMEKEY-LEFT] +# to set controls. +을(를) 눌러 조작설정 + end scene + + scene title +#Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress +방향키를 움직여\n화면에 검은 부분이\n안 보이도록\n맞춰 주세요.\n\n +# [SOMEKEY-C] +#when done. +을(를) 눌러 진행합니다. +ANODYNE +Melos Han-Tani\nMarina Kittaka +# any key +아무버튼이나 누르세요 +#5 +#Press +버튼 +# [SOMEKEY-C] +#to start +으(로) 시작합니다 +#Version +버전 +#Continue +계속하기 +#New Game +새로시작 +#10 +#Are you sure?\nNo\nYes +계속하시겠습니까?\n아니오\n네 +#Really?\nNah\nYeah +정말로요?\n아니\n그래 +#No going back!\nForget it\nI know +다신 되돌릴 수 없습니다!\n지워버려!\n알겠어 +# deaths +죽은횟수 +# cards +카드 +#15 +# Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n +Anodyne은(는) 대부분의 컨트롤러를\n지원합니다.\n\n지금 연결된 컨트롤러를 사용하시겠습니까?\n\n네 아니오\n\n만약 사용하신다면.\n\n방향키로 조작이 가능하고\n\nC, SPACE, 또는 ENTER\n로 선택이 가능합니다.\n\n예로 기본설정\n +# NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE\n\nGUI displaying wrong?\nPress button below\nthen reorient device. +안내문\n\n만약 연결된 장치가 있으시면\n게임플레이중 지연이 있을 수 있습니다,\n게임을 종료한 후\nAnodyne을(를) 재실행\n해주세요.\n\nC로 계속 진행\n\nGUI가 올바르지 않게 표시됩니까?\n아래 버튼을 누르면\n장치의 방향을 변경합니다. +# Press BACK again\nto exit.\nUnsaved progress\nwill be lost. +BACK을(를) 다시 눌러\n게임을 종료해주세요.\n저장되지 않은 진행은\n잃게됩니다. + end scene + + scene gui +# Note - this below one is a sprite that fits into the gui +menu=enter +# Shows up when you save at a checkpoint +# Saving... +저장중... + end scene + + scene map +# Map +지도 +# Current Room +현재 위치 +# Door/Exit +문/출구 +# No Map +지도 없음 +# Return to\nNexus +연결체로\n돌아가기 +# Return to\nentrance +입구로\n돌아가기 + end scene + + scene items +# Items +아이템 +# Normal +평범한 빗자루 +# Swap +변동기 +# Extend +확대기 +# Widen +확장기 +#5 +# A pair of spring-loaded shoes - press +스프링이 장착된 신발 한 켤레 - +# [SOMEKEY-X] +# to jump! +을(를) 눌러 점프하세요! +# A pair of shoes for biking. +자전거용 시발 한 켤레. +# An empty cardboard box. +비어있는 골판지 상자. +# A key found in the Temple of the Seeing One. +사원에서 발견한 열쇠. +#10 +# A key found in a red, underground cave. +붉은곳의 지하 동굴에서 발견한 열쇠. +# A key found in a mountain cave. +산의 동굴에서 발견한 열쇠. + end scene + + scene cards +# Cards +카드 +# cards +카드 + end scene + + scene save +# Save +저장 +# Saved! +저장됨! +# ERROR +오류 +# Save and go\nto title +저장후 타이틀로\n +# Go to title +타이틀로 +#5 +# Save and quit +저장하고 종료 +# Quit game +게임 종료 +# Deaths: +죽은 횟수: + end scene + + scene config +# Config +설정 +# Set keybinds +조작 설정 +# Set volume +불륨 설정 +# Autosave at\ncheckpoints: +체크 포인트에서\n자동 저장: +# On +켜기 +# 5 +# Off +끄기 +# Change\nResolution: +보기\n설정: +# Config UI +UI 설정 +# Touch+D-Pad +화면터치+D-Pad +# D-Pad Only +D-Pad 만 +# 10 +# Touch Only +화면 터치만 +# Move Input: +조작 설정: +# Resolution: +해상도: +# Windowed +창모드 +# Int. Scaled +전체화면 +# 15 +# Stretch +늘리기 +# Scaling: +크기: +# Language: +언어: +# ja +일본어 +# en +영어 +# 20 +# Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n +만족하실\n때까지\n버튼으로\n조작해주세요.\n\n그다음,\n메뉴를 탭하여\n계속 진행하세요.\n\n +# Resize Window +원도우크기 재설정 +# Config Joypad +조이패드 설정 + end scene + + scene secrets +# You\'re rolling in it! +너 엄청 부자구나! +# Once the property of a famous Bubble Mage. +한때 유명한 거품 마법사의 소유물이었지. +# If your graphics become scrambled, look at the pokedex entry of an official Pokemon. +만약 그래픽이 깨지면, 공식 포켓몬의 포켓몬 도감에서 확인해. +# This heart has no name. +이 심장은 이름이 없어. +# Please visit the electric monsters\' world. +부디 전기 몬스터 세상에도 방문해줘. +#5 +# A kitty statue. Cute, but useless. +키티 동상. 귀엽지만 쓸모 없다. +# Oh my!!!! +오오! 들켜버렸다!!! +# Oh no!!!! +이런! 들켜버렸다!!! +# It\'s black. +검은색이군. +# It\'s red. +빨간색이군. +#10 +# It\'s green. +초록색이군. +# It\'s blue. +파란색이군. +# It\'s white. +하얀색이군. +#SOMEKEY-C +# :Select +:선택 +#SOMEKEY-X +# :Back +:뒤로 + end scene + + scene swap +# Sorry! +미안해! +# The swap won't work here. +여긴 변동기를 사용할 수 없다. +# Young could not muster the strength to use the swap here. +여기서 변동기를 사용하기엔 힘이 부족하다. + end scene + + scene keyblock +# This door is locked. +이 문은 잠겨있어. + end scene + + scene treasure +# Some strange force stops this treasure box from being opened. +이상한 힘이 보물 상자가 열리는 것을 막고 있다. +#An engraving on the broom handle reads: Press +빗자루의 손잡이에 문자가 새겨져 있다: +#SOMEKEY-C +# to sweep. +을(를) 누르세요. +# This key may be used a single time to open up a locked barrier. +이 열쇠는 아마도 한 번정도 장벽을 여는 데 사용할 수 있을 것 같아. +# A mysterious pair of boots has nothing but the branding on it, which says \"Press +수수께끼의 신발. 브랜드 이름이 쓰여있다: +#SOMEKEY-X +#5 +# \". +을(를) 눌러 강한 점프\". +# A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\" +빗자루에 무언가 써져 있다:\"메뉴에서 확장기를 장비하시면 빗자루의 나쁜 먼지가 좌우로 약간씩 증가합니다.\" +# A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\" +빗자루에 무언가 써져 있다:\"메뉴에서 확대기을 장비하시면 빗자루의 나쁜 먼지의 범위가 증가합니다.\" +# A note next to the broom extension: \"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\" +빗자루에 무언가 써져 있는 문장의 다음 부분: \"안녕하세요, 영. 변동기를 사용하면 타일 두 개의 위치를 바꿀 수 있습니다. 어디에서나 사용하려면 아직 시간이 필요하지만, 당분간은 변동기를 유용하게 쓸 수 있을겁니다.\" +# YOU FOUND A HEART!!! Maximum Health increased by...zero. +하트를 발견했다!!! 최대 체력이 0증가했다! ...? +#10 +# Goldman: What? It's not there? That shopkeeper must have stolen it! +골드만: 뭐? 거기 없다고? 분명히 그 가게 주인이 훔쳤다고! + end scene + + scene dust +# Your broom is now full of dust! Attack again to place it. +이제 빗자루가 먼지로 뒤덮혔습니다! 먼지를 바닥에 두려면 다시 공격하세요. + end scene + + scene checkpoint +# Save game?\n Yes\n No +저장하시겠습니까?\n 네\n 아니오 +# While standing on a checkpoint, press +체크포인트 위에 서 있을 때, +#SOMEKEY-C +# to save your progress and set it as your respawn point if you die. +을(를) 눌러 진행을 저장하고, 동시에 그곳이 부활 장소로 설정됩니다. + end scene + + scene rock +# There is writing scrawled on this rock: +낙서가 적혀있는 돌: +# YA AINT GOT NO FRIENDS + end scene + + scene door +# The portal does not appear to be active. +차원문이 작동하지 않을 것 같다. + end scene + + scene keyblockgate +# The gate stares, petrified. It won't open until it senses four cards... +관문을 겁에 질릴 정도로 빤히 쳐다봤지만 열리지 않았다, 네 장의 카드를 가지고 있기 전까지는 열리지 않을 것 같다... +# Sensing four cards, the gate decides to open. +관문이 네 장의 카드를 감지하고, 열리기 시작한다. +# The gate stubbornly remains in place. +관문은 고집스러울 만큼 그대로 있다. +# The gate senses all of the cards, and decides to open. +관문이 모든 카드를 감지하고, 열리기 시작한다. +# The gate senses enough cards, and decides to open. +관문이 충분한 카드를 감지하고, 열리기 시작한다. +#5 +# It opens! +열렸어! +# It remains closed. +닫혔군. + end scene + + scene solidsprite +# The sign points to the east but the words on it are faded. +표지판이 동쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다. +# The sign points to the west but the words on it are faded. +표지판이 서쪽을 가리킨다. 하지만 글자들이 바래서 내용을 알 수 없다. +# The words on the sign are faded. +글자들이 바래서 내용을 알 수 없다. + end scene + + scene mitra +# Hey, Young! +이봐, 영! +# Are those bike shoes for me? Wow! Thanks, Young! I\'ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press +선물로 주는 자전거 신발이라고? 와우! 고마워, 영! 어떻게 신발을 손에 넣을까 생각하고 있었는데, 상품한테 그 자전거 신발에 맞는 클립이 패달에 달려 있거든. 여기, 영. 그냥 받기는 뭐하니까 내 신발이랑 교환하자! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐! +#[SOMEKEY-X] +# to jump with them on! +을(를) 눌러 신발과 점프할 수 있어! +# Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip into Wares' pedals. Since I'll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press +안녕 영! 새로운 소식이라도 있어? ^... ^...오, 알았어, 내가 새로운 자전거 신발을 얻었다고, 나도 알아! 이 신발은 상품의 패달에 딱 들어맞지. 이제 더이상 예전에 쓰던 신발이 필요 없어, 그래서 네게 준거지, 영! 이 신발은 널 엄청 높게 띄어줄 쩌는 스프링이 달려 있어! 뛰어봐! +#[SOMEKEY-X] +# to jump with them on! +을(를) 눌러 신발과 점프할 수 있어! +#5 +# Alright, take care! +좋아, 조심해! +# Go on, try them out! ...They're not THAT smelly. +가라고, 놈들을 무찔러버려! ...하지만 냄새나는 놈들은 아니네. +# Cool, huh? +멋지군, 그렇지 않아? +# Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press +와우, 그 자전거 신발은 핀티씨네 가게에서 산거야? 혹시 그 신발을 내게 선물로 주지 않겠니? 고마워, 영, 정말로 고마워! 여기, 보답으로 내가 쓰던 신발을 줄게--정말로 고마워! 잘 쓸게! 아마 신발에 적혀 있을거야. 어디보자, \" +#somekey-x +# to jump\". I've never understood that, though, because there's no \" +을(를) 눌러서 파워 점프\". 의미를 모르겠네. 신발 어디에도 \" +#somekey-x +#10 +# \" anywhere on the shoes... +\"버튼 같은 건 보이지 않아! + end scene + + scene tradenpc +# Finty: Welcome, welcome, my friend Young! The name's Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye! +핀티: 반가워, 반가워, 내 호갱... 아니 친구 영! 내 이름은 프라산도프--핀티 프라산도프야! 혹시 마음에 드는 게 있어? 사양말고 마음껏 둘러보라고! +# Finty: I still appreciate that box! +핀티: 그 상자를 줘서 정말 고마워! +# Finty: Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! +핀티: 아, 상자! 정말 고마워! 이제 퇴근할 때 집으로 남은 재고들을 가져갔다가 아침에 다시 들고올 수 있겠다! +# Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead! +잠시만 기다려봐...어? 없잖아! 어디간거지? 음, 여기, 그 물건이 지금 안보여서 대신에 너의 상처라도 완화시켜줄게! +# As a token of my gratitude, take these stylish biking shoes! +감사의 표시로, 이 간지나는 자전거 신발을 가져가! +# 5 +# Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around. +좋은 아침이야. 안 그래, 친구? 장사하기 위한 좋은 아침이지! 이제 내 재고들 들고 다닐 수 있는 상자 하나만 있으면 좋을텐데... +# Too bad, looks like you can't afford this item! Come back later, when you have the cash! +저런, 넌 아직 이걸 살 형편이 안돼 보이네! 돈이 생겼을 때, 다시 오도록 해! +# Finty: Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99! +핀티: 오오, 무기를 보는 그 눈빛! 좋아! 넌 더 좋은 무기가 필요해, 내 말 맞지? 단돈 $499.99에 적들을 녹여버려! +# Finty: That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99! +핀티: 그 돈자루는 네가 대륙에서 발견하는 돈을 담아 자기한테 저금하는 걸 허락하겠다고 말하고 있어! 단돈 $869.99만 낸다면 바로 네 거라고! +# Finty: Oh ho ho, here's a specialty item indeed: clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99! +핀티: 오 호 호, 여기 특수 품목인 간지나고 초고속으로 달릴 수 있게 해주는 클릿이 달린 자전거 신발! 지금만 특별히 단돈 $299.99에 모십니다아-! +#10 +# Finty: Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99! +핀티: 그 빗자루 주변의 먼지때문에 피곤한가? 이 최첨단-진공-청소기와 함께라면 유해한 먼지들의 입자마저 근절시켜 버린다고! 단돈 $749.99에 모십니다~! 아니면 4개월 할부로 달마다 $199.99는 어때? +# As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ +감사의 표시로, 이 못생긴--아니 그러니까 아름다운 이걸 가져가! 바로 콜렉터즈 에디션 카드!^ + end scene + + #(Translate as much or as little as you see fit - note this is a little different than normal dialogue, so you'll have to keep at most 19 characters on each line, delimited by newlines - if there are multiple newlines keep them there though, but if a translated line goes over, feel free to add a newline in the middle) + scene ending +# Anodyne\n-------\n\n\n\nA game created by\n\nMelos Han-Tani\n\nand\n\nMarina Kittaka\n\n------------- +Anodyne\n-------\n\n\n\n게임 제작\n\nMelos Han-Tani\n\n그리고\n\nMarina Kittaka\n\n------------- +# Created from\n\nMarch, 2012\n\nto\n\nJanuary, 2013 +개발 기간\n\n2012년 4월 부터\n\n\n\n2013년 1월 까지 +# DESIGN\n------\nBoth +디자인\n---\n둘이서 함께 +# PROGRAMMING\n-----------\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\nART\n---\nMarina\n +프로그래밍\n-----\nMelos, using the\nFlixel library for\nActionscript 3.\n\n\n\n미술\n--\nMarina\n +# MUSIC/SFX\n---------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\nDIALOGUE\n--------------\nMostly Marina\n +음악/효과음\n------\nMelos, using REAPER\nand number of free\nsoundfonts.\n\n\n\n대사\n--\nMostly Marina\n +# STORY\n-----\nBoth\nJapanese Localization:\nKakehashi Games +스토리\n---\n둘이서 함께\n\n현지화\n---\n일본어 현지화\nKakehashi Games\n한국어 현지화\nMiRiKan +Massive thanks to\nour testers, who\nsuffered so you\ndon't have to!\n--------------\n\nMarina, for suffering\nthrough most of the\ninitial bugs.\n\nEtan, for constant\nsupport since the\nbeginning, with\nmany bugs found,\nand the third human\nto play through most\nof the game. +O - thanks, sis!\n\nRunnan, Nick Reineke,\nEmmett, Poe, AD1337,\n Dennis, Andrew,\nAndrew MM\n Carl, Max, Amidos,\nLyndsey, Nathan\n +Melos would like\nto thank:\n\nMom and Dad, for\ntheir constant support\nin this endeavor.\n\nS\n\nMany TIGSourcers and\nother devs met\nalong the way!\n\nMarina, for making\nthis game possible,\nand improving it in\ncountless ways. +Adobe, Adam Saltsman,\nFlashDevelop devs,\nREAPER devs,\nDAME creator,\nDesura, Gamersgate,\nIndieDB, TIGSource\n\n\nAnd my other friends\nwho have shown their\nsupport. (Thanks!)\n\nAnd last, but\nnot least,\nTina Chen,\nlongtime friend,\nfor both support and\nintroducing me to Marina. +Marina would like\nto thank...\n\nColin Meloy, for\nexpanding\nmy vocabulary\n\nTsugumo, for\n\"So You Want to\nBe a Pixel Artist?\"\n\nMy family,\nfor support and food.\n\nDaniel, for being an\n\"indie game dev\"\nwith me growing up. +Molly, for believing\n in me.\n\nTina, for introducing\nme\nto Melos.\n\nMelos, for making\na game\nand trusting me to\nbe a big part of it. +# CAST\n----\n\n\nSlime\n\n\nAnnoyer\n\n\nPew Pew\n\n\nShieldy\n\n\nSeer +캐스트\n---\n\n\n슬라임\n\n\n짜증나는 놈\n\n\n퓨 퓨\n\n\n방패지기\n\n\n탐구자 +# Mover\n\n\nOn Off\n\n\nFour Shooter\n\n\nSlasher\n\n\nRogue\n +움직이는 자\n\n\n온 오프\n\n\n사면 발사대\n\n\n슬래셔\n\n\n악당\n +# Dog\n\n\nFrog\n\n\nRotator\n\n\nPerson\n\n\nWall\n\n +개\n\n\n개구리\n\n\n회전자\n\n\n사람\n\n\n벽\n\n +# Rat\n\n\nGasguy\n\n\nSilverfish\n\n\nDasher\n\n\nRoller\n\nWatcher\n\n\n +쥐\n\n\n가스맨\n\n\n좀벌래\n\n\n돌진기\n\n\n롤러\n\n관측자\n\n\n +# Dustmaid\n\n\nBurst Plant\n\n\nManager\n\n\n +먼지광\n\n\n폭발 식물\n\n\n매니저\n\n\n +# Lion\n\n\nContort\n\n\nFlame Pillar\n\n\nServants\nArthur\nJaviera +사자\n\n\n뒤틀린 자\n\n\n불꽃 기둥\n\n\n두 광대들\n아서\n자비에라 +# Follower\n\n\nEdward\n\n\nFisherman\n\n\nRed Walker\n\nHews +추종자\n\n\n에드워드\n\n\n낚시꾼\n\n\n붉은 워커\n\n절단자 +# Rabbit\n\n\nIcky\n\n\nShopkeeper\n\nMiao Xiao Tuan Er\n\nRank\n\nGoldman +토끼\n\n\n이키\n\n\n가게 주인\n\n미아오 샤오 투안 어\n\n랭크\n\n골드맨 +# Thorax\n\nJames\n\nMushroom\n\nCrickson\n\nGolem\n\nSuburbanites +토렉스\n\n제임스\n\n버섯\n\n클릭손\n\n골렘\n\n교외 거주자 +# 추격자\n\n\nEntities\n\n\nSpace Faces\n\n\Cube Kings +체이서\n\n\n엔티티\n\n\n공간의 얼굴들\n\n\큐브 왕 +# Young\n\n\nMitra\n\n\nSage\n\n\nBriar +영\n\n\n미트라\n\n\n현자\n\n\n브라이어 +# And we'd like to\nthank YOU!\nFor playing our game!\n\n\nWe hope you\nenjoyed it. +그리고 게임을 플레이한\n당신께 감사드립니다!\n끝까지 즐겨주셔서 감사합니다!\n\n\n즐거우셨길\n바랍니다. +\n\n\n\n\n\n\n\n +# Now you have\nthe ability\nto explore Young's\nworld with (almost) no\nlimitations, via \nthe swap.\n +이제 당신은\n변동기를 통해\n영의 세상을\n(거의)제한 없이\n탐험하실 수 있는\n능력을 얻었습니다.\n + end scene + + scene elevator +# Floor? +몇층으로 가시겠습니까? +1\n +2\n +3\n +4\n +# Cancel +취소 + end scene + end area +end npc + +# Tell the python script you're done. +DONE + \ No newline at end of file diff --git a/intra/source/data/kr/make_kr_npc_data.bat b/intra/source/data/kr/make_kr_npc_data.bat new file mode 100644 index 0000000..27d053d --- /dev/null +++ b/intra/source/data/kr/make_kr_npc_data.bat @@ -0,0 +1,4 @@ +echo "Making korean.." +python ../gen_npc.py dialogue_kr.py NPC_Data_KR.as +mv NPC_Data_KR.as .. +pause diff --git a/intra/source/data/make_npc_data.bat b/intra/source/data/make_npc_data.bat new file mode 100644 index 0000000..a964a63 --- /dev/null +++ b/intra/source/data/make_npc_data.bat @@ -0,0 +1,3 @@ +echo "Making italian" +python gen_npc.py dialogue_IT.txt NPC_Data_IT.as +pause diff --git a/intra/source/entity/decoration/Eye_Light.hx b/intra/source/entity/decoration/Eye_Light.hx new file mode 100644 index 0000000..af0c252 --- /dev/null +++ b/intra/source/entity/decoration/Eye_Light.hx @@ -0,0 +1,35 @@ +package entity.decoration +{ +import data.CLASS_ID; +import org.flixel.FlxSprite; +/** + * ... + * @author seaga + */ +class Eye_Light extends FlxSprite +{ + //[Embed(source="../../res/sprites/decoration/eyelight.png")] public var Eye_Light_Sprite:Class; + public var type:String="Eye_Light"; + public var xml:XML; + public var darkness:FlxSprite; + public var light:FlxSprite; + public var cid:Int=CLASS_ID.EYE_LIGHT; + + public function new(x:Int,y:Int,_xml:XML, _darkness:FlxSprite) + { + super(x, y); + xml=_xml; + loadGraphic(Eye_Light_Sprite, true, false, 16, 16); + immovable=true; + addAnimation("glow", [0, 1, 2], 5, true); + play("glow"); + darkness=_darkness; + light=new Light(x - 16, y - 36, darkness, Light.T_FIVE_FRAME_GLOW,false,null); + light.addAnimation("glow", [0, 0, 1, 2, 3, 4, 3, 2, 1, 0, 0, 0], 7, true); + light.play("glow"); + + } + + + +} \ No newline at end of file diff --git a/intra/source/entity/decoration/Light.hx b/intra/source/entity/decoration/Light.hx new file mode 100644 index 0000000..a77fea0 --- /dev/null +++ b/intra/source/entity/decoration/Light.hx @@ -0,0 +1,201 @@ +package entity.decoration +{ +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import flash.geom.ColorTransform; +/** + * ... + * @author Seagaia + */ +class Light extends FlxSprite +{ + //[Embed(source="../../res/sprites/light/glow-light.png")] public var GLOW_LIGHT:Class; + //[Embed(source="../../res/sprites/light/cone-light.png")] public var CONE_LIGHT:Class; + //[Embed(source="../../res/sprites/light/5-frame-glow.png")] private var FIVE_FRAME_GLOW:Class; + //[Embed(source="../../res/sprites/light/beach-screen-light.png")] private var BEACH_GLOW:Class; + + public static var T_GLOW_LIGHT:Int=0; + public static var T_FIVE_FRAME_GLOW:Int=1; + public static var T_CONE_LIGHT:Int=2; + public static var T_BEACH_GLOW:Int=3; + public static var T_BEDROOM_BOUNCE:Int=4; + private var locked_on:Bool=false; + private var lock_latency:Float=2.0; + private var lock_latency_max:Float=2.0; + private var current_room:Point=new Point(0, 0); + + public static var L_PLAYER:Int=1; + public static var L_SUN_GUY_ORBS:Int=2; + public static var L_BEDROOM_BOUNCE:Int=3; + + public var darkness:FlxSprite; + public var followee:FlxSprite; + public var flicker_rate:Int=0; + public var base_x_scale:Float=3.0; + public var base_y_scale:Float=3.0; + public var flicker_timer:Int=flicker_rate; + public var special_type:Int=0; + + public var xml:XML; + /** + * Creates a light at the given point, to be blended with the darkness reference. Specifying the type will + * determine what to use. Client must specify the animation and offset. + * @param _x + * @param _y + * @param _darkness A reference to the darkness sprite to draw Into + * @param type What type of light sprite to use + * @param follows + * @param _followee The sprite to follow + * @param _flicker_rate + * @param _special_type + */ + public function new(_x:Int, _y:Int, _darkness:FlxSprite, type:Int, follows:Bool=false, _followee:FlxSprite=null,_flicker_rate:Int=0,_special_type:Int=0) + { + super(_x, _y); + xml=; + setlighttype(type); + + flicker_rate=_flicker_rate; + darkness=_darkness; + special_type=_special_type; + blend="screen"; + + followee=_followee; + if(follows){ + x=followee.x -((followee.width - width)/ 2); + y=followee.y -((followee.height - height)/ 2); + } + } + + override public function update():Void { + if(followee !=null){ + if(special_type==L_PLAYER){ + x=followee.x-((width - followee.width)/ 2); + y=followee.y -((height - followee.height)/ 2)- 16; + } else if(special_type==L_SUN_GUY_ORBS){ + x=followee.x +(followee.width / 2)- 26; + y=followee.y +(followee.height / 2)- 45; + } else if(special_type==L_BEDROOM_BOUNCE){ + if(velocity.x>0){ + if(x>Registry.SCREEN_WIDTH_IN_PIXELS){ + velocity.x *=-1; + } + } else { + if(x<0){ + velocity.x *=-1; + } + } + if(velocity.y>0){ + if(y>Registry.SCREEN_HEIGHT_IN_PIXELS){ + velocity.y *=-1; + } + } else { + if(y<0){ + velocity.y *=-1; + } + } + + lock_latency -=FlxG.elapsed; + /* Wait for a bit before locking onto the player */ + if(overlaps(followee, true)&& lock_latency<0){ + locked_on=true; + velocity.x=velocity.y=0; + } + /* If locked on follow the player */ + if(locked_on){ + var _x:Int=(followee.x -((width - followee.width)/ 2))% Registry.SCREEN_WIDTH_IN_PIXELS; + var _y:Int=((followee.y - 20)% Registry.SCREEN_HEIGHT_IN_PIXELS)- 16; + EventScripts.send_property_to(this, "x", _x, 0.5); + EventScripts.send_property_to(this, "y", _y, 0.5); + } else { /* Randomize the velocity a bit */ + velocity.x +=(Math.random()* 2 + -1); + velocity.y +=(Math.random()* 2 + -1); + } + /* Unlock on room transition */ + if(Registry.CURRENT_GRID_X !=current_room.x || Registry.CURRENT_GRID_Y !=current_room.y){ + locked_on=false; + lock_latency=lock_latency_max; + current_room.x=Registry.CURRENT_GRID_X; + current_room.y=Registry.CURRENT_GRID_Y; + randomize_velocity(); + } + + /* Not visible if sun boss defeated. */ + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + visible=false; + } + } + + } + + + + flicker_timer--; + if(flicker_timer<0 && flicker_rate !=0){ + scale.x=base_x_scale + Math.random()* 0.2; + scale.y=base_y_scale + Math.random()* 0.2; + flicker_timer=flicker_rate; + } else { + scale.x=base_x_scale; + scale.y=base_y_scale; + } + + super.update(); + } + override public function draw():Void { + var screenXY:FlxPoint=getScreenXY(); + darkness.stamp(this, screenXY.x, screenXY.y); + } + + private function randomize_velocity():Void + { + var i:Int=Std.int(4 * Math.random()); + var base_speed:Int=30; + switch(i){ + case 0: + velocity.x=velocity.y=base_speed;break; + case 1: + velocity.x=velocity.y=-base_speed;break; + case 2: + velocity.x=base_speed;velocity.y=-base_speed;break; + case 3: + velocity.x=-base_speed;velocity.y=base_speed;break; + } + } + + public function setlighttype(type:Int):Void + { + + if(type==T_GLOW_LIGHT){ + loadGraphic(GLOW_LIGHT, false, false, 64, 64); + framePixels.colorTransform(framePixels.rect, new ColorTransform(0.5, 0.5, 1, 1, 0, 0, -5)); + } else if(type==T_FIVE_FRAME_GLOW){ + loadGraphic(FIVE_FRAME_GLOW, true, false, 48, 48); + } else if(type==T_CONE_LIGHT){ + loadGraphic(CONE_LIGHT, false, false, 32, 32); + base_x_scale=0.2; + base_y_scale=0.2; + } else if(type==T_BEACH_GLOW){ + loadGraphic(BEACH_GLOW, false, false, 160, 160); + base_x_scale=base_y_scale=1; + scrollFactor=new FlxPoint(0, 0); + } else if(type==T_BEDROOM_BOUNCE){ + special_type=L_BEDROOM_BOUNCE; + loadGraphic(GLOW_LIGHT, false, false, 64, 64); + scrollFactor=new FlxPoint(0, 0); + x=160 * Math.random(); + y=160 * Math.random(); + randomize_velocity(); + base_x_scale=base_y_scale=2; + current_room.x=Registry.CURRENT_GRID_X; + current_room.y=Registry.CURRENT_GRID_Y; + //x=followee.x -((followee.width - width)/ 2); + //y=followee.y -((followee.height - height)/ 2); + } + } +} \ No newline at end of file diff --git a/intra/source/entity/decoration/Map_Preview.hx b/intra/source/entity/decoration/Map_Preview.hx new file mode 100644 index 0000000..b6b11ae --- /dev/null +++ b/intra/source/entity/decoration/Map_Preview.hx @@ -0,0 +1,39 @@ +package entity.decoration +{ +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.geom.Point; +import org.flixel.FlxSprite; + +/** + * test + * @author Seagaia + */ +class Map_Preview extends FlxSprite +{ + + var erase_mask:FlxSprite=new FlxSprite(); + public function new() + { + makeGraphic(16, 16, 0xffff0000); + erase_mask.makeGraphic(16, 16, 0x00000000); + for(i in 0...256){ + if(i % 2==0){ + erase_mask.framePixels.setPixel32(i % 16, i / 16, 0xff000000); + } else { + erase_mask.framePixels.setPixel32(i % 16, i / 16, 0x00000000); + } + } + erase_mask.blend='erase'; + draw(); + } + + override public function draw():Void + { + pixels.copyChannel(erase_mask.framePixels, erase_mask.framePixels.rect, new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + dirty=true; + super.draw(); + + } + +} \ No newline at end of file diff --git a/intra/source/entity/decoration/Nonsolid.hx b/intra/source/entity/decoration/Nonsolid.hx new file mode 100644 index 0000000..9a51c2f --- /dev/null +++ b/intra/source/entity/decoration/Nonsolid.hx @@ -0,0 +1,48 @@ +package entity.decoration +{ +import org.flixel.FlxSprite; + +class Nonsolid extends FlxSprite +{ + + // embed the sprite file Into the code. + //[Embed(source="../../res/sprites/decoration/grass_1.png")] public static var grass_1_sprite:Class; + //[Embed(source="../../res/sprites/decoration/grass_REDSEA.png")] public static var grass_REDSEA_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail.png")] public static var rail_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail_NEXUS.png")] public static var rail_NEXUS_sprite:Class; + //[Embed(source="../../res/sprites/decoration/rail_CROWD.png")] public static var rail_CROWD_sprite:Class; + + public function new(_xml:XML) + { + // When adding one of these to DAME, supply it the image file, + // the size of one frame, and add the "type" property to the DAME sprite + // where "type" is some identifier. + // There's a "Grass_1" sprite in there for an example. + + super(parseInt(_xml.@x), parseInt(_xml.@y)); + switch(_xml.@type.toString()){ + // The word after "case" will be whatever you put in for "Type" in the DAME file. + case "Grass_1": + loadGraphic(grass_1_sprite, true, false, 16, 6); + addAnimation("whatever", [0, 1], 10);//Add animations if you need to. + play("whatever"); + break;//Don't forget this so the code exits the switch block. one for every case. + case "Grass_REDSEA": + loadGraphic(grass_REDSEA_sprite, true, false, 16, 16); + play("whatever"); + break; + case "Rail_1": + loadGraphic(rail_sprite, true, false, 16, 16); + break; + case "Rail_NEXUS": + loadGraphic(rail_NEXUS_sprite, true, false, 16, 17); + break; + case "Rail_CROWD": + loadGraphic(rail_CROWD_sprite, true, false, 16, 22); + break; + } + + } + + +} \ No newline at end of file diff --git a/intra/source/entity/decoration/RetroEffect.hx b/intra/source/entity/decoration/RetroEffect.hx new file mode 100644 index 0000000..99f2eae --- /dev/null +++ b/intra/source/entity/decoration/RetroEffect.hx @@ -0,0 +1,130 @@ +/** + * RetroEffect + * -- Generates a retro CRT distortion effect on the requested camera. + * Inspired from the article http://active.tutsplus.com/tutorials/effects/create-a-retro-crt-distortion-effect-using-rgb-shifting/ + * + * @version 1.0 - 31st January 2012 + * @link http://www.alanzucconi.com + * @author Alan Zucconi +*/ +package entity.decoration; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.display.BlendMode; + +import flash.geom.Matrix; +import flash.geom.Point; + +import org.flixel.FlxCamera; +import org.flixel.FlxSprite; +import org.flixel.FlxG; + +/** Class to generate a retro CRT distortion effect. + * @author Alan Zucconi + */ +class RetroEffect extends FlxSprite +{ + private static var _zeroPoint:Point=new Point(); + + /** The camera where the effect should be applied. */ + private static var _camera:FlxCamera; + /** The buffer where the effect is constructed. */ + private var _buffer:BitmapData; + /** The buffer where the effect is constructed. */ + private var _output:BitmapData; + + private var _bitmap:Bitmap; + + /** The counter for the distortion effect. */ + private var _counter:Float=0; + /** The matrix to distort the image. */ + private var _distortion:Matrix=new Matrix(); + + /** Generates a new istance of the retro CTR distortion effect. + * @param camera The camera where the effect should be applied. + */ + public function new(camera:FlxCamera) + { + _camera=camera; + + _buffer=new BitmapData(_camera.width, _camera.height, true, 0xFF000000); + _output=new BitmapData(_camera.width, _camera.height, true, 0xFF000000); + + _bitmap=new Bitmap(); + _bitmap.bitmapData=_buffer; + } + + /** Updates the counter. */ + override public function update():Void + { + _counter +=FlxG.elapsed; + super.update(); + } + + /** Apply the effect. */ + override public function draw():Void + { + var output:BitmapData=effect(_camera.screen.pixels); + _camera.screen.pixels.draw(output); + } + + public function randRange(min:Float, max:Float):Float { + var randomNum:Float=(Math.random()*(max - min))+ min; + return randomNum; + } + + /** Apply the effect on the image. + * @param source The bitamp to change. + * @return The changed bitmap. + */ + private function effect(source:BitmapData):BitmapData + { + // Red channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.RED, BitmapDataChannel.RED); + _bitmap.alpha=randRange(8, 10)/ 10; + + _distortion.a=sinusoid(_counter + 0 / 5, 1.09, 1.2 , 0.5); + _distortion.d=sinusoid(_counter + 2 / 5, 1, 1.21 , 0.5); + + //_distortion.ty=sinusoid(_counter + 0/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, null, null, true); + + // Green channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); + _bitmap.alpha=randRange(8, 10)/ 10; + + _distortion.a=sinusoid(_counter + 1 / 5, 0.89, 1.00 , 0.5); + _distortion.d=sinusoid(_counter + 1 / 5, 1, 1.01 , 0.5); + //_distortion.ty=sinusoid(_counter + 1/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, BlendMode.SCREEN, null, true); + + // Blue channel ------------------------------------------ + _buffer.fillRect(source.rect, 0xFF000000); + _buffer.copyChannel(source, source.rect, _zeroPoint, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); + _bitmap.alpha=randRange(8, 10)/10; + + _distortion.a=sinusoid(_counter + 2 / 5, 0.99, 1.20 , 3.5); + _distortion.d=sinusoid(_counter + 0 / 5, 1, 1.01 , 3.5); + //_distortion.ty=sinusoid(_counter + 2/5, 0, -1 ,0.5) + _output.draw(_bitmap, _distortion, null, BlendMode.SCREEN, null, true); + + return _output; + } + + /** Generate a custom sinusoid curve. + * @param x The x value. + * @param min The minimun value of this sinusoid. + * @param max The maximum value of this sinusoid. + * @param period The period of this sinusoid. + * @return The y value. + */ + public function sinusoid(x:Float, min:Float, max:Float, periodo:Float):Float { + var escursione:Float=max - min; + var coefficiente:Float=Math.PI * 2 / periodo; + return escursione / 2 *(1 + Math.sin(x * coefficiente))+ min; + } +} \ No newline at end of file diff --git a/intra/source/entity/decoration/Solid_Sprite.hx b/intra/source/entity/decoration/Solid_Sprite.hx new file mode 100644 index 0000000..5d4a376 --- /dev/null +++ b/intra/source/entity/decoration/Solid_Sprite.hx @@ -0,0 +1,179 @@ +package entity.decoration +{ +import data.CLASS_ID; +import entity.interactive.NPC; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Solid_Sprite extends FlxSprite +{ + /* * * * * + * a dame-placed solid sprite. can be animated. + * * * * */ + //[Embed(source="../../res/sprites/decoration/red_cave_left.png")] public static var red_cave_left_sprite:Class; + //[Embed(source="../../res/sprites/decoration/TREE.png")] public static var trees_sprites:Class; + public var xml:XML; + public var type_str:String; + public var cid:Int=CLASS_ID.SOLID_SPRITE; + public var player:Player; + public var dame_frame:Int; + public var active_region:FlxObject; + + + public function new(_xml:XML,is_cutscene:Bool=false,_player:Player=null) + { + x=parseInt(_xml.@x); + y=parseInt(_xml.@y); + xml=_xml; + type_str=_xml.@type; + dame_frame=parseInt(_xml.@frame); + + super(x, y); + player=_player; + if(type_str=="red_cave_l_ss" && Registry.CURRENT_GRID_X !=3 && Registry.CURRENT_GRID_Y>3){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Left]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="red_cave_l_ss"){ // CENTRAL ACTUALLY. + immovable=true; + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + + } else if(type_str=="red_cave_r_ss"){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Right]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="red_cave_n_ss"){ + immovable=true; + if(!is_cutscene && !Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_North]){ + exists=false; + } else { + loadGraphic(red_cave_left_sprite, true, false, 64, 64); + width=56;height=28; + offset.y=32;y +=32; + offset.x=4;x +=4; + if(is_cutscene){ + addAnimation("a", [0], 20, true);play("a");scrollFactor.x=scrollFactor.y=0; + } + } + } else if(type_str=="blocker"){ + immovable=true; + makeGraphic(64, 4, 0x00000000); + } else if(type_str=="vblock"){ + immovable=true; + makeGraphic(4, 16, 0x00000000); + } else if(type_str=="tree"){ + // Change the w/h of this draw call if you want the max size of a tree(or whatever)to be bigger/smaller + loadGraphic(trees_sprites, true, false, 64,64); + frame=dame_frame; + + immovable=true; + switch(dame_frame){ + case 0: + // Set where the hitbox is and its size + set_props(16, 32, 32, 32); + + break; + default: + break; + } + + } else if(type_str=="sign"){ + loadGraphic(NPC.note_rock, true, false, 16, 16); + frame=parseInt(xml.@frame); + active_region=new FlxObject(x - 2, y + 14, 20, 5); + Registry.subgroup_interactives.push(this); + immovable=true; + } + } + + /** + * Sets this solid sprites properites + * @param ox offset of the hitbox + * @param oy offset of the hitbox(y) + * @param w width of hitbox + * @param h + */ + private function set_props(ox:Int, oy:Int, w:Int, h:Int):Void { + offset.x=ox; + offset.y=oy; + width=w; + height=h; + x +=ox; + y +=oy; + } + override public function update():Void + { + + if(player !=null){ + if(type_str=="blocker"){ + if(player.overlaps(this)&& player.velocity.y>0 && player.yy){ + player.y=y + height; + } + } else if(type_str=="vblock"){ + if(player.overlaps(this)){ + if(player.velocity.x<0){ + player.x=x + width; + } else { + player.x=x - player.width; + } + } + } else if(type_str=="tree"){ + FlxG.collide(player, this); + } else if(type_str=="sign"){ + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y + 14; + if(DH.nc(player, active_region)){ + if(frame==2){ //r + //DH.dialogue_popup("The sign points to the east but the words on it are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 0)); + } else if(frame==3){ //l + //DH.dialogue_popup("The sign points to the west but the words on it are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 1)); + } else if(frame==4){ // u/d + //DH.dialogue_popup("The words on the sign are faded."); + DH.dialogue_popup(DH.lk("solidsprite", 2)); + } + + } + } else { + FlxG.collide(player, this); + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/decoration/Water_Anim.hx b/intra/source/entity/decoration/Water_Anim.hx new file mode 100644 index 0000000..ead03e3 --- /dev/null +++ b/intra/source/entity/decoration/Water_Anim.hx @@ -0,0 +1,199 @@ +package entity.decoration +{ +import data.TileData; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxTilemap; +/** + * Given a map buffer will transform a list of tiles at some rate Into water or whatever + */ +class Water_Anim extends AnoSprite +{ + + private var started:Bool=false; + + private var target_tiles:Array;// List of tiles [0,99] that will be transformed in order + private var target_tile_types:Array;// What each tile will change to. + + private var latency:Float=0.3;//Time between tile transforms + private var t:Float=0; + + private var map_ref:FlxTilemap; + private var map_name:String; + + public var anim_tiles:FlxGroup;// Group of animated tiles, added to parent. + + private var anim_idx:Int=0;// Which animated tile in anim_tiles will be visible next. + private var cur_idx:Int=0;// Which tile in target_tiles, w.r.t. the current wscreen, will change next. + + + public static var START_WATER_ANIM:Bool=false; + public function new(args:Array) + { + super(args); + map_name=Registry.CURRENT_MAP_NAME; + START_WATER_ANIM=false;// Reset this every tiemmmm + switch(map_name){ + case "DEBUG": + target_tiles= new Array(10, 11, 12, 13, 14); + target_tile_types=new Array(16,17,18,19,19); + latency=0.3; + break; + case "BLUE": + target_tiles= new Array(3,13,23,33,32,31,30); + target_tile_types=new Array(31,31,31,30,30,30,30); + latency=0.3; + break; + case "HAPPY": + target_tiles= new Array(6,16,26,36,37,38,39); + target_tile_types=new Array(41,41,41,40,40,40,40); + latency=0.3; + break; + case "GO": + var gx:Int=Registry.CURRENT_GRID_X; + var gy:Int=Registry.CURRENT_GRID_Y; + + if(gx==0 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Happy_Done]){ + xml.@alive="true"; + } + target_tiles= new Array(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); + target_tile_types=new Array(190,190,190,190,190,190,190,190,190,190); + + } else if(gx==1 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Happy_Done])xml.@alive="true"; + target_tiles= new Array(30,31,32,33,34,35,36,37,27,17,7); + target_tile_types=new Array(190,190,190,190,190,190,190,191,191,191,191); + } else if(gx==2 && gy==1){ + latency=0.2; + target_tiles= new Array(40, 41, 31, 21, 22, 12, 13, 49, 48, 38, 28, 27, 17, 16, 15, 5, 14, 4); + target_tile_types=new Array(190,191,191,190,191,190,190,192,193,193,192,193,192,192,194,194,194,194); + + } else if(gx==3 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])xml.@alive="true"; + target_tiles= new Array(2,12,22,32,33,34,35,36,37,38,39); + target_tile_types=new Array(193,193,193,193,192,192,192,192,192,192,192); + } else if(gx==4 && gy==2){ + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])xml.@alive="true"; + target_tiles= new Array(30, 31, 32, 33, 34, 35, 36, 37, 38, 39); + target_tile_types=new Array(192,192,192,192,192,192,192,192,192,192); + } + + break; + default: + exists=false; + break; + } + visible=false; + anim_tiles=new FlxGroup(); + //set up group and indices + //TileData.make_anim_tile(anim_tiles,map_name,., + + for(i in 0...target_tiles.length){ + TileData.make_anim_tile(anim_tiles, map_name, target_tile_types[i], tl.x + 16 *(target_tiles[i] % 10), tl.y + 16 * Std.int(target_tiles[i] / 10)); + } + anim_tiles.setAll("visible", false); + parent.anim_tiles_group.add(anim_tiles); + + // If we activated this event already, the animated tiles should be visible. + if(xml.@alive=="true"){ + anim_tiles.setAll("visible", true); + + while(set_next_tile()){ + + } + } + } + + + private function set_next_tile():Bool { + + if(cur_idxlatency){ + t=0; + if(!set_next_tile()){ // When finished... + started=false; + xml.@alive="true"; + if(Registry.CURRENT_MAP_NAME !="BLUE"){ + + player.state=player.S_GROUND; + } + } + } + } + + super.update(); + } + + + + public function start():Void { + + if(xml.@alive=="true"){ + return; + //Yeah no. + } + started=true; + + + } + + public static function START_WATER_ANIMF():Void { + START_WATER_ANIM=true; + } + + override public function destroy():Void + { + target_tile_types=null; + target_tiles=null; + anim_tiles=null; + map_ref=null; + super.destroy(); + } + + /** + * Takes a single screen's 10x10 tilemap + * @param map + */ + public function set_map(map:FlxTilemap):Void { + map_ref=map; + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Dash_Trap.hx b/intra/source/entity/enemy/apartment/Dash_Trap.hx new file mode 100644 index 0000000..be32726 --- /dev/null +++ b/intra/source/entity/enemy/apartment/Dash_Trap.hx @@ -0,0 +1,286 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Dust; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Dash_Trap extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/apartment/dash_trap.png")] public static var dash_trap_sprite:Class; + private var xml:XML; + private var player:Player; + private var parent:Dynamic; + + public var state:Int=0; + private var s_idle:Int=0; + private var s_moving:Int=1; + private var s_retracting:Int=2; + + private var idle_pt:Point=new Point; + private var dash_vel:Int=80; + private var h_sight:FlxSprite=new FlxSprite(); + private var v_sight:FlxSprite=new FlxSprite(); + + private var retract_vel:Point=new Point(); + + public var cid:Int=CLASS_ID.DASHTRAP; + + private var frame_type:Int=0; + private var t_normal:Int=0; + private var t_bounce_v:Int=2; + private var t_bounce_h:Int=1; + + private var ctr:Int=0; + + private var did_init:Bool=false; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Dash Trap anims */ + makeGraphic(16, 16, 0xff594312); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("idle", [6], 12);//when still + addAnimation("dash", [6], 12, false);//when beginning to move + addAnimation("bounce", [6], 12, false);//when hitting anything + } else { + addAnimation("idle", [4], 12);//when still + addAnimation("dash", [5], 12, false);//when beginning to move + addAnimation("bounce", [4, 5], 12, false);//when hitting anything + } + play("idle"); + loadGraphic(dash_trap_sprite, true, false, 16, 16); + + + h_sight.makeGraphic(320, 10, 0xff114411); + h_sight.x=x - 160; + h_sight.y=y + 3 + Registry.HEADER_HEIGHT; + v_sight.makeGraphic(14, 320, 0xff441144); + v_sight.x=x + 1; + v_sight.y=y - 160 + Registry.HEADER_HEIGHT; + + Registry.subgroup_dash_traps.push(this); + + width=height=14; + centerOffsets(true); + idle_pt.x=x; + idle_pt.y=y + Registry.HEADER_HEIGHT; + + parent.bg_sprites.add(h_sight); + parent.bg_sprites.add(v_sight); + h_sight.visible=v_sight.visible=false; + + add_sfx("dash", Registry.sound_data.slasher_atk); + add_sfx("hit", Registry.sound_data.shieldy_ineffective); + + } + + private var ticker:Int=0; + override public function preUpdate():Void + { + ticker +=1; + if(ticker==3){ + FlxG.collide(this, parent.curMapBuf); + ticker=0; + } + super.preUpdate(); + } + + override public function update():Void + { + + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + if(!did_init){ + did_init=true; + if(parseInt(xml.@frame)>0){ + play("dash"); + frame_type=parseInt(xml.@frame); + switch(frame_type){ + case t_bounce_h: + state=s_moving; + velocity.x=dash_vel; + break; + case t_bounce_v: + state=s_moving; + velocity.y=dash_vel; + break; + case 6: + frame_type=0; + break; + } + } + } + //EventScripts.prevent_leaving_map(parent, this); + } else { + velocity.x=velocity.y=0; + return; + } + } + + if(maybe_bounce())return; + + if(state==s_idle){ + if(player.overlaps(h_sight)){ + if(player.x>=x){ + velocity.x=dash_vel; + retract_vel.x=-dash_vel / 2; + } else { + velocity.x=-dash_vel; + retract_vel.x=dash_vel / 2; + } + play_sfx("dash"); + state=s_moving; + play("dash"); + } else if(player.overlaps(v_sight)){ + if(player.y<=y){ + velocity.y=-dash_vel; + retract_vel.y=dash_vel / 2; + } else { + velocity.y=dash_vel; + retract_vel.y=-dash_vel / 2; + } + state=s_moving; + play_sfx("dash"); + play("dash"); + } + if(player.overlaps(this)){ + player.touchDamage(1); + } + } else if(state==s_moving){ + if(touching !=NONE){ + play_sfx("hit"); + state=s_retracting; + } + + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + state=s_retracting; + play_sfx("hit"); + } + + for(var dashtrap:Dash_Trap in Registry.subgroup_dash_traps){ + if(dashtrap==null)continue; + if(dashtrap !=this && dashtrap.overlaps(this)){ + state=s_retracting; + play_sfx("hit"); + } + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + if(dust.overlaps(this)){ + play_sfx("hit"); + state=s_retracting; + } + } + + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.overlaps(this)&& sp.up_frame==sp.frame){ + play_sfx("hit"); + state=s_retracting; + } + } + + if(y>Registry.CURRENT_GRID_Y * 160 + 16 * 9 + 20){ + play_sfx("hit"); + state=s_retracting; + } + + if(state==s_retracting){ + + play("bounce", true); + velocity.x=retract_vel.x; + velocity.y=retract_vel.y; + } + } else if(state==s_retracting){ + if(Math.abs(x - idle_pt.x)<2 && Math.abs(y - idle_pt.y)<2){ + state=s_idle; + play("idle"); + x=idle_pt.x; + y=idle_pt.y; + retract_vel.x=retract_vel.y=velocity.y=velocity.x=0; + } + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + } + } + super.update(); + } + + /** + * Logic for dash traps that bounce back and forth + * */ + private function maybe_bounce():Bool + { + if(frame_type>0){ + if(!player.invincible && player.overlaps(this)&& player.state !=player.S_AIR){ + player.touchDamage(1); + } + if(Registry.is_playstate){ + if(x + width>parent.rightBorder){ + touching=RIGHT; + } else if(xparent.lowerBorder){ + touching=DOWN; + } + } + if(frame_type==t_bounce_h){ + if(ctr==0){ + if(touching==RIGHT){ + velocity.x=-dash_vel; + ctr=1; + play_sfx("hit"); + play("bounce", true); + } + } else { + if(touching==LEFT){ + velocity.x=dash_vel; + ctr=0; + play_sfx("hit"); + play("bounce", true); + } + } + } else if(frame_type==t_bounce_v){ + if(ctr==0){ + if(touching==DOWN){ + velocity.y=-dash_vel; + ctr=1; + play_sfx("hit"); + play("bounce", true); + } + } else { + if(touching==UP){ + velocity.y=dash_vel; + ctr=0; + play_sfx("hit"); + play("bounce", true); + } + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Gasguy.hx b/intra/source/entity/enemy/apartment/Gasguy.hx new file mode 100644 index 0000000..b3702f3 --- /dev/null +++ b/intra/source/entity/enemy/apartment/Gasguy.hx @@ -0,0 +1,202 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +class Gasguy extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/apartment/gas_guy.png")] public static var gas_guy_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/apartment/gas_guy_cloud.png")] public static var gas_guy_cloud_sprite:Class; + + public var xml:XML; + private var player:Player; + private var parent:Dynamic; + private var gas_group:FlxGroup=new FlxGroup(3); + + private var state:Int=1; + private var s_normal:Int=0; + + private var s_shoot:Int=1; + private var t:Float=4; + private var tm:Float=5.0; + private var initial_latency:Float=1.5; + private var tm_shoot_latency:Float=1.2; + + private var s_dying:Int=2; + private var s_dead:Int=3; + + private var s_shoot_latency:Int=4; + + private var tm_move_sound:Float; + private var t_move_sound:Float=0; + + + private var just_hit:Bool=false; + + public var cid:Int=CLASS_ID.GASGUY; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* add gas guy anims */ + loadGraphic(gas_guy_sprite, true, false, 16, 24); + addAnimation("float", [0, 1], 2, true); + addAnimation("release_gas", [2], 20, true); + play("float"); + + /* Make gas and add adnimations for gas*/ + for(i in 0...gas_group.maxSize){ + var gas:FlxSprite=new FlxSprite(); + gas.loadGraphic(gas_guy_cloud_sprite, true, false, 24, 24); + gas.addAnimation("gas_move", [0, 1], 3); + gas.width=gas.height=16; + gas.offset.x=4; + gas.offset.y=4; + gas.centerOffsets(true); + gas.play("gas_move"); + gas.flicker(-1); + + gas_group.add(gas); + gas.x=x; + gas.visible=false; + gas.y=y; + Registry.subgroup_gas.push(gas); + } + + parent.fg_sprites.add(gas_group); + + + drag.x=drag.y=30; + has_tile_callbacks=false; + health=3; + state=s_normal; + + add_sfx("move", Registry.sound_data.gasguy_move); + add_sfx("shoot", Registry.sound_data.gasguy_shoot); + + tm_move_sound=1.5 + Math.random(); + } + + private var ticks:Int=0; + override public function update():Void + { + + t_move_sound +=FlxG.elapsed; + if(t_move_sound>tm_move_sound && visible){ + t_move_sound=0; + play_sfx("move"); + } + + if(initial_latency>0){ + initial_latency -=FlxG.elapsed; + return; + } + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + var gas:FlxSprite; + + ticks +=1; + for(gas in gas_group.members){ + + //broom reduces gas lifepan + if(ticks==3){ + if(player.broom.visible && player.broom.overlaps(gas)){ + gas.alpha -=0.025; + } + gas.alpha -=0.003; + } + //use sin table or dont dum + // gas.scale.x=1 + 0.25*Math.sin(12 *(t / tm)); + // gas.scale.y=1 + 0.25*Math.sin(6 *(t / tm)); + if(gas.alpha>0.3 && gas.visible && gas.overlaps(player)){ + player.sig_reverse=true; + } + } + if(ticks==3)ticks=0; + + if(state==s_dead)return; + + EventScripts.send_property_to(this, "x", player.x, 0.2); + EventScripts.send_property_to(this, "y", player.y, 0.2); + + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + health--; + play_sfx(HURT_SOUND_NAME); + flicker(0.5); + if(health<=0)state=s_dying; + var p:Point=new Point(player.x, player.y); + var _p:Point=new Point(x, y); + EventScripts.scale_vector(p, _p, velocity, 100); + } + + if(player.overlaps(this)){ + if(state !=s_dead){ + player.touchDamage(1); + } + } + + + + //wait a bit befoore shooting again + if(state==s_normal){ + t +=FlxG.elapsed; + + if(t>tm){ + state=s_shoot_latency; + play("release_gas"); + t=0; + } + } else if(state==s_shoot){ + var p1:Point=new Point(player.x, player.y); + var _p1:Point=new Point(x, y); + for(gas in gas_group.members){ + EventScripts.scale_vector(_p1, p1, gas.velocity, 30); + gas.visible=true; + gas.x=x; + gas.y=y; + play_sfx("shoot"); + gas.velocity.x +=(-10 + 20 * Math.random()); + gas.velocity.y +=(-10 + 20 * Math.random()); + gas.alpha=0.8; + } + state=s_normal; + play("float"); + + } else if(state==s_shoot_latency){ + t +=FlxG.elapsed; + if(t>tm_shoot_latency){ + t=0; + state=s_shoot; + } + } else if(state==s_dying){ + Registry.GRID_ENEMIES_DEAD++; + + EventScripts.drop_big_health(x, y, 0.6); + EventScripts.make_explosion_and_sound(this); + + xml.@alive="false"; + state=s_dead; + alive=false; + visible=false; + } + + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Rat.hx b/intra/source/entity/enemy/apartment/Rat.hx new file mode 100644 index 0000000..f0800fa --- /dev/null +++ b/intra/source/entity/enemy/apartment/Rat.hx @@ -0,0 +1,213 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Dust; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.system.FlxTile; + +/** + * ... + * @author Seagaia + */ +class Rat extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/apartment/rat.png")] public static var rat_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var move_vel:Int=40; + private var lookahead:FlxSprite=new FlxSprite(); + private var pp_off:Point=new Point(0, 0);//pin point for lookahead + + public var cid:Int=CLASS_ID.RAT; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_dying:Int=1; + private var s_dead:Int=2; + + private var do_rotations:Bool=false; + + private var hurt_box:FlxSprite=new FlxSprite; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + solid=false; + + loadGraphic(rat_sprite, true, false, 16, 16); + var o:Int=(Registry.CURRENT_MAP_NAME=="TRAIN")? 6:0; + addAnimation("up", [o+4, o+5], 5); + addAnimation("down", [o+0, o+1], 5); + addAnimation("r", [o+2, o+3], 5);//DEFAULT:RIGHT + addAnimation("l", [o+2, o+3], 5); + /* Flip this boolean if you want rotations instead of separate right/down/up sprites */ + /* If so, rotations assume that the spritesheet is originally facing DOWN */ + do_rotations=false; + + addAnimation("die", [0, 1], 30); + play("down"); + + if(parseInt(xml.@frame)==0){ + play("down"); + facing=DOWN; + velocity.y=move_vel; + + pp_off.x=7; + pp_off.y=18; + y -=20; + } + + width=height=12; + centerOffsets(true); + x +=2; + y +=2; + lookahead.makeGraphic(1, 1, 0x00000000); + lookahead.x=x + pp_off.x; + lookahead.y=y + Registry.HEADER_HEIGHT + pp_off.y; + parent.bg_sprites.add(lookahead); + + hurt_box.makeGraphic(8, 8, 0xff00000); + + add_sfx("move", Registry.sound_data.rat_move); + } + + + /* Rotate, scale the sprite, change the velocity, and set the right anim */ + private function switch_dir(a:FlxTile, b:Dynamic):Void { + if(do_rotations){ + angle=(angle + 90)% 360; + } + play_sfx("move"); + scale.x=1; + switch(facing){ + case DOWN: + play("l"); + + scale.x=-1; + facing=LEFT; + pp_off.x=0; + pp_off.y=8; + velocity.x=-move_vel; + velocity.y=0; + break; + case LEFT: + play("up"); + facing=UP; + pp_off.x=8; + pp_off.y=-2; + velocity.x=0; + velocity.y=-move_vel; + break; + case UP: + play("r"); + facing=RIGHT; + pp_off.x=12; + pp_off.y=8; + velocity.x=move_vel; + velocity.y=0; + break; + case RIGHT: + play("down"); + facing=DOWN; + pp_off.x=8; + pp_off.y=15; + velocity.x=0; + velocity.y=move_vel; + break; + } + } + + override public function preUpdate():Void + { + if(!exists)return; + + if(Registry.is_playstate){ + + /* Check running Into switch pillars */ + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.frame==sp.up_frame && sp.overlaps(lookahead)){ + switch_dir(null, null); + + } + + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + + if(dust.frame !=Dust.EMPTY_FRAME && dust.overlaps(lookahead)){ + switch_dir(null, null); + } + } + + for(var dash_trap:Dash_Trap in Registry.subgroup_dash_traps){ + if(dash_trap==null)continue; + if(dash_trap.overlaps(this)){ + state=s_dying; + } + } + + /* Check for touching a solid tile to turn right */ + var t:FlxTilemap=parent.curMapBuf; + var _x:Int=(lookahead.x % 160)/ 16;//FCK IT + var _y:Int=((lookahead.y - 20)% 160)/ 16; + var tile_idx:Int=t.getTileByIndex(_y * 10 + _x); + var tile:FlxTile=t._tileObjects[tile_idx]; + if(tile.callback !=null || tile.allowCollisions !=NONE){ + switch_dir(null, null); + } + } + super.preUpdate(); + } + + + override public function update():Void + { + lookahead.x=x + pp_off.x; + lookahead.y=y + pp_off.y; + if(state==s_normal){ + if(player.broom.visible && player.broom.overlaps(this)){ + state=s_dying; + } + } else if(state==s_dying){ + //play("die"); + //alpha -=0.025; + alpha=0; + if(alpha==0){ + state=s_dead; + if(parent.state !=parent.S_TRANSITION){ + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + EventScripts.drop_small_health(x, y, 0.5); + } + } + + } + + if(state==s_dead){ + exists=false; + } + + hurt_box.x=x + 4; + hurt_box.y=y + 4; + if(!player.invincible && player.overlaps(hurt_box)&& player.state==player.S_GROUND){ + player.touchDamage(1); + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Silverfish.hx b/intra/source/entity/enemy/apartment/Silverfish.hx new file mode 100644 index 0000000..54dbf70 --- /dev/null +++ b/intra/source/entity/enemy/apartment/Silverfish.hx @@ -0,0 +1,282 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.gadget.Gate; +import entity.gadget.Switch_Pillar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Silverfish extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/apartment/silverfish.png")] public static var silverfish_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_seen:Int=1; + private var s_turning:Int=2; + private var s_dying:Int=3; + private var s_gas:Int=4; + + private var t_turn:Float=0; + private var tm_turn:Float=0.8; + + private var vel:Int=50; + private var death_timer:Float=0.7; + private var seen_distance:Float=30;// + + private var init_latency:Float=1.0; + + public var cid:Int=CLASS_ID.SILVERFISH; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Add silverifsh adnimations*/ + loadGraphic(silverfish_sprite, true, false, 16, 16); + addAnimation("move_l", [6, 7], 7, true); + addAnimation("move_d", [4, 5], 7, true); + addAnimation("move_r", [6, 7], 7, true);// DEFAULT:RIGHT + addAnimation("move_u", [8, 9], 7, true); + addAnimation("idle_d", [4], 12, true); + addAnimation("idle_u", [8], 12, true); + addAnimation("idle_r", [6], 12, true);// DEFAULT:RIGHT + addAnimation("idle_l", [6], 12, true); + + + + + + //addAnimation("die", [4, 5], 30, true); + + // LDRU + switch(parseInt(xml.@frame)){ + case 0: + play("idle_l"); + scale.x=-1; + facing=LEFT;break; + case 1: + play("idle_d"); + facing=DOWN;break; + case 2: + play("idle_r"); + facing=RIGHT;break; + case 3: + play("idle_u"); + facing=UP;break; + } + + add_sfx("move", Registry.sound_data.sf_move); + } + + + override public function preUpdate():Void + { + + if(FlxG.collide(this, parent.curMapBuf)&& state==s_seen){ + state=s_turning; + } + for(var gate:Gate in Registry.subgroup_gates){ + if(gate==null)continue; + if(FlxG.collide(gate, this)&& state==s_seen){ + state=s_turning; + } + } + super.preUpdate(); + } + override public function update():Void + { + + if(y0){ + init_latency -=FlxG.elapsed; + return; + } + // get hurt + if(player.broom.visible && player.broom.overlaps(this)&& state !=s_dying){ + state=s_dying; + } + + //hurt player + if(player.overlaps(this)){ + player.touchDamage(1); + } + + //get gased maybe + if(state !=s_gas){ + for(var gas:FlxSprite in Registry.subgroup_gas){ + if(gas==null || !gas.visible)continue; + if(gas.alpha>0.3 && gas.overlaps(this)){ + state=s_gas; + play_sfx("move"); + drag.x=drag.y=10; + var p:Point=new Point(player.x, player.y); + var _p:Point=new Point(x, y); + EventScripts.scale_vector(_p, p, velocity, 70); + EventScripts.face_and_play(this, player, "move"); + if(facing !=LEFT){ + scale.x=1; + } else { + scale.x=-1; + } + + + } + } + + } + + + + + + if(state==s_normal){ + if(sees(player)||(EventScripts.distance(player,this)tm_turn){ + t_turn=0; + scale.x=1; + if(facing & LEFT){ + facing=UP; + } else if(facing & UP){ + facing=RIGHT; + } else if(facing & RIGHT){ + facing=DOWN; + } else if(facing & DOWN){ + facing=LEFT; + scale.x=-1; + } + } else if(sees(player)||(EventScripts.distance(player, this)0 && sp.x>x){ + yes=true; + } else if(velocity.x<0 && sp.x0 && sp.y>y){ + yes=true; + } else if(velocity.y<0 && sp.yy)&&(o.yx &&(o.y + o.height>y)&&(o.yx))return true; + } else { + if((o.y>y + height)&&(o.xx))return true; + } + return false; + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Splitboss.hx b/intra/source/entity/enemy/apartment/Splitboss.hx new file mode 100644 index 0000000..6c83b0d --- /dev/null +++ b/intra/source/entity/enemy/apartment/Splitboss.hx @@ -0,0 +1,653 @@ +package entity.enemy.apartment +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +class Splitboss extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var added_to_parent:Bool=false; + private var white_overlay:FlxSprite; + + + private var DETHBALLZ:FlxGroup=new FlxGroup(12); + private var copies:FlxGroup=new FlxGroup(2); + private var copy_1:FlxSprite; + private var copy_2:FlxSprite; + + private var is_damaged:Bool=false; + private var t_damaged:Float=0; + private var tm_damaged:Float=0.8; + + + public var state:Int=0; + private var s_dead:Int=-2; + private var s_dying:Int=-1; + private var s_intro:Int=0; + + private var s_dethballz:Int=1; + private var s_dethballz_times_shot:Int=0; + private var h_dethballz_counts:Array=new Array(2, 1, 4); + private var h_dethballz_shots:Array=new Array(4, 10, 7); + private var h_dethballz_timeouts:Array=new Array(0.7, 0.2, 0.8); + private var t_dethballz:Float=0; + private var dethball_queue:Array=new Array(); + + private var s_h_dash:Int=2; + private var Y_OFF_R_DASH:Int=6; + private var h_dash_vel:Array=new Array(80, 100, 120); + private var h_dash_ball_vel:Array=new Array(80, 100, 120); + private var h_dashes_done:Int=0; + private var nr_dashes:Array=new Array(2, 3, 4); + private var h_dash_ball_pos:Array=new Array(1, 4); + private var t_h_dash:Float=0; + private var tm_h_dash:Float=0.5; + private var nr_dropped:Int=0; + private var nr_to_drop:Array=new Array(2, 3, 4); + private var next_drop:Float=0; + + private var s_split:Int=3; + private var t_split:Float=0; + private var split_vels:Array=new Array(40, 50, 60); + + + public var phase:Int=0; + + + private var MAX_HEALTH:Int=12; + private var PHASE_2_HEALTH:Int=8; + private var PHASE_3_HEALTH:Int=4; + private var AREA_TILE_W:Int=6; + private var AREA_TILE_H:Int=5; + + + private var tl:Point=new Point();//top left of movable area(2,2)in this case, relative to rooom + public var ctr:Int=0; + + + //[Embed(source="../../../res/sprites/enemies/apartment/splitboss.png")] public static var splitboss_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/apartment/splitboss_fireball.png")] public static var splitboss_fireball_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + solid=false; + solid=false; + immovable=true; + + tl.x=160 * Registry.CURRENT_GRID_X + 32; + tl.y=160 * Registry.CURRENT_GRID_Y + Registry.HEADER_HEIGHT + 48; + + health=MAX_HEALTH + 1; + + /* Make bullets(shuriken)*/ + for(i in 0...DETHBALLZ.maxSize){ + var DETHBALL:FlxSprite=new FlxSprite; + DETHBALL.loadGraphic(splitboss_fireball_sprite, true, false, 16, 16); + DETHBALL.height=DETHBALL.width=6; + DETHBALL.centerOffsets(true); + DETHBALLZ.add(DETHBALL); + DETHBALL.addAnimation("pulsate", [0, 1, 2, 3], 12);// IDLE + DETHBALL.addAnimation("shoot", [0, 1, 2, 3], 12,true);// MOVING + DETHBALL.addAnimation("fizzle", [4, 5, 6, 7], 12, false);//DISAPEPARING + } + DETHBALLZ.setAll("exists", false); + + /* Make sprite and copies */ + loadGraphic(splitboss_sprite, true, false, 24, 32); + width -=8; + height -=12; + centerOffsets(true); + + addAnimation("float", [0, 1, 2, 1], 5);//facing downwards, idle + addAnimation("idle_r", [4, 5, 6, 5], 5); + addAnimation("dash_r", [10, 11], 8); + addAnimation("dash_d", [8, 9], 8); + addAnimation("die", [0, 3], 14); + play("float"); + + for(i=0;itm_damaged){ + is_damaged=false; + } + } + + /* Determine behavior */ + if(state==s_dethballz){ + do_h_dethballz(); + } else if(state==s_h_dash){ + do_h_dash(); + } else if(state==s_split){ + do_split(); + } else if(state==s_intro){ + do_intro(); + } else if(state==s_dying){ + + if(ctr==0){ + DH.start_dialogue(DH.name_splitboss, DH.scene_splitboss_after_fight, "APARTMENT"); + ctr++; + + } else if(ctr==1){ + if(DH.a_chunk_just_finished()){ + ctr++; + Registry.sound_data.big_door_locked.play(); + } + } else { + Registry.volume_scale -=0.005; + flicker(0.1); + play("die"); + var tm_split:Float=5; + t_split -=FlxG.elapsed; + x=tl.x + 40; + y=tl.y + 40; + var r:Float=-65 *(1 -(t_split /tm_split)); + x +=(r + Math.random()* -2 * r); + y +=(r + Math.random()* -2 * r); + + white_overlay.alpha=(1 -(t_split / tm_split)); + for(var dethball:FlxSprite in DETHBALLZ.members){ + if(dethball==null)continue; + dethball.alpha -=0.05; + } + copy_1.alpha -=0.1; + copy_2.alpha -=0.1; + + if(t_split<0){ + state=s_dead; + Registry.sound_data.stop_current_song(); + Registry.volume_scale=1; + + // + Registry.sound_data.start_song_from_title("APARTMENT"); + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]=true; + visible=false; + xml.@alive="false"; + + } + } + } else if(state==s_dead){ + white_overlay.alpha -=0.05; + if(white_overlay.alpha==0){ + exists=false; + } + } + + super.update(); + } + + private function do_h_dash():Void { + + var DETHBALL:FlxSprite; + if(ctr==0){ + play("idle_r"); + offset.y=Y_OFF_R_DASH; + alpha -=0.1; + if(alpha==0){ + x=tl.x - 32; + y=player.y; + velocity.x=0; + ctr=1; + } + } else if(ctr==1){ + alpha +=0.15; + y=player.y; + if(alpha==1){ + t_h_dash +=FlxG.elapsed;// y-track the player as a warning + if(t_h_dash>tm_h_dash){ + t_h_dash=0; + ctr=2; + play("dash_r"); + play_sfx("dash"); + velocity.x=h_dash_vel[phase]; + next_drop=tl.x + 16 * Math.random(); + } + } + } else if(ctr==2){ + + offset.y=player.offset.y - player.DEFAULT_Y_OFFSET + Y_OFF_R_DASH; + if(nr_droppednext_drop &&(x>tl.x && xtl.x + 16*8){ //when far enough, dash aagain, or state change + alpha -=0.1; + if(alpha==0){ + nr_dropped=0; + h_dashes_done++; + if(h_dashes_done>=nr_dashes[phase]){ + ctr=3; + h_dashes_done=0; + for(DETHBALL in DETHBALLZ.members){ + if(DETHBALL.exists){ + DETHBALL.play("shoot"); + } + } + } else { + ctr=0; + } + } + } + for(DETHBALL in DETHBALLZ.members){ + DETHBALL.flicker(0.05); + } + + } else if(ctr==3){ + t_h_dash +=FlxG.elapsed; + if(t_h_dash0.6){ + state=s_dethballz; + } else if(r>0.3){ + state=s_split; + } else { + state=s_h_dash; + } + ctr=0; + } + } + private function do_h_dethballz():Void { + var iter:Int=0; + var len:Int=0; + var DETHBALL:FlxSprite; + + /***********/ + /*H_DETHBALLZ*/ + /***********/ + if(ctr==0){ + play("float"); + velocity.x=0; + x=tl.x + 40; + y=tl.y - 32; + /* Set number of balls to appear, and their positions.*/ + var tx:Int=Std.int(6 * Math.random()); + play_sfx("shoot"); + for(iter=0;iterh_dethballz_timeouts[phase]){ + //sfx pew pew + len=dethball_queue.length; + for(iter=0;iter=h_dethballz_shots[phase]){ + ctr=2; + s_dethballz_times_shot=0; + } + } + } else if(ctr==2){ + if(DETHBALLZ.countExisting()==0){ + ctr=0; + var r:Float=Math.random(); + if(r>0.63){ + state=s_h_dash; + } else if(r>0.38){ + state=s_dethballz; + } else { + state=s_split; + } + } + } + + /* Boilerplate overlap with player code. */ + if(!player.invincible && player.state !=player.S_AIR){ + for(DETHBALL in DETHBALLZ.members){ + if(DETHBALL !=null && DETHBALL.exists){ + if(DETHBALL._curAnim.name=="fizzle" &&(DETHBALL._curFrame==DETHBALL._curAnim.frames.length - 1)){ + DETHBALL.exists=false; + DETHBALL.velocity.y=0; + } + if(!player.invincible && player.overlaps(DETHBALL)){ + player.touchDamage(1); + //sfx fizzle + DETHBALL.play("fizzle"); + } + if(DETHBALL.y>tl.y + AREA_TILE_H * 16){ + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + DETHBALL.play("fizzle"); + } + } + } + } + } + + private function do_split():Void { + if(ctr==0){ // move to top of playing area and flicker + centerOffsets(true); + play("float"); + x=tl.x + 40; + y=tl.y - 16; + ctr++; + flicker(1.5); + visible=true; + + } else if(ctr==1){ //when hit, split Into three + if(player.broom.visible && player.broom.overlaps(this)){ + play_sfx("split"); + alpha=copy_1.alpha=copy_2.alpha=1; + copy_1.x=copy_2.x=x; + copy_1.y=copy_2.y=y; + velocity.y=-40; + copy_1.visible=copy_2.visible=true; + copy_1.velocity.x=-40;// copy 1 faces left + copy_2.velocity.x=40;// copy 2 faces right + copy_1.play("idle_r");copy_1.scale.x=-1; + copy_2.play("idle_r"); + copy_1.offset.y=copy_2.offset.y=Y_OFF_R_DASH; + ctr++; + } + } else if(ctr==2){ //fade out while moving + alpha -=0.02; + copy_1.alpha=copy_2.alpha=alpha; + if(alpha==0){ + copy_1.velocity.x=copy_2.velocity.x=velocity.x=0; + copy_1.velocity.y=copy_2.velocity.y=velocity.y=0; + ctr++; + alpha=copy_1.alpha=copy_2.alpha=0.7; + t_split=1.0; + } + } else if(ctr==3){ //pin to the player and successively dash + x=player.x;y=player.y - 24; + t_split -=FlxG.elapsed; + if(t_split<0){ //flicker for a bit before dashing + copy_1.flicker(0.2); + copy_2.flicker(0.2); + if(t_split<-0.7){ + ctr++; + copy_1.play("dash_r"); + copy_2.play("dash_r"); + } + } else { + copy_1.x=player.x + 25;copy_1.y=player.y; + copy_2.x=player.x - 25;copy_2.y=player.y; + } + } else if(ctr==4){ //dash the copies horizontally + copy_1.velocity.x=-split_vels[phase]; + copy_2.velocity.x=split_vels[phase]; + play_sfx("dash"); + if(player.overlaps(copy_1)|| player.overlaps(copy_2)){ + player.touchDamage(1); + } + x=player.x;y=player.y - 24; + copy_1.alpha -=0.02; + copy_2.alpha=copy_1.alpha; + if(copy_1.alpha==0){ // give a warning for the boss + ctr++; + copy_1.velocity.x=copy_2.velocity.x=0; + flicker(1); + } + + } else if(ctr==5){ // when warning done, dash + if(!flickering){ + play_sfx("dash"); + play("dash_d"); + velocity.y=split_vels[phase]; + alpha -=0.02; + if(alpha==0){ + alpha=1; + ctr++; + velocity.y=0; + } + } + } else if(ctr==6){ //determine next attack + play("float"); + var r:Float=Math.random(); + ctr=0; + if(phase<=1){ + if(r<=0.3){ + state=s_h_dash; + } else if(r<=0.7){ + state=s_dethballz; + } else { + state=s_split; + } + } else { + if(r<=0.5){ + state=s_h_dash; + } else if(r<=0.75){ + state=s_dethballz; + } else { + state=s_split; + } + } + } + return; + } + + + private function do_intro():Void { + var sub_ctr:Int=0; + if(ctr==0){ + x=tl.x + 48 -(width / 2); + y=tl.y + 32; + Registry.volume_scale -=0.005; + if(player.broom.visible && player.broom.overlaps(this)){ + ctr=1; + DH.start_dialogue(DH.name_splitboss, DH.scene_splitboss_before_fight, "APARTMENT"); + } + } else if(ctr==1){ + + if(DH.a_chunk_just_finished()){ + play_sfx("split"); + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + visible=false; + copy_1.visible=true; + copy_2.visible=true; + copy_1.x=copy_2.x=x; + copy_1.y=copy_2.y=y; + copy_1.velocity.x=-50; + copy_2.velocity.x=50; + ctr=2; + } + } else if(ctr==2){ + copy_1.alpha -=0.01; + copy_2.alpha -=0.01; + if(copy_1.alpha==0 && copy_2.alpha==0){ + ctr=3; + alpha=0; + copy_1.y=y=copy_2.y=tl.y - 32; + copy_1.x=x - 40; + copy_2.x=x + 40; + copy_1.velocity.x=copy_2.velocity.x=0; + visible=true; + } + } else if(ctr==3){ + alpha +=0.01; + copy_1.alpha=copy_2.alpha=alpha; + if(alpha==1){ + ctr=4; + } + } else if(ctr==4){ + copy_1.flicker(0.5);copy_2.flicker(0.5);flicker(0.5); + if(EventScripts.send_property_to(copy_1, "x", x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(copy_2, "x", x, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr=5; + copy_1.visible=copy_2.visible=false; + } + } else { + ctr=0; + visible=true; + state=s_dethballz; + } + } + + override public function destroy():Void + { + DH.dont_need_recently_finished(); + parent.sortables.remove(copies, true); + super.destroy(); + } + + } \ No newline at end of file diff --git a/intra/source/entity/enemy/apartment/Teleguy.hx b/intra/source/entity/enemy/apartment/Teleguy.hx new file mode 100644 index 0000000..07a6894 --- /dev/null +++ b/intra/source/entity/enemy/apartment/Teleguy.hx @@ -0,0 +1,211 @@ +package entity.enemy.apartment +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Teleguy extends FlxSprite +{ + + public var xml:XML; + private var player:Player; + private var parent:Dynamic; + + + public var state:Int=0; + private var s_idle:Int=0 + private var s_teleporting:Int=1; + private var ctr:Int=0; + private var t_ctr:Float=0; + + + private var s_attacking:Int=2; + private var atk_pt:Point=new Point; + private var attack_speed:Float=0.9; + + private var s_dying:Int=3; + private var s_dead:Int=4; + + public var cid:Int=CLASS_ID.TELEGUY; + + //[Embed(source="../../../res/sprites/enemies/apartment/teleport_guy.png")] public var teleguy_sprite:Class; + + public function new(_x:XML, _p:Player, _pa:Dynamic) + { + + xml=_x; + player=_p; + parent=_pa; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(teleguy_sprite, true, false, 16, 24); + offset.y=6; + height=16; + + /* Add animations */ + addAnimation("idle_d", [0,1], 3); + addAnimation("idle_r", [2,3], 3);//DEFAULT:RIGHT + addAnimation("idle_u", [4,5], 3); + addAnimation("idle_l", [2,3], 3); + addAnimation("poof", [6,7,8,9],12,false); + addAnimation("unpoof", [8,7,6], 12,false); + addAnimation("dying", [0]); + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + state=s_dead; + alive=false; + } + health=1; + //FlxG.watch(this, "state", "teleguy state"); + + add_sfx("up", Registry.sound_data.teleguy_up); + add_sfx("down", Registry.sound_data.teleguy_down); + } + + + override public function update():Void + { + + if(alive && player.overlaps(this)){ + player.touchDamage(1); + } + + //Cleanup before death logic + if(health<=0 && state !=s_dead && state !=s_dying){ + t_ctr=2; + play("dying"); + state=s_dying; + xml.@alive="false"; + alive=false; + } + + // Idle until attacked + if(state==s_idle){ + scale.x=1; + /* Get the direction to the player and face that way*/ + switch(EventScripts.get_entity_to_entity_dir(x + 8, y + 16, player.x + 5, player.y + 7)){ + case UP: + play("idle_u"); + break; + case DOWN: + play("idle_d"); + break; + case RIGHT: + play("idle_r"); + break; + case LEFT: + play("idle_l"); + scale.x=-1; + break; + } + if(player.broom.visible && player.broom.overlaps(this)){ + state=s_teleporting; + } + + } else if(state==s_teleporting){ + if(ctr==0){ + play_sfx("up"); + play("poof");//goesto invisible + t_ctr=0.5; + ctr++; + alive=false; + } else if(ctr==1){ + /* Move behind player, set the point to dash attack to */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + atk_pt.x=x; + atk_pt.y=y; + teleport(); + play_sfx("down"); + play("unpoof");// ends on teleport thing almost done + ctr++; + t_ctr=0.5 + } + } else if(ctr==2){ + /* Face the player before dashing */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + alive=true; + scale.x=1; + if(facing==LEFT){ + play("idle_l"); + scale.x=-1; + } + if(facing==RIGHT)play("idle_r"); + if(facing==DOWN)play("idle_d"); + if(facing==UP)play("idle_u"); + ctr++; + } + } else if(ctr==3){ + ctr=0; + //sfx atack + state=s_attacking; + t_ctr=1.5; + } + } else if(state==s_attacking){ + /* Move to the attack pooint, if attacked, then start teleporting again */ + t_ctr -=FlxG.elapsed; + if(t_ctr<0){ + state=s_idle; + } else { + if(player.broom.visible && player.broom.overlaps(this)){ + if(Math.random()<0.5){ + state=s_teleporting; + } else { + flicker(1); + state=s_idle; + play_sfx(HURT_SOUND_NAME); + health--; + } + } + } + + EventScripts.send_property_to(this, "x", atk_pt.x, attack_speed); + EventScripts.send_property_to(this, "y", atk_pt.y, attack_speed); + } else if(state==s_dying){ + //t_ctr -=FlxG.elapsed; + //flicker(1); + t_ctr=-0.1; + if(t_ctr<0){ + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + } + } else if(state==s_dead){ + exists=false; + } + + super.update(); + } + + private function teleport():Void { + + if(player.facing==LEFT){ + x=player.x + 16; + y=player.y + facing=LEFT; + } else if(player.facing==RIGHT){ + x=player.x - 16; + y=player.y; + facing=RIGHT; + } else if(player.facing==UP){ + x=player.x; + y=player.y + 17; + facing=UP; + } else if(player.facing==DOWN){ + x=player.x; + y=player.y - 16; + facing=DOWN; + } + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/bedroom/Annoyer.hx b/intra/source/entity/enemy/bedroom/Annoyer.hx new file mode 100644 index 0000000..793bb67 --- /dev/null +++ b/intra/source/entity/enemy/bedroom/Annoyer.hx @@ -0,0 +1,324 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.enemy.circus.Lion; +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.SpriteFactory; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Annoyer extends FlxSprite +{ + + public var xml:XML; + //[Embed(source="../../../res/sprites/enemies/annoyer.png")] public static var S_ANNOYER_SPRITE:Class; + public var target:Player; + + private var state:Int=-1; + + private var S_WAIT:Int=-1; + private var S_APPROACH:Int=0; + private var S_CIRCLE:Int=1; + private var S_ATTACK:Int=2; + private var S_DEAD:Int=3; + private var S_HIT:Int=4; + private var hit_timer:Float=0.25; + + private var WAIT_TIMER_MAX:Float=0.25; + private var APPROACH_DISTANCE:Int=64; + private var CIRCLE_DISTANCE:Int=24; + private var wait_timer:Float=0.25; + private var CIRCLE_TIMER_MAX:Float=3.00; + private var circle_timer:Float=3.00; + private var swoop_to_point:Point=new Point(0, 0); + + private var rotate_radius:Float=20; + private var rotate_velocity:Float=0.14; + + private var just_hit_timer:Float=0.4; + private var just_hit:Bool=false; + public var cid:Int=CLASS_ID.ANNOYER; + + public var INCREMENTED_REG:Bool=false; + public var parent:Dynamic; + + + private var frame_type:Int=0; + private var T_NORMAL:Int=0; + private var T_SUPER:Int=2; + + private var fireballs:FlxGroup=new FlxGroup(4); + private var t_fireball:Float=0; + private var tm_fireball:Float=2.3; + private var vel_fireball:Int=30; + + + public function new(x:Int,y:Int,_xml:XML,_player:Player,_parent:Dynamic) + { + super(x, y); + xml=_xml; + target=_player; + loadGraphic(S_ANNOYER_SPRITE, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("flap", [6, 7], 4, true); + } else if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("flap", [8, 9], 8, true); + } else if(parseInt(xml.@frame)==T_SUPER){ + addAnimation("flap", [12,13,14,15,16,17], 8, true); + } else { + addAnimation("flap", [0, 1, 2, 3,4,5], 8, true); + } + play("flap"); + height=7; + width=8; + solid=false; + offset.x=3; + offset.y=2; + health=1; + parent=_parent; + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + + } + + if(parseInt(xml.@frame)==T_SUPER){ + frame_type=T_SUPER; + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + fireball.loadGraphic(Lion.lion_fireball_sprite, true, false, 16, 16); + fireball.width=fireball.height=8; + fireball.centerOffsets(true); + fireballs.add(fireball); + fireball.addAnimation("shoot",[0, 1], 8); + fireball.addAnimation("poof",[2,3,4,5], 8,false); + fireball.play("shoot"); + } + fireballs.setAll("visible", false); + fireballs.setAll("alive", false); + + parent.fg_sprites.add(fireballs); + health=2; + } + } + + + override public function update():Void { + var dx:Float; + var dy:Float; + if(just_hit){ + just_hit_timer -=FlxG.elapsed; + if(just_hit_timer<0 && state !=S_DEAD){ + state=S_WAIT; + velocity.x=velocity.y=0; + just_hit_timer=0.4; + just_hit=false; + } + } + + + + + + if(frame_type==T_SUPER &&(state !=S_DEAD)){ + var fireball:FlxSprite; + t_fireball +=FlxG.elapsed; + if(t_fireball>tm_fireball){ + t_fireball=0; + fireball=fireballs.getFirstDead()as FlxSprite; + if(fireball==null)return; + + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + fireball.x=x;fireball.y=y; + fireball.alpha=1; + EventScripts.scale_vector(new Point(x, y), new Point(target.x, target.y), fireball.velocity, vel_fireball); + fireball.visible=fireball.alive=true; + fireball.play("shoot"); + } + + for(fireball in fireballs.members){ + + if(fireball._curAnim !=null && fireball._curAnim.name !="poof"){ + if(fireball.alpha<0.9 && !target.invincible && fireball.alive && target.overlaps(fireball)){ + target.touchDamage(1); + fireball.play("poof"); + } + fireball.alpha -=0.002; + if(fireball.alpha<=0.6){ + fireball.play("poof"); + } + + if(target.broom.overlaps(fireball)&& target.broom.visible){ + fireball.play("poof"); + Dust.dust_sound.play(); + } + } else { + if(fireball.finished){ + fireball.alive=fireball.visible=false; + } + } + } + + + + } + + + if(overlaps(target)){ + if(xml.@alive !="false"){ + target.touchDamage(1); + } + } + if(target.broom.overlaps(this)&& target.broom.visible){ + hit("broom", target.broom.root.facing); + } + + + if(parent.state==parent.S_TRANSITION){ + state=S_WAIT; + } + + + switch(state){ + case S_WAIT: + wait_timer -=FlxG.elapsed; + if(wait_timer<0){ + wait_timer=WAIT_TIMER_MAX; + dx=x - target.x; + dy=y - target.y; + + if(Math.sqrt(dx * dx + dy * dy)(Registry.CURRENT_GRID_X + 1)* 160 - 16)x=(Registry.CURRENT_GRID_X + 1)* 160 - 16; + if(y<(Registry.CURRENT_GRID_Y * 160)+ 20)y=Registry.CURRENT_GRID_Y * 160 + 20; + if(y>(Registry.CURRENT_GRID_Y + 1)* 160 + 20)y=(Registry.CURRENT_GRID_Y + 1)* 160 + 20; + } + + super.update(); + } + + /** + * Note, requires the rotatee to have a "rotate_angle" property + * that will be updated to reflect its progress around the target + */ + private function rotate_about_center_of_sprite(pivot:FlxSprite,rotatee:Dynamic,radius:Float,velocity:Float):Void { + var pivot_x:Float=pivot.x + pivot.width / 2; + var pivot_y:Float=pivot.y + pivot.height / 2; + rotatee.x=Math.cos(rotatee.rotate_angle)*(radius)+ pivot_x - 8; + rotatee.y=Math.sin(rotatee.rotate_angle)*(radius)+ pivot_y - 5; + rotatee.rotate_angle=(rotatee.rotate_angle + velocity)% 6.28; + } + + public function hit(type:String, hit_dir:Int):Int { + if(!just_hit){ + Registry.sound_data.player_hit_1.play(); + switch(hit_dir){ + case UP: + velocity.y=-150;velocity.x=-30 + 60 * Math.random(); + break; + case DOWN: + velocity.y=150; + break; + case LEFT: + velocity.x=-150; + break; + case RIGHT: + velocity.x=150; + break; + } + just_hit=true; + flicker(0.2); + health--; + state=S_APPROACH; + if(health<=0)state=S_HIT; + } + return Registry.HIT_NORMAL; + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/bedroom/Pew_Laser.hx b/intra/source/entity/enemy/bedroom/Pew_Laser.hx new file mode 100644 index 0000000..c62f953 --- /dev/null +++ b/intra/source/entity/enemy/bedroom/Pew_Laser.hx @@ -0,0 +1,188 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.gadget.Dust; +import entity.player.Player; +import global.Registry; +import org.flixel.*; +import states.PlayState; +/** + * ... + * @author Seagaia + */ + +class Pew_Laser extends FlxSprite + +{ + //[embed laser gfx + //[Embed(source="../../../res/sprites/enemies/pew_laser.png")] public static var PEW_LASER:Class; + //[Embed(source="../../../res/sprites/enemies/pew_laser_bullet.png")] public static var PEW_LASER_BULLET:Class; + public var xml:XML; + public var parent:PlayState; + public var bullets:FlxGroup; + public var BULLET_TIMER_MAX:Float=0.5; + public var cur_velocity:Float=0; + public static var BULLET_VELOCITY:Float=40; + public static var BULLET_FAST_VELOCITY:Float=70; + public var bullet_timer:Float=1; + + private var dir_type:Int; + private static var T_DOWN:Int=0; + private static var T_RIGHT:Int=1; + private static var T_UP:Int=2; + private static var T_LEFT:Int=3; + private static var T_FAST_DOWN:Int=4; + private static var T_FAST_RIGHT:Int=5; + private static var T_FAST_UP:Int=6 + private static var T_FAST_LEFT:Int=7; + + private var draw_fix:Bool=false; + private var latency_ticks:Int=3; + + public var cid:Int=CLASS_ID.PEW_LASER; + public function new(X:Float, Y:Float, _xml:XML,_parent:PlayState) + { + super(X, Y); + xml=_xml; + + //determine frame/animations + loadGraphic(PEW_LASER, true, false, 16, 16); + + if(parseInt(xml.@frame)>3){ + cur_velocity=BULLET_FAST_VELOCITY; + } else { + cur_velocity=BULLET_VELOCITY; + } + + dir_type=parseInt(xml.@frame); + immovable=true; + solid=false; + bullets=new FlxGroup(5); + parent=_parent; + for(i in 0...5){ + var bullet:FlxSprite=new FlxSprite(x, y); + bullet.loadGraphic(PEW_LASER_BULLET, true, false, 16, 8); + bullet.exists=false; + bullet.has_tile_callbacks=false; + bullet.width=12; + bullet.height=8; + bullets.add(bullet); + bullet.addAnimation("a", [0, 1], 8, true); + bullet.addAnimation("b", [4, 5, 6, 7], 8, false); + bullet.play("a"); + } + parent.fg_sprites.add(bullets); + + + + + + switch(parseInt(xml.@frame)% 4){ + case 0:frame=0;break; + case 1:frame=1;bullets.setAll("angle", 270);break; + case 2:frame=2;bullets.setAll("angle", 180);break; + case 3:frame=3; + bullets.setAll("angle", 90);bullets.setAll("width", 8); + bullets.setAll("height", 16); bullets.setAll("offset", new FlxPoint(2,-4)); + break; + } + + } + + override public function destroy():Void { + //taken care of in remove_otehrobjects etc + super.destroy(); + } + + public function bullet_on_map(b:FlxSprite, m:FlxTilemap):Void { + + b.play("b"); + } + override public function update():Void { + bullet_timer -=FlxG.elapsed; + + latency_ticks--; + if(latency_ticks>0){ + FlxG.collide(bullets, parent.curMapBuf, bullet_on_map); + } else { + latency_ticks=3; + } + + /*if(!draw_fix){ + draw_fix=true; + var idx1:Int=parent.members.indexOf(bullets.members[0]); + parent.members.splice(parent.members.indexOf(this), 1); + parent.members.splice(idx1, 0, this); + }*/ + + for(j in 0...bullets.members.length){ + var b1:FlxSprite=bullets.members[j]; + if((b1.yparent.lowerBorder)|| + (b1.x + b1.width>parent.rightBorder)||(b1.x0)&& bullets.members[i]._curAnim.name=="a"){ + if(bullets.members[i].overlaps(parent.statefuls[ka])){ + parent.statefuls[ka].hit("Pew_Laser", 0); + bullets.members[i].velocity.x=bullets.members[i].velocity.y=0; + bullets.members[i].play("b"); + bullets.members[i].solid=false; + } + } + } + if(parent.player.overlaps(bullets.members[i])&& bullets.members[i].exists){ + parent.player.touchDamage(1, "zap"); + bullets.members[i].play("b"); + bullets.members[i].velocity.x=bullets.members[i].velocity.y=0; + bullets.members[i].solid=false; + + } + } + if(bullet_timer<0){ + Registry.sound_data.play_sound_group(Registry.sound_data.laser_pew_group); + var b:FlxSprite=bullets.getFirstAvailable()as FlxSprite; + if(b !=null){ + b.exists=true; + b.solid=true; + b.play("a"); + switch(dir_type){ + case T_DOWN:case T_FAST_DOWN:b.height=3;b.velocity.y=cur_velocity;b.y=y + 11;b.offset.y=4;b.x=x + 2;b.offset.x=2;break; + case T_UP:case T_FAST_UP:b.height=3;b.velocity.y=-cur_velocity;b.y=y + 8;b.x=x + 2;b.offset.x=2;b.offset.y=1;break; + case T_LEFT:case T_FAST_LEFT:b.width=3;b.velocity.x=-cur_velocity;b.x=x + 8;b.offset.y=-4;b.offset.x=5;break; + case T_RIGHT:case T_FAST_RIGHT:b.y=y + 2;b.offset.y=-2;b.offset.x=9;b.velocity.x=cur_velocity;b.x=x + 2;b.width=3;b.height=12;break; + } + bullet_timer=BULLET_TIMER_MAX; + } + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/bedroom/Shieldy.hx b/intra/source/entity/enemy/bedroom/Shieldy.hx new file mode 100644 index 0000000..2f24941 --- /dev/null +++ b/intra/source/entity/enemy/bedroom/Shieldy.hx @@ -0,0 +1,216 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import entity.gadget.Switch_Pillar; +import entity.player.HealthBar; +import entity.player.HealthPickup; +import entity.player.Player; +import helper.EventScripts; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import global.Registry; +import states.PlayState; +/** + * ... + * @author Seagaia */ +class Shieldy extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/shieldy.png")] public static var SPRITE_SHIELDY:Class; + public var xml:XML; + public var just_hit:Bool=false; + public var hit_timer_max:Float=0.4; + public var hit_timer:Float=0.4; + public var parent:PlayState; + public static var FLOATING_VELOCITY:Int=30; + public static var T_LEFT:Int=4; + public static var T_UP:Int=5; + public static var T_RIGHT:Int=6; + public static var T_DOWN:Int=7; + public var INCREMENTED_REGISTRY:Bool=false; + + public var state:Int; + public static var S_L:Int=0; + public static var S_R:Int=1; + public static var S_U:Int=2; + public static var S_D:Int=3; + public static var S_NOTHING:Int=4; + public var ul_pt:FlxSprite; + public var dr_pt:FlxSprite; + + public var cid:Int=CLASS_ID.SHIELDY; + public var player:Player; + + + public function new(x:Int,y:Int,_xml:XML,_parent:PlayState) + { + super(x +2, y); + xml=_xml; + parent=_parent; + loadGraphic(SPRITE_SHIELDY, true, false, 16, 16); + addAnimation("float", [1, 2, 1, 0], 5, true); + //addAnimation("unhurt", [4], 7, true); + addAnimation("front_hit", [16, 17, 18, 1], 12, false); + addAnimation("back_hit", [13, 1], 12); + //addAnimation("die", [8, 9, 10, 11,14], 10, false); + play("float"); + immovable=true; + solid=true; + height=10; + width=10; + + offset.x=3; + offset.y=4; + health=2; + + switch(parseInt(xml.@frame)){ + case 0:state=S_NOTHING;break; + case T_LEFT:velocity.x=- FLOATING_VELOCITY;state=S_L;break; + case T_RIGHT:velocity.x=FLOATING_VELOCITY;state=S_R;break; + case T_UP:velocity.y=-FLOATING_VELOCITY;state=S_U;break; + case T_DOWN:velocity.y=FLOATING_VELOCITY;state=S_D;break; + } + + ul_pt=new FlxSprite(x, y); + dr_pt=new FlxSprite(x, y + 10); + ul_pt.makeGraphic(10, 1, 0xffff0000); + + dr_pt.makeGraphic(10, 1, 0xffff0000); + player=_parent.player; + + add_sfx("ineffective", Registry.sound_data.shieldy_ineffective); + } + + override public function update():Void { + + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + /* check for hit*/ + if(solid && player.broom.visible && player.broom.overlaps(this)){ + hit("broom", player.facing); + } + /* hurt player */ + if(FlxG.overlap(this, player)){ + player.touchDamage(1); + } + + /* drop health and animate if die */ + if(health<=0 && solid){ + EventScripts.drop_small_health(x,y,0.5); + if(!INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_ENEMIES_DEAD++; + } + EventScripts.make_explosion_and_sound(this); + visible=false; + velocity.y=velocity.x=0; + Registry.sound_data.shieldy_hit.play(); + exists=false; + solid=false; + } + + + if(just_hit){ + hit_timer -=FlxG.elapsed; + if(hit_timer<0){ + hit_timer=hit_timer_max; + just_hit=false; + } + } else { + if(health>0) + play("float"); + } + + /* collide with map and switch dirs */ + ul_pt.x=x; + ul_pt.y=y; + dr_pt.x=x; + dr_pt.y=y + 10; + switch(state){ + case S_R: + if(touches_something()|| FlxG.collide(dr_pt, parent.curMapBuf)){ + state=S_L; + velocity.x=-FLOATING_VELOCITY; + } + break; + case S_L: + if(touches_something()|| FlxG.collide(ul_pt, parent.curMapBuf)){ + state=S_R; + velocity.x=FLOATING_VELOCITY; + } + break; + case S_U: + if(touches_something()|| FlxG.collide(ul_pt, parent.curMapBuf)){ + state=S_D; + velocity.y=FLOATING_VELOCITY; + } + break; + case S_D: + if(touches_something()|| FlxG.collide(dr_pt, parent.curMapBuf)){ + state=S_U; + velocity.y=-FLOATING_VELOCITY; + } + break; + } + + super.update(); + } + + private function touches_something():Bool { + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp==null)continue; + if(sp.overlaps(this)&&(sp.frame==sp.up_frame))return true; + } + return false; + } + + + public function hit(hitter:String, dir_player_facing:Int):Int { + if(hitter=="Pew_Laser"){ + health -=5; + return Registry.HIT_NORMAL; + } + if(dir_player_facing==FlxObject.DOWN && !just_hit){ + Registry.sound_data.shieldy_hit.play(); + just_hit=true; + health --; + flicker(hit_timer_max / 2); + play("back_hit"); + return Registry.HIT_NORMAL; + } else if(!just_hit){ + play("front_hit"); + play_sfx("ineffective"); + var old_x:Int=Std.int(x); + var old_y:Int=Std.int(y); + switch(dir_player_facing){ + case LEFT: + if(x % 160>20){ + x -=8; + } + break; + + case UP: + y -=8;break; + case RIGHT: + if(x % 160<125){ + x +=8; + } + break; + } + just_hit=true; + var tile_type:Int=parent.map.getTile(int(int(x)/ 16), Std.int((int(y)- 20)/ 16)); + if(parent.curMapBuf._tileObjects[tile_type].allowCollisions==FlxObject.ANY){ + x=old_x; + y=old_y; + } + } + return -1; + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/bedroom/Slime.hx b/intra/source/entity/enemy/bedroom/Slime.hx new file mode 100644 index 0000000..aa9fc90 --- /dev/null +++ b/intra/source/entity/enemy/bedroom/Slime.hx @@ -0,0 +1,355 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import entity.gadget.Key; +import entity.player.HealthPickup; +import entity.player.Player; +import flash.geom.Point; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxEmitter; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import org.flixel.FlxG; +import global.Registry; +class Slime extends FlxSprite +{ + //[Embed("../../../res/sprites/enemies/slime.png")] public static var Slime_Sprite:Class; + //[Embed("../../../res/sprites/enemies/bedroom/slime_goo.png")] public var Slime_Goo_Sprite:Class; + //[Embed(source="../../../res/sprites/enemies/slime_bullet.png")] public static inline var embed_slime_bullet:Class; + //[Embed("../../../../../sfx/hit_slime.mp3")] public var Slime_Hit_Sound:Class; + public var slime_hit_sound:FlxSound=new FlxSound(); + + public var local_id:Int; + public var gotHit:Bool=false; + public var hitTimer:Float=0; + public var deathTimer:Float=0; + public var HIT_TIMEOUT:Float=0.3; + public var xml:XML; + + private var state:Int=0; + private var s_dead:Int=1; + private var dropped_health:Bool=false; + + public var type:Int; + public static var NORMAL_T:Int=0; + public static var KEY_T:Int=1; + public static var RISE_T:Int=2; + public static var SUPER_T:Int=3; + + public var played_rise:Bool=false; + public var has_key:Bool=false; + public var cid:Int=CLASS_ID.SLIME; + public var INCREMENTED_REGISTRY:Bool=false; + + public var change_vel_timer:Float=0.5; + public var change_vel_timer_max:Float=0.5; + private var VEL:Int=20; + private var BULLET_VEL:Int=40; + + public var t_shoot:Float=0; + public var tm_shoot:Float=1.8; + public var goo_collide_ticks:Int=4; + + + public var player:Player; + public var parent:Dynamic; + public var goo_group:FlxGroup=new FlxGroup(7); + public var goo_bullets:FlxGroup=new FlxGroup(4); + + public var move_frame_sound_sync:Bool=false; + + public function new(x:Int, y:Int, _local_id:Int, frame_type:Int, _xml:XML, _p:Player,_parent:Dynamic){ + super(x, y); + slime_hit_sound.loadEmbedded(Slime_Hit_Sound, false); + health=2; + loadGraphic(Slime_Sprite, true, false, 16, 16); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("Move", [2,3], 3); + addAnimation("Hurt", [2,8], 15); + addAnimation("Dead", [2, 8, 2, 8, 15, 9, 9], 12, false); + } else { + addAnimation("Move", [0, 1], 3); + addAnimation("Hurt", [0, 8], 15); + addAnimation("Dead", [0, 8, 0, 8, 15, 9, 9], 12, false); + } + addAnimation("Rise", [7, 7, 6, 6, 5, 5, 4, 4, 8, 0, 8, 0], 15, false); + width=height=12; + offset.x=offset.y=2; + if(frame_type !=RISE_T){ + play("Move"); + } else { + visible=false; + solid=true; + } + local_id=_local_id; + xml=_xml; + + if(frame_type==KEY_T){ + has_key=true; + } else if(frame_type==SUPER_T){ + VEL=40; + } + type=frame_type; + + player=_p; + parent=_parent; + + + for(i in 0...goo_group.maxSize){ + var goo:FlxSprite=new FlxSprite(0, 0); + goo.loadGraphic(Slime_Goo_Sprite, true, false, 6, 6); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + goo.addAnimation("move", [4,5,6,7,5,7,5,6,5,4], 5 + Std.int(5 * Math.random())); + } else { + goo.addAnimation("move", [0,1,2,3,1,3,1,2,1,0],5 + Std.int(5*Math.random())); + } + goo.play("move"); + + goo.my_shadow=new FlxSprite(); + goo.my_shadow.makeGraphic(3, 3, 0xff010101); + goo_group.add(goo); + parent.bg_sprites.add(goo.my_shadow); + + goo.exists=goo.my_shadow.exists=false; + goo.velocity.x=Math.random()>0.5 ? -10 - 5 * Math.random():10 + 5 * Math.random(); + goo.velocity.y=Math.random()>0.5 ? -10 - 5 * Math.random():10 + 5 * Math.random(); + goo.parabola_thing=new Parabola_Thing(goo, 16, 0.8 + 0.3 * Math.random(), "offset", "y"); + + } + + for(i=0;i0.5){ + solid=false; + state=s_dead; + goo_group.setAll("velocity", new FlxPoint(0, 0)); + } + } + } else { + + change_vel_timer -=FlxG.elapsed; + if(!gotHit && change_vel_timer<0){ + change_vel_timer=change_vel_timer_max + velocity.x=VEL * Math.random()- VEL/2; + velocity.y=VEL * Math.random()- VEL/2; + if(frame==1){ + velocity.x=velocity.y=0; + } + } else { + if(gotHit){ + hitTimer +=FlxG.elapsed; + } + if(hitTimer>HIT_TIMEOUT){ + play("Move"); + hitTimer=0;gotHit=false; + } + } + } + + /* update goo effect */ + for(var goo:FlxSprite in goo_group.members){ + if(goo !=null && goo.exists){ + if(goo.parabola_thing.tick()){ + if(goo.alpha==1){ + play_sfx("splash"); + } + goo.alpha -=0.01; + goo.my_shadow.exists=false; + goo._curAnim=null; + goo.velocity.x=goo.velocity.y=0; + } else { + goo.my_shadow.x=goo.x; + goo.my_shadow.y=goo.y; + FlxG.collide(goo, parent.curMapBuf); + } + } + } + + /* do bullets, maybe */ + goo_collide_ticks<0 ? goo_collide_ticks=3:goo_collide_ticks --; + if(type==SUPER_T){ + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot){ + t_shoot=0; + goo=goo_bullets.getFirstAvailable()as FlxSprite; + // Only shoot when alive + if(goo !=null && xml.@alive !="false"){ + goo.alpha=1; + goo.exists=true; + goo.x=x;goo.y=y; + play_sfx("shoot"); + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), goo.velocity, BULLET_VEL); + } + } + for(goo in goo_bullets.members){ + if(goo==null || !goo.exists)continue; + if(goo_collide_ticks==0){ + if(FlxG.collide(goo, parent.curMapBuf)){ + goo.exists=false; + } + } + goo.alpha -=0.013; + if(goo.alpha<=0.3){ + goo.exists=false; + goo.velocity.y=goo.velocity.x=0; + + } else { + if(!player.invincible && player.state !=player.S_AIR && goo.overlaps(player)){ + goo.velocity.x=goo.velocity.y=0; + goo.alpha=0; + player.touchDamage(1); + } + } + } + } + super.update(); + } + + /** + * Uh, getting hit. Type is what hits it. Dir is what direction. + * @param type + * @param dir + * @return HIT_NORMAL if died or normal. HIT_KEY if drops key... + */ + + public function hit(type:String, dir:Int):Int { + if(visible==false)return -1; + if(type=="broom" && !gotHit){ + for(i in 0...2){ + var goo:FlxSprite=goo_group.getFirstAvailable()as FlxSprite; + goo.exists=goo.my_shadow.exists=true; + goo.x=x; + goo.y=y; + } + health -=1; + slime_hit_sound.play(); + if(health==0){ + velocity.x=velocity.y=0; + if(!INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + visible=false; + play("Dead"); + } + + if(has_key){ + has_key=false; + gotHit=true; + return Registry.HIT_KEY; + } + + } else { + play("Hurt"); + } + switch(dir){ + + case FlxObject.LEFT: velocity.x=-100;break; + case FlxObject.RIGHT:velocity.x=100;break; + case FlxObject.UP: velocity.y=-100;break; + case FlxObject.DOWN: velocity.y=100;break; + } + } + gotHit=true; + return Registry.HIT_NORMAL; + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/bedroom/Sun_Guy.hx b/intra/source/entity/enemy/bedroom/Sun_Guy.hx new file mode 100644 index 0000000..7369c64 --- /dev/null +++ b/intra/source/entity/enemy/bedroom/Sun_Guy.hx @@ -0,0 +1,635 @@ +package entity.enemy.bedroom +{ +import data.CLASS_ID; +import data.SoundData; +import entity.decoration.Light; +import entity.gadget.Dust; +import entity.player.Player; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import org.flixel.*; +import global.Registry; +import helper.EventScripts; +import flash.geom.Point; +import states.PlayState; + + +class Sun_Guy extends FlxSprite +{ + + /*intro:statue, darkened room, rays of light rotate out of eyes + * then whole room gets lit? + * + * floats, moves horizontally, usually has a force field + * shoots lasers across the screen, you must push dust to block them + * these comes from two orbs + * can only hit him when the orbs are not circling + * can attack the orbs too + * */ + public var xml:XML; + + /* state vars */ + private var times_hurt_player:Int=0; + private var S_INTRO_1:Int=0; + private var S_INTRO_2:Int=6; + private var S_INTRO_0:Int=7; + private var S_HORIZONTAL_FLOAT:Int=1; + private var HF_1:Bool=false; + private var VF_1:Bool=false; + private var S_CHARGE:Int=2; + private var S_CHARGE_CTR:Int=0; + private var S_FIRE_LASER:Int=3; + private var S_DYING:Int=4; + private var S_DYING_CTR:Int=0; + private var S_DEAD:Int=5; + private var S_VERTIFLOAT:Int=8; + private var S_VERTIFLOAT_CTR:Int=0; + + private var STATE:Int; + private var INCREMENTED_REGISTRY:Bool=false; + + public var just_got_hurt:Bool=false; + public var hit_timer:Float=1; + public var HIT_TIMER_MAX:Float=1.5; + + /* other stuff */ + public var dusts:FlxGroup=new FlxGroup(3); + private var dusts_poofed:Bool=false; + /* Lighting for Intro */ + private var light_cone_1:Light; + private var light_cone_2:Light; + + /* entities for dying outr o */ + private var white_overlay:FlxSprite=new FlxSprite(0, 0); + /* Circular protective orbs */ + private var light_orb_1:FlxSprite; + private var light_orb_2:FlxSprite; + private var orb_illum_1:Light; + private var orb_illum_2:Light; + private var sun_guy_wave:FlxSprite; + private var sun_wave_evaporating:Bool=false; + + /* Radii of circulation, rotation velocity(degrees/tick), angle about boss */ + public var lr_1:Float=16; + public var lr_2:Float=32; + public var rv_1:Float=0.05; + public var rv_2:Float=0.04; + private var a_1:Float=0; + private var a_2:Float=0; + + private var MAX_HEALTH:Int=7;//health of boss + private var center_pt:FlxPoint=new FlxPoint(0, 0);//used for rotations + + /* References we need for events/lighting */ + private var player:Player; + private var darkness:FlxSprite; + private var parent:PlayState; + + private var y_timer:Float=0;//For y-oscillations + private var stopped_song:Bool=false; + private var started_song:Bool=false; + private var base_pt:Point;//Spawn point of the boss + + //[Embed(source="../../../res/sprites/enemies/sun_guy.png")] public static var C_SUN_GUY:Class; + //[Embed(source="../../../res/sprites/enemies/light_orb.png")] public static var C_LIGHT_ORB:Class; + //[Embed(source="../../../res/sprites/enemies/sun_guy_wave.png")] public static var C_SUN_GUY_WAVE:Class; + + + private var DEAD_FRAME:Int=4; + public var cid:Int=CLASS_ID.SUN_GUY; + + public function new(_x:Int,_y:Int,_darkness:FlxSprite,_parent:PlayState,_xml:XML,_player:Player) + { + super(_x, _y); + base_pt=new Point(_x, _y); + xml=_xml; + health=MAX_HEALTH; + player=_player; + darkness=_darkness; + immovable=true; + parent=_parent; + if(Registry.FUCK_IT_MODE_ON){ + MAX_HEALTH=1; + xml.@alive="false"; + } + if(xml.@alive=="false"){ + STATE=S_DEAD; + } else { + STATE=S_INTRO_0; + } + + /* Animations for boss */ + loadGraphic(C_SUN_GUY, true, false, 16, 24); + addAnimation("foo", [0, 1, 2, 3, 4], 3); + addAnimation("death_fade", [12, 13, 14, 15, 16, 17, 18,19], 6,false); + play("foo"); + if(STATE==S_DEAD)frame=DEAD_FRAME; + + + light_cone_1=new Light(x - 12, y- 32, darkness, Light.T_CONE_LIGHT, false); + light_cone_2=new Light(x - 6, y - 32, darkness, Light.T_CONE_LIGHT, false); + + /* ANIMS FOR ORBS */ + light_orb_1=new FlxSprite(x - 16, y); + light_orb_2=new FlxSprite(x + 32, y); + + light_orb_1.addAnimation("glow", [0, 1, 2, 3, 4/*, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12*/], 10, true); + light_orb_2.addAnimation("glow", [2, 3, 4, 0, 1/*6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5*/], 10, true); + light_orb_1.play("glow"); + light_orb_2.play("glow"); + + light_orb_1.loadGraphic(C_LIGHT_ORB, true, false, 16, 16); + light_orb_2.loadGraphic(C_LIGHT_ORB, true, false, 16, 16); + light_orb_1.width=light_orb_1.height=light_orb_2.height=light_orb_2.width=12; + light_orb_1.offset.x=light_orb_1.offset.y=2; + light_orb_2.offset.x=light_orb_2.offset.y=2; + orb_illum_1=new Light(x, y, darkness, Light.T_FIVE_FRAME_GLOW, true, light_orb_1, 5, Light.L_SUN_GUY_ORBS); + orb_illum_2=new Light(x, y, darkness, Light.T_FIVE_FRAME_GLOW, true, light_orb_2, 5, Light.L_SUN_GUY_ORBS); + orb_illum_1.base_x_scale=orb_illum_1.base_y_scale=orb_illum_2.base_y_scale=orb_illum_2.base_x_scale=0.8; + orb_illum_1.addAnimation("flicker", [0, 1, 2, 3, 4,3,2,1], 6, true); + orb_illum_2.addAnimation("flicker", [0, 1, 2, 3, 4,3,2,1], 6, true); + orb_illum_1.play("flicker"); + orb_illum_2.play("flicker"); + + /* BIG WAVE ANIMS */ + sun_guy_wave=new FlxSprite(base_pt.x - 50, base_pt.y +8); + + sun_guy_wave.loadGraphic(C_SUN_GUY_WAVE, true, false, 128, 8); + sun_guy_wave.addAnimation("play", [3, 4, 5], 8, true); + sun_guy_wave.addAnimation("evaporate", [2, 1, 0], 8, false); + sun_guy_wave.play("play"); + parent.add(sun_guy_wave); + sun_guy_wave.visible=false; + + for(i in 0...3){ + var dust:Dust=new Dust(0, 0, null,parent); + dust.exists=false; + dusts.add(dust); + parent.bg_sprites.add(dusts); + + } + + light_orb_1.visible=light_orb_2.visible=false; + orb_illum_1.visible=orb_illum_2.visible=false; + parent.add(light_cone_1); + parent.add(light_cone_2); + parent.add(light_orb_1); + parent.add(light_orb_2); + parent.add(orb_illum_1); + parent.add(orb_illum_2); + alpha=light_cone_1.alpha=light_cone_2.alpha=0; + + /* White overlay */ + white_overlay.makeGraphic(160, 180, 0xffffffff); + white_overlay.scrollFactor=new FlxPoint(0, 0); + parent.add(white_overlay); + white_overlay.visible=false; + + + Registry.EVENT_CHANGE_DARKNESS_ALPHA=false; + } + + override public function update():Void { + + if(player.health_bar.cur_health<=0){ + light_orb_1.alpha -=0.05; + light_orb_2.alpha=sun_guy_wave.alpha=light_orb_1.alpha; + dusts.setAll("visible", false); + } + + if(player.broom.overlaps(this)){ + if(player.broom.visible){ + hit("broom", player.broom.root.facing); + } + } + + + if(just_got_hurt){ + hit_timer -=FlxG.elapsed; + if(hit_timer<0){ + hit_timer=HIT_TIMER_MAX; + just_got_hurt=false; + } + if(health==0){ + STATE=S_DYING; + light_cone_2.base_x_scale=light_cone_2.base_y_scale=1; + light_cone_2.x=x -8; + light_cone_2.y=y - 24; + parent.remove(white_overlay, true); + parent.add(white_overlay); + play("death_fade"); + health=-1; + Registry.sound_data.stop_current_song(); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.shake(0.01,1); + } + } + switch(STATE){ + case S_INTRO_0: + intro_state_0(); + break; + case S_INTRO_1: + intro_state_1(); + break; + case S_INTRO_2: + intro_state_2(); + break; + case S_HORIZONTAL_FLOAT: + horizontal_float_state(); + break; + case S_VERTIFLOAT: + vertifloat_state(); + break; + case S_DYING: + dying_state(); + break; + case S_DEAD: + dead_state(); + break; + case S_CHARGE: + charge_state(); + break; + } + super.update(); + } + + private function Intro_state_0():Void { + + if(Registry.sound_data.sun_guy_scream.playing){ + Registry.sound_data.sun_guy_scream=new FlxSound(); + Registry.sound_data.sun_guy_scream.loadEmbedded(SoundData.S_SUN_GUY_SCREAM); + + } + if(!stopped_song){ + stopped_song=true; + Registry.sound_data.stop_current_song(); + } + EventScripts.send_alpha_to(darkness, 0.9, 0.006); + + EventScripts.send_property_to(player.light, "base_x_scale", 1.7, -0.02); + EventScripts.send_property_to(player.light, "base_y_scale", 1.7, -0.02); + if((player.y - y)<48){ + + if(!started_song){ + started_song=true; + DH.start_dialogue(DH.name_sun_guy, DH.scene_sun_guy_before_fight); + } + player.dontMove=true; + EventScripts.send_alpha_to(light_cone_1, 1.0, 0.01); + EventScripts.send_alpha_to(light_cone_2, 1.0, 0.01); + EventScripts.send_alpha_to(this, 1.0, 0.007); + if(DH.a_chunk_just_finished()){ + Registry.sound_data.start_song_from_title("BOSS"); + STATE=S_INTRO_1; + player.dontMove=false; + } + } + } + + private function Intro_state_1():Void { + EventScripts.send_alpha_to(darkness, 0.1, -0.02); + EventScripts.send_property_to(light_cone_1, "base_x_scale", 3, 0.01); + EventScripts.send_property_to(light_cone_2, "base_x_scale", 3, 0.01); + if(EventScripts.send_property_to(light_cone_1, "base_y_scale", 3, 0.02)|| + EventScripts.send_property_to(light_cone_2, "base_y_scale", 3, 0.02)){ + STATE=S_INTRO_2; + } + FlxG.shake(0.01,1); + EventScripts.send_property_to(player.light, "base_x_scale", 1.0, -0.02); + EventScripts.send_property_to(player.light, "base_y_scale", 1.0, -0.02); + + FlxG.collide(player, this); + } + + private function Intro_state_2():Void { + if(EventScripts.send_property_to(light_cone_1, "angle", 180, 5)){ + if(EventScripts.send_property_to(light_cone_1, "base_x_scale", 5, 0.3)){ + STATE=S_HORIZONTAL_FLOAT; + light_orb_1.visible=light_orb_2.visible=true; + orb_illum_1.visible=orb_illum_2.visible=true; + } + } + FlxG.collide(player, this); + } + private function horizontal_float_state():Void { + /* Oscillate boss */ + y_timer +=FlxG.elapsed; + y=base_pt.y + 10 * Math.sin(y_timer); + /* Move left and right */ + + move_horizontally(); + + /* Rotate orbs around boss */ + + rotate_orbs_about_sun_guy(); + + + + + /* Touch damage with player */ + if(FlxG.collide(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + + if(health<=6){ + STATE=S_VERTIFLOAT; + } + } + + private function dying_state():Void { + velocity.x=velocity.y=0; + alpha -=0.05; + switch(S_DYING_CTR){ + case 0: + // Get dark, then show dialogue + if(times_hurt_player==0){ + times_hurt_player=1; + Achievements.unlock(Achievements.No_damage_sunguy); + } + if(EventScripts.send_alpha_to(darkness, 1, 0.01)){ + if(!DH.scene_is_dirty(DH.name_sun_guy,DH.scene_sun_guy_after_fight)){ + DH.start_dialogue(DH.name_sun_guy, DH.scene_sun_guy_after_fight); + } + } + + // Fade out other objects + EventScripts.send_alpha_to(orb_illum_1, 0, -0.01); + EventScripts.send_alpha_to(orb_illum_2, 0, -0.01); + EventScripts.send_alpha_to(light_orb_1, 0, -0.01); + EventScripts.send_alpha_to(light_orb_2, 0, -0.01); + EventScripts.send_alpha_to(light_cone_1, 0, -0.02); + EventScripts.send_alpha_to(sun_guy_wave, 0, -0.03); + + // When dialogue's finihsed, do the flashes etc. + if(DH.scene_is_finished(DH.name_sun_guy,DH.scene_sun_guy_after_fight)){ + + if(!white_overlay.visible){ + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.visible=true; + } + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.alpha=1; + frame++; + S_DYING_CTR++; + } + } + break; + case 1: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + S_DYING_CTR++; + frame++; + FlxG.shake(0.01,1); + Registry.sound_data.sun_guy_death_s.play(); + white_overlay.alpha=1; + } + break; + case 2: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.007)){ + S_DYING_CTR++; + frame++; + FlxG.shake(0.02,2); + Registry.sound_data.sun_guy_death_l.play(); + white_overlay.alpha=1; + } + break; + case 3: + if(EventScripts.send_alpha_to(white_overlay, 0, -0.005)){ + frame++; + S_DYING_CTR++; + } + break; + case 4: + EventScripts.send_alpha_to(darkness, 0.75, -0.005); + if(EventScripts.send_property_to(player.light, "base_x_scale", 4, 0.06))S_DYING_CTR++; + EventScripts.send_property_to(player.light, "base_y_scale", 4, 0.06); + break; + default: + STATE=S_DEAD; + + break; + } + } + + /* Change the XML, global state, so forth...cleanup etc */ + private function dead_state():Void { + //One-off + if(!INCREMENTED_REGISTRY){ + /* if(!Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Terminal_Gate_Bedroom; + }*/ + darkness.alpha=0.5; + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + for(i in 0...3){ + dusts.members[i].x=-5000;//HEHHEH + } + xml.@alive="false"; + trace("boss dead"); + Registry.GRID_ENEMIES_DEAD++; + trace("grid enemies dead",Registry.GRID_ENEMIES_DEAD); + INCREMENTED_REGISTRY=true; + //EventScripts.boss_drop_health_up(x, y); + Registry.sound_data.start_song_from_title(Registry.CURRENT_MAP_NAME); + exists=false; + + + } + } + + private function vertifloat_state():Void { + var res:Bool; + switch(S_VERTIFLOAT_CTR){ + case 0: + if(x>base_pt.x){ + res=EventScripts.send_property_to(this, "x", base_pt.x, -3); + } else { + res=EventScripts.send_property_to(this, "x", base_pt.x, 3); + } + if(res && EventScripts.send_property_to(this, "y", base_pt.y - 30, -0.2))S_VERTIFLOAT_CTR++; + break; + case 1: + EventScripts.send_property_to(this, "lr_1", 8, -0.5); + EventScripts.send_property_to(this, "lr_2", 8, -0.5); + EventScripts.send_property_to(this, "rv_1", 0.4, 0.001); + EventScripts.send_property_to(this, "rv_2", 0.4, 0.001); + move_horizontally(); + move_vertically(); + if(FlxG.overlap(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + break; + } + + rotate_orbs_about_sun_guy(); + } + private function charge_state():Void { + //move orbs to guy + if(FlxG.overlap(player, this)|| FlxG.overlap(player, light_orb_1)|| FlxG.overlap(player, light_orb_2)){ + player.touchDamage(1); + times_hurt_player++; + } + var res:Bool; + var i:Int; + switch(S_CHARGE_CTR){ + case 0: + EventScripts.send_property_to(light_orb_1, "x", x+4, 2); + EventScripts.send_property_to(light_orb_1, "y", y+10, 2); + EventScripts.send_property_to(this, "x", base_pt.x + 30, 1); + EventScripts.send_property_to(light_orb_2, "x", x-4, 2); + EventScripts.send_property_to(light_orb_2, "y", y + 10, 2); + if(EventScripts.send_property_to(this, "y", base_pt.y - 20, 1)){ + S_CHARGE_CTR++; + sun_guy_wave.play("play"); + Registry.sound_data.sun_guy_charge.play(); + } + break; + case 1: + sun_guy_wave.visible=true; + sun_guy_wave.flicker(3); + FlxG.shake(0.02, 0.1); + sun_guy_wave.x=base_pt.x - 50; + sun_guy_wave.y=base_pt.y - 10; + sun_guy_wave.velocity.y=0; + velocity.x=velocity.y=0; + if(FlxG.overlap(sun_guy_wave, player)){ sun_guy_wave.visible=false;player.touchDamage(1);S_CHARGE_CTR=3; + times_hurt_player++;} + EventScripts.send_property_to(light_orb_1, "x", base_pt.x - 50, 0.3); + if(EventScripts.send_property_to(light_orb_2, "x", base_pt.x + 75, 0.3)){ + S_CHARGE_CTR++; + Registry.sound_data.sun_guy_death_s.play(); + } + break; + case 2: + sun_guy_wave.velocity.y=30; + if(!sun_wave_evaporating){ + for(i=0;i180){ + S_CHARGE_CTR=3; + sun_wave_evaporating=false; + sun_guy_wave.play("evaporate"); + } + break; + case 3: + if(!dusts_poofed){ + for(i=0;iARTHUR_timer_max){ + ctr++; + DH.start_dialogue(DH.name_arthur, DH.scene_arthur_circus_alone); + } + } else if(ctr==5){ + if(Registry.cur_dialogue==""){ + ctr++; + play("walk_d"); + } + } else if(ctr==6){ // Move off + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "y", ARTHUR_INIT_PT.y + 32, 1)){ + play("walk_l"); + if(parabola_thing.tick()){ + my_shadow.visible=false; + if(EventScripts.send_property_to(this, "x", ARTHUR_INIT_PT.x - 40, 1)){ + sub_ctr++; + } + } else { + if(!my_shadow.visible){ + my_shadow.visible=true; + my_shadow.play("get_small"); + } + my_shadow.x=x + 4;my_shadow.y=y + 4; + } + + } + if(sub_ctr==1){ + exists=false; + xml.@alive="false"; + ctr++; + } + } + } + + private function javiera_logic():Void { + if(parent.state==parent.S_TRANSITION)return; + + + if(state==s_really_dead){ + super.update(); + return; + } + + if(ctr==0){ + DH.start_dialogue(DH.name_javiera, DH.scene_javiera_circus_alone); + ctr++; + } else if(ctr==1){ + if(Registry.cur_dialogue==""){ + ctr++; + loadGraphic(javiera_sprite, true, false, 16, 16); + } + } else if(ctr==2){ + if(Registry.GRID_ENEMIES_DEAD==2){ + play("walk_d"); + JAVIERA_timer +=FlxG.elapsed; + if(JAVIERA_timer>JAVIERA_timer_max){ + ctr++; + DH.start_dialogue(DH.name_javiera, DH.scene_javiera_circus_alone); + } + } + } else if(ctr==3){ + if(Registry.cur_dialogue==""){ + ctr++; + } + } else if(ctr==4){ + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "y", JAVIERA_INIT_PT.y, 1)){ + play("walk_l"); + if(EventScripts.send_property_to(this, "x", JAVIERA_INIT_PT.x - 66, 1)){ + sub_ctr++; + } + } + if(sub_ctr==1){ + exists=false; + xml.@alive="false"; + ctr++; + Registry.GRID_PUZZLES_DONE++; + + } + } + } + + + private function both_logic():Void { + if(!added_to_parent){ + added_to_parent=true; + if(javiera !=null)parent.sortables.add(javiera); + if(arthur !=null)parent.sortables.add(arthur); + parent.sortables.add(shockwaves); + parent.sortables.add(my_shadow); + } + + if(state==s_walk){ + walk_state(); + } else if(state==s_jump){ + jump_state(); + } else if(state==s_throw){ + throw_state(); + } else if(state==s_intro){ + intro_state(); + } else if(state==s_dying){ + dying_logic(); + } else if(state==s_dead){ + dead_logic(); + } + + if(state !=s_dying && state !=s_dead && t_hurt<0){ + hurt_logic(); + } else { + t_hurt -=FlxG.elapsed; + } + + + if(player.overlaps(this)&& visible && state !=s_dying){ + player.touchDamage(1); + } + + } + + /* Stand, talk, walk Into eachother, flash, load a+j sprite, go to walk. */ + private function Intro_state():Void { + if(skip_intro){ + ctr=3; + } + + switch(ctr){ + // Talk. + case 0: + + if(player.y>tl.y + 7 * 16 - 5)return; + + if(!DH.scene_is_dirty(DH.name_circus_folks, DH.scene_circus_folks_before_fight)){ + DH.start_dialogue(DH.name_circus_folks, DH.scene_circus_folks_before_fight); + player.be_idle(); + } + Registry.volume_scale -=0.01; + if(Registry.volume_scale<0.05){ + + if(DH.scene_is_finished(DH.name_circus_folks, DH.scene_circus_folks_before_fight)){ + ctr++; + } + } + break; + // Walk. + case 1: + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + arthur.play("walk_r"); + javiera.play("walk_l"); + javiera.scale.x=-1; + arthur.velocity.x=20; + javiera.velocity.x=-20; + ctr++; + break; + // Stop when touching. + case 2: + if(arthur.x>tl.x + 64){ + arthur.velocity.x=javiera.velocity.x=0; + ctr++; + } + break; + // Load joint sprite. + case 3: + javiera.exists=arthur.exists=false; + facing=LEFT; + play("walk_l"); + visible=true; + if(test_throw){ + state=s_throw; + } else { + state=s_walk; + } + velocity.x=-walk_vel; + x=tl.x + 56; + y=tl.y; + ctr=0; + break; + } + } + /* Walk ccw */ + private function walk_state():Void { + walk_about_perimeter(this,walk_vel); + + t_walk +=FlxG.elapsed; + if(t_walk>tm_walk){ + t_walk=0; + ctr=0; + if(Math.random()>0.6){ + state=s_jump; + } else { + state=s_throw; + } + } + } + + private function jump_state():Void { + // Set target coords. for jump, switch facing for animation, reset parabola and shadow. + if(ctr==0){ + tx=(player.x>tl.x + 60)? tl.x:tl.x + 112; + ty=(player.y>tl.y + 60)? tl.y:tl.y + 112; + if(tx==tl.x && ty==tl.y){ + facing=DOWN; + } else if(tx==tl.x + 112 && ty==tl.y){ + facing=LEFT; + } else if(tx==tl.x + 112 && ty==tl.y + 112){ + facing=UP; + } else { + facing=RIGHT; + } + + var d:Float=EventScripts.distance(this, new Point(tx, ty)); + parabola_thing.period=d / jump_vel; + parabola_thing.reset_time(); + EventScripts.scale_vector(this, new Point(tx, ty), velocity, jump_vel); + + my_shadow.play("get_small", true); + my_shadow.visible=true; + my_shadow.x=x + 4; + my_shadow.y=y + 8; + parabola_thing.set_shadow_fall_animation("get_big"); + play_sfx("jump_up"); + ctr++; + // Move and then generate shockwaves. + } else if(ctr==1){ + my_shadow.x=x; + my_shadow.y=y; + if(parabola_thing.tick()){ + play_sfx("jump_down"); + Registry.sound_data.wb_tap_ground.play(); + my_shadow.visible=false; + velocity.x=velocity.y=0; + offset.y=16; + x=tx; + y=ty; + + // Cap the max shockwaves generated from this attack. + if(shockwaves.countExisting()>5){ + ctr++; + return; + } + + var sw1:FlxSprite=shockwaves.getFirstAvailable()as FlxSprite; + if(sw1==null){ + ctr++; + return; + } + sw1.exists=true; + var sw2:FlxSprite=shockwaves.getFirstAvailable()as FlxSprite; + if(sw2==null){ + ctr++; + return; + } + sw2.exists=true; + + sw2.x=sw1.x=x; + sw1.y=sw2.y=y; + + + switch(facing){ + case UP: + sw1.velocity.x=-sw_vel; + sw2.velocity.y=-sw_vel; + break; + case DOWN: + sw1.velocity.x=sw_vel; + sw2.velocity.y=sw_vel; + break; + case RIGHT: + sw1.velocity.x=sw_vel; + sw2.velocity.y=-sw_vel; + break; + case LEFT: + sw1.velocity.x=-sw_vel; + sw2.velocity.y=sw_vel; + break; + } + + ctr++; + + } + // Wait a bit and then walk. + } else if(ctr==2){ + t_jump +=FlxG.elapsed; + if(t_jump>tm_jump){ + t_jump=0; + ctr=0; + state=s_walk; + if(xtl.x +105){ + facing=UP; + play("walk_u"); + } else if(y>tl.y +106){ + facing=RIGHT; + play("walk_r"); + } else { + facing=LEFT; + play("walk_l"); + } + } + } + } + + private function throw_state():Void { + // Switch places + if(ctr==0){ + velocity.x=velocity.y=0; + play("switch"); + ctr++; + // Wait for switch to be done. + } else if(ctr==1){ + if(_curAnim.frames.length - 1==_curFrame){ + FlxG.flash(0xffffffff, 0.2); + + ctr++; + } + // Face the player and throw. + } else if(ctr==2){ + var e2e:Int=EventScripts.get_entity_to_entity_dir(x, y, player.x, player.y); + arthur.facing=e2e; + switch(e2e){ + case UP: + play("throw_u"); + break; + case DOWN: + play("throw_d"); + break + case RIGHT: + play("throw_r"); + break; + case LEFT: + play("throw_l"); + break; + } + ctr++; + // Wait for throw anim to finish, then separate a+j Into separate sprites. + // Move arthur at the player. + } else if(ctr==3){ + if(_curAnim.frames.length - 1==_curFrame){ + EventScripts.scale_vector(this, player, arthur.velocity, throw_vel); + visible=false; + arthur.exists=javiera.exists=true; + arthur.play("roll"); + javiera.x=x;javiera.y=y; + arthur.x=x;arthur.y=y - 16; + ctr++; + Registry.sound_data.slasher_atk.play(); + } + // If arthur touches a wall that he didn't come from, + // spawn 2 shockwaves, stop arthur, and play arthur's stun animation. + } else if(ctr==4){ + + if(arthur.xtl.x + 112 && arthur.velocity.x>0){ + arthur.x=tl.x + 112;arthur.velocity.x=arthur.velocity.y=0;arthur.facing=NONE; + } else if(arthur.y>tl.y + 112 && arthur.velocity.y>0){ + arthur.y=tl.y + 112;arthur.velocity.x=arthur.velocity.y=0;arthur.facing=NONE; + } else if(arthur.ytl.x + 112){ + arthur.x=tl.x + 112; + } else if(arthur.y>tl.y + 112){ + arthur.y=tl.y + 112; + } else if(arthur.ytl.x +105){ + facing=UP; + play("walk_u"); + } else if(y>tl.y +106){ + facing=RIGHT; + play("walk_r"); + } else { + facing=LEFT; + play("walk_l"); + } + state=s_walk; + ctr=0; + + } + + } + + + private function dying_logic():Void { + + if(ctr==0){ + Registry.volume_scale=0; + Registry.sound_data.stop_current_song(); + velocity.x=velocity.y=0; + play("dying"); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.shake(0.04, 1.0); + player.be_idle(); + + DH.start_dialogue(DH.name_circus_folks, DH.scene_circus_folks_after_fight); + ctr++; + } else if(ctr==1){ + if(DH.scene_is_finished(DH.name_circus_folks,DH.scene_circus_folks_after_fight)&& _curAnim.frames.length - 1==_curFrame){ + ctr++; + visible=false; + javiera.exists=arthur.exists=true; + arthur.x=x;arthur.y=y; + javiera.x=x;javiera.y=y - 16; + + arthur.parabola_thing=new Parabola_Thing(arthur, 24, 1.0, "offset", "y"); + javiera.parabola_thing=new Parabola_Thing(javiera, 18, 0.8, "offset", "y"); + arthur.frame=1; + javiera.frame=1; + tm_jump=2; + t_jump=0; + + } + } else if(ctr==2){ + // do something? + var n:Float=Math.sin(t_jump * 6.28); + arthur.offset.x=-3 * n; + javiera.offset.x=3 * n; + t_jump +=FlxG.elapsed; + if(t_jump>tm_jump){ + t_jump=0; + Registry.sound_data.floor_crack.play(); + ctr++; + EventScripts.scale_vector(arthur, new Point(tl.x + 64, tl.y + 40), arthur.velocity, 40); + EventScripts.scale_vector(javiera, new Point(tl.x + 36, tl.y + 50), javiera.velocity, 70); + } + + } else if(ctr==3){ + if(arthur.parabola_thing.tick()){ + arthur.velocity.x=arthur.velocity.y=0; + arthur.alpha -=0.005; + if(arthur._curAnim==null || arthur._curAnim.name !="fall"){ + arthur.play("fall"); + } + } + if(javiera.parabola_thing.tick()){ + javiera.velocity.x=javiera.velocity.y=0; + javiera.alpha -=0.005; + if(javiera._curAnim==null || javiera._curAnim.name !="fall"){ + javiera.play("fall"); + } + } + if(javiera.alpha==0 && arthur.alpha==0){ + ctr++; + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff0000, 1); + } + } else if(ctr==4){ + t_jump +=FlxG.elapsed; + if(t_jump>1.3){ + ctr++; + } + } else { + state=s_dead; + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("CIRCUS"); + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]=true; + xml.@alive="false"; + javiera.exists=arthur.exists=false; + } + + + } + + private function dead_logic():Void { + exists=false; + } + + private function hurt_logic():Void { + if(offset.y<18){ + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + t_hurt=tm_hurt; + play_sfx(HURT_SOUND_NAME); + health--; + if(health<0 && state==s_throw){ + health=0; + } + flicker(1); + } + } + + /* Only go to dying when in the joint state */ + if(health<=0 && visible){ + ctr=0; + health=-1; + state=s_dying; + } + + } + private function on_anim_change(name:String, _frame:Int, _index:Int):Void { + if(name=="walk_l" || name=="throw_l"){ + scale.x=-1; + } else { + scale.x=1; + } + + } + + // A shockwave travels around the perimeter until it hits another shockwave, or the player. + private function shockwave_logic():Void { + + if(state==s_dying || state==s_dead){ + for(var shockwave:FlxSprite in shockwaves.members){ + if(shockwave._curAnim.name !="evaporate"){ + shockwave.play("evaporate"); + shockwave.velocity.x=shockwave.velocity.y=0; + } else { + shockwave.alpha -=0.1; + } + } + return; + } + for(var sw:FlxSprite in shockwaves.members){ + if(sw==null || !sw.exists)continue; + if(!sw.alive){ + if(sw._curAnim.frames.length - 1==sw._curFrame){ + sw.exists=false; + sw.alive=true; + sw.play("move"); + } + continue; + } + if(sw.x>tl.x + 114){ + + sw.x=tl.x + 112; + sw.velocity.x=0; + sw.velocity.y=(sw.y>tl.y + 60)? -sw_vel:sw_vel; + } else if(sw.xtl.y + 60)? -sw_vel:sw_vel; + } else if(sw.y>tl.y + 114){ + sw.y=tl.y + 112; + sw.velocity.y=0; + sw.velocity.x=(sw.x>tl.x + 60)? -sw_vel:sw_vel; + } else if(sw.ytl.x + 60)? -sw_vel:sw_vel; + } + if(player.state !=player.S_AIR && sw.overlaps(player)){ + player.touchDamage(1); + sw.alive=false; + sw.play("evaporate"); + sw.velocity.x=sw.velocity.y=0; + + } + if(player.broom.visible && player.broom.overlaps(sw)){ + sw.alive=false; + sw.play("evaporate"); + sw.velocity.x=sw.velocity.y=0; + } + } + } + + private function load_javiera(javiera_ref:FlxSprite):Void + { + javiera_ref.loadGraphic(javiera_sprite, true, false, 16, 16); + javiera_ref.addAnimation("walk_d", [0, 1], 8); + javiera_ref.addAnimation("walk_l", [4, 5], 8); + javiera_ref.addAnimation("walk_u", [2, 3], 8); + javiera_ref.addAnimation("walk_r", [4, 5], 8); + javiera_ref.addAnimation("juggle", [0, 1], 8); + javiera_ref.addAnimation("fall", [6, 7, 8, 9, 10, 11, 12], 2, false);// Should end on an empty frame + javiera_ref.play("juggle"); + } + + private function load_arthur(arthur_ref:FlxSprite):Void + { + arthur_ref.loadGraphic(arthur_sprite, true, false, 16, 16); + arthur_ref.addAnimation("walk_d", [0, 1], 8); + arthur_ref.addAnimation("walk_l", [4, 5], 8); + arthur_ref.addAnimation("walk_u", [2, 3], 8); + arthur_ref.addAnimation("walk_r", [4, 5], 8); + arthur_ref.addAnimation("roll", [6], 6);// For flying through the air + arthur_ref.addAnimation("stunned", [8, 9], 6); + arthur_ref.addAnimation("wobble", [16,17], 8); + arthur_ref.addAnimation("fall_1", [10], 8); + arthur_ref.addAnimation("fall", [10, 11, 12, 13, 14, 15, 6], 2, false);// Should end on an empty frame + arthur_ref.parabola_thing=new Parabola_Thing(this, 32, 1, "offset", "y"); + arthur_ref.parabola_thing.set_shadow_fall_animation("get_big"); + arthur_ref.my_shadow=EventScripts.make_shadow("8_small"); + arthur_ref.play("wobble"); + } + + private function walk_about_perimeter(s:FlxSprite,speed:Int):Void + { + s.scale.x=1; + if(s.facing & LEFT){ + s.scale.x=-1; + s.velocity.x=-speed; + if(s.xtl.x + 112){ + s.x=tl.x + 112; + s.velocity.x=0; + s.velocity.y=-speed; + s.play("walk_u"); + s.facing=UP; + } + } else if(s.facing & UP){ + s.velocity.y=-speed; + if(s.ytl.y + 112){ + s.y=tl.y + 112; + s.velocity.y=0; + s.velocity.x=speed; + s.play("walk_r"); + s.facing=RIGHT; + } + } + } + + override public function destroy():Void + { + ARTHUR_INIT_PT=JAVIERA_INIT_PT=null; + tl=null; + if(light !=null){ + parent.sortables.remove(light, true); + } + if(TYPE==T_BOTH){ + parent.sortables.remove(arthur, true); + parent.sortables.remove(javiera, true); + parent.sortables.remove(shockwaves, true); + parent.sortables.remove(my_shadow, true); + arthur.destroy();javiera.destroy();shockwaves.destroy(); + arthur=javiera=null; + shockwaves=null; + } + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/circus/Contort.hx b/intra/source/entity/enemy/circus/Contort.hx new file mode 100644 index 0000000..bf0f001 --- /dev/null +++ b/intra/source/entity/enemy/circus/Contort.hx @@ -0,0 +1,295 @@ +package entity.enemy.circus +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +/** + * Mechanically the same as a shieldy at first, + * but hitting it once splits it Into + * two balls that bounce about the room. and blood. eeew + */ +class Contort extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + //[Embed(source="../../../res/sprites/enemies/circus/contort_small.png")] public static var contort_small_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/contort_big.png")] public static var contort_big_sprite:Class; + + private var BIG_HEALTH:Int=3; + private var t_big_hit:Float=0; + private var tm_big_hit:Float=1.5; + private var just_hurt:Bool=false; + private var big_death_timeout:Float=1.0; + + private var t_small_roll:Float=0; + private var tm_small_roll:Float=0.8; + + private var state:Int=0; + private var s_big_roll:Int=0; + private var s_big_dying:Int=1; + private var s_big_dead:Int=2; + private var big_is_h_flipped:Bool=false; + private var big_is_v_flipped:Bool=false; + + private var VEL:Int=35; + + public var small_sprites:FlxGroup=new FlxGroup(3); + + private var added_to_parent:Bool=false; + private var collide_ctr:Int=0; + private var tl:Point=new Point(0, 0); + + private var did_normal:Bool=false; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Add anims for the big sprite */ + loadGraphic(contort_big_sprite, true, false, 16, 32); + height=12; + width=12; + offset.x=2; + offset.y=20; + addAnimation("move", [0, 1, 2, 1], 9); + play("move"); + health=BIG_HEALTH; + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + + for(i in 0...small_sprites.maxSize){ + var ss:FlxSprite=new FlxSprite(); + ss.loadGraphic(contort_small_sprite, true, false, 16, 16); + //yellow purple blue + switch(i){ + case 0: + ss.addAnimation("move", [0,1], 9, true);//b + break; + case 1: + ss.addAnimation("move", [4,5], 9, true);//p + break; + case 2://y + ss.addAnimation("move", [2,3], 9, true);//y + break; + } + ss.visible=false; + ss.play("move"); + ss.offset.y=12 * i; + + ss.my_shadow=EventScripts.make_shadow("8_small", true); + ss.parabola_thing=new Parabola_Thing(ss, 16 + 8 * i, 1.2, "offset", "y"); + ss.parabola_thing.set_shadow_fall_animation("get_big"); + + small_sprites.add(ss); + parent.bg_sprites.add(ss.my_shadow); + } + + if(xml.@alive=="false"){ + exists=false; + } + + + } + + override public function preUpdate():Void + { + if(collide_ctr==3){ + collide_ctr=0; + FlxG.collide(parent.curMapBuf, this); + } else { + collide_ctr++; + } + super.preUpdate(); + } + override public function update():Void + { + if(!added_to_parent){ + if(parent.state==parent.S_NORMAL){ + added_to_parent=true; + parent.sortables.add(small_sprites); + + velocity.x=Math.random()>0.5 ? VEL:-VEL; + velocity.y=Math.random()>0.5 ? VEL:-VEL; + } + + return; + } + + big_logic(); + + super.update(); + } + + private function big_logic():Void + { + + if(did_normal && parent.state==parent.S_TRANSITION){ + velocity.x=velocity.y=0; + small_sprites.setAll("velocity", new FlxPoint(0, 0)); + //EventScripts.prevent_leaving_map(parent, this); + } else { + did_normal=true; + } + + if(state==s_big_roll){ + + + if(xtl.x + 160){ + touching=RIGHT; + } else if(ytl.y + 160){ + touching=DOWN; + } + + //Bounce + if(touching !=NONE){ + if(touching & RIGHT){ + velocity.x=-VEL; + } else if(touching & LEFT){ + velocity.x=VEL; + } + + if(touching & UP){ + velocity.y=VEL; + } else if(touching & DOWN){ + velocity.y=-VEL; + } + + velocity.x=velocity.x - 10 + 20 * Math.random(); + velocity.y=velocity.y - 10 + 20 * Math.random(); + } + + //Hit player + if(!player.invincible && player.overlaps(this)){ + player.touchDamage(1); + } + + //Damage logic + if(!just_hurt && player.broom.visible && player.broom.overlaps(this)){ + health--; + t_big_hit=0; + flicker(tm_big_hit); + just_hurt=true; + + } else { + if(just_hurt){ + t_big_hit +=FlxG.elapsed; + if(t_big_hit>tm_big_hit){ + just_hurt=false; + } + } + } + + + if(health==0){ + play("release_smalls"); + state=s_big_dying; + velocity.x=velocity.y=0; + } + } else if(state==s_big_dying){ + big_death_timeout -=FlxG.elapsed; + if(big_death_timeout<0){ + solid=visible=false; + state=s_big_dead; + + EventScripts.make_explosion_and_sound(this); + /* Init small sprites */ + small_sprites.setAll("visible", true); + small_sprites.setAll("x", x+2); + small_sprites.setAll("y", y + 2); + for(var ss:FlxSprite in small_sprites.members){ + ss.my_shadow.x=ss.x + 4; + ss.my_shadow.y=ss.y + 6; + ss.velocity.x=Math.random()>0.5 ? VEL:-VEL; + ss.velocity.y=Math.random()>0.5 ? VEL:-VEL; + ss.velocity.x=ss.velocity.x - 5 + 10 * Math.random(); + ss.velocity.y=ss.velocity.y - 5 + 10 * Math.random(); + ss.health=1; + ss.flicker(1); + ss.my_shadow.play("get_small"); + } + } + } else if(state==s_big_dead){ + var sub_ctr:Int=0; + for(var _ss:FlxSprite in small_sprites.members){ + if(_ss.parabola_thing.tick()){ + _ss.my_shadow.visible=false; + } + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, _ss); + } + _ss.my_shadow.x=_ss.x + 4; + _ss.my_shadow.y=_ss.y + 6; + FlxG.collide(parent.curMapBuf, _ss); + + if(t_small_roll>tm_small_roll){ + _ss.velocity.x=Math.random()>0.5 ? VEL:-VEL; + _ss.velocity.y=Math.random()>0.5 ? VEL:-VEL; + + _ss.velocity.x=_ss.velocity.x - 5 + 10 * Math.random(); + _ss.velocity.y=_ss.velocity.y - 5 + 10 * Math.random(); + } + + + if(xtl.x + 160){ + velocity.x *=-1; + } else if(ytl.y + 160){ + velocity.y *=-1; + } + + if(_ss.health>0){ + if(!player.invincible && player.overlaps(_ss)){ + player.touchDamage(1); + } + if(!flickering && player.broom.visible && player.broom.overlaps(_ss)){ + _ss.health --; + _ss.my_shadow.exists=false; + EventScripts.drop_small_health(_ss.x, _ss.y, 0.4); + EventScripts.make_explosion_and_sound(_ss); + } + } else { + _ss.alpha -=0.07; + if(_ss.alpha==0){ + sub_ctr++; + } + } + } + + if(t_small_roll>tm_small_roll){ + t_small_roll=0; + } + t_small_roll +=FlxG.elapsed; + + if(sub_ctr==3){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + // Keep track of the small guys + } + } + + + override public function destroy():Void + { + parent.sortables.remove(small_sprites, true); + small_sprites=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/circus/Fire_Pillar.hx b/intra/source/entity/enemy/circus/Fire_Pillar.hx new file mode 100644 index 0000000..a9a5717 --- /dev/null +++ b/intra/source/entity/enemy/circus/Fire_Pillar.hx @@ -0,0 +1,125 @@ +package entity.enemy.circus +{ +import entity.enemy.crowd.Spike_Roller; +import entity.gadget.Dust; +import entity.player.Player; +import flash.display.InterpolationMethod; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Fire_Pillar extends FlxSprite { + //[Embed(source="../../../res/sprites/enemies/circus/fire_pillar.png")] public static var fire_pillar_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/fire_pillar_base.png")] public static var fire_pillar_base_sprite:Class; + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var added_to_parent:Bool=false; + + public var hitbox:FlxSprite=new FlxSprite; + public var base:FlxSprite=new FlxSprite; + + private var t:Float=0; + private var tm_idle:Float=0.74; + private var tm_emerge:Float=0.3; + private var tm_flame:Float=1.0; + private var tm_recede:Float=0.3; + + private var ctr:Int=0; + + public function new(_xml:XML, _player:Player, _parent:Dynamic){ + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(fire_pillar_sprite, true, false, 16, 32); + + hitbox.makeGraphic(16, 9, 0x00112332); + base.loadGraphic(fire_pillar_base_sprite, true, false, 16, 16); + base.addAnimation("dormant", [0, 1], 6); + base.play("dormant"); + + addAnimation("idle", [0], 15); + addAnimation("emerge", [1, 2, 3, 4], 8, false); + addAnimation("flame", [3, 4], 10); + addAnimation("recede", [5, 6, 0], 8, false); + play("idle"); + + add_sfx("shoot", Registry.sound_data.flame_pillar_group); + + + } + + override public function update():Void + { + if(!added_to_parent){ + added_to_parent=true; + height=23; + base.x=hitbox.x=x + base.y=hitbox.y=y + 16; + + parent.bg_sprites.members.splice(0, 0, base); + parent.bg_sprites.length++; + } + + for(var dust:Dust in Registry.subgroup_dust){ + if(dust==null)continue; + if(dust.visible && dust.overlaps(hitbox)){ + ctr=0; + play("idle"); + } + } + + for(var spike_roller:Spike_Roller in Registry.subgroup_spike_rollers){ + if(spike_roller==null)continue; + if(spike_roller.visible && spike_roller.overlaps(hitbox)){ + ctr=0; + play("idle"); + } + } + + if(ctr==0){ + t +=FlxG.elapsed; + if(t>tm_idle){ + t=0; + ctr++; + play("emerge"); + flicker(.25); + } + } else if(ctr==1){ + t +=FlxG.elapsed; + if(t>tm_emerge){ + t=0; + ctr++; + play_sfx("shoot"); + play("flame"); + } + } else if(ctr==2){ + t +=FlxG.elapsed; + if(t>tm_flame){ + t=0; + ctr++; + play("recede"); + flicker(.25) + } + if(player.overlaps(hitbox)){ + player.touchDamage(1); + } + } else if(ctr==3){ + t +=FlxG.elapsed; + if(t>tm_recede){ + t=0; + ctr=0; + play("idle"); + } + } + + + super.update(); + } + + override public function destroy():Void + { + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/circus/Lion.hx b/intra/source/entity/enemy/circus/Lion.hx new file mode 100644 index 0000000..4cf4242 --- /dev/null +++ b/intra/source/entity/enemy/circus/Lion.hx @@ -0,0 +1,541 @@ +package entity.enemy.circus +{ +import data.Common_Sprites; +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; + +class Lion extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/circus/lion.png")] public static var lion_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/circus/lion_fireballs.png")] public static var lion_fireball_sprite:Class; + + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var max_health:Int=4; + private var is_hurt:Bool=false; + + private var hori_hitbox:FlxSprite=new FlxSprite; + private var H_OFF_X:Int=3; + private var H_OFF_Y:Int=11; + private var vert_hitbox:FlxSprite=new FlxSprite; + private var V_OFF_X:Int=10; + private var V_OFF_Y:Int=4; + private var hitbox:FlxSprite; + + private var state:Int=0; + private var state_pace:Int=0; + private var t_pace:Float=0; + private var tm_pace:Float=0.8; + private var vel_pace:Float=43; + private var ctr_pace:Int=0; + + private var state_shoot:Int=1; + private var fireballs:FlxGroup=new FlxGroup(10); + private var vel_fireball:Int=88; + private var max_fireball_x_distance:Int=80; + private var ctr_shoot:Int=0; + private var t_shoot:Float=0; + private var tm_shoot:Float=0.165; + private var tm_shoot_warning:Float=0.8; + private var ctr_shots:Int=0; + private var max_shots:Int=18; + + private var state_charge:Int=2; + private var ctr_charge:Int=0; + private var vel_charge:Int=110; + private var t_charge:Float=0; + private var h_shadow:FlxSprite=new FlxSprite; + private var v_shadow:FlxSprite=new FlxSprite; + + + private var state_dying:Int=3; + + private var did_init:Bool=false; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + health=max_health; + solid=false; + + loadGraphic(lion_sprite, true, false, 32, 32); + addAnimation("walk_l", [0, 1], 5); + addAnimation("walk_r", [0, 1], 5); + addAnimation("walk_d", [10,11], 5); + addAnimation("walk_u", [5,6], 5); + + addAnimation("warn_l", [3], 5, true); + addAnimation("warn_r", [3], 5, true); + + addAnimation("shoot_l", [2], 15, true); + addAnimation("shoot_r", [2], 15, true); + addAnimation("shoot_d", [12], 15, true); + addAnimation("shoot_u", [7], 15, true); + + addAnimation("pounce_r", [4]); + addAnimation("pounce_l", [4]); + addAnimation("pounce_u", [9]); + addAnimation("pounce_d", [14]); + + play("walk_r"); + addAnimationCallback(on_anim_change); + + + add_sfx("shoot", Registry.sound_data.fireball_group); + + /* Make shadows */ + h_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + v_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + v_shadow.visible=h_shadow.visible=false; + h_shadow.frame=v_shadow.frame=4; + h_shadow.offset.x=-2;h_shadow.offset.y=-24; + v_shadow.offset.y=-12; + v_shadow.scale.x=0.5;v_shadow.scale.y=2;// Remove when you add teha ctual shadows + + parabola_thing=new Parabola_Thing(this, 12, 1.0, "offset", "y"); + + hori_hitbox.makeGraphic(26, 13, 0x00ff0000); + vert_hitbox.makeGraphic(10, 20, 0x0000ff00); + hitbox=hori_hitbox; + hitbox.velocity.x=vel_pace; + + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + + fireball.loadGraphic(lion_fireball_sprite, true, false, 16, 16); + fireball.width=fireball.height=8; + fireball.centerOffsets(true); + + fireball.addAnimation("shoot", [0, 1], 10); + fireball.addAnimation("poof", [2,3,4,5], 10,false); + fireball.play("shoot"); + fireball.alive=fireball.exists=false; + fireballs.add(fireball); + } + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + state=state_pace; + } + + override public function update():Void + { + if(parent.state==parent.S_TRANSITION){ + hitbox.velocity.x=hitbox.velocity.y=0; + return; + } + if(!did_init){ + did_init=true; + center_hitboxes(); + parent.fg_sprites.add(vert_hitbox); + parent.fg_sprites.add(hori_hitbox); + parent.fg_sprites.add(fireballs); + parent.bg_sprites.add(v_shadow); + parent.bg_sprites.add(h_shadow); + } + + //Graphic pinned to hitbox(hitbox moves) + if(hitbox==vert_hitbox){ + x=hitbox.x - V_OFF_X; + y=hitbox.y - V_OFF_Y; + } else if(hitbox==hori_hitbox){ + x=hitbox.x - H_OFF_X; + y=hitbox.y - H_OFF_Y; + } + + //Stop moving if touchign solid tile + FlxG.collide(hitbox, parent.curMapBuf); + + if(hitbox.touching !=NONE){ + hitbox.velocity.x=hitbox.velocity.y=0; + } + + //hurt player + if(!player.invincible && player.overlaps(hitbox)){ + player.touchDamage(1); + } + + // Get hurt + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + flicker(1); + is_hurt=true; + play_sfx(HURT_SOUND_NAME); + health--; + if(health<=0){ + state=state_dying; + } + } else { + is_hurt=false; + } + + if(state==state_pace){ + pace_state(); + } else if(state==state_shoot){ + shoot_state(); + } else if(state==state_charge){ + charge_state(); + } else if(state==state_dying){ + alpha -=0.05; + if(alpha==0){ + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + exists=false; + v_shadow.exists=h_shadow.exists=false; + } + } + + super.update(); + } + + public function on_anim_change(name:String, frame_nr:Int, frame_index:Int):Void { + if(name=="walk_l" || name=="shoot_l" || name=="warn_l" || name=="pounce_l"){ + facing=LEFT; + scale.x=-1; + } else { + scale.x=1; + if(name=="walk_r" || name=="shoot_r"){ + facing=RIGHT; + } else if(name=="walk_u" || name=="shoot_u"){ + facing=UP; + } else if(name=="walk_d" || name=="shoot_d"){ + facing=DOWN; + } + } + } + + private function center_hitboxes():Void + { + hori_hitbox.x=x + H_OFF_X; + hori_hitbox.y=y + H_OFF_Y; + vert_hitbox.x=x + V_OFF_X; + vert_hitbox.y=y + V_OFF_Y; + } + + private function pace_state():Void + { + t_pace +=FlxG.elapsed; + if(t_pace>tm_pace){ + t_pace=0; + ctr_pace=Std.int(6 * Math.random()); + var r:Float=Math.random(); + if(r<0.25){ + state=state_shoot; + if(player.x>x + 16){ + play("warn_r"); + } else { + play("warn_l"); + } + + return; + } else if(r<0.55){ + state=state_charge; + return; + } + switch(ctr_pace){ + case 0: + hitbox=hori_hitbox; + hitbox.velocity.x=vel_pace; + hitbox.velocity.y=0; + center_hitboxes(); + play("walk_r"); + break; + case 1: + hitbox=vert_hitbox; + hitbox.velocity.x=0; + hitbox.velocity.y=vel_pace; + play("walk_d"); + center_hitboxes(); + break; + case 2: + hitbox=hori_hitbox; + hitbox.velocity.y=0; + hitbox.velocity.x=-vel_pace; + play("walk_l"); + center_hitboxes(); + break; + case 3: + hitbox=vert_hitbox; + hitbox.velocity.x=0; + hitbox.velocity.y=-vel_pace; + play("walk_u"); + center_hitboxes(); + break; + default: + //hitbox.velocity.x=hitbox.velocity.y=0; + break; + } + } + } + + private function shoot_state():Void + { + hitbox.velocity.x=hitbox.velocity.y=0; + + var fireball:FlxSprite; + + if(ctr_shoot==0){ + t_shoot +=FlxG.elapsed; + if(t_shoot<=tm_shoot_warning){ + return; + } else { + t_shoot=0; + ctr_shoot++; + } + } + + + // Periodically shoot a fireball + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot){ + t_shoot=0; + if(ctr_shots0){ + fireball=fireballs.getFirstDead()as FlxSprite; + if(fireball !=null){ + ctr_shots++; + play_sfx("shoot"); + face_player(); + switch(facing){ + case UP: + fireball.x=x + width / 2; + fireball.y=y - 2; + EventScripts.scale_vector(getMidpoint(), new Point(x + 32*Math.random(), y - 32), fireball.velocity, vel_fireball); + break; + case DOWN: + fireball.x=x + width / 2; + fireball.y=y + height + 2; + EventScripts.scale_vector(getMidpoint(), new Point(x + 32*Math.random(), y + 32), fireball.velocity, vel_fireball); + break; + case RIGHT: + fireball.x=x + width; + fireball.y=y + 6; + EventScripts.scale_vector(new Point(x + width, y + 6), new Point(x + 80, y - 26 + 52*Math.random()), fireball.velocity, vel_fireball); + break; + case LEFT: + fireball.x=x; + fireball.y=y + 6; + EventScripts.scale_vector(new Point(x, y + 6), new Point(x - 30, y - 26 + 52*Math.random()), fireball.velocity, vel_fireball); + break; + } + fireball.exists=fireball.alive=true; + fireball.finished=false; + fireball.play("shoot"); + } + } else { + ctr_shots=0; + state=state_pace; + } + } + // Fireballs hit player and map + for(fireball in fireballs.members){ + + if(fireball._curAnim !=null && fireball._curAnim.name !="poof"){ + for(var dust:Dust in Registry.subgroup_dust){ + if(dust !=null){ + if(dust.visible && dust.overlaps(fireball)){ + fireball.play("poof");fireball.finished=false; + } + } + } + if(fireball.alive){ + if(!player.invincible && player.overlaps(fireball)){ + player.touchDamage(1); + fireball.play("poof");fireball.finished=false; + //fireball.alive=false; + } + if(player.broom.visible && player.broom.overlaps(fireball)){ + fireball.play("poof");fireball.finished=false; + //fireball.alive=false; + } + } + if(Math.abs(fireball.x - x)>max_fireball_x_distance){ + //fireball.alive=fireball.exists=false; + + fireball.play("poof");fireball.finished=false; + } else if(Math.abs(fireball.y - y)>max_fireball_x_distance){ + //fireball.alive=fireball.exists=false; + fireball.play("poof");fireball.finished=false; + + } + } + + if(fireball.finished && fireball._curAnim !=null && fireball._curAnim.name=="poof"){ + fireball.exists=fireball.alive=false; + fireball.play("shoot"); + } + } + + + // If hurt then go back to charge + if(is_hurt){ + ctr_shots=max_shots; + } + } + + private function charge_state():Void + { + if(ctr_charge==0){ // Walk away forom the player + hitbox=hori_hitbox; + center_hitboxes(); + hitbox.velocity.x=20; + hitbox.velocity.y=0; + if(player.x>x){ + hitbox.velocity.x *=-1; + play("walk_l"); + } else { + play("walk_r"); + } + ctr_charge++; + } else if(ctr_charge==1){ // Face the player + t_charge +=FlxG.elapsed; + if(t_charge>1.4){ + hitbox.velocity.x=hitbox.velocity.y=0; + if(_curAnim.name=="walk_r"){ + hitbox.velocity.x=-10; + play("warn_l"); + } else { + hitbox.velocity.x=10; + play("warn_r"); + } + t_charge=0; + ctr_charge++; + + } + } else if(ctr_charge==2){ //pause a little + t_charge +=FlxG.elapsed; + if(t_charge>0.6){ + t_charge=0; + ctr_charge++; + } + } else if(ctr_charge==3){ //dash to theplayer + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), hitbox.velocity, vel_charge); + ctr_charge++; + scale.x=1; + switch(EventScripts.get_entity_to_entity_dir(x, y, player.x, player.y)){ + case UP: + v_shadow.visible=true; + play("pounce_u"); + break; + case DOWN: + v_shadow.visible=true; + play("pounce_d"); + break; + case LEFT: + h_shadow.visible=true; + play("pounce_l"); + break; + case RIGHT: + h_shadow.visible=true; + play("pounce_r"); + break; + } + if(v_shadow.visible){ + v_shadow.x=x; + v_shadow.y=y; + } else { + h_shadow.x=x; + h_shadow.y=y; + } + + } else if(ctr_charge==4){ //Check the graphic against tilemap to avoid weird graphics steppingoutside the bounds + solid=true; + + if(v_shadow.visible){ + v_shadow.x=x; + v_shadow.y=y; + } else { + h_shadow.x=x; + h_shadow.y=y; + } + FlxG.collide(this, parent.curMapBuf); + if(parabola_thing.tick()||(touching !=NONE && offset.y>4)){ + offset.y=0; + parabola_thing.reset_time(); + h_shadow.visible=v_shadow.visible=false; + hitbox.velocity.x=hitbox.velocity.y=0; + ctr_charge=0; + if(_curAnim.name=="pounce_l"){ + play("walk_l"); + } else if(_curAnim.name=="pounce_r"){ + play("walk_r"); + } else if(_curAnim.name=="pounce_d"){ + play("walk_d"); + } else { + play("walk_u"); + + } + state=state_pace; + } + solid=false; + } + } + + /* Get dy/dx and the slope to figure out which way to face */ + private function face_player():Void { + var midpoint:FlxPoint=getMidpoint(); + var dy:Float=midpoint.y - player.midpoint.y; + var dx:Float=midpoint.x - player.midpoint.x; + var eps:Float=0.0001; + (Math.abs(dx)1){ + if(dy>0){ + if(state==state_shoot){ + play("shoot_u"); + } else { + play("walk_u") + } + } else { + if(state==state_shoot){ + play("shoot_d"); + } else { + play("walk_d"); + } + } + + } else { + if(dx>0){ + if(state==state_shoot){ + play("shoot_l"); + } else { + play("walk_l"); + } + } else { + if(state==state_shoot){ + play("shoot_r"); + } else { + play("walk_r"); + } + } + } + } + + override public function destroy():Void + { + fireballs=null; + h_shadow=null; + hori_hitbox=null; + hitbox=null; + v_shadow=null; + vert_hitbox=null; + + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/Dog.hx b/intra/source/entity/enemy/crowd/Dog.hx new file mode 100644 index 0000000..4467acf --- /dev/null +++ b/intra/source/entity/enemy/crowd/Dog.hx @@ -0,0 +1,275 @@ +package entity.enemy.crowd +{ +import entity.gadget.Gate; +import entity.gadget.Switch_Pillar; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import helper.EventScripts; +import org.flixel.FlxObject; +import org.flixel.FlxRect; +import org.flixel.FlxSprite; +import entity.player.Player; +import data.CLASS_ID; +import org.flixel.FlxTilemap; + +class Dog extends FlxSprite +{ + public var xml:XML; + public var cid:Int=CLASS_ID.DOG; + public var player:Player; + public var parent:Dynamic; + //dame props - alive(false or true), p(1) + //[Embed(source="../../../res/sprites/enemies/crowd/dog.png")] public static var dog_sprite:Class; + + + private var timer:Float=0; + + private var state:Int=0; + private var s_pace:Int=0; + private var pace_vel:Int=20; + private var pace_timer_max:Float=1.0; + + private var s_alert:Int=1; + private var alert_timer_max:Float=1.0; + private var s_attack:Int=2; + private var attack_pts:Array=new Array(new Point(), new Point(), new Point(), new Point(), new Point()); + private var vel_base_attack:Float=60; + private var attack_speeds:Array=new Array(1.1, 1.4, 1.4, 1.6, 1.7); + private var attack_timer_max:Float=1.0;//latency before dog "gives up" going to a pt + + private var s_attack_phase:Int=0; + private var s_dead:Int=3; + + private var Dead_Frame:Int=7; + + private var hit_timer_max:Float=1.5; + private var hit_timer:Float=0; + + private var active_region:FlxObject=new FlxObject(0, 0, 96, 96); + + private var type:Int=0; + private var T_NORMAL:Int=0; + private var T_SUPER:Int=1; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* DOG ANIMATIONS*/ + loadGraphic(dog_sprite, true, false, 16, 16); + width=height=12; + offset.y=offset.x=2; + drag.x=20; + + addAnimation("stop_d", [0]); + /* walk_l is walk_r reflected */ + addAnimation("walk_l", [2, 3], 4, true); + addAnimation("walk_r", [2, 3], 4, true); + addAnimation("alert", [4, 5], 5); + /* attack_l is attack_r reflected */ + addAnimation("attack_r", [6, 7],6,true); + addAnimation("attack_l", [6, 7 ],6,true); + addAnimation("die", [1, 2, 3, 4, 4, 3, 1, 3, 2, 1,7], 15, false); + + addAnimationCallback(set_scale); + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + + if(parseInt(xml.@type)==T_SUPER){ + type=T_SUPER; + health=3; + } else { + health=3; + type=T_NORMAL; + } + + add_sfx("bark", Registry.sound_data.dog_bark_group); + add_sfx("dash", Registry.sound_data.dog_dash); + } + override public function preUpdate():Void + { + FlxG.collide(parent.curMapBuf, this); + super.preUpdate(); + } + + override public function update():Void + { + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + + for(var sp:Switch_Pillar in Registry.subgroup_switch_pillars){ + if(sp !=null &&(sp.frame==sp.up_frame)){ + FlxG.collide(sp, this); + } + } + if(player.state !=player.S_AIR && player.overlaps(this)&&(xml.@alive !="false")){ + player.touchDamage(1); + } + + for(var g:Gate in Registry.subgroup_gates){ + if(g !=null){ + if(g.overlaps(this)){ + velocity.x=velocity.y=0; + } + } + } + + /* pin active region to self */ + active_region.x=x - 40; + active_region.y=y - 40; + if(hit_timer=hit_timer_max){ + if(player.broom.overlaps(this)&& player.broom.visible){ + hit_timer=0; + health--; + flicker(hit_timer_max); + play_sfx(HURT_SOUND_NAME); + } + } + } + /* pace and wait for player to get near */ + if(state==s_pace){ + timer +=FlxG.elapsed; + if(timer>pace_timer_max){ + if(FlxG.random()>0.33){ + play("walk_r"); + velocity.x=pace_vel; + } else { + if(FlxG.random()>0.5){ + play("walk_l"); + velocity.x=-pace_vel; + } else { + play("stop_d"); + velocity.x=0; + } + } + timer=0; + } + if(active_region.overlaps(player)){ + state=s_alert; + velocity.x=velocity.y=0; + play("alert"); + play_sfx("bark"); + timer=0; + } + /* set points for dash attack */ + } else if(state==s_alert){ + timer +=FlxG.elapsed; + if(timer>alert_timer_max){ + state=s_attack; + timer=0; + velocity.y=30; + /* Set up points for dog to dash to */ + attack_pts[0].x=player.x - 50 + 12 * Math.random();// LEFT + attack_pts[0].y=player.y - 8; + + attack_pts[1].x=player.x + 30 + 12 * Math.random(); + attack_pts[1].y=player.y - 8;// right + + attack_pts[2].x=player.x - 50 + 12*Math.random(); + attack_pts[2].y=player.y - 8;// DOWN + + EventScripts.scale_vector(new Point(x, y), attack_pts[0], velocity, vel_base_attack * attack_speeds[0]); + + + if(velocity.x>0){ + play("attack_r"); + } else { + play("attack_l"); + } + } + /* dash to points and then reset */ + } else if(state==s_attack){ + var p_done:Int=0; + + timer +=FlxG.elapsed; + if(timer>attack_timer_max){ + velocity.x=velocity.y=0; + timer=0; + p_done=2; + s_attack_phase++; + + } + /* When the dash timer runs out*/ + if(p_done==2){ + + /* If SUPER dog,dynamically determine dash points */ + if(s_attack_phase<=4 && type==T_SUPER){ + if(player.x>x){ + attack_pts[s_attack_phase].x=player.x + 25;// RIGHT + attack_pts[s_attack_phase].y=player.y + 8; + } else { + attack_pts[s_attack_phase].x=player.x - 28;// LEFT + attack_pts[s_attack_phase].y=player.y - 8; + } + } + /* change the velocity if the dog doesn't need to stop */ + if(s_attack_phase<5){ + EventScripts.scale_vector(new Point(x, y), attack_pts[s_attack_phase], velocity, vel_base_attack * attack_speeds[s_attack_phase]); + } + /* Set the correct attacking anim*/ + if(velocity.x>0){ + play("attack_r"); + } else { + play("attack_l"); + } + + /* State change */ + if(type==T_NORMAL && s_attack_phase>2){ + state=s_pace; + velocity.x=velocity.y=0; + play("walk_r"); + s_attack_phase=0; + } else if(s_attack_phase>4){ + state=s_pace; + s_attack_phase=0; + } else { + + play_sfx("dash"); + } + } + } else if(state==s_dead){ + // if(frame==Dead_Frame){ + xml.@alive="false"; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 1.0); + EventScripts.make_explosion_and_sound(this); + //play die sound effect + exists=false;//:( + //} + } + super.update(); + } + + public function set_scale(name:String,frame_nr:Int,frame_idx:Int):Void { + if(name=="walk_l" || name=="stop_l"){ + scale.x=-1; + } else if(name=="attack_l"){ + scale.x=-1; + } else { + scale.x=1; + } + + + } + + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/Frog.hx b/intra/source/entity/enemy/crowd/Frog.hx new file mode 100644 index 0000000..ed66dfd --- /dev/null +++ b/intra/source/entity/enemy/crowd/Frog.hx @@ -0,0 +1,309 @@ +package entity.enemy.crowd +{ +import data.Common_Sprites; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxBasic; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import entity.player.Player; +import data.CLASS_ID; +class Frog extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.FROG; + public var player:Player; + public var parent:Dynamic; + + //[Embed(source="../../../res/sprites/enemies/crowd/frog.png")] public static var frog_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/frog_bullet.png")] public var frog_bullet_sprite:Class; + + private var state:Int=0; + private var s_face_player:Int=0; + private var s_shoot:Int=1; + private var s_dying:Int=2; + private var s_dead:Int=3; + private var has_shot:Bool=false + private var did_shoot_anim:Bool=false + private var added_to_parent:Bool=false; + + public var y_bullets:FlxGroup=new FlxGroup(); + public var BULLET_EMPTY_FRAME:Int=3; + + private var dame_frame:Int; + private var hit_timer:Float=0; + private var hit_timer_max:Float=1.0; + + private var init_latency:Float=0.8; + + + //dame - p(1), alive , frame(attk type) + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Frog animations */ + loadGraphic(frog_sprite, true, false, 16, 16); + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + addAnimation("idle_d", [6,7], 2, true); + addAnimation("shoot_d", [8], 3, false); + addAnimation("shoot_r", [8], 3, false);// DEFAULT:R + addAnimation("shoot_l", [8], 3, false); + addAnimation("shoot_u", [8], 3, false); + } else { + addAnimation("idle_d", [0, 1], 2, true); + addAnimation("shoot_d", [3], 3, false); + addAnimation("shoot_r", [4], 3, false);// DEFAULT:R + addAnimation("shoot_l", [4], 3, false); + addAnimation("shoot_u", [5], 3, false); + } + play("idle_d"); + addAnimationCallback(on_anim_change); + + add_sfx("shoot", Registry.sound_data.bubble_triple_group); + add_sfx("pop", Registry.sound_data.bubble_group); + + dame_frame=parseInt(xml.@frame); + immovable=true; + health=2; + + for(i in 0...3){ + var b:FlxSprite=new FlxSprite; + // TODO:add bullet gfx, test frog placeholders + b.loadGraphic(frog_bullet_sprite, true, false, 8, 8); + b.exists=false; + /* Add bullet shadow anims, of which there are none */ + b.my_shadow=EventScripts.make_shadow("8_small",true); + b.my_shadow.play("get_big"); + + + /* Add bullet animations */ + if(Registry.BOI && Registry.CURRENT_MAP_NAME=="REDCAVE"){ + b.addAnimation("bullet_move", [4,5], 12); + b.addAnimation("bullet_explode", [2, 3, 3], 8, false); + } else { + b.addAnimation("bullet_move", [0, 1], 12); + b.addAnimation("bullet_explode", [2, 3, 3], 8, false); + } + BULLET_EMPTY_FRAME=3; + b.play("bullet_move"); + + y_bullets.add(b); + var p:Parabola_Thing=new Parabola_Thing(b, 16,0.8 + Math.random(), "offset", "y"); + if(dame_frame==2){ + b.velocity.y=15 *(i + 1); + } else { + b.velocity.x=-15 *(i + 1); + } + b.parabola_thing=p; + b.parabola_thing.set_shadow_fall_animation("get_big"); + } + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="shoot_l"){ + scale.x=-1; + } else { + scale.x=1; + } + } + + override public function update():Void + { + + if(init_latency>0){ + init_latency -=FlxG.elapsed; + return; + } + + if(player.overlaps(this)&& visible && player.state !=player.S_AIR){ + player.touchDamage(1); + } + if(health<=0 && state !=s_dead){ + state=s_dying; + } + var b:FlxSprite; + if(!added_to_parent){ + added_to_parent=true; + //get draw order right later + for(b in y_bullets.members){ + if(b==null)continue; + parent.bg_sprites.add(b.my_shadow) + parent.fg_sprites.add(b); + } + } + + hit_timer -=FlxG.elapsed; + if(player.broom.overlaps(this)&& player.broom.visible){ + if(hit_timer<=0){ + flicker(hit_timer_max); + hit_timer=hit_timer_max; + health--; + play_sfx(HURT_SOUND_NAME); + } + } + + if(state==s_face_player){ + + var dx:Int=player.x - x; + var dy:Int=player.y - y; + + if(dx>0){ + if(Math.abs(dy)0){ + facing=DOWN; + } else { + facing=UP; + } + } else { + if(Math.abs(dy)0){ + facing=DOWN; + } else { + facing=UP; + } + } + + if(EventScripts.distance(player, this)<64){ + state=s_shoot; + + } + } else if(state==s_shoot){ + if(!did_shoot_anim){ + + if(facing==DOWN){ + play("shoot_d"); + } else if(facing==LEFT){ + play("shoot_l"); + } else if(facing==RIGHT){ + play("shoot_r"); + } else { + play("shoot_u"); + } + did_shoot_anim=true; + + for(b in y_bullets.members){ + if(b==null)continue; + b.my_shadow.play("get_small"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.parabola_thing.reset_time(); + b.velocity=EventScripts.scale_vector(this, player, b.velocity, 15 *(y_bullets.members.indexOf(b)+ 1))as FlxPoint; + b.exists=b.visible=true; + b.my_shadow.exists=true; + b.x=b.my_shadow.x=x; + b.y=b.my_shadow.y=y; + b.play("bullet_move"); + } + + play_sfx("shoot"); + } else { + var nr_done:Int=0; + + for(b in y_bullets.members){ + if(b==null)continue; + if(!b.exists){ + nr_done++; + continue; + } + // Move until touches player... + if(!b.parabola_thing.tick()){ + + b.my_shadow.y=b.y; + b.my_shadow.x=b.x; + if(b.offset.y<8){ + if(player.overlaps(b)){ + player.touchDamage(1); + b.play("bullet_explode"); + } + } + //...or hits ground. + } else { + // First time it hits ground, play pop sound. + if(b.velocity.x !=0 && b.velocity.y !=0){ + play_sfx("pop"); + } + b.play("bullet_explode"); + b.velocity.x=b.velocity.y=0; + if(b.frame==BULLET_EMPTY_FRAME){ + b.offset.y=0; + b.my_shadow.exists=false; + b.exists=b.visible=false; + nr_done++; + } + } + } + + if(nr_done==3){ + state=s_face_player; + did_shoot_anim=false; + play("idle_d"); + + } + + } + } else if(state==s_dying){ + //play("die"); + //sfx + //do the below once + trace("dead!"); + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + xml.@alive="false"; + solid=false; + visible=false; + } else if(state==s_dead){ + for(b in y_bullets.members){ + if(b==null)continue; + if(!b.parabola_thing.tick()){ + + b.my_shadow.y=b.y; + b.my_shadow.x=b.x; + if(b.offset.y<8){ + if(player.overlaps(b)){ + player.touchDamage(1); + } + } + } else { + b.play("bullet_explode"); + b.my_shadow.exists=false; + + b.velocity.x=b.velocity.y=0; + if(b.frame==BULLET_EMPTY_FRAME){ + b.offset.y=0; + b.exists=false; + } + + } + } + } + super.update(); + } + + + + override public function destroy():Void + { + + for(var b:FlxSprite in y_bullets.members){ + + parent.fg_sprites.remove(b, true); + } + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/Person.hx b/intra/source/entity/enemy/crowd/Person.hx new file mode 100644 index 0000000..93f42df --- /dev/null +++ b/intra/source/entity/enemy/crowd/Person.hx @@ -0,0 +1,173 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.system.FlxTile; + +class Person extends FlxSprite +{ + + + + public var xml:XML; + public var cid:Int=CLASS_ID.PERSON; + public var player:Player; + public var parent:Dynamic; + public var switch_dir_timer_max:Float=1.3; + public var switch_dir_timer:Float=0.6; + public var initial_vel_timeout:Float=2; + public var wait:Int=0; + public var speed:Int=10; + + public var cur_x_vel:Int=0; + public var cur_y_vel:Int=0; + + public var init_vel:Point=new Point(0, 0); + + public var dame_frame:Int; + + private var collide_timeout:Int=0; + + private var talk_timer:Float; + + //[Embed(source="../../../res/sprites/enemies/crowd/person.png")] public static var person_sprite:Class; + /* + * dame params:frame:the direction of player travel this one opposes(or none at all) + * URDLN, unsurprisingly... 01234 + * direction given away by the way they walk initially + * */ + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(person_sprite, true, false, 16, 16); + addAnimation("walk_d", [0, 1], 5); + addAnimation("walk_r", [2,3], 5); + addAnimation("walk_u", [4,5], 5); + addAnimation("walk_l", [2, 3], 5); + addAnimationCallback(on_anim_change); + height=2; + width=4; + offset.y=13; + offset.x=7; + talk_timer=0.5 + Math.random(); + + dame_frame=parseInt(xml.@frame); + switch(dame_frame){ //urdln + case 0:init_vel.y=10;play("walk_d");break; + case 1:init_vel.x=10;play("walk_r");break; + case 2:init_vel.y=-10;play("walk_u");break; + case 3:init_vel.x=-10;play("walk_l");break; + case 4:init_vel.x=init_vel.y=-10 + 20 * Math.random(); + if(init_vel.x>0){ + play("walk_r"); + } else { + play("walk_l"); + } + switch_dir_timer=0.3; + switch_dir_timer_max=0.5; + drag.x=20; + drag.y=20; + break; + } + + add_sfx("talk", Registry.sound_data.talk_group); + } + + + override public function preUpdate():Void + { + + //urdln + //which dir of travel it blocks + //allow pushing if touching to olong + if(collide_timeout>1){ + collide_timeout=0; + FlxG.collide(parent.curMapBuf, this); + } else { + collide_timeout++; + } + + /* When the player touches, change player's velocity and + * maybe collide with the player as well. */ + if(player.overlaps(this)){ + player.slow_mul=0.5; + player.slow_ticks=7; + player.velocity.x *=0.25; + player.velocity.y *=0.25; + FlxG.collide(this, player); + player.velocity.x *=4; + player.velocity.y *=4; + } + super.preUpdate(); + } + override public function update():Void + { + + if(talk_timer<0){ + talk_timer=0.5 + Math.random(); + play_sfx("talk",true); + } else { + talk_timer -=FlxG.elapsed; + } + + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } else { + return; + } + } + + switch_dir_timer -=FlxG.elapsed; + initial_vel_timeout -=FlxG.elapsed; + /* Switch directions semi-randomly */ + if(switch_dir_timer<0){ + /* Walk in an initial velocity for a fixed period of time */ + if(initial_vel_timeout>0){ + velocity.x=init_vel.x; + velocity.y=init_vel.y; + } else { + switch_dir_timer=switch_dir_timer_max; + if(Math.random()>0.5){ + velocity.y=0; + if(Math.random()>0.5){ + velocity.x=speed; + play("walk_r"); + } else { + velocity.x=-speed; + play("walk_l"); + } + } else { + velocity.x=0; + if(Math.random()>0.5){ + velocity.y=speed; + play("walk_d"); + } else { + velocity.y=-speed; + play("walk_u"); + } + } + } + } + super.update(); + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="walk_l"){ + scale.x=-1; + } else { + scale.x=1; + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/Rotator.hx b/intra/source/entity/enemy/crowd/Rotator.hx new file mode 100644 index 0000000..c8a9631 --- /dev/null +++ b/intra/source/entity/enemy/crowd/Rotator.hx @@ -0,0 +1,79 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * Simple enemy - harmful sprite rotates about center thing + * @author Seagaia + */ +class Rotator extends FlxSprite +{ + + //[Embed(source="../../../res/sprites/enemies/crowd/f_rotator.png")] public static var rotator_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_rotator_ball.png")] public static var rotator_ball_sprite:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.ROTATOR; + public var player:Player; + public var sprite_ball:FlxSprite; + public var avel:Float=0.02; + public var r:Float=0; + + private var t_timeout:Float=1.4; + /** + * dame props: + * frame:both the sprite to use as well as the rotational radius/speed... see types + * + */ + public function new(_xml:XML,_player:Player) + { + xml=_xml; + player=_player; + super(parseInt(xml.@x), parseInt(xml.@y)); + + + sprite_ball=new FlxSprite(0, 0); + sprite_ball.loadGraphic(rotator_ball_sprite, true, false, 8, 8); + sprite_ball.rotate_angle=0; + sprite_ball.addAnimation("ball_move", [0, 1], 10); + sprite_ball.play("ball_move"); + + sprite_ball.width=sprite_ball.height=4; + sprite_ball.offset.x=sprite_ball.offset.y=2; + sprite_ball.x +=2;sprite_ball.y +=2; + + loadGraphic(rotator_sprite, true, false, 16, 16); + + + width=6; + height=5; + offset.x=5; + offset.y=2; + x +=5;y +=2; + + + addAnimation("tower_pulsate", [0, 1], 10); + play("tower_pulsate"); + immovable=true; + + } + + override public function update():Void + { + + if(r<59){ + r +=0.5; + } + EventScripts.rotate_about_center_of_sprite(this, sprite_ball, r, avel, 8, 8); + FlxG.collide(player, this); + if(Registry.GAMESTATE.state !=Registry.GAMESTATE.S_TRANSITION && sprite_ball.overlaps(player)&& player.state !=player.S_AIR){ + + player.touchDamage(1); + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/Spike_Roller.hx b/intra/source/entity/enemy/crowd/Spike_Roller.hx new file mode 100644 index 0000000..51653f2 --- /dev/null +++ b/intra/source/entity/enemy/crowd/Spike_Roller.hx @@ -0,0 +1,284 @@ +package entity.enemy.crowd +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +import entity.player.Player; +import data.CLASS_ID; + +/** + * pretty self explanatoory + * falls from ceiling and rolls across the room stops on other side + * roomm should be empty from obstacles or this looks awkward + */ +class Spike_Roller extends FlxSprite +{ + public var xml:XML; + public var cid:Int=CLASS_ID.SPIKE_ROLLER; + public var player:Player; + public var parent:Dynamic; + + public var added_extras:Bool=false; + private var transitioned_in:Bool=false; + public var dame_type:Int=0; + private var state:Int=0; + private var s_hidden:Int=0; + private var s_fall:Int=1; + private var s_roll:Int=2; + private var s_stopped:Int=3; + + private var vel_x:Int=0; + private var vel_y:Int=0; + private var Fall_Rate:Float=1.0; + private var init_pt:Point=new Point(); + + private var is_bounce:Bool=false; + private var bounce_vel:Int=45; + private var ctr:Int=0; + + + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller.png")] public var Spike_Roller_Sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_horizontal.png")] public static var Spike_Roller_Sprite_H:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_shadow.png")] public var vert_shadow_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/spike_roller_horizontal_shadow.png")] public var hori_shadow_sprite:Class; + + + + // Dame:Frame:URLD 0123 + // Bounce - 4567 + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + dame_type=parseInt(_xml.@frame); + + my_shadow=new FlxSprite(x, y); + + switch(dame_type % 4){ + case 0: + loadGraphic(Spike_Roller_Sprite_H, true, false, 128, 16); + height=12; + my_shadow.loadGraphic(hori_shadow_sprite, true, false, 128, 16); + vel_y=-20; + facing=UP;break; + case 1: + loadGraphic(Spike_Roller_Sprite, true, false, 16, 128); + width=12; + vel_x=20; + my_shadow.loadGraphic(vert_shadow_sprite, true, false, 16, 128); + facing=RIGHT;break; + case 3: + loadGraphic(Spike_Roller_Sprite_H, true, false, 128, 16); + height=12; + my_shadow.loadGraphic(hori_shadow_sprite, true, false, 128, 16); + vel_y=20; + facing=DOWN;break; + case 2: + loadGraphic(Spike_Roller_Sprite, true, false, 16, 128); + width=12; + my_shadow.loadGraphic(vert_shadow_sprite, true, false, 16, 128); + vel_x=-20; + facing=LEFT;break; + + } + + /* ADd spike roller animations */ + addAnimation("roll_l", [0, 1], 5); + addAnimation("roll_r", [0, 1], 5);// DEFAULT RIGHT + addAnimation("roll_d", [0, 1], 5);//DEFAULT DOWN + addAnimation("roll_u", [0, 1], 5); + addAnimation("idle", [0]); + play("idle"); + + /* add shadow animations */ + my_shadow.addAnimation("hiding", [0]); + my_shadow.addAnimation("fall", [0], 2); + my_shadow.play("hiding"); + my_shadow.flicker(-1); + + + visible=my_shadow.visible=false; + + /* If bounce type */ + if(dame_type>3){ + has_tile_callbacks=false; + offset.y=0; + is_bounce=true; + play("roll_l"); + if(vel_x>0){ + play("roll_r"); + } else if(vel_x<0){ + play("roll_l"); + } else if(vel_y<0){ + play("roll_u"); + } else { + play("roll_d"); + } + visible=true; + } else { + offset.y=80; + immovable=true; + } + + Registry.subgroup_spike_rollers.push(this); + } + override public function preUpdate():Void + { + ctr++; + if(is_bounce && ctr==4){ + ctr=0; + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + private function bounce_logic():Void { + if(touching){ + if(touching & LEFT){ + play("roll_r"); + velocity.x=bounce_vel; + } else if(touching & RIGHT){ + play("roll_l"); + scale.x=-1; + velocity.x=-bounce_vel; + } else if(touching & DOWN){ + play("roll_u"); + scale.y=-1; + velocity.y=-bounce_vel; + } else { + play("roll_d"); + velocity.y=bounce_vel; + } + + Registry.sound_data.hitground1.play(); + } + + + if(player.state !=player.S_AIR && player.overlaps(this)){ + player.touchDamage(1); + } + + } + + private var move_that_shit_to_front_ticks:Int=5; + private var moveeeeeeeeeeeed:Bool=false; + override public function update():Void + { + + if(!added_extras){ + added_extras=true; + init_pt.x=x; + init_pt.y=y; + if(is_bounce){ + velocity.x=vel_x * 2; + velocity.y=vel_y * 2; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } else { + my_shadow.x=x; + my_shadow.y=y; + parent.bg_sprites.add(my_shadow); + parent.sortables.remove(this, true); + parent.fg_sprites.add(this); + } + } + + + if(move_that_shit_to_front_ticks>0){ + move_that_shit_to_front_ticks -=1; + } else { + if(Registry.CURRENT_MAP_NAME !="BLUE" && Registry.CURRENT_MAP_NAME !="CIRCUS" && moveeeeeeeeeeeed==false && is_bounce){ + moveeeeeeeeeeeed=true; + parent.bg_sprites.move_to_front(this); + + } + } + + if(parent.state==parent.S_TRANSITION){ + if(!transitioned_in){ + x=init_pt.x; + y=init_pt.y; + } else { + velocity.x=velocity.y=0; + } + return; + } else { + transitioned_in=true; + } + + if(is_bounce){ + bounce_logic(); + return; + } + switch(state){ + case s_hidden: + if(player.overlaps(my_shadow)){ + state=s_fall; + my_shadow.play("fall"); + my_shadow.exists=true; + exists=true; + Registry.sound_data.fall1.play(); + my_shadow.visible=visible=true; + } + break; + case s_fall: + offset.y -=Fall_Rate; + if(offset.y<0){ + if(facing==UP || facing==DOWN){ + offset.y=2; + } else { + offset.y=0; + offset.x=2; + } + Registry.sound_data.hitground1.play(); + state=s_roll; + velocity.x=vel_x; + velocity.y=vel_y; + parent.fg_sprites.remove(this, true); + parent.bg_sprites.add(this); + my_shadow.visible=false; + + if(vel_x>0){ + play("roll_r"); + } else if(vel_x<0){ + play("roll_l"); + scale.x=-1; + } else if(vel_y<0){ + play("roll_u"); + scale.y=-1; + } else { + play("roll_d"); + } + + } + break; + case s_roll: + if(player.state !=player.S_AIR &&(player.overlaps(this))){ + player.touchDamage(1); + } + if(Math.abs(init_pt.x - x)>=112){ + Registry.sound_data.hitground1.play(); + velocity.x=0; + state=s_stopped; + } else if(Math.abs(init_pt.y - y)>=112){ + Registry.sound_data.hitground1.play(); + velocity.y=0; + state=s_stopped; + } + break; + case s_stopped: + frame=0; + if(player.state !=player.S_AIR &&(player.overlaps(this))){ + player.touchDamage(1); + } + + break; + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/crowd/WallBoss.hx b/intra/source/entity/enemy/crowd/WallBoss.hx new file mode 100644 index 0000000..9f49b49 --- /dev/null +++ b/intra/source/entity/enemy/crowd/WallBoss.hx @@ -0,0 +1,896 @@ +package entity.enemy.crowd +{ +import data.CLASS_ID; +import data.Common_Sprites; +import data.TileData; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; + +/** + * The 3rd boss. Face on a wall, and two fists. + * Basically. + * @author Seagaia + */ +class WallBoss extends FlxSprite +{ + + /* Generic properties */ + public var tl:Point=new Point(); + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + public var cid:Int=CLASS_ID.WALLBOSS; + private var max_health:Int=12; + public var cur_phase:Int=0; + private var phase_2_health:Int=10; + private var phase_3_health:Int=5; + private var fade_in_alpha_rate:Float=0.04; + private var fade_out_alpha_rate:Float=0.003; + private var broke_ground:Bool=false; + + private var talk_timer:Float=0; + + + + + /* wall properties */ + public var wall:FlxSprite; + private var death_explosions:FlxGroup=new FlxGroup(4); + private var death_explosion_timer:Float=0.25; + private var tm_de:Float=0.20; + + /* Face properties */ + public var face:FlxSprite; + private var s_face:Int=-1; + private var s_face_intro:Int=-1; + private var s_face_normal:Int=0; + private var s_face_charge:Int=1; + private var s_face_hit:Int=2; + private var s_face_dying:Int=3; + private var s_face_dead:Int=4; + private var s_face_shoot:Int=5; + public var hurt_t:Float=0; + public var hurt_tm:Float=1.0; + public var charge_t:Float=0; + public var charge_tm:Float=3.0; + public var finish_charge_tm:Float=1.0; + public var face_bullets:FlxGroup=new FlxGroup(8); + public var nr_bullets:Array=new Array(5, 6, 8); + + /* Hand properties */ + public var lhand:FlxSprite; + public var rhand:FlxSprite; + private var lhand_init_pt:Point=new Point(); + private var rhand_init_pt:Point=new Point(); + + private var lhand_poof:FlxSprite=new FlxSprite; + private var rhand_poof:FlxSprite=new FlxSprite; + + + private var s_hand:Int=0; + private var s_hand_intro:Int=0; + + private var s_hand_float:Int=1; + private var t_float:Float=0; + private var tm_float:Float=2.0; + + private var s_hand_push:Int=2; + private var max_nr_pushes:Array=new Array(2,3, 3); + private var nr_pushes:Int=0; + private var push_y_vel:Array=new Array(60, 90, 120); + private var p_double_push:Array=new Array(0.5, 0.7, 0.8); + + + /** + * Lhand only=0, rhand=1, both=2 + */ + private var push_type:Int=0; + private var ctr_hand_push:Int=0; + + + private var s_hand_stomp:Int=3; + private var s_hand_stomp_rhand:Int=LEFT; + private var max_nr_falls:Array=new Array(2, 3, 4); + private var nr_falls:Int=0;//counter + private var period_lhand_stomp:Float=2.0; + private var ctr_hand_stomp:Int=0;//sub-state ctr + private var rhand_stomp_vel:Float=30; + private var t_lhand_stomp:Float=0; + private var tm_lhand_stomp:Float=0.7 + private var played_sound:Bool=false; + + /* laser states*/ + + private var s_hand_h_laser:Int=4; + private var s_hand_h_laser_ctr:Int=0; + public var h_laser:FlxSprite=new FlxSprite(); + + private var s_hand_dying:Int=5; + private var t_dying:Float=0; + private var tm_dying:Float=3; + + private var s_hand_dead:Int=6; + + private var do_intro:Bool=true; + private var Intro_ctr:Int=0; + + + /* Assets */ + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_wall.png")] public static var wall_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_laser.png")] public var laser_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/wallboss_bullet.png")] public var bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_face.png")] public static var face_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_l_hand.png")] public static var l_hand_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/crowd/f_wallboss_l_hand.png")] public static var r_hand_sprite:Class; + + /* N.B. all Interactive entities added and removed directly in this code */ + public function new(_x:XML,_p:Player,_s:Dynamic) + { + /* boilerplate */ + xml=_x; + player=_p; + parent=_s; + + super(parseInt(_x.@x), parseInt(_x.@y)); + tl.x=Registry.CURRENT_GRID_X * 160 + 16; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT + 16; + var ctr:Int; + + health=max_health; + visible=false; + + + wall=new FlxSprite(tl.x - 16, tl.y - 16); + face=new FlxSprite(tl.x +(128 - 64)/ 2, tl.y - 16); + lhand=new FlxSprite(tl.x, tl.y + 16); + rhand=new FlxSprite(tl.x + 16 * 6, tl.y + 16); + + /* init wall entities */ + wall.loadGraphic(wall_sprite, true, false, 160, 32); + wall.addAnimation("move", [0, 1], 4); + wall.play("move"); + wall.immovable=true; + + // Death explosions + for(ctr=0;ctrcharge_tm){ + s_face=s_face_charge; + charge_t=0; + } + if(hurt_t>hurt_tm){ + if(player.broom.visible && player.broom.overlaps(face)){ + health--; + if(health==phase_2_health)cur_phase=1; + if(health==phase_3_health)cur_phase=2; + if(health==0){ + s_face=s_face_dying; + s_hand=s_hand_dying; + play_sfx("hurt_2"); + } else { + + play_sfx("hurt"); + } + hurt_t=0; + face.play("hurt"); + } else { + face.play("normal"); + } + } else { + hurt_t +=FlxG.elapsed; + } + //charge up, and then set all teh bullet properties + } else if(s_face==s_face_charge){ + face.play("charge"); + charge_t +=FlxG.elapsed; + if(charge_t>finish_charge_tm){ + charge_t=0; + s_face=s_face_shoot; + face.play("shoot"); + play_sfx("shoot"); + face_bullets.setAll("exists", true); + + for(s in face_bullets.members){ //BARF + if(s==null)continue; + s.x=face.x + 32; + s.y=face.y + 16; + s.parabola_thing=null; + s.parabola_thing=new Parabola_Thing(s, 16 + Std.int(8 * Math.random()), 1 + 0.5 * Math.random(), "offset", "y"); + s.parabola_thing.set_shadow_fall_animation("get_big"); + s.velocity.x=-30 + Std.int(60 * Math.random()); + s.velocity.y=30; + + s.my_shadow.exists=true; + s.my_shadow.play("get_small"); + s.my_shadow.x=s.x; + s.my_shadow.y=s.y; + } + } + //release bullets and chek for collisions. return to normal state + // when all bullets have hit the ground. + } else if(s_face==s_face_shoot){ + for(s in face_bullets.members){ + s.my_shadow.x=s.x;//pin shadow to bullet + s.my_shadow.y=s.y; + if(!player.invincible && s.overlaps(player)&& s.alive && s.exists){ //check overlap only if player vulnerable + player.touchDamage(1); + } + + if(s.parabola_thing.tick()){ + if(s.alive && s.exists){ + s.alive=false; + s.play("explode"); + play_sfx("pop"); + s.my_shadow.exists=false; + s.velocity.x=s.velocity.y=0; + + } else { + if(s._curAnim.frames.length - 1==s._curFrame){ + if(s.exists){ + s.alive=true; + s.exists=false; + s.play("move"); + } + } + } + + } + + if(!s.exists){ + ctr++; + } + } + if(ctr>=face_bullets.maxSize){ + s_face=s_face_normal; + } + } else if(s_face==s_face_intro){ + //play some sort of animation + //wait for hands to appear + if(s_hand !=s_hand_intro){ + s_face=s_face_normal; + } + + } else if(s_face==s_face_dying){ + + if(t_dying<0){ + if(!played_sound){ + DH.start_dialogue(DH.name_wallboss, DH.scene_wallboss_after_fight); + player.be_idle(); + played_sound=true; + play_sfx("death"); + } + + if(!DH.scene_is_finished(DH.name_wallboss, DH.scene_wallboss_after_fight)){ + super.update(); + return; + } + + face.alpha -=fade_out_alpha_rate; + wall.alpha -=fade_out_alpha_rate; + if(face.alpha==0 && wall.alpha==0){ + s_face=s_face_dead; + t_dying=1; + } + } else if(s_hand==s_hand_dead){ + t_dying -=FlxG.elapsed; + } + + } else if(s_face==s_face_dead){ + if(t_dying<0){ + Registry.sound_data.start_song_from_title("CROWD"); + Registry.GRID_ENEMIES_DEAD++; + //if(!Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]){ + // Registry.CURRENT_CUTSCENE=Cutscene.Terminal_Gate_Crowd; + // Registry.E_Load_Cutscene=true; + //} + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + xml.@alive="false"; + exists=false; + } else { + t_dying -=FlxG.elapsed; + } + } + + /**************/ + /* Hand logic */ + //only collide if not in stomp state + + set_shadow_size(lhand); + set_shadow_size(rhand); + + if(s_hand !=s_hand_stomp){ + FlxG.collide(player, lhand); + FlxG.collide(player, rhand); + } + if(s_hand==s_hand_intro){ + rhand.alpha +=fade_in_alpha_rate; + lhand.alpha +=fade_in_alpha_rate; + if(lhand.alpha==1 && rhand.alpha==1){ + s_hand=s_hand_float; + } + /* Floating logic */ + } else if(s_hand==s_hand_float){ + t_float +=FlxG.elapsed; + if(t_float>tm_float){ + t_float=0; + + choose_attack(); + if(s_hand==s_hand_push){ + nr_pushes=max_nr_pushes[cur_phase]; + } + + } + lhand.y=lhand_init_pt.y + 4 + Math.sin(t_float * 6.28)* 8; + rhand.y=rhand_init_pt.y + 4 - Math.sin(t_float * 6.28)* 8; + /* Logic for pushing */ + } else if(s_hand==s_hand_push){ + var sub_ctr:Int=0; + //move hands to correct place then depending on the type of + //attack, set velocities + if(ctr_hand_push==0){ + if(push_type !=0){ + if(EventScripts.send_property_to(lhand, "y", tl.y, 0.5))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", tl.x, 0.5))sub_ctr++; + } else { + sub_ctr +=2; + } + if(push_type !=1){ + if(EventScripts.send_property_to(rhand, "y", tl.y, 0.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", tl.x + 16*6, 0.5))sub_ctr++; + } else { + sub_ctr +=2; + } + + if(sub_ctr==4){ + if(push_type !=1){ + rhand.play("push"); + play_sfx("push"); + rhand.velocity.y=push_y_vel[cur_phase]; + rhand.velocity.x=-20 - 40 * Math.random(); + } + if(push_type !=0){ + lhand.play("push"); + play_sfx("push"); + lhand.velocity.y=push_y_vel[cur_phase]; + lhand.velocity.x=20 + 40 * Math.random(); + } + + ctr_hand_push++; + } + //if the hand goes far enough, then change states + } else if(ctr_hand_push==1){ + if(lhand.y>tl.y + 5 * 16 || rhand.y>tl.y + 5*16){ + ctr_hand_push++; + } + //reset hand push script if more pushes, otherwise go back to float + } else if(ctr_hand_push==2){ + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 3))sub_ctr++; + + if(sub_ctr==4){ + ctr_hand_push=0; + lhand.play("idle"); + rhand.play("idle"); + lhand.velocity.y=lhand.velocity.x=0; + rhand.velocity.y=rhand.velocity.x=0; + set_next_push(); + nr_pushes--; + if(nr_pushes==0){ + s_hand=s_hand_float; + } + } + } + /* Logic for stomping */ + } else if(s_hand==s_hand_stomp){ + sub_ctr=0; + // Pin shadows to hands + lhand.my_shadow.x=lhand.x; + lhand.my_shadow.y=lhand.y + 20; + rhand.my_shadow.x=rhand.x; + rhand.my_shadow.y=rhand.y + 20; + // Init nuumber of falls and other things + if(ctr_hand_stomp==0){ + lhand.play("stomp"); + rhand.play("stomp"); + if(EventScripts.send_property_to(rhand, "y", tl.y + 16, 0.5)){ + ctr_hand_stomp++; + nr_falls=max_nr_falls[cur_phase]; + lhand.my_shadow.visible=rhand.my_shadow.visible=true; + } + //Stomp the rhand back and forth, have the lhand sort of follow the player + //state change when lhand stomps enough times + } else if(ctr_hand_stomp==1){ + if(rhand.parabola_thing.tick()){ + play_sfx("tap_ground"); + rhand_poof.exists=true; + rhand_poof.play("poof"); + rhand_poof.x=rhand.x; + rhand_poof.y=rhand.y; + rhand.parabola_thing.reset_time(); + } + if(rhand.offset.y<=8 && rhand.my_shadow.overlaps(player)){ + player.touchDamage(1); + } + if(s_hand_stomp_rhand==LEFT){ + rhand.velocity.x=-rhand_stomp_vel; + if(rhand.x(tl.x + 16 * 8 - rhand.width)){ + s_hand_stomp_rhand=LEFT; + } + } + //rise and fall for lhand + if(lhand.parabola_thing.t>(lhand.parabola_thing.period / 2)){ + if(!played_sound){ + play_sfx("fall"); + played_sound=true; + } + if(t_lhand_stomp>tm_lhand_stomp){ + if(lhand.parabola_thing.tick()){ + lhand_poof.exists=true; + lhand_poof.play("poof"); + play_sfx("hit_ground"); + lhand_poof.x=lhand.x; + lhand_poof.y=lhand.y; + lhand.parabola_thing.reset_time(); + nr_falls--; + played_sound=false; + FlxG.shake(0.01, 0.2); + //break the ground if damaged a bit + if(!broke_ground && cur_phase>=1){ + FlxG.shake(0.02, 0.5); + Registry.sound_data.floor_crack.play(); + if(break_ground()){ + broke_ground=true; + } + } + if(nr_falls==0){ + ctr_hand_stomp=2; + rhand.velocity.x=0; + rhand.my_shadow.visible=lhand.my_shadow.visible=false; + } + } + if(lhand.offset.y<8 && lhand.my_shadow.overlaps(player)){ + player.touchDamage(1); + } + } else { + t_lhand_stomp +=FlxG.elapsed; + } + } else { + EventScripts.send_property_to(lhand, "x", player.x, 1); + EventScripts.send_property_to(lhand, "y", player.y - 16, 1); + lhand.parabola_thing.tick(); + } + //reset then return to float state + } else if(ctr_hand_stomp==2){ + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 3))sub_ctr++; + if(EventScripts.send_property_to(rhand.offset, "y", 0, 2))sub_ctr++; + + if(sub_ctr==5){ + + lhand.play("idle"); + rhand.play("idle"); + s_hand=s_hand_float; + ctr_hand_stomp=0; + + } + } + } else if(s_hand==s_hand_h_laser){ + if(player.ytl.y + 16 * 5){ + lhand.velocity.y=rhand.velocity.y=-65; + s_hand_h_laser_ctr++; + } + } else if(s_hand_h_laser_ctr==2){ + if(lhand.ytl.y + 16 * 5){ + s_hand_h_laser_ctr++; + lhand.velocity.y=rhand.velocity.y=-20; + } + } else { + if(EventScripts.send_property_to(lhand, "y", lhand_init_pt.y, 1.5))sub_ctr++; + if(EventScripts.send_property_to(lhand, "x", lhand_init_pt.x, 1.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "y", rhand_init_pt.y, 1.5))sub_ctr++; + if(EventScripts.send_property_to(rhand, "x", rhand_init_pt.x, 1.5))sub_ctr++; + if(sub_ctr==4){ + h_laser.visible=false; + lhand.velocity.y=rhand.velocity.y=0; + s_hand=s_hand_float; + lhand.play("idle"); + rhand.play("idle"); + s_hand_h_laser_ctr=0; + } + } + + } else if(s_hand==s_hand_dying){ + + if(Registry.sound_data.current_song.playing){ + rhand.velocity.x=rhand.velocity.y=lhand.velocity.x=lhand.velocity.y=0; + Registry.sound_data.stop_current_song(); + Registry.sound_data.sun_guy_death_s.play(); + FlxG.flash(0xffffffff, 3); + t_dying=tm_dying; + } + if(t_dying>0){ + t_dying -=FlxG.elapsed; + death_explosions.exists=true; + super.update(); + return; + } + FlxG.shake(0.02, 0.1, null, true); + + + rhand.alpha -=fade_out_alpha_rate; + lhand.alpha -=fade_out_alpha_rate; + rhand.my_shadow.alpha -=fade_out_alpha_rate; + lhand.my_shadow.alpha -=fade_out_alpha_rate; + + if(death_explosion_timer<0){ + death_explosion_timer=tm_de; + for(var de:FlxSprite in death_explosions.members){ + if(!de.visible){ + de.visible=true; + de.play("explode"); + de.x=wall.x +(160 - de.width)* Math.random(); + de.y=wall.y + 32 * Math.random(); + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + break; + } else { + if(de._curAnim.frames.length - 1==de._curFrame){ + de.visible=false; + } + } + } + } else { + death_explosion_timer -=FlxG.elapsed; + } + if(rhand.alpha<=0.03 && lhand.alpha<=0.03){ + s_hand=s_hand_dead; + h_laser.visible=false; + rhand.my_shadow.visible=false; + lhand.my_shadow.visible=false; + } + } else if(s_hand==s_hand_dead){ + lhand.velocity.x=rhand.velocity.x=lhand.velocity.y=rhand.velocity.y=0; + + } + + //laser attacks + + super.update(); + } + + private function choose_attack():Void { + var r:Float=Math.random(); + switch(cur_phase){ + case 0: + if(r<=0.7){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + case 1: + if(r<=0.35){ + s_hand=s_hand_h_laser; + } else if(r<=0.7){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + case 2: + if(r<=0.5){ + s_hand=s_hand_h_laser; + } else if(r<=0.75){ + s_hand=s_hand_stomp; + } else { + s_hand=s_hand_push; + } + break; + } + } + + private function set_shadow_size(fist:FlxSprite):Void { + var y_off:Int=fist.offset.y; + + if(y_off>=29){ + fist.my_shadow.frame=0; + } else if(y_off>=24){ + fist.my_shadow.frame=1; + } else if(y_off>=16){ + fist.my_shadow.frame=2; + } else if(y_off>=8){ + fist.my_shadow.frame=3; + } else { + fist.my_shadow.frame=4; + } + } + /** + * Breaks the ground in the 6th row of the play area + */ + private function break_ground():Int { + var tile_indices:Array=new Array(62, 63, 64, 65, 66, 67); + var cracked_index:Int=71; + var is_broken:Bool=false; + for(var index:Int in tile_indices){ + var tm:FlxTilemap=parent.curMapBuf; + if(tm.getTileByIndex(index)!=cracked_index){ + tm.setTileByIndex(index, cracked_index, true); + } else { + tm.setTileByIndex(index, 81, true); + is_broken=true; + } + } + + return is_broken ? 1:0; + } + + /** + * Helper function, sets the some of the next push properties + */ + private function set_next_push():Void { + + if(Math.random()pre_thorn.y + 2){ + player.y=pre_thorn.y - player.height; + player.touchDamage(1); + } + super.update(); + } + + private var pre_thorn:FlxSprite; + private var pre_ctr:Int=0; + private function state_pre():Void { + switch(pre_ctr){ + case 0: + + pre_ctr=1; + break; + case 1: + if(player.y=new Array(100); + + private function update_parent_map(done:Bool):Void { + var during:Array=new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 172, 172, 173, 0, 0, 0, + 0, 171, 172, 181, 170, 170, 180, 172, 173, 0, + 0, 177, 170, 170, 170, 170, 170, 170,178, 0, + 0, 177, 170, 170, 170, 170, 170, 170, 178, 0, + 0, 174, 175, 175, 183, 182, 175, 175, 176, 0, + 0, 184, 185, 185, 177, 178, 185, 185, 186, 0 + ); + + var t:FlxTilemap; + t=parent.curMapBuf; + + if(saved_old==false){ + saved_old=true; + for(j in 0...100){ + old[j]=t.getTileByIndex(j); + } + } + var p:PlayState=parent; + if(done==false){ + + parent.map_bg_2.visible=false; + p.anim_tiles_group.setAll("visible", false); + for(i in 0...100){ + t.setTileByIndex(i, during[i], true); + } + } else { + p.anim_tiles_group.setAll("visible", true); + for(i=0;i<100;i++){ + t.setTileByIndex(i, old[i], true); + } + } + } + private var Intro_ctr:Int=0; + private var Intro_add_lock:Bool=true; + private function state_intro():Void { + switch(intro_ctr){ + case 0: + (Registry.volume_scale>0)? Registry.volume_scale -=0.01:1; + + if(player.y0)? Registry.volume_scale -=0.01:1; + if(false==DH.a_chunk_is_playing()){ + Water_Anim.START_WATER_ANIMF(); + Registry.sound_data.stream_sound.play(); + intro_ctr +=1; + FlxG.shake(0.01, 100); + Registry.sound_data.stop_current_song(); + } + break; + case 2: + // The water anim freezes the player till it's done. + if(player.state !=player.S_INTERACT){ + FlxG.shake(0, 0); + intro_ctr +=1; + } + break; + case 3: + player.be_idle(); + intro_ctr +=1; + briar.play("oh_no"); + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_before_fight);// !!! + break; + case 4: + if(DH.a_chunk_just_finished()){ + intro_add_lock=false; + Registry.sound_data.start_song_from_title("BRIARFIGHT"); + Registry.volume_scale=1; + FlxG.flash(0xffffffff, 1); + update_parent_map(false); + parent.anim_tiles_group.setAll("visible", false); + briar.visible=false; + intro_ctr +=1; + Registry.GAMESTATE.dialogue_latency=-1; + } + break; + case 5: + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_before_fight);// Oh no + player.be_idle(); + intro_ctr +=1; + break; + case 6: + if(false==DH.a_chunk_is_playing()){ + state=S_ATK_BIG; + Water_Anim.UNALIVE=true; + } + break; + } + } + + private var ctr_atk_big:Int=0;// State counter + private var ctr_atk_big_atks:Int=0;// How many attacks it's done + private var thorn_ref:FlxSprite; + private var t_atk_big:Float=0; + private var iter_atk_big:Int=0; + private var atk_big_max_atks:Array=new Array(1, 1, 1, 2, 2, 3, 3); + private var tm_atk_big:Array=new Array(0.18, 0.16, 0.14, 0.13, 0.11, 0.09,0.06); + private var atk_big_fps:Array=new Array(12, 13, 14, 15, 16, 17, 17); + private var t_shoot_bullets:Float=0; + private var tm_shoot_bullets:Array=new Array(1.4, 1.4,1.2,1.2,1,1,1); + + private function new_bul(group:FlxGroup,ref:Point,x:Int, y:Int, vx:Int=0, vy:Int=0, ax:Int=0, ay:Int=0,anim:String=""):Void { + var b:FlxSprite=group.getFirstAvailable()as FlxSprite; + + if(b !=null){ + b.velocity.x=vx; + b.velocity.y=vy; + b.acceleration.x=ax; + b.acceleration.y=ay; + if(ref==null){ + b.x=x; + b.y=y; + } else { + b.x=ref.x + x; + b.y=ref.y + y; + } + + if(anim !=""){ + b.play(anim); + } + b.exists=true; + } + } + + private function atk_big_shoot_bullets(type:Int):Void { + var b:FlxSprite; + if(type>4){ + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + } else if(type>2){ + new_bul(bullet_thorns, tl, 16 + 20, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 101, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + } else { + + new_bul(bullet_thorns, tl, 16 + 4, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 116, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl, 16 + 20, 44, -10, 45, 5, 20); + new_bul(bullet_thorns, tl, 16 + 101, 44, 10, 45, -5, 20); + new_bul(bullet_thorns, tl,36+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 52+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 69+16, 60, 0, 40, 0, 25); + new_bul(bullet_thorns, tl, 84+16, 60, 0, 40, 0, 25); + + } + } + private function state_atk_big():Void { + + // Ground thorn attack - gives a warning then they sort of + // poke out from the ground. + for(thorn_ref in thorns.members){ + if(thorn_ref !=null && thorn_ref._animations !=null){ + if(thorn_ref._curFrame>=thorn_harmful_idx && thorn_ref._curFrametm_shoot_bullets[6 -(blue_health + happy_health)]){ + t_shoot_bullets=0; + atk_big_shoot_bullets(blue_health + happy_health); + } + + for(thorn_ref in bullet_thorns.members){ + if(thorn_ref !=null && true==thorn_ref.exists){ + if(player.state==player.S_GROUND && thorn_ref.overlaps(player)){ + player.touchDamage(1); + } + + if(thorn_ref.y + 6>tl.y + 160){ + thorn_ref.exists=false; + } + } + } + + + if(body._curAnim !=null && body._curAnim.name=="active" && body._curAnim.frames.length -1==body._curFrame){ + body.play("idle"); + } + // Also do an attack when less than 3 health. + + switch(ctr_atk_big){ + // Make thorns follow the player across the screen and begin to pop up. + case 0: + t_atk_big +=FlxG.elapsed; + // Speed of the attack increases + if(t_atk_big>tm_atk_big[6 -(blue_health + happy_health)]){ + t_atk_big=0; + body.play("active"); + if(iter_atk_big==0){ + Registry.sound_data.play_sound_group(Registry.sound_data.briar_shine_group); + } + thorn_ref=thorns.getFirstAvailable()as FlxSprite; + if(thorn_ref !=null){ + + thorn_ref.exists=true; + thorn_ref.x=thorn_ref.offset.x + tl.x + 16 *(1 + iter_atk_big); + if(player.y1 && iter_atk_big<6 &&(player.yatk_big_max_atks[6 -(blue_health + happy_health)]){ + ctr_atk_big_atks=0; + + if(happy_health==0){ + state=S_ATK_HAPPY; + } else if(blue_health==0){ + state=S_ATK_BLUE; + } else { + body.play("idle"); + if(Math.random()>0.5){ + state=S_ATK_HAPPY; + } else { + state=S_ATK_BLUE; + } + } + } + } + + break; + } + + + } + + private var atk_blue_ctr:Int=0; + + private var t_atk_blue:Float=0; + + private var atk_blue_vels:Array=new Array(50, 70, 90); + private var atk_blue_init:Bool=false; + private var atk_blue_pt:Point; + private var atk_blue_init_pt:Point; + private var atk_blue_vel_mul:Float=1; + + + private function state_atk_blue():Void { + + if(!atk_blue_init){ + atk_blue_init=true; + atk_blue_pt=new Point(happy_thorn.x + 6, happy_thorn.y + 52); + atk_blue_init_pt=new Point(blue_thorn.x, blue_thorn.y + 52); + } + + var ex_ref:FlxSprite; + for(ex_ref in ice_exs.members){ + if(ex_ref !=null && ex_ref.exists==true){ + if(ex_ref.finished){ + ex_ref.exists=false; + } + } + } + switch(atk_blue_ctr){ + case 0: + + + blue_thorn.play("active"); + t_atk_blue +=FlxG.elapsed; + ice_crystal.x=blue_thorn.x; + ice_crystal.y=blue_thorn.y + 52; + ice_crystal.visible=true; + ice_crystal.flicker(0.2); + if(t_atk_blue<1.5){ + break; + + } + + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.teleguy_down.play(); + EventScripts.scale_vector(atk_blue_init_pt, player, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + atk_blue_ctr=1; + t_atk_blue=0; + break; + case 1: + if(player.overlaps(ice_crystal)){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + player.touchDamage(1); + atk_blue_ctr=3; + } + + if(player.broom.visible && player.broom.overlaps(ice_crystal)){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.broom_hit.play(); + atk_blue_vel_mul +=0.15; + EventScripts.scale_vector(ice_crystal, atk_blue_pt, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + ice_crystal.velocity.x *=atk_blue_vel_mul; + ice_crystal.velocity.y *=atk_blue_vel_mul; + atk_blue_ctr=2; + } + + if(ice_crystal.x>tl.x + 160 || ice_crystal.xtl.y + 160){ + atk_blue_ctr=3; + } + break; + case 2: + if(EventScripts.distance(ice_crystal, atk_blue_pt)<5){ + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + Registry.sound_data.play_sound_group(Registry.sound_data.sb_ball_appear); + atk_blue_vel_mul +=0.15; + EventScripts.scale_vector(ice_crystal, player, ice_crystal.velocity, atk_blue_vels[3 - happy_health]); + ice_crystal.velocity.x *=atk_blue_vel_mul; + ice_crystal.velocity.y *=atk_blue_vel_mul; + + if(happy_health==3 && atk_blue_vel_mul>=1.6){ + atk_blue_ctr=4; + } else if(happy_health==2 && atk_blue_vel_mul>=1.9){ + atk_blue_ctr=4; + } else if(happy_health==1 && atk_blue_vel_mul>2.05){ + atk_blue_ctr=4; + } else { + atk_blue_ctr=1; + } + } + + if(EventScripts.distance(ice_crystal, atk_blue_pt)>200){ + atk_blue_ctr=3; + } + break; + case 3:// transition back to atk_big state, do some cleanup + + if(ice_exs.countExisting()==0){ + ice_crystal.visible=false; + blue_thorn.play("off"); + + if(happy_health==0 && blue_health==0){ + state=S_DYING; + } else { + state=S_ATK_BIG; + } + atk_blue_vel_mul=1; + ice_crystal.velocity.x=ice_crystal.velocity.y=0; + atk_blue_ctr=0; + } + break; + case 4:// Staggered. + ice_crystal.visible=false; + + happy_thorn.play("hurt"); + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff1111, 0.4); + FlxG.shake(0.01, 0.2); + new_bul(ice_exs, null, ice_crystal.x - 4, ice_crystal.y - 4,0,0,0,0,"move"); + atk_blue_ctr=5; + break; + case 5:// Logic for hitting the thorn + if(player.broom.overlaps(happy_thorn)&& player.broom.visible){ + happy_health -=1; + core.play("flash"); + FlxG.flash(0xffff0000, 0.8); + happy_thorn.play("hit"); + Registry.sound_data.wb_hit_ground.play(); + atk_blue_ctr=6; + FlxG.shake(0.03, 0.4); + } + break; + case 6: + if(happy_thorn.finished){ + core.play("glow"); + happy_thorn.play("off"); + atk_blue_ctr=3; + } + break; + } + + /* + * Right side(Blue) + * + * shoots out ice lazer thing, need to hit it back and forth with the red eye to hurt and open it + * Or a sharp one that explodes + * */ + } + + private var atk_happy_ctr:Int=0; + + private var fire_eye:FlxSprite; + private var fireballs:FlxGroup; + private var dusts:FlxGroup; + private var dust_explosions:FlxGroup; + private var did_atk_happy_init:Bool=false; + private var mists:FlxGroup; + + private var t_atk_happy:Float=0; + + private function state_atk_happy():Void { + + if(!did_atk_happy_init){ + did_atk_happy_init=true; + + // Fire-eye init MARINA_ANIMS_FIRE_EYE + fire_eye=new FlxSprite(); + fire_eye.loadGraphic(embed_fire_eye, true, false, 16, 16); + fire_eye.addAnimation("shoot", [6, 7, 8, 9], 10, true); + fire_eye.addAnimation("grow", [0, 1, 2, 3, 4, 5], 10, false); + fire_eye.addAnimation("ungrow", [5, 4, 3, 2, 1, 0], 10, false); + fire_eye.play("shoot"); + parent.bg_sprites.add(fire_eye); + + // Fireballs init MARINA_ANIMS_FIREBALLS + fireballs=new FlxGroup(12); + for(i in 0...fireballs.maxSize){ + var fireball:FlxSprite=new FlxSprite; + fireball.loadGraphic(embed_fire_eye, true, false, 16, 16); + fireball.addAnimation("move", [12, 13], 12, true); + fireball.play("move"); + fireball.exists=false; + fireball.width=fireball.height=6; + fireball.offset.x=fireball.offset.y=5; + fireballs.add(fireball); + } + parent.sortables.add(fireballs); + + // Dusts init + dusts=new FlxGroup(4); + for(i=0;itl.x + 160 || fireball.ytl.y + 160){ + fireball.exists=false; + } + + for(mist in mists.members){ + if(mist.exists==true && fireball.overlaps(mist)){ + fireball.exists=false; + } + } + + // Check for dust overlap, cause an explosion + for(dust in dusts.members){ + if(dust !=null && dust.exists && dust.frame==0){ + if(dust.overlaps(fireball)){ + Registry.sound_data.play_sound_group(Registry.sound_data.dust_explode_group); + fireball.exists=false; + dust.exists=false; + dust_explos=dust_explosions.getFirstAvailable()as FlxSprite; + if(dust_explos !=null){ + dust_explos.x=dust.x - 16; + dust_explos.y=dust.y - 16; + dust_explos.exists=true; + dust_explos.play("explode"); + + // Make fireballs appear + var fire_ref:FlxSprite=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + + fire_ref.velocity.y=0;fire_ref.velocity.x=-70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.y=0;fire_ref.velocity.x=70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.x=0;fire_ref.velocity.y=70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + fire_ref=fireballs.getFirstAvailable()as FlxSprite; + if(fire_ref !=null){ + fire_ref.velocity.x=0;fire_ref.velocity.y=-70; + fire_ref.exists=true;fire_ref.x=dust_explos.x + 16;fire_ref.y=dust_explos.y + 16; + } + + if(dust_explos.overlaps(blue_thorn)){ + atk_happy_ctr=4; + + Registry.sound_data.wb_hit_ground.play(); + FlxG.flash(0xffff1111, 0.4); + FlxG.shake(0.01, 0.2); + } + } + } + } + } + + if(!player.invincible && player.state !=player.S_AIR && player.overlaps(fireball)){ + fireball.exists=false; + player.touchDamage(1); + } + + } + } + + switch(atk_happy_ctr){ + + case -1: + if(fire_eye.finished){ + fire_eye.play("shoot"); + atk_happy_ctr=1; + } + break; + case 0: + happy_thorn.play("active"); + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy<1.5){ + break; + } + // Position of fire eye and dusts should vary by health + + fire_eye.exists=true; + fire_eye.frame=6; + fire_eye.play("grow"); + + if(blue_health==3){ + fire_eye.x=tl.x + 70; + fire_eye.y=tl.y + 80; + } else if(blue_health==2){ + fire_eye.x=tl.x + 50; + fire_eye.y=tl.y + 100; + } else { + fire_eye.x=tl.x + 50; + fire_eye.y=tl.y + 100; + } + + var mist_ref:FlxSprite; + if(blue_health==3){ + // No mists. + } else if(blue_health==2){ + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16 - 7; + mist_ref.y=tl.y + 5 * 16 - 12; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16 - 7; + mist_ref.y=tl.y + 7 * 16 - 12; + } else { + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 5 * 16 + 8; + mist_ref.y=tl.y + 4 * 16 + 5; + mist_ref=mists.getFirstAvailable()as FlxSprite; + mist_ref.exists=true;mist_ref.flicker(1);mist_ref.alpha=0.7; + mist_ref.x=tl.x + 6 * 16; + mist_ref.y=tl.y + 6 * 16 + 3; + } + + var dust_ref:Dust; + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 7; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 8 * 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 7; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 3 * 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 5; + + dust_ref=dusts.getFirstAvailable()as Dust; + dust_ref.x=tl.x + 16; + dust_ref.exists=true;dust_ref.y=tl.y + 16 * 5; + + dusts.setAll("frame", Dust.EMPTY_FRAME); + dusts.setAll("exists", true); + + for(dust in dusts.members){ + dust.play("unpoof"); + } + t_atk_happy=0; + atk_happy_ctr=-1; + + break; + case 1: + // Shoot fireballs + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy>0.4){ + t_atk_happy=0; + Registry.sound_data.play_sound_group(Registry.sound_data.fireball_group); + fireball=fireballs.getFirstAvailable()as FlxSprite; + if(fireball !=null){ + fireball.x=fire_eye.x + 4; + fireball.y=fire_eye.y + 4; + fireball.exists=true; + EventScripts.scale_vector(fireball, player, fireball.velocity, 45); + } + } + + for(dust_explos in dust_explosions.members){ + if(dust_explos.finished){ + dust_explos.exists=false; + } + } + // If all dusts gone then exit this state + if(dusts.countExisting()==0 && dust_explosions.countExisting()==0){ + atk_happy_ctr=7; + } + break; + + case 3:// Transitioning back to big atk state + fire_eye.exists=false; + dust_explosions.setAll("exists", false); + dusts.setAll("exists", false); + fireballs.setAll("exists", false); + mists.setAll("exists", false); + happy_thorn.play("off"); + blue_thorn.play("off"); + atk_happy_ctr=0; + + if(happy_health==0 && blue_health==0){ + state=S_DYING; + } else { + state=S_ATK_BIG; + } + break; + case 4:// Just got hit + blue_thorn.play("hurt"); + atk_happy_ctr=5; + break; + case 5: + if(player.broom.visible && player.broom.overlaps(blue_thorn)){ + blue_health -=1; + FlxG.flash(0xffff1111, 0.6); + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.03, 0.4); + blue_thorn.play("hit"); + core.play("flash"); + atk_happy_ctr=6; + } + break; + case 6: + // wait for hurt anim to finish, if we add a new one + if(blue_thorn.finished){ + core.play("glow"); + blue_thorn.play("off"); + atk_happy_ctr=7; + } + break; + case 7: + for(dust in dusts.members){ + if(dust.exists)dust.play("poof"); + } + fire_eye.play("ungrow"); + for(mist in mists.members){ + mist.flicker(1); + } + atk_happy_ctr=8; + break; + case 8: + t_atk_happy +=FlxG.elapsed; + if(t_atk_happy>1.3){ + t_atk_happy=0; + atk_happy_ctr=3; + } + break; + } + } + + private var dying_ctr:Int=0; + private var explode_ctr:Int=0; + private function state_dying():Void { + switch(dying_ctr){ + case 0: + DH.disable_menu(); + Registry.sound_data.stop_current_song(); + player.be_idle(); + dying_ctr=-1; + t_atk_blue=0; + break; + case -1: + t_atk_blue +=FlxG.elapsed; + player.be_idle(); + player.state=player.S_INTERACT; + + happy_thorn.play("hit"); + if(t_atk_blue>0.2){ + t_atk_blue=0; + EventScripts.make_explosion_and_sound(happy_thorn, 1); + explode_ctr ++; + if(explode_ctr>10){ + FlxG.flash(0xffff1111, 1.5); + Registry.sound_data.sun_guy_death_s.play(); + dying_ctr=-2; + happy_thorn.visible=false; + explode_ctr=0; + } + } + break; + case -2: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>0.2){ + t_atk_blue=0; + blue_thorn.play("hit"); + EventScripts.make_explosion_and_sound(blue_thorn, 2); + explode_ctr ++; + if(explode_ctr>10){ + dying_ctr=-30; + blue_thorn.visible=false; + explode_ctr=0; + FlxG.flash(0xff1111ff, 1.5); + Registry.sound_data.sun_guy_death_s.play(); + } + } + break; + case -30: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>1.5){ + dying_ctr=-3; + } + break; + case -3: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>0.15){ + t_atk_blue=0; + core.play("flash"); + EventScripts.make_explosion_and_sound(body, 3); + explode_ctr ++; + if(explode_ctr>15){ + FlxG.flash(0xffffffff, 5); + Registry.sound_data.sun_guy_death_l.play(); + dying_ctr=-40; + body.visible=false; + core.visible=false; + update_parent_map(true); + overhang.visible=false; + parent.map_bg_2.visible=true; + briar.exists=true;briar.visible=true; + } + } + break; + case -40: + t_atk_blue +=FlxG.elapsed; + if(t_atk_blue>1.5){ + dying_ctr=1; + } + break; + case 1: + dying_ctr=2; + player.state=player.S_INTERACT; + if(ice_crystal !=null && ice_exs !=null)ice_crystal.exists=ice_exs.exists=false; + if(dusts !=null && fire_eye !=null && fireballs !=null && dust_explosions !=null)dusts.exists=fire_eye.exists=fireballs.exists=dust_explosions.exists=false; + bullet_thorns.exists=thorns.exists=false; + body.exists=blue_thorn.exists=happy_thorn.exists=pre_thorn.exists=core.exists=false; + t_atk_big=0; + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_briar, DH.scene_briar_go_after_fight); + break; + case 2: + + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + if(false==DH.a_chunk_is_playing()){ + t_atk_big +=FlxG.elapsed; + if(t_atk_big>1.0){ + dying_ctr=3; + briar.velocity.y=-20; + Achievements.unlock(Achievements.A_DEFEAT_BRIAR); + Achievements.is_100_percent(); + Registry.sound_data.start_song_from_title("GO"); + Registry.sound_data.current_song.volume=1; + briar.play("walk_u"); + } + } + break; + case 3: + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + if(briar.ytl.y + 120){ + player.y=tl.y + 120; + } + xml.@alive="false"; + Registry.GE_States[Registry.GE_BRIAR_BOSS_DEAD]=true; + state=S_DEAD; + break; + } + } + + private function state_dead():Void { + // Ain't no thang. + if(player.y>tl.y + 120){ + player.y=tl.y + 120; + } + } + private function init_pre_thorn(x:Int,y:Int):Void + { + pre_thorn=new FlxSprite(); + pre_thorn.loadGraphic(embed_ground_thorn, false, false, 32, 16); + pre_thorn.addAnimation("move", [6,7,8], 6); + pre_thorn.play("move"); + pre_thorn.x=tl.x + x; + pre_thorn.y=tl.y + y; + parent.sortables.add(pre_thorn); + pre_thorn.immovable=true; + } + + + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/Chaser.hx b/intra/source/entity/enemy/etc/Chaser.hx new file mode 100644 index 0000000..e9c35cb --- /dev/null +++ b/intra/source/entity/enemy/etc/Chaser.hx @@ -0,0 +1,193 @@ +package entity.enemy.etc +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.system.FlxTile; + +class Chaser extends FlxSprite +{ + private var xml:XML; + private var player:Player; + private var parent:Dynamic; + + + private var state:Int; + private static inline var s_idle:Int=0; + private static inline var s_moving:Int=1; + + private var dame_type:Int; + private var dt_hori:Int=0; + private var dt_vert:Int=1; + + private var float_vel:Int=15; + + private var tl:Point; + + private var lookahead:Point; + + + //[Embed(source="../../../res/sprites/enemies/etc/chaser.png")] public static var embed_chaser_sprite:Class; + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + dame_type=parseInt(xml.@frame); + + state=s_idle; + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + lookahead=new Point(0, 0); + + + loadGraphic(embed_chaser_sprite, true, false, 16, 32); + width=height=8; + offset.y=20; + offset.x=4; + x +=4; + y +=20; + // MARINA_ANIMS + if(dame_type==dt_hori){ + frame=6; + } else { + frame=4; + } + addAnimation("d", [4, 5], 8); + addAnimation("r", [6,7], 8); + addAnimation("u", [8, 9], 8); + addAnimation("l", [10,11], 8); + addAnimationCallback(on_anim_change); + + } + + override public function preUpdate():Void + { + super.preUpdate(); + } + + override public function update():Void + { + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.mover_move_group); + } + + if(player.broom.visible){ + if(Math.abs(velocity.x)<100 && Math.abs(velocity.y)<100){ + velocity.x *=1.025; + velocity.y *=1.025; + } + } else { + float_vel=15; + } + switch(state){ + case s_idle: + + if(dame_type==dt_hori){ + if(player.y>y - player.height && player.yx){ + velocity.x=float_vel; + play("r"); + } else { + velocity.x=-float_vel; + play("l"); + } + } + } else if(dame_type==dt_vert){ + if(player.x + player.width>x && player.xy){ + play("d"); + velocity.y=float_vel; + } else { + play("u"); + velocity.y=-float_vel; + } + } + } + break; + case s_moving: + if(EventScripts.get_tile_allow_collisions(lookahead.x,lookahead.y,parent.curMapBuf)){ + switch(facing){ + case UP: + facing=DOWN; + play("d"); + velocity.y *=-1; + break; + case DOWN: + play("u"); + facing=UP; + velocity.y *=-1; + break; + case LEFT: + play("r"); + facing=RIGHT; + velocity.x *=-1; + break; + case RIGHT: + play("l"); + facing=LEFT; + velocity.x *=-1; + break; + } + } + // Now update the lookahead point to reflect the possible state change above + if(facing &(UP | DOWN)){ + if(facing & UP){ + lookahead.y=y; + lookahead.x=x + width / 2; + } else { + lookahead.x=x + width / 2; + lookahead.y=y + height; + } + } else { + if(facing & RIGHT){ + lookahead.x=x + width; + lookahead.y=y + height / 2; + } else { + lookahead.x=x; + lookahead.y=y + height / 2; + } + } + + // Check to kill the player + if(player.overlaps(this)){ + player.touchDamage(6); + } + break; + } + super.update(); + } + + private function on_anim_change(name:String, frame:Int, index:Int):Void { + switch(name){ + case "u": + facing=UP; + break; + case "d": + facing=DOWN; + break; + case "l": + facing=LEFT; + break; + case "r": + facing=RIGHT; + break; + } + } + + override public function destroy():Void + { + tl=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/ControlsDeity.hx b/intra/source/entity/enemy/etc/ControlsDeity.hx new file mode 100644 index 0000000..a013001 --- /dev/null +++ b/intra/source/entity/enemy/etc/ControlsDeity.hx @@ -0,0 +1,211 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import global.Keys; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import global.Registry; +import states.ControlsState; +import states.PlayState; +import flash.events.KeyboardEvent; +import entity.player.Player; + +/** + * straightforward, an invisible event thing that + * lets you set hte movement controls + * @author Seagaia + */ +class ControlsDeity extends FlxSprite +{//FUCK IT!!! + + public var cid:Int=CLASS_ID.CONTROLSDEITY; + public var xml:XML; + public var text:FlxBitmapFont=new FlxBitmapFont(Registry.C_FONT_BLACK, 8, 8, Registry.C_FONT_BLACK_STRING, 27); + public var state:Int=1; + public var S_CONTROL:Int=0; + public var control_ctr:Int=0; + public var S_NORMAL:Int=1; + public var normal_ctr:Int=0; + public var S_CONTROL_2:Int=2; + public var recent_key_code:Int=1000; + + public var player:Player; + public var input:String=" "; + public var portal:FlxSprite=new FlxSprite(120, 100); + public var type:Int=0; + public var T_1:Int=0; + public var T_2:Int=1; + public function new(x:Int,y:Int,_xml:XML,_player:Player) + { + super(x, y); + xml=_xml; + player=_player; + + makeGraphic(1, 1, 0xffffffff); + + FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + portal.makeGraphic(16, 16, 0xffffff00); + portal.visible=false; + + if(parseInt(xml.@frame)==1)type=T_2; + + if(type==T_1){ + text.setText(" \nMove. \n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT] + + "\nESC to\nchange controls.", + true, 0, 0, "center", true); + text.x=10; + text.y=24; + } else if(type==T_2){ + text.setText("Interact. \nUse " + Registry.controls[Keys.IDX_ACTION_1] + " or " + Registry.controls[Keys.IDX_ACTION_2] + + ".\nESC to \nchange controls.", true, 0, 0, "center", true); + //text.scrollFactor=new FlxPoint(0, 0); + text.x=5 + 320;//hehheh + text.y=24; + } + } + + override public function update():Void { + super.update(); + switch(state){ + case S_CONTROL: + update_control(); + break; + case S_CONTROL_2: + update_control_2(); + break; + case S_NORMAL: + if(FlxG.keys.justPressed("SPACE")){ + if(type==T_2) + state=S_CONTROL_2; + else + state=S_CONTROL; + player.dontMove=true; + } + break; + } + + } + public function update_control_2():Void { + + if(recent_key_code !=1000){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + input=FlxG.keys.getKeyName(recent_key_code); + trace(input); + recent_key_code=1000; + if(input=="SPACE"){ + input=" "; + return; + } + } + switch(control_ctr){ + case 0: + text.text="Press what you want\nto use for\naction 1."; + if(input !=" "){ + if(is_valid(Keys.IDX_ACTION_1, input))break; + control_ctr++; + Registry.controls[Keys.IDX_ACTION_1]=input; + } + break; + case 1: + text.text="Press what you want\nto use to for\n action 2\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_ACTION_2, input))break; + control_ctr++; + Registry.controls[Keys.IDX_ACTION_2]=input; + } + break; + case 2: + text.setText("Interact. \nUse " + Registry.controls[Keys.IDX_ACTION_1] + " or " + Registry.controls[Keys.IDX_ACTION_2] + + ".\nESC to \nchange controls.", true, 0, 0, "center", true); + control_ctr=0; + state=S_NORMAL; + player.dontMove=false; + break; + } + input=" "; + return; + } + public function update_control():Void { + if(recent_key_code !=1000){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + input=FlxG.keys.getKeyName(recent_key_code); + trace(input); + recent_key_code=1000; + if(input=="SPACE"){ + input=" "; + return; + } + } + switch(control_ctr){ + case 0: + text.text="Press what you want\nto use to move\nupwards.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_UP, input))break; + control_ctr++; + Registry.controls[Keys.IDX_UP]=input; + } + break; + case 1: + text.text="Press what you want\nto use to move\ndownwards.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_DOWN, input))break; + control_ctr++; + Registry.controls[Keys.IDX_DOWN]=input; + } + break; + case 2: + text.text="Press what you want\nto use to move\nto the left.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_LEFT, input))break; + control_ctr++; + Registry.controls[Keys.IDX_LEFT]=input; + } + break; + case 3: + text.text="Press what you want\nto use to move\nto the right.\n"; + if(input !=" "){ + if(is_valid(Keys.IDX_RIGHT, input))break; + control_ctr++; + Registry.controls[Keys.IDX_RIGHT]=input; + } + break; + case 4: + text.setText("Move here with\n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT] + + "\nPress ESC to set\ndifferent controls", + true, 0, 0, "center", true); + control_ctr=0; + state=S_NORMAL; + player.dontMove=false; + break; + + + + } + input=" "; + return; + } + + public function is_valid(index:Int, input:String):Int { + trace("----"); + trace("input:", input); + for(i in 0...index){ + trace(Registry.controls[i]); + if(input=="ESCAPE")return 1; + if(Registry.controls[i]==input)return 1; + } + + return 0; + } + public function reportKeyDown(event:KeyboardEvent):Void { + recent_key_code=event.keyCode; + } + + override public function destroy():Void { + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/Follower_Bro.hx b/intra/source/entity/enemy/etc/Follower_Bro.hx new file mode 100644 index 0000000..fce06d9 --- /dev/null +++ b/intra/source/entity/enemy/etc/Follower_Bro.hx @@ -0,0 +1,84 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Follower_Bro extends FlxSprite +{ + //[Embed(source="../../../res/sprites/npcs/follower_bro.png")] public static var sprite_follower:Class; + public var player_ref:Player; + public var cid:Int=CLASS_ID.FOLLOWER_BRO; + public var xml:XML; + + private var state:Int=0; + private var s_hidden:Int=0; + private var s_walk:Int=1; + private var s_gone:Int=2; + private var s_disappearing:Int=3; + public function new(_xml:XML,p:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + player_ref=p; + xml=_xml; + loadGraphic(sprite_follower, true, false, 16, 24); + addAnimation("walk", [1, 2, 1, 0], 4, true); + alpha=0; + immovable=true; + trace("makin bro"); + if(xml.@alive=="false"){ + state=s_gone; + visible=solid=false; + } + } + override public function update():Void + { + + switch(state){ + case s_hidden: + solid=false; + if(player_ref.y - y<-20){ + player_ref.dontMove=true; + alpha +=0.02; + } + if(alpha>0.96){ + player_ref.dontMove=false; + state=s_walk; + } + break; + case s_walk: + if(FlxG.overlap(player_ref, this))state=s_disappearing; + solid=true; + if(player_ref.y>y){ + velocity.y=velocity.x=0; + frame=1; + } else { + velocity.y=-10; + velocity.x=(player_ref.x>x)? 10:-10; + play("walk"); + } + break; + case s_gone: + return; + case s_disappearing: + alpha -=0.02; + if(alpha<=0){ + visible=solid=false; + } + break; + } + super.update(); + } + + override public function destroy():Void + { + xml.@alive="false"; + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/Red_Walker.hx b/intra/source/entity/enemy/etc/Red_Walker.hx new file mode 100644 index 0000000..66fbd29 --- /dev/null +++ b/intra/source/entity/enemy/etc/Red_Walker.hx @@ -0,0 +1,63 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Red_Walker extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redwalker.png")] public static var sprite_redwalker:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.RED_WALKER; + public var tl:Point; + + public var player:Player; + public function new(_xml:XML,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(sprite_redwalker, true, false, 32, 48); + addAnimation("walk", [0, 1, 2, 3, 4], 5, true); + play("walk"); + + velocity.x=5 + 15 * Math.random(); + _curFrame=Std.int(5 * Math.random()); + player=_player; + immovable=true; + + width=20; + height=8; + offset.x=4; + x +=4; + offset.y=40; + y +=40; + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + + } + + override public function update():Void + { + + FlxG.collide(this, player); + + if(velocity.x>0 && x + width>tl.x + 160){ + velocity.x *=-1; + scale.x *=-1; + } else if(velocity.x<0 && x0)? Registry.volume_scale -=0.01:0; + if(Registry.volume_scale !=0)return; + + if(EventScripts.distance(this, player)<32 && player.state==player.S_GROUND){ + player.be_idle(); + player.state=player.S_INTERACT; + + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_before_fight, Registry.CURRENT_MAP_NAME); + + Registry.sound_data.stop_current_song(); + + substate_ctr++; + } + } else if(substate_ctr==2){ + if(DH.a_chunk_just_finished()){ + substate_ctr++; + play("idle_d"); + play_sfx("warp_out"); + alpha=0; + visible=false; + x=tl.x + 80 - width / 2; + y=tl.y + 24; + } + } else if(substate_ctr==3){ + // relaly bad timing hacks + alpha +=0.008; + if(alpha>=0.4){ + visible=true; + if(alpha<=0.43){ + play_sfx("warp_in"); + } + + if(alpha==1){ + substate_ctr++; + Registry.sound_data.start_song_from_title("SAGEFIGHT"); + Registry.volume_scale=1; + FlxG.flash(0xff000000, 2.18); + FlxG.shake(0.02, 1.5); + } + } + } else if(substate_ctr==4){ + alpha +=0.07; + if(alpha>=1){ + + substate_ctr++; + } + } else if(substate_ctr==5){ + + gt +=FlxG.elapsed; + + if(gt>2.18){ + gt=0; + FlxG.flash(0xff000000, 2.15); + FlxG.shake(0.025, 1.5); + substate_ctr++; + } + } else if(substate_ctr==6){ + gt +=FlxG.elapsed; + + x=tl.x + 40 + 60 * Math.random(); + y=tl.y + 70 - 40 * Math.random(); + + if(gt>2.16){ + gt=0; + FlxG.flash(0xff000000, 2.15); + FlxG.shake(0.03, 1.5); + x=player.x - 2; + y=player.y - 16; + substate_ctr++; + } + + } else if(substate_ctr==7){ + gt +=FlxG.elapsed; + if(gt>2.15){ + gt=0; + + x=tl.x + 80 - width / 2; + y=tl.y + 25; + + FlxG.flash(0xff000000, 6); + FlxG.shake(0.035, 1.7); + substate_ctr++; + alpha=0; + } + } else if(substate_ctr==8){ + alpha +=0.005; + if(alpha==1){ + substate_ctr++; + } + } else { + state=S_ACTIVE; + substate_ctr=0; + active_substate=1; + } + } + + private static inline var s1_vel:Int=50; + private var t_s1:Float=0; + private var tm_s1:Array=new Array(1.6, 1.4, 1.2); + private static inline var s1_max_health:Int=3; + private var s1_health:Int=3; + + /** + * Stage 1:Razors become large razors, sweep vertically, must jump forward to reach and hit sage + */ + private function stage_1():Void { + + var b:FlxSprite; + // Periodically shoot + t_s1 +=FlxG.elapsed; + if(t_s1>tm_s1[s1_max_health - s1_health]){ + b=l_bullets.getFirstAvailable()as FlxSprite; + if(b !=null){ + b.play("spin"); + b.exists=true; + b.x=tl.x + 48 +(64 - b.width)/ 2; + b.y=tl.y + 20; + b.velocity.y=s1_vel; + } + + t_s1=0; + + } + + // Check to destroy some bullets + // Dust or wall + for(b in l_bullets.members){ + if(b !=null && b.exists){ + if(b.y>tl.y + 16 * 9){ + if(b._curAnim.name !="poof"){ + b.play("poof"); + } else { + if(b.finished){ + b.exists=false; + b.velocity.y=0; + } + } + } + } + } + + + // Check to hurt player + + for(b in l_bullets.members){ + if(b !=null && b.exists){ + if(player.state==player.S_GROUND){ + if(b.overlaps(player)&& b._curAnim.name !="poof"){ + player.touchDamage(1); + } + } + + /*if(b.overlaps(dusts.members[0])|| b.overlaps(dusts.members[1])){ + b.play("poof"); + b.exists=false; + b.velocity.y=0; + }*/ + } + } + + // Check if boss hurt + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(1); + play_sfx("hurt"); + s1_health--; + } + + + if(s1_health<=0){ + l_bullets.setAll("x", -1000); + state=S_RESET; + } + } + + + /** + * Stage 2:Razors go to ends of bridge, sage dashes up and down with razors in front and back + */ + private static inline var s2_max_health:Int=3; + private var s2_health:Int=3; + private var s2_dash_vel:Array=new Array(50, 70, 90); + + private var s2_d1:FlxSprite; + private var s2_d2:FlxSprite; + private var s2_set_vel:Bool=false; + + private function stage_2():Void { + // Wait for sage to stop flickering + if(substate_ctr==0){ + if(!flickering){ + substate_ctr++; + } + return; + // Make long dusts appear flicker for a bit + } else if(substate_ctr==1){ + for(i in 0...2){ + var ld:FlxSprite=l_bullets.getFirstAvailable()as FlxSprite; + ld.velocity.x=ld.velocity.y=0; + ld.exists=true; + ld.play("spin"); + ld.x=tl.x + 48 +(64 - ld.width)/ 2; + if(i==0){ + ld.y=tl.y + 16 +(16 - ld.height)/ 2; + } else { + ld.y=tl.y + 8 * 16 +(16 - ld.height)/ 2; + } + ld.flicker(1); + } + substate_ctr ++; + return; + // Start fight when lds stop flickering + } else if(substate_ctr==2){ + ld=l_bullets.getFirstExtant()as FlxSprite; + if(!ld.flickering){ + substate_ctr++; + s2_d1=s_bullets.getFirstAvailable()as FlxSprite; + s2_d1.exists=true; + s2_d2=s_bullets.getFirstAvailable()as FlxSprite; + s2_d2.exists=true; + } + velocity.x=40; + + return; + } + + // Snap dusts to sage + s2_d1.x=x +(width - s2_d1.width)/ 2; + s2_d2.x=x +(width - s2_d2.width)/ 2; + + s2_d1.y=y - 10; + s2_d2.y=y + 12; + + // Dash up and down + if(substate_ctr==3){ // Down + if(!s2_set_vel){ + velocity.y=s2_dash_vel[s2_max_health - s2_health]; + s2_set_vel=true; + play("dash_d"); + } + if(y>tl.y + 16 * 8){ + substate_ctr=4; + s2_set_vel=false; + } + } else if(substate_ctr==4){ + if(!s2_set_vel){ + play("dash_u"); + velocity.y=-s2_dash_vel[s2_max_health - s2_health]; + s2_set_vel=true; + } + if(y0){ + if(x>tl.x + 16 * 7 - 4){ + velocity.x=-40; + } + } else { + if(x=new Array(80, 90, 100, 115); + + private function stage_3():Void { + + // Move to top + // Poof the 4 dusts in order + // Start movin' + switch(substate_ctr){ + case 0: + x=tl.x + 80 - width / 2; + y=tl.y + 25; + substate_ctr++; + + return; + case 1: + s3_t +=FlxG.elapsed; + if(s3_t>1){ + s3_t=0; + substate_ctr++; + s_bullets.setAll("exists", false); + } + return; + // Make the small bullets appear around sage slowly + case 2: + s3_t +=FlxG.elapsed; + if(s3_t>0.8){ + s3_t=0; + var d:FlxSprite=s_bullets.getFirstAvailable()as FlxSprite; + d.exists=true; + d.play("spin"); + Dust.dust_sound.play(); + switch(s3_nr_dusts_made){ + case 0: + s3_d1=d; + s3_d1.y=y - 10 - off; + s3_d1.x=x +(width - s3_d1.width)/ 2; + break; + case 1: + s3_d2=d; + s3_d2.y=y + 12 + off; + s3_d2.x=x +(width - s3_d2.width)/ 2; + break; + case 2: + s3_d3=d; + s3_d3.x=x - 12; + s3_d3.y=y; + break; + case 3: + s3_d4=d; + s3_d4.x=x + 14; + s3_d4.y=y; + break; + } + s3_nr_dusts_made++; + if(s3_nr_dusts_made==4){ + substate_ctr++; + velocity.x=20; + } + } + return; + } + + if(substate_ctr==3){ // Down + if(!s3_set_vel){ + velocity.y=s3_dash_vel[s3_max_health - s3_health]; + s3_set_vel=true; + play("dash_d"); + } + if(y>tl.y + 16 * 8){ + substate_ctr=4; + s3_set_vel=false; + } + } else if(substate_ctr==4){ + if(!s3_set_vel){ + play("dash_u"); + velocity.y=-s3_dash_vel[s3_max_health - s3_health]; + s3_set_vel=true; + } + if(y0){ + if(x>tl.x + 16 * 7 - 4){ + velocity.x=-20; + } + } else { + if(x2){ + s3_dust_osc_t=0; + } + if(s3_dust_osc_t<1){ + r=s3_dust_osc_t; + } else { + r=2 - s3_dust_osc_t; + } + var off:Int=Std.int(r * 34); + s3_d1.x=x +(width - s3_d1.width)/ 2; + s3_d2.x=x +(width - s3_d2.width)/ 2; + s3_d3.x=x - 12 - off; + s3_d4.x=x + 14 + off; + + s3_d1.y=y - 10 - off; + s3_d2.y=y + 12 + off; + s3_d3.y=y; + s3_d4.y=y; + + hit_hurt_logic(); + + if(s3_health<=0){ + state=S_RESET; + substate_ctr=0; + } + + } + + /** + * Stage 4:Lots of small dusts thrown at you. + */ + private var s4_t:Float=0; + private var s4_tm:Float=0.55; + + private var s4_health:Int=3; + private var s4_health_max:Int=3; + private var s4_vel:Array=new Array(50, 60, 70); + + private function stage_4():Void { + if(substate_ctr==0){ + play_sfx("warp_out"); + x=tl.x + 80 - width / 2; + y=tl.y + 38; + velocity.x=velocity.y=0; + substate_ctr++; + return; + } + + var d:FlxSprite; + + s4_t +=FlxG.elapsed; + if(s4_t>s4_tm){ + s4_t=0; + d=s_bullets.getFirstDead()as FlxSprite; + if(d !=null){ + d.exists=d.alive=true; + d.x=tl.x + 4 + 48 + 16 *(int(4 * Math.random())); + d.y=tl.y + 16; + d.velocity.y=s4_vel[s4_health_max - s4_health]; + d.play("shoot"); + } + } + + for(d in s_bullets.members){ + var undo:Bool=false; + if(d !=null && d.alive){ + if(d.overlaps(player)&& player.state !=player.S_AIR){ + undo=true; + player.touchDamage(1); + } + // if(d.overlaps(dusts)){ + // undo=true; + // } + + if(d.y>tl.y + 16 * 9){ + undo=true; + } + + if(undo){ + d.play("poof"); + d.alive=false; + d.velocity.x=d.velocity.y=0; + undo=false; + } + } + } + + if(player.overlaps(this)){ + player.touchDamage(1); + + } + + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(2.5); + play_sfx("hurt"); + s4_health--; + + + /*dusts.members[0].x=tl.x + 48; + dusts.members[1].x=tl.x + 48; + dusts.members[0].y=tl.y + 16 * 7; + dusts.members[1].y=tl.y + 16 * 7; + */ + } + + if(s4_health<=0){ + state=S_RESET; + substate_ctr=0; + } + + + } + + + private function dying_state():Void { + switch(substate_ctr){ + case 0: + Registry.sound_data.stop_current_song(); + play("idle_d"); + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_after_fight); + substate_ctr++; + break; + case 1: + if(DH.a_chunk_just_finished()){ + DH.dont_need_recently_finished(); + substate_ctr=2; + } + break; + case 2: + play("walk_u"); + player.state=player.S_INTERACT; + velocity.y=-20; + substate_ctr=3; + break; + case 3: + if(y + 16latency){ + t_dust=0; + var d:Dust; + for(d in dusts.members){ + if(d.fell_in_hole){ + d.exists=true; + d.fell_in_hole=false; + d.play("unpoof"); + d.flicker(0.5); + var idx:Int=dusts.members.indexOf(d); + d.y=tl.y + 8 * 16; + if(idx==0){ + d.x=tl.x + 48; + } else { + d.x=tl.x + 48 + 48; + } + } + } + }*/ + } + + private function hit_hurt_logic():Void + { + //Check for player hitting sage + if(!flickering && player.broom.visible && player.broom.overlaps(this)){ + flicker(1); + play_sfx("hurt"); + FlxG.flash(0xff000000, 0.4); + if(active_substate==2){ + s2_health--; + } else if(active_substate==3){ + s3_health--; + } + } + + + // check for player getting hurt(Sage, sage dusts, long dusts) + if(player.overlaps(this)){ + player.touchDamage(1); + } + + var s:FlxSprite; + + if(player.state==player.S_AIR)return; + + for(s in s_bullets.members){ + if(s !=null && s.exists && s.visible){ + if(s.overlaps(player)){ + player.touchDamage(1); + } + } + } + + for(s in l_bullets.members){ + if(s !=null && s.exists){ + if(s.overlaps(player)&& s.visible){ + player.touchDamage(1); + } + } + } + } + + private function poof_small():Void + { + var d:FlxSprite; + for(d in s_bullets.members){ + if(d !=null){ + d.play("poof"); + d.alive=false; + } + } + } + + private function poof_big():Void + { + var d:FlxSprite; + for(d in l_bullets.members){ + if(d !=null){ + d.play("poof"); + d.alive=false; + } + } + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/Space_Face.hx b/intra/source/entity/enemy/etc/Space_Face.hx new file mode 100644 index 0000000..733cb22 --- /dev/null +++ b/intra/source/entity/enemy/etc/Space_Face.hx @@ -0,0 +1,66 @@ +package entity.enemy.etc +{ +import entity.interactive.npc.Space_NPC; +import flash.display.InterpolationMethod; +import flash.geom.Point; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +class Space_Face extends AnoSprite +{ + + + public var t_dash:Float=0; + public var tm_dash:Float; + + public var t_calc_angle:Float=0; + public var tm_calc_angle:Float=0.2; + + + public function new(args:Array) + { + super(args); + + loadGraphic(Space_NPC.embed_space_npc,true,false,16,16); + + + dame_frame=parseInt(xml.@frame); + + // MARINA_ANIMS(face) + // Happy + if(dame_frame==0){ + addAnimation("a", [22,23], 6, true); + // Sad + } else if(dame_frame==1){ + addAnimation("a", [20,21], 6); + } + play("a"); + + tm_dash=0.5 + 1.5 * Math.random(); + } + + override public function update():Void + { + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + + if(EventScripts.time_cond(this,"t_dash","tm_dash")){ + EventScripts.scale_vector(this, player, velocity, 55);// dash vel + drag.x=drag.y=15 + 10 * Math.random(); + } + + + super.update(); + } + + override public function destroy():Void + { + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/etc/Wall_Laser.hx b/intra/source/entity/enemy/etc/Wall_Laser.hx new file mode 100644 index 0000000..edfa837 --- /dev/null +++ b/intra/source/entity/enemy/etc/Wall_Laser.hx @@ -0,0 +1,87 @@ +package entity.enemy.etc +{ +import data.CLASS_ID; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import global.Registry; +import org.flixel.FlxObject; +class Wall_Laser extends FlxSprite +{ + + ////[Embed(source="../../../res/sprites/enemies/wall_laser.png")] public var Wall_Laser_Sprite:Class; + //[Embed(source="../../../../../sfx/laser_charge.mp3")] public var Laser_Charge_Sound:Class; + //[Embed(source="../../../../../sfx/laser_fire.mp3")] public var Laser_Fire_Sound:Class; + + + + public var dir_type:Int;//left, right, down, up + public var local_id:Int; + public var type:String="Wall_Laser"; + public var is_charging:Bool=false; + public var charge_timer:Float=0; + public var laser:FlxSprite=new FlxSprite(); + public var sound_state:Int=0; + public var sound_state_charge:Int=1; + public var sound_state_fire:Int=2; + public var soundObj:FlxSound=new FlxSound(); + + public var cid:Int=CLASS_ID.WALL_LASER; + + public function new(_x:Int , _y:Int, _type:String, _local_id:Int) + { + super(_x , _y); + local_id=_local_id; + //FlxG.visualDebug=true; + if(_type.indexOf("left")!=-1){ + dir_type=FlxObject.LEFT; + //loadGraphic(Wall_Laser_Sprite, true, false, 16, 16); + addAnimation("blink", [0, 1], 4, true); + addAnimation("charge", [1, 2, 1, 3], 6, true); + } + laser=new FlxSprite(x - Registry.SCREEN_WIDTH_IN_PIXELS, y); + laser.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, 16, 0xffffffff); + laser.visible=false; + laser.solid=false; + play("blink"); + } + + override public function update():Void { + if(is_charging){ + play("charge"); + if(sound_state==0){ + sound_state=sound_state_charge; + soundObj.loadEmbedded(Laser_Charge_Sound, false); + soundObj.play(); + } + charge_timer +=FlxG.elapsed; + } else { + play("blink"); + } + if(charge_timer>1.5){ + //BOOM! + if(sound_state==sound_state_charge){ + soundObj.stop(); + sound_state=sound_state_fire; + soundObj.loadEmbedded(Laser_Fire_Sound, false); + soundObj.play(); + } + laser.visible=true; + if(charge_timer>3){ + charge_timer=0; + sound_state=0; + is_charging=false; + laser.visible=false; + } + } + super.update(); + } + + public function touches(sprite:FlxSprite):Void { + if(dir_type==FlxObject.LEFT || dir_type==FlxObject.RIGHT){ + if(sprite.y>(y - sprite.height)&& sprite.y<(y + height)){ + is_charging=true; + } + } + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/hotel/Burst_Plant.hx b/intra/source/entity/enemy/hotel/Burst_Plant.hx new file mode 100644 index 0000000..9715f19 --- /dev/null +++ b/intra/source/entity/enemy/hotel/Burst_Plant.hx @@ -0,0 +1,212 @@ +package entity.enemy.hotel +{ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Burst_Plant extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var bullets:FlxGroup=new FlxGroup(8); + private var added_to_parent:Bool=false; + + private var t_timeout:Float=0; + private var tm_timeout:Float=1; + + + private var t_hurt:Float=0; + private var tm_hurt:Float=1.0; + + + private var state:Int=0; + private var s_idle:Int=0; + private var s_charge:Int=1; + private var t_charge:Float=0; + private var tm_charge:Float=0.5; + private var s_shoot:Int=2; + private var s_dying:Int=3; + private var s_dead:Int=4; + public var cid:Int=CLASS_ID.BURSTPLANT; + private var max_x_vel:Int=50; + + private var init_latency:Float=0.4; + + + //[Embed(source="../../../res/sprites/enemies/hotel/burst_plant.png")] public static var burst_plant_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/burst_plant_bullet.png")] public static var burst_plant_bullet_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Burst Plant Anims */ + loadGraphic(burst_plant_sprite, true, false, 16, 16); + addAnimation("idle", [0], 1); + addAnimation("charge", [0, 1], 8); + addAnimation("shoot", [3]); + play("idle"); + + for(i in 0...bullets.maxSize){ + /* Bullet and bullet shadow anims */ + var bullet:FlxSprite=new FlxSprite(); + bullet.loadGraphic(burst_plant_bullet_sprite, true, false, 8, 8); + bullet.addAnimation("move", [0, 1], 12); + bullet.addAnimation("explode", [2, 3, 4,4], 10, false); + bullet.play("move"); + + bullet.my_shadow=new FlxSprite(); + bullet.my_shadow.loadGraphic(Common_Sprites.shadow_sprite_8_8, true, false, 8, 8); + bullet.my_shadow.addAnimation("get_big", [0, 1, 2, 3], 8, false); + bullet.my_shadow.addAnimation("get_small", [3, 2, 1, 0], 8, false); + bullet.my_shadow.play("get_big"); + + bullets.add(bullet); + bullet.parabola_thing=new Parabola_Thing(bullet, 24 + Std.int(10 * Math.random()), 0.7 + Math.random(), "offset", "y"); + bullet.velocity.x=10; + } + + tm_timeout=0.4 + Math.random(); + + health=2; + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + add_sfx("shoot", Registry.sound_data.bubble_triple_group); + add_sfx("pop", Registry.sound_data.four_shooter_pop_group); + } + + override public function update():Void + { + + if(!added_to_parent){ + added_to_parent=true; + parent.fg_sprites.add(bullets); + for(var b:FlxSprite in bullets.members){ + parent.bg_sprites.add(b.my_shadow); + } + } + + if(init_latency>0){ + init_latency -=FlxG.elapsed; + return; + } + + //get hurt and transition to dying if needed + if((t_hurt>tm_hurt)&& player.broom.visible && player.broom.overlaps(this)){ + if(state !=s_dying && state !=s_dead){ + health--; + play_sfx(HURT_SOUND_NAME); + t_hurt=0; + flicker(tm_hurt); + if(health<=0){ + state=s_dying; + } + } + } else { + t_hurt +=FlxG.elapsed; + } + + var subctr:Int=0; + var bullet:FlxSprite; + if(state==s_idle){ //wait a bit before charging + t_timeout +=FlxG.elapsed; + if(t_timeout>tm_timeout){ + play("charge"); + state=s_charge; + t_timeout=0; + tm_timeout=0.4 + Math.random(); + } + } else if(state==s_charge){ + t_charge +=FlxG.elapsed;//charge + if(t_charge>tm_charge){ + for(bullet in bullets.members){ //init pos, vel etc - randomized a bit of course + bullet.x=bullet.my_shadow.x=x + 5; + bullet.y=bullet.my_shadow.y=y + 6; + + bullet.exists=bullet.my_shadow.exists=true; + bullet.parabola_thing.reset_time(); + bullet.play("move"); + bullet.my_shadow.play("get_small"); + bullet.parabola_thing.set_shadow_fall_animation("get_big");// Reset the bullet fall anim thing + + var sign:Int=Math.random()>0.5 ? -1:1; + max_x_vel=10 + 30 * Math.random(); + if(subctr>0){ + bullet.velocity.x=-max_x_vel + 2 * max_x_vel * Math.random(); + bullet.velocity.y=sign * Math.sqrt(max_x_vel * max_x_vel - bullet.velocity.x * bullet.velocity.x); + } else { //one bullet tries to hit the player + EventScripts.scale_vector(new Point(x, y), new Point(player.x, player.y), bullet.velocity, 2.5 * max_x_vel); + bullet.parabola_thing.period=1.5; + } + subctr++; + } + t_charge=0; + state=s_shoot; + play("shoot"); + play_sfx("shoot"); + } + } else if(state==s_shoot){ + for(bullet in bullets.members){ //move the bullets' offsets + bullet.my_shadow.x=bullet.x; + bullet.my_shadow.y=bullet.y; + if(bullet.parabola_thing.tick()){ + //do something + subctr++; + if(bullet.exists){ // If bullet hits ground, explode + bullet.my_shadow.exists=false; + bullet.play("explode"); + bullet.velocity.x=bullet.velocity.y=0; + + if(bullet.frame==bullet._curAnim.frames.length - 1){ + bullet.exists=false; + play_sfx("pop"); + } + } + } + if(bullet.offset.y<=4){ + if(!player.invincible && player.overlaps(bullet)&& bullet.velocity.x !=0){ + player.touchDamage(1); + } + } + + } + if(subctr==bullets.maxSize){ + play("idle"); + state=s_idle; + } + } else if(state==s_dying){ + //die, sfx... + //timer... + state=s_dead; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + xml.@alive="false"; + } else if(state==s_dead){ + bullets.setAll("exists", false); + for(bullet in bullets.members){ + bullet.my_shadow.exists=false; + } + + + exists=false; + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/hotel/Dustmaid.hx b/intra/source/entity/enemy/hotel/Dustmaid.hx new file mode 100644 index 0000000..df04b7d --- /dev/null +++ b/intra/source/entity/enemy/hotel/Dustmaid.hx @@ -0,0 +1,161 @@ +package entity.enemy.hotel +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Dustmaid extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var state:Int=0; + private var s_idle:Int=0; + private var s_chasing:Int=1; + private var s_dying:Int=2; + private var s_dead:Int=3; + + private var ctr:Int=0; + private var freq:Int=10; + + private var player_pt:Point=new Point(); + private var pt:Point=new Point(); + + private var t_hit:Float=0; + private var tm_hit:Float=1.0; + public var cid:Int=CLASS_ID.DUSTMAID; + //[Embed(source="../../../res/sprites/enemies/hotel/dustmaid.png")] public static var dustmaid_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + health=3; + state=s_idle; + alpha=0.7; + + loadGraphic(dustmaid_sprite, true, false, 16, 24); + width=8; + height=18; + centerOffsets(true); + offset.x +=1; + offset.y +=2; + addAnimation("idle", [0],1); + addAnimation("turn_dark", [1,2,1,2],12,false); + addAnimation("move_r", [5,6],7); + addAnimation("move_l", [5,6],7); + addAnimation("move_d", [3,4],7); + addAnimation("move_u", [7,8],7); + play("idle"); + + add_sfx("alert", Registry.sound_data.dustmaid_alert); + + } + override public function preUpdate():Void + { + FlxG.collide(this, parent.curMapBuf); + super.preUpdate(); + } + override public function update():Void + { + + if(state !=s_dying && !player.invincible && player.overlaps(this)){ + if(state !=s_dead){ + player.touchDamage(1); + } + } + + t_hit +=FlxG.elapsed; + if(health>0 && player.broom.visible && state==s_chasing && player.broom.overlaps(this)){ + if(t_hit>tm_hit){ + flicker(1); + t_hit=0; + health--; + play_sfx(HURT_SOUND_NAME); + if(health==0){ + state=s_dying; + } + if(state==s_idle){ + state=s_chasing; + play("turn_dark"); + } + } + } + + + if(state==s_idle){ + if(player.broom.has_dust){ + state=s_chasing; + play("turn_dark"); + alpha=1; + play_sfx("alert"); + } + + } else if(state==s_chasing){ + if(_curAnim.name=="turn_dark"){ + if(_curFrame==_curAnim.frames.length - 1){ + } else { + return; + } + } + if(ctr==freq){ + ctr=0; + player_pt.x=player.x; + player_pt.y=player.y; + pt.x=x; + pt.y=y; + scale.x=1; + offset.x=5; + switch(EventScripts.get_entity_to_entity_dir(pt.x, pt.y, player_pt.x, player_pt.y)){ + case UP: + play("move_u"); + offset.x=1; + break; + case LEFT: + scale.x=-1; + play("move_l"); + break; + case RIGHT: + play("move_r"); + break; + case DOWN: + play("move_d"); + break; + } + EventScripts.scale_vector(pt, player_pt, velocity, 20); + } + + ctr++; + + + } else if(state==s_dying){ + //play dying + //sfx dying + //alpha -=0.04; + alpha=0; + if(alpha==0){ + EventScripts.drop_small_health(x, y, 0.7); + EventScripts.make_explosion_and_sound(this); + Registry.GRID_ENEMIES_DEAD++; + state=s_dead; + } + } else if(state==s_dead){ + exists=false; + } + + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/hotel/Eye_Boss.hx b/intra/source/entity/enemy/hotel/Eye_Boss.hx new file mode 100644 index 0000000..5c73995 --- /dev/null +++ b/intra/source/entity/enemy/hotel/Eye_Boss.hx @@ -0,0 +1,751 @@ +package entity.enemy.hotel +{ +import data.Common_Sprites; +import entity.gadget.Dust; +import entity.player.HealthBar; +import entity.player.Player; +import flash.geom.Point; +import flash.text.engine.BreakOpportunity; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; + +class Eye_Boss extends FlxSprite +{ + + public var xml:XML; + private var parent:Dynamic; + private var player:Player; + private var tl:Point=new Point(); + + private var hitbox:FlxSprite; + + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_water.png")] public static var eye_boss_water_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_bullet.png")] public static var eye_boss_bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/eye_boss_splash.png")] public static var eye_boss_splash_sprite:Class; + + + private var did_init:Bool=false; + + public static var global_state:Int=0; + public static var gs_new:Int=0; + public var gs_land:Int=1; + public var gs_water:Int=2; + public var gs_dead:Int=3; + public var gs_transition_to_land:Int=4; + + + public static var cur_health:Int; + private var max_health:Int=12; + private var phase_2_health:Int=6; + private var ctr:Int=0; + public var state:Int=0; + + /* Land state var s*/ + + private var s_land_pace:Int=0; + private var s_land_shoot:Int=1; + private var s_land_charge:Int=2; + private var s_land_dying:Int=3; + private var s_land_dead:Int=4; + + private var t_pace:Float=0; + private var tm_pace:Float=1; + + private var t_shoot:Float=0; + private var tm_shoot:Array=new Array(1, 1, 0.9, 0.8, 0.7, 0.65); + + private var grp_land_splashes:FlxGroup=new FlxGroup(18); + + private var base_pt:Point=new Point(); + private var rel_coords:Point=new Point(1, 1); + + private var land_hitbox:FlxSprite=new FlxSprite; + + /* Water state vars */ + private var Intro_ctr:Int=0; + private var s_water_intro:Int=-1; + private var s_water_waiting:Int=0; + private var s_water_moving:Int=3; + private var s_water_dying:Int=1; + private var s_water_dead:Int=2; + private var s_water_blinded:Int=4; + private var s_water_leaving:Int=5; + + + private var grp_water_bullets:FlxGroup=new FlxGroup(8); + private var vel_water_bullet:Int=70; + private var t_blink:Float=0; + private var tm_blink:Array=new Array(1.1, 0.95, 0.9, 0.8, 0.7, 0.65); + + private var move_vel:Float=100; + private var t_move:Float=0; + private var tm_move:Float=0.8; + + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + parent=_parent; + player=_player; + tl.x=Registry.CURRENT_GRID_X*160 + 16; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT + 16; + + super(parseInt(xml.@x), parseInt(xml.@y)); + + // Set hitboxes/sprites + if(global_state==gs_water || global_state==gs_new){ + hitbox=this; + } else { + land_hitbox.makeGraphic(24, 11, 0xff123123); + hitbox=land_hitbox; + } + + loadGraphic(eye_boss_water_sprite, true, false, 24, 24); + parabola_thing=new Parabola_Thing(this, 16, 0.6, "offset", "y"); + my_shadow=new FlxSprite; + my_shadow.loadGraphic(Common_Sprites.shadow_sprite_28_10, true, false, 28, 10); + + /* Water anims for Eye */ + addAnimation("blink", [0, 1, 2, 3, 2, 1, 0], 10, false); + addAnimation("blink_fast", [0, 1, 2, 3, 2, 1], 20, true); + addAnimation("idle", [0]); + addAnimation("closed", [3]); + addAnimation("open", [3, 2, 1, 0],5); + /* Land anims for Eye(same spritesheet a water anims)*/ + addAnimation("walk", [4, 5], 6); + addAnimation("blink_land", [5, 6, 7, 6, 5,5], 6,false); + + for(i in 0...grp_water_bullets.maxSize){ + var b:FlxSprite=new FlxSprite; + /* Bullet and bullet shadow anims */ + b.loadGraphic(eye_boss_bullet_sprite, true, false, 16, 16); + b.addAnimation("move", [0, 1], 12); + b.addAnimation("pop", [2, 3, 4, 5], 12, false); + b.addAnimation("move_land", [6, 7], 12); + b.addAnimation("pop_land", [2, 3, 4, 5], 24, false); + + b.play("move"); + b.width=b.height=8; + b.centerOffsets(true); + + b.my_shadow=EventScripts.make_shadow("8_small",true); + b.my_shadow.exists=false; + b.my_shadow.visible=true; + b.my_shadow.play("get_big"); + + b.parabola_thing=new Parabola_Thing(b, 45, 1.5, "offset", "y"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + grp_water_bullets.add(b); + } + grp_water_bullets.setAll("exists", false); + grp_water_bullets.setAll("alive", false); + + + for(i=0;itl.y && alpha==1 && framePixels_y_push==22){ + velocity.y=0; + play("walk"); + framePixels_y_push=0; + my_shadow.visible=true; + Registry.sound_data.play_sound_group(Registry.sound_data.bubble_triple_group); + ctr++; + } + } else if(ctr==1){ + offset.y +=1.5; + if(offset.y>90){ + ctr++; + y=tl.y + 75; + x=tl.x + 16; + Registry.sound_data.fall1.play(); + + } + } else if(ctr==2){ + offset.y -=3; + if(offset.y<=0){ + offset.y=0; + FlxG.shake(0.03, 0.5); + global_state=gs_land; + state=s_land_pace; + my_shadow.visible=false; + + base_pt.x=x - 16; + base_pt.y=y - 16; + } + + } + + } + + private var land_ctr:Int=0; + + private function do_land():Void { + hitbox.x=x; + hitbox.y=y +(height - hitbox.height); + + var b:FlxSprite; + if(state==s_land_pace){ + + // Occasionally shoot a big bullet. + t_shoot +=FlxG.elapsed; + if(t_shoot>tm_shoot[phase_2_health - health]){ + t_shoot=0; + play("blink_land"); + play_sfx("land_shoot"); + shoot_big_bullet(); + } + + if(_curAnim.name=="blink_land" && _curAnim.frames.length - 1==_curFrame){ + play("walk"); + } + + // Pace about a small 3x3 grid of points + t_pace +=FlxG.elapsed; + + if(t_pace>tm_pace){ + t_pace=0; + var r:Float=Math.random(); + if(r<0.7){ + rel_coords.x=Std.int(3 * Math.random()); + rel_coords.y=Std.int(3 * Math.random()); + } else { + + } + } + EventScripts.send_property_to(this, "x", base_pt.x + rel_coords.x * 16, 1); + EventScripts.send_property_to(this, "y", base_pt.y + rel_coords.y * 16, 1); + + // Get hurt by the player maybe + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + ctr=0; + get_hurt(); + play_sfx(HURT_SOUND_NAME); + if(player.x>x){ + ctr=1; + velocity.x=-20; + my_shadow.exists=true; + my_shadow.x=x; + my_shadow.y=y +(height - my_shadow.height); + } + state=s_land_charge; + } + + } else if(state==s_land_charge){ + if(ctr==0){ // Charge to the right side + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "x", tl.x + 16 * 8 - width, 1.7))sub_ctr++; + if(EventScripts.send_property_to(this, "y", tl.y + 57, 1))sub_ctr++; + if(sub_ctr==2){ //Shoot some bullets when hitting the wall + FlxG.shake(0.05, 0.3); + play_sfx("hit_ground"); + for(j in 0...3){ + shoot_big_bullet(); + } + state=s_land_pace; + } + } else if(ctr==1){ // If hit from the front hop back a bit + my_shadow.visible=true; + my_shadow.x=x; + my_shadow.y=y +(height - my_shadow.height); + if(offset.y>=10){ + my_shadow.frame=2; + } else if(offset.y>=6){ + my_shadow.frame=3; + } else { + my_shadow.frame=4; + } + if(parabola_thing.tick()){ + offset.y=0; + ctr=0; + play_sfx("bounce"); + parabola_thing.reset_time(); + my_shadow.visible=false; + + } + } + } else if(state==s_land_dying){ + player.invincible_timer=0.3; + if(DH.scene_is_finished(DH.name_eyeboss, DH.scene_eyeboss_after_fight)){ + + if(land_ctr==0){ + ctr=0; + land_ctr=1; + offset.x=5; + offset.y=5; + } else if(land_ctr==1){ + t_blink +=FlxG.elapsed; + if(t_blink>0.3){ + x +=(-4 + 8 * Math.random()); + y +=(-4 + 8 * Math.random()); + EventScripts.make_explosion_and_sound(this); + t_blink=0; + ctr +=1; + if(ctr>=10){ + land_ctr=2; + FlxG.flash(0xffffffff, 2); + Registry.sound_data.sun_guy_death_l.play(); + visible=false; + } + } + } else { + my_shadow.exists=false; + if(grp_land_splashes.countLiving()==0){ + if(grp_water_bullets.countLiving()==0){ + state=s_land_dead; + exists=false; + Registry.GRID_ENEMIES_DEAD++; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]=true; + Registry.sound_data.start_song_from_title("HOTEL"); + global_state=gs_dead; + xml.@alive="false"; + } + } + } + + } else { + if(!DH.scene_is_dirty(DH.name_eyeboss, DH.scene_eyeboss_after_fight)){ + DH.start_dialogue(DH.name_eyeboss, DH.scene_eyeboss_after_fight); + Registry.sound_data.stop_current_song(); + FlxG.flash(0xffffffff, 1); + velocity.x=velocity.y=0; + Registry.sound_data.sun_guy_death_l.play(); + } + } + } + + + // Update "bombs" + for(b in grp_water_bullets.members){ + if(b.exists){ + b.my_shadow.x=b.x; + b.my_shadow.y=b.y; + + if(b.offset.y<7 && !player.invincible && player.overlaps(b)){ + player.touchDamage(1); + } + + + if(b.parabola_thing.tick()){ + b.play("pop_land"); + + if(b._curAnim.frames.length - 1==b._curFrame){ + b.parabola_thing.reset_time(); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.exists=b.alive=b.my_shadow.exists=false; + b.velocity.x=b.velocity.y=0; + play_sfx("unpop"); + // Make little splash sprites and move them sort of randomly + for(i in 0...4 ++){ + var splash:FlxSprite=grp_land_splashes.getFirstDead()as FlxSprite; + if(splash==null)break; + splash.play("move"); + splash.my_shadow.play("get_small"); + splash.x=b.x; + splash.y=b.y; + splash.alive=splash.exists=splash.my_shadow.exists=true; + splash.velocity.x=-20 + 40 * Math.random(); + splash.velocity.y=Math.sqrt(20 * 20 - Math.pow(splash.velocity.x, 2)); + Math.random()>0.5 ? splash.velocity.y *=-1:1; + } + } + } + } + } + + // Update slow-you-down-splashes - mostly boilerplate + + for(b in grp_land_splashes.members){ + if(b.exists){ + if(b.offset.y<9 && !player.invincible && player.overlaps(b)){ + //player.touchDamage(1); + Registry.sound_data.play_sound_group(Registry.sound_data.bubble_group); + b.my_shadow.exists=false; + player.slow_mul=0.3; + player.slow_ticks=100; + } + b.my_shadow.x=b.x; + b.my_shadow.y=b.y; + if(b.parabola_thing.tick()){ + b.play("explode"); + if(b._curAnim.frames.length - 1==b._curFrame){ + b.parabola_thing.reset_time(); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.alive=b.exists=b.my_shadow.exists=false; + b.velocity.x=b.velocity.y=0; + play_sfx("pop"); + } + } + } + } + + // Hit the player + + if(state !=s_land_dying && !player.invincible && player.overlaps(hitbox)&& state !=s_land_dead){ + player.touchDamage(1); + } + + if(health<=0){ + + state=s_land_dying; + } + + /* Occasionally charge */ + } + + private function do_water():Void { + var bullet:FlxSprite; + + switch(state){ + case s_water_intro: + if(intro_ctr==0){ + Registry.volume_scale -=0.007; + if(player.y>tl.y + 24 && player.state !=player.S_AIR){ + if(!DH.scene_is_dirty(DH.name_eyeboss, DH.scene_eyeboss_before_fight)){ + DH.start_dialogue(DH.name_eyeboss, DH.scene_eyeboss_before_fight); + player.be_idle(); + } + + if(!DH.scene_is_finished(DH.name_eyeboss, DH.scene_eyeboss_before_fight)){ + super.update(); + return; + } + play("open"); + Registry.volume_scale=1; + Registry.sound_data.start_song_from_title("BOSS"); + state=s_water_moving; + } + } + break; + case s_water_waiting: + if(EventScripts.bounce_in_box(hitbox, tl.x + 16 * 7 + 4, tl.x + 12, tl.y + 16 * 8, tl.y + 16)!=0){ + play_sfx("bounce"); + } + // Timeout for launching a bullet + t_blink +=FlxG.elapsed; + if(t_blink>tm_blink[max_health - health]){ + + t_blink=0; + bullet=grp_water_bullets.getFirstDead()as FlxSprite; + if(bullet==null)break; + bullet.exists=true; + bullet.alive=true; + bullet.play("move"); + play("blink"); + + play_sfx("shoot"); + bullet.velocity.x=bullet.velocity.y=50; + bullet.x=x;bullet.y=y; + } + + // If harmed, bounce about the room, initially away from player + // Or if at low enough health, move to land + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + play_sfx(HURT_SOUND_NAME); + get_hurt(); + if(health<=phase_2_health){ + water_death_logic(); + } else { + state=s_water_moving; + } + play("closed", true); + velocity.x=Math.min(20, move_vel * Math.random()); + velocity.y=Math.sqrt(move_vel * move_vel - velocity.x * velocity.x); + + player.facing==UP ? velocity.y *=-1:1; + player.facing==LEFT ? velocity.x *=-1:1; + } + + break; + case s_water_moving: + // Bounce in a box. + if(EventScripts.bounce_in_box(hitbox, tl.x + 16 * 7 + 4, tl.x + 12, tl.y + 16 * 8, tl.y + 16)!=0){ + play_sfx("bounce"); + } + if(!player.invincible && hitbox.overlaps(player)){ + player.touchDamage(1); + } + // After a timeout, return back to drifting state, + // speed based on current health + t_move +=FlxG.elapsed; + if(t_move>tm_move){ + t_move=0; + velocity.x=velocity.y=(max_health - health)* 15; + play("blink"); + state=s_water_waiting; + } + if(!flickering && player.broom.visible && player.broom.overlaps(hitbox)){ + get_hurt(); + play_sfx(HURT_SOUND_NAME); + if(health<=phase_2_health){ + water_death_logic(); + } else { + t_move=0; + velocity.x *=1.5; + velocity.y *=1.5; + } + } + + // If hit, reset the timeout and bounce even faster. + + break; + case s_water_leaving: + velocity.x=0; + //play smoe harmed animation + velocity.y=40; + if(y>tl.y + 16 * 6){ + framePixels_y_push++; + alpha -=0.05; + if(alpha==0){ + Registry.GRID_PUZZLES_DONE++; + global_state=gs_transition_to_land; + exists=false; + } + } + break; + } + + for(bullet in grp_water_bullets.members){ + if(bullet==null || !bullet.alive)continue; + if(!player.invincible && bullet.overlaps(player)&& player.state !=player.S_AIR){ + player.touchDamage(1); + bullet.play("pop"); + bullet.alive=false; + bullet.velocity.x=bullet.velocity.y=0; + play_sfx("poof"); + } + + if(player.broom.visible && player.broom.overlaps(bullet)){ + bullet.play("pop"); + bullet.alive=false; + bullet.velocity.x=bullet.velocity.y=0; + play_sfx("poof"); + } + + EventScripts.bounce_in_box(bullet, tl.x + 16 * 8, tl.x, tl.y + 16 * 9, tl.y); + } + } + + //intro stuff, transitions to water + private function do_new():Void { + global_state=gs_water; + } + + private function water_death_logic():Void + { + velocity.x=0; + state=s_water_leaving; + EventScripts.drop_big_health(x, y, 1); + cur_health=health; + for(var bullet:FlxSprite in grp_water_bullets.members){ + bullet.play("pop"); + bullet.alive=false; + } + } + + private function get_hurt():Void + { + health--; + if(global_state==gs_land){ + flicker(1.0); + } else { + flicker(2.3); + } + + } + + private function shoot_big_bullet():Void + { + var b:FlxSprite=grp_water_bullets.getFirstDead()as FlxSprite; + if(b==null)return; + b.play("move_land"); + b.my_shadow.play("get_small"); + b.alive=b.exists=b.my_shadow.exists=true; + b.x=x + width; + b.y=y + 2; + EventScripts.scale_vector(new Point(x + width, y + 4), new Point(player.x, player.y), b.velocity,(EventScripts.distance(player, this)- width)/ b.parabola_thing.period); + b.velocity.y +=5 * Math.random(); + b.velocity.x +=5 * Math.random(); + + } + + override public function destroy():Void + { + cur_health=health; + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/hotel/Steam_Pipe.hx b/intra/source/entity/enemy/hotel/Steam_Pipe.hx new file mode 100644 index 0000000..8bd67a0 --- /dev/null +++ b/intra/source/entity/enemy/hotel/Steam_Pipe.hx @@ -0,0 +1,207 @@ +package entity.enemy.hotel +{ +import entity.gadget.Dust; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +class Steam_Pipe extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var dame_frame:Int; + private var added_to_parent:Bool=false; + + private var eject_pt:Point; + private var eject_vel:Int=50; + public var steam_clouds:FlxGroup=new FlxGroup(6); + public var timers:Array; + private var PUSH_VEL:Int=50; + + + private var active_region:FlxSprite=new FlxSprite(); + private var disabled:Bool=false; + + + //dame frames - DRUL + + //[Embed(source="../../../res/sprites/enemies/hotel/steam_pipe.png")] public static var steam_pipe_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/hotel/steam.png")] public static var steam_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(steam_pipe_sprite, true, false, 16, 16); + dame_frame=parseInt(xml.@frame); + + // Set directions and active regions(where you are pushed), and ejection points for the steam clouds + /* ADD ANIMATIONS FOR STEAM PIPE(if any)*/ + switch(dame_frame){ + case 0: + eject_pt=new Point(x + 2, y + Registry.HEADER_HEIGHT + 10); + active_region=new FlxSprite(x + 3, y + 16 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(10, 16, 0xff123123); + frame=0;facing=DOWN; + break; + case 1: + eject_pt=new Point(x + 14, y + 5 + Registry.HEADER_HEIGHT); + active_region=new FlxSprite(x + 16, y + Registry.HEADER_HEIGHT + 3); + active_region.makeGraphic(16, 10, 0xff123123); + addAnimation("do_something", [1], 12); + frame=1;facing=RIGHT; + break; + case 2: + eject_pt=new Point(x + 3, y - 2 + Registry.HEADER_HEIGHT); + frame=2;facing=UP; + active_region=new FlxSprite(x + 3, y + Registry.HEADER_HEIGHT - 16); + active_region.makeGraphic(10, 16, 0xff123123); + addAnimation("do_something", [2], 12); + break; + case 3: + eject_pt=new Point(x - 6, y + 3 + Registry.HEADER_HEIGHT); + frame=3;facing=LEFT; + active_region=new FlxSprite(x - 16, y + Registry.HEADER_HEIGHT + 3); + active_region.makeGraphic(16, 10, 0xff123123); + addAnimation("do_something", [3], 12); + break; + } + play("do_something"); + + active_region.visible=false; + + timers=new Array(steam_clouds.maxSize); + + + //Randomize the size of the clouds a little + /* ADD ANIMATIONS FOR STEAM CLOU */ + for(i in 0...steam_clouds.maxSize){ + var steam_cloud:FlxSprite=new FlxSprite(); + steam_cloud.loadGraphic(steam_sprite, true, false, 16, 16); + steam_cloud.addAnimation("s", [0, 1], 10); + steam_cloud.play("s"); + //steam_cloud.flicker(-1); + steam_clouds.add(steam_cloud); + steam_cloud.x=eject_pt.x; + steam_cloud.y=eject_pt.y; + steam_cloud.scale.x=steam_cloud.scale.y=0.8 + 0.2 * Math.random(); + steam_cloud.width=steam_cloud.height=width * steam_cloud.scale.x; + //steam_cloud.angle=360 * Math.random(); + timers[i]=30 + Std.int(20 * Math.random());//Timeouts for steam clouds to reset + set_vel(steam_cloud); + } + + add_sfx("pew", Registry.sound_data.fireball_group); + + } + + override public function update():Void + { + if(!added_to_parent){ + added_to_parent=true; + parent.bg_sprites.add(active_region); + parent.fg_sprites.add(steam_clouds); + } + + // dust on the active region disables the pushing effect + disabled=false; + for(var dust:Dust in Registry.subgroup_dust){ + if(dust !=null){ + if(dust.overlaps(active_region)&&(dust.frame !=Dust.EMPTY_FRAME)&&(dust !=player.raft)){ + disabled=true; + } + } + } + + for(var gas:FlxSprite in Registry.subgroup_gas){ + if(gas !=null){ + for(var steam_cloud:FlxSprite in steam_clouds.members){ + if(steam_cloud !=null){ + if(gas.overlaps(steam_cloud)){ + gas.velocity.x +=0.01 * steam_cloud.velocity.x; + gas.velocity.y +=0.01 * steam_cloud.velocity.y; + } + } + } + } + } + + var ctr:Int=0; + //Change timers for the visual effect of steam spewing forth, or being held by the dust + for(var steam:FlxSprite in steam_clouds.members){ + timers[ctr]--; + if(timers[ctr]==0){ + if(!disabled){ + timers[ctr]=30 + Std.int(20 * Math.random()); + } else { + timers[ctr]=3 + Std.int(2 * Math.random()); + } + steam.x=eject_pt.x; + steam.y=eject_pt.y; + set_vel(steam); + play_sfx("pew"); + } + ctr++; + + if(disabled==false){ + if(steam.overlaps(player)){ + pushplayer(); + } + } + } + + // Push the player if the pipe isn't disabled, and player touches active region + if(!disabled){ + if(player.overlaps(active_region)){ + pushplayer(); + } + } + + super.update(); + } + + //randomize velocity of clouds within certain ranges + private function set_vel(steam_cloud:FlxSprite):Void + { + switch(facing){ + case DOWN: + steam_cloud.velocity.y=eject_vel + 20 * Math.random(); + steam_cloud.velocity.x=-30 + 60 * Math.random(); + break; + case UP: + steam_cloud.velocity.y=-eject_vel - 20 * Math.random(); + steam_cloud.velocity.x=-30 + 60 * Math.random(); + break; + case LEFT: + steam_cloud.velocity.x=-eject_vel - 20 * Math.random(); + steam_cloud.velocity.y=-30 + 60 * Math.random(); + break; + case RIGHT: + steam_cloud.velocity.x=eject_vel + 20 * Math.random(); + steam_cloud.velocity.y=-30 + 60 * Math.random(); + break; + } + } + + private function pushplayer():Void + { + switch(facing){ + case DOWN: + player.additional_y_vel=PUSH_VEL;break; + case UP: + player.additional_y_vel=-PUSH_VEL;break; + case LEFT: + player.additional_x_vel=-PUSH_VEL;break; + case RIGHT: + player.additional_x_vel=PUSH_VEL;break; + + } + } + + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/redcave/Four_Shooter.hx b/intra/source/entity/enemy/redcave/Four_Shooter.hx new file mode 100644 index 0000000..6ad1a03 --- /dev/null +++ b/intra/source/entity/enemy/redcave/Four_Shooter.hx @@ -0,0 +1,189 @@ +package entity.enemy.redcave +{ +/** + * ... + * @author Seagaia + */ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import mx.core.FlexSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import states.PlayState; +class Four_Shooter extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redcave/f_four_shooter.png")] public static var four_shooter_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/f_four_shooter_bullet.png")] public static var four_shooter_bullet_sprite:Class; + + + + public var cid:Int=CLASS_ID.FOUR_SHOOTER; + public var xml:XML; + public var timer_max:Float=1.5; + public var timer:Float=timer_max; + public var state:Int=0; + public var S_STRAIGHT:Int=0; + public var S_DIAG:Int=1; + public var bullets:FlxGroup; + public var NR_BULLETS:Int=12; + public var parent:PlayState; + public var VEL:Int=50; + public var player:Player; + public function new(_xml:XML, _parent:PlayState, _player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + bullets=new FlxGroup(); + for(i in 0...NR_BULLETS){ + var bullet:FlxSprite=new FlxSprite(0, 0); + /* Animations for bullets */ + bullet.loadGraphic(four_shooter_bullet_sprite, true, false, 8, 8); + bullet.addAnimation("move", [0, 1], 12, true); + bullet.addAnimation("explode", [2, 3], 10, false); + + bullet.play("move"); + bullet.has_tile_callbacks=false; + bullets.add(bullet); + bullet.width=bullet.height=4; + bullet.offset.x=bullet.offset.y=2; + } + immovable=true; + bullets.setAll("alive", false); + parent=_parent; + parent.otherObjects.push(bullets); + player=_player; + + /* Animations for four_shooter */ + loadGraphic(four_shooter_sprite, true, false, 16, 16); + addAnimation("nesw", [0]); + addAnimation("shoot_then_nesw_to_diag", [0, 1, 2, 2], 3, false); + addAnimation("diag", [2]); + addAnimation("shoot_then_diag_to_nesw", [2, 1, 0, 0], 3, false); + play("nesw"); + + add_sfx("shoot", Registry.sound_data.four_shooter_shoot_group); + add_sfx("pop", Registry.sound_data.four_shooter_pop_group); + + + } + + override public function update():Void + { + FlxG.collide(player, this); + timer -=FlxG.elapsed; + if(timer<0){ + timer=timer_max; + shoot(); + rotate(); + } else { + if(_curAnim.frames.length - 1==_curFrame){ + if(state==S_DIAG){ + play("diag"); + } else { + play("nesw"); + } + } + } + check_overlap(); + super.update(); + } + + public function reset_bullet(b:FlxSprite, m:Dynamic):Void { + if(!b.alive)return; + b.alive=false; + play_sfx("pop"); + b.velocity.x=b.velocity.y=0; + b.play("explode"); + } + public function check_overlap():Void { + FlxG.collide(bullets, parent.curMapBuf, reset_bullet); + for(var b:FlxSprite in bullets.members){ + if(b !=null){ + if(player.state !=player.S_AIR && b.alive && b.overlaps(player)){ + player.touchDamage(1); + reset_bullet(b, null); + } + } + } + + for(var s:FlxSprite in bullets.members){ + if(s==null || !s.alive)continue; + if(s.velocity.x==0){ + if(s.y>parent.lowerBorder){ + reset_bullet(s, null);continue; + } else if(s.yparent.rightBorder){ + reset_bullet(s, null);continue; + } else if(s.x0){ + if(_curAnim.name=="foom" &&(_curAnim.frames.length - 1==_curFrame)){ + play("still"); + } + move_timer -=FlxG.elapsed; + } else { + play("foom"); + play_sfx("move"); + move_timer=move_timer_init; + var dx:Float=target.x - x; + var dy:Float=target.y - y; + var norm:Float=Math.min(3, 100 / Math.sqrt(dx * dx + dy * dy)); + velocity.x=dx * norm +(-5 + 5*Math.random()); + velocity.y=dy * norm +(-5 * 5 * Math.random()); + } + } + + if(!visible){ + if(!INCREMENTED_REG){ + INCREMENTED_REG=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + } + + } + + // If movers touch a laser they disappear + if(visible){ + if(player.overlaps(this)){ + player.additional_x_vel=velocity.x; + player.additional_y_vel=velocity.y; + } + + if(_curAnim.name=="die" &&(_curAnim.frames.length - 1==_curFrame)){ + visible=false; + } + + for(var l:On_Off_Laser in Registry.subgroup_on_off_lasers){ + if(l==null)continue; + if(l.laser.overlaps(this)&& l.state==l.s_hurting){ + if(_curAnim.name !="die"){ + alive=false; + play_sfx(HURT_SOUND_NAME); + play_sfx("die"); + } + play("die"); + } + } + } + } + + + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/redcave/On_Off_Laser.hx b/intra/source/entity/enemy/redcave/On_Off_Laser.hx new file mode 100644 index 0000000..5af430d --- /dev/null +++ b/intra/source/entity/enemy/redcave/On_Off_Laser.hx @@ -0,0 +1,207 @@ +package entity.enemy.redcave +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * DAME PROPS: + * frame - direction of the laser(URDL) + * note, row determines period + * + */ +class On_Off_Laser extends FlxSprite +{ + + public var cid:Int=CLASS_ID.ON_OFF_LASER; + public var xml:XML; + private var LASER_WIDTH:Int=12; + private var OFFSET:Int=0;//2; + + + public var laser:FlxSprite; + public var laser_active:Bool=false; + private var played_sound:Bool=false; + + private var player:Player; + + public var state:Int=0; + private var s_idle:Int=0; + private var s_emerging:Int=1; + public var s_hurting:Int=2; + private var s_receding:Int=3; + + private var t:Float=0; + private var tm_idle:Float=0; + private var tm_hurting:Float=0; + + private var did_move_offset:Bool=false; + // up, left + //[Embed(source="../../../res/sprites/enemies/redcave/f_on_off_h.png")] public var h_on_off_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/f_on_off_v.png")] public var v_on_off_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/on_off_shooter.png")] public static var on_off_shooter_sprite:Class; + + public function new(_xml:XML,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + immovable=true; + var dame_frame:Int=parseInt(xml.@frame); + switch(dame_frame){ + case 0://up + laser=new FlxSprite(x + OFFSET, y - 144); + laser.loadGraphic(v_on_off_sprite, true, true, 16, 144); + laser.height=112; + laser.scale.y=-1; + laser.width=8; + laser.offset.x=4; + laser.x +=4; + laser.y +=32; + laser.offset.y +=32; + + break; + case 1://r + laser=new FlxSprite(x + width, y + OFFSET); + laser.loadGraphic(h_on_off_sprite, true, true, 144, 16); + laser.scale.x=-1; + laser.offset.x=16; + laser.width=128; + laser.offset.x=16; + laser.height=8; + laser.offset.y=4; + laser.y +=4; + break; + case 2://down + laser=new FlxSprite(x + OFFSET, y + 16);//+height); + laser.loadGraphic(v_on_off_sprite, true, false, 16, 144); + laser.height=112; + laser.offset.y=16; + laser.width=8; + laser.offset.x=4; + laser.x +=4; + break; + case 3: + laser=new FlxSprite(x - 144, y + OFFSET); + laser.loadGraphic(h_on_off_sprite, true, false, 144, 16); + laser.offset.x=-16; + laser.width=112; + laser.height=8; + laser.offset.x=16; + laser.x +=32; + laser.offset.y=4; + laser.y +=4; + break; + } + /* Shooter/node's animations */ + //urdl + + loadGraphic(on_off_shooter_sprite, true, false, 16, 16); + switch(dame_frame){ + case 2:// If pointing down + addAnimation("shooter_closed", [0,1], 2); + addAnimation("shooter_open", [2]); + break; + case 1://pointing right + case 0:// ...down + case 3://left + if(dame_frame==1){ + angle=90; + } else if(dame_frame==3){ + angle=-90; + } + addAnimation("shooter_closed", [3,4], 2); + addAnimation("shooter_open", [5]); + break; + } + play("shooter_closed"); + + /* Steam's animations */ + laser.addAnimation("steam_is_harmful", [3, 4, 5, 6], 15, true); + /* for these non-looping anims, keep the extra frame index at the end because I use the animation + * index to tell the steam to change to the next state */ + laser.addAnimation("recede", [0, 1, 2, 2], 5, false); + laser.addAnimation("emerge", [2, 1, 0, 0], 5, false); + laser.addAnimation("idle_invisible", [0], 2,true); + laser.visible=false; + switch(parseInt(xml.@frame)){ + case 0:case 1:case 2:case 3: + tm_hurting=tm_idle=2; + break; + } + laser.play("idle_invisible"); + laser.visible=false; + + player=_player; + Registry.subgroup_on_off_lasers.push(this); + // anims:steam from head, head opening + // sfx:steam blowing + add_sfx("shoot", Registry.sound_data.on_off_laser_shoot); + + } + + override public function update():Void + { + + if(!did_move_offset){ + //urdl + did_move_offset=true; + switch(parseInt(xml.@frame)){ + case 0: + laser.offset.y -=16; + break; + case 1: + break; + case 2: + break; + case 3: + break; + } + } + + switch(state){ + case s_idle: + t +=FlxG.elapsed; + if(t>tm_idle){ + t=0; + laser.visible=true; + state=s_emerging; + play("shooter_open"); + play_sfx("shoot"); + laser.play("emerge"); + } + break; + case s_emerging: + laser.flicker(0.05); + if(laser._curFrame==(laser._curAnim.frames.length - 1)){ + laser.play("steam_is_harmful"); + state=s_hurting; + } + break; + case s_hurting: + t +=FlxG.elapsed; + if(t>tm_hurting){ + laser.play("recede"); + t=0; + state=s_receding; + } + if(player.overlaps(laser)){ + player.touchDamage(1); + } + + break; + case s_receding: + laser.flicker(0.05); + if(laser._curFrame==(laser._curAnim.frames.length - 1)){ + laser.play("idle_invisible"); + laser.visible=false; + state=s_idle; + play("shooter_closed"); + } + break; + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/redcave/Red_Boss.hx b/intra/source/entity/enemy/redcave/Red_Boss.hx new file mode 100644 index 0000000..b8142c9 --- /dev/null +++ b/intra/source/entity/enemy/redcave/Red_Boss.hx @@ -0,0 +1,851 @@ + package entity.enemy.redcave +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import mx.core.FlexSprite; +import org.flixel.FlxBasic; +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxPoint; +import org.flixel.FlxSave; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; +import states.PlayState; + +/** + * Red cave boss + */ +class Red_Boss extends FlxSprite +{ + private var player:Player; + private var parent:PlayState; + private var xml:XML; + private var timer:Float=0; + + private var ripple:FlxSprite; + + private var added_to_parent:Bool=false; + public var cid:Int=CLASS_ID.RED_BOSS; + private var hit_timer_max:Float=1.3; + + private var pushdown_angle:Float=0; + private var amp:Int=5; + + public var state:Int=0; + private var s_intro:Int=0; + private var Intro_push_px:Int=32; + private var boss_fight_started:Bool=false; + + private var s_dead:Int=6; + private var s_dying:Int=5; + private var played_death_anim:Bool=false; + private var t_death_to_cutscene:Float=0; + private var t_death_push_tick:Float=0; + private var tm_death_to_cutscene:Float=2; + private var tm_death_push_tick:Float=0.15; + private var death_push_pixels:Int=0; + private var final_alpha:Float=1; + + private var ctr:Int=0; + /* stun wave entitites */ + private var s_stun_wave:Int=2; + private var small_wave:FlxSprite=new FlxSprite(); + private var big_wave:FlxSprite=new FlxSprite(); + private var player_hit_big_wave:Bool=false; + private var small_wave_risen:Bool=false; + private var small_wave_fallen:Bool=false; + private var big_wave_risen:Bool=false; + private var big_wave_fallen:Bool=false; + + /* Dash entities */ + private var s_dash:Int=3; + private var dash_timer:Float=0; + private var dash_timer_max:Float=5.0; + + + /* L-splash entities */ + private var s_l_splash:Int=1; + public var too_close_count:Int=0; + + private var timer_l_splash_max:Float=3.0; + private var timer_l_splash:Float=0; + private var sig_l_splash:Bool=false; + private var on_l_splash:Bool=false; + private var group_l_splash:FlxGroup=new FlxGroup(8); + private var group_l_splash_shadows:FlxGroup=new FlxGroup(8); + private var l_splash_start_tile_coords:Array=new Array(new Point(1, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5)); + private var l_splash_coeffs:Array=new Array(0,0,0,0,0,0,0,0); + private var l_splash_periods:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0); + private var l_splash_timers:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0); + + /* Tentacles */ + private var tentacles:FlxGroup=new FlxGroup(4); + private var tentacle_warnings:FlxGroup=new FlxGroup(4); + private var sig_tentacle_thrust:Bool=false; + private var on_tentacle_thrust:Bool=false; + private var timer_tentacle_thrust_max:Float=3.0; + private var timer_tentacle_thrust:Float=3.0; + private var tentacle_thrust_timers:Array=new Array(0, 0, 0, 0); + private var tt_type:Int=NONE; + + + + /** + * Top left walkable tile's world coordinates. + */ + private var pt_rm_tl:Point=new Point(); + + private var bullet_pool:FlxGroup=new FlxGroup(10); + private var bullet_shadows:FlxGroup=new FlxGroup(10); + private var tl:FlxPoint; + //[Embed(source="../../../res/sprites/enemies/red_boss.png")] public static var red_boss_sprite:Class; + //[Embed(source="../../../res/sprites/redboss_alternate.png")] public var red_boss_alternate_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_big_wave.png")] public var big_wave_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_small_wave.png")] public var small_wave_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_tentacle.png")] public var tentacle_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_warning.png")] public var warning_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_bullet.png")] public var bullet_sprite:Class; + //[Embed(source="../../../res/sprites/enemies/redcave/red_boss_ripple.png")] public static var ripple_sprite:Class; + + public function new(_xml:XML,_parent:PlayState,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + player=_player; + parent=_parent; + xml=_xml; + + if(Registry.FUCK_IT_MODE_ON){ + state=s_dying; + //state=s_stun_wave; + } + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + tl=new FlxPoint(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + 20); + player.grid_entrance_x=tl.x + 23; + player.grid_entrance_y=tl.y + 40; + + immovable=true; + + /* HEAD SPRITES */ + var stupid:Bool=false; + if(stupid){ + loadGraphic(red_boss_alternate_sprite, true, false, 32, 32); + } else { + loadGraphic(red_boss_sprite, true, false, 32, 32); + } + addAnimation("bob", [0], 20, true); + addAnimation("close_eyes", [1],10,false); + addAnimation("warn", [2,2],24); + addAnimation("die", [0, 1, 2], 3, false); + addAnimation("last_death_frame", [1], 2); + play("bob"); + height=19; + offset.y=13; + width=26; + offset.x=3; + framePixels_y_push=32; + + ripple=new FlxSprite; + ripple.loadGraphic(ripple_sprite, true, false, 48, 8); + ripple.addAnimation("move", [0, 1], 12); + ripple.play("move"); + + pt_rm_tl.x=Registry.CURRENT_GRID_X * Registry.SCREEN_WIDTH_IN_PIXELS + Registry.TILE_WIDTH; + pt_rm_tl.y=Registry.CURRENT_GRID_Y * Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT + Registry.TILE_WIDTH; + + /* BULLET + BULLET SHADOW SPRITES */ + for(i in 0...bullet_pool.maxSize){ + + var b:FlxSprite=new FlxSprite(); + b.loadGraphic(bullet_sprite, true, false, 8, 8); + b.addAnimation("move", [0, 1], 12); + b.addAnimation("explode", [2, 3, 4, 4], 14, false); + /* load bulet shadow gfx */ + b.my_shadow=EventScripts.make_shadow("8_small"); + b.parabola_thing=new Parabola_Thing(b, 48, 1.2 + Math.random(), "offset", "y"); + b.parabola_thing.set_shadow_fall_animation("get_big"); + b.visible=true; + + b.play("move"); + b.my_shadow.play("get_big"); + + bullet_pool.add(b); + bullet_shadows.add(b.my_shadow); + + } + bullet_pool.setAll("exists", false); + + bullet_shadows.setAll("exists", false); + + var j:Int; + + /* TENTACLE + WARNING SPRITES */ + for(j=0;j=pt_rm_tl.x + 32){ + + if(!DH.scene_is_dirty(DH.name_redboss, DH.scene_redboss_before_fight)){ + DH.start_dialogue(DH.name_redboss, DH.scene_redboss_before_fight); + play_sfx("rise_from_water"); + player.be_idle(); + } + + if(DH.scene_is_finished(DH.name_redboss, DH.scene_redboss_before_fight)){ + boss_fight_started=true; + state=s_l_splash; + Registry.sound_data.start_song_from_title("BOSS"); + stop_sfx("rise_from_water"); + play("bob"); + } + } else { + return; + } + } + framePixels_y_push=intro_push_px; + t_death_push_tick +=FlxG.elapsed; + if(t_death_push_tick>tm_death_push_tick){ + t_death_push_tick=0; + if(intro_push_px>0){ + FlxG.shake(0.021, 0.1); + intro_push_px--; + } + } + + return; + } + + // collisions for damage etc + if(player.broom.overlaps(this)&& player.broom.visible){ + if(timer>hit_timer_max && health>=0){ + timer=0; + health--; + play_sfx("moan"); + flicker(0.5); + if(health<=0){ + state=s_dying; + stop_sfx("rise_from_water"); + velocity.x=velocity.y=0; + tentacles.exists=false; + bullet_pool.exists=false; + bullet_shadows.exists=false; + tentacle_warnings.exists=false; + tentacles.exists=false; + big_wave.exists=small_wave.exists=false; + player.angle=0; + player.angularVelocity=0; + } + } + + } + + if(state==s_dying){ + //die etc + + if(!DH.scene_is_dirty(DH.name_redboss, DH.scene_redboss_after_fight)){ + Registry.sound_data.stop_current_song(); + DH.start_dialogue(DH.name_redboss, DH.scene_redboss_after_fight); + player.be_idle(); + FlxG.shake(0.05, 0.1); + FlxG.flash(0xffff0000, 1); + super.update(); + return; + } + + if(!DH.scene_is_finished(DH.name_redboss, DH.scene_redboss_after_fight)){ + super.update(); + return; + } + + tentacles.setAll("alpha", final_alpha); + tentacle_warnings.setAll("alpha", final_alpha); + bullet_shadows.setAll("alpha", final_alpha); + bullet_pool.setAll("alpha", final_alpha); + small_wave.alpha=final_alpha; + big_wave.alpha=final_alpha; + ripple.alpha -=0.005; + + final_alpha -=0.005; + + if(!played_death_anim){ + Registry.GFX_WAVE_EFFECT_ON=true; + played_death_anim=true; + play_sfx("death"); + play("die"); + } else { + if(_curAnim.name=="die" && _curAnim.frames.length - 1==_curFrame){ + play("last_death_frame"); + } + } + + framePixels_y_push=death_push_pixels; + if(framePixels_y_push>=32){ + framePixels_y_push=32; + if(t_death_to_cutscenedash_timer_max){ + dash_timer=0; + state=s_stun_wave; + velocity.x=velocity.y=0; + return; + } + timer_tentacle_thrust -=FlxG.elapsed; + if(timer_tentacle_thrust<=0){ + timer_tentacle_thrust=timer_tentacle_thrust_max/2; + sig_tentacle_thrust=true; + tt_type=get_player_proximity_type(); + /* If player approaches too many times, then dive under */ + if(tt_type !=NONE)too_close_count++; + } + + if(too_close_count==2){ + too_close_count=0; + state=s_l_splash; + velocity.x=velocity.y=0; + return; + } + //Set xvel + var vel:Int=60; + if(velocity.x>0){ + if(x + width>pt_rm_tl.x + 7 * 16){ + velocity.x=-vel; + FlxG.shake(0.05, 0.1, null, true, FlxCamera.SHAKE_HORIZONTAL_ONLY); + } + } else { + if(x0){ + if(y + height>pt_rm_tl.y + 7 * 16){ + FlxG.shake(0.05, 0.1, null, true, FlxCamera.SHAKE_VERTICAL_ONLY); + velocity.y=-vel; + } + } else { + if(y0){ + t.framePixels_y_push -=2; + if(t.framePixels_y_push<=0){ + t.alive=false; + } + } else if(tentacle_thrust_timers[idx]<0.3){ + if(t.framePixels_y_push0.5){ + if(b.velocity.x==0){ + b.visible=true; + play_sfx("bubble", true); + b.velocity.x=Std.int(10 + 7 * Math.random()); + b.my_shadow.play("get_small"); + } + + if(b.offset.y<10){ + if(b.overlaps(player)){ + player.touchDamage(1); + } + } + + if(b.parabola_thing.tick()&& b.offset.y<=4){ + b.play("explode"); + if(b._curAnim.frames.length - 1==b._curFrame){ + b.my_shadow.exists=b.exists=false; + b.parabola_thing.reset_time(); + b.play("move"); + play_sfx("bubble", true); + b.parabola_thing.set_shadow_fall_animation("get_big"); + } + } + } else { + b.my_shadow.flicker(0.05); + } + } + } + } + + private function do_stun_wave():Void + { + var sub_ctr:Int=0; + + /* Oscillation incrments */ + pushdown_angle +=0.05; + framePixels_y_push=amp + Math.sin(pushdown_angle % 6.28)* amp; + + /* big 'n' small wave logic. */ + if(small_wave.exists){ + if(small_wave.overlaps(player)){ + EventScripts.send_property_to(player, "x", 0, -0.5); + } + if(small_wave.xamp - 1){ + FlxG.camera.shake(0.03, 1.0); + ctr++; + play_sfx("small_wave"); + small_wave.play("move"); + small_wave.velocity.x=-20; + } + } else if(ctr==2){ //wait to be up to continue + if(framePixels_y_push==0){ + ctr++; + amp=20; + } + } else if(ctr==3){ //when down generate big wave + if(framePixels_y_push>18){ + if(!big_wave_risen){ + big_wave.x=pt_rm_tl.x + 64; + big_wave.y=pt_rm_tl.y + 32; + big_wave.exists=true; + big_wave_risen=true; + big_wave.play("rise"); + } + } + if(big_wave._curAnim.name=="rise" &&(big_wave._curFrame==big_wave._curAnim.frames.length - 1)){ + ctr++; + big_wave_risen=false; + big_wave.play("move"); + FlxG.camera.shake(0.05, 1.0); + play_sfx("big_wave"); + big_wave.velocity.x=-40; + } + + } else if(ctr==4){ //wait to be up + play("close_eyes"); + if(framePixels_y_push<2){ + ctr++; + amp=5; + } + } else if(ctr==5){ //when waves gone, go back to dash satate + if(!small_wave.exists && !big_wave.exists){ + if(EventScripts.send_property_to(this, "y", pt_rm_tl.y + 48, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "x", pt_rm_tl.x + 16 * 4, 0.5))sub_ctr++; + if(sub_ctr==2){ + small_wave.velocity.x=big_wave.velocity.x=0; + player_hit_big_wave=false; + state=s_dash; + play("bob"); + stop_sfx("rise_from_water"); + velocity.x=30; + velocity.y=20; + ctr=0; + } + } + } + } +} \ No newline at end of file diff --git a/intra/source/entity/enemy/redcave/Slasher.hx b/intra/source/entity/enemy/redcave/Slasher.hx new file mode 100644 index 0000000..217df34 --- /dev/null +++ b/intra/source/entity/enemy/redcave/Slasher.hx @@ -0,0 +1,448 @@ +package entity.enemy.redcave +{ +import data.CLASS_ID; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import entity.player.Player; +import org.flixel.FlxU; +import states.PlayState; + +class Slasher extends FlxSprite +{ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher.png")] public static var slasher_sprite:Class; + /* A little confusign:Dynamic/ + /* wide has down-facing Wide attack, right-facing long attack */ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher_wide.png")] public static var wide_atk_sprite:Class; + /* long has right-facing wide attack, up-facing long attack */ + //[Embed(source="../../../res/sprites/enemies/redcave/f_slasher_long.png")] public static var long_atk_sprite:Class; + public var harmful_wide_atk_frames:Array=new Array(0, 1, 2); + public var harmful_long_atk_frames:Array=new Array(3, 4, 5); + + + public var cid:Int=CLASS_ID.SLASHER; + public var xml:XML; + + public var long_sprite:FlxSprite=new FlxSprite(); + public var wide_sprite:FlxSprite=new FlxSprite(); + + public var SPRITE_WIDTH:Int=16; + public var state:Int=0; + public var S_MOVE:Int=0; + public var move_timer_max:Float=1.4; + public var move_timer:Float=0; + private var initial_latency:Float=1.4; + + public var S_ATK_LONG:Int=1; + public var LONG_ATK_TIMEOUT_MAX:Float=0.8; + public var LONG_ATK_TIMEOUT:Float=LONG_ATK_TIMEOUT_MAX; + public var S_ATK_WIDE:Int=2; + public var S_ATK_WIDE_DELAY:Int=3; + public var WIDE_ATK_DISTANCE:Int=36; + public var WIDE_ATK_DELAY_MAX:Float=0.3; + public var WIDE_ATK_DELAY:Float=WIDE_ATK_DELAY_MAX; + public var WIDE_ATK_TIMER_MAX:Float=0.4; + public var WIDE_ATK_TIMER:Float=WIDE_ATK_TIMER_MAX; + public var INCREMENTED_REG:Bool=false; + + public var t_warning:Float=0; + public var tm_warning:Float=0.5; + public var played_warning:Bool=false; + + public var activate_attack_frame:Int=0; + public var started_attack_anim:Bool=false; + + + + + public var player:Player; + public var parent:PlayState; + + + public function new(_xml:XML, _parent:PlayState, _player:Player) + { + + // anims: + // walk urdl + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + player=_player; + parent=_parent; + + /** Note to Marina: + * All scalings are taken care of for the attack, the default facings of the attacks that + * i've programmed for are commented below */ + /* Add attack animations */ + long_sprite.loadGraphic(long_atk_sprite, true, false, 16, 48); + long_sprite.addAnimation("tall", [3, 4, 5, 6], 12, false);//Faces up, from the long sprite sheet + long_sprite.addAnimation("wide", [3, 4, 5, 6], 12, false);// Faces right, from the wide spritesheet + long_sprite.play("tall"); + + // 10 x 36 + + wide_sprite.loadGraphic(wide_atk_sprite, true, false, 48, 16); + wide_sprite.addAnimation("tall", [0, 1, 2, 6], 12, false);// Faces right, from the long spritesheet + wide_sprite.addAnimation("wide", [0, 1, 2, 6], 12, false);//faces down, from the wide spritesheet + wide_sprite.play("wide"); + + parent.otherObjects.push(long_sprite); + parent.otherObjects.push(wide_sprite); + + health=3; + + /* Add slasher's animations */ + /* Spritesheet horizontal facing is RIGHT */ + loadGraphic(slasher_sprite, true, false, 24, 24); + addAnimation("float_d", [0, 1], 3); + addAnimation("float_l", [2, 3], 3); + addAnimation("float_r", [2, 3], 3); + addAnimation("float_u", [4, 5], 3); + addAnimation("warning_d", [6,6], 10,false);//Duplicate the last frame + addAnimation("warning_l", [7,7], 10,false); + addAnimation("warning_r", [7,7], 10,false); + addAnimation("warning_u", [8,8], 10,false); + addAnimation("attack_d", [9,9], 10,false); + addAnimation("attack_l", [10,10], 10,false); + addAnimation("attack_r", [10,10], 10,false); + addAnimation("attack_u", [11,11], 10, false); + addAnimation("die", [9, 10, 11,11], 3, false); + play("float_d"); + addAnimationCallback(on_anim_change); + width=height=16; + centerOffsets(true); + + + if(xml.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + exists=false; + } + + add_sfx("attack", Registry.sound_data.slasher_atk); + + } + + override public function preUpdate():Void + { + FlxG.collide(this, parent.curMapBuf); + super.preUpdate(); + } + + override public function update():Void + { + + if(touching !=NONE){ + velocity.x=velocity.y=0; + } + if(initial_latency>0){ + initial_latency -=FlxG.elapsed; + return; + } + if(Registry.is_playstate){ + if(parent.state !=parent.S_TRANSITION){ + EventScripts.prevent_leaving_map(parent, this); + } + } + /* Chceck if dead */ + if(xml.@alive=="false"){ + // When the death anim finishes, blow up + //if(_curAnim.frames.length - 1==_curFrame){ + /* Always immediately blow up unless we do make a death anim*/ + if(1){ + visible=false; + if(!INCREMENTED_REG){ + EventScripts.drop_big_health(x, y, 1); + INCREMENTED_REG=true; + Registry.GRID_ENEMIES_DEAD++; + EventScripts.make_explosion_and_sound(this); + } + wide_sprite.visible=long_sprite.visible=false; + } + return; + } + if(state==S_MOVE){ + movement(); + } else { + if(!started_attack_anim){ + started_attack_anim=true; + switch(_curAnim.name){ + case "warning_r": + play("attack_r"); + break; + case "warning_l": + play("attack_l"); + break; + case "warning_d": + play("attack_d"); + break; + case "warning_u": + play("attack_u"); + break; + } + /* Some frame in the attack animation trigger sthe appearance of the slash attack */ + } else if(_curFrame>=activate_attack_frame){ + velocity.x=velocity.y=0; + attack();//Decrement the attack timers until state change + } + } + collisions(); + check_for_death(); + super.update(); + } + + private function check_for_death():Void { + if(health<=0){ + xml.@alive="false"; + play("die"); + } + } + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="float_r" || name=="warning_r" || name=="attack_r"){ + scale.x=-1; + } else { + scale.x=1; + } + } + + private var t_move:Float=0; + public function movement():Void { + t_move +=FlxG.elapsed; + if(t_move>0.25){ + t_move=0; + EventScripts.scale_vector(this, player, velocity, 20); + } + //EventScripts.send_property_to(this, "x", player.x + 8, 0.3); + //EventScripts.send_property_to(this, "y", player.y + 8, 0.3); + var dx:Int=(player.x + 8)-(x + SPRITE_WIDTH/2); + var dy:Int=(player.y + 8)-(y + SPRITE_WIDTH / 2); + + if(!played_warning){ + facing=EventScripts.get_entity_to_entity_dir(x + SPRITE_WIDTH / 2, y + SPRITE_WIDTH / 2, player.x + 8, player.y + 8); + switch(facing){ + case UP: + play("float_u"); + break; + case RIGHT: + play("float_r"); + break; + case LEFT: + play("float_l"); + break; + case DOWN: + play("float_d"); + break; + } + } + + move_timer -=FlxG.elapsed; + if(move_timer<0){ + if(!played_warning){ + switch(_curAnim.name){ + case "float_r": + play("warning_r"); + break; + case "float_d": + play("warning_d"); + break; + case "float_u": + play("warning_u"); + break; + case "float_l": + play("warning_l"); + break; + } + played_warning=true; + } + t_warning +=FlxG.elapsed; + if(t_warning>tm_warning){ + played_warning=false; + t_warning=0; + move_timer=move_timer_max; + if(Math.sqrt(dx * dx + dy * dy)WIDE_ATK_DISTANCE + 3){ //can get a good attack range here + // state=S_MOVE; + //wide_sprite.visible=false; + //anim of enemy + + + } + private function collisions():Void { + + if(long_sprite.visible){ + if(harmful_long_atk_frames.indexOf(long_sprite._curIndex)!=-1){ + if(long_sprite.overlaps(player))player.touchDamage(1); + } + } + if(wide_sprite.visible){ + if(harmful_wide_atk_frames.indexOf(wide_sprite._curIndex)!=-1){ + if(wide_sprite.overlaps(player)&& player.state==player.S_GROUND)player.touchDamage(1); + } + } + /*if(player.overlaps(this)){ + player.touchDamage(1); + }*/ + if(player.broom.visible){ + if(player.broom.overlaps(this)){ + if(!flickering){ + flicker(1); + health--; + play_sfx(HURT_SOUND_NAME); + + } + } + } + } + + /* update timers - long transitions back to move, wide can continue + * to transition to wide */ + public function attack():Void { + if(state==S_ATK_LONG){ + LONG_ATK_TIMEOUT -=FlxG.elapsed; + if(LONG_ATK_TIMEOUT<0){ + state=S_MOVE; + started_attack_anim=false; + LONG_ATK_TIMEOUT=LONG_ATK_TIMEOUT_MAX; + long_sprite.visible=false; + return; + } + } else { + /** This is a huge mess, the logic has been commented + * to act like the long attack, so it piggy backs on the + * code that does warning and attack */ + if(state==S_ATK_WIDE_DELAY){ + WIDE_ATK_DELAY -=FlxG.elapsed; + if(WIDE_ATK_DELAY<0){ + WIDE_ATK_DELAY=WIDE_ATK_DELAY_MAX; + // state=S_ATK_WIDE; + state=S_MOVE; + started_attack_anim=false; + wide_sprite.visible=false; + move_timer=move_timer_max / 2; + //wide_sprite.visible=true; + //update_wide_pos(); + //sfx + //anim + } + } else { + + WIDE_ATK_TIMER -=FlxG.elapsed; + if(WIDE_ATK_TIMER<0){ + WIDE_ATK_TIMER=WIDE_ATK_TIMER_MAX; + state=S_ATK_WIDE_DELAY; + wide_sprite.visible=false; + return; + } + + } + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/suburb/Suburb_Killer.hx b/intra/source/entity/enemy/suburb/Suburb_Killer.hx new file mode 100644 index 0000000..fb570ca --- /dev/null +++ b/intra/source/entity/enemy/suburb/Suburb_Killer.hx @@ -0,0 +1,81 @@ +package entity.enemy.suburb +{ +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +class Suburb_Killer extends AnoSprite +{ + + private static inline var s_idle:Int=0; + private static inline var s_move:Int=1; + + private var t_flip_vel:Float=0; + private static inline var tm_flip_vel:Float=0.5; + + + //[Embed(source="../../../res/sprites/npcs/suburb_killers.png")] public static inline var embed_suburb_killer:Class; + public function new(args:Array) + { + super(args); + + loadGraphic(embed_suburb_killer, true, false, 16, 16); + + var off:Int=Math.random()* 6; + off *=9; + addAnimation("idle_d", [off+0], 1); + addAnimation("idle_r", [off+2], 1); + addAnimation("idle_u", [off+4], 1); + addAnimation("idle_l", [off+6], 1); + + addAnimation("walk_d", [off,off+1], 4); + addAnimation("walk_r", [off+2,off+3], 4); + addAnimation("walk_u", [off+4, off+5], 4); + addAnimation("walk_l", [off+6, off+7], 4); + + play("idle_d"); + + width=height=6; + offset.x=offset.y=5; + x +=5; + y +=5; + } + + override public function preUpdate():Void + { + if(state==s_move){ + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + + override public function update():Void + { + + switch(state){ + + case s_idle: + EventScripts.face_and_play(this, player, "idle"); + if(EventScripts.distance(player, this)<36){ + state=s_move; + } + break; + case s_move: + EventScripts.face_and_play(this, player, "walk"); + + t_flip_vel +=FlxG.elapsed; + if(t_flip_vel>tm_flip_vel){ + t_flip_vel=0; + EventScripts.scale_vector(this, player, velocity, 30); + } + + if(player.overlaps(this)){ + player.touchDamage(6); + } + + break; + + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/enemy/suburb/Suburb_Walker.hx b/intra/source/entity/enemy/suburb/Suburb_Walker.hx new file mode 100644 index 0000000..56c6feb --- /dev/null +++ b/intra/source/entity/enemy/suburb/Suburb_Walker.hx @@ -0,0 +1,301 @@ +package entity.enemy.suburb +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + + +class Suburb_Walker extends AnoSprite +{ + //[Embed(source="../../../res/sprites/enemies/suburb/suburb_walker.png")] public static var embed_suburb_walker:Class; + //[Embed(source="../../../res/sprites/npcs/suburb_walkers.png")] public static var embed_suburb_folk:Class; + //[Embed(source="../../../res/sprites/npcs/suburb_killers.png")] public static var embed_suburb_killer:Class; + + + private var s_alive:Int=0; + private var s_dead:Int=1; + + private var t_walk:Float=0; + private var tm_walk:Float=1.0; + private var walk_vel:Int=20; + + public var active_region:FlxObject; + + private var dialogue_choices:Int; + private var blood:FlxSprite; + private var dialogue_scene_name:String; + private var ropes:FlxGroup; + + private var is_talker:Bool=false; + private var talker_nr:Int=1; + public function new(args:Array) + { + super(args); + + // MARINA_ANIMS + // will add gender sprite later + loadGraphic(embed_suburb_folk, true, false, 16, 16); + var off:Int=parseInt(xml.@frame); + var w:Int=9; + off *=w; + state=s_alive; + immovable=true; + tm_walk=1.0 + Math.random(); + + active_region=new FlxObject(0, 0, 22, 22); + + if(xml.@alive=="false"){ + play("dead"); + state=s_dead; + + + Registry.subgroup_interactives.push(this); + } + + blood=new FlxSprite; + blood.loadGraphic(embed_suburb_folk, true, false, 16, 16); + blood.addAnimation("a", [63,64,65,66], 3, false); + blood.visible=false; + + if(state==s_dead){ + blood.x=x - 3 + 6 * Math.random(); + blood.y=y - 3 + 6 * Math.random(); + blood.play("a"); + blood.visible=true; + } + + parent.bg_sprites.add(blood); + + gx=Registry.CURRENT_GRID_X; + gy=Registry.CURRENT_GRID_Y; + if(parseInt(xml.@frame)==12){ + Registry.subgroup_interactives.push(this); + is_talker=true; + talker_nr=1; + var first_anim:String="walk_d"; + if(gx==1 && gy==5){ // Paranoid Guy(74) + off=0; + } else if(gx==3 && gy==5){ // Younger kid in family house + off=4 * w; + } else if(gx==4 && gy==5){ // Older kid in family house + off=2 * w; + } else if(gx==0 && gy==7){ // dead mom + off=w; + first_anim="dead"; + } else if(gx==1 && gy==7){ // dead dad + off=0; + first_anim="dead"; + } else if(gx==1 && gy==6){ // Hanged guy + // Do weird stuff with the rope + ropes=new FlxGroup(3); + for(r in 0...3){ + var rope:FlxSprite=new FlxSprite(x, y - 16 *(r + 1)); + rope.loadGraphic(embed_suburb_folk, true, false, 16, 16); + rope.frame=55; + ropes.add(rope); + } + parent.fg_sprites.add(ropes); + addAnimation("hang", [54], 2); + off=0; + first_anim="hang"; + } else if(gx==0 && gy==6){ // festive person + off=0; + frame=4; + } + add_the_anims(off,false); + play(first_anim); + } else if(parseInt(xml.@frame)==14){ + Registry.subgroup_interactives.push(this); + is_talker=true; + talker_nr=2; + if(gx==3 && gy==5){ // prarent in family house + frame=4; + off=w; + add_the_anims(off,false); + play("walk_d"); + } + } else { + add_the_anims(off); + play("walk_d"); + } + + if(state==s_dead){ + play("dead"); + } + + + if(off/w<2){ + dialogue_scene_name=DH.scene_suburb_walker_words_adult; + } else if(off / w<4){ + dialogue_scene_name=DH.scene_suburb_walker_words_teen; + } else { + dialogue_scene_name=DH.scene_suburb_walker_words_kid; + } + dialogue_choices=DH.get_scene_length(DH.name_suburb_walker, dialogue_scene_name); + + + } + override public function preUpdate():Void + { + if(state !=s_dead){ + FlxG.collide(player, this); + immovable=false; + FlxG.collide(parent.curMapBuf, this); + immovable=true; + } + super.preUpdate(); + } + override public function update():Void + { + active_region.x=x - 3; + active_region.y=y - 3; + + if(is_talker){ + update_talker(); + super.update(); + return; + } + if(state==s_alive){ + if(player.broom.visible && player.broom.overlaps(this)){ + play("die"); + Registry.sound_data.broom_hit.play(); + Registry.Event_Nr_Suburb_Killed++; + state=s_dead; + Registry.sound_data.fall_in_hole.play(); + velocity.x=velocity.y=0; + xml.@alive="false"; + Registry.subgroup_interactives.push(this); + return; + } + + t_walk +=FlxG.elapsed; + + if(x + width>tl.x + 155 || xtl.y + 155 || ytl.x + 155)x=tl.x + 155 - width; + if(xtl.y + 155)y=tl.y + 155 - height; + if(ytm_walk){ + t_walk=0; + if(facing & DOWN){ + play("walk_r"); + } else if(facing & RIGHT){ + play("walk_u"); + } else if(facing & LEFT){ + play("walk_d"); + } else { + play("walk_l"); + } + + } + if(touching && player.touching==NONE){ + t_walk=tm_walk + 1; + } + } else if(state==s_dead){ + velocity.x=velocity.y=0; + if(blood.frame==66 && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + DH.start_dialogue(DH.name_suburb_walker, dialogue_scene_name, "", Std.int(Math.random()* dialogue_choices)); + player.be_idle(); + + } + if(finished){ + if(_curAnim.name=="die" && _curAnim.frames.length - 1==_curFrame){ + Registry.sound_data.player_hit_1.play(); + play("dead"); + blood.x=x - 3 + 6 * Math.random(); + blood.y=y - 3 + 6 * Math.random(); + blood.play("a"); + blood.visible=true; + } + } + } + super.update(); + } + + private var talker_state:Int=0; + private function update_talker():Void { + if(talker_state==0){ + if(DH.a_chunk_is_playing()==false){ + talker_state=1; + } + } else if(talker_state==1){ + if(player.state==player.S_GROUND && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + talker_state=0; + + if(talker_nr==2){ + if(gx==3 && gy==5){ // Mom in family + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_family, "", 0); + } + } else if(talker_nr==1){ + if(gx==1 && gy==5){ // Paranoid Guy(74) + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_paranoid); + } else if(gx==3 && gy==5){ // Younger kid in family house 73 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_family, "", 1); + } else if(gx==4 && gy==5){ // Older kid in family house 73 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_older_kid); + } else if(gx==0 && gy==7){ // dead mom 76 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_dead, "", 0); + } else if(gx==1 && gy==7){ // dead dad 76 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_dead, "", 1); + } else if(gx==1 && gy==6){ // Hanged guy 78 + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_hanged); + } else if(gx==0 && gy==6){ // festive person 75 + EventScripts.face_and_play(this, player, "walk"); + DH.start_dialogue(DH.name_suburb_walker, DH.scene_suburb_walker_festive); + } + } + player.be_idle(); + + } + } + } + private function on_anim_change(name:String, frame:Int, index:Int):Void { + velocity.x=velocity.y=0; + if(name=="walk_d"){ + facing=DOWN; + velocity.y=walk_vel; + } else if(name=="walk_u"){ + facing=UP; + velocity.y=-walk_vel; + } else if(name=="walk_r"){ + facing=RIGHT; + velocity.x=walk_vel; + } else if(name=="walk_l"){ + facing=LEFT; + velocity.x=-walk_vel; + } + + } + + private function add_the_anims(off:Int,doeswalk:Bool=true):Void + { + addAnimation("walk_d", [0 + off, 1 + off], 4); + addAnimation("walk_r", [2 + off, 3 + off], 4); + addAnimation("walk_u", [4 + off, 5 + off], 4); + addAnimation("walk_l", [6 + off, 7 + off], 4); + addAnimation("die", [0+off,2+off,4+off,6+off,0+off,2+off,4+off,6+off,8+off], 8,false); + addAnimation("dead", [8 + off]); + if(true==doeswalk){ + addAnimationCallback(on_anim_change); + } + } + + override public function destroy():Void + { + active_region.destroy(); + active_region=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Big_Door.hx b/intra/source/entity/gadget/Big_Door.hx new file mode 100644 index 0000000..b46a700 --- /dev/null +++ b/intra/source/entity/gadget/Big_Door.hx @@ -0,0 +1,297 @@ +package entity.gadget; + +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; + +/** + * a big door. either alive or not alive. + * if alive, approaching this without enough growths has a bunch of outlines + * of squares pop-up, with as many filled in as you have. The squares then fade out. + * otherwise approaching with enough leads to the square sprites coming from + * the character, circling around him, eventually leaving trails of blurred sprites, which + * 'attack' the door, make it glow, then fizzle away. sets a global event. + * if not alive, the doorway is 'open', so the actual Door entity will be alive + * @author Seagaia + */ + +class Big_Door extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.BIG_DOOR; + //[Embed(source="../../res/sprites/gadgets/big_door.png")] public static var big_door_sprite:Class; + public var active_region:FlxSprite; + public var player:Player; + public var state:Int=0; + public var s_normal:Int=0; + public var s_opening:Int=1; + + public var s_locked_anim:Int=2; + public var s_locked_fade:Int=3; + public var s_wait_to_not_overlap:Int=4; + + public var s_open_anim:Int=6; + public var s_open_anim_ctr:Int=0; + public var center_sprite:FlxSprite=new FlxSprite(80, 80); + public var init_open_radius:Float=45; + + + public var s_open:Int=5; + public var timer:Float=0.06; + public var timer_max:Float=0.06; + + public var s_locked_ctr:Int=0; + public var locked_squares:FlxGroup=new FlxGroup(36); + + public var score_text_1:FlxBitmapFont; + public var score_text_2:FlxBitmapFont; + public var white_flash:FlxSprite=new FlxSprite(0, 0); + + /* Based on frame, which Big door */ + public static var bd_nexus1:Int=0; + /* + * dame params:frame is which door this corresponds to + **/ + public function new(_xml:XML,_player:Player):Void { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(big_door_sprite, true, false, 32, 32); + active_region=new FlxSprite(x + width / 2 - 1, y + height + 2 + Registry.HEADER_HEIGHT);; + active_region.makeGraphic(2, 2, 0xffff0000); + player=_player; + immovable=true; + init_squares(); + center_sprite.makeGraphic(1, 1); + center_sprite.scrollFactor=new FlxPoint(0, 0); + + score_text_1=EventScripts.init_bitmap_font(); + score_text_2=EventScripts.init_bitmap_font(); + score_text_2.scrollFactor=score_text_1.scrollFactor=new FlxPoint(0, 0); + score_text_1.y=30; + score_text_2.y=50; + white_flash.makeGraphic(160, 160, 0xffffffff);white_flash.alpha=0; + white_flash.y +=Registry.HEADER_HEIGHT; + white_flash.scrollFactor=new FlxPoint(0, 0); + + if(Registry.Big_Door_State[parseInt(xml.@frame)])exists=false; + + } + + private var hoooooops:Bool=false; + override public function update():Void + { + FlxG.collide(player, this); + + /* If the player overlaps the active region set off the event to open door. */ + if(state==s_normal){ + if(player.overlaps(active_region)){ + //if(false==hoooooops && Registry.nr_growths>=Registry.Big_Door_Reqs[parseInt(xml.@frame)]){ + if(true==hoooooops){ + state=s_open_anim; + hoooooops=false; + + } else { + hoooooops=true; + state=s_locked_anim; + /* Set the "0.x" text".. */ + score_text_1.setText(Registry.nr_growths.toString()+"\n---", true, 0, 0, "center", true); + score_text_2.setText(Registry.Big_Door_Reqs[parseInt(xml.@frame)].toString(), true, 0, 0, "center", true); + score_text_1.x=-20; + score_text_2.x=Registry.SCREEN_WIDTH_IN_PIXELS + 20; + Registry.sound_data.big_door_locked.play(); + } + } + } else if(state==s_opening){ + alpha -=0.01; + if(alpha<0.01){ + state=s_open; + exists=false; + Registry.Big_Door_State[parseInt(xml.@frame)]=true; + } + } else if(state==s_open){ + + /* FADE IN FOR LOCKED DOOR */ + } else if(state==s_locked_anim){ + timer -=FlxG.elapsed; + if(timer<0 && s_locked_ctr=1){ + locked_squares.members[i].scale.x -=0.04; + locked_squares.members[i].scale.y -=0.04; + } + } + + var text_move_ctr:Int=0; + if(EventScripts.send_property_to(score_text_1, "x", Registry.SCREEN_WIDTH_IN_PIXELS / 2 - 8, 4))text_move_ctr++; + if(EventScripts.send_property_to(score_text_2, "x", Registry.SCREEN_WIDTH_IN_PIXELS / 2, 4 ))text_move_ctr++; + + if(text_move_ctr==2 && locked_squares.members[locked_squares.maxSize - 1].alpha>=1){ + + white_flash.alpha +=0.05; + if(white_flash.alpha==1)text_move_ctr++; + if(text_move_ctr==3){ + state=s_locked_fade; + s_locked_ctr=0; + } + } + /* FADE OUT FOR LOCKED DOOR */ + } else if(state==s_locked_fade){ + timer -=FlxG.elapsed; + if(timer<0 && s_locked_ctr0.02){ + locked_squares.members[j].scale.x -=0.01; + locked_squares.members[j].scale.y -=0.01; + } + locked_squares.members[j].alpha -=0.03; + + } + + white_flash.alpha -=0.05; + EventScripts.send_property_to(score_text_1, "x", Registry.SCREEN_WIDTH_IN_PIXELS + 20, 3); + EventScripts.send_property_to(score_text_2, "x", -20, 3 ); + score_text_1.alpha -=0.02; + score_text_2.alpha -=0.02; + + if((score_text_1.alpha==0 && score_text_2.alpha==0)&& locked_squares.members[locked_squares.maxSize - 1].alpha==0){ + locked_squares.setAll("angularVelocity", 0); + locked_squares.setAll("angle", 0); + locked_squares.setAll("alpha", 0); + for(i=0;i0.8)s_open_anim_ctr++; + } + + } + } else if(s_open_anim_ctr==2){ // move squares to center and outwars + for(i=0;i0)s_open_anim_ctr++; + } else if(s_open_anim_ctr==4){ //flash in, rearrange squares + white_flash.alpha +=0.04; + if(white_flash.alpha>0.99){ + s_open_anim_ctr++; + for(square in locked_squares.members){ + square.scale.y=square.scale.x=0.5 + 2 * Math.random(); + square.x +=(-80 + 160 * Math.random()); + square.y +=(-80 + 160 * Math.random()); + square.angularVelocity=400 - 800 * Math.random(); + } + + } + } else if(s_open_anim_ctr==5){ // flash out + white_flash.alpha -=0.01; + if(white_flash.alpha<0.01){ + s_open_anim_ctr++; + } + } else { // move squares inwards + var ctr_ctr:Int=0; + var nr_done:Int=0; + white_flash.alpha -=0.1; + for(square in locked_squares.members){ + if(square.alpha==0){ + nr_done++; + if(nr_done==locked_squares.maxSize){ + s_open_anim_ctr++; + state=s_opening; + white_flash.alpha=0; + player.dontMove=false; + break; + } + continue; + } + if(EventScripts.send_property_to(square, "x", getScreenXY().x + width / 2, 1))ctr_ctr++; + if(EventScripts.send_property_to(square, "y", getScreenXY().y, 1))ctr_ctr++; + if(ctr_ctr==2){ + square.alpha=0; + } + ctr_ctr=0; + } + } + } + + + /* The event will freeze controls, and then show the squares in a grid if not enough, + * or play the animation if there are enough. */ + + super.update(); + } + + private function init_squares():Void { + for(i in 0...locked_squares.maxSize){ + var s:FlxSprite=new FlxSprite(10 + 24 *(i % 6), 20 + 24 * Std.int(i / 6)); + + if(i=new Array(CLASS_ID.PLAYER, CLASS_ID.SINGLEPUSHBLOCK, CLASS_ID.SILVERFISH, CLASS_ID.SHIELDY, CLASS_ID.MOVER,CLASS_ID.RAT,CLASS_ID.MITRA); + + public function new(x:Int,y:Int,_xml:XML,_parent:Dynamic) + { + super(x, y); + xml=_xml; + immovable=true; + solid=false; + type=parseInt(_xml.@frame); + loadGraphic(S_BUTTON, true, false, 16, 16); + + if(Registry.CURRENT_MAP_NAME=="STREET"){ + UP_FRAME=6; + DOWN_FRAME=7; + } else if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + UP_FRAME=0; + DOWN_FRAME=1; + } else if(Registry.CURRENT_MAP_NAME=="REDCAVE"){ + UP_FRAME=4; + DOWN_FRAME=5; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + UP_FRAME=8; + DOWN_FRAME=9; + }else { + UP_FRAME=2; + DOWN_FRAME=3; + } + parent=_parent; + frame=UP_FRAME; + } + + + override public function update():Void { + + + if(overlaps(parent.player)&& parent.player.state !=parent.player.S_AIR){ + overlap_callback(parent.player, this); + } + for(var o:Dynamic in parent.sortables.members){ + if(o !=null && o is FlxSprite){ + if(overlaps(o)){ + overlap_callback(o, this); + } + } + } + + + + if(type==TYPE_PERMANENT)return; + + if(INCREMENTED_REGISTRY && !pressed){ + Registry.sound_data.button_up.play(); + if(Registry.GRID_PUZZLES_DONE>0) + Registry.GRID_PUZZLES_DONE --; + INCREMENTED_REGISTRY=false; + frame=UP_FRAME; + } + pressed=false; + super.update(); + } + + + public function overlap_callback(s:Dynamic, x:Dynamic):Void { + if(Std.is(s, FlxGroup)){ + s=s.draw_root; + if(s==null)return; + } + if(s.exists && s.hasOwnProperty("cid")&& overlappable_cids.indexOf(s.cid)!=-1){ + pressed=true; + + if(!INCREMENTED_REGISTRY){ + Registry.sound_data.button_down.play(); + frame=DOWN_FRAME; + Registry.GRID_PUZZLES_DONE++; + INCREMENTED_REGISTRY=true; + } + } + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Challenge_Gate.hx b/intra/source/entity/gadget/Challenge_Gate.hx new file mode 100644 index 0000000..12dfcec --- /dev/null +++ b/intra/source/entity/gadget/Challenge_Gate.hx @@ -0,0 +1,58 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxSprite; + +/** + * Gate that only opens when you have enough energy + * DAME PARAMS: + * p:2 + * alive:t/f, whether it should spawn + */ +class Challenge_Gate extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/challenge_gate.png")] public static var sprite_challenge_gate:Class; + + public var cid:Int=CLASS_ID.CHALLENGE_GATE; + public var xml:XML; + public var active_region:FlxSprite; + + public function new(_xml:XML) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + loadGraphic(sprite_challenge_gate, true, false, 16, 16); + addAnimation('disappear', [0, 1, 2, 3,4], 4, false); + immovable=true; + frame=0; + active_region=new FlxSprite(x, y + height); + active_region.makeGraphic(width, 4, 0xff00ffff); + + if(xml.@alive=="false"){ + visible=false; + } + } + + override public function update():Void + { + + if(frame==4){ + xml.@alive="false"; + } + super.update(); + } + + public function check_open(p:Player):Void { + + if(p.overlaps(active_region)){ + if(xml.@alive=="false")return; + if(p.health_bar.cur_health==p.health_bar.max_health && frame==0){ //change for energy + play('disappear'); + } + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Checkpoint.hx b/intra/source/entity/gadget/Checkpoint.hx new file mode 100644 index 0000000..84cca86 --- /dev/null +++ b/intra/source/entity/gadget/Checkpoint.hx @@ -0,0 +1,290 @@ +package entity.gadget +{ +import entity.player.Player; +import global.Keys; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; + +class Checkpoint extends FlxSprite +{ + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + private var did_init:Bool=false; + + private var state:Int; + private var s_inactive:Int=0; + private var s_stepped_on:Int=1; + private var s_active:Int=2; + private var s_dialog:Int=3; + private var did_save:Bool=false; + private var did_autosave:Bool=false; + private var t_save:Float=0; + private var tm_save:Float=0.1; + private var saved_coords:Bool=false; + + private var save_dialog_bg:FlxSprite; + private var save_dialog_text:FlxBitmapFont; + private var save_dialog_selector:FlxSprite; + private var ctr:Int=0; + + private var autosave_anim_ctr:Int=0; + private var autosave_started:Bool=false; + private var autosave_loop:Bool=true; + + + private var player_hasnt_stepped_off:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/checkpoint.png")] public static var checkpoint_sprite:Class; + //[Embed(source="../../res/sprites/inventory/checkpoint_save_box.png")] public static var checkpoint_save_box_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + loadGraphic(checkpoint_sprite, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("inactive", [4]); + addAnimation("stepped_on", [5,6],12); + addAnimation("active", [5,6,7], 10, false); + } else { + addAnimation("inactive", [0]); + addAnimation("stepped_on", [1, 2],12); + addAnimation("active", [1, 2, 3], 10, false); + } + + width=height=8; + offset.x=offset.y=4; + x +=4; + y +=4; + + save_dialog_bg=new FlxSprite; + save_dialog_bg.loadGraphic(checkpoint_save_box_sprite, true, false, 80, 29); + save_dialog_bg.x=(160 - save_dialog_bg.width)/ 2; + save_dialog_bg.y=20 +(160 - save_dialog_bg.height)/ 2; + save_dialog_bg.scrollFactor=new FlxPoint(0, 0); + //save_dialog_text=EventScripts.init_bitmap_font("Save game?\n Yes\n No", "left", save_dialog_bg.x + 5, save_dialog_bg.y + 2, null, "apple_white"); + save_dialog_text=EventScripts.init_bitmap_font(DH.lk("checkpoint",0), "left", save_dialog_bg.x + 5, save_dialog_bg.y + 2, null, "apple_white"); + save_dialog_text.color=0xffffff; + save_dialog_text.drop_shadow=true; + save_dialog_selector=new FlxSprite; + save_dialog_selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + save_dialog_selector.scrollFactor=new FlxPoint(0, 0); + save_dialog_selector.addAnimation("flash", [0, 1], 8); + save_dialog_selector.play("flash"); + save_dialog_selector.scale.x=-1; + + parent.fg_sprites.add(save_dialog_bg); + parent.fg_sprites.add(save_dialog_text); + parent.fg_sprites.add(save_dialog_selector); + save_dialog_bg.visible=save_dialog_text.visible=save_dialog_selector.visible=false; + + } + + override public function update():Void + { + oscillate_autosave(); + if(!did_init){ + did_init=true; + + if(player.overlaps(this)){ + player_hasnt_stepped_off=true; + } + + if(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y){ + play("active"); + state=s_active; + } else { + state=s_inactive; + play("inactive"); + } + } + + if(player_hasnt_stepped_off){ + super.update(); + if(!player.overlaps(this)){ + player_hasnt_stepped_off=false; + } + return; + } + + // Info popup + if(!Registry.GE_States[Registry.GE_Did_A_Checkpoint]){ + if(!Intra.is_test && EventScripts.distance(this,player)<18){ + Registry.GE_States[Registry.GE_Did_A_Checkpoint]=true; + player.be_idle(); + + //DH.dialogue_popup("While standing on a checkpoint, press " + Registry.controls[Keys.IDX_ACTION_1] + " to save your progress and set it as your respawn point if you die."); + DH.dialogue_popup(DH.lk("checkpoint",1)+" " + Registry.controls[Keys.IDX_ACTION_1] + " "+DH.lk("checkpoint",2)); + } + } + + // Do autosave if close or in same room + //if(!did_autosave){ + //if(Registry.autosave_on){ + //if(Registry.is_playstate ||(Math.abs(x - player.x)<48 && Math.abs(y - player.y)<48)){ + //did_autosave=true; + //autosave_started=true; + // Make save icon appear + //Save.save(); + //} + //} + //} + // Behavior the same otherwise + switch(state){ + case s_inactive: + if(player.overlaps(this)&& player.state==player.S_GROUND){ + play("stepped_on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_stepped_on; + } + break; + case s_stepped_on: + // Require player input to set checkpint. + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.button_down.play(); + // If this checkpoint is activated and it is not ou current one, + // then refill the health of the palyer + if(!(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y)){ + player.health_bar.modify_health(20); + } + update_global_checkpoint(); + + // Ask the player if they want to save if autosave is not on. + if(!Registry.autosave_on){ + state=s_dialog; + player.state=player.S_INTERACT; + player.be_idle() + save_dialog_bg.visible=save_dialog_selector.visible=save_dialog_text.visible=true; + save_dialog_selector.x=save_dialog_text.x + 4; + save_dialog_selector.y=save_dialog_text.y + 8; + } else { + + if(Registry.is_playstate ||(Math.abs(x - player.x)<48 && Math.abs(y - player.y)<48)){ + did_autosave=true; + autosave_started=true; + // Make save icon appear + Save.save(); + } + + did_save=true; + state=s_active; + play("active"); + } + } else { + if(!player.overlaps(this)){ + state=s_inactive; + play("inactive"); + + if(Registry.checkpoint.area==Registry.CURRENT_MAP_NAME && Registry.checkpoint.x==x && Registry.checkpoint.y==y){ + play("active"); + } + } + } + + break; + case s_active: + if(!did_save){ + if(player.overlaps(this)){ + play("stepped_on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_stepped_on; + } + } else { // Timeout, lets you save again if you want to + if(!player.overlaps(this)){ + t_save +=FlxG.elapsed; + if(t_save>tm_save){ + t_save=0; + did_save=false; + } + } + } + break; + case s_dialog: + player.invincible=true; + player.invincible_timer=0.1; + + if(ctr==0){ + if(Registry.keywatch.JP_DOWN){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + ctr++; + save_dialog_selector.y +=8; + } + } else { + if(Registry.keywatch.JP_UP){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + ctr--; + save_dialog_selector.y -=8; + } + } + + if(Registry.keywatch.JP_ACTION_1){ + if(ctr==0){ + Save.save(); + autosave_started=true; + } + + save_dialog_bg.visible=save_dialog_selector.visible=save_dialog_text.visible=false; + ctr=0; + player.state=player.S_GROUND; + state=s_active; + did_save=true; + play("active"); + } + //something something dialog + break; + } + super.update(); + } + + private function update_global_checkpoint():Void + { + if(saved_coords)return; + saved_coords=true; + Registry.checkpoint.area=Registry.CURRENT_MAP_NAME; + Registry.checkpoint.x=x; + Registry.checkpoint.y=y; + trace("Check point updated:",Registry.checkpoint.area, Registry.checkpoint.x, Registry.checkpoint.y); + } + + private function oscillate_autosave():Void { + + if(autosave_started){ + switch(autosave_anim_ctr){ + case 0: + parent.autosave_icon.visible=true; + parent.autosave_icon.alpha=1; + autosave_anim_ctr++; + break; + case 1: + parent.autosave_icon.alpha -=(FlxG.elapsed / 3); + if(parent.autosave_icon.alpha<0.03){ + parent.autosave_icon.visible=false; + autosave_started=false; + autosave_anim_ctr=0; + } + break; + } + } + } + + override public function destroy():Void + { + + super.destroy(); + save_dialog_bg=save_dialog_selector=null; + save_dialog_text=null; + if(parent.autosave_icon !=null){ + parent.autosave_icon.visible=false; + } + + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Console.hx b/intra/source/entity/gadget/Console.hx new file mode 100644 index 0000000..d0166de --- /dev/null +++ b/intra/source/entity/gadget/Console.hx @@ -0,0 +1,278 @@ +package entity.gadget +{ +import data.CLASS_ID; +import data.SoundData; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; +import states.PlayState; + +/** + * ... + * @author Seagaia + */ +class Console extends FlxSprite +{ + + public var xml:XML; + public var cid:Int=CLASS_ID.CONSOLE; + public var active_region:FlxSprite; + public var is_active:Bool=true; + public var INCREMENTED_REGISTRY:Bool=false; + public var did_init:Bool=false; + public var do_sound_test:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/console.png")] public var sprite_console:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_inside.png")] public static var embed_windmill_inside:Class; + + private var p:Player; + + + public function new(x:Int,y:Int,_xml:XML,_p:Player) + { + super(x, y); + xml=_xml; + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + loadGraphic(embed_windmill_inside, true, false, 48, 48); + addAnimation("active", [0, 1], 5, true); + addAnimation("green", [1], 3, true); + active_region=new FlxSprite(x + 16, y + 16); + active_region.makeGraphic(24, 20, 0x00ffffff); + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("spaz", [0, 1, 2], 20); + play("spaz"); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(16, 4, 0x00ffffff); + } else if(Registry.CURRENT_MAP_NAME=="DEBUG" && Registry.CURRENT_GRID_Y<3){ + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("spaz", [0, 1, 2], 20); + play("spaz"); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(x, y + 16); + do_sound_test=true; + } else { + loadGraphic(sprite_console, true, false, 16, 16); + addAnimation("active", [0, 1], 5, true); + addAnimation("green", [2], 3, true); + active_region=new FlxSprite(x, y + 16); + active_region.makeGraphic(16, 4, 0x00ffffff); + } + play("active"); + immovable=true; + active_region.solid=false; + + p=_p; + xml.@p="2"; + + if(xml.@alive=="false"){ + play("green"); + is_active=false; + } + //visible=false; + + Registry.subgroup_interactives.push(this); + } + + override public function update():Void + { + + if(state==S_SOUND){ + sound_test(); + super.update(); + return; + } + if(!is_active && !INCREMENTED_REGISTRY){ + INCREMENTED_REGISTRY=true; + Registry.GRID_PUZZLES_DONE++; + play("green"); + + } + + if(Registry.CURRENT_MAP_NAME=="WINDMILL" && !did_init){ + did_init=true; + Registry.GAMESTATE.sortables.remove(this, true); + Registry.GAMESTATE.bg_sprites.add(this); + } + if(Registry.CURRENT_MAP_NAME !="WINDMILL"){ + FlxG.collide(this, p); + } + if(p.overlaps(active_region)&& p.facing==UP &&(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2)){ + if(!Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening] && Registry.CURRENT_MAP_NAME=="WINDMILL"){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Windmill_Opening; + is_active=false; + xml.@alive="false"; + Registry.sound_data.get_small_health.play(); + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + DH.start_dialogue(DH.name_rock, DH.scene_rock_five, "NEXUS"); + } else if(do_sound_test){ + state=S_SOUND; + Registry.GAMESTATE.player.be_idle(); + } else { + is_active=false; + xml.@alive="false"; + Registry.sound_data.get_small_health.play(); + + } + + } + + super.update(); + } + private var state:Int=0; + private static inline var S_SOUND:Int=1; + private var soundtest_init:Bool=false; + private var sound_bg:FlxSprite; + private var sound_text:FlxBitmapFont; + private var sound_select_1:FlxSprite; + private var sound_select_2:FlxSprite; + private var snd_ctr:Int=0; + private static inline var snd_text:String="Jukebox!\nMuzak\nSFX"; + private function sound_test():Void { + if(soundtest_init==false){ + + sound_bg=new FlxSprite; + sound_bg.loadGraphic(Checkpoint.checkpoint_save_box_sprite, true, false, 80, 29); + sound_bg.scrollFactor.x=sound_bg.scrollFactor.y=0; + sound_bg.x=(160 - sound_bg.width)/ 2; + sound_bg.y=20 +(160 - sound_bg.height)/ 2; + + sound_text=EventScripts.init_bitmap_font(snd_text, "center", sound_bg.x + 5, sound_bg.y + 3, null, "apple_black"); + sound_select_1=new FlxSprite; + sound_select_1.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + sound_select_1.scrollFactor=new FlxPoint(0, 0); + sound_select_1.addAnimation("flash", [0, 1], 12); + sound_select_1.play("flash"); + sound_select_1.scale.x=-1; + + sound_select_1.x=sound_text.x + 4; + sound_select_1.y=sound_text.y + 8; + + var p:PlayState; + p=Registry.GAMESTATE; + p.fg_sprites.add(sound_bg); + p.fg_sprites.add(sound_text); + p.fg_sprites.add(sound_select_1); + soundtest_init=true; + } + + if(Registry.keywatch.JP_ACTION_2 &&((snd_ctr==1)||(snd_ctr==2))){ + sound_bg.visible=sound_text.visible=sound_select_1.visible=false; + Registry.GAMESTATE.player.state=Registry.GAMESTATE.player.S_GROUND; + state=0; + snd_ctr=0; + return; + } + if(snd_ctr==0){ + sound_bg.visible=sound_text.visible=sound_select_1.visible=true; + Registry.GAMESTATE.player.state=Registry.GAMESTATE.player.S_INTERACT; + snd_ctr=1; + } else if(snd_ctr==1){ + if(Registry.keywatch.JP_DOWN){ + sound_select_1.y +=8; + snd_ctr=2; + } + if(Registry.keywatch.JP_ACTION_1){ + snd_ctr=3; + sound_select_1.visible=false; + sound_text.text="MUSIC\n" + music_idx.toString(); + } + } else if(snd_ctr==2){ + if(Registry.keywatch.JP_UP){ + sound_select_1.y -=8; + snd_ctr=1; + } + if(Registry.keywatch.JP_ACTION_1){ + sound_text.text="SFX\n\n" + snd_idx.toString(); + snd_ctr=4; + sound_select_1.visible=false; + } + } else if(snd_ctr==3){ + do_music(); + } else if(snd_ctr==4){ + do_sfx(); + } + } + + + private static var sfxs:Array; + private var snd_idx:Int=0; + private function do_sfx():Void { + if(sfxs==null){ + var s:SoundData=Registry.sound_data; + sfxs=new Array(s.unlock, s.open, s.fall_in_hole, s.push_block, s.button_up, s.button_down, s.floor_crack, s.get_treasure, s.get_key, s.dash_pad_1, s.dash_pad_2, s.spring_bounce, s.puddle_up, s.puddle_down, s.puddle_step, s.ladder_step, s.sun_guy_death_l, s.sun_guy_death_s, s.sun_guy_scream, s.sun_guy_charge, s.player_jump_down, s.player_jump_up, s.enter_door, s.player_hit_1, s.broom_hit, s.teleport_up, s.teleport_down, s.shieldy_hit, s.shieldy_ineffective, s.red_cave_rise, s.redboss_moan, s.small_wave, s.big_wave, s.redboss_death, s.dog_dash, s.talk_group, s.wb_tap_ground, s.wb_hit_ground, s.wb_shoot, s.wb_moan, s.wb_moan_2, s.talk_death, s.teleguy_up, s.teleguy_down, s.gasguy_shoot, s.gasguy_move, s.rat_move, s.sb_split, s.sb_hurt, s.sb_dash, s.sb_ball_appear, s.sf_move, s.dustmaid_alert, s.elevator_open, s.elevator_close, s.flame_pillar_group, s.fireball_group, s.get_small_health, s.big_door_locked, s.hitground1, s.fall1, s.slasher_atk, s.on_off_laser_shoot, s.dialogue_bloop, s.cicada_chirp, s.briar_shine_group, s.stream_sound, s.dust_explode_group, s.mushroom_sound_group, s.slime_walk_group, s.slime_splash_group, s.slime_shoot_group, s.four_shooter_pop_group, s.four_shooter_shoot_group, s.mover_move_group, s.mover_die_group, s.bubble_group, s.bubble_triple_group, s.laser_pew_group, s.menu_move_group, s.menu_select_group, s.pause_sound_group, s.enemy_explode_1_group, s.swing_broom_group, s.water_step_group, s.dialogue_blip_group, s.sparkle_group, s.dog_bark_group, Dust.dust_sound); + // Init array + } + if(Registry.keywatch.JP_ACTION_2){ + snd_ctr=2; + sound_text.text=snd_text; + sound_select_1.visible=true; + } + + if(Registry.keywatch.JP_RIGHT && snd_idx0){ + snd_idx -=1; + sound_text.text="SFX\n\n" + snd_idx.toString(); + } + + if(Registry.keywatch.JP_ACTION_1){ + if(sfxs[snd_idx]){ + if("FlxSound"==FlxU.getClassName(sfxs[snd_idx], true)){ + sfxs[snd_idx].play(); + } else { + Registry.sound_data.play_sound_group(sfxs[snd_idx]); + } + } + } + } + + private static var musicks:Array; + private var music_idx:Int=0; + + private function do_music():Void { + if(musicks==null){ + musicks=new Array("TITLE", "BLANK", "NEXUS", "STREET", "OVERWORLD", "BEDROOM", "BEDROOMBOSS", "MITRA", "FIELDS", "BEACH", "REDSEA", "FOREST", "CLIFF", "REDCAVE", "REDCAVEBOSS", "CROWD", "CROWDBOSS", "WINDMILL", "SUBURB", "SPACE", "APARTMENT", "APARTMENTBOSS", "ROOF", "HOTEL", "HOTELBOSS", "CELL", "CIRCUS", "CIRCUSBOSS", "PRETERMINAL", "SAGEFIGHT", "TERMINAL", "GO", "HAPPYINIT", "HAPPY", "BLUE", "BRIARFIGHT", "ENDING"); + } + + if(Registry.keywatch.JP_ACTION_2){ + snd_ctr=1; + sound_select_1.visible=true; + sound_text.text=snd_text; + } + + if(Registry.keywatch.JP_RIGHT && music_idx0){ + music_idx--; + sound_text.text="MUSIC\n" + music_idx.toString(); + } + + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.start_song_from_title(musicks[music_idx]); + } + } + + override public function destroy():Void + { + super.destroy(); + } + + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/CrackedTile.hx b/intra/source/entity/gadget/CrackedTile.hx new file mode 100644 index 0000000..04b2971 --- /dev/null +++ b/intra/source/entity/gadget/CrackedTile.hx @@ -0,0 +1,64 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +/** + * ... + * @author Seagaia + */ +class CrackedTile extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/crackedtiles.png")] public var C_CRACKED_TILES:Class; + + public var xml:XML; + public var on:Bool=false; + public var broken:Bool=false; + public var TIMER_DEFAULT:Float=1.0; + public var timer:Float=TIMER_DEFAULT; + public var hole:Hole; + public var type:String="CrackedTile"; + + private var player:Player; + + public var cid:Int=CLASS_ID.CRACKEDTILE; + + public function new(_x:Int, _y:Int, _xml:XML, _player:Player) + { + super(_x, _y); + xml=_xml; + immovable=true; + solid=false; + loadGraphic(C_CRACKED_TILES, false, false, 16, 16); + frame=parseInt(xml.@frame); + if(Registry.CURRENT_MAP_NAME=="BEDROOM")frame=0; + hole=new Hole(x, y, null, _player,frame); + hole.visible=false; + + player=_player; + } + + override public function update():Void { + + if(player.state !=player.S_AIR && player.overlaps(this)){ + on=true; + } + if(broken){ + return; + } + if(on){ + timer -=FlxG.elapsed; + if(timer<0){ + Registry.sound_data.floor_crack.play(); + broken=true; + visible=false; + hole.visible=true; + } + } + on=false; + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Dash_Pad.hx b/intra/source/entity/gadget/Dash_Pad.hx new file mode 100644 index 0000000..c332581 --- /dev/null +++ b/intra/source/entity/gadget/Dash_Pad.hx @@ -0,0 +1,84 @@ +package entity.gadget +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + + +class Dash_Pad extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/dash_pads.png")] public static var dash_pad_sprite:Class; + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var player_tracker:FlxSprite=new FlxSprite(); + + private var type:Int; + + + private var disabled:Bool=false; + private var t_disabled:Float=0; + private var tm_disabled:Float=1.0; + + + + public function new(_xml:XML, _player:Player, _parent:Dynamic) + { + xml=_xml; + parent=_parent; + player=_player; + super(parseInt(xml.@x), parseInt(xml.@y)); + + type=parseInt(xml.@frame); + + loadGraphic(dash_pad_sprite, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="DEBUG" || 1){ + if(type==0){ + frame=4; + type=UP; + } else if(type==2){//down + frame=6; + type=DOWN; + } else if(type==1){//right + frame=5; + type=RIGHT; + } else if(type==3){ + frame=7; + type=LEFT; + } + + + } + + player_tracker.makeGraphic(1, 1, 0x00123123); + + } + + override public function update():Void + { + player_tracker.x=player.midpoint.x; + player_tracker.y=player.midpoint.y; + + if(!disabled &&(player.state==player.S_GROUND)&& player_tracker.overlaps(this)){ + player.SIG_DASH=true; + player.SIG_DASH_TYPE=type; + + alpha=0.5; + disabled=true; + trace("Sending SIG DASH(DURL)", type.toString(16)); + } else { + t_disabled +=FlxG.elapsed; + if(t_disabled>tm_disabled){ + t_disabled=0; + alpha=1; + disabled=false; + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Door.hx b/intra/source/entity/gadget/Door.hx new file mode 100644 index 0000000..14bb2f4 --- /dev/null +++ b/intra/source/entity/gadget/Door.hx @@ -0,0 +1,736 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.interactive.Fisherman; +import entity.player.HealthBar; +import entity.player.Player; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.Parabola_Thing; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import states.PauseState; +import states.PlayState; +import global.Registry; +// Door class - based on "type" input, load +/* the right sprite, whether it's visible, etc,,,whatever the need arises */ +class Door extends FlxSprite + + +{ + +public static inline var INVISIBLE_TYPE:Int=1; +public static inline var NORMAL_TYPE:Int=2; +public static inline var THIN_INVISIBLE_TYPE:Int=3; +public static inline var BLANK_PORTAL_UP_TYPE:Int=4; +public static inline var INVISIBLE_TYPE_UP:Int=5; +public static inline var NO_ENTRANCE_INVIS:Int=6; +public static inline var WHIRLPOOL:Int=7; +public static inline var FALL_DOOR:Int=8; +public static inline var NO_MOVE_DOOR:Int=9; +public static inline var RIGHT_DOOR:Int=11; +public static inline var LEFT_DOOR:Int=10; +public static inline var WIDE_5_DOOR_D:Int=12; +public static inline var TALL_5_DOOR_L:Int=13; +public static inline var WIDE_5_DOOR_U:Int=14; +public static inline var TALL_5_DOOR_R:Int=15; +public static inline var NEXUS_PAD:Int=16; + +/* descriptive constants that essentially act like shitty keys + * for the state of certain doors in the game. */ +private static inline var Door_Red_Cave_Left:Int=5; +private static inline var Door_Red_Cave_Right:Int=7; +private static inline var Door_Red_Cave_North:Int=8; + +private static inline var Door_CrowdBossFilm:Int=14; + +/* Nexus door constants */ +private static inline var Door_Nexus2Blank:Int=4; +public static inline var Door_Nexus2Street:Int=13; + +public static inline var Door_Nexus_Cell:Int=45; +public static inline var Door_Nexus_Suburb:Int=46; +public static inline var Door_Nexus_Space:Int=47; +public static inline var Door_Nexus_Fields:Int=48; +public static inline var Door_Nexus_Overworld:Int=49; +public static inline var Door_Nexus_Forest:Int=50; +public static inline var Door_Nexus_Terminal:Int=51; +public static inline var Door_Nexus_Go:Int=52; +public static inline var Door_Nexus_Redsea:Int=53; +public static inline var Door_Nexus_Cliff:Int=54; +public static inline var Door_Nexus_Beach:Int=55; +public static inline var Door_Nexus_Blue:Int=56; +public static inline var Door_Nexus_Happy:Int=57; +public static inline var Door_Nexus_Circus:Int=58; +public static inline var Door_Nexus_Hotel:Int=59; +public static inline var Door_Nexus_Apartment:Int=60; +public static inline var Door_Nexus_Crowd:Int=61; +public static inline var Door_Nexus_Redcave:Int=62; +public static inline var Door_Nexus_Bedroom:Int=63; +public static inline var Door_Nexus_Windmill:Int=64; +private static inline var Door_Go_Secret:Int=71; + + + +private static var Nexus_Door_Keys:Array=new Array(4, 13, 45, 46, 47, 48, 49, 50, 51, 52, 53,54,55,56,57,58,59,60,61,62,63,64); +// Maps door keys ->indices in the preview spritesheet +// E,g, if you addded the graphic for REDSEA, then you'd look up the key(53), and then add "53:x" to the object below, +// where x is the first frame of the 4-frame animation in the spritesheet +private static var Nexus_Graphic_Hash:Dynamic={ 13:0, 49:4 , 62:8, 61:12, 60:16, 59:20, 58:24, 54:28, 50:32, 64:36, 53:40, 55:44 +, 63:48, 48:52,52:56,51:60,57:64,47:68,45:72,46:76,56:80}; +private static var Nexus_Key_Hash:Dynamic={ // For the states + 4:0, 13:1, 45:2, 46:3, + 47:4, 48:5, 49:6, 50:7, + 51:8, 52:9, 53:10, 54:11, + 55:12, 56:13, 57:14, 58:15, + 59:16, 60:17, 61:18, 62:19, +63:20, 64:21 }; +private var nexus_jump_exit_d:Float=0; + + +//defaults to -1 +public static var Next_Door_Pair_ID:Int=-1; + +/** + * Whether or not this door's sibling was used to enter the map. + * Used in determining which door is the "entrance" door, allowing the + * player to stand on it indefinitely until he moves off. + */ +private var is_entered_door:Bool=false; + + //[Embed(source="../../res/sprites/gadgets/doors.png")] public static var Door_Sprites:Class; + //[Embed(source="../../res/sprites/decoration/whiteportal.png")] public static var White_Portal_Sprite:Class; + //[Embed(source="../../res/sprites/decoration/whirlpool.png")] public static var Whirlpool_Door_Sprite:Class; + //[Embed(source="../../res/sprites/gadgets/nexus_door.png")] public static var Sprite_nexus_door:Class; + //[Embed(source="../../res/sprites/decoration/nexus_door_preview_overlay.png")] public static var Nexus_door_previews_embed:Class; + //[Embed(source="../../res/sprites/decoration/nexus_door_preview_fade.png")] public static var Nexus_door_overlay_embed:Class; + //[Embed(source="../../res/sprites/decoration/nexus_cardgem.png")] public static inline var embed_nexus_cardgem:Class; + public var local_id:Int; + public var mapName:String; + // Constants used to lookup values in the door lookup array + public var XVAL:Int=0; + public var YVAL:Int=1; + public var MAPVAL:Int=2; + public var xml:XML; + public var index:Int;// The key Into the door lookup array + public var inactive:Bool=false;//whether or not this door 'works' + public var type:Int; + public var parent:Dynamic;//playstate or roamstate + + public var nexus_gem:FlxSprite; + public var preview:FlxSprite=new FlxSprite; + public var preview_fade:FlxSprite=new FlxSprite; + public var undim_region:FlxObject=new FlxObject; + public var is_dimmed:Bool=false; + + public var is_nexus_door:Bool=false; + private var start_nexus_door_outro:Bool=false; + private var nexus_ctr:Int=0; + + public var cid:Int=CLASS_ID.DOOR; + public function new(_x:Int, _y:Int, _xml:XML, _parent:Dynamic) + { + super(_x, _y); + + parent=_parent; + + mapName=Registry.CURRENT_MAP_NAME; + loadGraphic(Door_Sprites, false, false, 16, 16); + + immovable=true; + type=parseInt(_xml.@type);// behavior + + index=parseInt(_xml.@frame);// wher eit is + + if(index==Next_Door_Pair_ID || Next_Door_Pair_ID==-1){ + trace("is entered door! ", index); + is_entered_door=true; + } + + if(Registry.CURRENT_GRID_X==2 && Registry.CURRENT_GRID_Y==2 && Registry.CURRENT_MAP_NAME=="GO"){ + if(false==Registry.GE_States[Registry.GE_QUEST_SPACE]){ + exists=false; + } + } + + + xml=_xml; + + makeGraphic(16, 16, 0x00ffffff); + + + if(Registry.CURRENT_MAP_NAME=="NEXUS" && Nexus_Door_Keys.indexOf(index)!=-1){ + + + + + var doorPair:Array=Registry.DOOR_INFO[index]; + + loadGraphic(Sprite_nexus_door, true, false, 32, 32); + visible=false; + addAnimation("locked", [0, 1], 12); + addAnimation("open", [2]); + is_nexus_door=true; + + inactive=!is_active(index); + + if(inactive){ + play("locked"); + } else { + play("open"); + } + + + // Load the door preview graphics. By default they are hiden, they will + // pop iinto view if that nexus door is open + load_nexus_preview_graphics(index); + preview_fade.alpha=0.5; + if(inactive){ + height=32; + preview.visible=preview_fade.visible=false; + } else { + + preview.visible=preview_fade.visible=true; + } + is_nexus_door=true; + parent.bg_sprites.add(preview); + parent.bg_sprites.add(preview_fade); + + if(Registry.DOOR_INFO[index]==null || Registry.DOOR_INFO[index][0]==null || Registry.DOOR_INFO[index][1]==null){ + exists=false; + } else { + var check_name:String=Registry.DOOR_INFO[index][0][MAPVAL]=="NEXUS" ? Registry.DOOR_INFO[index][1][MAPVAL]:Registry.DOOR_INFO[index][0][MAPVAL]; + } + + if(true==have_all_cards(check_name)){ + nexus_gem=new FlxSprite(x, y + 2, embed_nexus_cardgem); + parent.bg_sprites.add(nexus_gem); + //trace(check_name, " has all cards."); + } else { + + //trace(check_name, " not has all."); + } + + undim_region=new FlxObject(x, y + 32, 32, 25); + + } else { + if(!is_active(index)){ + trace("Door ",index," inactive"); + inactive=true; + } + } + + + if(is_nexus_door){ + } else if(type==Door.THIN_INVISIBLE_TYPE){ + makeGraphic(16, 4, 0x00ffffff); + visible=false; + height=4; + } else if(type==Door.BLANK_PORTAL_UP_TYPE){ + loadGraphic(White_Portal_Sprite, true, false, 16, 16); + width=height=2; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + + addAnimation("a", [4,5], 8, true); + } else { + + addAnimation("a", [0, 1, 2], 10, true); + } + play("a"); + centerOffsets(true); + } else if(type==Door.INVISIBLE_TYPE_UP){ + width=height=8; + centerOffsets(true); + } else if(type==Door.NO_ENTRANCE_INVIS){ + x=-65234;//lol + y=-3422; + } else if(type==Door.LEFT_DOOR){ // Generally these are on the left side of a map + width=16; + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + width=20;// BAD HAX MAN + } + } else if(type==Door.WHIRLPOOL){ + loadGraphic(Whirlpool_Door_Sprite, true, false, 16, 16); + addAnimation("whirl", [0, 1], 6, true); + addAnimation("transition", [3, 4,4], 6, false); + addAnimation("whirl_red", [4, 5], 6, true); + if(Fisherman.fisherman_dead){ + play("whirl_red"); + } else { + play("whirl"); + } + } else if(type==Door.WIDE_5_DOOR_D || type==Door.WIDE_5_DOOR_U){ + width=80; + x -=32; + offset.x=-32; + } else if(type==Door.TALL_5_DOOR_L || type==Door.TALL_5_DOOR_R){ + height=80; + y -=32; + offset.y=-32; + } else if(type==Door.NEXUS_PAD){ + x=-60000; + y=-60000; + } else { + trace("Otherwise...", index); + width=height=14; + centerOffsets(true); + } + + } + + override public function update():Void { + if(start_nexus_door_outro){ + nexus_outro(); + super.update(); + return; + } + + if(type==WHIRLPOOL){ + if(Fisherman.fisherman_dead){ + if(_curAnim.name=="whirl"){ + play("transition"); + } + + if(_curAnim.name=="transition" && _curFrame==_curAnim.frames.length - 1){ + play("whirl_red"); + } + } + } + + /* Bugginess in FlxG.collide? When x values are aligned, + * collide returns true even though they're separated by 48 pixels */ + if(!is_nexus_door && parent.player.touches(this)){ + if(!is_entered_door ||(is_entered_door && !parent.player.hasnt_stepped_off_the_door_yet)){ + if(doorCallback(this, parent.player)){ + exists=false; + } + } + // jesus christ look at that conditional + } else if(is_nexus_door && !inactive){ + y +=3; + if(parent.player.touches(this)){ + parent.player.actions_disabled=true; + if(parent.player.facing==UP && Registry.keywatch.JP_ACTION_1 && !start_nexus_door_outro){ + start_nexus_door_outro=true; + } + } + y -=3; + } else { + y +=2; + if(is_entered_door && parent.player.hasnt_stepped_off_the_door_yet){ + parent.player.hasnt_stepped_off_the_door_yet=false; + } else if(is_nexus_door && parent.player.touches(this)){ + parent.player.actions_disabled=true; + if(parent.player.facing==UP && Registry.keywatch.JP_ACTION_1){ + parent.player.be_idle(); + //DH.dialogue_popup("The portal does not appear to be active."); + DH.dialogue_popup(DH.lk("door", 0)); + } + } + y -=2; + } + + if(parent.SWITCH_MAPS)return; + + if(is_nexus_door){ + if(!inactive){ + if(is_dimmed){ + if(undim_region.overlaps(parent.player)){ + is_dimmed=false; + preview.play("a"); + } + EventScripts.send_property_to(preview_fade, "alpha", 0.5, 0.01); + } else { + if(!undim_region.overlaps(parent.player)){ + is_dimmed=true; + preview.play("stop"); + } + EventScripts.send_property_to(preview_fade, "alpha", 0, 0.01); + } + } + + if(Math.abs(x - parent.player.x)<48 && Math.abs(y - parent.player.y)<48){ + if(parent.state==parent.S_NORMAL){ + FlxG.collide(parent.player, this); + } + } + } else { + if(inactive && is_active(index)){ + inactive=false; + } + } + super.update(); + } + + // There is nothing good about this entire class's code. + // this function does nothing but reinforce that fact. + private function nexus_outro():Void { + parent.player.actions_disabled=true; + switch(nexus_ctr){ + case 0: + var p:Player=parent.player; + p.solid=false; + p.parabola_thing=new Parabola_Thing(parent.player, 16, 0.5, "offset", "y"); + p.my_shadow.visible=true; + p.my_shadow.x=p.x + 2; + p.my_shadow.y=p.y + 7; + parent.bg_sprites.add(p.my_shadow); + p.my_shadow.frame=3; + p.s_interact_shadow_visibility_override=true; + p.state=p.S_INTERACT; + Registry.sound_data.player_jump_up.play(); + nexus_ctr++; + p.play("jump_u"); + break; + case 1: + parent.player.y -=0.57; + nexus_jump_exit_d +=0.57; + if(nexus_jump_exit_d>7){ + parent.player.s_interact_shadow_visibility_override=false; + } + parent.player.my_shadow.x=parent.player.x + 2; + parent.player.my_shadow.y=parent.player.y + 5; + if(parent.player.parabola_thing.tick()){ + parent.bg_sprites.remove(parent.player.my_shadow, true); + parent.player.state=parent.player.S_GROUND; + parent.player.velocity.y=0; + parent.player.my_shadow.visible=false; + doorCallback(this, parent.player); + } + } + } + + /* Lookup corresponding door and switch states, also revive sprites with permanence<=1 */ + public function doorCallback(door:Door, player:Player):Bool { + if(door.inactive)return false; + if(player.state !=player.S_GROUND && player.state !=player.S_LADDER)return false; + door.getNextParams(); + return true; + } + /** + * If there is a door(a,mid)and(mid,b)then calling this function when + * you touch a or b will send you to respectively, b or a. Useful for skipping unfinished + * areas without mucking around with the level editor. + * @param a + * @param mid + * @param b + * @param a_id + * @param b_id + */ + private function warp(a:String, mid:String, b:String, a_id:Int, b_id:Int):Void { + if(mapName==a && index==a_id){ + index=b_id; + Registry.CURRENT_MAP_NAME=mapName=mid; + yeah_no=true; + } else if(mapName==b && index==b_id){ + index=a_id; + Registry.CURRENT_MAP_NAME=mapName=mid; + yeah_no=true; + } + } + + //used in conjunction with warp to do something god knows what + private var yeah_no:Bool=false; + /* Sets the correct global values(map name, entrance x/y)based on the door. Then call switch state + * whereever ye want */ + public function getNextParams():Void { + // Override door ehaviors for demo since DEEP areas arent finished + // Door 3(Fields-beach)and 34(fields-windmill)are moved to forest for the time being. + if(Intra.is_demo){ + //warp("CLIFF", "SPACE", "HOTEL", 39, 25); + //warp("REDCAVE", "TRAIN", "CIRCUS", 41, 31); + //warp("OVERWORLD", "SUBURB", "APARTMENT", 37, 18); + //warp("OVERWORLD", "FIELDS", "FOREST", 33, 35); + + } + var doorPair:Array=Registry.DOOR_INFO[index]; + + Next_Door_Pair_ID=index; + var pairIndex:Int; + + + if(yeah_no){ + if(doorPair[0][MAPVAL]==mapName){ + pairIndex=1; + } else { + pairIndex=0; + } + } else { + if(doorPair[0][XVAL]==(x - offset.x)&& doorPair[0][YVAL]==(y - offset.y)&& doorPair[0][MAPVAL]==mapName){ + pairIndex=1; + } else { + pairIndex=0; + } + } + + + if(Intra.is_release){ + if(Registry.CURRENT_MAP_NAME=="FIELDS" &&(Registry.CURRENT_GRID_X<5 || Registry.CURRENT_GRID_Y>1)){ + //if((Registry.CURRENT_GRID_X !=1 || Registry.CURRENT_GRID_Y !=5)&& + //(Registry.CURRENT_GRID_X !=10 || Registry.CURRENT_GRID_Y !=8)){ + // 10 8 windmill + parent.player.hasnt_stepped_off_the_door_yet=true; + //DH.dialogue_popup("A voice:Sorry, but this area is as far as the demo goes! To proceed beyond, purchase the full version from www.anodynegame.com ! Thanks for playing!"); + DH.dialogue_popup("A voice:Sorry, but this area is blocked off in this demo! Buy the full version to explore more than these fields!"); + parent.player.be_idle(); + return; + //} + } + } + + Registry.NEXT_MAP_NAME=doorPair[pairIndex][MAPVAL]; + Registry.ENTRANCE_PLAYER_X=doorPair[pairIndex][XVAL]; + Registry.ENTRANCE_PLAYER_Y=doorPair[pairIndex][YVAL]; + + + //Special case things when transitioning + + Registry.E_PLAY_ROOF=false; + Registry.BOI=false; + // If coming from SPACE ->Hotel, play the roof song + if(Registry.NEXT_MAP_NAME=="HOTEL" && index==25){ + Registry.E_PLAY_ROOF=true; + + } else if(index==26){ + // Always change songs going between roof and hotel + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + // Coming from inside to outside, play roof + if(Registry.CURRENT_GRID_Y !=0){ + Registry.E_PLAY_ROOF=true; + } else { + } + } else if(index==14){ + if(!Registry.Event_Biofilm_Broken){ + return; + } + // Don't allow you to enter GO secret hut till quest is over + } else if(index==Door_Go_Secret && false==Registry.GE_States[Registry.GE_QUEST_SPACE]){ + return; + } else if(index==73 || index==75){ + // If we are entering a SUBURB house with no filter.. + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + if(Registry.CURRENT_GRID_Y<4){ + Registry.sound_data.trigger_soft=true; + Registry.E_NEXT_MAP_NO_STATIC=true; + } + } else if(index==74 || index==76 || index==78 || index==77){ + if(Registry.CURRENT_GRID_Y<4){ + Registry.E_NEXT_MAP_TURN_ON_LIGHT=true; + Registry.E_NEXT_MAP_DARKNESS_8=true; + } + } else if(index==94 && Registry.CURRENT_MAP_NAME=="REDSEA"){ // Entering BoI + Registry.E_PLAY_ROOF=true; + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + Registry.BOI=true; + } + + + trace("Getting next door...\ninput is(", x, ",", y, ",", Registry.CURRENT_MAP_NAME); + trace("offsets;", offset.x, offset.y); + trace("New:", Registry.ENTRANCE_PLAYER_X, Registry.ENTRANCE_PLAYER_Y, Registry.NEXT_MAP_NAME); + //trace(Registry.ENTRANCE_PLAYER_Y % Registry.SCREEN_HEIGHT_IN_PIXELS); + /* Use the just-stepped-on-door's type to determine where the player enters + * the next map in reference to the next door. */ + var door_type:Int=parseInt(xml.@type); + var curmap:String=Registry.CURRENT_MAP_NAME; + var next_y:Int=Registry.ENTRANCE_PLAYER_Y; + var next_x:Int=Registry.ENTRANCE_PLAYER_X; + + var going_to_nexus:Bool=false; + if(Registry.CURRENT_MAP_NAME !="NEXUS" && Registry.CURRENT_MAP_NAME !="BLANK" && Nexus_Door_Keys.indexOf(index)!=-1){ + going_to_nexus=true; + Registry.sound_data.teleport_up.play(); + } else if(is_nexus_door){ + Registry.sound_data.teleport_up.play(); + } + + // Based on this input door, determine which way + // hthe player should face in the next map + // and where it should be positioned wrt next map's door. + if(going_to_nexus){ + next_y +=35; + next_x +=10; + Registry.sound_data.enter_door.play(); + } else if(door_type==INVISIBLE_TYPE_UP || door_type==WIDE_5_DOOR_U){ + next_y=doorPair[pairIndex][YVAL] - 20; + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_u"; + Registry.GAMESTATE.player.facing=UP; + Registry.sound_data.enter_door.play(); + } else if(door_type==INVISIBLE_TYPE || door_type==WIDE_5_DOOR_D){ + trace("Door type:Invisible Down"); + next_y +=16; + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_d"; + Registry.GAMESTATE.player.facing=DOWN; + Registry.sound_data.enter_door.play(); + } else if(door_type==BLANK_PORTAL_UP_TYPE){ + Registry.sound_data.teleport_up.play(); + Registry.EVENT_TELEPORT_DOWN_SOUND=true; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + next_y -=12; + } + + } else if(door_type==WHIRLPOOL){ + + Registry.E_Enter_Whirlpool_Down=true; + if(curmap=="REDSEA"){ + next_y -=36; + } + } else if(door_type==FALL_DOOR){ + Registry.E_Enter_Fall_Down=true; + } else if(door_type==NO_MOVE_DOOR){ + if(is_nexus_door){ + next_x +=10; + next_y +=8; + } + Registry.sound_data.enter_door.play(); + } else if(door_type==RIGHT_DOOR || door_type==TALL_5_DOOR_R){ + next_x +=17; + Registry.sound_data.enter_door.play(); + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_r"; + Registry.GAMESTATE.player.facing=RIGHT; + } else if(door_type==LEFT_DOOR || door_type==TALL_5_DOOR_L){ + next_x -=16; + Registry.sound_data.enter_door.play(); + Registry.GAMESTATE.player.TRANSITION_IDLE="idle_l"; + Registry.GAMESTATE.player.facing=LEFT; + } else { + Registry.sound_data.enter_door.play(); + next_y +=20; + } + Registry.ENTRANCE_PLAYER_Y=next_y; + Registry.ENTRANCE_PLAYER_X=next_x; + + parent.SWITCH_MAPS=true; + } + + private function change_stats(amount:Int,give_jump:Bool):Void { + amount=amount>16 ? 16:amount; + if(Registry.MAX_HEALTH; + loadGraphic(DUST_SPRITE, true, false, 16, 16); + dust_sound.loadEmbedded(S_DUST_POOF); + addAnimation("poof", [0, 1, 2, 3, 4], 13, false); + addAnimation("unpoof", [3, 2, 1, 0], 13, false); + addAnimationCallback(on_anim_change); + + Registry.subgroup_dust.push(this); + + if(parseInt(xml.@frame)==1){ + dame_frame=T_PUZZLE; + } + } + + public function hit(hitter:String, player_dir:Int):Int { + if(hitter=="broom" && visible){ + play("poof"); + if(!Registry.GE_States[Registry.GE_Swept_Dust]){ + Registry.GE_States[Registry.GE_Swept_Dust]=true; + if(!Intra.is_test){ + //DH.dialogue_popup("Your broom is now full of dust! Attack again to place it."); + DH.dialogue_popup(DH.lk("dust", 0)); + } + } + dust_sound.play(); + + } + if(frame==4){ + visible=false; + + } + return Registry.HIT_NORMAL; + } + + override public function update():Void + { + if(velocity==null){ + exists=false; + return; + } + /* Set midpoint for collision with conveyer-type tiles. */ + midpoint.x=x + 8; + midpoint.y=y + 8; + if(!ON_CONVEYER){ + velocity.x=velocity.y=0; + } + + + + /* Check for overlap with a Propelled and if so, + * don't fall in a hole. If just poofed, then propel the Propelled. o_o*/ + for(var propelled:Propelled in Registry.subgroup_propelled){ + if(propelled !=null){ + if(propelled.overlaps(this)){ + + // Instead, if the propelled is inactive, turn it on, and remove teh dust + // If the propelled is active do nothing + + propelled.turn_on(); + play("poof"); + if(frame==4){ + x=-5000; + exists=false; + } + + on_propelled=true; + + /*if(poofed_by_player_landing){ + propelled.propel_from_dust_poof(); + }*/ + } + } + } + + if(!on_propelled &&(this !=parent.player.raft)){ + if(fell_in_hole){ + play("poof"); + if(frame==4)x=-5000; + } + } + on_propelled=false; + + + if(parent.player.raft !=this){ + FlxG.collide(this, parent.curMapBuf);// Can set ON_CONVEYER to true. + } + + /* If dust is on the conveyer and player touches it, then the + * played should ride on top of it */ + if(ON_CONVEYER){ + if(parent.player.ON_RAFT==false && parent.player.state !=parent.player.S_AIR && parent.player.midpoint.xx && + parent.player.midpoint.y>y && parent.player.midpoint.y140){ + angle=90; + }*/ + + //HACKS + if(Registry.CURRENT_MAP_NAME=="CROWD" && Registry.CURRENT_GRID_X==0 && Registry.CURRENT_GRID_Y==4 && REQUIRED_PUZZLES==3){ + REQUIRED_PUZZLES=2; + } + Registry.subgroup_gates.push(this); + } + + /** + * TODO:Enemies that are perma-dead, as well as perma-solved + * puzzles should count in the GRID_..._... counter. + * + * possible source of bugs - dead enemies not auto-incrementing the counter. + * I checked over this on 7/23, though., seems okay + */ + + override public function update():Void { + + if(player_hasnt_stepped_off){ + if(!player.overlaps(this)){ + play("close"); + Registry.sound_data.hitground1.play(); + player_hasnt_stepped_off=false; + } + } + if(Registry.CURRENT_GRID_X !=grid_coords.x || Registry.CURRENT_GRID_Y !=grid_coords.y){ + return; + } + + FlxG.collide(this, player); + /* If ever alive and not closed, then close */ + if(frame !=CLOSED_FRAME){ + //close it if we're not touching + if(xml.@alive=="true" && !player.overlaps(this)){ + play("close"); + Registry.sound_data.hitground1.play(); + solid=true; + } + } + if(Registry.GRID_ENEMIES_DEAD>=REQUIRED_ENEMIES){ + xml.@alive="false"; + } else if(Registry.GRID_PUZZLES_DONE>=REQUIRED_PUZZLES){ + xml.@alive="false"; + } else if(is_temporary){ + xml.@alive="true"; + } + + if(frame==CLOSED_FRAME && xml.@alive=="false"){ + Registry.sound_data.open.play(); + play("rise"); + solid=false; + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Go_Detector.hx b/intra/source/entity/gadget/Go_Detector.hx new file mode 100644 index 0000000..10aef81 --- /dev/null +++ b/intra/source/entity/gadget/Go_Detector.hx @@ -0,0 +1,112 @@ +package entity.gadget +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; + + + +class Go_Detector extends AnoSprite +{ + + private var map:FlxTilemap; + public var door:FlxSprite; + + private static inline var RED_ID:Int=60; + private static inline var GREEN_ID:Int=62; + private static inline var YELLOW_ID:Int=63; + private static inline var BLUE_ID:Int=61; + + private var RED_PT:Point=new Point(0 + 2, 4 + 2); + private var BLUE_PT:Point=new Point(5 + 2, 3 + 2); + private var GREEN_PT:Point=new Point(4 + 2, 1 + 2); + private var YELLOW_PT:Point=new Point(1 + 2, 1 + 2); + + private static inline var s_closed:Int=0; + private static inline var s_opening:Int=1; + private static inline var s_open:Int=2; + + public function new(args:Array) + { + super(args); + + makeGraphic(4, 4, 0xff151515); + + door=new FlxSprite(0, 0); + door.makeGraphic(16, 16, 0xffff0000); + + xml.@p="2"; + + + if(xml.@alive=="false"){ + state=s_open; + door.color=0x00ff00; + } else { + state=s_closed; + + } + + if(Registry.CURRENT_GRID_X==0 && Registry.CURRENT_GRID_Y==4){ + RED_PT.x=2 + 1;RED_PT.y=2 + 3; + BLUE_PT.x=2 + 4;BLUE_PT.y=2 + 1; + GREEN_PT.x=2 + 4;GREEN_PT.y=2 + 3; + YELLOW_PT.x=2 + 3;YELLOW_PT.y=2 + 0; + } + visible=door.visible=false; + + } + + override public function update():Void + { + if(Registry.GE_States[Registry.GE_Briar_Blue_Done]){ + Registry.GRID_PUZZLES_DONE=1; + } + if(!did_init){ + did_init=true; + map=parent.curMapBuf; + parent.sortables.add(door); + door.x=tl.x + 50; + door.y=tl.y + 16; + } + + if(state==s_closed){ + var r:Int=map.getTile(RED_PT.x, RED_PT.y); + var g:Int=map.getTile(GREEN_PT.x, GREEN_PT.y); + var b:Int=map.getTile(BLUE_PT.x, BLUE_PT.y); + var y:Int=map.getTile(YELLOW_PT.x, YELLOW_PT.y); + + + if(r==RED_ID && y==YELLOW_ID && g==GREEN_ID && b==BLUE_ID){ + xml.@alive="false"; + state=s_opening; + Registry.sound_data.open.play(); + + } + } else if(state==s_opening){ + door.alpha -=0.07; + if(door.alpha==0){ + state=s_open; + Registry.GRID_PUZZLES_DONE +=1; + door.color=0x00ff00; + } + } else if(state==s_open){ + + } + + + + super.update(); + } + + override public function destroy():Void + { + RED_PT=BLUE_PT=GREEN_PT=YELLOW_PT=null; + parent.sortables.remove(door, true); + door.destroy(); + door=null; + + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Growth_Gate.hx b/intra/source/entity/gadget/Growth_Gate.hx new file mode 100644 index 0000000..0ab77e4 --- /dev/null +++ b/intra/source/entity/gadget/Growth_Gate.hx @@ -0,0 +1,58 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; + +/** + * Gate that only opens with the required number of growths + * DAME PARAMS: + * type:# of growths to open door + * p:2 + * alive:t/f, whether it should spawn + */ +class Growth_Gate extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/growth_gate.png")] public static var sprite_growth_gate:Class; + + public var growth_requirement:Int; + public var xml:XML; + public var active_region:FlxSprite; + public var cid:Int=CLASS_ID.GROWTH_GATE; + public function new(_xml:XML) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + growth_requirement=parseInt(xml.@type); + + loadGraphic(sprite_growth_gate, true, false, 16, 32); + addAnimation('disappear', [0, 1, 2, 3,4], 4, false); + immovable=true; + frame=0; + active_region=new FlxSprite(x, y + height); + active_region.makeGraphic(width, 4, 0xff00ffff); + + if(xml.@alive=="false"){ + visible=false; + } + } + + override public function update():Void + { + if(frame==4){ + xml.@alive="false"; + } + super.update(); + } + public function check_open(f:FlxSprite):Void { + + if(f.overlaps(active_region)){ + if(xml.@alive=="false")return; + if(Registry.nr_growths>=growth_requirement && frame==0){ + play('disappear'); + } + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Hole.hx b/intra/source/entity/gadget/Hole.hx new file mode 100644 index 0000000..6cf4eff --- /dev/null +++ b/intra/source/entity/gadget/Hole.hx @@ -0,0 +1,53 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import org.flixel.FlxSprite; +/** + * ... + * @author Seagaia + */ +class Hole extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/hole.png")] public var C_HOLE_SPRITE:Class; + public var type:String="Hole"; + public var xml:XML; + public var active_region:FlxSprite; + public var cid:Int=CLASS_ID.HOLE; + + private var player:Player; + public function new(_x:Int, _y:Int, _xml:XML, _player:Player, _frame:Int=0) + { + super(_x, _y); + + immovable=true;solid=true; + loadGraphic(C_HOLE_SPRITE, true, false, 16, 16); + width=4; + height=4; + offset.x=6; + offset.y=5; + x +=6; + y +=5; + if(_xml !=null){ + xml=_xml; + frame=parseInt(xml.@frame); + } else { + xml= + frame=_frame; + } + player=_player; + + } + + override public function update():Void { + if(player.state !=player.S_AIR && player.overlaps(this)){ + if(visible){ + player.isFalling=true; + player.fall_pt.x=x; + player.fall_pt.y=y; + } + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Jump_Trigger.hx b/intra/source/entity/gadget/Jump_Trigger.hx new file mode 100644 index 0000000..7cf0286 --- /dev/null +++ b/intra/source/entity/gadget/Jump_Trigger.hx @@ -0,0 +1,134 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; + +/* + * dame props: + * frame - how many tiles this makes the player jump + * past the next tile - 0=>1, 1=>2. + * */ +class Jump_Trigger extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/spring_pad.png")] public static var spring_pad_sprite:Class; + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + public var distance:Int; + public var time:Float; + public var cid:Int=CLASS_ID.JUMP_TRIGGER; + private var active_region:FlxSprite=new FlxSprite(0, 0); + + private var dame_type:Int=0; + private var T_NORMAL:Int=0; + private var T_SPRING:Int=1; + private var frame_down:Int=1; + private var frame_mid:Int=0; + private var activated:Bool=false; + + private var did_init:Bool=false; + + public function new(_xml:XML, _player:Player,_parent:Dynamic) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + player=_player; + parent=_parent; + dame_type=parseInt(xml.@type); + + if(dame_type==T_SPRING){ + loadGraphic(spring_pad_sprite, true, false, 16, 16); + addAnimation("still", [0], 0, false); + addAnimation("wobble", [0,2,0,1,0,2,0,1,0,0], 10, false); + play("still"); + + active_region=this; + } else { + makeGraphic(16, 2, 0x00000000); + immovable=true; + solid=false; + y +=12; + active_region.makeGraphic(6, 4, 0x000000); + } + + + switch(parseInt(xml.@frame)){ + case 0: + distance=32; + time=0.3; + break; + case 1: + distance=48; + time=0.5; + break; + case 2: + distance=64; + time=0.7; + break; + } + + + + } + + override public function update():Void + { + + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + if(dame_type==T_NORMAL){ + active_region.x=x + 5; + active_region.y=y; + + if(player.overlaps(active_region)&&(player.state==player.S_LADDER ||(player.state==player.S_GROUND && player.facing & DOWN))){ + make_player_jump(); + } + } else { + active_region.x=x; + active_region.y=y; + if(player.overlaps(active_region)){ + if(player.just_landed){ + if(!activated){ + activated=true; + player.is_spring_jump=true; + Registry.sound_data.spring_bounce.play(); + make_player_jump(); + play("wobble"); + } + } else { + if(!activated && player.state==player.S_GROUND){ + frame=frame_down; + } else if(player.state==player.S_AIR){ + frame=frame_mid; + } + } + } else { + if(!activated){ + frame=frame_mid; + } + if(_curAnim !=null && _curAnim.name=="wobble" && _curAnim.frames.length - 1==_curFrame){ + frame=frame_mid; + activated=false; + } + } + } + + super.update(); + } + + private function make_player_jump():Void + { + player.auto_jump_period=time; + player.auto_jump_distance=distance; + player.auto_jump_base_y=player.y; + player.state=player.S_AUTO_JUMP; + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Key.hx b/intra/source/entity/gadget/Key.hx new file mode 100644 index 0000000..8961412 --- /dev/null +++ b/intra/source/entity/gadget/Key.hx @@ -0,0 +1,56 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxSprite; +/** + * OH COME ON WHAT DO YOU THINK THIS IS. + * @author Seagaia + */ +class Key extends FlxSprite +{ + public var type:String="Key"; + + //[Embed(source="../../res/sprites/gadgets/key.png")] public static var C_KEY_SPRITE:Class; + public var xml:XML; + public var cid:Int=CLASS_ID.KEY; + + private var player:Player; + private var parent:Dynamic; + public function new(_x:Int, _y:Int, _player:Player, _parent:Dynamic,_xml:XML=null) + { + super(_x, _y); + loadGraphic(C_KEY_SPRITE, false, false, 16, 16); + if(_xml==null){ + xml=; + xml.@["x"]=_x.toString(); + xml.@["y"]=_y.toString(); + xml.@["p"]="2";//Keys only get collected once + xml.@["alive"]="true";//Presumably, uh. + } else { + xml=_xml; + if(xml.@alive=="false"){ + visible=false; + } + y -=20; + } + + player=_player; + parent=_parent; + } + + override public function update():Void { + + if(player.overlaps(this)&& visible){ + Registry.change_nr_keys(1); + Registry.sound_data.get_key.play(); + xml.@alive="false"; + visible=false; + parent.bg_sprites.remove(this, true); + } + + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/KeyBlock.hx b/intra/source/entity/gadget/KeyBlock.hx new file mode 100644 index 0000000..d55cb9b --- /dev/null +++ b/intra/source/entity/gadget/KeyBlock.hx @@ -0,0 +1,429 @@ +package entity.gadget +{ +/** + * A keyblock. These open up if you have a key. + * Its sprite is set based on the frame in the level editor. + * Alive refers to whether it has been opened. DUHH + * @author Seagaia + */ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.interactive.NPC; +import entity.player.Player; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import data.SoundData; +import global.Registry; + +class KeyBlock extends FlxSprite +{ + + public var type:String="KeyBlock"; + public var O:Int=16;//Offset for animation when unlocked + public var xml:XML; + public var cid:Int=CLASS_ID.KEYBLOCK; + public var sentinel:FlxSprite; + public var active_region:FlxSprite; + + private var is_big:Bool=false; + private var player:Player; + private var start_unlock_anim:Bool=false; + private var ctr:Int=0; + private var key_sprite:FlxSprite; + private var t:Float=0; + private var tm:Float=0.8; + + public static var sig_change:Bool=false; + private var explosion:FlxSprite; + + //[Embed(source="../../res/sprites/gadgets/keyhole.png")] public var C_KEYBLOCK_SPRITE:Class; + //[Embed(source="../../res/sprites/gadgets/gate_green.png")] public var green_gate_embed:Class; + /** + * + * @param _x + * @param _y + * @param _frame frame type + * @param _xml Reference to the sprites xml(if any) + */ + public function new(_x:Int, _y:Int, _frame:Int,_player:Player,_xml:XML=null) + { + super(_x , _y); + sentinel=new FlxSprite(x -2, y - 2); + sentinel.immovable=true; + sentinel.makeGraphic(20, 20, 0x00ffffff); + + loadGraphic(C_KEYBLOCK_SPRITE, true, false, 16, 16); + + frame=_frame; + immovable=true; + if(_xml !=null){ + xml=_xml; + } + + if(frame==2 && Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [0, 1, 2, 3, 4, 5], 12, false); + is_big=true; + if(xml.@alive=="false"){ + exists=false; + } + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + switch(frame){ + case 1: + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [7, 1, 2, 3, 4, 5], 12, false); + frame=7; + break; + //blue + case 2: + loadGraphic(green_gate_embed, true, false, 32, 16); + addAnimation("open", [0, 1, 2, 3, 4, 5], 12, false); + break; + //green + case 3: + loadGraphic(green_gate_embed, true, false, 32, 16); + frame=6; + addAnimation("open", [6, 1, 2, 3, 4, 5], 12, false); + break; + //redcave + } + if(xml.@alive=="false"){ + exists=false; + } + is_big=true; + } else if(frame==4){ // card gate + loadGraphic(green_gate_embed, true, false, 32, 16); + if(xml.@alive=="false"){ + exists=false; + } + is_big=true; + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + frame=8;// 5 card door + addAnimation("open", [8, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="TERMINAL"){ + frame=14; + addAnimation("open", [14, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ + frame=9; + addAnimation("open", [9, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + frame=10; + addAnimation("open", [10, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + frame=13; + addAnimation("open", [13, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_MAP_NAME=="BLANK"){ + if(Registry.CURRENT_GRID_Y>3 && Registry.CURRENT_GRID_Y<7){ // 48 + //frame=12;' + frame=11;//Changed so you cn get to the debug area with 47 + + addAnimation("open", [12, 1, 2, 3, 4, 5], 12, false); + } else if(Registry.CURRENT_GRID_Y>=7){ + frame=16; + addAnimation("open", [16, 1, 2, 3, 4, 5], 12, false); + } else { // 47 + frame=11; + addAnimation("open", [11, 1, 2, 3, 4, 5], 12, false); + } + } else if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + frame=15; + addAnimation("open", [15, 1, 2, 3, 4, 5], 12, false); + } + active_region=sentinel; + + Registry.subgroup_interactives.push(this); + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + + loadGraphic(green_gate_embed, true, false, 32, 16); + frame=6; + addAnimation("open", [6, 1, 2, 3, 4, 5], 12, false); + is_big=true; + if(xml.@alive=="false"){ + exists=false; + } + } else { + addAnimation("open", [O, O + 1, O + 2, O + 3, O + 4], 10, false); + tm=0.2; + } + + player=_player; + + } + + public function unlock():Void { + Registry.sound_data.unlock.play(); + + play("open"); + xml.@alive=false; + solid=false; + + + + } + + override public function update():Void + { + FlxG.collide(this, player); + + if(FlxG.keys.justPressed("G")&& Intra.is_test){ + Registry.nr_growths +=18; + trace("New growhts:", Registry.nr_growths); + } + + if(!is_big){ + if(FlxG.overlap(player, sentinel)){ + t -=FlxG.elapsed; + + if(t<0 && Registry.get_nr_keys()>0 && xml.@alive==true){ + unlock(); + xml.@alive=false; + Registry.change_nr_keys(-1); + Registry.GAMESTATE.number_of_keys_text.text="x" + Registry.get_nr_keys().toString(); + } else if(t<0 && xml.@alive=="true" && alive && player.state==player.S_GROUND){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblock",0)); + alive=false; + } + } else { + t=tm; + } + } + + if(sig_change){ + explosion=new FlxSprite; + explosion.loadGraphic(EventScripts.small_explosion_sprite, true, false, 24,24); + explosion.x=x + 4; + explosion.y=y - 4; + Registry.GAMESTATE.fg_sprites.add(explosion); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + explosion.play("explode"); + sig_change=false; + frame=17; + } + + if(is_big && xml.@alive==true){ + sentinel.x=x + 6; + sentinel.y=y - 3; + sentinel.width=10; + + if(Registry.CURRENT_MAP_NAME=="OVERWORLD" && active_region==null){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND && Registry.inventory[Registry.IDX_GREEN_KEY]){ + start_unlock_anim=true; + + } + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND){ + switch(frame){ + case 0: + if(Registry.inventory[Registry.IDX_GREEN_KEY]){ + start_unlock_anim=true; + } + break; + case 6:// red + if(Registry.inventory[Registry.IDX_RED_KEY]){ + start_unlock_anim=true; + } + break; + case 7: + if(Registry.inventory[Registry.IDX_BLUE_KEY]){ + start_unlock_anim=true; + } + break; + } + } + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + if(player.overlaps(sentinel)&& player.state==player.S_GROUND){ + if(Registry.inventory[Registry.IDX_RED_KEY]){ + start_unlock_anim=true; + } + } + } else { // It's a fuckin' card gate! + var open_the_gate:Bool=false; + + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ // 4 Cards + if(Registry.nr_growths<4 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 0)); + //DH.dialogue_popup("The gate stares, petrified. It won't open until it senses four cards..."); + } else if(Registry.nr_growths>=4 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 1)); + //DH.dialogue_popup("Sensing four cards, the gate decides to open."); + open_the_gate=true; + } + } else if(Registry.CURRENT_MAP_NAME=="TERMINAL"){ + if(Registry.nr_growths<36 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + //DH.dialogue_popup("The gate stubbornly remains in place."); + } else if(Registry.nr_growths>=36 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 3)); + //DH.dialogue_popup("The gate senses all of the cards, and decides to open."); + open_the_gate=true; + } + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ // 8 + if(Registry.nr_growths<8 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=8 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ // 24 + if(Registry.nr_growths<24 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=24 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + //DH.dialogue_popup("The gate senses enough cards, and decides to open."); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ // 16 + if(Registry.nr_growths<16 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=16 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 4)); + //DH.dialogue_popup("The gate senses enough, and decides to open."); + open_the_gate=true; + } + + } else if(Registry.CURRENT_MAP_NAME=="BLANK"){ + if(Registry.CURRENT_GRID_Y>3 && Registry.CURRENT_GRID_Y<7){ + if(Registry.nr_growths<47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 5)); + open_the_gate=true; + } + } else if(Registry.CURRENT_GRID_Y>=7){ + if(player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + //DH.dialogue_popup("It remains closed."); + DH.dialogue_popup(DH.lk("keyblockgate", 6)); + player.be_idle(); + } + } else { + if(Registry.nr_growths<47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 2)); + } else if(Registry.nr_growths>=47 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup(DH.lk("keyblockgate", 5)); + open_the_gate=true; + } + + } + } else if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + if(Registry.nr_growths<49 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup("...."); + } else if(Registry.nr_growths>=49 && player.overlaps(sentinel)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.dialogue_popup("!!!"); + open_the_gate=true; + } + } + + if(xml.@alive=="true" && !start_unlock_anim && open_the_gate && player.overlaps(sentinel)&& player.state==player.S_GROUND){ + start_unlock_anim=true; + ctr=4;// Skip key shit + } + } + + if(start_unlock_anim){ + unlock_anim(); + } + } + super.update(); + } + + override public function destroy():Void + { + active_region=sentinel=null; + super.destroy(); + } + private function unlock_anim():Void { + var sub_ctr:Int=0; + if(ctr==0){ + player.state=player.S_INTERACT; + player.be_idle(); + key_sprite=new FlxSprite(player.x, player.y - 16); + key_sprite.loadGraphic(NPC.key_green_embed, true, false, 16, 16); + key_sprite.alpha=0; + Registry.GAMESTATE.fg_sprites.add(key_sprite); + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + switch(frame){ + case 0: + key_sprite.frame=0;//WHO NEED SCOMMENTS ANYWAYS + break; + case 6://blue + key_sprite.frame=2; + break; + case 7:// red + key_sprite.frame=4; + break; + } + } else if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + key_sprite.frame=2; + } else { + Registry.sound_data.stop_current_song(); + } + ctr++; + } else if(ctr==1){ + if(EventScripts.send_alpha_to(key_sprite, 1, 0.02))ctr++; + } else if(ctr==2){ + key_sprite.flicker(0.5); + if(EventScripts.send_property_to(key_sprite, "y", y, 0.2))sub_ctr++; + if(EventScripts.send_property_to(key_sprite, "x", x + 8, 0.2))sub_ctr++; + if(sub_ctr==2){ + ctr++; + Registry.sound_data.player_jump_down.play(); + } + } else if(ctr==3){ + if(EventScripts.send_alpha_to(key_sprite, 0, -0.025)){ + ctr++; + } + + } else if(ctr>3 && ctr<9){ + t +=FlxG.elapsed; + if(t>tm){ + trace(ctr); + FlxG.shake(0.02, 0.3); + t=0; + Registry.sound_data.hitground1.play(); + ctr++; + if(frame==0 || frame==6 || frame==7 || frame>=8){ + frame=1; + } else { + frame++; + } + } + } else if(ctr==9){ + Registry.sound_data.open.play(); + if(Registry.CURRENT_GRID_Y==6 && Registry.CURRENT_MAP_NAME=="WINDMILL" && Intra.is_release){ + DH.dialogue_popup("A voice:Nice work! You've gotten as far as this demo goes. For the completionists, there are a total of 12 cards to find in this demo."); + } + player.state=player.S_GROUND; + xml.@alive="false"; + solid=false; + start_unlock_anim=false; + + x -=160; + sentinel.x -=160; + } + } + + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Pillar_Switch.hx b/intra/source/entity/gadget/Pillar_Switch.hx new file mode 100644 index 0000000..82f7610 --- /dev/null +++ b/intra/source/entity/gadget/Pillar_Switch.hx @@ -0,0 +1,81 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * Hitting this flips the global pillar_switch_state value. + * @author Seagaia + */ +class Pillar_Switch extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/pillar_switch.png")] public var pillar_switch_sprite:Class; + + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var t_hit:Float=1.0; + public var tm_hit:Float=1.0; + + public var cid:Int=CLASS_ID.PILLAR_SWITCH; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + + loadGraphic(pillar_switch_sprite, true, false, 16, 16); + addAnimation("a", [0]); + addAnimation("b", [1]); + addAnimation("hit", [2, 3], 12); + immovable=true; + + if(Registry.pillar_switch_state){ + play("a"); + } else { + play("b"); + } + + + } + + override public function update():Void + { + FlxG.collide(player, this); + if(t_hit>tm_hit){ + if(_curAnim.name=="hit"){ + if(Registry.pillar_switch_state){ + play("b"); + } else { + play("a"); + } + } + if(player.broom.visible && player.broom.overlaps(this)){ + play("hit"); + Registry.pillar_switch_state=!Registry.pillar_switch_state; + t_hit=0; + } + } else { + t_hit +=FlxG.elapsed; + } + + if(_curAnim.name=="a" && !Registry.pillar_switch_state){ + play("b"); + } else if(_curAnim.name=="b" && Registry.pillar_switch_state){ + play("a"); + } + + + + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Propelled.hx b/intra/source/entity/gadget/Propelled.hx new file mode 100644 index 0000000..a2e8a89 --- /dev/null +++ b/intra/source/entity/gadget/Propelled.hx @@ -0,0 +1,306 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * A platform that faces a certain direction. When dust is placed on top + * and it is jumped on, this will be propelled in that direction, taking + * the player with it. + */ +class Propelled extends FlxSprite +{ + + //[Embed(source="../../res/sprites/gadgets/moving_platform.png")] public static var moving_platform_sprite:Class; + //[Embed(source="../../res/sprites/gadgets/moving_platform_poof.png")] public static var moving_platform_poof_sprite:Class; + + + public var xml:XML; + public var cid:Int=CLASS_ID.PROPELLED; + public var player:Player; + public var parent:Dynamic; + private var pushed_to_front:Bool=false; + private var Propel_Speed:Int=33; + + public var active_region:FlxSprite=new FlxSprite(); + public var dame_frame:Int; + public var is_active:Bool=false; + private var init_pt:Point=new Point(); + + public var dust_poof:FlxSprite=new FlxSprite(); + private var showed_dust_poof:Bool=false; + + + public var is_propelling:Bool=false; + + private var H_UP_OFF:Int=0; + private var H_UP_ON:Int=1; + private var H_DOWN_ON:Int=2; + private var H_DOWN_OFF:Int=3; + private var V_UP_OFF:Int=4; + private var V_UP_ON:Int=5; + private var V_DOWN_ON:Int=6; + private var V_DOWN_OFF:Int=7; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_done:Int=1; + + private var is_first_movement:Bool=true; + + /* + * dame params - frame:waht direction it faces, as well as the sprite itself. + * should be added to FRONT of "flat gadgets" so that dust is drawn on tope*/ + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + active_region.makeGraphic(10, 10, 0x00123456); + + dame_frame=parseInt(xml.@frame); + + switch(dame_frame % 4){ + case 0:facing=UP;break; + case 1:facing=RIGHT;break; + case 2: facing=DOWN;break; + case 3:facing=LEFT;break; + } + + if(dame_frame>3){ + is_active=true; + } else { + is_active=false; + } + + dust_poof.makeGraphic(16, 16, 0xffff1233); + dust_poof.loadGraphic(moving_platform_poof_sprite, true, false, 16, 16); + dust_poof.addAnimation("poof", [0, 1, 2, 3, 4], 12, false); + dust_poof.visible=false; + + loadGraphic(moving_platform_sprite, true, false, 16, 16); + + if(facing==RIGHT || facing==LEFT){ + if(is_active){ + frame=1; + } else { + frame=0; + } + } else { + if(is_active){ + frame=5; + } else { + frame=4; + } + } + + Registry.subgroup_propelled.push(this); + } + + override public function update():Void + { + + /* Draw beneath dust */ + if(!pushed_to_front){ + //noooo + pushed_to_front=true; + parent.bg_sprites.add(active_region); + parent.bg_sprites.move_to_front(active_region); + parent.bg_sprites.move_to_front(this); + parent.bg_sprites.add(dust_poof); + init_pt.x=x; + init_pt.y=y; + } + + if(state==s_done){ + if(active_region.overlaps(player)&& !player.hasFallen && player.state !=player.S_AIR){ + player.falling_disabled=true; + } + super.update(); + return; + } + + /* Pin active region to moving platform */ + active_region.x=x + 3; + active_region.y=y + 3; + if(active_region.overlaps(player)&& !player.hasFallen && player.state !=player.S_AIR){ + player.falling_disabled=true; + set_frame(true); + if(is_propelling){ + set_velocity(); + } + + if(player.just_landed){ + if(is_active){ + is_propelling=true;//start moving + if(!showed_dust_poof){ + Dust.dust_sound.play(); + dust_poof.play("poof"); + showed_dust_poof=true; + dust_poof.visible=true; + switch(facing){ + case LEFT: + dust_poof.x=x + width; + dust_poof.y=y; + break; + case RIGHT: + dust_poof.x=x - dust_poof.width; + dust_poof.y=y; + break; + case UP: + dust_poof.x=x; + dust_poof.y=y + height; + break; + case DOWN: + dust_poof.x=x; + dust_poof.y=y - dust_poof.height; + break; + } + } else { + //HI + } + } + } + } else { + set_frame(false); + } + + // On the return trip, if the platform is close, + // then stop it and return it tot he initial state + if(!is_first_movement){ + if(EventScripts.distance(this, init_pt)<3){ + x=init_pt.x; + y=init_pt.y; + reset_moving_props(); + } + } + + + super.update(); + } + + public function turn_on():Void { + if(!is_active){ + // dont make a noise with the already-activated platforms + // when entering map + if(parent==null){ + trace(Registry.GAMESTATE.sortables.members.indexOf(this)); + trace(Registry.GAMESTATE.members.indexOf(this)); + trace(Registry.GAMESTATE.bg_sprites.members.indexOf(this)); + exists=false; + } + if(parent.state !=parent.S_TRANSITION){ + Registry.sound_data.dash_pad_2.play(); + } + if(frame==H_UP_OFF){ + frame=H_UP_ON; + } else if(frame==V_UP_OFF){ + frame=V_UP_ON; + } else if(frame==H_DOWN_OFF){ + frame=H_DOWN_ON; + + } else if(frame==V_DOWN_OFF){ + frame=V_DOWN_ON; + } + is_active=true; + } + } + + private function set_frame(stepped_on:Bool):Void { + if(stepped_on){ + if(frame==H_UP_OFF){ + Registry.sound_data.button_down.play(); + frame=H_DOWN_OFF; + } else if(frame==H_UP_ON){ + Registry.sound_data.button_down.play(); + frame=H_DOWN_ON; + } else if(frame==V_UP_OFF){ + Registry.sound_data.button_down.play(); + frame=V_DOWN_OFF; + } else if(frame==V_UP_ON){ + Registry.sound_data.button_down.play(); + frame=V_DOWN_ON; + } + } else { + if(frame==H_DOWN_OFF){ + Registry.sound_data.button_up.play(); + frame=H_UP_OFF; + } else if(frame==H_DOWN_ON){ + Registry.sound_data.button_up.play(); + frame=H_UP_ON; + } else if(frame==V_DOWN_OFF){ + Registry.sound_data.button_up.play(); + frame=V_UP_OFF; + } else if(frame==V_DOWN_ON){ + Registry.sound_data.button_up.play(); + frame=V_UP_ON; + } + } + } + + // changes facing(to tell platform where to move next), dust state, + // etc + private function reset_moving_props():Void + { + is_propelling=false; + is_active=false; + if(facing==UP){ + facing=DOWN; + } else if(facing==DOWN){ + facing=UP; + } else if(facing==LEFT){ + facing=RIGHT; + } else { + facing=LEFT; + } + if(frame==H_UP_ON || frame==H_DOWN_ON || frame==H_DOWN_OFF || frame==H_UP_OFF){ + frame=H_UP_OFF; + } else { + frame=V_UP_OFF; + } + showed_dust_poof=false; + dust_poof.visible=false; + velocity.x=velocity.y=0; + is_first_movement=!is_first_movement; + } + + public function set_velocity():Void { + switch(facing){ + case UP:player.additional_y_vel=velocity.y=-Propel_Speed;break; + case DOWN:player.additional_y_vel=velocity.y=Propel_Speed;break; + case RIGHT:player.additional_x_vel=velocity.x=Propel_Speed;break; + case LEFT:player.additional_x_vel=velocity.x=-Propel_Speed;break; + } + } + + public function propel_from_dust_poof():Void { + is_propelling=true; + } + + //Called by stop markers when they overlap this moving platform. + public function stop_from_stop_marker(stop_marker:Stop_Marker):Void { + if(is_first_movement){ + x=stop_marker.x; + y=stop_marker.y; + reset_moving_props(); + } + } + + override public function destroy():Void + { + dust_poof=null; + init_pt=null; + parent.bg_sprites.remove(this, true); + parent.bg_sprites.remove(active_region, true); + parent.bg_sprites.remove(dust_poof, true); + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/SinglePushBlock.hx b/intra/source/entity/gadget/SinglePushBlock.hx new file mode 100644 index 0000000..6bc4347 --- /dev/null +++ b/intra/source/entity/gadget/SinglePushBlock.hx @@ -0,0 +1,152 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Player; +import flash.geom.Point; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import org.flixel.FlxG; +import global.Registry; +/** + * Single push blocks...push em from one direction, they move a tile. yeah WHAT + * @author seagaia + */ +class SinglePushBlock extends FlxSprite +{ + private var dir:Int; + private var hasBeenPushed:Bool=false; + private var sound_played:Bool=false; + private var distanceToGo:Int=Registry.TILE_HEIGHT; + private var startedMoving:Bool=false; + public var type:String="SinglePushBlock"; + public var xml:XML; + public var sentinel:FlxSprite=new FlxSprite(0, 0); + public var timeToPush:Float=0.3; + public var initial_coords:Point=new Point(); + public var MOVE_VEL:Int=24; + public var INCREMENTED_REG:Bool=false; + public var BEDROOM_INDEX:Int=4; + public var STREET_INDEX:Int=5; + public var cid:Int=CLASS_ID.SINGLEPUSHBLOCK; + + private var is_non_puzzle:Bool=false; + //[Embed(source="../../res/sprites/gadgets/pushyblocks.png")] public var C_PUSH_BLOCKS:Class; + + public var player:Player; +//frame mod 4 determines direction + + public function new(_x:Int, _y:Int, _xml:XML, _p:Player) + { + super(_x, _y); + initial_coords.x=x; + initial_coords.y=y; + xml=_xml; + switch(parseInt(xml.@frame)% 4){ + case 0:dir=FlxObject.UP;break; + case 1:dir=FlxObject.DOWN;break; + case 2:dir=FlxObject.LEFT;break; + case 3:dir=FlxObject.RIGHT;break; + } + + loadGraphic(C_PUSH_BLOCKS,true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + trace("SET PUSH BLOCK FRAME:", BEDROOM_INDEX); + frame=BEDROOM_INDEX; + } else if(Registry.CURRENT_MAP_NAME=="STREET"){ + frame=STREET_INDEX; + } + + if(parseInt(xml.@type)==1){ + is_non_puzzle=true; + } + immovable=true; + createSentinel(); + player=_p; + + } + + override public function update():Void { + + + if(FlxG.collide(player, this)){ + if(player.overlaps(sentinel))startMoving(); + } + + if(timeToPush<0){ + if(!sound_played){ + hasBeenPushed=true; + Registry.sound_data.push_block.play(); + sound_played=true; + } + switch(dir){ + case FlxObject.UP: + velocity.y=-MOVE_VEL; + break; + case FlxObject.DOWN: + velocity.y=MOVE_VEL; + break; + case FlxObject.RIGHT: + velocity.x=MOVE_VEL; + break; + case FlxObject.LEFT: + velocity.x=-MOVE_VEL; + break; + } + } + + if(Math.abs(x - initial_coords.x)>=16 || Math.abs(y - initial_coords.y)>=16){ + if(!INCREMENTED_REG){ + if(!is_non_puzzle){ + Registry.GRID_PUZZLES_DONE++; + } + INCREMENTED_REG=true; + } + if((x - initial_coords.x)>16){ + x=initial_coords.x + 16; + } else if((x - initial_coords.x)<-16){ + x=initial_coords.x - 16; + } + + if((y - initial_coords.y>16)){ + y=initial_coords.y + 16; + } else if((y - initial_coords.y)<-16){ + y=initial_coords.y - 16; + } + velocity.x=velocity.y=0; + } + + if(!startedMoving)timeToPush=0.3; + startedMoving=false; + super.update(); + } + + public function startMoving():Void { + if(hasBeenPushed)return; + timeToPush -=FlxG.elapsed; + startedMoving=true; + } + + public function createSentinel():Void { + sentinel.makeGraphic(4, 2, 0xFF022000); + sentinel.visible=false; + switch(dir){ + case FlxObject.DOWN: + sentinel.x=x + Registry.TILE_WIDTH / 2 - 2; + sentinel.y=y - 2; + break; + case FlxObject.UP: + sentinel.x=x + Registry.TILE_WIDTH / 2 - 2; + sentinel.y=y + Registry.TILE_WIDTH + 2; + break; + case FlxObject.LEFT: + sentinel.x=x + Registry.TILE_WIDTH + 2; + sentinel.y=y + Registry.TILE_WIDTH / 2; + break; + case FlxObject.RIGHT: + sentinel.x=x - 2; + sentinel.y=y + Registry.TILE_WIDTH / 2; + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Stop_Marker.hx b/intra/source/entity/gadget/Stop_Marker.hx new file mode 100644 index 0000000..8569b3a --- /dev/null +++ b/intra/source/entity/gadget/Stop_Marker.hx @@ -0,0 +1,40 @@ +package entity.gadget +{ +import data.CLASS_ID; +import global.Registry; +import org.flixel.FlxSprite; + +/** + * Interacts with Propelled, stops them on a dime + * @author Seagaia + */ +class Stop_Marker extends FlxSprite +{ + public var xml:XML; + + public var cid:Int=CLASS_ID.STOP_MARKER; + + public var parent:Dynamic; + + public function new(_xml:XML,_parent:Dynamic) + { + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + makeGraphic(16, 16, 0x69386243); + visible=false; + parent=_parent; + immovable=true; + solid=false; + } + + + override public function update():Void + { + for(var propelled:Propelled in Registry.subgroup_propelled){ + if(propelled.is_propelling && Math.abs(x - propelled.x)<=2 && Math.abs(y - propelled.y)<=2){ + propelled.stop_from_stop_marker(this); + } + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Switch_Pillar.hx b/intra/source/entity/gadget/Switch_Pillar.hx new file mode 100644 index 0000000..1cbc4f4 --- /dev/null +++ b/intra/source/entity/gadget/Switch_Pillar.hx @@ -0,0 +1,81 @@ +package entity.gadget +{ +import entity.player.Player; +import flash.media.Video; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Switch_Pillar extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + public var up_frame:Int; + public var down_frame:Int; + + private var original_state:Bool=false; + + //[Embed(source="../../res/sprites/dame/dame-switch-pillar.png")] public var switch_pillar_sprite:Class; + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(switch_pillar_sprite, true, false, 16, 16); + + var dame_frame:Int=parseInt(xml.@frame); + if(dame_frame<2){ + up_frame=0; + down_frame=1; + } + + if(dame_frame % 2){ + if(Registry.pillar_switch_state){ + frame=down_frame; + } else { + frame=up_frame; + } + } else { + if(!Registry.pillar_switch_state){ + frame=down_frame; + } else { + frame=up_frame; + } + } + addAnimation("dissolve", [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1], 15,false); + + addAnimation("solidify", [1,14,13,12,11,10,9,8,7,6,5,4,0], 15,false); + original_state=Registry.pillar_switch_state; + Registry.subgroup_switch_pillars.push(this); + immovable=true; + } + + override public function update():Void { + if(frame==up_frame){ + FlxG.collide(this, player); + } + + if(original_state !=Registry.pillar_switch_state){ + + play_sfx(HURT_SOUND_NAME); + if(frame==up_frame){ + Registry.sound_data.dash_pad_1.play(); + play("dissolve"); + } else { + Registry.sound_data.dash_pad_2.play(); + play("solidify"); + } + original_state=Registry.pillar_switch_state; + } + super.update(); + } +} \ No newline at end of file diff --git a/intra/source/entity/gadget/Treasure.hx b/intra/source/entity/gadget/Treasure.hx new file mode 100644 index 0000000..06df0ef --- /dev/null +++ b/intra/source/entity/gadget/Treasure.hx @@ -0,0 +1,396 @@ +package entity.gadget +{ +import data.CLASS_ID; +import entity.player.Broom; +import entity.player.HealthBar; +import entity.player.Player; +import global.Keys; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import global.Registry; +import data.SoundData; +import states.PauseState; +/** + * @author Seagaia + */ + +class Treasure extends FlxSprite +{ + //[Embed(source="../../res/sprites/gadgets/treasureboxes.png")] public static var S_TREASURE_SPRITE:Class; + //[Embed(source="../../res/sprites/inventory/item_jump_shoes.png")] public static var embed_jump_shoes:Class; + //[Embed(source="../../res/sprites/inventory/item_long_attack.png")] public static var embed_long_attack:Class; + //[Embed(source="../../res/sprites/inventory/item_wide_attack.png")] public static var embed_wide_attack:Class; + //[Embed(source="../../res/sprites/inventory/item_tranformer.png")] public static var embed_transformer:Class; + //[Embed(source="../../res/sprites/menu/secret_trophies.png")] public static inline var embed_secret_trophies:Class; + public var CLOSED_BEDROOM:Int=0; + public var OPEN_BEDROOM:Int=1; + public var CLOSED_STREET:Int=0; + public var OPEN_STREET:Int=1; + + + public var xml:XML; + public var parent:Dynamic; + public var CONTENT:Int; + public var item:FlxSprite; + public var item_flicker_timer:Float=1; + public var item_flickered:Bool=false; + + public var cid:Int=CLASS_ID.TREASURE; + public var active_region:FlxSprite=new FlxSprite; + /* These reference the frame of the DAME object, and let the PlayState know what item to grant + * to the player. */ + public static inline var IDX_BROOM:Int=0; + public static inline var IDX_KEY:Int=1; + public static inline var IDX_GROWTH:Int=2; + private var start_growth_anim:Bool=false; + private var ctr:Int=0; + private var t:Float=0; + + + public static inline var IDX_JUMP:Int=3; + public static inline var IDX_WIDE:Int=4; + public static inline var IDX_LONG:Int=5; + public static inline var IDX_SWAP:Int=6; + + public static inline var IDX_goldenpoo:Int=7; + public static inline var IDX_can_of_spam:Int=8; + public static inline var IDX_missingno:Int=9; + public static inline var IDX_aus_heart:Int=10; + public static inline var IDX_electric:Int=11; + public static inline var IDX_kittystatue:Int=12; + public static inline var IDX_melos:Int=13; + public static inline var IDX_marina:Int=14; + public static inline var IDX_black:Int=15; + public static inline var IDX_red:Int=16; + public static inline var IDX_green:Int=17; + public static inline var IDX_blue:Int=18; + public static inline var IDX_white:Int=19; + + public static inline var IDX_SECRETS_MAX:Int=40; + + public static inline var IDX_NOTHING:Int=100; + + public function new(_x:Int, _y:Int, _xml:XML, _parent:Dynamic) + { + super(_x, _y); + + parent=_parent; + xml=_xml; + immovable=true; + loadGraphic(S_TREASURE_SPRITE, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + frame=CLOSED_BEDROOM; + } else if(Registry.CURRENT_MAP_NAME=="STREET"){ + frame=CLOSED_STREET; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + frame=4; + } + CONTENT=xml.@frame; + item=new FlxSprite(x, y); + if(CONTENT>=IDX_goldenpoo && CONTENT<=IDX_SECRETS_MAX){ + item.loadGraphic(embed_secret_trophies, true, false, 16, 16); + } + switch(CONTENT){ + case IDX_BROOM: + item.loadGraphic(Broom.Icon_Broom_Sprite, false, false, 16, 16); + break; + case IDX_KEY: + item.loadGraphic(Key.C_KEY_SPRITE, false, false, 16, 16); + break; + case IDX_GROWTH: + item.loadGraphic(PauseState.card_sheet_embed, false, false, 24, 24); + item.frame=get_card_frame(); + item.scale.x=0.5; + item.scale.y=0.5; + item.x -=4; + if(xml !=null && xml.@alive=="false"){ + Registry.card_states[item.frame]=1; + } + // oops + if(xml.@alive=="false" && item.frame !=uint.MAX_VALUE){ + if(Registry.card_states[item.frame]==0){ + Registry.nr_growths++; + Registry.card_states[item.frame]=1; + } + } + if(item.frame==uint.MAX_VALUE){ + item.makeGraphic(16, 16, 0xffff0000); + } + trace("Loading card with frame ", item.frame); + + if(item.frame==Registry.CARD_GOLDMAN_IDX && Registry.GE_States[Registry.GE_tradequesthelpedshopkeeper] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]){ + CONTENT=IDX_NOTHING; + } + break; + case IDX_LONG: + item.loadGraphic(embed_long_attack, false, false, 16, 16); + break; + case IDX_WIDE: + item.loadGraphic(embed_wide_attack, false, false, 16, 16); + break; + case IDX_JUMP: + item.loadGraphic(embed_jump_shoes, false, false, 16, 16); + break; + case IDX_SWAP: + item.loadGraphic(embed_transformer, false, false, 16, 16); + break; + case IDX_goldenpoo: + item.frame=0;break; + case IDX_can_of_spam: + item.frame=1;break; + case IDX_missingno: + item.frame=2;break; + case IDX_kittystatue: + item.frame=5;break; + case IDX_aus_heart: + item.frame=3;break; + case IDX_electric: + item.frame=4;break; + case IDX_melos: + item.frame=6;break; + case IDX_marina: + item.frame=7;break; + case IDX_black: + item.frame=8;break; + case IDX_red: + item.frame=9;break; + case IDX_green: + item.frame=10;break; + case IDX_blue: + item.frame=11;break; + case IDX_white: + item.frame=12;break; + default: + item.makeGraphic(16, 16, 0xff00ff00); + break; + } + item.visible=false; + + if(xml.@alive=="false"){ + frame++; + } + + active_region.makeGraphic(10, 3, 0x00000000); + active_region.x=x + 3; + active_region.y=y + 16; + + Registry.subgroup_interactives.push(this); + } + + private function get_card_frame():Int { + var _x:Int; + var _y:Int; + if(Registry.is_playstate){ + _x=Registry.CURRENT_GRID_X; + _y=Registry.CURRENT_GRID_Y; + } else { + _x=parseInt(xml.@x); + _y=parseInt(xml.@y); + } + + var a:Array=PauseState.card_data[Registry.CURRENT_MAP_NAME]; + for(var o:Dynamic in a){ + if(_x==o.x && _y==o.y){ + return o.id; + } + } + return -1; + } + + private var dont_do_shit:Bool=false; + override public function update():Void { + if(item.visible){ + if(CONTENT==IDX_GROWTH && !start_growth_anim){ + if(item.frame !=uint.MAX_VALUE){ + if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + Registry.card_states[48]=1; + Achievements.unlock(Achievements.A_GET_49TH_CARD); + } else { + Registry.card_states[item.frame]=1; + } + parent.player.state=parent.player.S_GROUND; + } + + + start_growth_anim=true; + + } else if(CONTENT==IDX_NOTHING){ + item.visible=false; + Registry.GAMESTATE.player.be_idle(); + //DH.dialogue_popup("Goldman:What? It's not there? That shopkeeper must have stolen it!"); + DH.dialogue_popup_misc_any("treasure", 10); + + } else if(CONTENT !=IDX_GROWTH){ + EventScripts.send_property_to(item, "y", y - 16, 0.5) + + if(!item_flickered){ + parent.player.state=parent.player.S_GROUND; + item_flickered=true; + item.flicker(item_flicker_timer); + } + if(!item.flickering)item.visible=false; + } + } + + + FlxG.collide(parent.player, this); + if(frontTouches(parent.player)&& Registry.keywatch.JP_ACTION_1 && xml.@alive=="true"){ + if(Registry.CURRENT_MAP_NAME=="WINDMILL" && Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + dont_do_shit=true; + //DH.dialogue_popup("Some strange force stops this treasure box from being opened."); + DH.dialogue_popup(DH.lk("treasure",0)); + } + if(dont_do_shit)return; + parent.player.update_player_inventory(this); + item.visible=true; + parent.player.state=parent.player.S_INTERACT; + Registry.sound_data.get_treasure.play(); + Achievements.is_200_percent(); + if(CONTENT==IDX_BROOM){ + Registry.bound_item_1="BROOM"; + //DH.dialogue_popup("An engraving on the broom handle reads:\"Press " + Registry.controls[Keys.IDX_ACTION_1] + " to sweep.\""); + DH.dialogue_popup(DH.lk("treasure", 1)+ " " + Registry.controls[Keys.IDX_ACTION_1] + " " + DH.lk("treasure", 2)); + + } else if(CONTENT==IDX_KEY && Registry.CURRENT_MAP_NAME=="STREET"){ + //DH.dialogue_popup("This key may be used a single time to open up a locked barrier."); + DH.dialogue_popup_misc_any("treasure", 3); + } else if(CONTENT==IDX_JUMP){ + Registry.bound_item_2="JUMP"; + //DH.dialogue_popup("A mysterious pair of boots has nothing but the branding on it, which says \"Press " + Registry.controls[Keys.IDX_ACTION_2]+"\"."); + DH.dialogue_popup(DH.lk("treasure", 4)+ " " + Registry.controls[Keys.IDX_ACTION_2] + " " + DH.lk("treasure", 5)); + } else if(CONTENT==IDX_WIDE){ + //DH.dialogue_popup("A few words on the broom extension read \"Equip the WIDEN upgrade in the menu to have the broom release harmful dust to the left and right.\""); + DH.dialogue_popup_misc_any("treasure", 6); + } else if(CONTENT==IDX_LONG){ + //DH.dialogue_popup("A few words on the broom extension read \"Equip the EXTEND upgrade in the menu for the broom to release harmful dust in front of the broom's normal reach.\""); + DH.dialogue_popup_misc_any("treasure", 7); + } else if(CONTENT==IDX_SWAP){ + //DH.dialogue_popup("A note next to the broom extension:\"Hello, Young. Use this SWAP upgrade on two tiles to switch their places. It may be a while before you can use this everywhere, but it should serve you well for the time being.\""); + DH.dialogue_popup_misc_any("treasure", 8); + } else if(CONTENT==IDX_goldenpoo){ + Registry.inventory[Registry.IDX_POO]=true; + Achievements.unlock(Achievements.A_GET_GOLDEN_POO); + } else if(CONTENT==IDX_can_of_spam){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_SPAM]=true; + } else if(CONTENT==IDX_electric){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_ELECTRIC]=true; + } else if(CONTENT==IDX_missingno){ + Achievements.unlock(Achievements.Trophy_1); + Registry.inventory[Registry.IDX_MISSINGNO]=true; + } else if(CONTENT==IDX_aus_heart){ + DH.dialogue_popup_misc_any("treasure", 9); + //DH.dialogue_popup("YOU FOUND A HEART!!! Maximum Health increased by...zero."); + Registry.inventory[Registry.IDX_AUS_HEART]=true; + } else if(CONTENT==IDX_kittystatue){ + Registry.inventory[Registry.IDX_KITTY]=true; + } else if(CONTENT==IDX_marina){ + Registry.inventory[Registry.IDX_MARINA]=true; + } else if(CONTENT==IDX_melos){ + Registry.inventory[Registry.IDX_MELOS]=true; + }else if(CONTENT==IDX_black){ + Registry.inventory[Registry.IDX_BLACK]=true; + if(Registry.inventory[Registry.IDX_WHITE]){ + Achievements.unlock(Achievements.A_GET_BW_CUBES); + } + }else if(CONTENT==IDX_red){ + Registry.inventory[Registry.IDX_RED]=true; + Achievements.unlock(Achievements.A_GET_RED_CUBE); + }else if(CONTENT==IDX_green){ + Registry.inventory[Registry.IDX_GREEN]=true; + Achievements.unlock(Achievements.A_GET_GREEN_CUBE); + }else if(CONTENT==IDX_blue){ + Registry.inventory[Registry.IDX_BLUE]=true; + Achievements.unlock(Achievements.A_GET_BLUE_CUBE); + }else if(CONTENT==IDX_white){ + Registry.inventory[Registry.IDX_WHITE]=true; + if(Registry.inventory[Registry.IDX_BLACK]){ + Achievements.unlock(Achievements.A_GET_BW_CUBES); + } + } + + if(CONTENT>=IDX_goldenpoo && CONTENTRegistry.CURRENT_GRID_Y * 160 + 20 + 80){ + item.y -=(24 * FlxG.elapsed); + } else { + item.y +=(24 * FlxG.elapsed); + } + if(item.scale.x>=1){ + item.scale.x=item.scale.y=1; + ctr++; + } + break; + case 2: + t +=FlxG.elapsed; + if(t>1){ + t=0; + ctr++; + if(item.y>Registry.CURRENT_GRID_Y * 160 + 20 + 80){ + item.acceleration.y=-80; + item.angularVelocity=50; + item.angularAcceleration=200; + } else { + item.acceleration.y=80; + item.angularVelocity=-50; + item.angularAcceleration=-200; + + } + } + break; + case 3: + item.scale.x +=FlxG.elapsed*3; + item.scale.y +=FlxG.elapsed*3; + item.alpha -=FlxG.elapsed / 2; + if(item.alpha<=0){ + item.visible=false; + ctr++; + } + break; + } + + } + + public function frontTouches(o:FlxSprite):Bool { + return(o.x>=(x - Registry.TILE_WIDTH / 2)&& o.x<=(x + Registry.TILE_WIDTH / 2)&& + o.y<=(y + Registry.TILE_WIDTH + 2)&& o.y>=(y + Registry.TILE_WIDTH - 3)); + } + + override public function destroy():Void + { + super.destroy(); + if(active_region !=null)active_region.destroy(); + active_region=null; + item=null; + } + + + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Black_Thing.hx b/intra/source/entity/interactive/Black_Thing.hx new file mode 100644 index 0000000..c9972db --- /dev/null +++ b/intra/source/entity/interactive/Black_Thing.hx @@ -0,0 +1,198 @@ +package entity.interactive +{ +import entity.enemy.bedroom.Sun_Guy; +import entity.interactive.npc.Forest_NPC; +import flash.geom.Point; +import global.Registry; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxMath; + + +/** + * uses multiple draw calls to make a black square with other + * black squares that do silly things via sin/linear Interpolation + * + * FUN CLASS PROJECT make a class thing to hold timer/state/etc states and + * do this all with wrapper functions + */ + + +class Black_Thing extends AnoSprite +{ + + private var is_green:Bool=false; + + public function new(a:Array) + { + super(a); + + make_sin_table_180(); + makeGraphic(32, 32, 0xff000000); + + if(Registry.CURRENT_MAP_NAME=="FOREST"){ + is_green=true; + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, 16); + addAnimation("walk", [32, 33], 4); + play("walk"); + x=tl.x; + } + } + + private var dumct:Int=0; + private var t_yell:Float=0; + private var t_lol:Float=0; + + override public function update():Void + { + + if(is_green){ + if(x>tl.x + 80 && xtl.x + 160){ + Registry.GRID_PUZZLES_DONE=2; + } + + t_yell +=FlxG.elapsed; + if(t_yell>0.5){ + Registry.sound_data.play_sound_group(Registry.sound_data.rat_move); + t_yell=0; + } + + t_lol +=FlxG.elapsed; + if(x1){ + x +=1; + t_lol=0; + } + } else { // ~100 minutes + if(t_lol>80){ + t_lol=0; + x +=1; + } + } + //if(FlxG.keys.J){ + //t_lol=90; + //} + if(player.velocity.x !=0 || player.velocity.y !=0){ + x -=1; + } + super.update(); + return; + } + + if(player.overlaps(this)&& Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.fall_in_hole.play(); + dumct++; + if(dumct>50){ + mm1.y=10; + mm2.y=12; + mm3.y=9; + Registry.GRID_PUZZLES_DONE++; + } + } + super.update(); + } + + + private var scale1:Float=0.5; + private var mm1:Point=new Point(0.5, 2); + + private var scale2:Float=2; + private var mm2:Point=new Point(0.5, 2); + + private var scale3:Float=3; + private var mm3:Point=new Point(0.75, 3); + + + + private var state1:Int=0; + private var state2:Int=0; + private var state3:Int=0; + + private var t3:Float=0; + private var t3_m:Float=1; + + // vals between 0 and 1 + private var sin_table_180:Array; + + public function make_sin_table_180():Void { + sin_table_180=new Array; + for(i in 0...180){ + sin_table_180.push((1 + Math.sin((i / 180.0)* 6.28))/2); + } + } + + private var rate:Float=0.03; + override public function draw():Void + { + if(is_green){ + super.draw(); + return; + } + alpha=0.25; + color=0xff0000; + + scale.x=scale.y=scale1; + + + + if(state1==0){ + scale1 +=rate; + if(scale1>mm1.y){ + state1=1; + } + } else if(state1==1){ + scale1 -=rate; + if(scale1mm2.y){ + state2=1; + } + } else if(state2==1){ + scale2 -=rate; + if(scale2t3_m){ + t3=0; + } + + scale3=sin_table_180[int(180 *(t3 / t3_m))] *(mm3.y - mm3.x)+ mm3.x; + + angle=get_sin_table_180(t3, t3_m, -90, 90); + super.draw(); + + color=0x000000; + angle=0; + scale.x=scale.y=1; + alpha=0.3; + super.draw(); + } + + public function get_sin_table_180(t:Float,tm:Float,min:Float,max:Float):Float { + return sin_table_180[int(180 *(t3 / t3_m))] *(max - min)+ min; + } +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Dungeon_Statue.hx b/intra/source/entity/interactive/Dungeon_Statue.hx new file mode 100644 index 0000000..064faee --- /dev/null +++ b/intra/source/entity/interactive/Dungeon_Statue.hx @@ -0,0 +1,88 @@ +package entity.interactive +{ +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + +/** + * Statues that block the ways out of the first 3 dungeons. + * If key not picked up, also spawns a key that does a little flashy nimation + */ +class Dungeon_Statue extends FlxSprite +{ + + //[Embed(source="../../res/sprites/npcs/big_statue.png")] public static var statue_bedroom_embed:Class; + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var active_region:FlxObject; + public function new(_p:Player,_pa:Dynamic,_xml:XML) + { + xml=_xml; + parent=_pa; + player=_p; + super(parseInt(xml.@x), parseInt(xml.@y)); + immovable=true; + active_region=new FlxObject(x, y, 34, 20); + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + y -=32; + } + break; + case "REDCAVE": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + frame=1; + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + x +=32; + } + break; + + case "CROWD": + loadGraphic(statue_bedroom_embed, false, false, 32, 48); + frame=2; + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + x +=32; + } + break; + } + + width=30; + height=16; + offset.x=1; + x +=1; + offset.y=32; + y +=32; + Registry.subgroup_interactives.push(this); + + } + + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==1){ + DH.start_dialogue(DH.name_dungeon_statue, DH.scene_dungeon_statue_bedroom_two); + } else { + DH.start_dialogue(DH.name_dungeon_statue, DH.scene_dungeon_statue_bedroom_one); + } + } + super.update(); + } + + override public function destroy():Void + { + + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Elevator.hx b/intra/source/entity/interactive/Elevator.hx new file mode 100644 index 0000000..9a7f907 --- /dev/null +++ b/intra/source/entity/interactive/Elevator.hx @@ -0,0 +1,223 @@ +package entity.interactive +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.ControlsState; +import states.PauseState; + +/** + * logic for the elevator in hotel. + */ +class Elevator extends FlxSprite +{ + + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + + private var locations:Array=new Array(new Point(1344, 1360), new Point(1344, 560), new Point(384, 1840), new Point(384, 880)); + + private var state:Int=0; + private var s_closed:Int=0; + private var s_player_leaving:Int=1; + private var s_open:Int=2; + private var s_menu:Int=3; + private var s_leaving:Int=4; + + + + private var did_init:Bool=false; + + private var open_sensor:FlxSprite; + private var menu_sensor:FlxSprite; + + private var OPEN_FRAME:Int=3; + private var CLOSED_FRAME:Int=0; + + public var text:FlxBitmapFont; + public var menu:FlxSprite; + public var selector:FlxSprite; + public var selector_idx:Int=0; + public var line_height:Int=8; + public var min_selector_idx:Int=0; + public var max_selector_idx:Int=4; + public var choices:Array=new Array(); + + private var floor:Int; + + //[Embed(source="../../res/sprites/gadgets/elevator.png")] public static var Elevator_Sprite:Class; + + + public function new(_xml:XML,_player:Player,_parent:Dynamic) + { + xml=_xml; + player=_player; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + /* Elevator anims */ + loadGraphic(Elevator_Sprite, true, false, 32, 32); + addAnimation("open", [0, 1, 2, 3], 12, false); + addAnimation("close", [3, 2, 1, 0], 12, false); + + frame=CLOSED_FRAME; + state=s_closed; + } + + override public function update():Void + { + if(!did_init){ // o god + did_init=true; + + open_sensor=new FlxSprite(x, y + 32); + open_sensor.makeGraphic(32, 32, 0xff992912); + + menu_sensor=new FlxSprite(x, y); + menu_sensor.makeGraphic(32, 20, 0xff991144); + + menu_sensor.visible=open_sensor.visible=false; + + menu=new FlxSprite(15, Registry.HEADER_HEIGHT + 20); + menu.loadGraphic(ControlsState.S_CONTROLS, false, false, 135, 125); + + //text=EventScripts.init_bitmap_font("Floor?\n", "center", menu.x + 12, menu.y + 4, null, "apple_white"); + text=EventScripts.init_bitmap_font(DH.lk("elevator",0)+"\n", "center", menu.x + 12, menu.y + 4, null, "apple_white"); + text.drop_shadow=true; + text.x=menu.x + 46; + text.y=menu.y + 34; + + + + floor=1; + + for(var point:Point in locations){ + if(x==point.x && y==(point.y + Registry.HEADER_HEIGHT)){ + break; + } + floor++; + } + + if(floor !=1){ text.text +=DH.lk("elevator",1);choices.push(1);} + if(floor !=2){ text.text +=DH.lk("elevator",2);choices.push(2);} + if(floor !=3){ text.text +=DH.lk("elevator",3);choices.push(3);} + if(floor !=4){ text.text +=DH.lk("elevator",4);choices.push(4);} + + + text.text +=DH.lk("elevator",5); + + selector=new FlxSprite(menu.x, menu.y); + selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + selector.addAnimation("a", [2, 3], 6, true); + selector.play("a"); + + text.scrollFactor=selector.scrollFactor=menu.scrollFactor=new FlxPoint(); + + parent.bg_sprites.add(open_sensor); + parent.bg_sprites.add(menu_sensor); + parent.fg_sprites.add(menu); + parent.fg_sprites.add(text); + parent.fg_sprites.add(selector); + + menu.visible=text.visible=selector.visible=false; + + } + + if(state==s_closed){ + if(player.overlaps(open_sensor)){ + play("open"); + Registry.sound_data.elevator_open.play(); + state=s_open; + } else if(player.overlaps(menu_sensor)){ + state=s_menu; + menu.visible=text.visible=selector.visible=true; + selector_idx=1; + selector.y=text.y + line_height; + selector.x=text.x - line_height; + if(DH.isZH()){ + selector.y +=8; + selector.x +=22; + } + player.frame=player.offset.y=player.velocity.x=player.velocity.y=0; + + player.offset.y=player.DEFAULT_Y_OFFSET; + player.invincible_timer=400000; + player.invincible=true; + } + } else if(state==s_open){ + if(!player.overlaps(open_sensor)){ + play("close"); + Registry.sound_data.elevator_close.play(); + state=s_closed; + } + } else if(state==s_menu){ + player.state=player.S_INTERACT; + if(Registry.keywatch.JP_DOWN &&(selector_idxmin_selector_idx + 1)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + selector.y -=line_height; + if(DH.isZH())selector.y -=4; + selector_idx--; + } else if(Registry.keywatch.JP_ACTION_1){ + menu.visible=text.visible=selector.visible=false; + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + if(selector_idx==max_selector_idx){ //cancel + state=s_leaving; + player.invincible_timer=0; + play("open"); + player.offset.y=player.DEFAULT_Y_OFFSET; + Registry.sound_data.elevator_open.play(); + } else { // move + Registry.ENTRANCE_PLAYER_X=locations[choices[selector_idx -1] - 1].x + 8; + Registry.ENTRANCE_PLAYER_Y=locations[choices[selector_idx -1] - 1].y + Registry.HEADER_HEIGHT + 30; + parent.SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="HOTEL"; + player.state=player.S_GROUND; + } + } + + } else if(state==s_leaving){ + player.state=player.S_GROUND; + if(!player.overlaps(menu_sensor)){ + state=s_open; + } + } + + //if elevator event triggered, go to "arrived closed" state, blocking event, open doors, move player out, go to open + + //normal: + // stay closed until player is close enough(cloed state) + // do open animation, either go back to close or:(open state) + // if player steps inside, freeze the controls, close the door(state) + // -->pop up menu with the other 3 floors and CANCEL, if chosen, do the transition, if CNACEL: + // -->open doors, move player out and give back control(return to closed).(blocking event) + + super.update(); + } + + private function move_player_out():Bool { + return false; + } + + // -1:exit, 0:ongoing, 1, 2, 3, 4 - floor change + private function menu_state():Int { + return 0; + } + + override public function destroy():Void + { + + super.destroy(); + text=null; + menu=menu_sensor=selector=open_sensor=null; + } +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Fisherman.hx b/intra/source/entity/interactive/Fisherman.hx new file mode 100644 index 0000000..db3c33c --- /dev/null +++ b/intra/source/entity/interactive/Fisherman.hx @@ -0,0 +1,81 @@ +package entity.interactive +{ +import data.CLASS_ID; +import entity.player.Player; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Fisherman extends FlxSprite +{ + + public var player:Player; + public var xml:XML; + public var cid:Int=CLASS_ID.FISHERMAN; + + private var state:Int=0; + private var s_normal:Int=0; + private var s_dying:Int=1; + private var s_dead:Int=2; + + public static var fisherman_dead:Bool=false; + public function new(_xml:XML, _player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + loadGraphic(NPC.embed_beach_npcs, true, false, 16, 16); + immovable=true; + health=2; + player=_player; + addAnimation("idle", [10,11], 3, true); + addAnimation("dead", [12], 3, true); + play("idle"); + if(xml.@alive=="false"){ + fisherman_dead=true; + x -=5000;//fuck it + exists=false; + } + } + + override public function update():Void + { + FlxG.collide(player, this); + switch(state){ + case s_normal: + if(!flickering && player.broom.overlaps(this)&& player.broom.visible){ + flicker(0.5); + health--; + } + if(health<=0){ + state=s_dying; + play("dead"); + } + break; + case s_dying: + player.state=player.S_INTERACT; + if(EventScripts.send_property_to(this, "y", parseInt(xml.@y)+ 44, 0.3)){ + state=s_dead; + fisherman_dead=true; + player.state=player.S_GROUND; + + } + break; + case s_dead: + xml.@alive="false"; + if(framePixels_y_push<16){ + framePixels_y_push ++; + } + if(scale.x>0 && scale.y>0){ + scale.x -=0.01; + scale.y -=0.01; + } + break; + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Health_Cicada.hx b/intra/source/entity/interactive/Health_Cicada.hx new file mode 100644 index 0000000..953770d --- /dev/null +++ b/intra/source/entity/interactive/Health_Cicada.hx @@ -0,0 +1,280 @@ +package entity.interactive +{ +import entity.gadget.Checkpoint; +import entity.player.HealthBar; +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +import helper.Achievements; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * ... + * @author Seagaia + */ +class Health_Cicada extends FlxSprite +{ + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + + private var state:Int; + private var s_invisible:Int=0; + private var s_visible:Int=1; + private var s_animating:Int=2; + private var ctr:Int=0; + + + private var logic:Function; + + private var tl:Point; + private var target:Point=new Point; + private var t:Float=0; + private var tm:Float=1.7 ; + private var nr_gnaws:Int=0; + + private var t_sound:Float=0; + + + public var boxes:FlxGroup=new FlxGroup(10); + public var fly_away_distance:Int=80; + + + //[Embed(source="../../res/sprites/inventory/life_cicada.png")] public static var health_cicada_embed:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(health_cicada_embed, true, false, 16, 16); + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("idle", [6,7,6,7,6,6,6,6], 8); + addAnimation("fly", [4,5], 14); + addAnimation("gnaw", [6,7], 14); + } else { + addAnimation("idle", [2, 3, 2, 3, 2, 2, 2, 2], 8); + addAnimation("fly", [0, 1], 14); + addAnimation("gnaw", [2, 3], 14); + } + play("idle"); + width=height=8; + offset.x=offset.y=4; + x +=4; + y +=4; + + visible=false; + + if(Registry.is_playstate){ + tl=new Point; + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + logic=dungeon_logic; + } else { + logic=roam_logic; + } + + if(xml.@alive=="false"){ + exists=false; + } + + for(i in 0...boxes.maxSize){ + var box:FlxSprite=new FlxSprite; + if(i % 2==0){ + box.makeGraphic(4, 4, 0xff000000); + } else { + box.makeGraphic(3, 3, 0xff000000); + } + box.visible=false; + boxes.add(box); + } + } + + + private function dungeon_logic():Void { + if(state==s_visible ||(state==s_animating && ctr<1)){ + Registry.sound_data.cicada_chirp.play(); + } + switch(state){ + case s_invisible: + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + start(tl.x + 72, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="REDCAVE"){ + if(Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]){ + start(tl.x + 90, tl.y + 75, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="CROWD"){ + if(Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + start(tl.x + 70, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="APARTMENT"){ + if(Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]){ + start(tl.x + 50, tl.y + 60, tl.x - 16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="CIRCUS"){ + if(Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]){ + start(tl.x + 70, tl.y + 8 , tl.x - 16, tl.y + 30); + fly_away_distance=160; + } + } else if(Registry.CURRENT_MAP_NAME=="HOTEL"){ + if(Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]){ + start(tl.x + 60, tl.y + 70, tl.x -16, tl.y + 30); + } + } else if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + start(x, y, tl.x - 16, tl.y + 30); + } else if(Registry.CURRENT_MAP_NAME=="BEACH"){ + start(x, y, tl.x - 16, tl.y + 30); + } + + break; + case s_visible://Touch the player, freeze them. + if(ctr==0 && player.overlaps(this)&& player.state==player.S_GROUND){ + state=s_animating; + ctr=0; + play("fly"); + player.state=player.S_INTERACT; + player.be_idle(); + // Or fly away if plaer goes too far + } else if(ctr==1 || EventScripts.distance(player, this)>fly_away_distance){ + play("fly"); + velocity.y=-100; + ctr=1; + alpha -=0.02; + } + break; + case s_animating: + switch(ctr){ + case -1://move to target point + DH.disable_menu(); + var sub_ctr:Int=0; + if(EventScripts.send_property_to(this, "x", target.x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "y", target.y, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr++; + state=s_visible; + play("idle"); + } + break; + case 0://After touched, heal the player + if(player.health_bar.max_health>player.health_bar.cur_health){ + t +=FlxG.elapsed; + if(t>0.5){ + Registry.sound_data.get_small_health.play(); + t=0; + player.health_bar.modify_health(1); + } + } else { //eventually upgrade the health and set a target point in the spot of the new health thing + ctr++; + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + Achievements.unlock(Achievements.Extra_health_1); + } + HealthBar.upgrade_health(player); + player.health_bar.members[player.health_bar.max_health - 1].visible=false; + target.x=player.health_bar.members[player.health_bar.max_health - 1].x + tl.x; + target.y=player.health_bar.members[player.health_bar.max_health - 1].y + tl.y - Registry.HEADER_HEIGHT; + } + break; + case 1://move there then nibble + sub_ctr=0; + if(EventScripts.send_property_to(this, "x", target.x, 0.5))sub_ctr++; + if(EventScripts.send_property_to(this, "y", target.y, 0.5))sub_ctr++; + if(sub_ctr==2){ + ctr++; + play("gnaw"); + boxes.setAll("visible", true); + set_boxes(); + } + break; + case 2:// do the box animation a few more times + for(var b:FlxSprite in boxes.members){ + if(b==null)continue; + b.alpha -=0.005; + } + t +=FlxG.elapsed; + if(t>tm){ + t=0; + set_boxes(); + } + if(nr_gnaws==3){ + ctr++; + player.health_bar.members[player.health_bar.max_health -1].visible=true; + play("fly"); + velocity.y=-40; + xml.@alive="false"; + } + break; + case 3://fade the last boxes out, then disappear after flying off + for(var b2:FlxSprite in boxes.members){ + if(b2==null)continue; + b2.alpha -=0.005; + } + alpha -=0.01; + if(alpha==0){ + DH.enable_menu(); + player.state=player.S_GROUND; + exists=false; + } + break; + } + break; + } + } + + private function set_boxes():Void { + nr_gnaws++; + Registry.sound_data.play_sound_group(Registry.sound_data.four_shooter_pop_group); + for(var box:FlxSprite in boxes.members){ + if(box==null)continue; + box.alpha=1; + box.acceleration.y=50 + 20 * Math.random(); + box.velocity.x=-40 + 80 * Math.random(); + box.velocity.y=10 + 20 * Math.random(); + box.x=x + 6; + box.y=y + 6; + } + } + private function roam_logic():Void { + + } + + private function start(target_x:Int,target_y:Int,start_x:Int,start_y:Int):Void + { + state=s_animating; + visible=true; + target.x=target_x; + target.y=target_y; + x=start_x; + y=start_y; + ctr=-1; + play("fly"); + } + override public function update():Void + { + logic(); + super.update(); + } + + override public function destroy():Void + { + tl=null; + logic=null; + DH.enable_menu(); + Registry.sound_data.cicada_chirp.stop(); + parent.header_group.remove(this, true); + parent.header_group.remove(boxes, true); + boxes=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/interactive/NPC.hx b/intra/source/entity/interactive/NPC.hx new file mode 100644 index 0000000..9b69278 --- /dev/null +++ b/intra/source/entity/interactive/NPC.hx @@ -0,0 +1,1426 @@ +package entity.interactive +{ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.enemy.crowd.Dog; +import entity.enemy.etc.Briar_Boss; +import entity.enemy.hotel.Eye_Boss; +import entity.enemy.suburb.Suburb_Walker; +import entity.gadget.Door; +import entity.interactive.npc.Forest_NPC; +import entity.interactive.npc.Shadow_Briar; +import entity.interactive.npc.Space_NPC; +import entity.interactive.npc.Trade_NPC; +import entity.player.Player; +import flash.filters.BlurFilter; +import flash.geom.Point; +import flash.net.FileFilter; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.S_NPC; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import states.EndingState; +import states.PlayState; +import states.TitleState; + +/** + * ... + * @author Seagaia + */ +class NPC extends FlxSprite +{ + + public var xml:XML; + public var parent:Dynamic; + public var player:Player; + public var active_region:Dynamic; + public var get_dialogue:Function; + public var cid:Int=CLASS_ID.NPC_; + //[Embed(source="../../res/sprites/npcs/npc.png")] public static var npc_spritesheet:Class; + //[Embed(source="../../res/sprites/gadgets/biofilm.png")] public static var npc_biofilm:Class; + //[Embed(source="../../res/sprites/npcs/sage_statue.png")] public static var sage_statue:Class; + //[Embed(source="../../res/sprites/npcs/note_rock.png")] public static var note_rock:Class; + //[Embed(source="../../res/sprites/npcs/cube_kings.png")] public static var embed_cube_kings:Class; + //[Embed(source="../../res/sprites/gadgets/key_green.png")] public static var key_green_embed:Class; + //[Embed(source="../../res/sprites/gadgets/key_sparkle.png")] public static var key_sparkle_embed:Class; + //[Embed(source="../../res/sprites/gadgets/nexus_pad.png")] public static var embed_nexus_pad:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_shell.png")] public static var embed_windmill_shell:Class; + //[Embed(source="../../res/sprites/gadgets/windmill_blade.png")] public static var embed_windmill_blade:Class; + //[Embed(source="../../res/sprites/npcs/cell_bodies.png")] public static var embed_cell_bodies:Class; + //[Embed(source="../../res/sprites/npcs/trade_npcs.png")] public static var embed_trade_npcs:Class; + //[Embed(source="../../res/sprites/npcs/geoms.png")] public static var embed_geoms:Class; + //[Embed(source="../../res/sprites/npcs/easter/randoms.png")] public static var embed_randoms:Class; + //[Embed(source="../../res/sprites/npcs/easter/smoke_red.png")] public static var embed_smoke_red:Class; + //[Embed(source="../../res/sprites/npcs/blue_npcs.png")] public static var embed_blue_npcs:Class; + //[Embed(source="../../res/sprites/npcs/cliffs_npcs.png")] public static var embed_cliff_npcs:Class; + + //[Embed(source="../../res/sprites/npcs/beach_npcs.png")] public static var embed_beach_npcs:Class; + //[Embed(source="../../res/sprites/npcs/hotel_npcs.png")] public static inline var embed_hotel_npcs:Class; + + public var sparkles:FlxGroup=new FlxGroup(3); + + private var t:Float=0; + private var tm:Float=0; + private var ctr:Int=0; + + private var is_key:Bool=false; + private var is_generic:Bool=false; + private var generic_update:Function; + + public var radius:Float=0; + private var rotational_velocity:Float=0.06; + private var did_init:Bool=false; + + private var windmill_blades:Array; + private var windmill_shell:FlxSprite; + private static var windmill_info:Array=new Array(0, 0, 0, 270, 0, 180); + private var windmill_invis:Float=0.1; + + private var distance:Float=0; + private var lonk_bush:FlxSprite; + + private static inline var gen_id_sbr_blocker:Int=0;// Guy blocking way to card / death room in SBR + private static inline var gen_id_happy_event:Int=1;// even marker for happy + private static inline var gen_id_nexus_pad:Int=2; + private static inline var gen_id_windmill_stuff:Int=3; + private static inline var gen_id_cube_kings:Int=4; + private static inline var gen_id_eyeboss_preview:Int=5; + private static inline var gen_id_cliff_dog:Int=6; + private static inline var gen_id_quest_npc:Int=7; + // redcave smoker, apartment thing + private static inline var gen_id_easter_eggs:Int=8;// not a typo + private static inline var gen_id_death_place:Int=9; + private static inline var gen_id_snowman:Int=10; + private static inline var gen_id_go_happy_blocker:Int=11; + private static inline var gen_id_hotelguy:Int=12; + private static inline var gen_id_hamster:Int=13; + private static inline var gen_id_chikapu:Int=14; + private static inline var gen_id_electric:Int=15; + private static inline var gen_id_marvin:Int=16; + private var gen_id_melos:Int=17; + private static inline var gen_id_marina:Int=18; + + + private static var eyeboss_preview_played:Bool=false; +/* dame vars: + * type - name + * */ +private var locked_ticks:Int=0; + + + public function new(_xml:XML,_parent:Dynamic,_player:Player) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + parent=_parent; + player=_player; + xml=_xml; + immovable=true; + switch(xml.@type.toString()){ + //exports from the Generic_NPC sprite in DAME. + // The frame determines what actions it will have. + // The mapping of DAME-frame to NPC is above + case "Cell_Body": + is_generic=true; + loadGraphic(embed_cell_bodies, true, false, 16, 16); + generic_update=gu_cell_body; + active_region=new FlxSprite(x - 2000, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + frame=parseInt(xml.@frame); + + break; + case "generic": + is_generic=true; + switch(parseInt(xml.@frame)){ + case 0:// SBR blocker + xml.@p="2"; + generic_update=gu_suburb_blocker; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Suburb_Walker.embed_suburb_folk, true,false, 16, 16); + addAnimation("walk_d", [0,1], 4, true); + addAnimation("walk_r", [2,3], 4, true); + addAnimation("walk_u", [4,5], 4, true); + addAnimation("walk_l", [6,7], 4, true); + play("walk_d"); + if(xml.@alive=="false"){ + exists=false; + } + break; + case 1: + if(Registry.GE_States[Registry.GE_Happy_Started]){ + exists=false; + + } + generic_update=gu_happy_event; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + makeGraphic(1, 1, 0x00123123); + + break; + case 2: + // NEXUS Pad + generic_update=gu_nexus_pad; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_nexus_pad, true, false, 32, 32); + width=20; + height=16; + offset.y=6;y +=8; + offset.x=8;x +=8; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + addAnimation("on", [3], 12); + addAnimation("off", [2], 12); + } else { + addAnimation("on", [1], 12); + addAnimation("off", [0], 12); + } + play("off"); + break; + case gen_id_windmill_stuff: + + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + generic_update=gu_windmill; + + windmill_blades=new Array(); + for(i in 0...3){ + var blade:FlxSprite=new FlxSprite(0, 0); + blade.loadGraphic(embed_windmill_blade, true, false, 192, 192); + switch(i){ + case 1: + blade.addAnimation("rotate", [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,0, 1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14,15], 20, true); + + blade.play("rotate"); + blade._curFrame=windmill_info[2]; + blade.angle=windmill_info[3]; + break; + case 0: + blade.addAnimation("rotate", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7], 20, true); + blade.play("rotate"); + blade._curFrame=windmill_info[0]; + blade.angle=windmill_info[1]; + break; + case 2: + blade.addAnimation("rotate", [16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], 20, true); + blade.play("rotate"); + blade._curFrame=windmill_info[4]; + blade.angle=windmill_info[5]; + break; + } + blade.visible=false; + // 0:Right, 1:up, 2:left, 3:down + parent.anim_tiles_group.add(blade);// Removed automagically. + windmill_blades.push(blade); + + + } + + windmill_shell=new FlxSprite(0, 0); + windmill_shell.loadGraphic(embed_windmill_shell, false, false, 48, 48); + windmill_shell.x=Registry.CURRENT_GRID_X * 160 + 32; + windmill_shell.y=Registry.CURRENT_GRID_Y * 160 + 20 + 48; + if(Registry.CURRENT_GRID_Y==3)windmill_shell.y -=160; + parent.fg_sprites.add(windmill_shell); + //windmill_shell.visible=false; + var center:Point=new Point(windmill_shell.x + 16, windmill_shell.y + 16); + windmill_blades[0].x=center.x - 16; + windmill_blades[0].y=center.y - 192 + 32; + windmill_blades[1].x=center.x -192 + 32; + windmill_blades[1].y=center.y - 192 + 32; + windmill_blades[2].x=center.x - 192 + 32; + windmill_blades[2].y=center.y - 16; + + makeGraphic(1, 1, 0x00ffffff); + break; + // marina_ANIMS_CUBE_KINGS + case gen_id_cube_kings: + generic_update=gu_cube_kings; + // add anmations ass needed + if(Registry.CURRENT_GRID_X<5){ // "gray" + loadGraphic(Space_NPC.embed_space_npc, true, false, 32,32); + addAnimation("a", [10,11], 4); + play("a"); + ctr=0; + } else { // "color" + loadGraphic(Space_NPC.embed_space_npc, true, false, 32,32); + addAnimation("a", [12,13], 4); + play("a"); + ctr=1; + } + active_region=new FlxSprite(x, y + 30 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(32, 3, 0x0000ff00); + break; + case gen_id_eyeboss_preview: + + active_region=new FlxSprite(x, y + 30 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(32, 3, 0x0000ff00); + + loadGraphic(Eye_Boss.eye_boss_water_sprite, true, false, 24,24); + addAnimation("blink", [0, 1, 2, 3, 2, 1, 0], 10, false); + addAnimation("open", [3, 2, 1, 0], 5); + addAnimation("closed", [3]); + play("closed"); + alpha=0; + frame=3; + generic_update=gu_eyeboss_preview; + if(Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx])exists=false; + if(eyeboss_preview_played){ + if(Math.random()>0.3){ + exists=false; + } + } else { + eyeboss_preview_played=true; + } + break; + case gen_id_cliff_dog: + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Dog.dog_sprite, true, false, 16, 16); + addAnimation("walk", [2, 3], 8, true); + addAnimation("stop", [0], 12, true); + play("stop"); + generic_update=gu_cliff_dog; + break; + // NPCs for the trade quest.(dialogue quest) + // Need to be talked to in order, give you access to the shed + // in northern GO that gives a hint to the post-game temple NW of OVERWORLD + case gen_id_quest_npc: + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_trade_npcs, true, false, 16, 16); + generic_update=gu_quest_npc; + switch(Registry.CURRENT_MAP_NAME){ + case "CLIFF": + loadGraphic(embed_cliff_npcs, true, false, 16, 16); + addAnimation("a", [1], 2); + addAnimation("move", [1,3,1,5,1,1,1,0,2,0,4,0,0,1,1], 3, false); + break; + case "BEACH": + loadGraphic(embed_beach_npcs, true, false, 16, 16); + addAnimation("a", [0], 2); + addAnimation("turn", [1], 2); + break; + case "FOREST": + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, + 16); + addAnimation("a", [10,10,10,11,10,10,10,12], 3, true); + break; + case "FIELDS": + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 32,32); + addAnimation("a", [15,15,15,15,15,15,15,15,16,17,17,18,18], 18, true); + lonk_bush=new FlxSprite(x + 16, y + 32); + lonk_bush.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + lonk_bush.frame=30; + width=height=16; + y +=16; + offset.y=16; + parent.bg_sprites.add(lonk_bush); + break; + case "TRAIN"://CELLc + loadGraphic(embed_cell_bodies, true, false, 16, 16); + addAnimation("idle_d", [8]); + addAnimation("a", [8]); + addAnimation("idle_r", [9]); + addAnimation("idle_u", [10]); + addAnimation("idle_l", [11]); + play("idle_d"); + break; + case "SUBURB": + loadGraphic(Suburb_Walker.embed_suburb_folk, true, false, 16, 16); + addAnimation("a", [0,1], 4, true); + break; + case "SPACE": + loadGraphic(Space_NPC.embed_space_npc, true, false, 16, 16); + addAnimation("a", [0,10,1,11], 10, true); + break; + case "GO": + loadGraphic(note_rock, true, false, 16, 16); + addAnimation("a", [0], 12, true); + break; + } + play("a"); + break; + case gen_id_easter_eggs: + //MARINA_ANIMS_GEOMS + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + // smoking guy hidden in redcave + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(36, 36, 0x0000ff00); + generic_update=gu_easter; + loadGraphic(embed_smoke_red, false, true, 32, 32); + break; + case "APARTMENT": + // Hidden something in roof of apartment + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + generic_update=gu_easter; + loadGraphic(embed_randoms, true, false, 16, 16); + addAnimation("APT", [0], 10); + play("APT"); + break; + case "FIELDS": + // Rabbit(Olive) + generic_update=gu_easter; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(Forest_NPC.embed_forest_npcs, true, false, 16, 16); + addAnimation("idle", [30], 4, true); + addAnimation("hop", [32,33,32,33], 4, false); + break; + } + break; + case gen_id_death_place: + generic_update=gu_death_place; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + visible=false; + break; + case gen_id_snowman: + generic_update=gu_snowman; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + loadGraphic(embed_blue_npcs, true, false, 16, 16); + addAnimation("melt", [2, 3, 4, 5, 6], 8, false); + frame=0; + + if(xml.@alive=="false"){ + frame=6; + } else { + xml.@alive="true"; + xml.@p="1"; + } + + break; + case gen_id_go_happy_blocker: + generic_update=gu_go_happy_blocker; + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + + if(Registry.GE_States[Registry.GE_Briar_Blue_Done])exists=false; + loadGraphic(Briar_Boss.embed_ground_thorn, true, false, 16, 16); + addAnimation("a", [7, 11], 8); + play("a"); + y +=8; + break; + case gen_id_hotelguy: + loadGraphic(embed_hotel_npcs, true, false, 16, 16); + generic_update=gu_hotel_guy; + addAnimation("idle_d", [0], 8); + addAnimation("idle_r", [1], 8); + addAnimation("idle_u", [2], 8); + addAnimation("idle_l", [3], 8); + play("idle_u"); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + break; + case gen_id_hamster: + generic_update=gu_fields_easter; + fields_easter_scene="hamster"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [80, 81], 4); + play("a"); + break; + case gen_id_chikapu: + generic_update=gu_fields_easter; + fields_easter_scene="chikapu"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [82,83], 4); + play("a"); + break; + case gen_id_electric: + generic_update=gu_fields_easter; + fields_easter_scene="electric"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [84,85], 4); + play("a"); + break; + case gen_id_marvin: + generic_update=gu_fields_easter; + fields_easter_scene="marvin"; + loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [86,87], 4); + play("a"); + break; + casegen_id_melosn: + generic_update=gu_easter; + fields_easter_scene="melos"; + loadGraphic(EndingState.embed_dev_npcs, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [0], 4); + play("a"); + break; + case gen_id_marina: + generic_update=gu_easter; + fields_easter_scene="marina"; + loadGraphic(EndingState.embed_dev_npcs, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + addAnimation("a", [10], 4); + play("a"); + break; + default: + + // Load some graphic + // Sets width/height + // Set update function + break; + } + break; + + case "npc_test": + loadGraphic(npc_spritesheet, true, false, 16, 16); + active_region=new FlxSprite(x - 2, y - 2 + Registry.HEADER_HEIGHT); + active_region.makeGraphic(20, 20, 0x0000ff00); + get_dialogue=dialogue_test; + break; + case "statue": + loadGraphic(sage_statue, true, false, 16, 16); + height=16; + //offset.y=16 - 8; + //y +=16; + active_region=new FlxObject(x, y, 20, 20); + get_dialogue=dialogue_statue; + break; + case "rock": + get_dialogue=dialogue_rock; + if(Registry.CURRENT_MAP_NAME=="SPACE"){ + loadGraphic(Space_NPC.embed_space_npc, true, false, 16, 16); + if(Registry.CURRENT_GRID_X>5){ + frame=31; + } else { + frame=30; + } + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + + loadGraphic(note_rock, true, false, 16, 16); + frame=1; + } else { + loadGraphic(note_rock, true, false, 16, 16); + } + active_region=new FlxObject(x, y, 20, 20); + break; + case "big_key": + if(xml.@alive=="false"){ + exists=false; + } + active_region=new FlxObject(x, y, 20, 20); + Registry.subgroup_interactives.push(this); + loadGraphic(key_green_embed, false, false, 16, 16); + + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + frame=0; + break; + case "REDCAVE": + frame=2; + break; + case "CROWD": + frame=4; + break; + } + width=9; + offset.x=3; + x +=3; + tm=0.8; + for(i=0;i0.95 &&(player.y - tl)>140){ + Registry.E_DESTROY_PLAYSTATE=true; + Registry.cleanup_on_map_change(); + Registry.sound_data.stop_current_song(); + DH.enable_menu();// Disabled when you chose "No" from death screen + FlxG.switchState(new TitleState); + } + } + private function gu_easter():Void { + + immovable=true; + FlxG.collide(player, this); + + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "APARTMENT": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "FIELDS": + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_easter_egg); + break; + case "DEBUG": + DH.start_dialogue(DH.name_generic_npc, fields_easter_scene); + break; + } + } + + switch(Registry.CURRENT_MAP_NAME){ + case "REDCAVE": + PlayState.turn_on_effect(PlayState.GFX_DISCO); + alpha=0.6 + 0.4 * Math.random(); + scale.x=0.8 + 0.4 * Math.random(); + scale.y=0.8 + 0.4 * Math.random(); + break; + case "APARTMENT": + break; + case "FIELDS": + if(ctr==0){ + play("idle"); + t +=FlxG.elapsed; + if(t>1.4){ + t=0; + ctr=1; + } + } else if(ctr==1){ + play("hop"); + scale.x=1; + velocity.x=25; + ctr=2; + } else if(ctr==2){ + if(_curAnim.frames.length - 1==_curFrame){ + play("idle"); + velocity.x=0; + ctr=3; + } + } else if(ctr==3){ + t +=FlxG.elapsed; + if(t>1.6){ + t=0; + ctr=4; + velocity.x=-25; + scale.x=-1; + play("hop"); + } + } else if(ctr==4){ + if(_curAnim.frames.length - 1==_curFrame){ + play("idle"); + velocity.x=0; + ctr=0; + } + } + break; + + } + } + + // Only play the Quest NPC dialogue once per entrance Into the current room + private var local_played_quest:Bool=false; + private function gu_quest_npc():Void { + + immovable=true; + FlxG.collide(player, this); + + if(false==DH.a_chunk_is_playing()&& player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + immovable=true; + FlxG.collide(player, this); + var a:Array=Registry.GE_States; + var n:String=Registry.CURRENT_MAP_NAME; + var b:Bool=false; + if(n=="CLIFF" && false==a[Registry.GE_QUEST_BEACH]){ + b=a[Registry.GE_QUEST_CLIFF]=true; + play("move"); + } else if(n=="BEACH" && false==a[Registry.GE_QUEST_FOREST] && true==a[Registry.GE_QUEST_CLIFF]){ + b=a[Registry.GE_QUEST_BEACH]=true; + } else if(n=="FOREST" && false==a[Registry.GE_QUEST_FIELDS] && true==a[Registry.GE_QUEST_BEACH]){ + b=a[Registry.GE_QUEST_FOREST]=true; + } else if(n=="FIELDS" && false==a[Registry.GE_QUEST_CELL] && true==a[Registry.GE_QUEST_FOREST]){ + b=a[Registry.GE_QUEST_FIELDS]=true; + } else if(n=="TRAIN" && false==a[Registry.GE_QUEST_SUBURB] && true==a[Registry.GE_QUEST_FIELDS]){ + b=a[Registry.GE_QUEST_CELL]=true; + } else if(n=="SUBURB" && false==a[Registry.GE_QUEST_SPACE] && true==a[Registry.GE_QUEST_CELL]){ + b=a[Registry.GE_QUEST_SUBURB]=true; + } else if(n=="SPACE" && false==a[Registry.GE_QUEST_GO] && true==a[Registry.GE_QUEST_SUBURB]){ + b=a[Registry.GE_QUEST_SPACE]=true; + } else if(n=="GO" && true==a[Registry.GE_QUEST_SPACE]){ + b=a[Registry.GE_QUEST_GO]=true; + } + + // If the previous thing was done and the next is not done, play the event dialogue. + // Otherwise, play normal dialogue. + if(true==b && false==local_played_quest){ + local_played_quest=true; + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_event, n); + } else { + if(n=="BEACH" || n=="FOREST" || n=="CLIFF"){ + if(n=="CLIFF"){ + play("move"); + } + if(S_NPC.check_to_play_second(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n)){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_second, n); + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n); + } + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_quest_normal, n); + } + } + + if(n=="TRAIN"){ + EventScripts.face_and_play(this, player, "idle"); + } + if(n=="BEACH"){ + play("turn"); + } + + } + // for debugging + //if(FlxG.keys.justPressed("W"))Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + + if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + lonk_bush.immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(lonk_bush, player); + if(false==DH.a_chunk_is_playing()&& player.broom.visible && player.broom.overlaps(lonk_bush)){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_rank_bush); + } + } + + // Other behavior, possibly.. + } + private function gu_cliff_dog():Void { + t +=FlxG.elapsed; + if(ctr==0){ // Still left + if(t>1){ + if(Math.random()>0.6){ + t=0; + ctr=1; + play("walk"); + scale.x=1; + velocity.x=15; + } + } + } else if(ctr==1){ // move l ->r + if(t>1){ + t=0; + ctr=3; + play("stop"); + scale.x=1; + velocity.x=0; + } + } else if(ctr==2){ // move r _>l + + if(t>1){ + t=0; + ctr=0; + scale.x=1; + play("stop"); + velocity.x=0; + } + } else { + if(t>1){ + if(Math.random()>0.6){ + t=0; + ctr=2; + scale.x=-1; + play("walk"); + velocity.x=-15; + } + } + } + + + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y - 2; + + + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + DH.start_dialogue(DH.name_cliff_dog, DH.scene_cliff_dog_top_left); + } + + } + private function gu_cell_body():Void { + + } + private function gu_eyeboss_preview():Void { + + switch(ctr){ + case 0: + alpha +=0.008; + if(alpha>=1){ + ctr++; + play("open"); + } + break; + case 1: + if(finished){ + ctr++; + play("blink"); + } + break; + case 2: + if(finished){ + ctr++; + + } + break; + case 3: + alpha -=0.05; + break; + } + + } + private function gu_cube_kings():Void { + FlxG.collide(player, this); + if(player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + switch(ctr){ + case 0://gray + if(!DH.a_chunk_is_playing()){ + player.be_idle(); + DH.start_dialogue(DH.name_cube_king, DH.scene_cube_king_space_gray); + } + break; + case 1://color + if(!DH.a_chunk_is_playing()){ + DH.start_dialogue(DH.name_cube_king, DH.scene_cube_king_space_color); + } + break; + } + } + } + private function gu_windmill():Void { + // rotate the blades + // RULD' + + windmill_invis -=FlxG.elapsed; + + var b:FlxSprite; + for(i in 0...3 ++){ + b=windmill_blades[i]; + + if(windmill_invis<0){ + b.visible=true; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]==0){ + trace(1); + if(i==0) + b.frame=0; + if(i==1) + b.frame=8; + if(i==2) + b.frame=16; + } else { + if(b._curAnim==null) + b.play("rotate"); + } + + switch(i){ + case 0: + if(b._curFrame>=24){ + b.angle=270; + } else { + b.angle=0; + } + break; + case 1: + if(b._curFrame>=16){ + b.angle=180; + } else { + b.angle=270; + } + + break; + case 2: + if(b._curFrame>=8){ + b.angle=90; + } else { + b.angle=180; + } + break; + } + set_pos(b); + windmill_info[2*i]=b._curFrame; + windmill_info[2 * i + 1]=b.angle; + } + + } + + + private function set_pos(blade:FlxSprite):Void { + var center:Point=new Point(windmill_shell.x + 16, windmill_shell.y + 16); + switch(blade.angle){ + case 0: + blade.x=center.x - 16; + blade.y=center.y - 192 + 32; + break; + case 90: + blade.x=center.x - 16; + blade.y=center.y - 16; + break; + case 180: + blade.x=center.x - 192 + 32; + blade.y=center.y - 16; + break; + case 270: + blade.x=center.x -192 + 32; + blade.y=center.y - 192 + 32; + break; + } + } + + private function gu_nexus_pad():Void { + // If on, beep, if press c, warp + // if off.. + + // off + if(!did_init){ + did_init=true; + parent.sortables.remove(this, true); + parent.bg_sprites.add(this); + } + if(ctr==0){ + if(player.overlaps(this)&& player.state==player.S_GROUND){ + ctr=1; + play("on"); + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + } + } else { + if(!player.overlaps(this)){ + ctr=0; + play("off"); + } + + if(Registry.keywatch.JP_ACTION_1){ + load_nexus_data(); + parent.SWITCH_MAPS=true; + } + } + + } + + private var happy_tlx:Int=Registry.CURRENT_GRID_X * 160 + 80; + private function gu_happy_event():Void { + switch(ctr){ + case 0: + Registry.volume_scale -=0.015; + if(player.state==player.S_GROUND && player.xtm){ + for(var sparkle:FlxSprite in sparkles.members){ + if(sparkle==null)continue; + if(sparkle.finished){ + sparkle.visible=true; + sparkle.x=x - 2 +(width + 4)* Math.random(); + sparkle.y=y - 3 +(height + 6)* Math.random()- offset.y; + sparkle.play("sparkle"); + t=0; + // Sparkles come out faster and faster nad fasters + if(ctr>0 && ctr<4){ + trace(tm); + if(tm>0.15){ + tm -=0.06; + } + sparkle.velocity.y=20; + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.sparkle_group); + } + break; + } + } + } + var sub_ctr:Int=0; + switch(ctr){ + case 0: + // Wait for player to Interact + FlxG.collide(player, this); + active_region.x=x - 2; + active_region.y=y - 2; + if(parent.state==parent.S_NORMAL){ + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& player.state==player.S_GROUND){ + DH.disable_menu(); + EventScripts.face_and_play(player, this, "idle"); + player.state=player.S_INTERACT; + ctr++; + rotate_angle=EventScripts.get_angle(player.x, player.y, x, y); + radius=EventScripts.distance(new Point(player.x + 5, player.y + 5), this); + my_shadow.visible=true; + my_shadow.frame=0; + + // Chang einventory state + xml.@alive="false"; + switch(Registry.CURRENT_MAP_NAME){ + case "BEDROOM": + Registry.inventory[Registry.IDX_GREEN_KEY]=true; + break; + case "REDCAVE": + Registry.inventory[Registry.IDX_RED_KEY]=true; + break; + case "CROWD": + Registry.inventory[Registry.IDX_BLUE_KEY]=true; + break; + } + } + } + break; + case 1: + // rotate + if(EventScripts.send_property_to(this.offset, "y", 16, 0.3))sub_ctr++; + if(EventScripts.send_property_to(this, "radius", 40, 0.2))sub_ctr++; + + EventScripts.rotate_about_center_of_sprite(player, this, radius, rotational_velocity, 0, 0); + + if(sub_ctr==2){ + my_shadow.frame=2; + ctr++; + rotational_velocity *=2; + } + break; + case 2: + //slowly rotate higher/closer + if(EventScripts.send_property_to(this.offset, "y", 64, 0.3))sub_ctr++; + if(EventScripts.send_property_to(this, "radius", 2, 0.14))sub_ctr++; + + EventScripts.rotate_about_center_of_sprite(player, this, radius, rotational_velocity, 0, 0); + + if(sub_ctr==2){ + // Play "ding" noise, + ctr++; + } + break; + case 3: + //move higher while not rotating + if(EventScripts.send_property_to(this.offset, "y", 70, 0.05))sub_ctr++; + if(sub_ctr==1){ + ctr++; + } + + break; + case 4: + // fly Into player + if(EventScripts.send_property_to(this.offset, "y", 16, 2.2))sub_ctr++; + + // Flash the screen + if(sub_ctr==1){ + FlxG.flash(0xffffffff, 2.0); + FlxG.shake(0.02, 0.4); + + Registry.sound_data.sun_guy_death_l.play(); + visible=false; + my_shadow.visible=false; + ctr++; + } + + break; + case 5: + DH.enable_menu(); + parent.player.state=parent.player.S_GROUND; + xml.@alive="false"; + exists=false; + + break; + } + super.update(); + } + + private function dialogue_test():Void { + DH.start_dialogue(DH.name_test, DH.scene_test_debug_scene_1); + } + + private function dialogue_statue():Void { + player.be_idle(); + switch(Registry.CURRENT_MAP_NAME){ + case "OVERWORLD": + DH.start_dialogue(DH.name_statue, DH.scene_statue_overworld_bedroom_entrance); + break; + case "NEXUS": + DH.start_dialogue(DH.name_statue, DH.scene_statue_nexus_enter_nexus); + break; + case "BEDROOM": + DH.start_dialogue(DH.name_statue, DH.scene_statue_bedroom_after_boss); + break; + case "TERMINAL": + DH.start_dialogue(DH.name_statue, "one"); + break; + case "REDCAVE": + DH.start_dialogue(DH.name_statue, "one"); + break; + } + } + + private function dialogue_rock():Void { + + var scene:String; + switch(parseInt(xml.@frame)){ + case 0: + scene=DH.scene_rock_one; + break; + case 1: + scene=DH.scene_rock_two; + break; + case 2: + scene=DH.scene_rock_three; + break; + case 3: + scene=DH.scene_rock_four; + break; + case 4: + scene=DH.scene_rock_five; + break; + case 5: + scene=DH.scene_rock_six; + break; + } + + if(DH.start_dialogue(DH.name_rock, scene)){ + player.be_idle(); + DH.increment_property(DH.name_rock, "times_talked"); + trace("rock", DH.get_int_property(DH.name_rock, "times_talked")); + if(DH.get_int_property(DH.name_rock, "times_talked")<2){ + //Registry.cur_dialogue="There is writing scrawled on this rock:^\n" + Registry.cur_dialogue; + Registry.cur_dialogue=DH.lk("rock",0)+"^\n" + Registry.cur_dialogue; + } + } + // Update + } + + private static function nexus_helper(idx:Int,curmap:String):Void + { + //Door.is_nexus_door_open(idx); + Registry.NEXT_MAP_NAME="NEXUS"; + var a:Array=Registry.DOOR_INFO[idx]; + + if(Registry.DOOR_INFO[idx][0][2] !=curmap){ + Registry.ENTRANCE_PLAYER_X=Registry.DOOR_INFO[idx][0][0]; + Registry.ENTRANCE_PLAYER_Y=Registry.DOOR_INFO[idx][0][1]; + } else { + Registry.ENTRANCE_PLAYER_X=Registry.DOOR_INFO[idx][1][0]; + Registry.ENTRANCE_PLAYER_Y=Registry.DOOR_INFO[idx][1][1]; + } + Registry.ENTRANCE_PLAYER_X +=10; + Registry.ENTRANCE_PLAYER_Y +=34; + } + + public static function load_nexus_data():Void + { + switch(Registry.CURRENT_MAP_NAME){ + case "WINDMILL": + nexus_helper(Door.Door_Nexus_Windmill, Registry.CURRENT_MAP_NAME); + break; + case "CLIFF": + nexus_helper(Door.Door_Nexus_Cliff, Registry.CURRENT_MAP_NAME); + break; + case "FOREST": + nexus_helper(Door.Door_Nexus_Forest, Registry.CURRENT_MAP_NAME); + break; + case "REDSEA": + nexus_helper(Door.Door_Nexus_Redsea, Registry.CURRENT_MAP_NAME); + break; + case "BEACH": + nexus_helper(Door.Door_Nexus_Beach, Registry.CURRENT_MAP_NAME); + break; + case "GO": + nexus_helper(Door.Door_Nexus_Go, Registry.CURRENT_MAP_NAME); + break; + case "HAPPY": + nexus_helper(Door.Door_Nexus_Happy, Registry.CURRENT_MAP_NAME); + break; + case "BLUE": + nexus_helper(Door.Door_Nexus_Blue, Registry.CURRENT_MAP_NAME); + break; + case "FIELDS": + nexus_helper(Door.Door_Nexus_Fields, Registry.CURRENT_MAP_NAME); + break; + case "BEDROOM": + nexus_helper(Door.Door_Nexus_Bedroom, Registry.CURRENT_MAP_NAME); + break; + case "REDCAVE": + nexus_helper(Door.Door_Nexus_Redcave, Registry.CURRENT_MAP_NAME); + break; + case "CROWD": + nexus_helper(Door.Door_Nexus_Crowd, Registry.CURRENT_MAP_NAME); + break; + case "APARTMENT": + nexus_helper(Door.Door_Nexus_Apartment, Registry.CURRENT_MAP_NAME); + break; + case "HOTEL": + nexus_helper(Door.Door_Nexus_Hotel, Registry.CURRENT_MAP_NAME); + break; + case "CIRCUS": + nexus_helper(Door.Door_Nexus_Circus, Registry.CURRENT_MAP_NAME); + break; + case "TRAIN": + nexus_helper(Door.Door_Nexus_Cell, Registry.CURRENT_MAP_NAME); + break; + case "SUBURB": + nexus_helper(Door.Door_Nexus_Suburb, Registry.CURRENT_MAP_NAME); + break; + case "SPACE": + nexus_helper(Door.Door_Nexus_Space, Registry.CURRENT_MAP_NAME); + break; + case "TERMINAL": + nexus_helper(Door.Door_Nexus_Terminal, Registry.CURRENT_MAP_NAME); + break; + case "OVERWORLD": + nexus_helper(Door.Door_Nexus_Overworld, Registry.CURRENT_MAP_NAME); + break; + case "STREET": + nexus_helper(Door.Door_Nexus2Street, Registry.CURRENT_MAP_NAME); + break; + } + } + + + override public function destroy():Void + { + DH.a_chunk_just_finished(); + sparkles=null; + active_region=null; + windmill_blades=null; + windmill_shell=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Red_Pillar.hx b/intra/source/entity/interactive/Red_Pillar.hx new file mode 100644 index 0000000..be7f981 --- /dev/null +++ b/intra/source/entity/interactive/Red_Pillar.hx @@ -0,0 +1,145 @@ +package entity.interactive +{ +import data.CLASS_ID; +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import org.flixel.FlxG; +import org.flixel.FlxSprite; + +class Red_Pillar extends FlxSprite +{ + /* dame props: + * alive - whether this appears as broken or not etc + * p=2 + * frame:what event it triggers when destroyed + * L R C1 C2 <-- the triggers(1 to 4)WHERE THEY ARE LOCATED */ + public var xml:XML; + public var cid:Int=CLASS_ID.RED_PILLAR; + + public var state:Int=0; + public var s_disappearing:Int=3; + public var s_dead:Int=2; + public var s_dying:Int=1; + public var s_alive:Int=0; + + public var player:Player; + public var parent:Dynamic; + + public var active_region:FlxSprite; + public var ripple:FlxSprite; + public var pixel_push:Float=0; + public var retract_speed:Float=0.4; + + //[Embed(source="../../res/sprites/enemies/redcave/red_pillar.png")] public static var red_pillar_sprite:Class; + //[Embed(source="../../res/sprites/enemies/redcave/red_pillar_ripple.png")] public static var red_pillar_ripple_sprite:Class; + + public function new(_xml:XML, _p:Player, _parent:Dynamic) + { + super(parseInt(_xml.@x), parseInt(_xml.@y)); + xml=_xml; + + /* AD DANIMS */ + loadGraphic(red_pillar_sprite, true, false, 16, 80); + addAnimation("move", [1, 2], 8); + addAnimation("stuck", [0]); + retract_speed=0.7; + play("stuck"); + + // need to add + ripple=new FlxSprite; + ripple.loadGraphic(red_pillar_ripple_sprite, true, false, 16, 16); + ripple.addAnimation("move", [0, 1], 8, true); + ripple.play("move"); + ripple.visible=false; + ripple.x=x; + ripple.y=y + height + Registry.HEADER_HEIGHT - ripple.height + 1; + + if(xml.@alive=="false"){ + exists=false; + } + immovable=true; + + player=_p; + + active_region=new FlxSprite(x, y + Registry.HEADER_HEIGHT + 16); + active_region.makeGraphic(16, 16, 0x000000); + + parent=_parent; + _parent.sortables.add(ripple); + } + + + override public function update():Void + { + if(state==s_dying){ + if(!flickering){ + Registry.Event_Nr_Red_Pillars_Broken++; + switch(parseInt(xml.@frame)){ + case 1: + case 2: + if(Registry.Event_Nr_Red_Pillars_Broken==4){ + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_North; + + } + xml.@alive="false"; + break; + case 3: + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_Left; + xml.@alive="false"; + break; + case 4: + Registry.E_Load_Cutscene=true; + Registry.CURRENT_CUTSCENE=Cutscene.Red_Cave_Right; + xml.@alive="false"; + break; + } + player.state=player.S_GROUND; + exists=false; + } + } + + if(state==s_alive && player.broom.overlaps(active_region)&& player.broom.visible){ + hit(); + play_sfx(HURT_SOUND_NAME); + play("hit"); + } + + if(state==s_disappearing){ + + player.invincible=true; + if(player.broom.visible==false){ + player.state=player.S_INTERACT; + player.be_idle(); + } + pixel_push +=retract_speed; + framePixels_y_push=pixel_push; + if(framePixels_y_push==height){ + state=s_dying; + ripple.exists=false; + } + } else { + FlxG.collide(this, player); + } + + super.update(); + } + + public function hit():Void { + flicker(1.5); + play("move"); + state=s_disappearing; + ripple.visible=true; + + } + + override public function destroy():Void + { + parent.sortables.remove(ripple, true); + active_region=ripple=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/Terminal_Gate.hx b/intra/source/entity/interactive/Terminal_Gate.hx new file mode 100644 index 0000000..6dc8b95 --- /dev/null +++ b/intra/source/entity/interactive/Terminal_Gate.hx @@ -0,0 +1,83 @@ +package entity.interactive +{ +import entity.player.Player; +import global.Registry; +import helper.Cutscene; +import org.flixel.FlxSprite; + +/** + * The gate in TERMINAL with three tiers. One is removed for + * of the first three bosses defeated. + * A container class for the associated entities + * @author Seagaia + */ +class Terminal_Gate extends FlxSprite +{ + + public var xml:XML; + public var p:Player; + public var parent:Dynamic; + + public var gate_bedroom:FlxSprite; + public var gate_redcave:FlxSprite; + public var gate_crowd:FlxSprite; + public var button:FlxSprite; + + public function new(_xml:XML, _p:Player, _parent:Dynamic,is_cutscene:Bool=false) + { + xml=_xml; + p=_p; + parent=_parent; + super(parseInt(xml.@x), parseInt(xml.@y)); + + gate_bedroom=new FlxSprite(x, y + 16 + Registry.HEADER_HEIGHT); + gate_redcave=new FlxSprite(x, y + 32 + Registry.HEADER_HEIGHT); + gate_crowd=new FlxSprite(x, y + 48 + Registry.HEADER_HEIGHT); + + gate_bedroom.makeGraphic(16, 16, 0xff00ee00); + gate_redcave.makeGraphic(16, 16, 0xffee0000); + gate_crowd.makeGraphic(16, 16, 0xff0000ee); + + + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]){ + gate_bedroom.exists=false; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Redcave]){ + gate_redcave.exists=false; + } + if(Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]){ + gate_crowd.exists=false; + } + visible=false; + button=new FlxSprite(x, y + Registry.HEADER_HEIGHT); + button.makeGraphic(16, 16, 0xff000000); + + if(!is_cutscene){ + parent.sortables.add(button); + parent.sortables.add(gate_bedroom); + parent.sortables.add(gate_redcave); + parent.sortables.add(gate_crowd); + } + + } + + override public function update():Void + { + + super.update(); + + + } + + override public function destroy():Void { + parent.sortables.remove(gate_bedroom, true); + parent.sortables.remove(gate_redcave, true); + parent.sortables.remove(gate_crowd, true); + parent.sortables.remove(button, true); + gate_bedroom=gate_redcave=gate_crowd=button=null; + super.destroy(); + } + + + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/npc/Forest_NPC.hx b/intra/source/entity/interactive/npc/Forest_NPC.hx new file mode 100644 index 0000000..e1c72d5 --- /dev/null +++ b/intra/source/entity/interactive/npc/Forest_NPC.hx @@ -0,0 +1,150 @@ +package entity.interactive.npc +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +/** + * Behaviors of forest sprites, minus mr. bear who is in NPC as a Quest_npc + * @author Melos Han-Tani + */ + + +class Forest_NPC extends AnoSprite +{ + + private var type:Int; + private var T_LORAX:Int=0; + private var T_MUSHROOM:Int=1; + private var T_BUNNY:Int=2; + private var T_BUNNY_RUN:Int=3; + public var active_region:FlxSprite; + +//[Embed(source="../../../res/sprites/npcs/forest_npcs.png")] public static inline var embed_forest_npcs:Class; + + public function new(a:Array) + { + super(a); + + loadGraphic(embed_forest_npcs,true,false,16,16); + + switch(parseInt(xml.@frame)){ + case 0://Lorax + type=T_LORAX; + addAnimation("move", [0, 1], 4); + addAnimation("stand", [1], 0); + addAnimation("squat", [0], 0); + play("move"); + Registry.subgroup_interactives.push(this); + break; + case 20:// mushroom + type=T_MUSHROOM; + addAnimation("idle", [20], 4); + addAnimation("move", [20, 21, 20,22,20,21,20,22,20], 8,false); + play("idle"); + break; + case 30:// rabbit + type=T_BUNNY; + add_bunny_anims(this); + Registry.subgroup_interactives.push(this); + break; + case 34:// Random bunny swap + type=T_BUNNY_RUN; + add_bunny_anims(this); + if(Math.random()<0.25){ + var r:Float=Math.random(); + if(r<0.25){ + play("walk_d"); + } else if(r<0.5){ + play("walk_r"); + } else if(r<0.75){ + play("walk_u"); + } else { + play("walk_l"); + } + } else { + exists=false; + } + break; + } + active_region=new FlxSprite(x - 2, y - 2); + active_region.makeGraphic(20, 20, 0x00ffffff); + } + override public function destroy():Void + { + active_region.destroy(); + active_region=null; + super.destroy(); + } + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + if(type==T_LORAX){ + immovable=true; + FlxG.collide(this, player); + wait_to_talk(DH.name_forest_npc, DH.scene_forest_npc_thorax); + } else if(type==T_BUNNY){ + immovable=true; + FlxG.collide(this, player); + wait_to_talk(DH.name_forest_npc, DH.scene_forest_npc_bunny, "walk"); + } else if(type==T_MUSHROOM){ + immovable=true; + FlxG.collide(this, player); + if(player.broom.visible && player.broom.overlaps(this)&& _curAnim.name !="move"){ + play("move"); + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.mushroom_sound_group); + } else if(_curAnim.name=="move"){ + if(finished){ + play("idle"); + } + } + } else if(type==T_BUNNY_RUN){ + if(state==0){ + if(EventScripts.distance(this, player)<48){ + Registry.sound_data.play_sound_group(Registry.sound_data.rat_move); + state=1; + var run_spd:Int=100; + _curAnim.delay=1.0 / 14.0; + if(_curAnim.name=="walk_d"){ + velocity.y=run_spd; + } else if(_curAnim.name=="walk_r"){ + velocity.x=run_spd; + } else if(_curAnim.name=="walk_u"){ + velocity.y=-run_spd; + } else if(_curAnim.name=="walk_l"){ + velocity.x=-run_spd; + } + } + } else { + if(xtl.x + 160 || y>tl.y + 160 || y=1){ + play("fall"); + alive=false; + xml.@alive="false"; + xml.@p="2"; + } + } else if(Registry.CURRENT_MAP_NAME=="BLUE"){ + if(Registry.GRID_PUZZLES_DONE>=3){ + play("fall"); + alive=false; + xml.@p="2"; + xml.@alive="false"; + } + } + super.update(); + return; + } + active_region.x=x - 2; + active_region.y=y - 2; + + immovable=true; + player.solid=true; + FlxG.collide(parent.curMapBuf,this); + FlxG.collide(this, player); + if(DH.nc(player, active_region)){ + velocity.x=velocity.y=0; + EventScripts.face_and_play(this, player, "idle"); + if(type==T_HOT)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_hot); + if(type==T_DUMP)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_dump); + if(type==T_GOLD)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_gold); + if(type==T_DRINK)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_drink); + if(type==T_BEAUTIFUL)DH.start_dialogue(DH.name_happy_npc, DH.scene_happy_npc_beautiful); + } + + // Behaviors + + if(DH.a_chunk_is_playing()==false){ + if(type==T_HOT){ + pace(); + } else if(type==T_DUMP){ + run(); + } else if(type==T_GOLD){ + run(); + } else if(type==T_DRINK){ + run(); + } else if(type==T_BEAUTIFUL){ + pace(); + } + } else { + + velocity.x=velocity.y=0; + } + + super.update(); + } + + private var t:Float=0; + private var tm:Float=1.0; + private var ctr:Int=0; + private function pace():Void { + t +=FlxG.elapsed; + if(t>tm){ + t=0; + if(ctr==0){ + if(Math.random()<0.5){ + ctr=1; + velocity.x=20; + play("walk_r"); + } else { + velocity.x=0; + random_idle(); + } + + } else if(ctr==1){ + velocity.x=0; + if(Math.random()<0.5){ + ctr=0; + play("walk_l"); + velocity.x=-20; + } else { + random_idle(); + velocity.x=0; + } + } + } + } + + private function run():Void { + t +=FlxG.elapsed; + if(t>tm){ + t=0; + if(ctr==0){ + play("walk_r"); + velocity.x=40; + ctr=1; + } else { + play("walk_l"); + velocity.x=-40; + ctr=0; + } + } + } + + private function random_idle():Void { + var r:Float=Math.random(); + + if(r<0.25){ + play("idle_d"); + } else if(r<0.5){ + play("idle_r"); + } else if(r<0.75){ + play("idle_u"); + } else { + play("idle_l"); + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/npc/Huge_Fucking_Stag.hx b/intra/source/entity/interactive/npc/Huge_Fucking_Stag.hx new file mode 100644 index 0000000..721cd28 --- /dev/null +++ b/intra/source/entity/interactive/npc/Huge_Fucking_Stag.hx @@ -0,0 +1,32 @@ +package entity.interactive.npc +{ +import org.flixel.AnoSprite; +import org.flixel.FlxG; + +/** + * ... + * @author Melos Han-Tani + */ +class Huge_Fucking_Stag extends AnoSprite +{ + //[Embed(source="../../../res/sprites/npcs/forest_stag.png")] public static inline var embed_stag:Class; + public function new(a:Array) + { + super(a); + + loadGraphic(embed_stag, true, false, 64, 80); + addAnimation("a", [0, 1, 2], 4); + play("a"); + if(Math.random()<0.01 ||(FlxG.keys.Q && FlxG.keys.W && FlxG.keys.E)){ + + } else { + exists=false; + } + } + + override public function update():Void + { + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/npc/Mitra.hx b/intra/source/entity/interactive/npc/Mitra.hx new file mode 100644 index 0000000..396c14d --- /dev/null +++ b/intra/source/entity/interactive/npc/Mitra.hx @@ -0,0 +1,910 @@ +package entity.interactive.npc +{ +import data.CLASS_ID; +import entity.enemy.etc.Sage_Boss; +import entity.player.Player; +import flash.geom.Point; +import global.Keys; +import global.Registry; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; + + +class Mitra extends FlxSprite +{ + + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + private var dame_frame:Int; + public var active_region:FlxObject; + public var sage_active_region:FlxObject; + + public var bike:FlxSprite; + public var cid:Int=CLASS_ID.MITRA; + public var sage:FlxSprite; + + + private var logic:Function; + private var fields_state:Int=0; + private static inline var FS_cards:Int=1; + private static inline var FS_init:Int=2; + // whehter an in + private var gave_initial_hint:Bool=false; + private var state_counter:Int=0; + // Generic flags + private var b1:Bool=false; + private var b2:Bool=false; + private var tl:Point=new Point(); + private var ctr:Int=0; + private var bullet:FlxSprite; + + //[Embed(source="../../../res/sprites/npcs/bike.png")] public static var bike_sprite:Class; + //[Embed(source="../../../res/sprites/npcs/mitra.png")] public static var mitra_sprite:Class; + //[Embed(source="../../../res/sprites/npcs/mitra_bike.png")] public static var mitra_on_bike_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + player=_player; + parent=_parent; + xml=_xml; + dame_frame=parseInt(xml.@frame); + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=20 + Registry.CURRENT_GRID_Y * 160; + super(parseInt(xml.@x), parseInt(xml.@y)); + + addAnimation("bike_d", [0,1], 8); + addAnimation("bike_u", [4,5], 8); + addAnimation("bike_idle_u", [4], 8); + addAnimation("bike_r", [2,3], 8); + addAnimation("bike_l", [2,3], 8); + + addAnimation("walk_d", [0,1], 8); + addAnimation("walk_u", [4,5], 8); + addAnimation("walk_r", [2,3], 8); + addAnimation("walk_l", [2,3], 8); + + addAnimation("idle_d", [6], 8); + addAnimation("idle_u", [8], 8); + addAnimation("idle_r", [7], 8); + addAnimation("idle_l", [7], 8); + + addAnimationCallback(on_anim_change); + + play("idle_d"); + + bike=new FlxSprite; + bike.loadGraphic(bike_sprite, true, false, 20, 20) + bike.addAnimation("r", [1], 2); + bike.addAnimation("d", [0], 2); + bike.addAnimation("u", [2], 2); + bike.visible=false; + bike.play("r"); + bike.width=16; + bike.height=10; + bike.offset.x=2; + bike.offset.y=11; + parent.sortables.add(bike); + + active_region=new FlxObject(x, y, 20, 20); + sage_active_region=new FlxObject(x, y, 20, 20); + + Registry.subgroup_interactives.push(this); + + switch(Registry.CURRENT_MAP_NAME){ + case "OVERWORLD": + to_bike(); + + if(dame_frame==0){ + Registry.EVENT_CHANGE_VOLUME_SCALE=true; + Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET=0.3; + logic=overworld_logic; + visible=false; + if(DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld)){ + exists=false; + } + } + break; + case "FIELDS": + + bike.visible=true; + bike.x=x - 20; + bike.y=y + 20; + if(Registry.all_bosses_dead()&& Registry.nr_growths<36){ + trace("Mitra.as:All bosses dead!"); + fields_state=FS_cards; + } + + if(DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_fields_init, "FIELDS")==false){ + fields_state=FS_init; + } + logic=fields_logic; + + loadGraphic(mitra_sprite, true, false, 16, 16); + break; + case "CLIFF": + logic=cliff_logic; + x=tl.x - 20; + y=tl.y + 70; + to_bike(); + if(Registry.inventory[Registry.IDX_JUMP])exists=false; + break; + case "GO": + // Make a sage sprite + if(Registry.GE_States[Registry.GE_Briar_Blue_Done]==false){ + exists=false; + break; + } + loadGraphic(mitra_on_bike_sprite, true, false, 20,20); + visible=false; + sage=new FlxSprite(0, 0); + + sage.loadGraphic(Sage.sage_sprite, true, false, 16, 16); + + sage.addAnimation("walk_d", [0, 1], 6, true); + sage.addAnimation("walk_r", [2,3], 6, true); + sage.addAnimation("walk_l", [2,3],6, true); + sage.addAnimation("walk_u", [4,5], 6, true); + sage.addAnimation("idle_d",[6]); + sage.addAnimation("idle_r", [7]); + sage.addAnimation("idle_l", [7]); + sage.addAnimation("idle_u", [8]); + sage.visible=false; + parent.sortables.add(sage); + + bullet=new FlxSprite(0, 0); + bullet.loadGraphic(Sage_Boss.embed_sage_attacks, true, false, 16, 16); + bullet.addAnimation("a", [0, 1], 8); + bullet.play("a"); + parent.sortables.add(bullet); + + logic=go_logic; + + if(Registry.GE_States[Registry.GE_go_mitra]==true){ + GO_STATE=GO_STATE_AFTER; + loadGraphic(mitra_sprite, true, false, 16, 16); + sage.x=tl.x + 32 + 8; + sage.y=tl.y + 7 * 16 + 2; + sage.visible=true; + bike.visible=true; + visible=true; + bike.x=tl.x + 6 * 16 + 2; + bike.y=tl.y + 7 * 16; + x=tl.x + 6 * 16 + 2; + y=tl.y + 8 * 16 - 20; + } + + break; + } + } + + override public function preUpdate():Void + { + if(solid){ + FlxG.collide(this, parent.curMapBuf); + } + super.preUpdate(); + } + override public function update():Void + { + if(parent.state==parent.S_NORMAL){ + logic(); + } + super.update(); + } + + private static inline var GO_STATE_AFTER:Int=2; + private static inline var GO_STATE_DURING:Int=1; + private static inline var GO_STATE_BEFORE:Int=0; + private var GO_STATE:Int=0; + private function go_logic():Void { + if(GO_STATE==GO_STATE_BEFORE){ + if(ctr==0 && player.xtl.x + 7 * 16){ + player.x=tl.x + 7 * 16; + ctr++; + } + } else if(ctr==2){ + if(player.y>tl.y + 7 * 16){ + player.y -=1; + player.play("walk_u"); + } else if(player.yplayer.y - 4){ + loadGraphic(mitra_sprite, true, false, 16, 16); + velocity.y=20; + play("walk_d"); + + bike.visible=true; + bike.x=player.x - 18; + bike.y=player.y + 10; + + ctr++; + } + } + } else if(ctr==4){ + if(y>player.y + player.height){ + velocity.y=0; + velocity.x=20; + play("walk_r"); + if(x>player.x){ + player.play("idle_d"); + play("idle_u"); + velocity.x=0; + + sage.x=tl.x + 4 * 16; + sage.y=tl.y + 160; + sage.velocity.y=-20; + sage.visible=true; + sage.play("walk_u"); + + ctr++; + } + } + } else if(ctr==5){ + if(sage.ytl.x + 9 * 16){ + player.x=tl.x + 9 * 16; + } + + if(player.xtl.y + 9 * 16){ + player.y=tl.y + 9 * 16; + } + if(player.ytm){ + t=0; + bullet.velocity.x=10; + ctr++; + Registry.sound_data.play_sound_group(Registry.sound_data.laser_pew_group); + } + + // Fire bullet + } else if(ctr==3){ + if(bullet.x>bike.x - 3){ + bullet.visible=false; + FlxG.flash(0xffff0000, 1); + EventScripts.make_explosion_and_sound(bullet); + ctr=6; + } + if(bullet.overlaps(player)){ + FlxG.flash(0xffff0000, 1); + EventScripts.make_explosion_and_sound(bullet); + player.state=player.S_INTERACT; + bullet.visible=false; + player.play("slumped"); + ctr=4; + } + if(player.broom.visible && player.broom.overlaps(bullet)){ + FlxG.flash(0xffffffff, 1); + EventScripts.make_explosion_and_sound(bullet); + ctr=4; + bullet.visible=false; + } + } else if(ctr==4){ + // Wares doesnt gets hit + DH.start_dialogue(DH.name_sage, "hit", "", 0); + ctr=5; + } else if(ctr==5){ + if(DH.a_chunk_is_playing()==false){ + Registry.GAMESTATE.dialogue_latency=-1; + ctr=9; + DH.start_dialogue(DH.name_sage, "hit", "", 1); + } + } else if(ctr==6){ + //wares gets hit + DH.start_dialogue(DH.name_sage, "hit", "", 2); + ctr ++; + } else if(ctr==7){ + velocity.x=-20; + scale.x=-1; + play("walk_l"); + if(xtl.y + 50 && player.state !=player.S_LADDER){ + Registry.sound_data.stop_current_song(); + Registry.sound_data.start_song_from_title("MITRA"); + player.be_idle(); + player.state=player.S_INTERACT; + DH.disable_menu(); + //DH.dialogue_popup("Hey, Young!"); + DH.dialogue_popup(DH.lk("mitra",0)); + state_counter=1; + x=tl.x + 160 + 20; + y=tl.y + 80; + } + } else if(state_counter==1){ + player.be_idle(); + player.state=player.S_INTERACT; + if(DH.a_chunk_is_playing()==false){ + play("bike_l"); + velocity.x=-37; + state_counter=2; + } + } else if(state_counter==2){ + if(x<=player.x){ + velocity.x=0; + bike.x=x - 1; + bike.y=y - 1; + bike.visible=true; + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + //DH.dialogue_popup("Are those bike shoes for me? Wow! Thanks, Young! I’ve been thinking about getting these, since Wares has those pedals where you can clip in bike shoes. Here, Young, take my boots in exchange! They have these cool springs that let you jump really high! You press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump with them on!"); + DH.dialogue_popup(DH.lk("mitra",1)+ " "+Registry.controls[Keys.IDX_ACTION_2] + " "+DH.lk("mitra",2)); + + } else { + //DH.dialogue_popup("Hi Young! Notice anything new? ^... ^... Oh, well, I got new biking shoes, see! They clip Into Wares' pedals. Since I’ll no longer be needing my old boots, I want you to have them, Young! They have these cool springs that let you jump really high! You press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump with them on!"); + DH.dialogue_popup(DH.lk("mitra",3)+ " "+Registry.controls[Keys.IDX_ACTION_2] + " "+DH.lk("mitra",4)); + } + + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.bound_item_2="JUMP"; + Registry.inventory[Registry.IDX_BIKE_SHOES]=false; + state_counter=6; + loadGraphic(mitra_sprite, true, false, 16, 16); + play("idle_u"); + offset.x=offset.y=0; + + } + } else if(state_counter==3){ + if(!DH.a_chunk_is_playing()){ + player.state=player.S_INTERACT; + player.be_idle(); + //DH.dialogue_popup("Alright, take care!"); + DH.dialogue_popup(DH.lk("mitra",5)); + state_counter=4; + } + } else if(state_counter==4){ + + if(!DH.a_chunk_is_playing()){ + velocity.x=37; + bike.visible=false; + to_bike(); + play("bike_r"); + player.state=player.S_INTERACT; + state_counter=5; + } + } else if(state_counter==5){ + + if(x>tl.x + 160){ + exists=false; + player.state=player.S_GROUND; + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="CLIFF"; + DH.enable_menu(); + } + } else if(state_counter==6){ + EventScripts.face_and_play(this, player, "idle"); + + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + + + FlxG.collide(this, player); + if(player.state==player.S_AIR){ + jumpedonce=true; + } + if(player.overlaps(active_region)&& DH.a_chunk_is_playing()==false && player.state==player.S_GROUND && Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(DH.get_int_property(DH.name_mitra, "smells")==-1){ + DH.increment_property(DH.name_mitra, "smells"); + //DH.dialogue_popup("Go on, try them out! ^...They’re not THAT smelly."); + DH.dialogue_popup(DH.lk("mitra",6)); + } else { + if(jumpedonce){ + //DH.dialogue_popup("Cool, huh?"); + DH.dialogue_popup(DH.lk("mitra",7)); + } + } + } + + if(player.ytl.x + 135){ + if(player.state==player.S_GROUND){ + state_counter=3; + } + player.x=tl.x + 135; + } + } + } + private var jumpedonce:Bool=false; + //hints and shit + private function fields_logic():Void { + bike.immovable=true; + FlxG.collide(bike, player); + if(fields_state==FS_cards){ + // Find next card thing to help with + idle_card(); + } else if(fields_state==FS_init){ + idle_fields_init(); + } else { + idle_fields(); + // Give hints about game, maybe + // Orj ust talk in general + } + } + + private function idle_fields_init():Void { + + EventScripts.face_and_play(this, player, "idle"); + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + if(DH.nc(player,active_region)){ + if(DH.get_scene_position(DH.name_mitra, DH.scene_mitra_fields_init)<2){ + if(DH.get_int_property(DH.name_mitra, "wares")!=-1){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init, "", 0); + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_init, 2); + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init, "", 1); + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_init, 2); + } + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_init); + } + } + + } + + private function overworld_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + if(DH.a_chunk_just_finished()){ + state_counter++; + EventScripts.scale_vector(this, player, velocity, 80); + visible=true; + + } else { + if(Math.abs(player.y -y)<48){ + if(!Registry.EVENT_CHANGE_VOLUME_SCALE && !DH.a_chunk_is_playing()){ + Registry.sound_data.start_song_from_title("MITRA"); + Registry.volume_scale=1; + x -=20;// Keep mitra off screen + player.state=player.S_INTERACT; + player.play("idle_l"); + play("bike_r"); + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + } else { + + } + } + } + break; + case 1:// Move down + player.state=player.S_INTERACT; + if(player.x - x<24 &&(x>Registry.CURRENT_GRID_X * 160 + 40)){ + state_counter++; + velocity.x=0; + velocity.y=80; + play("bike_d"); + } + break; + case 2:// move right + if(y - player.y>24){ + state_counter++; + velocity.y=0; + velocity.x=80; + player.play("idle_d"); + play("bike_r"); + } + break; + case 3://Hit the wall, flash, shake, cahnge graphic + if(touching !=NONE){ + FlxG.shake(0.02, 0.3); + Registry.sound_data.sun_guy_death_s.play(); + loadGraphic(mitra_sprite, true, false, 16, 16); + width=height=10; + offset.x=3; + offset.y=3; + velocity.x=velocity.y=0; + play("idle_r"); + + //Bike stuff + bike.visible=true; + bike.x=x - 4;bike.y=y; + + // After flash, move left + FlxG.flash(0xffffffff, 1.0, function():Void { + state_counter++; + velocity.x=-20; + velocity.y=0; + play("walk_l"); + player.play("idle_r"); + }); + } + break; + case 4: + // walk up to player + if(x-4){ + velocity.x=20; + play("walk_r"); + } else if(dx>-20 && dx<-4){ + velocity.x=20; + play("walk_r"); + } + } else { + player.be_idle(); + // Touch the bike first + play("walk_r"); + touching=NONE; + velocity.x=20; + player.state=player.S_INTERACT; + + if(EventScripts.distance(this,bike)<8){ + state_counter++; + to_bike(); + bike.visible=false; + play("bike_d"); + velocity.y=50; + velocity.x=0; + } + } + } else { + if(false==DH.a_chunk_is_playing()&& EventScripts.distance(this, player)>48){ + player.be_idle(); + DH.set_scene_to_end(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_overworld_initial_overworld); + // otherwise wait for Interaction + } else { + idle(DH.scene_mitra_overworld_initial_overworld); + } + } + break; + case 8: + // When off map, change song back + if(y>160 *(Registry.CURRENT_GRID_Y + 1)+ 30){ + Registry.volume_scale -=0.02; + if(Registry.volume_scale<0.2){ + DH.enable_menu(); + DH.dont_need_recently_finished(); + player.state=player.S_GROUND; + player.ANIM_STATE=7; + Registry.sound_data.start_song_from_title("OVERWORLD"); + Registry.volume_scale=1; + exists=false; + } + } + break; + + } + } + + + private function idle(scene:String):Void + { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + EventScripts.face_and_play(player, this, "idle"); + DH.start_dialogue(DH.name_mitra, scene); + + if(scene==DH.scene_mitra_overworld_initial_overworld){ + // If we heard the "wares" line then set a flag which + // affects the init FIELDS scene for mitra + DH.increment_property(DH.name_mitra, "wares"); + } + } + } + + private function idle_card():Void { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + + EventScripts.face_and_play(player, this, "idle"); + + // Give quest hint first till they go to cliff? + if(!gave_quest_hint){ + gave_quest_hint=true; + if(Registry.GE_States[Registry.GE_QUEST_CLIFF]==false){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_quest_event); + Registry.GE_States[Registry.GE_QUEST_MITRA]=true; + return; + } + } + + + var i:Int=Std.int(36 * Math.random()); + + for(j in 0...36){ + if(!Registry.card_states[(i + j)% 36]){ + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_card_hints,(i + j)% 36); + break; + } + } + if(Registry.nr_growths==0){ + DH.set_scene_to_pos(DH.name_mitra, DH.scene_mitra_fields_card_hints, 36); + } + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_card_hints); + } + } + + private var gave_quest_hint:Bool=false; + private function idle_fields():Void { + immovable=true; + active_region.x=x - 2; + active_region.y=y - 2; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(Registry.keywatch.JP_ACTION_1 && player.overlaps(active_region)&& EventScripts.are_facing_opposite(this, player)){ + EventScripts.face_and_play(player, this, "idle"); + + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + Registry.inventory[Registry.IDX_BIKE_SHOES]=false; + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.bound_item_2="JUMP"; + + //DH.dialogue_popup("Wow, are those the biking shoes from Finty's shop? You're giving them to me? Thanks, Young, I really appreciate it! Here, try out my old shoes in return--I think you'll find them really useful! There's an engraving on the shoes that says \"Press " + Registry.controls[Keys.IDX_ACTION_2] + " to jump\". I've never understood that, though, because there's no \"" + Registry.controls[Keys.IDX_ACTION_2] + "\" anywhere on the shoes..."); + DH.dialogue_popup(DH.lk("mitra", 8)+ " " + Registry.controls[Keys.IDX_ACTION_2] + " " + DH.lk("mitra", 9)+ Registry.controls[Keys.IDX_ACTION_2] + DH.lk("mitra", 10)); + + } else if(!gave_initial_hint){ + + gave_initial_hint=true; + // Before widmill event. + if(0==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + // hint to go to beach(or forest) + if(!Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && !Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + if(Math.random()<0.5){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 1); + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 2); + } + } else if(Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && !Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 8); + + } else if(!Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 7); + // hint to go to windmill + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 3); + } + } else { + // If the bosses aren't all dead, hint to go past dungeon statues + if(!Registry.all_bosses_dead()){ + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 4); + // If don't have the transformer, hint to go to terminal + } else if(!Registry.inventory[Registry.IDX_TRANSFORMER]){ // No GO yet + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 5); + // Otheriwse a hint for hte puzzle? + } else { // got swap + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_game_hints, "FIELDS", 6); + } + } + } else if(!gave_quest_hint){ + // Give quest hint first till they go to cliff? + if(Registry.GE_States[Registry.GE_QUEST_CLIFF]==false){ + if(true==DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_quest_event)){ + gave_quest_hint=true; + Registry.GE_States[Registry.GE_QUEST_MITRA]=true; + } + return; + } + } else { + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_fields_general_banter); + } + } + } + + private function to_bike():Void + { + loadGraphic(mitra_on_bike_sprite, true, false, 20, 20); + width=height=10; + centerOffsets(true); + } + + public function on_anim_change(name:String, frame:Int, index:Int):Void { + if(name=="walk_l" || name=="bike_l" || name=="idle_l"){ + scale.x=-1; + + } else { + scale.x=1; + } + } + + override public function destroy():Void + { + parent.sortables.remove(bike, true); + bike.destroy(); + bike=null; + + if(sage !=null){ + parent.sortables.remove(sage, true); + sage.destroy(); + sage=null; + } + + if(bullet !=null){ + parent.sortables.remove(bullet, true); + bullet.destroy(); + bullet=null; + } + + active_region.destroy(); + active_region=null; + + sage_active_region.destroy(); + sage_active_region=null; + + DH.a_chunk_just_finished(); + DH.enable_menu(); + super.destroy(); + } + + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/npc/Redsea_NPC.hx b/intra/source/entity/interactive/npc/Redsea_NPC.hx new file mode 100644 index 0000000..599bf74 --- /dev/null +++ b/intra/source/entity/interactive/npc/Redsea_NPC.hx @@ -0,0 +1,110 @@ +package entity.interactive.npc +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import helper.S_NPC; +import org.flixel.AnoSprite; +import org.flixel.FlxG; +import org.flixel.FlxObject; + +/** + * ... + * @author Melos Han-Tani + */ +class Redsea_NPC extends AnoSprite +{ + + private var type:Int; + + private static inline var T_HAIR:Int=0; + private static inline var T_BOMB:Int=1; + + public var active_region:FlxObject; + + //[Embed(source="../../../res/sprites/npcs/redsea_npcs.png")] public static inline var embed_redsea_npcs:Class; + + public function new(a:Array) + { + super(a); + + loadGraphic(embed_redsea_npcs, true, false, 16, 16); + switch(parseInt(xml.@frame)){ + // ... + case 0://hair + type=T_HAIR; + addAnimation("walk_d", [0, 1], 4); + addAnimation("walk_r", [2,3], 4); + addAnimation("walk_u", [4,5], 4); + addAnimation("walk_l", [6, 7], 4); + play("walk_d"); + break; + case 10:// bomb + xml.@p="2"; + if(xml.@alive=="false"){ + exists=false; + } + type=T_BOMB; + addAnimation("walk", [10, 11], 4); + play("walk"); + DH.set_scene_to_pos(DH.name_generic_npc, "bomb", 0); + break; + } + active_region=new FlxObject(0, 0, 20, 20); + Registry.subgroup_interactives.push(this); + } + + + private var S_exploding:Int=1; + private var s_exploded:Int=2; + private var t:Float=0; + private var tm:Float=1; + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + immovable=true; + FlxG.collide(this, player); + if(type==T_HAIR){ + EventScripts.face_and_play(this, player, "walk"); + if(DH.nc(player, active_region)){ + if(S_NPC.check_to_play_second(DH.name_generic_npc, DH.scene_generic_npc_any_first, "REDSEA")){ + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_second, "REDSEA"); + } else { + DH.start_dialogue(DH.name_generic_npc, DH.scene_generic_npc_any_first, "REDSEA"); + } + } + } else if(type==T_BOMB){ + + if(state==s_exploded){ + visible=false; + x -=160; + y -=160; + } else if(state==S_exploding){ + if(DH.nc(player, active_region)){ + + EventScripts.make_explosion_and_sound(this); + if(player.overlaps(active_region)){ + player.touchDamage(1); + } + state=s_exploded; + DH.set_scene_to_pos(DH.name_generic_npc, "bomb", 0); + } + } else { + if(DH.scene_is_finished(DH.name_generic_npc, "bomb")){ + state=S_exploding; + xml.@alive="false"; + } + if(DH.nc(player, active_region)){ + if(DH.scene_is_finished(DH.name_generic_npc, "bomb")){ + // Explode + } else { + DH.start_dialogue(DH.name_generic_npc, "bomb"); + } + } + } + } + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/interactive/npc/Sage.hx b/intra/source/entity/interactive/npc/Sage.hx new file mode 100644 index 0000000..8473a32 --- /dev/null +++ b/intra/source/entity/interactive/npc/Sage.hx @@ -0,0 +1,770 @@ +package entity.interactive.npc +{ +import data.Common_Sprites; +import entity.gadget.KeyBlock; +import flash.geom.Point; +import flash.utils.Endian; +import global.Keys; +import global.Registry; +import helper.Achievements; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxRect; +import org.flixel.FlxSprite; +import entity.player.Player; +import states.EndingState; +import states.PlayState; +class Sage extends FlxSprite +{ + + private var player:Player; + private var parent:Dynamic; + private var xml:XML; + + // The logic function specific to a map/area. + private var logic:Function; + + private var dame_frame:Int; + + private var state_counter:Int=0; + + private var briar_ref:FlxSprite; + private var whitelayer:FlxSprite; + // Generic flags + private var b1:Bool=false; + private var b2:Bool=false; + public var active_region:FlxObject; + + private var tl:Point=new Point(); + + + //[Embed(source="../../../res/sprites/npcs/sage.png")] public static var sage_sprite:Class; + public function new(_player:Player,_parent:Dynamic,_xml:XML) + { + + player=_player; + parent=_parent; + xml=_xml; + dame_frame=parseInt(xml.@frame); + super(parseInt(xml.@x), parseInt(xml.@y)); + + loadGraphic(sage_sprite, true, false, 16, 16); + addAnimation("walk_d", [0, 1], 6, true); + addAnimation("walk_r", [2,3], 6, true); + addAnimation("walk_l", [2,3],6, true); + addAnimation("walk_u", [4,5], 6, true); + addAnimation("idle_d",[6]); + addAnimation("idle_r", [7]); + addAnimation("idle_l", [7]); + addAnimation("idle_u", [8]); + addAnimationCallback(on_anim_change); + + width=height=10; + offset.x=3; + offset.y=3; + x +=3; + y +=3; + + tl.x=Registry.CURRENT_GRID_X * 160; + tl.y=Registry.CURRENT_GRID_Y * 160 + 20; + + play("idle_d"); + + + // Pick the function that will be called(for map-specific events, etc) + switch(Registry.CURRENT_MAP_NAME){ + case "BLANK": + visible=false; + logic=blank_logic; + Registry.subgroup_interactives.push(this); + break; + case "BEDROOM": + // Do not show up after being talked to once and having left bedroom + if(Registry.GE_States[Registry.GE_Left_BDR_After_Boss_Dead]){ + exists=false; + } + logic=bedroom_logic; + Registry.subgroup_interactives.push(this); + break; + case "REDCAVE": + if(Registry.GE_States[Registry.GE_Left_RDC_After_Boss_Dead] && Registry.inventory[Registry.IDX_RED_KEY]){ + exists=false; + } + play("idle_u"); + logic=redcave_logic; + Registry.subgroup_interactives.push(this); + break; + case "OVERWORLD": + // Do not show up after sunboss dead + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + exists=false; + } + logic=overworld_logic; + break; + case "NEXUS": + if(Registry.GE_States[Registry.GE_Sage_Dead_Idx]){ + exists=false; + } + logic=nexus_logic; + Registry.subgroup_interactives.push(this); + break; + case "TERMINAL": + // If all cards, sage should appear on the bridge for the fight, otherwise at terminal etrance. + xml.@p="2"; + if(xml.@alive=="false" || Registry.GE_States[Registry.GE_Sage_Dead_Idx]==true){ + exists=false; + } else { + logic=terminal_logic; + Registry.subgroup_interactives.push(this); + } + break; + case "CROWD": + if(Registry.GE_States[Registry.GE_Left_CRD_After_Boss_Dead]){ + exists=false; + } + logic=crowd_logic; + Registry.subgroup_interactives.push(this); + break; + case "GO": + + if(Registry.playtime<15 * 60){ + Achievements.unlock(Achievements.A_ENDING_SUB_15_M); + } + player.grid_entrance_x=tl.x + 75; + player.grid_entrance_y=tl.y + 140; + briar_ref=new FlxSprite; + briar_ref.loadGraphic(Shadow_Briar.embed_briar, true, false, 16, 16); + briar_ref.addAnimation("walk_d", [0, 1], 4); + briar_ref.addAnimation("walk_r", [2, 3], 4); + briar_ref.addAnimation("walk_u", [4, 5], 4); + briar_ref.addAnimation("walk_l", [6, 7], 4); + briar_ref.play("walk_d"); + briar_ref.x=tl.x + 16 * 4; + briar_ref.y=tl.y + 60; + briar_ref.framePixels_y_push=8; + + whitelayer=new FlxSprite(tl.x, tl.y); + whitelayer.makeGraphic(160, 160, 0xffffffff); + whitelayer.alpha=0; + whitelayer.height=2; + parent.sortables.add(whitelayer); + + parent.sortables.add(briar_ref); + + visible=false; + exists=true; + logic=gof_logic; + + parent.darkness.loadGraphic(Common_Sprites.ending_blend, true, false, 160, 160); + Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET=1; + Registry.EVENT_CHANGE_DARKNESS_ALPHA=true; + break; + } + + + immovable=true; + // Where the player can talk to sage + active_region=new FlxObject(x, y, 20, 20); + + + } + + override public function update():Void + { + active_region.x=x - 2; + active_region.y=y - 2; + if(parent.state==parent.S_NORMAL){ + logic(); + super.update(); + } + } + + + +//The player controls Young again. Jumps Into water and swims up to the next screen. Sees Briar swimming up off the top of the screen. Young struggles up through the water, sinking, the sides of the canal are steep, so Young sinks all the way Into the water> +// + //Dude, Young. +// +//Kick your feet. Move your arms. Jeez, you wouldn’t last a minute without me! + private function gof_logic():Void { + if(player.y>tl.y + 144){ + player.y=tl.y + 144; + } + DH.disable_menu(); + switch(state_counter){ + case 0: + if(player.ytl.x + 88){ + player.x=tl.x + 88; + } + briar_ref.framePixels_y_push=8; + briar_ref.velocity.y=-20; + briar_ref.play("walk_u"); + if(player.y14){ + player.state=player.S_INTERACT; + state_counter=1; + } + break; + case 1: + DH.start_dialogue(DH.name_briar, "final"); + player.framePixels_y_push=14; + state_counter=2; + break; + case 2: + + player.framePixels_y_push=14; + if(DH.a_chunk_is_playing()==false){ + player.state=player.S_INTERACT; + briar_ref.y=tl.y - 16; + briar_ref.play("walk_d"); + player.play("idle_u"); + briar_ref.framePixels_y_push=14; + briar_ref.velocity.y=25; + state_counter=3; + + } + break; + case 3: + player.framePixels_y_push=14; + EventScripts.move_to_x_and_stop(briar_ref, 10, player.x); + t_pushdown +=FlxG.elapsed; + if(t_pushdown>0.4 && briar_ref.framePixels_y_push<14){ + briar_ref.framePixels_y_push++; + t_pushdown=0; + } + if(EventScripts.distance(briar_ref, player)<7){ + briar_ref.play("idle_d"); + briar_ref.velocity.y=briar_ref.velocity.x=0; + state_counter=4; + } + break; + case 4: + t_pushdown +=FlxG.elapsed; + + player.framePixels_y_push=briar_ref.framePixels_y_push; + if(t_pushdown>0.3 && briar_ref.framePixels_y_push>0){ + t_pushdown=0; + briar_ref.framePixels_y_push--; + player.framePixels_y_push=briar_ref.framePixels_y_push; + } + // after rising from water play dialogue + if(briar_ref.framePixels_y_push==6){ + state_counter=5; + DH.start_dialogue(DH.name_briar, "final"); + + } + break; + + // +//Well, come on, let’s go get a sandwich or something. +// +//SAGE: + //You... you did adequately. Until we meet again. +//tl.y + 150){ + player.y=tl.y + 150; + } + if(player.x>tl.x + 92){ + player.x=tl.x + 92; + } + if(player.x1){ + state_counter=14; + t_pushdown=0; + Registry.GFX_WAVE_EFFECT_ON=true; + } + break; + case 14: + whitelayer.alpha +=0.002; + if(whitelayer.alpha>=1){ + play("walk_r"); + velocity.x=10; + var p:PlayState; + parent.black_overlay.alpha +=0.005; + if(parent.black_overlay.alpha>=1){ + t_pushdown +=FlxG.elapsed; + + Registry.volume_scale -=0.0015; + if(t_pushdown>3 && Registry.volume_scale<0.002){ + DH.enable_menu(); + Registry.GE_States[Registry.GE_Finished_Game]=true; + FlxG.switchState(new EndingState); + } + } + } + break; + default: + + if(FlxG.volume<0.002){ + //Registry.volume_scale=1; + Registry.sound_data.stop_current_song(); + FlxG.switchState(new EndingState); + } + break; + } + } + + private var t_pushdown:Float=0; + private var tm_pushdown:Float=1; + private var pushdown_val:Int=0; + + private function go_logic():Void { + switch(state_counter){ + case 0: + if(player.ytm_pushdown){ + t_pushdown=0; + if(pushdown_val<16)pushdown_val +=1; + } + briar_ref.framePixels_y_push=pushdown_val; + player.framePixels_y_push=pushdown_val; + + if(Registry.volume_scale>0)Registry.volume_scale -=0.01; + if(player.y<=tl.y + 2){ + player.velocity.y=0; + alpha -=0.005; + if(alpha<=0 && Registry.volume_scale<=0){ + + Registry.E_DESTROY_PLAYSTATE=true; + Registry.sound_data.stop_current_song(); + Registry.reset_events(); + Registry.reset_subgroups(); + state_counter +=1; + } + } else { + player.y -=0.4; + } + break; + case 4: + Registry.sound_data.big_door_locked.play(); + FlxG.flash(0xffffffff, 3, function():Void { FlxG.switchState(new EndingState);}); + // Load some image of the area. + parent.header_group.setAll("exists", false); + state_counter +=1; + break; + case 5: + + break; + } + } + + private var blank:Dynamic={ + played:false + }; + + private function blank_logic():Void { + if(!blank.played){ + blank.played=true; + if(dame_frame==0 && DH.get_scene_position(DH.name_sage,DH.scene_sage_blank_intro)==1){ + player.be_idle(); + DH.dialogue_popup(DH.lookup_string("sage", "BLANK","intro", 1)+ Registry.controls[Keys.IDX_ACTION_1] + DH.lookup_string("sage", "BLANK", "intro",2)); + DH.set_scene_to_pos(DH.name_sage, DH.scene_sage_blank_intro, 2); + } else if(dame_frame==1 && DH.get_scene_position(DH.name_sage, DH.scene_sage_blank_intro)==2){ + player.be_idle(); + DH.dialogue_popup(DH.lookup_string("sage", "BLANK", "intro",3)+ Registry.controls[Keys.IDX_PAUSE] + DH.lookup_string("sage", "BLANK","intro", 4)); + DH.set_scene_to_pos(DH.name_sage, DH.scene_sage_blank_intro, 3); + } + } + } + + private function crowd_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(46, 24, "walk_d", "idle_d", "idle_u", 20, 2, DH.scene_sage_crowd_one, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_crowd_one); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_crowd_one); + break; + } + } + + private function redcave_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(28, 16, "walk_u", "idle_u", "idle_d", 20, 2, DH.scene_sage_crowd_one, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_redcave_one); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_redcave_one); + + break; + } + } + + private function bedroom_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(48, 24, "walk_l", "idle_l", "idle_r", 20, 2, DH.scene_sage_bedroom_after_boss, DH.name_sage, this); + break; + case 1: + play_chunk_then_proceed(DH.scene_sage_bedroom_after_boss); + break; + case 2: + DH.enable_menu(); + idle(DH.scene_sage_bedroom_after_boss); + break; + + + } + } + private function nexus_logic():Void { + switch(state_counter){ + case 0:// Initial cutscene when entering from bLANK + wait_then_approach_player(64, 32, "walk_d", "idle_d", "idle_u", 20, 2, DH.scene_sage_nexus_enter_nexus, DH.name_sage, this); + + break; + case 1: + DH.disable_menu(); + play_chunk_then_proceed(DH.scene_sage_nexus_enter_nexus); + + break; + case 2:// Idle logic, messages change based on game state + DH.enable_menu(); + + + if(Registry.GE_States[Registry.GE_got_all_cards_inanarea] && DH.scene_is_dirty(DH.name_sage,DH.scene_sage_nexus_all_card_first)==false){ + idle(DH.scene_sage_nexus_all_card_first); + } else if(1==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening]){ + idle(DH.scene_sage_nexus_after_windmill); + } else if(0==Registry.CUTSCENES_PLAYED[Cutscene.Windmill_Opening] && Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] && Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + idle(DH.scene_sage_nexus_before_windmill); + } else if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + idle(DH.scene_sage_nexus_after_bed); + } else if(Registry.GE_States[Registry.GE_ent_str]){ + idle(DH.scene_sage_nexus_after_ent_str); + } else { + idle(DH.scene_sage_nexus_enter_nexus); + } + break; + } + + } + + private function overworld_logic():Void { + switch(state_counter){ + case 0: + DH.disable_menu(); + wait_then_approach_player(56, 28, "walk_d", "idle_d", "idle_u", 20, 5, DH.scene_sage_overworld_bedroom_entrance, DH.name_sage, this); + break; + case 1: + player.invincible_timer=0.3; + player.invincible=true; + play_chunk_then_proceed(DH.scene_sage_overworld_bedroom_entrance); + break; + case 2: + player.dontMove=true; + player.state=player.S_GROUND; + if(!b1 && player.broom.is_active()){ + b1=true; + } else if(b1 && !player.broom.is_active()){ + b1=false; + player.dontMove=false; + player.state=player.S_INTERACT; + state_counter++; + Registry.subgroup_interactives.push(this); + } + + + break; + case 3: + play_chunk_then_proceed(DH.scene_sage_overworld_bedroom_entrance); + if(state_counter !=3){ + player.state=player.S_GROUND; + } + break; + case 4: + DH.enable_menu(); + idle(DH.scene_sage_overworld_bedroom_entrance); + break; + case 5: + Registry.subgroup_interactives.push(this); + state_counter=4; + + } + } + public var ctr:Int=0; + private function terminal_logic():Void { + + active_region.x=x - 2; + active_region.y=y - 2; + immovable=true; + FlxG.collide(this, player); + EventScripts.face_and_play(this, player, "idle"); + if(ctr==0){ + if(EventScripts.distance(player, this)<46){ + // play Intro text at least once + if(DH.scene_is_dirty(DH.name_sage, DH.scene_sage_terminal_entrance)==false){ + Registry.GAMESTATE.dialogue_latency=-1; + player.be_idle(); + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance); + } + ctr++; + } + } else if(ctr==1){ + // autoplay if you have 36 or more + if(DH.nc(player, active_region)||(EventScripts.distance(player, this)<46 && Registry.nr_growths>=36)){ + player.be_idle(); + if(Registry.nr_growths<18){ + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance, "", 1); + } else if(Registry.nr_growths<36){ + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_entrance, "", 2); + } else { + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_sage, DH.scene_sage_terminal_etc,"",0); + ctr++; + } + } + } else if(ctr==2){ + if(DH.a_chunk_is_playing()==false){ + KeyBlock.sig_change=true; + ctr++; + } + } else if(ctr==3){ + if(player.ytm_wheel_snd){ + //t_wheel_snd=0; + //total_ticks --; + //Registry.sound_data.play_sound_group(Registry.sound_data.dialogue_blip_group); + //if(total_ticks<45){ + //tm_wheel_snd=0.05; + //wheel.play("spin3"); + //} else if(total_ticks<84){ + //tm_wheel_snd=0.09; + //wheel.play("spin2"); + //} else { + //wheel.play("spin1"); + //} + //} + //} + //if(total_ticks<0){ + //ctr--; + //FlxG.shake(0.01, 0.5); + //Registry.sound_data.hitground1.play(); + //wheel.play("idle"); + //player.state=player.S_INTERACT; + //} + //break; + //case -3: + //player.x=wheel_start_pt.x; + //player.y=wheel_start_pt.y; + //t_wheel_snd +=FlxG.elapsed; + //if(t_wheel_snd>1){ + //player.play("walk_r"); + //wheel.play("backspin"); + //FlxG.shake(0.01, 0.5); + //Registry.sound_data.hitground1.play(); + //ctr--; + //t_wheel_snd=0; + //total_ticks=50; + //} + //break; + //case -4: + //player.x=wheel_start_pt.x; + //player.y=wheel_start_pt.y; + //t_wheel_snd +=FlxG.elapsed; + //if(t_wheel_snd>tm_wheel_snd){ + //t_wheel_snd=0; + //Registry.sound_data.play_sound_group(Registry.sound_data.dialogue_blip_group); + //total_ticks--; + //if(total_ticks<0){ + //wheel.play("idle"); + //Registry.sound_data.player_hit_1.play(); + //ctr--; + //} + //} + //break; + //case -5: + //player.play("slumped"); + //if(EventScripts.send_property_to(player, "x", tl.x + 140,2)){ + //FlxG.shake(0.02, 0.76); + //Registry.sound_data.hitground1.play(); + //ctr=0; + //} + //break; + case 0: + ctr++; + DH.disable_menu(); + player.state=player.S_INTERACT; + player.be_idle(); + mitra.y=tl.y + 33; + mitra.visible=true; + break; + case 1: + Registry.volume_scale -=0.04; + if(Registry.volume_scale<=0){ + Registry.sound_data.stop_current_song(); + ctr++; + } + break; + case 2: + Registry.volume_scale +=0.01; + if(Registry.volume_scale>0.5){ + Registry.sound_data.start_song_from_title("MITRA"); + ctr++; + DH.start_dialogue(DH.name_mitra, DH.scene_mitra_blue_one); + } + break; + // 4. Mitra Bikes in. + // 5. Mitra sas hi + case 3: + if(DH.a_chunk_is_playing()==true)break; + if(Registry.volume_scale<1)Registry.volume_scale +=0.01; + mitra.play("bike_l"); + mitra.velocity.x=-70; + player.be_idle(); + player.state=player.S_INTERACT; + x=mitra.x; + y=mitra.y; + cid=CLASS_ID.MITRA; + if(mitra.xtl.x + 160){ + mitra.exists=false; + Registry.volume_scale -=0.03; + if(Registry.volume_scale<0){ + Registry.volume_scale=0; + Registry.sound_data.stop_current_song(); + ctr=69; + } + } + break; + case 69: + t +=FlxG.elapsed; + if(t>1.5){ + t=0; + ctr=8; + y=tl.y; + x=tl.x + 48; + } + break; + // 12. Briar fades in + case 8: + alpha +=0.02; + if(alpha>0.5){ + ctr++; + play("walk_d"); + } + break; + // 13. Briar walks down, while GO fades in + case 9: + alpha +=0.02; + Registry.volume_scale +=0.02; + if(Registry.volume_scale>0.5){ + velocity.y=20; + Registry.sound_data.start_song_from_title("GO"); + Water_Anim.START_WATER_ANIMF(); + ctr++; + } + break; + case 10: + alpha +=0.02; + if(Registry.volume_scale<1){ + Registry.volume_scale +=0.02; + } else { + Registry.volume_scale=1; + } + + if(y>tl.y + 43){ + velocity.y=0; + velocity.x=-20; + Registry.GE_States[Registry.GE_Briar_Blue_Done]=true; + play("walk_l"); + ctr++; + } + break; + case 11: + if(x0){ + ctr++; + player.be_idle(); + player.state=player.S_INTERACT; + DH.disable_menu(); + play("walk_d"); + } + break; + case 1: + Registry.volume_scale -=0.01; + if(Registry.volume_scale<=0){ + ctr++; + Registry.sound_data.stop_current_song(); + Registry.GE_States[Registry.GE_Briar_Happy_Done]=true; + } + break; + case 2: + // walk downwards a bit, fading in. remove palyer control + alpha +=0.004; + Registry.volume_scale +=0.004; + if(alpha>0.4){ + velocity.y=20; + if(Registry.sound_data.current_song !=null && !Registry.sound_data.current_song.playing){ + Water_Anim.START_WATER_ANIMF(); + Registry.sound_data.start_song_from_title("GO"); + } + } + if(y>=tl.y + 44){ + velocity.y=0; + velocity.x=20; + play("walk_r"); + alpha=1; + ctr++; + } + break; + case 3: + // walk to the right, out of the screen + if(x>tl.x + 16 * 10){ + visible=false; + velocity.x=0; + ctr++; + } + break; + case 4: + player.state=player.S_GROUND; + DH.enable_menu(); + is_finished_happy=true; + Registry.GE_States[Registry.GE_Briar_Happy_Done]=true; + xml.@alive="false"; + exists=false; + break; + } + } + + private function update_beach():Void { + + switch(ctr){ + case 0: + play("walk_d"); + velocity.y=20; + alpha +=0.007; + if(alpha>=1){ + ctr++; + play("idle_d"); + } + break; + case 1: + velocity.y=0; + + if(player.overlaps(this)){ + ctr++; + velocity.y=15; + play("walk_d"); + xml.@alive="false"; + } + break; + case 2: + alpha -=0.01; + break; + + } + + } + + private function update_forest():Void { + switch(ctr){ + case 0: + play("walk_u"); + velocity.y=-20; + alpha +=0.005; + if(y16){ + EventScripts.scale_vector(midpoint, player.midpoint, velocity, 70); + } else { + velocity.x=velocity.y=0; + } + + if(touching &(UP | DOWN)){ + velocity.y=0; + } + + if(touching &(LEFT | RIGHT)){ + velocity.x=0; + } + + if(velocity.x==0 && velocity.y==0){ + // Do nothing + } else if(Math.abs(velocity.x)>Math.abs(velocity.y)){ + if(velocity.x>0){ + play("walk_r"); + } else { + play("walk_l"); + } + } else { + if(velocity.y>0){ + play("walk_d"); + } else { + play("walk_u"); + } + } + + // Determine events + gx=Registry.CURRENT_GRID_X; + gy=Registry.CURRENT_GRID_Y; + + if(gx==7 && gy==4){ // shop + if(DH.get_int_property(DH.name_shopkeeper,"talkedto")!=-1){ + if(t_talk>tm_talk)t_talk=0;// Want the timer to be local to this room + t_talk +=FlxG.elapsed; + if(false==DH.a_chunk_is_playing()&& t_talk>tm_talk && DH.get_int_property(DH.name_miao, "shop")==-1){ + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_shop); + player.be_idle(); + DH.increment_property(DH.name_miao, "shop"); + } + } + } else if(gx==5 && gy==4){ // Mitra + if(false==DH.a_chunk_is_playing()&& DH.scene_is_dirty(DH.name_mitra, DH.scene_mitra_fields_init)==true){ + if(t_talk>tm_talk)t_talk=0; + t_talk +=FlxG.elapsed; + if(t_talk>tm_talk && DH.get_int_property(DH.name_miao, "mitra")==-1){ + Registry.GAMESTATE.dialogue_latency=-1; + player.be_idle(); + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_mitra); + player.be_idle(); + DH.increment_property(DH.name_miao, "mitra"); + } + } + + } else if(gx==6 && gy==3){ // Nexus pad + if(t_talk>tm_talk)t_talk=0; + t_talk +=FlxG.elapsed; + if(t_talk>tm_talk && DH.get_int_property(DH.name_miao, "nexus")==-1){ + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_nexus); + player.be_idle(); + DH.increment_property(DH.name_miao, "nexus"); + } + + } else { + t_talk +=FlxG.elapsed; + if(t_talk>70 && DH.a_chunk_is_playing()==false){ + Registry.GAMESTATE.dialogue_latency=-1; + t_talk=0; + if(Registry.GE_States[Registry.GE_tradequestspookedmonster]==false){ + player.be_idle(); + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_icky_worry); + } else if(DH.get_int_property(DH.name_miao,"nexus")!=-1 && DH.get_int_property(DH.name_miao,"mitra")!=-1 && DH.get_int_property(DH.name_miao,"shop")!=-1){ + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", 5 + Std.int(3 * Math.random())); + trace("Saying random"); + } + } + } + + // Say something if you leave the map + if(// 3,3 7,5 + (Registry.CURRENT_GRID_Y<2 || Registry.CURRENT_GRID_Y>5 || Registry.CURRENT_GRID_X<3 || Registry.CURRENT_GRID_X>7) + ||(Registry.GAMESTATE.SWITCH_MAPS==true && hasnt_left==true)){ + hasnt_left=false; + player.be_idle(); + leavingleaving=true; + DH.start_dialogue(DH.name_miao, DH.scene_miao_randoms, "", cat_idx_leave_map); + } + + if(leavingleaving && Registry.GAMESTATE.state !=Registry.GAMESTATE.S_TRANSITION){ + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_ref, true); + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_dust_ref, true); + state=s_cat_water; + cat_ref=null; + cat_dust_ref=null; + } + // go to water + //if distance>16 from center, move towardsplayer + + if(cat_dust_ref !=null){ + cat_dust_ref.x=x - 2; + cat_dust_ref.y=y; + cat_dust_ref.height=3; + + if(player.ON_CONVEYER)ON_CONVEYER=true; + if(ON_CONVEYER && cat_dust_ref.frame==Dust.EMPTY_FRAME){ + cat_dust_ref.play("unpoof"); + cat_dust_ref.visible=true; + } else if(!ON_CONVEYER && cat_dust_ref.frame==0){ + cat_dust_ref.play("poof"); + } + } + + break; + case s_cat_water: + break; + } + + ON_CONVEYER=false; + } + private var leavingleaving:Bool=false; + + private static inline var goldman_idx_run_away:Int=0; + private static inline var goldman_idx_give_card:Int=1; + private static inline var goldman_idx_box_open:Int=2; + private static inline var goldman_idx_icky_thx:Int=3; + private function u_monster_out():Void { + if(state==s_monst_out_present){ + if(visible){ + FlxG.collide(this, player); + } + + } + + if(monster_box.visible){ + FlxG.collide(player, monster_box); + } + + // Monster present, run away if you have the cat + if(state==s_monst_out_present){ + active_region.x=x - 2; + active_region.y=y - 2; + + if(DH.a_chunk_is_playing()==false && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(cat_ref==null){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_outside); + } else { + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"",goldman_idx_run_away); + Registry.GE_States[Registry.GE_tradequestspookedmonster]=true; + state=s_monst_out_spooked; + } + } + // Mosnster, animate it running Into cave + } else if(state==s_monst_out_spooked){ + if(ctr==0){ + player.state=player.S_INTERACT; + if(false==DH.a_chunk_is_playing()){ + velocity.y=-40; + play("walk_u"); + ctr=1; + } + } else if(ctr==1){ + if(ytl.x + 160){ + visible=false; + player.state=player.S_GROUND; + ctr=0; + state=s_monst_out_gone; + } + } + } + + // Monster gone. If we're here wait till we Interact with box + // then make it dispappear, small cat pops out, state, etc. + } else if(state==s_monst_out_gone){ + monster_box_ar.x=monster_box.x - 2; + monster_box_ar.y=monster_box.y + 2; + + if(ctr==0){ + if(DH.a_chunk_is_playing()==false && player.overlaps(monster_box_ar)&& Registry.keywatch.JP_ACTION_1){ + Registry.GAMESTATE.dialogue_latency=-1; + Registry.sound_data.broom_hit.play(); + player.actions_disabled=true; + player.be_idle(); + DH.disable_menu(); + ctr=1; + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_box_open); + monster_box.frame +=1; + Registry.inventory[Registry.IDX_BOX]=true; + } + } else if(ctr==1){ + player.actions_disabled=true; + if(DH.a_chunk_is_playing()==false){ + other_cat.visible=true; + monster_box.visible=false;// make box disappear + monster_box_ar.x -=1000; + player.state=player.S_INTERACT; + player.be_idle(); + other_cat.velocity.x=20; + other_cat.play("walk_r"); + ctr=2; + } + + } else if(ctr==2){ + if(other_cat.x>tl.x + 85){ + other_cat.velocity.x=0; + if(DH.a_chunk_is_playing()==false){ + ctr=3; + Registry.GAMESTATE.dialogue_latency=-1; + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"", goldman_idx_icky_thx); + other_cat.play("walk_d"); + } + } + } else if(ctr==3){ + player.actions_disabled=true; + player.state=player.S_INTERACT; + if(DH.a_chunk_is_playing()==false){ + player.state=player.S_GROUND; + DH.enable_menu(); + other_cat.play("walk_r"); + other_cat.velocity.x=40; + ctr=4; + } + } else if(ctr==4){ + if(other_cat.x>tl.x + 6 * 16){ + other_cat.velocity.x=0; + other_cat.play("walk_d"); + ctr++; + } + } else if(ctr==5){ + monster_box_ar.x=other_cat.x - 2; + monster_box_ar.y=other_cat.y - 2; + monster_box_ar.width=20; + monster_box_ar.height=20; + + other_cat.immovable=true; + FlxG.collide(player, other_cat); + if(player.overlaps(monster_box_ar)){ + player.actions_disabled=true; + } + if(DH.nc(player, monster_box_ar)){ + player.actions_disabled=true; + player.be_idle(); + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc,"",goldman_idx_icky_thx+1); + } + } + } + + } + + private function u_monster_in():Void { + FlxG.collide(this, player); + active_region.x=x - 2; + active_region.y=y - 2; + if(DH.a_chunk_is_playing()==false && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(Registry.GE_States[Registry.GE_tradequesthelpedmonster]){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_give_card); + } else { + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_inside); + } + } + + if(state==s_monst_in_unhelped){ + var exists_ct:Int=0; + for(var dust:Dust in dusts.members){ + + if(!dust.fell_in_hole){ + exists_ct ++; + } + } + + for(dust in Registry.subgroup_dust){ + if(dust !=null && !dust.fell_in_hole){ + exists_ct +=1; + } + } + if(exists_ct==0){ + state=s_monst_in_giving; + } + } else if(state==s_monst_in_helped){ + x=tl.x + 16 * 7; + } else if(state==s_monst_in_giving){ + if(ctr==0){ + DH.start_dialogue(DH.name_goldman, DH.scene_goldman_etc, "", goldman_idx_give_card); + ctr=1; + } else if(ctr==1){ + // give gift + Registry.GE_States[Registry.GE_tradequesthelpedmonster]=true; + ctr=2; + } else if(ctr==2){ + velocity.x=20; + play("walk_r"); + if(x>tl.x + 16 * 7){ + velocity.x=0; + play("walk_d"); + state=s_monst_in_helped; + } + } + } + } + + private var shop_start_anim:Bool=false; + private var shop_array:Array=new Array(false, false, false, false); + private var shop_card_start:Bool=false; + private var shop_ctr:Int=0; + + private function u_shop():Void { + FlxG.collide(this, player); + active_region.x=x - 2; + active_region.y=y - 2; + + //if(FlxG.keys.justPressed("B")){ + //Registry.inventory[Registry.IDX_BOX]=true; + //} else if(FlxG.keys.justPressed("W")){ + //Registry.inventory[Registry.IDX_JUMP]=true; + //Registry.card_states[Registry.CARD_GOLDMAN_IDX]=1; + //} else if(FlxG.keys.justPressed("Q")){ + //Registry.inventory[Registry.IDX_JUMP]=true; + //Registry.card_states[Registry.CARD_GOLDMAN_IDX]=0; + //} else if(FlxG.keys.justPressed("R")){ + //state=s_shop_unhelped; + //} + + if(shop_card_start){ + if(shop_ctr==0){ + if(parent.state !=parent.S_DIALOGUE){ + card.visible=true; + card.x=player.x - 8; + card.y=player.y - 8; + Registry.sound_data.get_treasure.play(); + shop_ctr ++; + } + } else if(shop_ctr==1){ + card.flicker(2); + shop_ctr++; + } else if(shop_ctr==2){ + if(card.flickering==false){ + card.exists=false; + } + } + } + + + if(Registry.PLAYSTATE.state !=Registry.PLAYSTATE.S_DIALOGUE && player.overlaps(active_region)&& Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + if(DH.get_int_property(DH.name_shopkeeper, "talkedto")==-1){ + DH.increment_property(DH.name_shopkeeper, "talkedto"); + //DH.dialogue_popup("Finty:Welcome, welcome, my friend Young! The name’s Prasandhoff--Finty Prasandhoff! Take a look around at my shop and see if anything catches your eye!"); + DH.dialogue_popup(DH.lk("tradenpc", 0)); + }else if(state==s_shop_helped){ + //DH.dialogue_popup("Finty:I still appreciate that box!"); + DH.dialogue_popup(DH.lk("tradenpc", 1)); + } else { + if(Registry.inventory[Registry.IDX_BOX]){ + Registry.inventory[Registry.IDX_BOX]=false; + state=s_shop_helped; + Registry.GE_States[Registry.GE_tradequesthelpedshopkeeper]=true; + if(Registry.inventory[Registry.IDX_JUMP] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]){ + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!^ Wait a minute...it's not here! What happened to it? Well, here, let me ease your wounds instead!");//Goldman card + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc",11)+" "+DH.lk("tradenpc",3)); + player.health_bar.modify_health(20); + } else if(Registry.inventory[Registry.IDX_JUMP] && Registry.card_states[Registry.CARD_GOLDMAN_IDX]==0){ + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take this ugly--I mean beautiful, collector's edition card!"); + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc", 11)); + Registry.card_states[Registry.CARD_GOLDMAN_IDX]=1; + Registry.nr_growths++; + shop_card_start=true; + } else { + //DH.dialogue_popup("Finty:Ah, a box! Thank you so much! Now I can carry all my inventory home at night and back in the morning! As a token of my gratitude, take these stylish biking shoes!"); + DH.dialogue_popup(DH.lk("tradenpc", 2)+" "+DH.lk("tradenpc",4)); + Registry.inventory[Registry.IDX_BIKE_SHOES]=true; + shop_start_anim=true; + } + // Give the player the BIKE SHOEZ or a NICE GIFT + } else { + //DH.dialogue_popup("Fine morning out, isn't it, my friend? A fine morning for shopping! I just wish I had a box to carry my inventory around."); + DH.dialogue_popup(DH.lk("tradenpc", 5)); + } + } + } + + + if(shop_start_anim){ + + if(items.members[2].frame !=57){ + items.members[2].acceleration.y=-10; + + if(items.members[2].velocity.y<-10 && items.members[2].velocity.y>-15){ + items.members[2].flicker(1); + } + + if(items.members[2].velocity.y<-25){ + if(items.members[2].flickering==false){ + items.members[2].alpha=0; + items.members[2].velocity.y=items.members[2].acceleration.y=0; + items.members[2].y=items.members[1].y; + items.members[2].frame=57; + } + } + } else if(items.members[2].frame==57){ + items.members[2].alpha +=0.01; + if(items.members[2].alpha>=1){ + shop_start_anim=false; + } + } + } + for(var item:FlxSprite in items.members){ + item.immovable=true; + FlxG.collide(player, item); + if(player.xitem.x - 2&& player.yitem.y - 2){ + if(DH.a_chunk_is_playing()==false && Registry.keywatch.JP_ACTION_1){ + player.actions_disabled=true; + player.be_idle(); + if(shop_array[item.frame - 54]){ + DH.dialogue_popup("Too bad, looks like you can't afford this item! Come back later, when you have the cash!"); + + DH.dialogue_popup(DH.lk("tradenpc", 6)); + break; + } + switch(item.frame){ + case 54: + //DH.dialogue_popup("Finty:Ah, you have a fine eye! You need a better weapon, don't you? Blow your enemies to pieces for only $499.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 7)); + shop_array[0]=true; + break; + case 55: + //DH.dialogue_popup("Finty:That money sack will allow you to accumulate money that you find in The Land! It's yours for a mere $869.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 8)); + shop_array[1]=true; + break; + case 56: + //DH.dialogue_popup("Finty:Oh ho ho, here's a specialty item indeed:clip-in bike shoes so you can be speedy AND stylish! On sale now for just $299.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 9)); + shop_array[2]=true; + break; + case 57: + //DH.dialogue_popup("Finty:Tired of shoving dust around with your piddling little broom? Eradicate harmful dust particles with this state-of-The-Art vacuum cleaner! Just $749.99, or four easy, monthly payments of $199.99!"); + DH.dialogue_popup(DH.lk("tradenpc", 10)); + shop_array[3]=true; + break; + } + } + } + } + } + +} \ No newline at end of file diff --git a/intra/source/entity/player/Broom.hx b/intra/source/entity/player/Broom.hx new file mode 100644 index 0000000..17080a5 --- /dev/null +++ b/intra/source/entity/player/Broom.hx @@ -0,0 +1,337 @@ +package entity.player +{ +import entity.gadget.Dust; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import global.Registry; +class Broom extends FlxSprite +{ + + + /* + * @param root:Who this broom is attached to. + **/ + + public var root:Player; + + public var horizontal_broom:FlxSprite; + public var vertical_broom:FlxSprite; + public var has_dust:Bool=false; + public var dust:Dust; + public var just_released_dust:Bool=false; + + public var is_wide:Bool=false; + public var is_long:Bool=false; + + public var long_attack_v:FlxSprite=new FlxSprite(); + public var wide_attack_v:FlxSprite=new FlxSprite(); + public var long_attack_h:FlxSprite=new FlxSprite(); + public var wide_attack_h:FlxSprite=new FlxSprite(); + + private var WATK_W:Int=24; + private var WATK_H:Int=12; + private var LATK_W:Int=12; + private var LATK_H:Int=22; + + public var visible_timer:Float=0; + + private var is_behind_player:Bool=false; + + private var just_played_extra_anim:Bool=false; + + + public var locked:Bool;//When the player is holding attack, broom should not switch directions. + //[Embed(source="../../res/sprites/inventory/broom.png")] public static var Broom_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/knife.png")] public static var Knife_Sprite:Class; + //[Embed(source="../../res/sprites/broom_cell.png")] public static var Cell_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/broom-icon.png")] public static var Icon_Broom_Sprite:Class; + //[Embed(source="../../res/sprites/inventory/wide_attack_h.png")] public static var Wide_Attack_h:Class; + //[Embed(source="../../res/sprites/inventory/long_attack_h.png")] public static var Long_Attack_h:Class; + //[Embed(source="../../res/sprites/inventory/wide_attack_v.png")] public static var Wide_Attack_v:Class; + //[Embed(source="../../res/sprites/inventory/long_attack_v.png")] public static var Long_Attack_v:Class; + public function new(_root:Player, _x:Int, _y:Int){ + root=_root; + x=root.x- 10; + y=root.y; + loadGraphic(Broom_Sprite, true, true, 16, 16); + + addAnimation("stab", [1, 2,2,1,0,0], 20, false); + addAnimation("stab2", [4, 5,5,4,3,9], 20, false); + addAnimation("stab3", [7 , 8, 8, 7, 6, 9], 20, false); + + wide_attack_h.loadGraphic(Wide_Attack_h, true, false, WATK_W,WATK_H); + wide_attack_v.loadGraphic(Wide_Attack_v, true, false, WATK_H,WATK_W); + long_attack_h.loadGraphic(Long_Attack_h, true, false, LATK_H,LATK_W); + long_attack_v.loadGraphic(Long_Attack_v, true, false, LATK_W, LATK_H); + + // Add lots of blank frames to the end of the animation. It is a hack to + // avoid complexity in the code. + + //ASSUMES THAT LONG ATTACK FACES LEFT/UP BY DEFAULT + //ASSUMES THAT WIDE ATTACK FACES LEFT/UP BY DEFAULT + wide_attack_h.addAnimation("a", [0,1,2,3,4], 14, false); + wide_attack_v.addAnimation("a", [0,1,2,3,4], 14, false); + long_attack_h.addAnimation("a", [0,1,2,3,4], 14, false); + long_attack_v.addAnimation("a", [0,1,2,3,4], 14, false); + } + + public function is_active():Bool { + if(frame==0){ + return false; + } + return true; + } + + override public function draw():Void + { + super.draw(); + } + override public function update():Void { + + if(!has_dust && dust !=null){ + dust=null; + } + if(finished){ + visible=false; + } + /* Hack to get around bug where broom gets "stuck" visible, + * I can't reprodue.... */ + if(visible){ + visible_timer +=FlxG.elapsed; + // needs to be long enough to ensure the broom makes a full anim + if(visible_timer>0.4){ + long_attack_h.visible=long_attack_v.visible=visible=false; + wide_attack_h.visible=wide_attack_v.visible=false; + } + } else { + visible_timer=0; + } + + + if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + is_wide=true; + is_long=false; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + is_wide=false; + is_long=true; + } else { + is_wide=is_long=false; + } + if(Registry.CURRENT_MAP_NAME=="TRAIN" || Registry.CURRENT_MAP_NAME=="SUBURB"){ + is_wide=is_long=false; + } + + wide_attack_h.visible=false; + long_attack_h.visible=false; + wide_attack_v.visible=false; + long_attack_v.visible=false; + offset.y=offset.x=0; + offset.y=-root.framePixels_y_push; + width=height=16; + + + if(!finished){ + wide_attack_v.scale.x=1; + wide_attack_h.scale.y=1; + long_attack_h.scale.x=1; + long_attack_v.scale.y=1; + + + + if(root.facing==LEFT){ + angle=0; + x=root.x - 14;y=root.y; + + if(is_wide && visible){ + y -=6; + offset.y=-6; + if(!just_played_extra_anim){ + wide_attack_v.play("a", true); + } + wide_attack_v.visible=true; + wide_attack_v.x=x; + wide_attack_v.y=y; + this.width=WATK_H; + this.height=WATK_W; + + + } else if(is_long && visible){ + x -=11; + offset.x=-11; + if(!just_played_extra_anim)long_attack_h.play("a",true); + long_attack_h.visible=true; + long_attack_h.x=x; + long_attack_h.y=y; + this.width=LATK_H; + this.height=LATK_W; + } + + switch(frame){ + case 0:x +=10;break; + case 1:x +=6;break; + case 2:x -=1;break; + } + } else if(root.facing==RIGHT){ + angle=180; + x=root.x + root.width;y=root.y - 2; + if(is_wide && visible){ + x +=4; + y -=6; + offset.x=4; + offset.y=-6; + wide_attack_v.scale.x=-1; + if(!just_played_extra_anim)wide_attack_v.play("a",true); + wide_attack_v.x=x; + wide_attack_v.y=y + 2; + wide_attack_v.visible=true; + this.width=WATK_H; + this.height=WATK_W; + } else if(is_long && visible){ + x +=6; + offset.x=6; + long_attack_h.scale.x=-1; + if(!just_played_extra_anim)long_attack_h.play("a",true); + long_attack_h.visible=true; + long_attack_h.x=x; + long_attack_h.y=y + 2; + this.width=LATK_H; + this.height=LATK_W; + + } + + switch(frame){ + case 0:x -=12;break; + case 1:x -=8;break; + case 2:x -=1;break; + } + } else if(root.facing==UP){ + angle=90; + x=root.x - 2;y=root.y - 16; + x=Std.int(x); + y=Std.int(y); + if(is_wide && visible){ + x -=2; + offset.x=-2; + if(!just_played_extra_anim)wide_attack_h.play("a",true); + wide_attack_h.x=x - 1; + wide_attack_h.y=y; + wide_attack_h.visible=true; + this.width=WATK_W; + this.height=WATK_H; + + } else if(is_long && visible){ + y -=9; + offset.y=-9; + x +=3; + offset.x=3; + if(!just_played_extra_anim)long_attack_v.play("a",true); + long_attack_v.x=x; + long_attack_v.y=y; + long_attack_v.visible=true; + width=LATK_W; + height=LATK_H; + } + switch(frame){ + case 0:y +=12;break; + case 1:y +=6;break; + case 2:y +=2;break; + } + } else if(root.facing==DOWN){ + angle=270; + x=root.x - 6;y=root.y + root.height; + if(is_wide && visible){ + x -=2; + y +=4; + offset.y=4; + offset.x=-2; + wide_attack_h.scale.y=-1; + if(!just_played_extra_anim)wide_attack_h.play("a",true); + wide_attack_h.x=x -2; + wide_attack_h.y=y; + wide_attack_h.visible=true; + this.width=WATK_W; + this.height=WATK_H; + } else if(is_long && visible){ + long_attack_v.scale.y=-1; + if(!just_played_extra_anim)long_attack_v.play("a",true); + long_attack_v.x=x; + long_attack_v.y=y; + long_attack_v.visible=true; + width=LATK_W; + height=LATK_H; + } + switch(frame){ + case 0:y -=8;break; + case 1:y -=5;break; + case 2:y -=2;break; + } + } + + + if(!just_played_extra_anim && visible &&(is_long || is_wide)){ + just_played_extra_anim=true; + } + } else { + just_played_extra_anim=false; + } + + switch(root.facing){ + case LEFT:case UP: + if(! is_behind_player){ + flip_player_broom_draw_order(ANY); + } + break; + default: + if(is_behind_player){ + flip_player_broom_draw_order(NONE); + } + break; + } + + + super.update(); + } + + /** + * Moves the broom upgrades to right above the broom ased on bidx + * @param bidx + */ + private function move_upgrades():Void { + var pgm:Array=Registry.GAMESTATE.player_group.members; + var idx:Int=pgm.indexOf(wide_attack_h); + pgm.splice(idx, 4);// Delete thingy + var bidx:Int=pgm.indexOf(this); + pgm.splice(bidx + 1, 0, wide_attack_h, wide_attack_v, long_attack_h, long_attack_v); + } + private function flip_player_broom_draw_order(dir:Int):Void { + // player Broom + // foot<-> player + // Broom foot + is_behind_player=!is_behind_player; + var player_group_members:Array=Registry.GAMESTATE.player_group.members; + var player_idx:Int=player_group_members.indexOf(root); + var broom_idx:Int=player_group_members.indexOf(this); + var foot_overlay_idx:Int=player_group_members.indexOf(root.foot_overlay); + if(dir==ANY){ // left, up + player_group_members[player_idx]=this; + player_group_members[broom_idx]=root.foot_overlay; + player_group_members[foot_overlay_idx]=root; + move_upgrades(); + } else { // right, down + player_group_members[broom_idx]=root; + player_group_members[player_idx]=root.foot_overlay; + player_group_members[foot_overlay_idx]=this; + move_upgrades(); + } + + // flip reflections too! + if(root.reflection.exists){ + var reflect_broom_idx:Int=Registry.GAMESTATE.members.indexOf(root.reflection_broom); + var reflect_idx:Int=Registry.GAMESTATE.members.indexOf(root.reflection); + + Registry.GAMESTATE.members[reflect_broom_idx]=root.reflection; + Registry.GAMESTATE.members[reflect_idx]=root.reflection_broom; + } + + } +} \ No newline at end of file diff --git a/intra/source/entity/player/Foot_Overlay.hx b/intra/source/entity/player/Foot_Overlay.hx new file mode 100644 index 0000000..08047b6 --- /dev/null +++ b/intra/source/entity/player/Foot_Overlay.hx @@ -0,0 +1,266 @@ +package entity.player +{ +import global.Registry; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import states.PlayState; + +/** + * sanity class for the foot overlay + * @author Seagaia + */ +class Foot_Overlay extends FlxSprite +{ + //[Embed(source="../../res/sprites/decoration/player_overlay_foot_test.png")] public static var foot_test:Class; + //[Embed(source="../../res/sprites/decoration/overlay_APARTMENT_water.png")] public static var APARTMENT_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_REDCAVE_water.png")] public static var REDCAVE_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_REDSEA.png")] public static var REDSEA_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_WINDMILL_water.png")] public static var WINDMILL_water:Class; + //[Embed(source="../../res/sprites/decoration/overlay_FIELDS_grass.png")] public static var FIELDS_grass:Class; + //[Embed(source="../../res/sprites/decoration/overlay_water.png")] public static var general_water:Class; + + private var debug_tiles:Array=new Array(2, -1); + private var fields_tiles:Array=new Array(200,201,250,270,271,272,273, -1); + private var apartment_tiles:Array=new Array(206, 231, -1); + private var redcave_tiles:Array=new Array(16, 17, 18, 19, 28, -1); + private var redsea_tiles:Array=new Array(61, 71, -1); + private var circus_tiles:Array=new Array(110, 111, 112, 113, 114, -1); + private var windmill_tiles:Array=new Array(130, -1); + private var working_maps:Array=new Array("DEBUG", "FOREST", "TERMINAL", "GO", "FIELDS", "APARTMENT", "REDCAVE", "CIRCUS", "HOTEL", "WINDMILL","BEACH", "REDSEA"); + + + private var player:Player + private var cur_player_state:Int; + private var cur_player_anim_state:Int; + private var cur_tile:Int=-1; + + public var map:FlxTilemap; + private var map_name:String; + + + private var X_OFF:Int=-4; + private var Y_OFF:Int=0; + private var W:Int=24; + private var H:Int=24; + private var player_midpoint:FlxPoint=new FlxPoint(); + + + public function new(_player:Player) + { + super(); + + player=_player; + player_midpoint=player.getMidpoint(player_midpoint); + + if(working_maps.indexOf(Registry.CURRENT_MAP_NAME)==-1){ + exists=false; + } + + loadGraphic(foot_test, true, false, W, H); + addAnimation("foot_test", [0, 1], 12); + + //200 - yello, 201 - green + addAnimation("FIELDS_yellow_stop", [3],20); + addAnimation("FIELDS_yellow_go", [2, 3], 8); + addAnimation("FIELDS_green_stop", [5],20); + addAnimation("FIELDS_green_go", [4, 5], 8); + + addAnimation("REDCAVE_water", [0],1); + + addAnimation("APARTMENT_water", [0], 5); + + addAnimation("WINDMILL_water", [0, 1], 5); + + addAnimation("general_water", [0], 5); + + visible=false; + map_name=Registry.CURRENT_MAP_NAME; + } + + // When we change a map we need to reset some data + // so that things don't break. + public function reset_anodyne():Void { + map_name=Registry.CURRENT_MAP_NAME; + if(working_maps.indexOf(Registry.CURRENT_MAP_NAME)==-1){ + exists=false; + } else { + exists=true; + } + } + override public function update():Void + { + + player_midpoint=player.getMidpoint(player_midpoint); + + var tile_type:Int=map.getTile(player_midpoint.x/16,(player_midpoint.y - Registry.HEADER_HEIGHT)/16); + if(tile_type !=cur_tile){ + cur_tile=tile_type; + change_anim(); + } + + // Player state takes precedence over tile type + if(player.state !=cur_player_state){ + cur_player_state=player.state; + change_anim(); + } + + if(player.ANIM_STATE !=cur_player_anim_state){ + cur_player_anim_state=player.ANIM_STATE; + change_anim(); + } + + if(player.facing==LEFT){ + x=player.x - player.offset.x + X_OFF + 1; + } else if(player.facing==RIGHT){ + x=player.x - player.offset.x + X_OFF - 1; + + } else { + x=player.x - player.offset.x + X_OFF;//SUBTrACTION DOESNTO COMMUTe + y=player.y - player.offset.y + Y_OFF; + } + + super.update(); + } + + private function change_anim():Void { + flicker(0);// Stop infinite flickering + visible=false; + + Y_OFF=0; + + if(map_name=="DEBUG"){ + if(cur_player_state==player.S_GROUND){ + if(debug_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==2){ + visible=true; + loadGraphic(foot_test, true, false, W, H); + play("foot_test"); + } + } + } + } else if(map_name=="FIELDS"){ + if(cur_player_state==player.S_GROUND){ + if(fields_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==201){ + Y_OFF=-1; + loadGraphic(FIELDS_grass, true, false, W, H); + if(player.velocity.x==0 && player.velocity.y==0){ + visible=true; + play("FIELDS_green_stop"); + } else { + visible=true; + play("FIELDS_green_go"); + } + } else if(cur_tile==200){ + loadGraphic(FIELDS_grass, true, false, W, H); + if(player.velocity.x==0 && player.velocity.y==0){ + //visible=true; + play("FIELDS_yellow_stop"); + } else { + //visible=true; + play("FIELDS_yellow_go"); + } + } else { // It's a water tile + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + + } + } + } + } else if(map_name=="APARTMENT"){ + if(cur_player_state==player.S_GROUND){ + if(apartment_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==231 || cur_tile==206){ + visible=true; + loadGraphic(APARTMENT_water, true, false, W, H); + play("APARTMENT_water"); + flicker(-1); + } + } + } + } else if(map_name=="REDCAVE"){ + if(cur_player_state==player.S_GROUND){ + if(redcave_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==16 || cur_tile==17 || cur_tile==18 || cur_tile==19 || cur_tile==28){ + visible=true; + loadGraphic(REDCAVE_water, true, false, W, H); + play("REDCAVE_water"); + flicker(-1); + } + } + } + } else if(map_name=="REDSEA"){ + if(cur_player_state==player.S_GROUND){ + if(redsea_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==61 || cur_tile==71){ + visible=true; + loadGraphic(REDSEA_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } + } else if(map_name=="WINDMILL"){ + if(cur_player_state==player.S_GROUND){ + if(windmill_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==130){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + //flicker(-1); + } + } + } + } else if(map_name=="CIRCUS"){ + if(cur_player_state==player.S_GROUND){ + if(circus_tiles.indexOf(cur_tile)!=-1){ + if(cur_tile==110 || cur_tile==111 || cur_tile==112 || cur_tile==113 || cur_tile==114){ + visible=true; + loadGraphic(general_water, true, false, W, H); + play("general_water"); + flicker(-1); + } + } + } + } else if(map_name=="BEACH"){ + if(cur_player_state==player.S_GROUND){ + if((cur_tile>=140 && cur_tile<=146)|| cur_tile>=250){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } else if(map_name=="FOREST"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile==110 ||(cur_tile>=134 && cur_tile<=137)){ + visible=true; + loadGraphic(general_water, true, false, W, H); + play("general_water"); + flicker(-1); + } + } + } else if(map_name=="TERMINAL"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile==150 || cur_tile==151){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } else if(map_name=="GO"){ + if(cur_player_state==player.S_GROUND){ + if(cur_tile>=50 && cur_tile<=53){ + visible=true; + loadGraphic(WINDMILL_water, true, false, W, H); + play("WINDMILL_water"); + flicker(-1); + } + } + } + } +} \ No newline at end of file diff --git a/intra/source/entity/player/HealthBar.hx b/intra/source/entity/player/HealthBar.hx new file mode 100644 index 0000000..5cbfae9 --- /dev/null +++ b/intra/source/entity/player/HealthBar.hx @@ -0,0 +1,122 @@ +package entity.player +{ +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxGroup; +class HealthBar extends FlxGroup +{ + /** + * + * @param _x x coordinate of the top-right health box. + * @param _y y coordinate of the top-right health box. + * @param health Max number of health boxes to show. + */ + + public var cur_health:Int; + public var max_health:Int; + public var health_boxes:Array; + + public var BOX_WIDTH:Int=11; + public var BOX_HEIGHT:Int=6; + public var BOX_SPACING:Int=-3; + + public var COLOR_FULL:Int=0x7d1818; + public var COLOR_EMPTY:Int=0x494949; + + public var FULL_FRAME:Int=0; + public var EMPTY_FRAME:Int=1; + + public var NO_SCROLL:FlxPoint=new FlxPoint(0, 0); + public var x:Int; + //[Embed(source="../../res/sprites/inventory/health_piece.png")] public static var health_piece_sprite:Class; + + public function new(_x:Int,_y:Int,_max_health:Int) + { + super(16); + x=_x; + y=_y; + for(i in 0..._max_health){ + make_box(i+1); + + } + max_health=_max_health; + cur_health=max_health; + // Thse values are deserialized when continuing a save + Registry.MAX_HEALTH=max_health;// Want to do this because in the testing mode + Registry.CUR_HEALTH=cur_health;// Sometimes we do construct a health bar more than once. + } + + public function make_box(i:Int):Void { + i--; + var health_box:FlxSprite=new FlxSprite; + + health_box.x=(x - BOX_WIDTH - 8 *(7 - i % 8))- 7 * Std.int(i / 8); + health_box.y=y + Std.int(i / 8)*(BOX_HEIGHT + 1); + + health_box.loadGraphic(health_piece_sprite, true, false, BOX_WIDTH, BOX_HEIGHT); + health_box.alpha=1; + health_box.scrollFactor=NO_SCROLL; + health_box.addAnimation("flash", [0, 2], 7, true); + health_box.addAnimation("full", [0], 0,false); + + add(health_box); + } + /** + * + * @param change_amount How much the health changes + * @return -1 if the change resulted in 0 health, 1 if full, 0 otherwise + */ + public function modify_health(change_amount:Int):Int { + var nrChanges:Int=0; + var health_box:FlxSprite; + if(change_amount<0){ + if(-change_amount>cur_health)change_amount=-cur_health; + cur_health=Math.max(0, cur_health + change_amount); + while(nrChanges<-change_amount){ + health_box=getLastAlive()as FlxSprite; + + if(health_box==null)return -1; + health_box.alive=false; + health_box.frame=EMPTY_FRAME; + nrChanges++; + } + } else if(change_amount>0){ + cur_health=Math.min(max_health, cur_health + change_amount); + while(nrChanges1){ + members[0].play("full"); + } + + return 0; + } + + public static function upgrade_health(player:Player):Void { + player.health_bar.make_box(player.health_bar.max_health + 1);// Extend bar + player.health_bar.max_health ++;// Reflect changes in health bar state + player.health_bar.modify_health(player.health_bar.max_health);// Heal player + Registry.MAX_HEALTH++;// Reflect changes in global state + } + override public function update():Void { + super.update(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/player/HealthPickup.hx b/intra/source/entity/player/HealthPickup.hx new file mode 100644 index 0000000..99fd842 --- /dev/null +++ b/intra/source/entity/player/HealthPickup.hx @@ -0,0 +1,97 @@ +package entity.player +{ +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import states.PlayState; + +/** + * +1, +3 health things, and the extenderzzz + * @author Seagaia + */ +class HealthPickup extends FlxSprite +{ + + public static var HP_1:Int=1; + public static var HP_3:Int=3; + public static var HP_EXTEND:Int=0; + public var pickup_type:Int; + public var xml:XML; + public var parent:Dynamic; + public var LATENCY:Float=0.5;// Timeout for broom touching + //[Embed(source="../../res/sprites/inventory/small_health_pickup.png")] public static inline var S_SMALL_HEALTH:Class; + //[Embed(source="../../res/sprites/inventory/big_health_pickup.png")] public static inline var embed_Big_health:Class; + + public function new(x:Int,y:Int,_pickup_type:Int,_parent:Dynamic,_xml:XML=null):Void + { + super(x, y); + solid=false; + pickup_type=_pickup_type; + has_tile_callbacks=false; + parent=_parent; + switch(pickup_type){ + case HP_1: + loadGraphic(S_SMALL_HEALTH, true, false, 10, 16); + addAnimation("float", [0, 1, 2, 3], 5, true); + play("float"); + break; + case HP_3: + loadGraphic(embed_Big_health, true, false, 16, 16); + addAnimation("float", [0, 1, 2, 3], 5, true); + play("float"); + break; + //makeGraphic(12, 12, 0xffff0000);break; + case HP_EXTEND: + makeGraphic(16, 16, 0xffff2200);break; + } + + xml=_xml; + if(xml==null){ // Usually when a health-pickup is dropped by an enemy + xml=; + } else { + if(xml.@alive=="false"){ + exists=false; + } + } + } + + override public function update():Void + { + if(LATENCY>0){ + LATENCY -=FlxG.elapsed; + } else { + if(parent.player.overlaps(this)|| + (parent.player.broom.visible && parent.player.broom.overlaps(this))){ + picked_up(parent.player); + } + } + super.update(); + } + /** + * Given a reference to the player, heal it or trigger the events + * to increase health bar + * @param player + */ + public function picked_up(player:Player):Void { + switch(pickup_type){ + case HP_1: + Registry.sound_data.get_small_health.play(); + player.health_bar.modify_health(1);break; + case HP_3: + Registry.sound_data.get_small_health.play(); + player.health_bar.modify_health(3);break; + case HP_EXTEND: + xml.@alive="false"; + Registry.EVENT_EXTEND_HEALTH=true; + break; + } + visible=solid=false; + exists=false; + } + + override public function destroy():Void { + //shouldget cleaned up in delete_otherobjecs + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/entity/player/Miniminimap.hx b/intra/source/entity/player/Miniminimap.hx new file mode 100644 index 0000000..3e108f5 --- /dev/null +++ b/intra/source/entity/player/Miniminimap.hx @@ -0,0 +1,139 @@ +package entity.player +{ +import data.CSV_Data; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import states.MinimapState; + +class Miniminimap extends FlxSprite +{ + + //[Embed(source="../../res/tilemaps/mini_minimap_tiles.png")] public static inline var embed_miniminimap_tiles:Class; + + // Used for calculating room bounds + private var width_in_rooms:Int; + private var height_in_rooms:Int; + private var buffer:FlxSprite; + private var minimap:FlxTilemap; + + private static inline var RED_IDX:Int=9; + private var bm:FlxSprite; + private var t:FlxTilemap; + + public function new() + { + makeGraphic(25, 20, 0x00000000); + //visible=false; + scrollFactor.x=scrollFactor.y=0; + x=55; + y=0; + bm=new FlxSprite(0, 0, embed_miniminimap_tiles); + t=new FlxTilemap(); + } + + /** + * + * @param x_next + * @param y_next + */ + public function switch_rooms(x_next:Int, y_next:Int):Void { + if(visible==false)return; + // Find next room, get type, update map buffer + dirty=true; + + // Max coords of minimap + var mx:Int=minimap.widthInTiles - 1; + var my:Int=minimap.heightInTiles - 1; + + // Try to find a 5x4 rectangle of things to show with the marker at(2,1). If not then offset it. + + //We're good + if(y_next>=1 &&(my - y_next>=2)&& x_next>=2 &&(mx - x_next)>=2){ + update_graphics_routine(x_next - 2, y_next - 1, 7); + // Otherwise change the rectangle a bit + } else { + var cx:Int; + var cy:Int; + if(x_next<2){ + cx=2 - x_next; + } else if((mx - x_next)<2){ + cx=-2 +(mx - x_next); + } + + if(y_next<1){ + cy=1; + } else if((my - y_next)<2){ + cy=-2 +(my - y_next); + } + update_graphics_routine(x_next - 2 + cx, y_next - 1 + cy,7 +(-cy * 5)- cx ); + // Edge cases fuuuuuuuuck + } + } + + private function update_graphics_routine(_x:Int, _y:Int, red_idx:Int):Void { + var w:Int=minimap.widthInTiles; + var h:Int=minimap.heightInTiles; + var source_rect:Rectangle=new Rectangle(0, 0, 5, 5); + var dest_point:Point=new Point(0, 0); + + var visited:Array=MinimapState.visited[Registry.CURRENT_MAP_NAME]; + visited[w * Registry.CURRENT_GRID_Y + Registry.CURRENT_GRID_X]=1; + var data:Array=t.getData(); + + var t_idx:Int;// tile idex + var tt:Int;//tile type + for(i in 0...20){ + + t_idx=w *(_y + Std.int(i / 5))+(_x +(i % 5)); + tt=data[t_idx]; + if(visited[t_idx]==0){ + tt=0;// Make it blank + } + + dest_point.x=5 *(i % 5); + dest_point.y=5 * Std.int(i / 5); + // Miniminimap tileset is 20x25 pixels. Indexed by same values as the other minimap + source_rect.x=(tt % 4)* 5; + source_rect.y=Std.int(tt / 4)* 5; + pixels.copyPixels(bm.pixels, source_rect, dest_point); + } + + source_rect.x=5 + 1; + source_rect.y=10 + 1 + source_rect.width=3; + source_rect.height=3; + dest_point.x=(red_idx % 5)* 5 + 1; + dest_point.y=Std.int(red_idx / 5)* 5 + 1; + pixels.copyPixels(bm.pixels, source_rect, dest_point); + draw(); + } + /** + * Switch to the next map, either make visible or not. Call AFTER updatin' minimap + * Set bounds of map. + * @param next_map + */ + public function switch_map():Void { + + + var mms:MinimapState=Registry.GAMESTATE.pause_state.minimap; + var _minimap:FlxTilemap=mms.get_minimap(); + + if(_minimap==null){ + visible=false; + return; + } + + visible=true; + var s:String=new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME]; + t=new FlxTilemap(); + t.loadMap(s, embed_miniminimap_tiles, 5, 5); + minimap=_minimap; + } +} \ No newline at end of file diff --git a/intra/source/entity/player/Player.hx b/intra/source/entity/player/Player.hx new file mode 100644 index 0000000..dcf00d3 --- /dev/null +++ b/intra/source/entity/player/Player.hx @@ -0,0 +1,1630 @@ +package entity.player +{ +import data.CLASS_ID; +import data.TileData; +import flash.media.Sound; +import flash.net.URLRequest; +import helper.Achievements; +import helper.EventScripts; +import org.flixel.FlxBasic; +import org.flixel.FlxGroup; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxObject; +import flash.geom.Point; +import org.flixel.FlxG; +import global.Keys; +import global.Registry; +import org.flixel.FlxTilemap; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import org.flixel.system.FlxTile; +import states.PlayState; +import entity.gadget.*; +import entity.decoration.*; + + +class Player extends FlxSprite +{ + //[Embed(source="../../res/sprites/young_player.png")] public static var Player_Sprite:Class; + //[Embed(source="../../res/sprites/young_player_cell.png")] public static inline var Cell_Player_Sprite:Class; + //[Embed(source="../../res/sprites/player_mobile_indicator.png")] public static inline var Player_Mobile_Indicator_Sprite:Class; + + + //[Embed(source="../../res/sprites/young_player_reflection.png")] public static var Player_reflection_Sprite:Class; + //[Embed(source="../../res/sprites/broom_reflection.png")] public static var broom_reflection_sprite:Class; + + private var keyWatch:Keys; + private var parent:Dynamic; + public var cid:Int=CLASS_ID.PLAYER; + /* animation constants */ + private var ORIGINAL_WIDTH:Int=16; + private var ORIGINAL_HEIGHT:Int=16; + public var DEFAULT_Y_OFFSET:Int=4; + private var HITBOX_HEIGHT:Int=12; + private var HITBOX_WIDTH:Int=10; + public var TRANSITION_IDLE:String="idle_u"; + + /* properties associated with moving about the grid*/ + public var gridX:Int=0;//Where on the current grid we are. + public var gridY:Int=0; + public var grid_entrance_x:Int; + public var grid_entrance_y:Int; + public var UL_Sentinel:FlxSprite=new FlxSprite(); + public var LR_Sentinel:FlxSprite=new FlxSprite(); + public var midpoint:Point=new Point(0, 0); + public var hasnt_stepped_off_the_door_yet:Bool=true; + + public var force_position_ticks:Int;//i dont know what this is + + /* movement constants */ + + private var walkSpeed:Int=70; + /** + * A base multiplier for the base walkspeed, pre-effects. + */ + public var c_vel:Float=1.0; + /** + * A multiplier for walk-speed, post-effects. + */ + public var slow_mul:Float=1.0; + public var slow_ticks:Int=0; + public var additional_x_vel:Int=0; + public var additional_y_vel:Int=0; + + /* some misc movement state vars */ + public var sig_reverse:Bool=false; + private var reversed:Bool=false; + private var t_reverse:Float=0; + private var tm_reverse:Float=0.9; + + public var dontMove:Bool=false; + + + /* General 'where the fuck are we' state */ + public var state:Int=0; + public var S_GROUND:Int=0; + public var S_AIR:Int=1; + public var S_RAFT:Int=2; + public var S_AUTO_JUMP:Int=3; + public var S_INTERACT:Int=4; + public var S_ENTER_FALL:Int=5; + public var S_LADDER:Int=6; + + + + /* State for raft or on conveyer blah blah */ + public var ON_CONVEYER:Int=NONE; + private var CONVEYER_VEL:Int=35; + private var sink_timer_max:Float=3/16; + private var sink_timer:Float=sink_timer_max; + public var IS_SINKING:Bool=false; + public var ON_RAFT:Bool=false; + public var raft:Dust; + public var conveyer_fudge_factor:Int=0;//<_< + + /* State for jumping */ + private var jump_period:Float=0.4*1.15;//length of jump + private var jump_timer:Float=0; + private var JUMP_SHADOW_X_OFF:Int=0; + private var JUMP_SHADOW_Y_OFF:Int=8; + public var just_landed:Bool=false; + private var just_landed_timer:Int=0; + private var prevent_jump_repeat:Bool=false; + private var anim_air_did_up:Bool=false; + private var anim_air_did_down:Bool=false; + public var no_jump_ticks:Int=0; + public var s_interact_shadow_visibility_override:Bool=false; + + /* State for autojump */ + public var auto_jump_period:Float=0; + public var auto_jump_timer:Float=auto_jump_period; + public var auto_jump_distance:Int=0; + public var auto_jump_base_y:Int=0; + public var AUTO_JUMP_HEIGHT:Int=22; + public var is_spring_jump:Bool=false; + + /* Stuff associated with getting hit */ + public var SMALL_BUMP_VEL:Int=50; + public var bump_vel_x:Int; + public var bump_vel_y:Int; + public var do_bump:Bool=false; + public var BUMP_TIMER_MAX:Float=0.2; + public var bump_timer:Float=0.2; + public var zap_timer:Float=0.1; + public var ZAP_TIMER_MAX:Float=0.05; + + /* State for falling Into hole */ + public var isFalling:Bool=false;//Slipping + public var hasFallen:Bool=false;// + public var just_fell:Bool=false; + public var FALL_TIMER_DEFAULT:Float=0.016*8 + 0.001; + public var fallTimer:Float=FALL_TIMER_DEFAULT; + public var lastGoodPt:Point=new Point(); + public var fall_pt:Point=new Point(); + public var falling_disabled:Bool=false;// Propelled sets this + + /* Dashing */ + private var dashing:Bool=false; + public var SIG_DASH:Bool=false; + public var SIG_DASH_TYPE:Int=0x0; + private var dash_flags:Int=0x0; + private var dash_h_state:Int=0; + private var dash_v_state:Int=0; + + /* State for treasure open */ + public var opening_treasure:Bool=false; + /* Itmes */ + public var broom:Broom; + public var health_bar:HealthBar; + public var transformer:Transformer; + + /* Invincibility */ + public var invincible_timer:Float=0; + public var invincible:Bool=false; + public var INVINCIBLE_TIME:Float=0.8; + + /* graphics associated with player */ + public var light:Light; + public var foot_overlay:Foot_Overlay; + public var foot_overlay_bg_bg2:Foot_Overlay; + public var reflection:FlxSprite; + public var reflection_broom:FlxSprite; + public var mobile_current:FlxSprite; + /* Animation state */ + public var ANIM_STATE:Int=0; + public var ANIM_DEFAULT:Int=0; + public var ANIM_ATK_R:Int=1; + public var ANIM_ATK_L:Int=2; + public var ANIM_ATK_U:Int=3; + public var ANIM_ATK_D:Int=4; + public var ANIM_FALL:Int=5; + public var ANIM_DEAD:Int=6; + private var as_idle:Int=7; + private var idle_ticks:Int=0; + private var as_walk:Int=8; + private var as_slumped:Int=9; + private var last_frame:Dynamic={ walk_l:0, walk_r:0, walk_u:0, walk_d:0 }; + public var DEATH_FRAME:Int; + + public var action_latency_max:Float=0.24; + public var action_latency:Float=0.24; + public static var ATK_DELAY:Float=0.2; + public static var WATK_DELAY:Float=0.35; + public static var LATK_DELAY:Float=0.4; + + public var actions_disabled:Bool=false; + + public var step_noise_timer_max:Float=0.5; + public var step_noise_timer:Float=step_noise_timer_max; + + public var start_in_slump:Bool=false; + + public function reset_anodyne():Void { + hasnt_stepped_off_the_door_yet=true; + reflection.exists=false; + reflection_broom.exists=false; + if(Registry.CURRENT_MAP_NAME=="WINDMILL" || Registry.CURRENT_MAP_NAME=="DEBUG"){ + reflection.exists=true; + reflection_broom.exists=true; + } + + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + loadGraphic(Cell_Player_Sprite, true, false, 16, 16); + } else { + loadGraphic(Player_Sprite, true, false, 16, 16); + } + + height=HITBOX_HEIGHT; + width=HITBOX_WIDTH; + + sig_reverse=false; + if(reversed){ + reverse_controls(); + } + reversed=false; + t_reverse=0; + alive=true; + + state=S_GROUND; + offset.y=DEFAULT_Y_OFFSET; + alpha=1; + scrollFactor.x=scrollFactor.y=1; + + + ANIM_STATE=as_idle; + play(TRANSITION_IDLE); + + if(start_in_slump==true){ + start_in_slump=false; + ANIM_STATE=as_slumped; + play("slumped"); + } + + if(Registry.CURRENT_MAP_NAME=="DRAWER" || Registry.E_NEXT_MAP_TURN_ON_LIGHT==true || Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light.exists=true; + light.visible=true; + Registry.E_NEXT_MAP_TURN_ON_LIGHT=false; + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light.setlighttype(Light.T_BEDROOM_BOUNCE); + light.followee=this; + } else { + light.followee=this; + light.scrollFactor.x=light.scrollFactor.y=1; + light.special_type=Light.L_PLAYER; + light.setlighttype(Light.T_GLOW_LIGHT); + } + } else { + light.visible=false; + light.exists=false; + } + + + if(Registry.E_Enter_Fall_Down){ + Registry.E_Enter_Fall_Down=false; + Registry.sound_data.fall1.play(); + state=S_ENTER_FALL; + offset.y=150; + dontMove=true; + } + } + + public function new(_x:Int,_y:Int,_keyWatch:Keys,darkness:FlxSprite,_parent:Dynamic=null) + + { + + super(_x, _y + DEFAULT_Y_OFFSET); + parent=_parent; + + // Init reflection thiniges + reflection=new FlxSprite(); + reflection.loadGraphic(Player_reflection_Sprite, true, false, 16, 16); + reflection.exists=false; + reflection_broom=new FlxSprite(); + reflection_broom.loadGraphic(broom_reflection_sprite, true, false, 16, 16); + reflection_broom.exists=false; + + mobile_current=new FlxSprite(); + mobile_current.loadGraphic(Player_Mobile_Indicator_Sprite, true, false, 5, 5); + mobile_current.alpha=0.8; + if(Intra.is_mobile==false){ + mobile_current.exists=false; + } + + + raft=new Dust(0, 0, null, parent); + raft.exists=false; + keyWatch=_keyWatch; + loadGraphic(Player_Sprite, true, false, 16, 16); + /* add anims */ + addAnimation("walk_d", [1, 0], 6, true); + addAnimation("walk_r", [2, 3], 8, true); + addAnimation("walk_u", [4, 5], 6, true); + addAnimation("walk_l", [6, 7], 8, true); + + addAnimation("attack_down", [8, 9], 10, false); + addAnimation("attack_right", [10, 11], 10, false); + addAnimation("attack_up", [12, 13], 10, false); + addAnimation("attack_left", [14, 15], 10, false); + addAnimation("fall", [28, 29, 30, 31], 5, false); + addAnimation("die", [25, 26, 27, 24, 25, 26, 27, 24, 25, 26, 27, 32], 6, false); + addAnimation("slumped", [32]); + DEATH_FRAME=32; + addAnimation("whirl", [25, 26, 27, 24], 12, true); + + addAnimation("idle_d", [24], 4, true); + addAnimation("idle_r", [25], 4, true); + addAnimation("idle_u", [26], 4, true); + addAnimation("idle_l", [27], 4, true); + + addAnimation("jump_d", [16, 17], 4, true); + addAnimation("jump_r", [18, 19], 4, true); + addAnimation("jump_u", [20, 21], 4, true); + addAnimation("jump_l", [22, 23], 4, true); + addAnimation("idle_climb", [33]); + addAnimation("climb", [34, 35], 8, true); + + addAnimationCallback(on_anim_change); + + height=HITBOX_HEIGHT;offset.y=DEFAULT_Y_OFFSET; + width=HITBOX_WIDTH; + + play("idle_u"); + ANIM_STATE=as_idle; + + /* add sfx */ + add_sfx("jump_down", Registry.sound_data.player_jump_down); + add_sfx("jump_up", Registry.sound_data.player_jump_up); + add_sfx("dash_1", Registry.sound_data.dash_pad_1); + add_sfx("dash_2", Registry.sound_data.dash_pad_2); + + update_sentinels(); + UL_Sentinel.makeGraphic(1, 1, 0xffffffff); + LR_Sentinel.makeGraphic(1, 1, 0xffffffff); + UL_Sentinel.visible=LR_Sentinel.visible=false; + + lastGoodPt.x=x;lastGoodPt.y=y; + + /* Init items */ + broom=new Broom(this, x, y); + broom.visible=false; + + transformer=new Transformer(this, parent); + + health_bar=new HealthBar(155, 2, Registry.MAX_HEALTH); + health_bar.modify_health(-1 *(Registry.MAX_HEALTH - Registry.CUR_HEALTH)); + /* Add light */ + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + light=new Light(0, 0, darkness, Light.T_BEDROOM_BOUNCE, false, this, 0, Light.L_BEDROOM_BOUNCE); + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + light.visible=false; + } + } else { + light=new Light(0, 0, darkness, Light.T_GLOW_LIGHT, true, this, 6, Light.L_PLAYER); + light.exists=false; + if(Registry.CURRENT_MAP_NAME=="STREET"){ + light.exists=true; + } + } + + my_shadow=EventScripts.make_shadow("8_small",false,20); + + foot_overlay=new Foot_Overlay(this); + foot_overlay_bg_bg2=new Foot_Overlay(this); + + } + override public function postUpdate():Void + { + super.postUpdate(); + Registry.PLAYER_X=x - 160 * Registry.CURRENT_GRID_X + 3; + Registry.PLAYER_Y=y - 20 - 160 * Registry.CURRENT_GRID_Y + 4; + } + + public static var Player_mobile_timer:Float=0; + public static var Player_mobile_angle:Float=0; + override public function update():Void { + + if(Intra.is_mobile){ + if(Player_mobile_timer>0){ + mobile_current.alpha=0.9; + Player_mobile_timer -=FlxG.elapsed; + mobile_current.x=(x + 8 - 2)- offset.x +(12 * Math.cos(Player_mobile_angle)); + mobile_current.y=(y + 8 - 2)- offset.y -(12 * Math.sin(Player_mobile_angle)); + } else { + mobile_current.alpha=0; + } + } + if(Registry.FUCK_IT_MODE_ON){ + solid=false; + walkSpeed=200; + //walkSpeed=60; + + if(FlxG.keys.justPressed("V")){ + visible=!visible; + } + } else { + walkSpeed=70; + solid=true; + } + + if(sig_reverse){ + sig_reverse=false; + if(!reversed){ + Registry.GFX_WAVE_EFFECT_ON=true; + reverse_controls(); + } + reversed=true; + } else if(reversed){ + t_reverse +=FlxG.elapsed; + if(t_reverse>tm_reverse){ + t_reverse=0; + reversed=false; + Registry.GFX_WAVE_EFFECT_ON=false; + reverse_controls(); + } + } + + + midpoint.x=(x + width / 2); + midpoint.y=(y + height / 2); + + + // Reflection logic. + // In a map with reflections, if the ***BG*** layer + // has a certain tile type, then the reflection(drawn between BG and BG2) + // should appear and mirror the player's animations + if(reflection.exists){ + var tile_type:Int=parent.map.getTile(midpoint.x / 16,(midpoint.y - Registry.HEADER_HEIGHT)/ 16); + reflection.visible=false; + reflection_broom.visible=false; + switch(Registry.CURRENT_MAP_NAME){ + case "DEBUG": + if(tile_type==47){ + reflection.visible=true; + reflection_broom.visible=broom.visible; + reflection_broom.angle=broom.angle; + } + break; + case "WINDMILL": + if(tile_type==130){ + reflection.visible=true; + reflection_broom.visible=broom.visible; + reflection_broom.angle=broom.angle; + } + break; + } + + reflection_broom.frame=broom.frame; + + + reflection_broom.x=broom.x; + reflection_broom.y=broom.y + 10; + if(facing==LEFT){ + reflection.x=x - 4; + } else { + reflection.x=x - 3; + } + reflection.y=y + 10; + reflection.frame=frame; + reflection.offset.y=-(offset.y - DEFAULT_Y_OFFSET); + } + + + if(!common_conditions()){ + return; + } + + + switch(state){ + case S_GROUND: + my_shadow.visible=false; + if(dontMove){ + velocity.x=0;velocity.y=0; + } else { + ground_movement();//modify player vels + } + + falling_logic(); + + + update_sentinels(); + + for(var t:Dynamic in Registry.subgroup_interactives){ + if(t !=null){ + if(t.active_region !=null && t.active_region.overlaps(this)){ + actions_disabled=true; + break;// As soon as this is true we can stop checking + } + } + } + if(!hasFallen && !actions_disabled){ + if(action_latency>0){ + action_latency -=FlxG.elapsed; + } + update_actions(Registry.keywatch.ACTION_1,Registry.keywatch.JP_ACTION_1,Registry.bound_item_1); + update_actions(Registry.keywatch.ACTION_2, Registry.keywatch.JP_ACTION_2, Registry.bound_item_2); + } + ground_animation(); + if(just_landed)just_landed=false; + dash_logic(); + + break; + case S_AIR: + if(dontMove){ + velocity.x=velocity.y=0; + } else { + air_movement(); + air_animation(); + } + dash_logic(); + + break; + case S_AUTO_JUMP: + solid=false; + my_shadow.visible=true; + auto_jump_animation(); + break; + case S_INTERACT: + velocity.x=velocity.y=0; + if(s_interact_shadow_visibility_override){ + my_shadow.visible=true; + } else { + my_shadow.visible=false; + } + /* Don't do anything until whatever put you in + * this state takes you out. */ + break; + case S_ENTER_FALL: + velocity.x=velocity.y=0; + angularVelocity=400; + frame=2; + if(EventScripts.send_property_to(this.offset, "y", 0, 1.7)){ + dontMove=false; + if(!(Registry.CURRENT_MAP_NAME=="CROWD" && Registry.CURRENT_GRID_X==3 && Registry.CURRENT_GRID_Y==4)){ //wHAT YOU GONNA DO PUNK + angle=0; + play("slumped"); + ANIM_STATE=as_slumped; + FlxG.shake(0.05, 0.4); + Registry.sound_data.hitground1.play(); + angularVelocity=0; + } + state=S_GROUND; + } + break; + case S_LADDER: + ladder_logic(); + + + break; + } + + //Reset callback settings + ON_CONVEYER=NONE; + if(slow_ticks>0){ + slow_ticks--; + } else { + slow_mul=1; + } + IS_SINKING=false; + falling_disabled=false; + actions_disabled=false; + + additional_x_vel=0; + additional_y_vel=0; + + if(no_jump_ticks>0){ + no_jump_ticks--; + } + + + super.update(); + } + + /* Falling logic */ + public function falling_logic():Void { + /* If you fall reset position to last known safe position */ + if(hasFallen){ + fallTimer -=FlxG.elapsed; + dontMove=true; + x=fall_pt.x - 5; + y=fall_pt.y + 2; + if(fallTimer<-1.0 || frame==31){ + c_vel=1.0; + fallTimer=FALL_TIMER_DEFAULT; + hasFallen=false; + x=grid_entrance_x; + y=grid_entrance_y; + flicker(1); + play("idle_d"); + solid=false; + just_fell=true; + dontMove=false; + ANIM_STATE=as_idle; + //health_bar.modify_health(-1); + } + return; + } + if(falling_disabled)isFalling=false; + if(!isFalling){ + /* If not falling update last known safe position */ + c_vel=1.0; + lastGoodPt.x=x; + lastGoodPt.y=y; + fallTimer=FALL_TIMER_DEFAULT; + } else { + /* Player movement should change here */ + //some other sort of gradual falling?? + //c_vel=0.5; + fallTimer -=FlxG.elapsed; + if(just_landed){ + fallTimer=-1; + just_landed=false; + } + /* Fall after a time out, or instantly if dashing */ + if(fallTimer<0 ||(dashing && fallTimer0){ + conveyer_fudge_factor--; + if(conveyer_fudge_factor==1 && raft==null){ + var _raft:Dust=new Dust(x, y, null,parent); + _raft.ON_CONVEYER=true; + parent.player_group.remove(raft, true); + + raft=_raft; + parent.player_group.members.splice(0, 0, raft); + parent.player_group.length++; + } else if(conveyer_fudge_factor==1){ + + } + ON_RAFT=true; + ON_CONVEYER=ANY; + } + + + /* Pin the raft to the player, and also increase + * the player's velocity accordingly. */ + if(ON_CONVEYER){ //set by the callback or the line above + if(ON_RAFT){ //set raft to be under player. set in Dust collision + raft.x=x - 2; + raft.y=y - 2; + } + switch(ON_CONVEYER){ + case UP: + velocity.y -=CONVEYER_VEL;break; + case DOWN: + velocity.y +=CONVEYER_VEL;break; + case LEFT: + velocity.x -=CONVEYER_VEL;break; + case RIGHT: + velocity.x +=CONVEYER_VEL;break; + } + + var tidx:Int; + var tile:FlxTile; + + if(framePixels_y_push>0){ + tidx=EventScripts.get_tile_nr(midpoint.x + 2, midpoint.y, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + tidx=EventScripts.get_tile_nr(midpoint.x - 2, midpoint.y, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + tidx=EventScripts.get_tile_nr(midpoint.x, midpoint.y + 5, parent.curMapBuf); + tile=parent.curMapBuf._tileObjects[tidx]; + if(tile.allowCollisions==NONE && tile.callback==null){ + framePixels_y_push=0; + ON_CONVEYER=NONE; + } + } + } else if(parent.state !=parent.S_TRANSITION){ + /* only reset the raft if we didn't fall off while on it */ + if((velocity.x !=0 || velocity.y !=0)&& raft !=null && !isFalling && !hasFallen){ + tidx=EventScripts.get_tile_nr(midpoint.x, midpoint.y, parent.curMapBuf); + if(tidx>parent.curMapBuf._tileObjects.length){ + tidx=3; + } + if(parent.curMapBuf._tileObjects[tidx].callback==TileData.conveyer){ + + } else { + ON_RAFT=false; + if(velocity.x>0)raft.x -=3; + if(velocity.x<0)raft.x +=3; + if(velocity.y>0)raft.y -=3; + if(velocity.y<0)raft.y +=3; + // Move the raft to the playstate's ownership + parent.player_group.remove(raft, true); + Registry.subgroup_dust.push(raft); + parent.bg_sprites.add(raft); + raft=null; + } + } + } + step_noise_timer -=FlxG.elapsed; + + if(step_noise_timer<0 &&(velocity.x !=0 || velocity.y !=0)){ + if(IS_SINKING && step_noise_timer<0){ + Registry.sound_data.play_sound_group(Registry.sound_data.water_step_group); + step_noise_timer=step_noise_timer_max; + } else if(!IS_SINKING && ON_CONVEYER & ANY){ // sound for walking in puddle + Registry.sound_data.play_sound_group(Registry.sound_data.puddle_step); + step_noise_timer=0.25; + } else if(foot_overlay.visible && Registry.CURRENT_MAP_NAME=="REDSEA"){ + Registry.sound_data.play_sound_group(Registry.sound_data.puddle_step,0.5); + step_noise_timer=0.25; + } + } + velocity.x +=additional_x_vel; + velocity.y +=additional_y_vel; + + velocity.x *=slow_mul; + velocity.y *=slow_mul; + } + + // For wheny ou die whilst on a raft, to prevent a "destroy"d raft + // from being added to the game and blowing shit up + public function unraftify_safely():Void { + parent.player_group.remove(raft, true); + raft=null; + } + /* visual fx with jumping(shadow, offset Interpolation)*/ + public function air_animation():Void { + // Play sfx, set the animation, set the shadow, hide the broom. + if(!anim_air_did_up){ + broom.visible=false; + anim_air_did_up=true; + + if(ON_CONVEYER){ + Registry.sound_data.puddle_up.play(); + } else { + play_sfx("jump_up"); + } + + my_shadow.play("get_small"); + ANIM_STATE=as_idle;// Always land in idle state. + switch(facing){ // Play the jump animation + case UP: + play("jump_u"); + break; + case DOWN: + play("jump_d"); + break; + case LEFT: + play("jump_l"); + break; + case RIGHT: + play("jump_r"); + break; + } + } + // Move the shadow iwth the player. + my_shadow.x=x + JUMP_SHADOW_X_OFF + 1; + my_shadow.y=y + JUMP_SHADOW_Y_OFF - 3; + offset.y=DEFAULT_Y_OFFSET + Std.int((((-4*24)/(jump_period*jump_period))* jump_timer *(jump_timer - jump_period))); + jump_timer +=FlxG.elapsed; + + + + // On the way down, change the shadow animation + if(!anim_air_did_down && jump_timer>jump_period / 2){ + my_shadow.play("get_big"); + anim_air_did_down=true; + } + + // sfx for landing, change state, set some state flags, fix the offset + if(jump_timer>jump_period){ + jump_timer=0; + if(ON_CONVEYER){ + Registry.sound_data.puddle_down.play(); + } else { + play_sfx("jump_down"); + } + state=S_GROUND; + + my_shadow.visible=false; + offset.y=DEFAULT_Y_OFFSET; + just_landed=true; + anim_air_did_down=anim_air_did_up=false; + } + } + public function air_movement():Void { + + set_init_vel(0.83); + + if(velocity.x !=0 && velocity.y !=0){ + velocity.x *=.7; + velocity.y *=.7; + } + + if(ON_RAFT){ + if(ON_CONVEYER !=NONE){ + raft.x=x - 2; + raft.y=y - 2; + } + } + + velocity.x +=additional_x_vel; + velocity.y +=additional_y_vel; + } + + + private function dash_logic():Void { + var VEL_DASH_1:Int=walkSpeed * 1.3; + var VEL_DASH_2:Int=walkSpeed * 1.77; + if(SIG_DASH){ + SIG_DASH=false; + dashing=true; + switch(SIG_DASH_TYPE){ + case UP: + if(dash_flags & DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else { + dash_flags |=UP; + if(dash_v_state<2){ + + dash_v_state++; + (dash_v_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case DOWN: + if(dash_flags & UP){ + dash_flags &=~UP; + dash_v_state=0; + } else { + dash_flags |=DOWN; + if(dash_v_state<2){ + dash_v_state++; + (dash_v_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case RIGHT: + if(dash_flags & LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } else { + dash_flags |=RIGHT; + if(dash_h_state<2){ + dash_h_state++; + (dash_h_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + case LEFT: + if(dash_flags & RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } else { + dash_flags |=LEFT; + if(dash_h_state<2){ + dash_h_state++; + (dash_h_state==2)? play_sfx("dash_2"):play_sfx("dash_1"); + } + } + break; + } + } + + if(!dashing)return; + + // Stop dashing if not pressing the respective move key + if((dash_flags & UP)&& !keyWatch.UP){ + dash_flags &=~UP; + dash_v_state=0; + } else if((dash_flags & DOWN)&& !keyWatch.DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else if((dash_flags & RIGHT)&& !keyWatch.RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } else if((dash_flags & LEFT)&& !keyWatch.LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } + + // Stop dashing if touching wall + if((dash_flags & touching)& UP){ + dash_flags &=~UP; + dash_v_state=0; + } else if((dash_flags & touching)& DOWN){ + dash_flags &=~DOWN; + dash_v_state=0; + } else if((dash_flags & touching)& LEFT){ + dash_flags &=~LEFT; + dash_h_state=0; + } else if((dash_flags & touching)& RIGHT){ + dash_flags &=~RIGHT; + dash_h_state=0; + } + + if(dash_v_state==1){ + velocity.y=velocity.y>0 ? VEL_DASH_1:-VEL_DASH_1; + } else if(dash_v_state==2){ + velocity.y=velocity.y>0 ? VEL_DASH_2:-VEL_DASH_2; + } else { + //Decelerate the player, or stop them... + } + + if(dash_h_state==1){ + velocity.x=velocity.x>0 ? VEL_DASH_1:-VEL_DASH_1; + } else if(dash_h_state==2){ + velocity.x=velocity.x>0 ? VEL_DASH_2:-VEL_DASH_2; + } else { + + } + + if(dash_flags==0 || broom.visible){ + dashing=false; + } + } + /* largely similar to air anim but we want a different timer + * based on the Jump_Trigger that caused the auto_jump */ + public function auto_jump_animation():Void { + if(!anim_air_did_down){ + play("jump_d"); + Registry.sound_data.player_jump_up.play(); + my_shadow.frame=0; + auto_jump_timer=0; + anim_air_did_down=true; + } + if(auto_jump_timer>auto_jump_period / 2 && !anim_air_did_up){ + anim_air_did_up=true; + my_shadow.play("get_big"); + } + + velocity.x=velocity.y=0; + my_shadow.x=x + JUMP_SHADOW_X_OFF + 3; + if(is_spring_jump){ + my_shadow.y=y + 3; + } else { + my_shadow.y=auto_jump_base_y + auto_jump_distance; + } + //parabola between two pts + // x(x - t), where f(t/2)=h. - h=16, solve for a + var a:Float=-1 *((4 * AUTO_JUMP_HEIGHT)/(auto_jump_period * auto_jump_period)); + offset.y=DEFAULT_Y_OFFSET + Std.int((a * auto_jump_timer *(auto_jump_timer - auto_jump_period))); + + // also lerp the distance + y=auto_jump_base_y + Std.int(auto_jump_distance *(auto_jump_timer / auto_jump_period)); + auto_jump_timer +=FlxG.elapsed; + if(auto_jump_timer>auto_jump_period){ + solid=true; + is_spring_jump=false; + velocity.x=velocity.y=0; + auto_jump_timer=0; + + state=S_GROUND; + + my_shadow.visible=false; + offset.y=DEFAULT_Y_OFFSET; + + just_landed=true; + + anim_air_did_down=false; + anim_air_did_up=false; + play("idle_d"); + ANIM_STATE=as_idle; + + Registry.sound_data.player_jump_down.play(); + } + } + + private var t_just_left_water:Float=0; + private var tm_just_left_water:Float=0.04; + /* update ground anim - modifies offset.x */ + public function ground_animation():Void { + if(ON_CONVEYER && IS_SINKING){ //If on a conveyer and sinking, make me sink. + t_just_left_water=0; + sink_timer -=FlxG.elapsed; + if(sink_timer<0){ + sink_timer=sink_timer_max; + if(framePixels_y_push<16){ + framePixels_y_push +=1; + } else { + x=grid_entrance_x; + y=grid_entrance_y; + framePixels_y_push=0; + touchDamage(1); + } + } + + } else { + t_just_left_water +=FlxG.elapsed; + if(t_just_left_water>tm_just_left_water){ + t_just_left_water=0; + framePixels_y_push=0; + } + } + + // We don't want the bump velocity to change the direction we face. + if(do_bump)return; + + switch(ANIM_STATE){ + case ANIM_ATK_R: + case ANIM_ATK_L: + case ANIM_ATK_D: + case ANIM_ATK_U: + if(broom.finished){ + ANIM_STATE=as_idle; + switch(_curAnim.name){ + case "attack_right": + play("idle_r"); + break; + case "attack_up": + play("idle_u"); + break; + case "attack_left": + play("idle_l"); + break; + case "attack_down": + play("idle_d"); + break; + } + break; + } + + if(frame !=8 && ANIM_STATE==ANIM_ATK_R){ play("attack_right");} + if(frame !=16 && ANIM_STATE==ANIM_ATK_L){ play("attack_left");} + if(frame !=12 && ANIM_STATE==ANIM_ATK_U){ play("attack_up");} + if(frame !=22 && ANIM_STATE==ANIM_ATK_D){ play("attack_down");} + return; + case ANIM_FALL: + play("fall"); + return; + case ANIM_DEAD: + return; + case as_idle: + if(idle_ticks>0){ + idle_ticks -=1; + return; + } + if(velocity.y<0){ + facing=UP; + play("walk_u"); + } else if(velocity.y>0){ + facing=DOWN; + play("walk_d"); + } else if(velocity.x<0){ + facing=LEFT; + play("walk_l"); + } else if(velocity.x>0){ + facing=RIGHT; + play("walk_r"); + } else { + switch(facing){ + case UP: + play("idle_u"); + break; + case LEFT: + play("idle_l"); + break; + case DOWN: + play("idle_d"); + break; + case RIGHT: + play("idle_r"); + break; + } + break; + } + ANIM_STATE=as_walk; + _curFrame=last_frame[_curAnim.name]; + _curIndex=_curAnim.frames[_curFrame]; + + break; + case as_walk: + if(idle_ticks>0){ + idle_ticks --; + } + if(velocity.x==0 && velocity.y==0){ + ANIM_STATE=as_idle; + switch(facing){ + case UP:last_frame["walk_u"]=_curFrame;play("idle_u");break; + case DOWN:last_frame["walk_d"]=_curFrame;play("idle_d");break; + case LEFT:last_frame["walk_l"]=_curFrame;play("idle_l");break; + case RIGHT:last_frame["walK_r"]=_curFrame;play("idle_r");break; + } + } else { + if(velocity.y<0){ + if(facing !=UP ||(_curAnim !=null && _curAnim.name !="walk_u")){ + facing=UP; + play("walk_u"); + } + } else if(velocity.y>0){ + if(facing !=DOWN){ + facing=DOWN; + play("walk_d"); + } + } else if(velocity.x<0){ + if(facing !=LEFT){ + facing=LEFT; + play("walk_l"); + } + } else { + if(facing !=RIGHT){ + facing=RIGHT; + play("walk_r"); + } + } + + } + break; + case as_slumped: + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2 || Registry.keywatch.UP || Registry.keywatch.DOWN || Registry.keywatch.LEFT || Registry.keywatch.RIGHT){ + ANIM_STATE=as_idle; + } + break; + } + + + + } + public function update_actions(action_is_down:Bool, just_pressed_action:Bool, bound_item:String):Void { + + if(action_is_down){ + if(bound_item=="BROOM"){ + if(just_pressed_action && !broom.visible && framePixels_y_push<8){ + if(action_latency>=0)return;//DELAY FOR ATTACK + + broom.visible_timer=0;// Reset this so we do not get the edge case where the broom goes invisible mid-swing from + // perfectly timing two attacks + action_latency=action_latency_max; + + Registry.sound_data.play_sound_group_randomly(Registry.sound_data.swing_broom_group); + + + if(broom.has_dust){ + y=Std.int(y); + x=Std.int(x); + if(facing==UP){broom.dust.x=x;broom.dust.y=y - 16;} + else if(facing==LEFT){ broom.dust.x=x - 16;broom.dust.y=y;} + else if(facing==RIGHT){ broom.dust.x=x + 16;broom.dust.y=y;} + else { broom.dust.x=x;broom.dust.y=y + 16;} + + var dust_x:Int=broom.dust.x; + var dust_y:Int=broom.dust.y - 20; + /* Snap dust to nearest tile */ + if(broom.dust.x % 16<=9){ broom.dust.x -=broom.dust.x % 16;} + else { broom.dust.x +=(16 - broom.dust.x % 16);} + if(dust_y % 16<=7){ broom.dust.y -=(dust_y % 16);} + else { broom.dust.y +=(16 - dust_y % 16);} + /* Look Into the(unmodified)tilemap to get the tile's number this dust is being dropped on */ + var tile_type:Int=parent.map.getTile(broom.dust.x / 16,(broom.dust.y - 20)/ 16); + /* And then actually look up that tile's properties in the current map buffer to figure out + * whether we can drop the dust. This is stupid but it works so who cares */ + + + var skip_if_dust_overlaps:Bool=false; + for(var d:Dust in Registry.subgroup_dust){ + if(d !=null){ + if(broom.dust.overlaps(d)&& d !=broom.dust){ + skip_if_dust_overlaps=true; + } + } + } + + if(!skip_if_dust_overlaps && parent.curMapBuf._tileObjects[tile_type].allowCollisions !=FlxObject.ANY){ + broom.dust.visible=true; + broom.has_dust=false; + if(broom.dust._animations !=null){ + broom.dust.play("unpoof"); + } + Dust.dust_sound.play(); + broom.just_released_dust=true; + } + + + } + + + broom.visible=true; + if(facing==RIGHT){ + broom.angle=180; + broom.play("stab",true); + }else if(facing==DOWN){ + broom.angle=270; + broom.play("stab",true); + } else if(facing==LEFT){ + broom.angle=0; + broom.play("stab",true); + } else if(facing==UP){ + broom.angle=90; + broom.play("stab",true); + } + broom.update(); + switch(facing){ + case LEFT:ANIM_STATE=ANIM_ATK_L;break; + case UP:ANIM_STATE=ANIM_ATK_U;break; + case DOWN:ANIM_STATE=ANIM_ATK_D;break; + case RIGHT: ANIM_STATE=ANIM_ATK_R;break; + } + } + } + if(bound_item=="JUMP" &&(ON_RAFT ||(ON_CONVEYER==NONE || ON_CONVEYER==ANY))&& !IS_SINKING && !prevent_jump_repeat && no_jump_ticks<=0 && framePixels_y_push==0){ + if(state !=S_AIR){ + state=S_AIR; + my_shadow.visible=true; + my_shadow.x=x;my_shadow.y=y; + prevent_jump_repeat=true; + } + } + + if(just_pressed_action && bound_item=="TRANSFORMER"){ + transformer.use_item(); + } + } + + if(!broom.visible && !action_is_down && bound_item=="BROOM"){ + broom.just_released_dust=false; + } else if(!action_is_down && bound_item=="JUMP"){ + prevent_jump_repeat=false; + } + } + + public function touchDamage(damage:Int,type:String=" "):Void { + + if(parent.state==parent.S_DIALOGUE){ //aint no damge in dialogue + return; + } + if(invincible==false && !isFalling && !flickering){ + Registry.sound_data.player_hit_1.play(); + flicker(INVINCIBLE_TIME); + invincible_timer=INVINCIBLE_TIME; + invincible=true; + health_bar.modify_health(-damage); + if(health_bar.cur_health !=0){ + do_bump=true; + } + bump_vel_x=bump_vel_y=0; + if(facing==UP){ + bump_vel_y=SMALL_BUMP_VEL; + } else if(facing==LEFT){ + bump_vel_x=SMALL_BUMP_VEL; + } else if(facing==DOWN){ + bump_vel_y=-SMALL_BUMP_VEL; + } else { + bump_vel_x=- SMALL_BUMP_VEL; + } + } + + if(type=="zap"){ + zap_timer=0; + } + //bump in direction opposite of facing + } + + public function touches(o:FlxSprite):Bool { + if(Std.is(o, Door)){ + var d:Door=cast(o, Door); + if(dontMove && d.type==Door.FALL_DOOR){ + return false; + } + } + if(o.overlaps(this)){ + return true; + } + return false; + + } + /* Update the inventory blah blah */ + public function update_player_inventory(treasure:Treasure):Void { + trace("Get treasure number ", parseInt(treasure.xml.@frame)); + switch(parseInt(treasure.xml.@frame)){ + case Treasure.IDX_BROOM: + Registry.inventory[Registry.IDX_BROOM]=true; + Achievements.unlock(Achievements.A_GET_BROOM); + break; + case Treasure.IDX_KEY: + Registry.change_nr_keys(1); + parent.number_of_keys_text.setText("x" + Registry.get_nr_keys().toString(), true, 0, 0, "left", true); + break; + case Treasure.IDX_GROWTH: + trace("Growths", Registry.nr_growths); + Registry.nr_growths++; + check_for_card_achvs(); + break; + case Treasure.IDX_JUMP: + Registry.inventory[Registry.IDX_JUMP]=true; + break; + case Treasure.IDX_WIDE: + Registry.inventory[Registry.IDX_WIDEN]=true; + break; + case Treasure.IDX_LONG: + Registry.inventory[Registry.IDX_LENGTHEN]=true; + break; + case Treasure.IDX_SWAP: + Registry.inventory[Registry.IDX_TRANSFORMER]=true; + break; + } + } + + private function check_for_card_achvs():Void { + if(Registry.CURRENT_MAP_NAME=="WINDMILL")Achievements.unlock(Achievements.A_GET_WINDMILL_CARD); + if(Registry.nr_growths==1)Achievements.unlock(Achievements.Card_1); + if(Registry.nr_growths==7)Achievements.unlock(Achievements.Card_7); + if(Registry.nr_growths>=48)Achievements.unlock(Achievements.A_GET_48_CARDS); + } + + /* reset things that need to be reset */ + public function cleanup_on_grid_transition():Void { + broom.has_dust=false; + t_reverse=0; + if(reversed){ + Registry.GFX_WAVE_EFFECT_ON=false; + reversed=false; + reverse_controls(); + } + } + + public function init_player_group(player_group:FlxGroup,player:Player,map:FlxTilemap):Void { + player_group.add(player.raft); + player_group.add(player.my_shadow); + + player_group.add(player.transformer.selector); + player_group.add(player.transformer.selected); + player_group.add(player.transformer); + + player_group.add(player); + + player_group.add(player.foot_overlay); + var p:PlayState=Registry.GAMESTATE; + + p.intra_bg_bg2_sprites.add(player.foot_overlay_bg_bg2); + + player_group.add(player.light); + + player_group.add(player.broom.wide_attack_h); + player_group.add(player.broom.wide_attack_v); + player_group.add(player.broom.long_attack_h); + player_group.add(player.broom.long_attack_v); + player_group.add(player.broom); + + player_group.add(player.LR_Sentinel); + player_group.add(player.UL_Sentinel); + if(Intra.is_mobile){ + player_group.add(player.mobile_current); + } + player_group.set_draw_ref(player); + } + /** + * Checks for conditions that stop the player from updating, or update + * various state(temporary invincibility, health...) + * @return 0 if player actions should be terminated here. 1 otherise + */ + private function common_conditions():Int + { + Registry.CUR_HEALTH=health_bar.cur_health; + + if(parent.state==parent.S_TRANSITION){ + dontMove=true; + velocity.x=velocity.y=0; + if(ON_RAFT){ + raft.x=x - 2; + raft.y=y - 3; + conveyer_fudge_factor=5;//<_< + } + + if(state==S_AIR){ + my_shadow.x=x + JUMP_SHADOW_X_OFF + 1; + my_shadow.y=y + JUMP_SHADOW_Y_OFF - 3; + } + return 0; + } + + if(parent.SWITCH_MAPS){ + super.update(); + return 0; + } + + if(!solid && just_fell){ + solid=true; + just_fell=false; + } + if(!alive){ + super.update(); + return 0; + + } + + if(invincible_timer>0){ + invincible_timer -=FlxG.elapsed + } else { + invincible=false; + if(!Registry.FUCK_IT_MODE_ON){ + visible=true; + } + } + + + + return 1; + } + + private function reverse_controls():Void + { + var down_key:String=Registry.controls[Keys.IDX_DOWN]; + var up_key:String=Registry.controls[Keys.IDX_UP]; + Registry.controls[Keys.IDX_DOWN]=up_key; + Registry.controls[Keys.IDX_UP]=down_key; + + var left_key:String=Registry.controls[Keys.IDX_LEFT]; + var right_key:String=Registry.controls[Keys.IDX_RIGHT]; + Registry.controls[Keys.IDX_RIGHT]=left_key; + Registry.controls[Keys.IDX_LEFT]=right_key; + } + + private var turn_in_place_ticks:Int=0; + private function set_init_vel(mul:Float=1):Void + { + // If actions are disabled(overlapping an NPC or something), then + // don't do the slidy-push thing + if(actions_disabled){ + touching=NONE; + } + + + if(keyWatch.UP && !keyWatch.DOWN){ + velocity.y=-mul*walkSpeed*c_vel; + // Check if we need to push the player to get around corner snags. + // Looks up tile collision flags and uses those, as well as the + // hitbox's corner points to determine whether pushing is needed. + if(touching==UP){ + var col_tl:Int=EventScripts.get_tile_collision_flags(x, y - 1, parent.map,parent.curMapBuf); + var col_tr:Int=EventScripts.get_tile_collision_flags(x + width, y - 1, parent.map,parent.curMapBuf); + if((x + width)% 16<6 &&(col_tl !=FlxObject.ANY)&&(col_tl !=FlxObject.DOWN)){ + additional_x_vel=-30; + } else if((x % 16)>9 &&(col_tr !=FlxObject.ANY)&&(col_tr !=FlxObject.DOWN)){ + additional_x_vel=30; + } + } + } else if(keyWatch.DOWN && !keyWatch.UP){ + velocity.y=mul*walkSpeed*c_vel; + if(touching==DOWN){ + var col_bl:Int=EventScripts.get_tile_collision_flags(x, y + height + 1, parent.map, parent.curMapBuf); + var col_br:Int=EventScripts.get_tile_collision_flags(x + width, y + height + 1, parent.map, parent.curMapBuf); + if((x + width)% 16<6 &&(col_bl !=FlxObject.ANY)&&(col_bl !=FlxObject.UP)){ + additional_x_vel=-30; + } else if(x % 16>9 &&(col_br !=FlxObject.ANY)&&(col_br !=FlxObject.UP)){ + additional_x_vel=30; + } + } + } else { + velocity.y=0; + + } + if(keyWatch.LEFT && !keyWatch.RIGHT){ + velocity.x=-mul*walkSpeed*c_vel; + if(touching==LEFT){ + var col_tl2:Int=EventScripts.get_tile_collision_flags(x-1, y, parent.map,parent.curMapBuf); + var col_bl2:Int=EventScripts.get_tile_collision_flags(x-1, y + height, parent.map, parent.curMapBuf); + if((y - Registry.HEADER_HEIGHT + height)% 16<6 &&(col_tl2 !=FlxObject.ANY)&&(col_tl2 !=FlxObject.RIGHT)){ + additional_y_vel=-30; + } else if((y - Registry.HEADER_HEIGHT)% 16>9 &&(col_bl2 !=FlxObject.ANY)&&(col_bl2 !=FlxObject.RIGHT)){ + additional_y_vel=30; + } + + } + } else if(keyWatch.RIGHT && !keyWatch.LEFT){ + velocity.x=mul*walkSpeed * c_vel; + if(touching==RIGHT){ + var col_tr2:Int=EventScripts.get_tile_collision_flags(x + width + 1, y, parent.map,parent.curMapBuf); + var col_br2:Int=EventScripts.get_tile_collision_flags(x + width + 1, y + height, parent.map, parent.curMapBuf); + if((y - Registry.HEADER_HEIGHT + height)% 16<6 &&(col_tr2 !=FlxObject.ANY)&&(col_tr2 !=FlxObject.LEFT)){ + additional_y_vel=-30; + } else if((y - Registry.HEADER_HEIGHT)% 16>9 &&(col_br2 !=FlxObject.ANY)&&(col_br2 !=FlxObject.LEFT)){ + additional_y_vel=30; + } + + } + } else { + velocity.x=0; + } + + if(keyWatch.ACTION_1){ + turn_in_place_ticks +=1; + velocity.x=velocity.y=0; + if(turn_in_place_ticks>23){ + ANIM_STATE=as_idle; + if(keyWatch.RIGHT){ + facing=RIGHT; + } else if(keyWatch.LEFT){ + facing=LEFT; + } else if(keyWatch.UP){ + facing=UP; + } else if(keyWatch.DOWN){ + facing=DOWN; + } + } + } else { + turn_in_place_ticks=0; + } + + + } + + private function ladder_logic():Void + { + velocity.x=velocity.y=0; + if(keyWatch.UP){ + velocity.y=-walkSpeed*0.7; + play("climb"); + } else if(keyWatch.DOWN){ + velocity.y=walkSpeed*0.7; + play("climb"); + } else { + play("idle_climb"); + } + + if(keyWatch.LEFT){ + velocity.x=-walkSpeed; + } else if(keyWatch.RIGHT){ + velocity.x=walkSpeed; + } + + step_noise_timer -=FlxG.elapsed; + + if(step_noise_timer<0 &&(velocity.y !=0)){ + step_noise_timer=0.2; + Registry.sound_data.play_sound_group(Registry.sound_data.ladder_step); + } + + // Make sure the ladder anim doesn't keep playing when leaving ladder state + state=S_GROUND; + ANIM_STATE=as_idle; + } + + public function on_anim_change(name:String, _frame:Int, _index:Int):Void { + switch(name){ + case "walk_l": + case "attack_left": + offset.x=4; + break; + case "walk_r": + case "attack_right": + offset.x=3; + break; + case "walk_d": + case "attack_down": + offset.x=3; + break; + case "walk_u": + case "attack_up": + offset.x=3; + break; + } + } + + public function be_idle():Void { + ANIM_STATE=as_idle; + idle_ticks=5; + switch(facing){ + case UP: + play("idle_u"); + break; + case LEFT: + play("idle_l"); + break; + case RIGHT: + play("idle_r"); + break; + case DOWN: + play("idle_d"); + break; + } + } +} \ No newline at end of file diff --git a/intra/source/entity/player/Transformer.hx b/intra/source/entity/player/Transformer.hx new file mode 100644 index 0000000..f928050 --- /dev/null +++ b/intra/source/entity/player/Transformer.hx @@ -0,0 +1,245 @@ +package entity.player +{ +import flash.geom.Point; +import global.Registry; +import helper.DH; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import org.flixel.FlxTilemap; +/** + * Item that switches two arbitrary tiles on the map. + * Obviously breaks things to hell so we only give it + * to the player at the end. + * @author Seagaia + */ +class Transformer extends FlxSprite +{ + + public var selector:FlxSprite=new FlxSprite; + public var selected:FlxSprite=new FlxSprite; + + private var state:Int=0; + private var s_idle:Int=0; + private var s_ready:Int=-1; + private var s_has_one:Int=1; + private var s_transforming:Int=2; + + private var map:FlxTilemap=new FlxTilemap; + private var g_off:Point=new Point(); + private var is_playstate:Bool=false; + + private var p:Player; + private var parent:Dynamic; + + private var did_init:Bool=false; + private var dontfuckgindoanything:Bool=true; + + private var okay_places:Array; + private var okay_rooms:Array; + + + //[Embed(source="../../res/sprites/inventory/selector.png")] public static inline var embed_selector:Class; + public function new(_p:Player,_parent:Dynamic) + { + p=_p; + parent=_parent; + reset_next(); + + selector.loadGraphic(embed_selector, true, false, 16, 16); + selected.loadGraphic(embed_selector, true, false, 16, 16); + selected.addAnimation("a", [1]); + selector.addAnimation("a", [0, 1], 4); + selector.play("a"); + selected.play("a"); + + visible=false; + selector.visible=false; + selected.visible=false; + + + okay_places=new Array("GO", "CIRCUS", "HOTEL", "APARTMENT"); + okay_rooms=new Array(new Point(2,3), new Point(7, 0), new Point(8, 11), new Point(8, 7)); + + + } + + + override public function update():Void + { + + if(Registry.FUCK_IT_MODE_ON && FlxG.keys.justPressed("T")){ + trace("Transformer.as:GE_EVENTS:BEAT GAME IS NOW TRUE"); + Registry.GE_States[Registry.GE_Finished_Game]=true; + } + + // Extra nexus and drawer hardcoded check... + + if(!did_init){ + reset_next(); + did_init=true; + + } + // hack + map=parent.curMapBuf; + g_off.x=Registry.CURRENT_GRID_X * 160; + g_off.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + switch(state){ + case s_idle: + break; + case s_ready: + case s_transforming: + facing=p.facing; + var hh:Int=Registry.HEADER_HEIGHT; + + if(facing==UP){x=p.x;y=p.y - 16;} + else if(facing==LEFT){ x=p.x - 16;y=p.y;} + else if(facing==RIGHT){ x=p.x + 16;y=p.y;} + else { x=p.x;y=p.y + 16;} + + if(x % 16<=10){ x -=x % 16;} + else { x +=(16 - x % 16);} + if((y - hh)% 16<=7){ y -=((y - hh)% 16);} + else { y +=(16 -(y - hh)% 16);} + + selector.x=x; + selector.y=y; + + break; + + } + + if(Registry.E_Transformer_On){ + Registry.E_Transformer_On=false; + + } + if(Registry.E_Transformer_Off){ + Registry.E_Transformer_Off=false; + selector.visible=selected.visible=false; + state=s_idle; + + } + + super.update(); + } + + //called by player + public function use_item():Void { + if(Registry.sound_data.current_song_name=="BRIARFIGHT"){ + return; + } + // If we finished the game, use swap everywhere + if(Registry.GE_States[Registry.GE_Finished_Game]){ + dontfuckgindoanything=false; + + if(Registry.CURRENT_MAP_NAME=="DRAWER" && Registry.CURRENT_GRID_Y>=9){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="NEXUS" && Registry.CURRENT_GRID_Y<=3){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="BLANK" && Registry.CURRENT_GRID_Y>=7){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="SPACE" && Registry.CURRENT_GRID_Y>=5){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="TRAIN" && Registry.CURRENT_GRID_Y>=8){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="SUBURB" && Registry.CURRENT_GRID_Y>=5 && Registry.CURRENT_GRID_X==2){ + dontfuckgindoanything=true; + } else if(Registry.CURRENT_MAP_NAME=="DEBUG"){ + dontfuckgindoanything=true; + } + // Otherwise, only activate swap in certain rooms. + } else { + for(i in 0...4){ + if(Registry.CURRENT_MAP_NAME==okay_places[i] && Registry.CURRENT_GRID_X==okay_rooms[i].x && Registry.CURRENT_GRID_Y==okay_rooms[i].y){ + if(Registry.CURRENT_MAP_NAME=="GO"){ + if(Registry.GAMESTATE.player.facing==FlxObject.UP && Registry.GAMESTATE.player.y=7){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="SPACE" && Registry.CURRENT_GRID_Y>=5){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN" && Registry.CURRENT_GRID_Y>=7){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="SUBURB" && Registry.CURRENT_GRID_Y>=5 && Registry.CURRENT_GRID_X==2){ + DH.dialogue_popup(DH.lk("swap", 1)); + } else if(Registry.CURRENT_MAP_NAME=="DEBUG"){ + //DH.dialogue_popup("Sorry!"); + DH.dialogue_popup(DH.lk("swap", 0)); + } else { + //DH.dialogue_popup("Young could not muster the strength to use the swap here."); + DH.dialogue_popup(DH.lk("swap", 2)); + } + return; + } + + if(state==s_idle){ + state=s_ready; + selector.visible=true; + } else if(state==s_ready){ + selected.visible=true; + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + selected.x=selector.x; + selected.y=selector.y; + state=s_transforming; + } else if(state==s_transforming){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + + var _x:Int=(selected.x - g_off.x)/ 16; + var _y:Int=(selected.y - g_off.y)/ 16; + + var tt1:Int=map.getTile(_x, _y); + + var _x2:Int=(selector.x - g_off.x)/ 16; + var _y2:Int=(selector.y - g_off.y)/ 16; + + var tt2:Int=map.getTile(_x2, _y2); + + //Switch tiles + + //trace("tt1:", tt1, _x, _y); + //trace("tt2:", tt2, _x2, _y2); + + map.setTile(_x, _y, tt2); + map.setTile(_x2, _y2, tt1); + + state=s_ready; + selected.visible=false; + + } + } + /** + * Updates grid coords if needed, also the current map buffer + */ + public function reset_next():Void { + state=s_idle; + selected.visible=selector.visible=false; + if(Registry.is_playstate){ + is_playstate=true; + g_off.x=Registry.CURRENT_GRID_X * 160; + g_off.y=Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT; + } else { + g_off.x=0; + g_off.y=Registry.HEADER_HEIGHT; + } + map=parent.curMapBuf; + } +} \ No newline at end of file diff --git a/intra/source/extension/JoyQuery/Joystick.hx b/intra/source/extension/JoyQuery/Joystick.hx new file mode 100644 index 0000000..159f9d7 --- /dev/null +++ b/intra/source/extension/JoyQuery/Joystick.hx @@ -0,0 +1,240 @@ +/* +JoyQuery ActionScript 3.0 Class Version:1 + +(C)2011 Alexander O'Mara + +The following line must be added to the AIR Application XML +descriptor file between the root("application")tags: +extendedDesktop +Additionally, for release, the Joy Query executable must be +included in the installer and published as a native installer. + +This class file is designed to be used with AIR to give +Native Windows AIR applications a set of APIs to Interface +with joystick input through the JoyQuery extension. This +class file is free software. You may copy, edit, reuse, and +redistribute this class freely provided that altered versions +are not distrubuted as the original. + +This class file is provided "as is" without warranty of any +kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and +fitness for a particular purpose. In no event will the +author of this program be liable for any damages of any kind. +*/ +package extension.JoyQuery; + +import flash.filesystem.File; +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.Event; +import flash.events.ProgressEvent; +import flash.events.NativeProcessExitEvent; + +class Joystick extends Dynamic +{ + private var capable:Array; + private var inputStatus:Array; + private var isRunning:Bool; + private var ready:Bool; + private var total:Float; + private var callerObject:Dynamic; + private var extensionPath:File; + private var process:NativeProcess; + public var exists:Bool=false; + + public function new(mainWindowObject:Dynamic, joystickExtensionPath:String):Void + { + callerObject=mainWindowObject; + var file:File=File.applicationDirectory; + extensionPath=file.resolvePath(joystickExtensionPath); + exists=true; + } + //Main handler for the extension. + private function main(command:String):Void + { + //Process info. + var processInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + processInfo.executable=extensionPath; + + //Process arguments. + var commandSplit:Array=command.split(" "); + var args:Array=new Array(); + for(i in 0...commandSplit.length) + { + args.push(commandSplit[i]); + } + processInfo.arguments=args; + + //Create process. + process=new NativeProcess(); + process.start(processInfo); + + //Listen for program to close. + process.addEventListener(NativeProcessExitEvent.EXIT, onExit); + function onExit(e:NativeProcessExitEvent):Void + { + capable=null; + inputStatus=null; + ready=false; + total=0; + } + //Listen for output. + process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); + function onOutputData(e:ProgressEvent):Void + { + //Check if not running. + if(!isRunning) + { + return; + } + try { + //Get STD:OUT. + var input:String=process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable); + //Check that the extension is giving state output. + if(input.split(":")[0] !="S") + { + ready=true; + return; + } + + //Array for joystick string. + var inputArray:Array=input.split(":")[1].split("|"); + + //Split up axis positions and button states for axis. + var loc_inputStatus:Array=new Array(inputArray.length); + for(i in 0...inputArray.length) + { + loc_inputStatus[i]=inputArray[i].split("~"); + } + //Set total joysticks. + if(inputArray[0]=="none") + { + total=0; + } + else + { + total=loc_inputStatus.length; + } + + //Index each axis and button. + for(i=0;i=new Array(total); + for(i=0;i4)nr_axes=4; + } + + // Give the state of a certain control binding, based on an index Into the joybinds array + public static function get_joy_state(idx:Int):Bool { + if(Intra.IS_WINDOWS || Intra.IS_MAC){ + // Hacky way to ignore uninitizliaed controls + if(Registry.joybinds[IDX_ACTION_1]==Registry.joybinds[IDX_DOWN]){ + return false; + } + // axes first(one state for dir), then buttons + // ID is an axis state + var id:Int=Registry.joybinds[idx]; + if(Math.abs(id)- 1<2 * nr_axes){ + var axis_state:Float; + var new_id:Int=Math.abs(id)- 1; + + if(Intra.IS_WINDOWS){ + axis_state=Main.joy.getAxis(0, Std.int(new_id / 2)); + } else if(Intra.IS_MAC){ + axis_state=Main.mac_joy_manager.joysticks[0].getAxis(int(new_id / 2)); + } + + if(id<0){ // Threshold is negative + if(axis_state<-0.25){ + return true; + } + } else { + if(axis_state>0.25){ + return true; + } + } + } else { + var button_state:Bool; + id=id - 1 - 2 * nr_axes; + if(Intra.IS_WINDOWS){ + return Main.joy.buttonIsDown(0, id); + } else if(Intra.IS_MAC){ + return Main.mac_joy_manager.joysticks[0].getButton(id); + } + + } + } else if(Intra.is_ouya){ + //if(Main.game_input_device !=null){ + //var min:Float=Main.game_input_device.getControlAt(Registry.joybinds[idx]).minValue; + //var max:Float=Main.game_input_device.getControlAt(Registry.joybinds[idx]).maxValue; + //var val:Float=Main.game_input_device.getControlAt(Registry.joybinds[idx]).value; + // + // BLIND GUESS!!! + //if(val>min){ + //return true; + //} + //} + //if(idx==IDX_UP){ + //if(joypad.DPAD_UP || joypad.STICK_UP){ + //return true; + //} + //} else if(idx==IDX_RIGHT){ + //return joypad.DPAD_RIGHT || joypad.STICK_RIGHT; + //} else if(idx==IDX_DOWN){ + //return joypad.DPAD_DOWN || joypad.STICK_DOWN; + //} else if(idx==IDX_LEFT){ + //return joypad.DPAD_LEFT || joypad.STICK_LEFT; + //} else if(idx==IDX_ACTION_1){ + //return joypad.BUTTON_O; + //} else if(idx==IDX_ACTION_2){ + //return joypad.BUTTON_U; + //} else if(idx==IDX_PAUSE){ + //if(joypad.BUTTON_Y){ + //return true; + //} + //} + + } + return false; + } + + public static function joy_any_button():Bool { + if(Intra.IS_WINDOWS){ + for(i in 0...nr_btns){ + if(Main.joy.buttonIsDown(0, i)){ + return true; + } + } + } else if(Intra.IS_MAC){ + for(i=0;i0.25){ + if(Main.joy.getAxis(0, i)<0){ + return -1; + } else { + return 1; + } + } + } + } else if(Intra.IS_MAC){ + for(i=0;i0.25){ + if(Main.mac_joy_manager.joysticks[0].getAxis(i)<0){ + return -1; + } else { + return 1; + } + } + } + } + return 0; + } + + // Returns the button ID as ready for serialization(offset by 1, shifted over for being a button) + public static function joy_get_first_active_button_id():Int { + var i:Int=0; + if(Intra.IS_WINDOWS){ + for(i=0;i0.7){ + if(Main.joy.getAxis(0, i)<0){ + return -(1 + i*2);// OFFSET - usually left or down + } else { + return 2 + i*2;// OFFSET + 1 - usually right or up + } + } + } + } else if(Intra.IS_MAC){ + for(i=0;i0.7){ + if(Main.mac_joy_manager.joysticks[0].getAxis(i)<0){ + return -(1 + i * 2); + } else { + return 2 + i * 2; + } + } + } + } + return 0; + } + + public static function get_axis_stats():String { + var s:String=""; + var axis_state:Float=0; + for(i in 0...nr_axes){ + + if(Intra.IS_WINDOWS){ + axis_state=Main.joy.getAxis(0, i); + } else if(Intra.IS_MAC){ + axis_state=Main.mac_joy_manager.joysticks[0].getAxis(i); + } + if(axis_state<-0.7){ + s +="-"; + } else if(axis_state>0.7){ + s +="+"; + } else { + s +="0"; + } + } + return s; + } + + public static function get_btn_stats():String { + var s:String=""; + var bs:Bool=false; + for(i in 0...nr_btns){ + if(Intra.IS_WINDOWS){ + bs=Main.joy.buttonIsDown(0, i); + } else if(Intra.IS_MAC){ + bs=Main.mac_joy_manager.joysticks[0].getButton(i); + } + if(bs){ + s +="1"; + } else { + s +="0"; + } + if(i==15){ + s +="\n "; + } + } + return s; + } + + + override public function update():Void { + //if(!Intra.is_ouya){ + UP=FlxG.keys.pressed(Registry.controls[IDX_UP]); + DOWN=FlxG.keys.pressed(Registry.controls[IDX_DOWN]); + LEFT=FlxG.keys.pressed(Registry.controls[IDX_LEFT]); + RIGHT=FlxG.keys.pressed(Registry.controls[IDX_RIGHT]); + JP_UP=FlxG.keys.justPressed(Registry.controls[IDX_UP]); + JP_DOWN=FlxG.keys.justPressed(Registry.controls[IDX_DOWN]); + JP_LEFT=FlxG.keys.justPressed(Registry.controls[IDX_LEFT]); + JP_RIGHT=FlxG.keys.justPressed(Registry.controls[IDX_RIGHT]); + + JR_UP=FlxG.keys.justReleased(Registry.controls[IDX_UP]); + JR_RIGHT=FlxG.keys.justReleased(Registry.controls[IDX_RIGHT]); + JR_LEFT=FlxG.keys.justReleased(Registry.controls[IDX_LEFT]); + JR_DOWN=FlxG.keys.justReleased(Registry.controls[IDX_DOWN]); + + + + JUST_PRESSED_PAUSE=FlxG.keys.justPressed(Registry.controls[IDX_PAUSE]); + if(Registry.disable_menu){ + JUST_PRESSED_PAUSE=false; + } + if(FORCE_PAUSE && false==Registry.disable_menu){ + FORCE_PAUSE=false; + JUST_PRESSED_PAUSE=true; + } + + + JUST_RELEASED_PAUSE=FlxG.keys.justReleased(Registry.controls[IDX_PAUSE]); + + JP_ACTION_1=FlxG.keys.justPressed(Registry.controls[IDX_ACTION_1]); + JP_ACTION_2=FlxG.keys.justPressed(Registry.controls[IDX_ACTION_2]); + ACTION_1=FlxG.keys.pressed(Registry.controls[IDX_ACTION_1]); + ACTION_2=FlxG.keys.pressed(Registry.controls[IDX_ACTION_2]); + + //} + + + if((Intra.IS_WINDOWS && Main.joy !=null && Keys.has_joypad)||(Intra.IS_MAC && Keys.has_joypad && Main.mac_joy_manager.joysticks[0] !=null)||(0 && Intra.is_ouya)){ + if(get_joy_state(IDX_LEFT)){ + if(!LEFT && ALLOW_JP_LEFT){ + JP_LEFT=true; + ALLOW_JP_LEFT=false; + } + LEFT=true; + } else { + if(!ALLOW_JP_LEFT){ + JR_LEFT=true; + } + ALLOW_JP_LEFT=true; + } + + if(get_joy_state(IDX_RIGHT)){ + if(!RIGHT && ALLOW_JP_RIGHT){ + JP_RIGHT=true; + ALLOW_JP_RIGHT=false; + } + RIGHT=true; + } else { + if(!ALLOW_JP_RIGHT){ + JR_RIGHT=true; + } + ALLOW_JP_RIGHT=true; + } + + if(get_joy_state(IDX_DOWN)){ + if(!DOWN && ALLOW_JP_DOWN){ + JP_DOWN=true; + ALLOW_JP_DOWN=false; + } + DOWN=true; + + } else { + if(!ALLOW_JP_DOWN){ + JR_DOWN=true; + } + ALLOW_JP_DOWN=true; + } + + if(get_joy_state(IDX_UP)){ + if(!UP && ALLOW_JP_UP){ + JP_UP=true; + ALLOW_JP_UP=false; + } + UP=true; + } else { + if(!ALLOW_JP_UP){ + JR_UP=true; + } + ALLOW_JP_UP=true; + } + + if(get_joy_state(IDX_ACTION_1)){ + if(!ACTION_1 && ALLOW_JP_ACTION_1){ + JP_ACTION_1=true; + ALLOW_JP_ACTION_1=false; + } + ACTION_1=true; + } else { + ALLOW_JP_ACTION_1=true; + } + + if(get_joy_state(IDX_ACTION_2)){ + if(!ACTION_2 && ALLOW_JP_ACTION_2){ + JP_ACTION_2=true; + ALLOW_JP_ACTION_2=false; + } + ACTION_2=true; + } else { + ALLOW_JP_ACTION_2=true; + } + + if(get_joy_state(IDX_PAUSE)){ + if(ALLOW_JP_PAUSE){ + ALLOW_JP_PAUSE=false; + JUST_PRESSED_PAUSE=true; + } + } else { + ALLOW_JP_PAUSE=true; + } + + //var a:Array=new Array(); + //var asdf:Int=0; + //for(asdf in 0...nr_btns){ + //a.push(int(Main.joy.buttonIsDown(0, asdf))); + //} + //for(asdf=0;asdf; +import global.Keys; +import helper.DH; +import helper.Joypad_Config_Group; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import states.PlayState; +import states.RoamState; +class Registry { + +public static var MOBILE_ASK_TO_EXIT_WITH_BACK:Bool=false; +public static var MOBILE_OKAY_TO_EXIT_WITH_BACK:Bool=false; +public static var FUCK_IT_MODE_ON:Bool=false; + +/* game constants */ +public static inline var MAX_DOOR_PAIRS:Int=95; +public static var DOOR_REFS:Array=new Array(); +public static var DOOR_INFO:Array=new Array(MAX_DOOR_PAIRS); +public static inline var SCREEN_WIDTH_IN_TILES:Int=10; +public static inline var SCREEN_HEIGHT_IN_TILES:Int=10; +public static inline var TILE_WIDTH:Int=16; +public static inline var TILE_HEIGHT:Int=16; +public static inline var SCREEN_WIDTH_IN_PIXELS:Int=160; +public static inline var SCREEN_HEIGHT_IN_PIXELS:Int=160; +public static inline var HEADER_HEIGHT:Int=20;//Height of header. Needed in screen scrolling +public static var SAVE_NAME:String="ANODYNE_SAVE_123"; +public static var DIALOGUE:Dynamic; +public static var DIALOGUE_STATE:Dynamic; +public static inline var DUNGEON_ENTRANCES:Dynamic={ STREET:new Point(232, 737), BEDROOM:new Point(400, 765), REDCAVE:new Point(555, 764), CROWD:new Point(555, 1239), APARTMENT:new Point(391, 911), HOTEL:new Point(394, 440), CIRCUS:new Point(715, 1396), NEXUS:new Point(710,1090)}; + +/* Global state */ +public static var BOI:Bool=false;// BOI Sprites on in easter egg redcave +public static var is_playstate:Bool=true; +public static var volume_scale:Float=1.0; +public static var pillar_switch_state:Bool=false;//Reset when entering a map with differentname +public static var ENTRANCE_GRID_X:Int; +public static var ENTRANCE_GRID_Y:Int; +public static var ENTRANCE_PLAYER_X:Int; +public static var ENTRANCE_PLAYER_Y:Int; +public static var PLAYER_X:Int; +public static var PLAYER_Y:Int; +public static var CURRENT_GRID_X:Int; +public static var CURRENT_GRID_Y:Int; +public static var autosave_on:Bool=true; +public static var checkpoint:Dynamic={ x:0, y:0, area:"" }; +public static var cur_dialogue:String; +/** + * Used for disabling the menu during an event because you could potentially break the game otherwise + */ +public static var disable_menu:Bool=false; + +/* Grid-local state that needs to be accessed globally for events */ +public static var GRID_ENEMIES_DEAD:Int=0; +public static var GRID_PUZZLES_DONE:Int=0; + +/* Subgroups, speeds collisions */ +public static var subgroup_dust:Array=new Array(); +public static var subgroup_propelled:Array=new Array(); +public static var subgroup_interactives:Array=new Array(); +public static var subgroup_on_off_lasers:Array=new Array(); +public static var subgroup_switch_pillars:Array=new Array(); +public static var subgroup_gates:Array=new Array(); +public static var subgroup_dash_traps:Array=new Array(); +public static var subgroup_gas:Array=new Array(); +public static var subgroup_spike_rollers:Array=new Array(); +public static var subgroup_destroyems:Array=new Array(); + +/* Input, sound, state entities */ +public static var keywatch:Keys; +public static var sound_data:SoundData=null; +public static var GAMESTATE:Dynamic=null; +public static var PLAYSTATE:PlayState; +//public static var ROAMSTATE:RoamState; +public static var NEXT_MAP_NAME:String=""; + +/* Sprite hit return values */ +public static var HIT_NORMAL:Int=0; +public static var HIT_KEY:Int=1; + +/********************** +/* START EVENTS ****** + * *******************/ + + +/* Get the broom */ +public static var EVENT_OPEN_BROOM:Bool=false; +/* Upgrade health */ +public static var EVENT_EXTEND_HEALTH:Bool=false; + +public static var EVENT_OSCILLATE_DARKNESS_ALPHA:Bool=false; +/* If set in a grid, alpha is changed to target value and then these values are set to 0 */ +public static var EVENT_CHANGE_DARKNESS_ALPHA:Bool=false; +public static var EVENT_CHANGE_DARKNESS_ALPHA_TARGET:Float=0; +public static var EVENT_CHANGE_VOLUME_SCALE:Bool=false; +public static var EVENT_CHANGE_VOLUME_SCALE_TARGET:Float=1.0; +public static var E_FADE_AND_SWITCH:Bool=false; +public static var E_FADE_AND_SWITCH_SONG:String=" "; +public static var E_FADED:Bool=false; +public static var E_NEXT_MAP_DARKNESS_8:Bool=false; +public static var E_NEXT_MAP_NO_STATIC:Bool=false; +public static var E_NEXT_MAP_TURN_ON_LIGHT:Bool=false; + +public static var EVENT_LEARN_TO_EQUIP:Bool=false; +public static var EVENT_TELEPORT_DOWN_SOUND:Bool=false; +public static var E_Enter_Whirlpool_Down:Bool=false; +public static var E_Enter_Fall_Down:Bool=false; +public static var E_Blank_Fade:Bool=false; +public static var E_Transformer_On:Bool=false; +public static var E_Transformer_Off:Bool=false; +public static var E_Dialogue_Just_Finished:Bool=false; +public static var E_DESTROY_PLAYSTATE:Bool=false; +/** + * The next map load will play the roof song + */ +public static var E_PLAY_ROOF:Bool=false; +/** + * If the cur and next map are the same, then restart the song anyways + */ +public static var E_OVERRIDE_SAME_MAP_SONG:Bool=false; + + +/* Elevator in HOTEL */ +public static var E_From_Elevator:Bool=false; + +public static var GFX_WAVE_EFFECT_ON:Bool=false; +public static var GFX_WAVE_EFFECT_START:Float=0; +public static var GFX_WAVE_TABLE:Array=new Array(-3,-2,-1,0,1,2,3,2,1,0,-1,-2); +public static var GFX_WAVE_TABLE_INDEX:Int=0; +public static var GFX_WAVE_EFFECT_FREQ:Int=0; +public static var GFX_WAVE_TABLE_ROLLOVER:Int=0; +public static var GFX_BUFFER:BitmapData=new BitmapData(160, 180, true); + +public static var EVENT_FADE_BEGUN:Bool=false; +public static var EVENT_FADE_OVER:Bool=false; + +public static var CURRENT_CUTSCENE:Int; +public static var E_Load_Cutscene:Bool=false; + + +/********************** +/* END EVENTS ****** + * *******************/ + +/* font */ +//[Embed(source="../res/font/font-black.png")] public static var C_FONT_BLACK:Class; +//[Embed(source="../res/font/font-black-apple-7x8.png")] public static var C_FONT_APPLE_BLACK:Class; +//[Embed(source="../res/font/font-white-apple-7x8.png")] public static var C_FONT_APPLE_WHITE:Class; +//[Embed(source="../res/font/jp_white.png")] public static var C_FONT_JP_WHITE:Class; +//[Embed(source="../res/font/kr_white.png")] public static var C_FONT_KO_WHITE:Class; +//[Embed(source="../res/font/11x12_ZHS.png")] public static var C_FONT_ZHS_WHITE:Class; +//[Embed(source="../res/font/es_white.png")] public static var C_FONT_ES_WHITE:Class;// also for pt-br +////[Embed(source="../res/font/jp_white_test.png")] public static var C_FONT_JP_WHITE:Class; + +public static var C_FONT_BLACK_STRING:String="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890.:,;'\"(!?)+-*/=[]"; +public static var C_FONT_APPLE_BLACK_STRING:String="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ’1234567890.:,;\'\"(!?)+-*/=$]"; +public static var C_FONT_APPLE_WHITE_STRING:String="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ’1234567890.:,;\'\"(!?)+-*/=$]"; +public static var FONT_cpl:Int=27; +public static var FONT_w:Int=8; +public static var FONT_h:Int=8; +public static var APPLE_FONT_w:Int=7; + +/* base xml of the game */ +//[Embed(source='../xml/Intra.xml', mimeType="application/octet-stream")] private static inline var EmbedXML:Class; +public static var embedXML:XML; + +/* These refer to the serialized inventory array which stores the state of having an item */ +public static inline var IDX_BROOM:Int=0; +public static inline var IDX_JUMP:Int=1; +public static inline var IDX_TRANSFORMER:Int=2; +public static inline var IDX_WIDEN:Int=4; +public static inline var IDX_LENGTHEN:Int=5; +public static inline var IDX_GREEN_KEY:Int=6; +public static inline var IDX_RED_KEY:Int=7; +public static inline var IDX_BLUE_KEY:Int=8; +public static inline var IDX_BOX:Int=9; +public static inline var IDX_BIKE_SHOES:Int=10; +public static inline var IDX_POO:Int=11; +public static inline var IDX_SPAM:Int=12; +public static inline var IDX_MISSINGNO:Int=13; +public static inline var IDX_AUS_HEART:Int=14; +public static inline var IDX_ELECTRIC:Int=15; +public static inline var IDX_KITTY:Int=16; +public static inline var IDX_MELOS:Int=17; +public static inline var IDX_MARINA:Int=18; +public static inline var IDX_BLACK:Int=19; +public static inline var IDX_RED:Int=20; +public static inline var IDX_GREEN:Int=21; +public static inline var IDX_BLUE:Int=22; +public static inline var IDX_WHITE:Int=23; +public static inline var item_names:Array=new Array("BROOM","JUMP","TRANSFORMER","BAR","WIDEN","LENGTHEN","keyg","keyr","keyb","box","bikeshoes","poo","spam","missingno","ausheart","electric","kitty"); +public static inline var default_controls:Array=new Array("UP", "DOWN", "LEFT", "RIGHT", "C", "X", "Z", "ENTER"); + + +private static var RAW_STATEFUL:XML; +private static var RAW_STATELESS:XML; +/** BEGIN SERIALIZED **/ +public static var statefulXML:XML;// Represents things that need to keep state - bosses, etc +public static var statelessXML:XML;// Things that don't need state - breakables, torches, blah blah blah +public static var controls:Array=new Array("UP", "DOWN", "LEFT", "RIGHT", "C", "X", "Z", "ENTER");// Array of control bindings + +//public static var controls=new Array("UP","DOWN","LEFT","RIGHT","ENTER","OUYA_A","Z","OUYA_START"); + + +public static var joybinds:Array=new Array(0,0,0,0,0,0,0,0); +public static var inventory:Array=new Array( +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false); + +public static var achivement_state:Array=new Array( +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false +); +public static var modified_mobile_landscape:Bool=false; +public static var modified_mobile_portrait:Bool=false; + +public static var death_count:Int=0; +public static var nr_growths:Int; +public static inline var CARD_GOLDMAN_IDX:Int=43; +public static var card_states:Array=new Array( +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0); + +public static var CURRENT_MAP_NAME:String=""; +public static var bound_item_1:String; +public static var bound_item_2:String; +public static var bound_effect:String; +public static var playtime:Int=0; +public static var nr_keys:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0);//keys in get_nr_keys +public static var CUR_HEALTH:Int; +public static var MAX_HEALTH:Int; +//indexed by constants in Cutscene.as +public static var CUTSCENES_PLAYED:Array=new Array(0, 0, 0, 0, 0, 0,0,0,0,0,0); + +// Whether or not this big door has been opened. Keys stored in BIG_DOOR. +public static var Big_Door_State:Array=new Array(false, false, false, false); +// Whether or not this nexus door is open on the nexus side. Keys in Door.as +// Street vlaue always true +public static var Nexus_Door_State:Array=new Array(false, true, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false); + +public static var Big_Door_Reqs:Array=new Array(1, 3,10,15,20,25,32); + +public static var Event_Nr_Red_Pillars_Broken:Int=0; +public static var Event_Biofilm_Broken:Bool=false; +public static var Event_Nr_Suburb_Killed:Int=0; +/* + * An array holding state of events in the game - boss deaths, cutscenes(if any) + * */ +public static var GE_States:Array=new Array( +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false, false, false, false, false, false, +false, false, false, false, false);//45 +public static inline var GE_Bedroom_Boss_Dead_Idx:Int=0; +public static inline var GE_Redcave_Boss_Dead_Idx:Int=1; +public static inline var GE_Crowd_Boss_Dead_Idx:Int=2; +public static inline var GE_Apartment_Boss_Dead_Idx:Int=3; +public static inline var GE_Hotel_Boss_Dead_Idx:Int=4; +public static inline var GE_Circus_Boss_Dead_Idx:Int=5; +public static inline var GE_Bedroom_Visited:Int=6; +public static inline var GE_Did_A_Checkpoint:Int=7; +public static inline var GE_Swept_Dust:Int=8; +public static inline var GE_Left_BDR_After_Boss_Dead:Int=9; +public static inline var GE_ent_str:Int=10;// entered street +public static inline var GE_Sage_Dead_Idx:Int=11; +public static inline var GE_Happy_Started:Int=12; +public static inline var GE_Left_RDC_After_Boss_Dead:Int=13; +public static inline var GE_Left_CRD_After_Boss_Dead:Int=14; +public static inline var GE_Finished_Game:Int=15; +public static inline var GE_Briar_Happy_Done:Int=16; +public static inline var GE_Briar_Blue_Done:Int=17; +public static inline var GE_MOBILE_IS_RHAND:Int=18; +public static inline var GE_MOBILE_IS_XC:Int=19; +public static inline var GE_BRIAR_BOSS_DEAD:Int=20; +// Whehter these NPCs have been talked to for the quest that +// gives the clue to the NW overworld room. +public static inline var GE_QUEST_MITRA:Int=21; +public static inline var GE_QUEST_CLIFF:Int=22; +public static inline var GE_QUEST_BEACH:Int=23; +public static inline var GE_QUEST_FOREST:Int=24; +public static inline var GE_QUEST_FIELDS:Int=25; +public static inline var GE_QUEST_CELL:Int=26; +public static inline var GE_QUEST_SUBURB:Int=27; +public static inline var GE_QUEST_SPACE:Int=28; +public static inline var GE_QUEST_GO:Int=29; +// +public static inline var GE_tradequestspookedmonster:Int=30; +public static inline var GE_tradequesthelpedmonster:Int=31; +public static inline var GE_tradequesthelpedshopkeeper:Int=32; +// +public static inline var GE_ENTERED_NEXUS_ONCE:Int=33; +public static inline var GE_go_mitra:Int=34; +public static inline var GE_got_all_cards_inanarea:Int=35; +public static inline var GE_ENTERED_BLUE_ONCE:Int=36; +public static inline var GE_HAVE_A_SECRET:Int=37; +public static inline var GE_DID_JOYPAD_CONFIG_ONCE:Int=38; + +public static var joy_grp:Joypad_Config_Group; + + +/** END SERIALIZED **/ + +//1, 2, 3... +// Some XML that holds other data, but for now: + +/** BEGIN HELPER FUNCTIONS **/ + +public static function all_bosses_dead():Bool { + var indices:Array=new Array(GE_Apartment_Boss_Dead_Idx, GE_Bedroom_Boss_Dead_Idx, GE_Circus_Boss_Dead_Idx, GE_Crowd_Boss_Dead_Idx, GE_Hotel_Boss_Dead_Idx, GE_Redcave_Boss_Dead_Idx); + + for(i in 0...6){ + if(!GE_States[indices[i]])return false; + } + + return true; +} + +public static function set_all_bosses_dead():Void { + trace("Registry.as:set_all_bosses_dead"); + var indices:Array=new Array(GE_Apartment_Boss_Dead_Idx, GE_Bedroom_Boss_Dead_Idx, GE_Circus_Boss_Dead_Idx, GE_Crowd_Boss_Dead_Idx, GE_Hotel_Boss_Dead_Idx, GE_Redcave_Boss_Dead_Idx); + + for(i in 0...6){ + GE_States[indices[i]]=true; + } +} +public static function get_nr_keys():Int { + if(nr_keys==null)return 0; + if(CURRENT_MAP_NAME=="BEDROOM"){ + return nr_keys[0]; + } else if(CURRENT_MAP_NAME=="STREET"){ + return nr_keys[1]; + } else if(CURRENT_MAP_NAME=="REDCAVE"){ + return nr_keys[2]; + } else if(CURRENT_MAP_NAME=="CROWD"){ + return nr_keys[3]; + } else if(CURRENT_MAP_NAME=="APARTMENT"){ + return nr_keys[4]; + } else if(CURRENT_MAP_NAME=="HOTEL"){ + return nr_keys[5]; + } else if(CURRENT_MAP_NAME=="CIRCUS"){ + return nr_keys[6]; + } else { + return 0; + } + +} + +public static function change_nr_keys(amount:Int):Void { + if(CURRENT_MAP_NAME=="BEDROOM"){ + nr_keys[0] +=amount; + } else if(CURRENT_MAP_NAME=="STREET"){ + nr_keys[1] +=amount; + } else if(CURRENT_MAP_NAME=="REDCAVE"){ + nr_keys[2] +=amount; + } else if(CURRENT_MAP_NAME=="CROWD"){ + nr_keys[3] +=amount; + }else if(CURRENT_MAP_NAME=="APARTMENT"){ + nr_keys[4] +=amount; + } else if(CURRENT_MAP_NAME=="HOTEL"){ + nr_keys[5] +=amount; + } else if(CURRENT_MAP_NAME=="CIRCUS"){ + nr_keys[6] +=amount; + } + +} + + +public static function reset_events():Void { + EVENT_OPEN_BROOM=false; + EVENT_CHANGE_DARKNESS_ALPHA=false; + EVENT_OSCILLATE_DARKNESS_ALPHA=false; + EVENT_CHANGE_VOLUME_SCALE=false; + volume_scale=1; + E_Enter_Whirlpool_Down=false; +} +/** + * Clear out any groups of specific objects used to + * speed up collisions(e.g., subgroup of dusts) + */ +public static function reset_subgroups():Void { + var ctr:Int; + + while(subgroup_dust.length>0){ + subgroup_dust.pop(); + } + while(subgroup_propelled.length>0){ + subgroup_propelled.pop(); + } + while(subgroup_interactives.length>0){ + subgroup_interactives.pop(); + } + while(subgroup_on_off_lasers.length>0){ + subgroup_on_off_lasers.pop(); + } + while(subgroup_switch_pillars.length>0){ + subgroup_switch_pillars.pop(); + } + while(subgroup_spike_rollers.length>0){ + subgroup_spike_rollers.pop(); + } + + subgroup_spike_rollers=null; + subgroup_spike_rollers=new Array(); + + subgroup_gates=null; + subgroup_gates=new Array(); + subgroup_dash_traps=null; + subgroup_dash_traps=new Array(); + subgroup_gas=null; + subgroup_gas=new Array(); + + // SHOULD ALL BE ZEROS + trace(subgroup_dust.length, subgroup_propelled.length, subgroup_interactives.length, subgroup_on_off_lasers.length, subgroup_switch_pillars.length, subgroup_spike_rollers.length, subgroup_gates.length, subgroup_dash_traps.length, subgroup_gas.length); +} + +public static function checkDoorInfo():Void { + var door_debug:Bool=false; + for(i in 0...DOOR_INFO.length){ + if(DOOR_INFO[i].length !=0){ + if(door_debug){ + trace("DOOR PAIR ", i , ":"); + trace(DOOR_INFO[i][0]); + if(DOOR_INFO[i][1] !=null){ + + trace(DOOR_INFO[i][1]); + } + } + } + } +} + + +// Changes the DAME-exported XML Into +// Something grid-related for our game. +public static function embed2saveXML():Void { + + var newMap:XML;//Will be a map node for our stateless/ful XML tree. + var o:XML;//Generic object XML + var map:XML;//For each "level"(house/dungeon/whatever) + var grid:XML;//Represents a "grid" + var grid_exists:Bool;// Set to true when an existing grid is found + // while iterating through some level's grids + var name:String; + var x:Int;var grid_x:Int; + var y:Int;var grid_y:Int; + var ba:ByteArray=new ByteArray(); + embedXML=new XML(new EmbedXML); + RAW_STATEFUL=; + RAW_STATELESS=; + statelessXML=; + statefulXML=; + //Every level corresponds to a floor of a dungeon, + //a house, the world map, etc. + for(map in embedXML.map){ + + newMap=; + newMap.@name=map.@name; + newMap.@type=map.@type; + // These are all the DAME objects. + for(o in map.*){ + //convert XY Into Grid X,Y. + x=parseInt(o.@x); + y=parseInt(o.@y); + grid_x=x / Registry.SCREEN_WIDTH_IN_PIXELS; + grid_y=y / Registry.SCREEN_HEIGHT_IN_PIXELS; + y +=Registry.HEADER_HEIGHT; + if(o.name()=="Door"){ + Registry.DOOR_INFO[parseInt(o.@frame)].push(new Array(x, y, newMap.@name)); + } + // Append the object "o" to the grid node if it already exists. + grid_exists=false; + for(grid in newMap.grid){ + if(grid.@grid_x==grid_x.toString()&& grid.@grid_y==grid_y.toString()){ + grid.appendChild(o); + grid_exists=true; + break; + } + } + // Otherwise, create a new grid node and append "o" to it. + if(!grid_exists){ + grid=; + grid.@grid_x=grid_x.toString(); + grid.@grid_y=grid_y.toString(); + grid.appendChild(o); + newMap.appendChild(grid); + } + } + //Finally, append the transformed level node to the serialized XML. + // it's okay to just append references, + // because a save file will change the statelessXML ref + // This way we have a copy of what was in the game swf + ba.clear(); + ba.writeObject(newMap); + ba.position=0; + if(newMap.@type=="Stateless"){ + RAW_STATELESS.appendChild(ba.readObject()as XML); + statelessXML.appendChild(newMap); + } else { + RAW_STATEFUL.appendChild(ba.readObject()as XML); + statefulXML.appendChild(newMap); + } + + } +} + +// Reads the embedded xml, compares it against the save file one. +public static function patch_xml(load:Dynamic):Void { + // First convert it Into a tree... poop! + + + if(RAW_STATEFUL !=null && RAW_STATELESS !=null){ + patch_some_tree(RAW_STATEFUL, load.data.stateful); + patch_some_tree(RAW_STATELESS, load.data.stateless); + } + + RAW_STATEFUL=null; + RAW_STATELESS=null; +} + + +private static function patch_some_tree(disk:XML,save:XML):Void { + + + // For each area + // For each grid: + // If SAVE has something but DISK doesn't, remove it from save. + // If DISK has something but SAVE doesn't, add to SAVE. + // Update SAVE's x,y to be DISK's x,y(I don't think I modify any object's x,y permanently? I hope o__o) + var map:XML;// Iterators for the children of root and maps + var s_map:XML; + var grid:XML; + var s_grid:XML; + + var o:XML;// + var found_map_match:Bool=false; + var found_obj_match:Bool=false; + + var guid:String;// A guid for a dame object + + var debug:Bool=false; + + var i:Int;// Iterators for objects in the grid xmls + var j:Int; + + var ba:ByteArray=new ByteArray();// resuable byte array for hard copying xml + var foundgridmatch:Bool=false; + if(debug)trace("Patching Stateful XML"); + + for(map in disk.map){ + for(s_map in save.map){ + if(s_map.@name.toXMLString()==map.@name.toXMLString()){ + found_map_match=true; + break; + } + } + // If we don't have this map from disk in the save, + // then add it to the save and continue. + if(false==found_map_match){ + save.appendChild(map); + if(debug)trace("added new map !**!*!*!*"); + continue; + } + + // Otherwise we do have it, so let's check its grids. + // We assume maps won't change size(God help us) + for(grid in map.grid){ + for(s_grid in s_map.grid){ + if(s_grid.@grid_x.toXMLString()==grid.@grid_x.toXMLString()&& + s_grid.@grid_y.toXMLString()==grid.@grid_y.toXMLString()){ + foundgridmatch=true; + break; + } + } + + if(foundgridmatch==false){ + s_grid=; + s_grid.@grid_x=grid.@grid_x.toXMLString(); + s_grid.@grid_y=grid.@grid_y.toXMLString(); + } + + // Look for DISK objs not in SAVE. + for(i=0;i0){ + var p:Dynamic=subgroup_destroyems.pop(); + if(p !=null){ + p.destroy(); + } + } +} + +public static function is_dungeon(n:String):Bool { + switch(n){ + case "BEDROOM": + case "STREET": + case "REDCAVE": + case "CROWD": + case "APARTMENT": + case "HOTEL": + case "CIRCUS": + return true; + break; + default: + return false; + break; + } + +} + +public static function cleanup_on_map_change():Void +{ + + if(Trade_NPC.cat_ref !=null){ + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_ref, true); + Registry.GAMESTATE.sortables.remove(Trade_NPC.cat_dust_ref, true); + Trade_NPC.cat_ref.destroy(); + Trade_NPC.cat_ref=null; + Trade_NPC.cat_dust_ref.destroy(); + Trade_NPC.cat_dust_ref=null; + } + Registry.volume_scale=1; + Registry.reset_events(); + Registry.reset_subgroups(); + //Event_Nr_Suburb_Killed=0; + // Reset other things? + DH.reset_scenes_on_map_change(); +} + +public static var es_string:String="ªÂâàÀáÁãÃçÇéÉêÊÍíóôÓÔõúÚüÜÑñabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’1234567890.:,;\' \"(!?)+- */=$]¡¿ŒœËëÈèÎîÏïùÙìò"; + +public static var zhs_string:String="#=ENGLISHDAOU-CTRby./Jzfoucldmenthgisvrwa!\"'PKYWB:(k,)pM[]F4\\jq^_*?0123 456789xXV%>;+Q$欢音乐吗?那就和个终端一只小雨机对话吧!疼痛路向南行名杂技演员快要失去平衡了喜安全网在哪里狮子们正包围耍人’荆棘:我累,扬。已经厌倦这样的循环感觉自己活同美梦中、噩不断地…事情是会发生改变永远都无能为力再见老兄啊呀抬起脚步挥动手臂如果没有你分钟也下好走弄三明治或者别什么贤做很多神秘声喂嘿噢听到太着马上醒过来可以使用方键四周移需按与物体他互时调出菜单将提供关身及境相信息想帮处理切希望得比祝运某种程度说总既又完却忽略掉现实知道应该怎助世界究竟转更所奇怪真成朋友直努白清楚最后告诫等谁麦卓叫车东西问字干嘛并记“”胆敢怂恿让滚意思—闭嘴愚蠢还漂亮坚持把糟糕搞定办瞧蒙面何角色静待之因撒谎解决算从前消尽而戴斗篷男候呃村长片大被邪恶量笼罩召唤此寻找传企图利达目必须抢先且保护它进左边激送门开始任务叹逗留兆头入然乃至整拯救扇死儿继续刚钥匙许九牛毛罢阻止唯途径拿往深求管探索懂值齐其区域卡顶部颗宝石测试展座殿考验存集智慧才通件武器玩当根扫帚言抱怨简傻站刻脑弱受伤害恐惧箱类似象征重选择回口英雄穿呢像冲危歉另式劝但场游戏法忘加强聪条便引导准备首接收张哦确否错非虑毫义战胜兽漫炼千万放松警惕海滩看低鸣闻股甜味打败丽担心困雪绝哈请喝杯混球靠热流汗越饥渴难耐金跟模带块砖跑愁吃辈哇赶撬于恢复初急旅虽些蛮酷商诉支次顾介绍优秀近嗯衣服背写匆山迷组森林风涡轮启产影响兑换新附结构怕庆幸作效跳鞋棒合颜观察宫藏匿满敌房间仔细查荒废邻居公寓家伙隐检外岛屿沿河底点红树逛洞穴锁北源唔黑暗喷火团夫妇坑缘肯裂缝特高诡异彩凉灰酒店层破第赌二主给桥拜托扯冒险精几遇姓操纵·笑氏型偷案例落文遗古代工艺品侵猜烦恼各琐碎雕庄橱获取数购买饮料克除坏脾气尊讲俗套压冷漠布雷耶爱德华浴室镜摄木框翻梅油皂电短献麻尘扮证每诚孤建议幻魔巢项输节停顿拒资原独隧稳少天曾升坝年月日秋丝罗格斯摔胫骨折七丑严肺题退休兰牌化妆常疑由脸侧尚未驯咬瑟抖双凶猛闪光眼睛况苦予追随搏愿佑诸顺辨认号(晓)窟勘峭壁延伸爬垂降承占位符画碰触两住弃注材质撞素墙设计制击率趣挑牢血监狱迎内容标置际勾勒概档谨慎价飓旧缩减迹峡谷湖泊池塘歇守卫替蓝掌繁忙灵魂依锈蚀铺伴般帐命逃亡绿属郊屋慢形星辰慰藉视领土圆圈约绕吱乱联系聊封邮显示屏乎五十享施财衰母亲离她毒青蛙遭志段沉睡状态坦据祖褪笔潦草空僚踏洋差禁忌善眠虹刺本伯袋萨维仓库修拥缺乏市民擅交立列划造城愉伟闯访偶尔句迪燃偏遥怒暴踪景塔早眺久损屹倒插云共宽固焰灯芒盖惜今统反挺啦散宜钱基职适较坐台表份诠释王迅速隔彼专则疯充鼓励仅足兴遍故税毕排益欲谈论识够欠连尾霸瓜揍喇叭裤耻胸腔蜜蜂性飞残病杀虫剂臭苍蝇幼徒劳旁吓猫咪绒嗷呜盒苗黏恙谢噜荣培训辆帅薄荷误花功易奖伊博责编辑辐射营养学嗨妈爸温柔喔截具湿皮肤极寒腾剧骼咀嚼冰习惯岁线突蝎报纸菌滋冻餐仿佛癌症蛋讨脏穷增添妙盏怀揣密窗户轨堕夜胡八聆卸囊扔丢粉睹迭龙虾螯砍咸挤沙剥夺雅蛄紫广泛朵飘阳遮挡询詹姆浆食季啪串诗莓奥弗兔超呵灌济妻孩贾汀六队噗鲍勃鼠称省哭泣滴泪眶刮莫盔猴念咖喱黄辣码躲躯攻推跌尖镇浪著乡牺牲读;敏锐旷野汇殊投悬崖秒呐盟糖招呼沮丧客憩历抗惩罚赎扰付庇迟水健挠痒馆惠券祸怜轻校涯恩参甩卖班紧拾陌熟宁弟曲惊茫播育尸举典骚犯谋女钝殴致册晚盯柯乔泥泡茶圣坛祭玻璃限蜡烛昨枕舒烟熏蘑菇授鱼渔吉米蝙蝠铁弯腰脊椎科蟾蜍斜药刷歧酬棍控右跃版悔《》柄默返弹配摸语拉拽钮师官妖鉴障碍靴装级朝阵零戈曼储若倔指踩板搭芬缇帕珊货抚晴朗晨甲币吼夹款吸期陋您呈协序术免费辛勤漏姐父估扩词史莱搬伐氓狗旋银洁爆炸植扭柱仆亚韦沃拘束楼"; + + + + + + + + + + + + + + + +public static var ko_string:String="가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫬쫴쬈쬐쬔쬘쬠쬡쬬쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝엤 !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS TUVWXYZ[ ]^_`abcdefghijklmnopqrstuvwxyz{|}~'’\"「」々。"; + +//public static var jp_string:String="abcdefghijklmnopqrstuvwxyzぁ......................."; +// Note that the first line has whitespace - the ' ' one and the ' ' one +public static var jp_string:String="ぁあぃいぅうぇえぉおかがきぎくぐけげ゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜゜  こごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん゛゜ゝゞァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ・ーヽヾ㈱㈲㈹㊤㊥㊦㊧㊨㌃㌍㌔㌘㌢㌣㌦㌧㌫㌶㌻㍉㍊㍍㍑㍗㍻㍼㍽㍾㎎㎏㎜㎝㎞㎡㏄㏍一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丶丸丹主丼丿乂乃久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔仕他仗付仙仝仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶伸伺似伽佃但佇位低住佐佑体何佗余佚佛作佝佞佩佯佰佳併佶佻佼使侃來侈例侍侏侑侖侘供依侠価侫侭侮侯侵侶便係促俄俊俎俐俑俔俗俘俚俛保俟信俣俤俥修俯俳俵俶俸俺俾倅倆倉個倍倏們倒倔倖候倚借倡倣値倥倦倨倩倪倫倬倭倶倹偃假偈偉偏偐偕偖做停健偬偲側偵偶偸偽傀傅傍傑傘備傚催傭傲傳傴債傷傾僂僅僉僊働像僑僕僖僚僞僣僥僧僭僮僵價僻儀儁儂億儉儒儔儕儖儘儚償儡優儲儷儺儻儼儿兀允元兄充兆兇先光克兌免兎児兒兔党兜兢入全兩兪八公六兮共兵其具典兼冀冂内円冉冊册再冏冐冑冒冓冕冖冗写冠冢冤冥冦冨冩冪冫冬冰冱冲决冴况冶冷冽凄凅准凉凋凌凍凖凛凜凝几凡処凧凩凪凭凰凱凵凶凸凹出函凾刀刃刄分切刈刊刋刎刑刔列初判別刧利刪刮到刳制刷券刹刺刻剃剄則削剋剌前剏剔剖剛剞剣剤剥剩剪副剰剱割剳剴創剽剿劃劇劈劉劍劑劒劔力功加劣助努劫劬劭励労劵効劼劾勁勃勅勇勉勍勒動勗勘務勝勞募勠勢勣勤勦勧勲勳勵勸勹勺勾勿匁匂包匆匈匍匏匐匕化北匙匚匝匠匡匣匪匯匱匳匸匹区医匿區十千卅卆升午卉半卍卑卒卓協南単博卜卞占卦卩卮卯印危即却卵卷卸卻卿厂厄厖厘厚原厠厥厦厨厩厭厮厰厳厶去参參又叉及友双反収叔取受叙叛叟叡叢口古句叨叩只叫召叭叮可台叱史右叶号司叺吁吃各合吉吊吋同名后吏吐向君吝吟吠否吩含听吭吮吶吸吹吻吼吽吾呀呂呆呈呉告呎呑呟周呪呰呱味呵呶呷呻呼命咀咄咆咋和咎咏咐咒咢咤咥咨咫咬咯咲咳咸咼咽咾哀品哂哄哇哈哉哘員哢哥哦哨哩哭哮哲哺哽唄唆唇唏唐唔唖售唯唱唳唸唹唾啀啄啅商啌問啓啖啗啜啝啣啻啼啾喀喃善喇喉喊喋喘喙喚喜喝喞喟喧喨喩喪喫喬單喰営嗄嗅嗇嗔嗚嗜嗟嗣嗤嗷嗹嗽嗾嘆嘉嘔嘖嘗嘘嘛嘩嘯嘱嘲嘴嘶嘸噂噌噎噐噛噤器噪噫噬噴噸噺嚀嚆嚇嚊嚏嚔嚠嚢嚥嚮嚴嚶嚼囀囁囂囃囈囎囑囓囗囘囚四回因団囮困囲図囹固国囿圀圃圄圈圉國圍圏園圓圖團圜土圦圧在圭地圷圸圻址坂均坊坎坏坐坑坡坤坦坩坪坿垂垈垉型垓垠垢垣垤垪垰垳埀埃埆埋城埒埓埔埖埜域埠埣埴執培基埼堀堂堅堆堊堋堕堙堝堡堤堪堯堰報場堵堺堽塀塁塊塋塑塒塔塗塘塙塚塞塢塩填塰塲塵塹塾境墅墓増墜墟墨墫墮墳墸墹墺墻墾壁壅壇壊壌壑壓壕壗壘壙壜壞壟壤壥士壬壮壯声壱売壷壹壺壻壼壽夂変夊夏夐夕外夘夙多夛夜夢夥大天太夫夬夭央失夲夷夸夾奄奇奈奉奎奏奐契奔奕套奘奚奠奢奥奧奨奩奪奬奮女奴奸好妁如妃妄妊妍妓妖妙妛妝妣妥妨妬妲妹妻妾姆姉始姐姑姓委姙姚姜姥姦姨姪姫姶姻姿威娃娉娑娘娚娜娟娠娥娩娯娵娶娼婀婁婆婉婚婢婦婪婬婿媒媚媛媼媽媾嫁嫂嫉嫋嫌嫐嫖嫗嫡嫣嫦嫩嫺嫻嬉嬋嬌嬖嬢嬪嬬嬰嬲嬶嬾孀孃孅子孑孔孕字存孚孛孜孝孟季孤孥学孩孫孰孱孳孵學孺宀它宅宇守安宋完宍宏宕宗官宙定宛宜宝実客宣室宥宦宮宰害宴宵家宸容宿寂寃寄寅密寇寉富寐寒寓寔寛寝寞察寡寢寤寥實寧寨審寫寮寰寳寵寶寸寺対寿封専射尅将將專尉尊尋對導小少尓尖尚尠尢尤尨尭就尸尹尺尻尼尽尾尿局屁居屆屈届屋屍屎屏屐屑屓展属屠屡層履屬屮屯山屶屹岌岐岑岔岡岨岩岫岬岱岳岶岷岸岻岼岾峅峇峙峠峡峨峩峪峭峯峰島峺峻峽崇崋崎崑崔崕崖崗崘崙崚崛崟崢崩嵋嵌嵎嵐嵒嵜嵩嵬嵯嵳嵶嶂嶄嶇嶋嶌嶐嶝嶢嶬嶮嶷嶺嶼嶽巉巌巍巒巓巖巛川州巡巣工左巧巨巫差己已巳巴巵巷巻巽巾市布帆帋希帑帖帙帚帛帝帥師席帯帰帳帶帷常帽幀幃幄幅幇幌幎幔幕幗幟幡幢幣幤干平年幵并幸幹幺幻幼幽幾广庁広庄庇床序底庖店庚府庠度座庫庭庵庶康庸廁廂廃廈廉廊廏廐廓廖廚廛廝廟廠廡廢廣廨廩廬廰廱廳廴延廷廸建廻廼廾廿弁弃弄弉弊弋弌弍式弐弑弓弔引弖弗弘弛弟弥弦弧弩弭弯弱張強弸弼弾彁彈彊彌彎彑当彖彗彙彜彝彡形彦彩彪彫彬彭彰影彳彷役彼彿往征徂徃径待徇很徊律後徐徑徒従得徘徙從徠御徨復循徭微徳徴徹徼徽心必忌忍忖志忘忙応忝忠忤快忰忱念忸忻忽忿怎怏怐怒怕怖怙怛怜思怠怡急怦性怨怩怪怫怯怱怺恁恂恃恆恊恋恍恐恒恕恙恚恟恠恢恣恤恥恨恩恪恫恬恭息恰恵恷悁悃悄悉悋悌悍悒悔悖悗悚悛悟悠患悦悧悩悪悲悳悴悵悶悸悼悽情惆惇惑惓惘惚惜惟惠惡惣惧惨惰惱想惴惶惷惹惺惻愀愁愃愆愈愉愍愎意愕愚愛感愡愧愨愬愴愼愽愾愿慂慄慇慈慊態慌慍慎慓慕慘慙慚慝慟慢慣慥慧慨慫慮慯慰慱慳慴慵慶慷慾憂憇憊憎憐憑憔憖憙憚憤憧憩憫憬憮憲憶憺憾懃懆懇懈應懊懋懌懍懐懣懦懲懴懶懷懸懺懼懽懾懿戀戈戉戊戌戍戎成我戒戔或戚戛戝戞戟戡戦截戮戯戰戲戳戴戸戻房所扁扇扈扉手才扎打払托扛扞扠扣扨扮扱扶批扼找承技抂抃抄抉把抑抒抓抔投抖抗折抛抜択披抬抱抵抹抻押抽拂担拆拇拈拉拊拌拍拏拐拑拒拓拔拗拘拙招拜拝拠拡括拭拮拯拱拳拵拶拷拾拿持挂指挈按挌挑挙挟挧挨挫振挺挽挾挿捉捌捍捏捐捕捗捜捧捨捩捫据捲捶捷捺捻掀掃授掉掌掎掏排掖掘掛掟掠採探掣接控推掩措掫掬掲掴掵掻掾揀揃揄揆揉描提插揖揚換握揣揩揮援揶揺搆損搏搓搖搗搜搦搨搬搭搴搶携搾摂摎摘摧摩摯摶摸摺撃撈撒撓撕撚撞撤撥撩撫播撮撰撲撹撻撼擁擂擅擇操擒擔擘據擠擡擢擣擦擧擬擯擱擲擴擶擺擽擾攀攅攘攜攝攣攤攪攫攬支攴攵收攷攸改攻放政故效敍敏救敕敖敗敘教敝敞敢散敦敬数敲整敵敷數斂斃文斈斉斌斎斐斑斗料斛斜斟斡斤斥斧斫斬断斯新斷方於施旁旃旄旅旆旋旌族旒旗旙旛无旡既日旦旧旨早旬旭旱旺旻昂昃昆昇昊昌明昏易昔昜星映春昧昨昭是昴昵昶昼昿晁時晃晄晉晋晏晒晝晞晟晢晤晦晧晨晩普景晰晴晶智暁暃暄暇暈暉暎暑暖暗暘暝暢暦暫暮暴暸暹暼暾曁曄曇曉曖曙曚曜曝曠曦曩曰曲曳更曵曷書曹曼曽曾替最會月有朋服朏朔朕朖朗望朝朞期朦朧木未末本札朮朱朴朶朷朸机朽朿杁杆杉李杏材村杓杖杙杜杞束杠条杢杣杤来杪杭杯杰東杲杳杵杷杼松板枅枇枉枋枌析枕林枚果枝枠枡枢枦枩枯枳枴架枷枸枹柁柄柆柊柎柏某柑染柔柘柚柝柞柢柤柧柩柬柮柯柱柳柴柵査柾柿栂栃栄栓栖栗栞校栢栩株栫栲栴核根格栽桀桁桂桃框案桍桎桐桑桓桔桙桜桝桟档桧桴桶桷桾桿梁梃梅梍梏梓梔梗梛條梟梠梢梦梧梨梭梯械梱梳梵梶梹梺梼棄棆棉棊棋棍棒棔棕棗棘棚棟棠棡棣棧森棯棲棹棺椀椁椄椅椈椋椌植椎椏椒椙椚椛検椡椢椣椥椦椨椪椰椴椶椹椽椿楊楓楔楕楙楚楜楝楞楠楡楢楪楫業楮楯楳楴極楷楸楹楼楽楾榁概榊榎榑榔榕榛榜榠榧榮榱榲榴榻榾榿槁槃槇槊構槌槍槎槐槓様槙槝槞槧槨槫槭槲槹槻槽槿樂樅樊樋樌樒樓樔樗標樛樞樟模樢樣権横樫樮樵樶樸樹樺樽橄橇橈橋橘橙機橡橢橦橲橸橿檀檄檍檎檐檗檜檠檢檣檪檬檮檳檸檻櫁櫂櫃櫑櫓櫚櫛櫞櫟櫨櫪櫺櫻欄欅權欒欖欝欟欠次欣欧欲欷欸欹欺欽款歃歇歉歌歎歐歓歔歙歛歟歡止正此武歩歪歯歳歴歸歹死歿殀殃殄殆殉殊残殍殕殖殘殞殤殪殫殯殱殲殳殴段殷殺殻殼殿毀毅毆毋母毎毒毓比毘毛毟毫毬毯毳氈氏民氓气気氛氣氤水氷永氾汀汁求汎汐汕汗汚汝汞江池汢汨汪汰汲汳決汽汾沁沂沃沈沌沍沐沒沓沖沙沚沛没沢沫沮沱河沸油沺治沼沽沾沿況泄泅泉泊泌泓法泗泙泛泝泡波泣泥注泪泯泰泱泳洋洌洒洗洙洛洞洟津洩洪洫洲洳洵洶洸活洽派流浄浅浙浚浜浣浤浦浩浪浬浮浴海浸浹涅消涌涎涓涕涙涛涜涯液涵涸涼淀淅淆淇淋淌淑淒淕淘淙淞淡淤淦淨淪淫淬淮深淳淵混淹淺添清渇済渉渊渋渓渕渙渚減渝渟渠渡渣渤渥渦温渫測渭渮港游渺渾湃湊湍湎湖湘湛湟湧湫湮湯湲湶湾湿満溂溌溏源準溘溜溝溟溢溥溪溯溲溶溷溺溽滂滄滅滉滋滌滑滓滔滕滝滞滬滯滲滴滷滸滾滿漁漂漆漉漏漑漓演漕漠漢漣漫漬漱漲漸漾漿潁潅潔潘潛潜潟潤潦潭潮潯潰潴潸潺潼澀澁澂澄澆澎澑澗澡澣澤澪澱澳澹激濁濂濃濆濔濕濘濛濟濠濡濤濫濬濮濯濱濳濶濺濾瀁瀉瀋瀏瀑瀕瀘瀚瀛瀝瀞瀟瀦瀧瀬瀰瀲瀾灌灑灘灣火灯灰灸灼災炉炊炎炒炙炬炭炮炯炳炸点為烈烋烏烙烝烟烱烹烽焉焔焙焚焜無焦然焼煉煌煎煕煖煙煢煤煥煦照煩煬煮煽熄熈熊熏熔熕熙熟熨熬熱熹熾燃燈燉燎燐燒燔燕燗營燠燥燦燧燬燭燮燵燹燻燼燿爆爍爐爛爨爪爬爭爰爲爵父爺爻爼爽爾爿牀牆片版牋牌牒牘牙牛牝牟牡牢牧物牲牴特牽牾犀犁犂犇犒犖犠犢犧犬犯犲状犹狂狃狄狆狎狐狒狗狙狛狠狡狢狩独狭狷狸狹狼狽猊猖猗猛猜猝猟猥猩猪猫献猯猴猶猷猾猿獄獅獎獏獗獣獨獪獰獲獵獸獺獻玄率玉王玖玩玲玳玻珀珂珈珊珍珎珞珠珥珪班珮珱珸現球琅理琉琢琥琲琳琴琵琶琺琿瑁瑕瑙瑚瑛瑜瑞瑟瑠瑣瑤瑩瑪瑯瑰瑳瑶瑾璃璋璞璢璧環璽瓊瓏瓔瓜瓠瓢瓣瓦瓧瓩瓮瓰瓱瓲瓶瓷瓸甃甄甅甌甍甎甑甓甕甘甚甜甞生産甥甦用甫甬田由甲申男甸町画甼畄畆畉畊畋界畍畏畑畔留畚畛畜畝畠畢畤略畦畧畩番畫畭異畳畴當畷畸畿疂疆疇疉疊疋疎疏疑疔疚疝疣疥疫疱疲疳疵疸疹疼疽疾痂痃病症痊痍痒痔痕痘痙痛痞痢痣痩痰痲痳痴痺痼痾痿瘁瘉瘋瘍瘟瘠瘡瘢瘤瘧瘰瘴瘻療癆癇癈癌癒癖癘癜癡癢癧癨癩癪癬癰癲癶癸発登發白百皀皃的皆皇皈皋皎皐皓皖皙皚皮皰皴皷皸皹皺皿盂盃盆盈益盍盒盖盗盛盜盞盟盡監盤盥盧盪目盲直相盻盾省眄眇眈眉看県眛眞真眠眤眥眦眩眷眸眺眼着睇睚睛睡督睥睦睨睫睹睾睿瞋瞎瞑瞞瞠瞥瞬瞭瞰瞳瞶瞹瞻瞼瞽瞿矇矍矗矚矛矜矢矣知矧矩短矮矯石矼砂砌砒研砕砠砥砦砧砲破砺砿硅硝硫硬硯硲硴硼碁碆碇碌碍碎碑碓碕碗碚碣碧碩碪碯碵確碼碾磁磅磆磊磋磐磑磔磚磧磨磬磯磴磽礁礇礎礑礒礙礦礪礫礬示礼社祀祁祇祈祉祐祓祕祖祗祚祝神祟祠祢祥票祭祷祺祿禀禁禄禅禊禍禎福禝禦禧禪禮禰禳禹禺禽禾禿秀私秉秋科秒秕秘租秡秣秤秦秧秩秬称移稀稈程稍税稔稗稘稙稚稜稟稠種稱稲稷稻稼稽稾稿穀穂穃穆穉積穎穏穐穗穡穢穣穩穫穰穴究穹空穽穿突窃窄窈窒窓窕窖窗窘窟窩窪窮窯窰窶窺窿竃竄竅竇竈竊立竍竏竒竓竕站竚竜竝竟章竡竢竣童竦竪竭端竰競竸竹竺竿笂笄笆笈笊笋笏笑笘笙笛笞笠笥符笨第笳笵笶笹筅筆筈等筋筌筍筏筐筑筒答策筝筥筧筬筮筰筱筴筵筺箆箇箋箍箏箒箔箕算箘箙箚箜箝箟管箪箭箱箴箸節篁範篆篇築篋篌篏篝篠篤篥篦篩篭篳篶篷簀簇簍簑簒簓簔簗簟簡簣簧簪簫簷簸簽簾簿籀籃籌籍籏籐籔籖籘籟籠籤籥籬米籵籾粁粂粃粉粋粍粐粒粕粗粘粛粟粡粢粤粥粧粨粫粭粮粱粲粳粹粽精糀糂糅糊糎糒糖糘糜糞糟糠糢糧糯糲糴糶糸糺系糾紀紂約紅紆紊紋納紐純紕紗紘紙級紛紜素紡索紫紬紮累細紲紳紵紹紺紿終絃組絅絆絋経絎絏結絖絛絞絡絢絣給絨絮統絲絳絵絶絹絽綉綏經継続綛綜綟綢綣綫綬維綮綯綰綱網綴綵綸綺綻綽綾綿緇緊緋総緑緒緕緘線緜緝緞締緡緤編緩緬緯緲練緻縁縄縅縉縊縋縒縛縞縟縡縢縣縦縫縮縱縲縵縷縹縺縻總績繁繃繆繊繋繍織繕繖繙繚繝繞繦繧繩繪繭繰繹繻繼繽繿纂纃纈纉續纎纏纐纒纓纔纖纛纜缶缸缺罅罌罍罎罐网罔罕罘罟罠罧罨罩罪罫置罰署罵罷罸罹羂羃羅羆羇羈羊羌美羔羚羝羞羣群羨義羮羯羲羶羸羹羽翁翅翆翊翌習翔翕翠翡翦翩翫翰翳翹翻翼耀老考耄者耆耋而耐耒耕耗耘耙耜耡耨耳耶耻耽耿聆聊聒聖聘聚聞聟聡聢聨聯聰聲聳聴聶職聹聽聾聿肄肅肆肇肉肋肌肓肖肘肚肛肝股肢肥肩肪肬肭肯肱育肴肺胃胄胆背胎胖胙胚胛胝胞胡胤胥胯胱胴胸胼能脂脅脆脇脈脉脊脚脛脣脩脯脱脳脹脾腆腋腎腐腑腓腔腕腟腥腦腫腮腰腱腴腸腹腺腿膀膂膃膈膊膏膓膕膚膜膝膠膣膤膨膩膰膳膵膸膺膽膾膿臀臂臆臈臉臍臑臓臘臙臚臟臠臣臥臧臨自臭至致臺臻臼臾舁舂舅與興舉舊舌舍舎舐舒舖舗舘舛舜舞舟舩航舫般舮舳舵舶舷舸船艀艇艘艙艚艝艟艢艤艦艨艪艫艮良艱色艶艷艸艾芋芍芒芙芝芟芥芦芫芬芭芯花芳芸芹芻芽苅苑苒苓苔苗苙苛苜苞苟苡苣若苦苧苫英苳苴苹苺苻茂范茄茅茆茉茎茖茗茘茜茣茨茫茯茱茲茴茵茶茸茹荀荅草荊荏荐荒荘荳荵荷荻荼莅莇莉莊莎莓莖莚莞莟莠莢莨莪莫莱莵莽菁菅菊菌菎菓菖菘菜菟菠菩菫華菰菱菲菴菷菻菽萃萄萇萋萌萍萎萓萠萢萩萪萬萱萵萸萼落葆葉葎著葛葡葢董葦葩葫葬葭葮葯葱葵葷葹葺蒂蒄蒋蒐蒔蒙蒜蒟蒡蒭蒲蒸蒹蒻蒼蒿蓁蓄蓆蓉蓊蓋蓍蓐蓑蓖蓙蓚蓬蓮蓴蓼蓿蔀蔆蔑蔓蔔蔕蔗蔘蔚蔟蔡蔦蔬蔭蔵蔽蕀蕁蕃蕈蕉蕊蕋蕎蕕蕗蕘蕚蕣蕨蕩蕪蕭蕷蕾薀薄薇薈薊薐薑薔薗薙薛薜薤薦薨薩薪薫薬薮薯薹薺藁藉藍藏藐藕藜藝藤藥藩藪藷藹藺藻藾蘂蘆蘇蘊蘋蘓蘖蘗蘚蘢蘭蘯蘰蘿虍虎虐虔處虚虜虞號虧虫虱虹虻蚊蚋蚌蚓蚕蚣蚤蚩蚪蚫蚯蚰蚶蛄蛆蛇蛉蛋蛍蛎蛔蛙蛛蛞蛟蛤蛩蛬蛭蛮蛯蛸蛹蛻蛾蜀蜂蜃蜆蜈蜉蜊蜍蜑蜒蜘蜚蜜蜥蜩蜴蜷蜻蜿蝉蝋蝌蝎蝓蝕蝗蝙蝟蝠蝣蝦蝨蝪蝮蝴蝶蝸蝿螂融螟螢螫螯螳螺螻螽蟀蟄蟆蟇蟋蟐蟒蟠蟯蟲蟶蟷蟹蟻蟾蠅蠍蠎蠏蠑蠕蠖蠡蠢蠣蠧蠱蠶蠹蠻血衂衄衆行衍衒術街衙衛衝衞衡衢衣表衫衰衲衵衷衽衾衿袁袂袈袋袍袒袖袗袙袞袢袤被袮袰袱袴袵袷袿裁裂裃裄装裏裔裕裘裙補裝裟裡裨裲裳裴裸裹裼製裾褂褄複褊褌褐褒褓褝褞褥褪褫褶褸褻襁襃襄襌襍襖襞襟襠襤襦襪襭襯襲襴襷襾西要覃覆覇覈覊見規覓視覗覘覚覡覦覧覩親覬覯覲観覺覽覿觀角觚觜觝解触觧觴觸言訂訃計訊訌討訐訓訖託記訛訝訟訣訥訪設許訳訴訶診註証詁詆詈詐詑詒詔評詛詞詠詢詣試詩詫詬詭詮詰話該詳詼誂誄誅誇誉誌認誑誓誕誘誚語誠誡誣誤誥誦誨説読誰課誹誼調諂諄談請諌諍諏諒論諚諛諜諞諠諡諢諤諦諧諫諭諮諱諳諷諸諺諾謀謁謂謄謇謌謎謐謔謖謗謙謚講謝謠謡謦謨謫謬謳謹謾譁證譌譎譏譖識譚譛譜譟警譫譬譯議譱譲譴護譽讀讃變讌讎讐讒讓讖讙讚谷谺谿豁豆豈豊豌豎豐豕豚象豢豪豫豬豸豹豺豼貂貅貉貊貌貍貎貔貘貝貞負財貢貧貨販貪貫責貭貮貯貰貲貳貴貶買貸費貼貽貿賀賁賂賃賄資賈賊賍賎賑賓賚賛賜賞賠賢賣賤賦質賭賺賻購賽贄贅贇贈贊贋贍贏贐贓贔贖赤赦赧赫赭走赱赳赴起趁超越趙趣趨足趺趾跂跋跌跏跖跚跛距跟跡跣跨跪跫路跳践跼跿踈踉踊踏踐踝踞踟踪踰踴踵蹂蹄蹇蹈蹉蹊蹌蹐蹕蹙蹟蹠蹣蹤蹲蹴蹶蹼躁躄躅躇躊躋躍躑躓躔躙躡躪身躬躯躰躱躾軅軆軈車軋軌軍軒軛軟転軣軫軸軻軼軽軾較輅載輊輌輒輓輔輕輙輛輜輝輟輦輩輪輯輳輸輹輻輾輿轂轄轅轆轉轌轍轎轗轜轟轡轢轣轤辛辜辞辟辣辧辨辭辮辯辰辱農辷辺辻込辿迂迄迅迎近返迚迢迥迦迩迪迫迭迯述迴迷迸迹迺追退送逃逅逆逋逍逎透逐逑逓途逕逖逗這通逝逞速造逡逢連逧逮週進逵逶逸逹逼逾遁遂遅遇遉遊運遍過遏遐遑遒道達違遖遘遙遜遞遠遡遣遥遨適遭遮遯遲遵遶遷選遺遼遽避邀邁邂邃還邇邉邊邏邑那邦邨邪邯邱邵邸郁郊郎郛郡郢郤部郭郵郷都鄂鄒鄙鄭鄰鄲酉酊酋酌配酎酒酔酖酘酢酣酥酩酪酬酲酳酵酷酸醂醇醉醋醍醐醒醗醜醢醤醪醫醯醴醵醸醺釀釁釆采釈釉釋里重野量釐金釖釘釛釜針釟釡釣釦釧釵釶釼釿鈍鈎鈑鈔鈕鈞鈩鈬鈴鈷鈿鉄鉅鉈鉉鉋鉐鉗鉚鉛鉞鉢鉤鉦鉱鉾銀銃銅銑銓銕銖銘銚銛銜銭銷銹鋏鋒鋤鋩鋪鋭鋲鋳鋸鋺鋼錆錏錐錘錙錚錠錢錣錦錨錫錬錮錯録錵錺錻鍄鍋鍍鍔鍖鍛鍜鍠鍬鍮鍵鍼鍾鎌鎔鎖鎗鎚鎧鎬鎭鎮鎰鎹鏃鏈鏐鏑鏖鏗鏘鏝鏡鏤鏥鏨鐃鐇鐐鐓鐔鐘鐙鐚鐡鐫鐵鐶鐸鐺鑁鑄鑑鑒鑓鑚鑛鑞鑠鑢鑪鑰鑵鑷鑼鑽鑾鑿钁長門閂閃閇閉閊開閏閑間閔閖閘閙閠関閣閤閥閧閨閭閲閹閻閼閾闃闇闊闌闍闔闕闖闘關闡闢闥阜阡阨阪阮阯防阻阿陀陂附陋陌降陏限陛陜陝陞陟院陣除陥陦陪陬陰陲陳陵陶陷陸険陽隅隆隈隊隋隍階随隔隕隗隘隙際障隠隣隧隨險隰隱隲隴隶隷隸隹隻隼雀雁雄雅集雇雉雋雌雍雎雑雕雖雙雛雜離難雨雪雫雰雲零雷雹電需霄霆震霈霊霍霎霏霑霓霖霙霜霞霤霧霪霰露霸霹霽霾靂靄靆靈靉青靖静靜非靠靡面靤靦靨革靫靭靱靴靹靺靼鞁鞄鞅鞆鞋鞍鞏鞐鞘鞜鞠鞣鞦鞨鞫鞭鞳鞴韃韆韈韋韓韜韭韮韲音韵韶韻響頁頂頃項順須頌頏預頑頒頓頗領頚頡頤頬頭頴頷頸頻頼頽顆顋題額顎顏顔顕願顛類顧顫顯顰顱顳顴風颪颯颱颶飃飄飆飛飜食飢飩飫飭飮飯飲飴飼飽飾餃餅餉養餌餐餒餓餔餘餝餞餠餡餤館餬餮餽餾饂饅饉饋饌饐饑饒饕饗首馗馘香馥馨馬馭馮馳馴馼駁駄駅駆駈駐駑駒駕駘駛駝駟駢駭駮駱駲駸駻駿騁騅騎騏騒験騙騨騫騰騷騾驀驂驃驅驍驕驗驚驛驟驢驤驥驩驪驫骨骭骰骸骼髀髄髏髑髓體高髞髟髢髣髦髪髫髭髮髯髱髴髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬱鬲鬻鬼魁魂魃魄魅魍魎魏魑魔魘魚魯魴鮃鮎鮑鮒鮓鮖鮗鮟鮠鮨鮪鮫鮭鮮鮴鮹鯀鯆鯉鯊鯏鯑鯒鯔鯖鯛鯡鯢鯣鯤鯨鯰鯱鯲鯵鰄鰆鰈鰉鰊鰌鰍鰐鰒鰓鰔鰕鰛鰡鰤鰥鰭鰮鰯鰰鰲鰹鰺鰻鰾鱆鱇鱈鱒鱗鱚鱠鱧鱶鱸鳥鳧鳩鳫鳬鳰鳳鳴鳶鴃鴆鴇鴈鴉鴎鴒鴕鴛鴟鴣鴦鴨鴪鴫鴬鴻鴾鴿鵁鵄鵆鵈鵐鵑鵙鵜鵝鵞鵠鵡鵤鵬鵯鵲鵺鶇鶉鶏鶚鶤鶩鶫鶯鶲鶴鶸鶺鶻鷁鷂鷄鷆鷏鷓鷙鷦鷭鷯鷲鷸鷹鷺鷽鸚鸛鸞鹵鹸鹹鹽鹿麁麈麋麌麑麒麓麕麗麝麟麥麦麩麪麭麸麹麺麻麼麾麿黄黌黍黎黏黐黒黔默黙黛黜黝點黠黥黨黯黴黶黷黹黻黼黽鼇鼈鼎鼓鼕鼠鼡鼬鼻鼾齊齋齎齏齒齔齟齠齡齢齣齦齧齪齬齲齶齷龍龕龜龝龠!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ ]^_`abcdefghijklmnopqrstuvwxyz{|}~'’\"「」々。"; +} \ No newline at end of file diff --git a/intra/source/helper/ANEFix.hx b/intra/source/helper/ANEFix.hx new file mode 100644 index 0000000..8516d16 --- /dev/null +++ b/intra/source/helper/ANEFix.hx @@ -0,0 +1,160 @@ +package helper +{ +import flash.desktop.NativeProcess; +import flash.desktop.NativeProcessStartupInfo; +import flash.events.IOErrorEvent; +import flash.events.NativeProcessExitEvent; +import flash.events.ProgressEvent; +import flash.external.ExtensionContext; +import flash.filesystem.File; +import flash.filesystem.FileMode; +import flash.filesystem.FileStream; +/** + * ... + * @author Melos Han-Tani + */ +class ANEFix +{ + private static var + callback_error:Function=null, + callback_ioerror:Function=null, + callback_output:Function=null; + +/** @param extensionID:String id of the ane extension to fix + * @param onExit:Function callback function with first arguments the value of extensionID and for the second the boolean state of the fix operation + **/ +public static function fixANE(extensionID:String, onExit:Function=null,is_steam:Bool=false):Bool { + + if(!NativeProcess.isSupported){ + if(onExit !=null){ + trace("Nope! 30"); + onExit(extensionID, false); + } + trace("Nope! 33"); + return false; + } + // init event listners + if(callback_output==null) + callback_output= + function(event:ProgressEvent):Void { + var process:NativeProcess=event.target as NativeProcess; + trace("OUT -", process.standardOutput.readUTFBytes(process.standardError.bytesAvailable)); + }; + if(callback_error==null) + callback_error= + function(event:ProgressEvent):Void { + var process:NativeProcess=event.target as NativeProcess; + trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); + }; + if(callback_ioerror==null) + callback_ioerror= + function(event:IOErrorEvent):Void { + trace(event.toString()); + }; + + var ext_dir:File; + try { + ext_dir=ExtensionContext.getExtensionDirectory(extensionID); + } catch(e:Dynamic){ + if(onExit !=null){ + trace("Nope! 59"); + onExit(extensionID, false); + } + trace("Nope! 63"); + return false; + } + if(!ext_dir.isDirectory){ + if(onExit !=null){ + trace("Nope! 64"); + onExit(extensionID, false); + } + trace("Nope! 71"); + return false; + } + + var ane_dir:File=ext_dir.resolvePath("META-INF/ANE/"); + var ext_stream:FileStream=new FileStream(); + ext_stream.open(ane_dir.resolvePath("extension.xml"), FileMode.READ); + var ext_xml:XML=XML(ext_stream.readUTFBytes(ext_stream.bytesAvailable)); + ext_stream.close(); + + var defaultNS:Namespace=ext_xml.namespace(""); + var framework:String=ext_xml.defaultNS::platforms.defaultNS::platform.(@name=="MacOS-x86").defaultNS::applicationDeployment.defaultNS::nativeLibrary.text(); + if(!framework){ + if(onExit !=null){ + trace("Nope! 80"); + onExit(extensionID, false); + } + trace("Nope! 85"); + return false; + } + + var framework_dir:File=ane_dir.resolvePath('MacOS-x86/'+framework); + // list of symlink files + var symlink:Array=new Array(3, true); + symlink[0]='Resources'; + symlink[1]=framework_dir.name.substr(0, framework_dir.name.length-framework_dir.extension.length-1); + symlink[2]='Versions/Current'; + var fileToFix:Int=symlink.length, + fileFixed:Int=0, + fileFailed:Int=0; + symlink.every( + function(item:String, index:Int, a:Array):Bool { + var f:File=framework_dir.resolvePath(item); + if(!f.isSymbolicLink){ + var fs:FileStream=new FileStream(); + fs.open(f, FileMode.READ); + var lnk:String=fs.readUTFBytes(fs.bytesAvailable); + fs.close(); + var nativeProcessStartupInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo(); + nativeProcessStartupInfo.executable=new File('/bin/ln'); + nativeProcessStartupInfo.workingDirectory=f.parent; + nativeProcessStartupInfo.arguments=new Array(3, true); + nativeProcessStartupInfo.arguments[0]="-Fs"; + nativeProcessStartupInfo.arguments[1]=lnk; + nativeProcessStartupInfo.arguments[2]=f.name; + + + var process:NativeProcess=new NativeProcess(); + process.start(nativeProcessStartupInfo); + //process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, callback_output); + process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, callback_error); + process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, callback_ioerror); + process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, callback_ioerror); + process.addEventListener( + NativeProcessExitEvent.EXIT, + function(event:NativeProcessExitEvent):Void { + if(event.exitCode==0) + fileFixed++; + else + fileFailed++ + + if(fileFixed+fileFailed==fileToFix){ + if(fileFailed==0){ + trace('ANE '+extensionID+' fixed.'); + } else { + trace('Unable to fix ANE ' + extensionID + '!'); + } + if(onExit !=null){ + trace("Nope! 133"); + onExit(extensionID, fileFailed==0); + } + } + } + ); + } else { + trace("A file fixed.? 146"); + fileFixed++; + } + return true; + } + ); + if(fileFixed==3){ + if(onExit !=null){ + onExit(extensionID, true); + } + } + trace("Exiting:150"); + return true; + } +} \ No newline at end of file diff --git a/intra/source/helper/Achievements.hx b/intra/source/helper/Achievements.hx new file mode 100644 index 0000000..1579bd5 --- /dev/null +++ b/intra/source/helper/Achievements.hx @@ -0,0 +1,253 @@ +package helper +{ +import com.amanitadesign.steam.FRESteamWorks; +import com.amanitadesign.steam.SteamConstants; +import com.amanitadesign.steam.SteamEvent; +import flash.desktop.NativeApplication; +import flash.utils.ByteArray; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGame; +class Achievements +{ + + private static var IS_NEWGROUNDS:Bool=false; + public static var IS_KONG:Bool=false; + public static var KONG_LOADED:Bool=false; + public static var IS_STEAM:Bool=true; + + public static inline var Card_1:Int=0; + public static inline var Card_7:Int=1; + public static inline var Extra_health_1:Int=2; + public static inline var Fast_fields:Int=3; + public static inline var No_damage_sunguy:Int=4; + public static inline var Trophy_1:Int=5; + public static inline var Greenlit:Int=6; + public static inline var Website:Int=7; + + public static inline var A_GET_BROOM:Int=8; + public static inline var A_GET_WINDMILL_CARD:Int=9; + public static inline var A_DEFEAT_BRIAR:Int=10; + + public static inline var A_100_PERCENT_ANY_TIME:Int=11; + public static inline var A_200_PERCENT:Int=12; + public static inline var A_GET_RED_CUBE:Int=13; + public static inline var A_GET_GREEN_CUBE:Int=14; + public static inline var A_GET_BLUE_CUBE:Int=15; + public static inline var A_GET_BW_CUBES:Int=16; + public static inline var A_CONSOLE:Int=17; + public static inline var A_GET_GOLDEN_POO:Int=18; + public static inline var A_GET_48_CARDS:Int=19; + public static inline var A_GET_49TH_CARD:Int=20; + + public static inline var A_ENDING_SUB_15_M:Int=21; + public static inline var A_100_PERCENT_SUB_3_HR:Int=22; + + public static inline var achvname:Dynamic={ 8:"broom", 9:"windmill", 10:"briar", + 11:"100" , 12:"200" , 13:"red", 14:"green", 15:"blue", 16:"bw", + 17:"console", 18:"poo", 19:"48", 20:"49", 21:"fast", 22:"100fast"}; + + public static var Steamworks:FRESteamWorks; + + private static var did_init:Bool=false; + public static var DEBUG_TEXT:String=""; + + public static function init(root:Dynamic):Void { + if(did_init)return; + did_init=true; + + } + + public static function kong_loaded():Void { + KONG_LOADED=true; + } + + public static function init_steam():Void { + DEBUG_TEXT +="In Init Steam\n"; + if(IS_STEAM && Steamworks==null){ + if(Intra.IS_LINUX){ + //return; + } + DEBUG_TEXT +="LOADING STEAM\n"; + Steamworks=new FRESteamWorks(); + Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse); + if(Steamworks.init()){ + if(Steamworks.isReady){ + if(false==Intra.IS_LINUX){ + Steamworks.setCloudEnabledForApp(true); + } + DEBUG_TEXT +="STEAM LOADED\n"; + } + //DEBUG_TEXT=DEBUG_TEXT + "atest:" + Steamworks.setAchievement("ACH_WIN_ONE_GAME").toString()+ "\n"; + //Steamworks.clearAchievement("ACH_WIN_ONE_GAME"); + //Steamworks.setStatFloat('FeetTraveled', 42.42); + //Steamworks.storeStats(); + //DEBUG_TEXT=DEBUG_TEXT + Steamworks.getStatFloat('FeetTraveled').toString()+ "\n"; + // + + } else { + DEBUG_TEXT +="FAILED\n"; + } + } + } + + public static function get_completion_rate():Int { + + // 36 Cards(+2)=72 + // 10 health ups(+1)=10 + // 4 broom upgrades(+4)=16 + // Jump shoes(+2)=2 + + // 12 Cards + // 13 weird items - all + 5 + + var rate:Int=0; + + for(i in 0...48){ + if(Registry.card_states[i]==1){ + if(i<36){ + rate +=2; + } else { + rate +=4; + } + } + } + + rate +=(Registry.MAX_HEALTH - 6); + + if(Registry.inventory[Registry.IDX_BROOM])rate +=4; + if(Registry.inventory[Registry.IDX_WIDEN])rate +=4; + if(Registry.inventory[Registry.IDX_LENGTHEN])rate +=4; + if(Registry.inventory[Registry.IDX_TRANSFORMER])rate +=4; + + if(Registry.inventory[Registry.IDX_JUMP])rate +=2; + + for(i=11;i<=Registry.IDX_WHITE;i++){ + if(Registry.inventory[i]){ + rate +=4; + } + } + + Achievements.DEBUG_TEXT +=rate.toString()+ "\n"; + return rate; + } + + public static function set_steam_achievements():Void { + if(IS_STEAM && Steamworks !=null && Steamworks.isReady){ + trace("Steam achievement state:", Registry.achivement_state); + for(i in 8...23){ + if(Registry.achivement_state[i]){ + Steamworks.setAchievement(achvname[i]); + } + } + } + } + + public static function writeFileToCloud(fileName:String, data:Dynamic):Bool { + var dataOut:ByteArray=new ByteArray(); + dataOut.writeObject(data); + return Steamworks.fileWrite(fileName, dataOut); + } + + public static function readFileFromCloud(fileName:String):Dynamic { + var dataIn:ByteArray=new ByteArray(); + var dataOut:Dynamic=new Dynamic(); + dataIn.position=0; + dataIn.length=Steamworks.getFileSize(fileName); + DEBUG_TEXT +=dataIn.length.toString(); + + if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){ + return dataIn.readObject(); + } + return null; + } + + + public static function is_100_percent():Bool { + if(Registry.MAX_HEALTH>=16 && Registry.inventory[Registry.IDX_TRANSFORMER] && Registry.inventory[Registry.IDX_WIDEN] && Registry.inventory[Registry.IDX_LENGTHEN] && Registry.nr_growths>=37){ + Achievements.unlock(Achievements.A_100_PERCENT_ANY_TIME); + if(Registry.playtime<3 * 60 * 60){ + Achievements.unlock(Achievements.A_100_PERCENT_SUB_3_HR); + } + return true; + } + return false; + } + + public static function is_200_percent():Bool { + var a:Array=Registry.inventory; + if(is_100_percent()&& Registry.nr_growths>=49 && a[Registry.IDX_BLUE] && a[Registry.IDX_GREEN] && a[Registry.IDX_RED] && a[Registry.IDX_BLACK] && a[Registry.IDX_WHITE] && a[Registry.IDX_KITTY] && a[Registry.IDX_POO] && a[Registry.IDX_AUS_HEART] && a[Registry.IDX_ELECTRIC] && a[Registry.IDX_MARINA] && a[Registry.IDX_MELOS] && a[Registry.IDX_MISSINGNO] && a[Registry.IDX_SPAM]){ + Achievements.unlock(Achievements.A_200_PERCENT); + return true; + } + return false; + } + + public static function onSteamResponse(e:SteamEvent):Void { + //Achievements.DEBUG_TEXT=DEBUG_TEXT + "STEAMresponse type:" + e.req_type + " response:" + e.response + "\n"; + switch(e.req_type){ + case SteamConstants.RESPONSE_OnUserStatsStored: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsStored:" + e.response + "\n"; + break; + case SteamConstants.RESPONSE_OnUserStatsReceived: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsReceived:" + e.response + "\n"; + break; + case SteamConstants.RESPONSE_OnAchievementStored: + //DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnAchievementStored:" + e.response + "\n"; + break; + case 3: + //case SteamConstants.RESPONSE_OnGameOverlayActivated: + //FlxGame.HARD_PAUSED=!FlxGame.HARD_PAUSED;// This is probably not the right hting to do. + break; + default: + } + } + + + + public static function unlock_all():Void { + for(i in 8...23){ + unlock(i); + } + } + public static function unlock(id:Int):Void { + if(!IS_STEAM && false==Intra.is_web)return; + + if(IS_STEAM){ + trace("Achievement:", id, achvname[id]); + + + if(Steamworks !=null && Steamworks.isReady){ + switch(id){ + case A_GET_BROOM://** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_GET_WINDMILL_CARD://** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_100_PERCENT_ANY_TIME:// ** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_100_PERCENT_SUB_3_HR:// ** + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + case A_GET_48_CARDS:// + Registry.achivement_state[id]=true; + Steamworks.setAchievement(achvname[id]); + break; + } + } + } + + + + } + +} \ No newline at end of file diff --git a/intra/source/helper/Cutscene.hx b/intra/source/helper/Cutscene.hx new file mode 100644 index 0000000..8849ac1 --- /dev/null +++ b/intra/source/helper/Cutscene.hx @@ -0,0 +1,467 @@ +package helper +{ +import data.Common_Sprites; +import data.CSV_Data; +import data.TileData; +import entity.decoration.Solid_Sprite; +import entity.interactive.Dungeon_Statue; +import entity.interactive.Terminal_Gate; +import flash.geom.Point; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxTileblock; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import states.PushableFlxState; +class Cutscene extends PushableFlxState +{ + /* Cutscene types */ + public static inline var Red_Cave_Left:Int=0; + public static inline var Red_Cave_Right:Int=1; + public static inline var Red_Cave_North:Int=2; + public static inline var Terminal_Gate_Bedroom:Int=3; + public static inline var Terminal_Gate_Redcave:Int=4; + public static inline var Terminal_Gate_Crowd:Int=5; + public static inline var Windmill_Opening:Int=6; + + // pointers to functions for transitioning in and out of the cutscene + private var transition_in:Function; + private var transition_out:Function; + private var step_cutscene:Function; + + // parameters you set that will be used in the above functions + private var tran_in_args:Array=new Array(1, 2); + private var tran_out_args:Array=new Array(3, 4); + + public static inline var s_transition_in:Int=-1; + public static inline var s_in_progress:Int=0; + public static inline var s_transition_out:Int=2; + public static inline var s_done:Int=3; + public var state:Int=-1; + + public var timer:Float; + public var timer_max:Float; + public var pushdown:Int=0; + public var pushee:FlxSprite; + + public var entity_1:FlxSprite; + public var entity_2:FlxSprite; + public var entity_3:FlxSprite; + + private var ctr_cutscene:Int=0; + + private var _parent:Dynamic; + + + public var scene_1:FlxTilemap; + public var scene_2:FlxTilemap; + public var scene_3:FlxTilemap; + + public var fade:FlxSprite; + + public function new(v_parent:Dynamic){ + _parent=v_parent; + create(); + } + + + /* Initialize the entities with each cutscene */ + override public function create():Void + { + transition_in=do_nothing; + transition_out=do_nothing; + switch(Registry.CURRENT_CUTSCENE){ + case Red_Cave_Left: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_left(); + //Load the sprites and store 'em + //Pick a section of map to load from the right map and load it + break; + case Red_Cave_North: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_north(); + break; + case Red_Cave_Right: + transition_in=red_in; + transition_out=red_out; + step_cutscene=step_red_cave; + timer=timer_max=0.02; + inst_red_cave_right(); + break; + case Terminal_Gate_Bedroom: + case Terminal_Gate_Crowd: + case Terminal_Gate_Redcave: + transition_in=terminal_gate_in; + transition_out=terminal_gate_out; + step_cutscene=step_terminal_gate; + inst_terminal_gate(); + + break; + case Windmill_Opening: + transition_in=windmill_in; + transition_out=windmill_out; + step_cutscene=step_windmill_opening; + inst_windmill(); + break; + } + } + + override public function update():Void + { + if(state==s_transition_in){ + transition_in.apply(null, tran_in_args); + } else if(state==s_in_progress){ + step_cutscene(); + } else if(state==s_transition_out){ + transition_out.apply(null, tran_out_args); + } else if(state==s_done){ + + } + super.update(); + } + + public function do_nothing():Void { + + } + + private function windmill_in(a:Int, b:Int):Void { + state=s_in_progress; + } + private function windmill_out(a:Int, b:Int):Void { + state=s_done; + } + private function step_windmill_opening():Void { + + switch(ctr_cutscene){ + case 0: + Registry.volume_scale -=0.01; + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + if(Registry.volume_scale<=0){ + Registry.volume_scale=0; + Registry.sound_data.wb_tap_ground.play(); + ctr_cutscene +=2; + } else { + Registry.volume_scale=0; + } + break; + case 1: + break; + case 2: + ctr_cutscene++; + fade.exists=true; + fade.alpha=0; + break; + case 3: + fade.alpha +=0.01; + if(fade.alpha==1){ + ctr_cutscene++; + entity_1.exists=scene_1.exists=true; + } + break; + case 4:// Move bedroom satue + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_1, "y", 20, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 5: + fade.alpha +=0.01; + if(fade.alpha==1){ + entity_1.exists=scene_1.exists=false; + entity_2.exists=scene_2.exists=true; + ctr_cutscene++; + } + break; + case 6:// move red stat + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_2, "x", 4 * 16 + 32, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 7: + fade.alpha +=0.01; + if(fade.alpha==1){ + entity_2.exists=scene_2.exists=false; + entity_3.exists=scene_3.exists=true; + ctr_cutscene++; + } + break; + case 8:// move blue stat + fade.alpha -=0.01; + if(fade.alpha<=0.45 && fade.alpha>0.43){ + Registry.sound_data.red_cave_rise.play(); + } + if(fade.alpha==0){ + if(EventScripts.send_property_to(entity_3, "x", 4 * 16 + 32, 0.2)){ + Registry.sound_data.wb_hit_ground.play(); + FlxG.shake(0.05, 0.5); + ctr_cutscene++; + } + } + break; + case 9: + fade.alpha +=0.01; + if(fade.alpha==1){ + ctr_cutscene++; + entity_3.exists=scene_3.exists=false; + } + break; + case 10: + fade.alpha -=0.01; + if(Registry.volume_scale<1){ + Registry.volume_scale +=0.01; + } else { + Registry.volume_scale=1; + } + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + if(fade.alpha==0 && Registry.volume_scale==1){ + state=s_transition_out; + Registry.sound_data.start_song_from_title("WINDMILL"); + } + break; + + } + } + + private function red_out(a:Int, b:Int):Void { + state=s_done; + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Red_Cave_Left: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Left]=1;break; + case Cutscene.Red_Cave_Right: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_Right]=1;break; + case Cutscene.Red_Cave_North: + Registry.CUTSCENES_PLAYED[Cutscene.Red_Cave_North]=1;break; + } + } + + private function red_in(a:Int, b:Int):Void { + state=s_in_progress; + Registry.sound_data.red_cave_rise.play(); + } + + private function step_red_cave():Void { + //perform the rise effect. + if(ctr_cutscene==0){ + timer -=FlxG.elapsed; + if(timer<0){ + pushdown--; + pushee.framePixels_y_push=pushdown; + + timer=timer_max; + FlxG.shake(0.05); + if(pushdown==0){ + ctr_cutscene=1; + timer=1.5; + } + } + } else if(ctr_cutscene==1){ + timer -=FlxG.elapsed; + if(timer<0){ + ctr_cutscene++; + } + } else { + state=s_transition_out; + } + } + + + private function terminal_gate_out(a:Int, b:Int):Void { + state=s_done; + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Terminal_Gate_Bedroom: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Bedroom]=1; + break; + case Cutscene.Terminal_Gate_Redcave: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Redcave]=1; + break; + case Cutscene.Terminal_Gate_Crowd: + Registry.CUTSCENES_PLAYED[Cutscene.Terminal_Gate_Crowd]=1; + break; + } + } + + private function terminal_gate_in(a:Int, b:Int):Void { + state=s_in_progress; + + } + + private function step_terminal_gate():Void { + var tg:Terminal_Gate=cast(entity_1, Terminal_Gate); + switch(Registry.CURRENT_CUTSCENE){ + case Cutscene.Terminal_Gate_Bedroom: + tg.gate_bedroom.alpha -=0.005; + if(tg.gate_bedroom.alpha==0){ + state=s_transition_out; + } + break; + case Cutscene.Terminal_Gate_Redcave: + tg.gate_redcave.alpha -=0.005; + if(tg.gate_redcave.alpha==0){ + state=s_transition_out; + } + break; + case Cutscene.Terminal_Gate_Crowd: + tg.gate_crowd.alpha -=0.005; + if(tg.gate_crowd.alpha==0){ + state=s_transition_out; + } + break; + + } + } + /** + * loads a cutscenes view + * @param map_name The name of the map + * @param tileset the reference to the embedded tileste + * @param gx the top left grid coordinate of the view. + * @param gy see gx + * @param w width of the view in tiles + * @param h height ... + * @param off_gx grid offset for the view to start. + * @param off_gy see off_gx + * @return the requested tilemap for viewin'. + */ + public function load_cutscene_view(map_name:String, tileset:Class, gx:Int,gy:Int, w:Int=10,h:Int=10,off_gx:Int=0,off_gy:Int=0):FlxTilemap { + var CSV:String=CSV_Data.getMap(map_name); + var tilemap:FlxTilemap=new FlxTilemap(); + tilemap.loadMap(CSV, tileset, 16, 16); + var submap_data:Array=new Array(); + for(var i:Int=0;i; +import flash.utils.ByteArray; +import flash.utils.describeType; +import global.Registry; +import org.flixel.FlxObject; +import org.flixel.FlxSprite; +import states.DialogueState; + +/** + * Dialogue Helper(DH) + * Contains helper functions to query the Dialogue state object + */ + +class DH +{ + // A copy of the raw dialogue state. Used for updating + // Dialogue state in patches + public static var RAW_DIALOGUE_STATE:Dynamic; + + public static inline var name_card:String="card"; + public static inline var name_arthur:String="arthur"; + public static inline var name_briar:String="briar"; + public static inline var name_javiera:String="javiera"; + public static inline var name_mitra:String="mitra"; + public static inline var name_sage:String="sage"; + public static inline var name_statue:String="statue"; + public static inline var name_test:String="test"; + public static inline var name_sun_guy:String="sun_guy"; + public static inline var name_rock:String="rock"; + public static inline var name_sadbro:String="sadbro"; + public static inline var name_dungeon_statue:String="dungeon_statue"; + public static inline var name_splitboss:String="splitboss"; + public static inline var name_wallboss:String="wallboss"; + public static inline var name_eyeboss:String="eyeboss"; + public static inline var name_redboss:String="redboss"; + public static inline var name_circus_folks:String="circus_folks"; + public static inline var name_suburb_walker:String="suburb_walker"; + public static inline var name_suburb_blocker:String="suburb_blocker"; + public static inline var name_cube_king:String="cube_king"; + public static inline var name_cliff_dog:String="cliff_dog"; + public static inline var name_generic_npc:String="generic_npc"; + public static inline var name_forest_npc:String="forest_npc"; + public static inline var name_geoms:String="geoms"; + public static inline var name_miao:String="miao"; + public static inline var name_shopkeeper:String="shopkeeper"; + public static inline var name_goldman:String="goldman"; + public static inline var name_happy_npc:String="happy_npc"; + + // For card popups, treasure dialogs + public static var area_etc:String="ETC"; + + + + public static var scene_arthur_circus_alone:String="alone"; + + public static var scene_briar_go_before_fight:String="before_fight"; + public static var scene_briar_go_after_fight:String="after_fight"; + + + public static var scene_card_one:String="one"; + + public static var scene_cliff_dog_top_left:String="top_left"; + + public static var scene_dungeon_statue_bedroom_one:String="one"; + public static var scene_dungeon_statue_bedroom_two:String="two"; + + public static var scene_forest_npc_bunny:String="bunny"; + public static var scene_forest_npc_thorax:String="thorax"; + + public static var scene_snowman_one:String="one"; + + public static var scene_goldman_etc:String="etc"; + public static var scene_goldman_inside:String="inside"; + public static var scene_goldman_outside:String="outside"; + + public static var scene_generic_npc_any_quest_normal:String="quest_normal"; + public static var scene_generic_npc_any_second:String="second"; + public static var scene_generic_npc_any_first:String="first"; + public static var scene_generic_npc_any_quest_event:String="quest_event"; + public static var scene_generic_npc_any_easter_egg:String="easter_egg"; + public static var scene_rank_bush:String="bush"; + + public static var scene_happy_npc_beautiful:String="beautiful"; + public static var scene_happy_npc_drink:String="drink"; + public static var scene_happy_npc_hot:String="hot"; + public static var scene_happy_npc_dump:String="dump"; + public static var scene_happy_npc_gold:String="gold"; + public static var scene_happy_npc_briar:String="briar"; + + public static var scene_javiera_circus_alone:String="alone"; + + public static var scene_miao_init:String="init"; + public static var scene_miao_randoms:String="randoms"; + public static var scene_miao_philosophy:String="philosophy"; + + public static var scene_mitra_overworld_initial_overworld:String="initial_overworld"; + public static var scene_mitra_blue_one:String="one"; + public static var scene_mitra_fields_init:String="init"; + public static var scene_mitra_fields_game_hints:String="game_hints"; + public static var scene_mitra_fields_card_hints:String="card_hints"; + public static var scene_mitra_fields_general_banter:String="general_banter"; + public static var scene_mitra_fields_quest_event:String="quest_event"; + + public static var scene_rock_one:String="one"; + public static var scene_rock_two:String="two"; + public static var scene_rock_three:String="three"; + public static var scene_rock_four:String="four"; + public static var scene_rock_five:String="five"; + public static var scene_rock_six:String="six"; + + public static var scene_shopkeeper_init:String="init"; + + public static var scene_suburb_walker_words_adult:String="words_adult"; + public static var scene_suburb_walker_words_teen:String="words_teen"; + public static var scene_suburb_walker_words_kid:String="words_kid"; + public static var scene_suburb_walker_family:String="family"; + public static var scene_suburb_walker_hanged:String="hanged"; + public static var scene_suburb_walker_festive:String="festive"; + public static var scene_suburb_walker_paranoid:String="paranoid"; + public static var scene_suburb_walker_dead:String="dead"; + public static var scene_suburb_walker_older_kid:String="older_kid"; + + public static inline var scene_suburb_blocker_one:String="one"; + + public static var scene_sadbro_overworld_initial_forced:String="initial_forced"; + public static var scene_sadbro_overworld_bedroom_done:String="bedroom_done"; + public static var scene_sadbro_overworld_bedroom_not_done:String="bedroom_not_done"; + + public static var scene_sage_blank_intro:String="intro"; + public static var scene_sage_nexus_enter_nexus:String="enter_nexus"; + public static var scene_sage_nexus_after_ent_str:String="after_ent_str"; + public static var scene_sage_nexus_after_bed:String="after_bed"; + public static var scene_sage_nexus_before_windmill:String="before_windmill"; + public static var scene_sage_nexus_after_windmill:String="after_windmill"; + public static var scene_sage_nexus_all_card_first:String="all_card_first"; + public static var scene_sage_overworld_bedroom_entrance:String="bedroom_entrance"; + public static var scene_sage_bedroom_after_boss:String="after_boss"; + public static var scene_sage_redcave_one:String="one"; + public static var scene_sage_crowd_one:String="one"; + public static var scene_sage_terminal_before_fight:String="before_fight"; + public static var scene_sage_terminal_after_fight:String="after_fight"; + public static var scene_sage_terminal_entrance:String="entrance"; + public static var scene_sage_terminal_etc:String="etc"; + public static var scene_sage_happy_posthappy_sage:String="posthappy_sage"; + public static var scene_sage_happy_posthappy_mitra:String="posthappy_mitra"; + + public static var scene_splitboss_before_fight:String="before_fight"; + public static var scene_splitboss_after_fight:String="after_fight"; + + public static var scene_redboss_before_fight:String="before_fight"; + public static var scene_redboss_after_fight:String="after_fight"; + + public static var scene_eyeboss_before_fight:String="before_fight"; + public static var scene_eyeboss_after_fight:String="after_fight"; + + public static var scene_wallboss_before_fight:String="before_fight"; + public static var scene_wallboss_after_fight:String="after_fight"; + + public static var scene_circus_folks_before_fight:String="before_fight"; + public static var scene_circus_folks_after_fight:String="after_fight"; + + public static var scene_sun_guy_before_fight:String="before_fight"; + public static var scene_sun_guy_after_fight:String="after_fight"; + + public static var scene_statue_nexus_enter_nexus:String="enter_nexus"; + public static var scene_statue_bedroom_after_boss:String="after_boss"; + public static var scene_statue_overworld_bedroom_entrance:String="bedroom_entrance"; + + public static var scene_cube_king_space_color:String="color"; + public static var scene_cube_king_space_gray:String="gray"; + + public static var scene_geoms_space_color:String="color"; + public static var scene_geoms_space_gray:String="gray"; + + + public static var scene_test_debug_scene_1:String="scene_1"; + + private static var property_resettable:String="does_reset"; + + private static var scenes_to_reset_on_map_change:Array=new Array(); + private static var current_active_scene:Dynamic; + private static var current_active_dialogue:Array; + /** + * Whether or not a chunk of dialogue has finished playing. Reset whenever + * a new chunk is fetched. + */ + private static var recently_finished_chunk:Bool=false; + private static var chunk_is_playing:Bool=false; + private static var most_recently_played_chunk_pos:Int; + + + /** + * Start a dialogue popup given the parameters. Increments the chosen scene's pos parameter, + * or loops it to its loop point. Marks this scene as dirty(i.e., "read at least once"). + * @param name The name of the npc. Use constants in DH.as when you can - DH.name_sage, etc. + * @param scene The name of the scene. Use constants in DH.as when you can - DH.scene_sage_blank_intro, etc. + * @param area What map this occurs in. Defaults to current player's map. + * @param pos which dialogue to show. If -1, reads the next one and increments the position state. Otherwise returns the requested chunk + * @param has_alternate Whether this NPC has altenrate text based on state from helper.S_NPC.as + * @return true on success(read a dialogue chunk), crash the game otherwise + */ + public static function start_dialogue(name:String, scene:String, _area:String="", pos:Int=-1,has_alternate:Bool=false):Bool { + if(true==a_chunk_is_playing()||(Registry.GAMESTATE !=null && Registry.GAMESTATE.dialogue_latency>0)){ + return false; + } + recently_finished_chunk=false; + + // Maybe get an alternate text. + if(has_alternate==true){ + // S_NPC.something... + } + // Grab the area of the dialogue to take place + var area:String=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + + // Grab the scene associated with this area + var cur_scene_state:Dynamic=Registry.DIALOGUE_STATE[name][area][scene]; + var cur_scene_dialogue:Array=Registry.DIALOGUE[name][area][scene].dialogue; + cur_scene_state.dirty=true; + + // Make the box at top or bottom + if(cur_scene_state.hasOwnProperty("top")){ + DialogueState.set_dialogue_box_align(FlxObject.UP); + } else { + DialogueState.set_dialogue_box_align(FlxObject.DOWN); + } + + + // Grab the dialogue chunk, if we hit the end, loop, otherwise increment position counter + if(pos==-1){ + most_recently_played_chunk_pos=cur_scene_state.pos; + Registry.cur_dialogue=cur_scene_dialogue[cur_scene_state.pos]; + if(cur_scene_state.pos==cur_scene_dialogue.length - 1){ + cur_scene_state.pos=cur_scene_state.loop; + } else { + cur_scene_state.pos++; + } + } else { + most_recently_played_chunk_pos=pos; + Registry.cur_dialogue=cur_scene_dialogue[pos]; + } + + + + // If resettable, add its reference to list of references to reset dialogue position on map change + if(Registry.DIALOGUE_STATE[name].hasOwnProperty(property_resettable)&& Registry.DIALOGUE_STATE[name][property_resettable]){ + scenes_to_reset_on_map_change.push(cur_scene_state); + } + + + if(Registry.GAMESTATE !=null){ + Registry.GAMESTATE.load_dialogue=true; + } + current_active_scene=cur_scene_state; + current_active_dialogue=cur_scene_dialogue; + chunk_is_playing=true; + return true; + } + + public static function dialogue_popup_misc_any(scene:String, pos:Int):Void { + dialogue_popup(DH.lookup_string("misc", "any", scene, pos)); + } + /** + * Make a dialogue popup with 'words'. + * @param words + */ + public static function dialogue_popup(words:String):Void { + Registry.cur_dialogue=words; + Registry.GAMESTATE.load_dialogue=true; + + } + /** + * Get the dialogue position in a given scene. + * @param name + * @param scene + * @param _area + * @return an Integer>=0 denoting the position, or -1 if not found + */ + public static function get_scene_position(name:String, scene:String, _area:String=""):Int { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].pos; + } + + /** + * Check if the scene had any dialogue started at any point in time. Useful if you don't want to add in + * another boolean to wherever the dialogue is being played from, and the call originally sits in a block + * that is iterated over. + * @param name + * @param scene + * @param _area + * @return + */ + public static function scene_is_dirty(name:String, scene:String, _area:String=""):Bool { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].dirty; + } + + /** + * Check if the scene has finished completely. Useful for say, boss Intro dialogue which blocks scripting of an Intro sequence + * @param name + * @param scene + * @param _area + * @return + */ + public static function scene_is_finished(name:String, scene:String, _area:String=""):Bool { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + return Registry.DIALOGUE_STATE[name][_area][scene].finished; + } + + /** + * Updates current scene to be "finished" if all dialogue is played from that scene. + * Also sets "recently_finished_chunk" to true, and "chunk_is_playing" to false; + */ + public static function update_current_scene_on_chunk_finish():Void { + if(current_active_scene==null)return; + if(most_recently_played_chunk_pos==current_active_dialogue.length - 1){ + current_active_scene.finished=true; + } + current_active_dialogue=null; + current_active_scene=null; + recently_finished_chunk=true; + chunk_is_playing=false; + } + + public static function get_scene_length(name:String, scene:String, _area:String=""):Int { + _area=(_area=="")? Registry.CURRENT_MAP_NAME:_area; + + return Registry.DIALOGUE[name][_area][scene].dialogue.length; + } + /** + * Called when transitioning out of a Roam or Playstate. + */ + public static function reset_scenes_on_map_change():Void { + while(scenes_to_reset_on_map_change.length>0){ + var scene:Dynamic=scenes_to_reset_on_map_change.pop(); + scene.pos=0; + } + } + + public static function a_chunk_just_finished():Bool { + if(recently_finished_chunk){ + recently_finished_chunk=false; + return true; + } + return false; + } + public static function dont_need_recently_finished():Void { + recently_finished_chunk=false; + } + + public static function a_chunk_is_playing():Bool { + return chunk_is_playing; + } + + /** + * Fill Registry.DIALOGUE with all the game's dialogue, make a copy of the initial dialogue state + * Into Registry.DIALOGUE_STATE + */ + public static function init_dialogue_state(only_change_dialogue:Bool=false):Void { + + Registry.DIALOGUE={ }; + var varList:XMLList=null; + if(language_type==LANG_ja){ + + varList=describeType(NPC_Data_JP).variable; + } else if(language_type==LANG_ko){ + varList=describeType(NPC_Data_KR).variable; + } else if(language_type==LANG_es){ + varList=describeType(NPC_Data_ES).variable; + } else if(language_type==LANG_it){ + varList=describeType(NPC_Data_IT).variable; + } else if(language_type==LANG_pt){ + varList=describeType(NPC_Data_PT).variable; + } else if(language_type==LANG_zhs){ + varList=describeType(NPC_Data_ZHS).variable; + } else { + varList=describeType(NPC_Data_EN).variable; + } + var d:Dynamic={ }; + for(i in 0..varList.length()){ + if(varList[i].name.toXMLString().indexOf("_state")==-1){ + if(language_type==LANG_ja){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_JP[varList[i].name]; + } else if(language_type==LANG_ko){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_KR[varList[i].name]; + } else if(language_type==LANG_es){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_ES[varList[i].name]; + } else if(language_type==LANG_it){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_IT[varList[i].name]; + } else if(language_type==LANG_pt){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_PT[varList[i].name]; + } else if(language_type==LANG_zhs){ + Registry.DIALOGUE[varList[i].name]=NPC_Data_ZHS[varList[i].name]; + } else { + Registry.DIALOGUE[varList[i].name]=NPC_Data_EN[varList[i].name]; + } + } else { // Add the bob npc object state, with all of its areas and scenes + if(language_type==LANG_ja){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_JP[varList[i].name]; + } else if(language_type==LANG_ko){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_KR[varList[i].name]; + } else if(language_type==LANG_pt){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_PT[varList[i].name]; + } else if(language_type==LANG_es){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_ES[varList[i].name]; + } else if(language_type==LANG_it){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_IT[varList[i].name]; + } else if(language_type==LANG_zhs){ + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_ZHS[varList[i].name]; + } else { + d[varList[i].name.toXMLString().split("_state")[0]]=NPC_Data_EN[varList[i].name]; + } + } + } + + if(false==only_change_dialogue){ + var myBA:ByteArray=new ByteArray(); + myBA.writeObject(d); + myBA.position=0; + // dialogue state doesnt hold any "dialogue" just state + Registry.DIALOGUE_STATE=myBA.readObject(); + myBA.position=0; + RAW_DIALOGUE_STATE=myBA.readObject(); + } + + } + + public static function isZH():Bool { + if(language_type==LANG_zhs)return true; + return false; + } + + public static var language_type:String="en"; + public static inline var LANG_en:String="en"; + public static inline var LANG_ja:String="ja"; + public static inline var LANG_ko:String="ko"; + public static inline var LANG_es:String="es"; + public static inline var LANG_pt:String="pt"; + public static inline var LANG_zhs:String="zh-CN"; + public static inline var LANG_it:String="it"; + public static function set_language(lang_string:String):Void { + if(lang_string==LANG_ja){ + trace("Japanese Language set."); + DialogueState.Max_Line_Size=18; + language_type=LANG_ja; + } else if(lang_string==LANG_ko){ + trace("Korean language set."); + DialogueState.Max_Line_Size=18; + language_type=LANG_ko; + } else if(lang_string==LANG_es){ + trace("Spanish language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_es; + } else if(lang_string==LANG_it){ + trace("Italian language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_it; + } else if(lang_string==LANG_pt){ + trace("pt-br language set."); + DialogueState.Max_Line_Size=24; + language_type=LANG_pt; + } else if(lang_string==LANG_zhs || lang_string=="zh" || lang_string=="zh-TW"){ + trace("zh-CN langage set."); + DialogueState.Max_Line_Size=13; + language_type=LANG_zhs; + } else { + trace("English Language set."); + language_type=LANG_en; + DialogueState.Max_Line_Size=21; + } + // When called a 2nd time in game or after loading or whatever + if(Registry.PLAYSTATE !=null && Registry.PLAYSTATE.dialogue_state !=null){ + Registry.PLAYSTATE.dialogue_state.create_bitmap_text(); + } + + // Change the pointer to the new object but don't update the state. + init_dialogue_state(true); + + // Update these strings after re-initializing dialogue state + if(Registry.PLAYSTATE !=null && Registry.PLAYSTATE.pause_state !=null){ + Registry.PLAYSTATE.pause_state.set_pausemenu_labels(); + } + + } + // Patches the save file's dialogue state + // with the raw dialogue state. + // Useful if we add an NPC or somethin' . + public static function patch_dialogue_state():Void { + var debug:Bool=false; + var npc_ctr:Int=0; + var area_ctr:Int=0; + var scene_ctr:Int=0; + if(debug)trace("Patching dialogue state."); + + for(npc in RAW_DIALOGUE_STATE){ + npc_ctr++; + // If the save file already has this NPC then we need to check its areas + if(Registry.DIALOGUE_STATE.hasOwnProperty(npc)){ + // Check the NPC's areas. + for(area in RAW_DIALOGUE_STATE[npc]){ + area_ctr++; + if(area=="does_reset")continue; + // Check its scenes. + if(Registry.DIALOGUE_STATE[npc].hasOwnProperty(area)){ + for(scene in RAW_DIALOGUE_STATE[npc][area]){ + scene_ctr++; + // If this scene exists, just update its loop property + if(Registry.DIALOGUE_STATE[npc][area].hasOwnProperty(scene)){ + Registry.DIALOGUE_STATE[npc][area][scene]["loop"]=RAW_DIALOGUE_STATE[npc][area][scene]["loop"] ; + if(RAW_DIALOGUE_STATE[npc][area][scene].hasOwnProperty("top")){ + Registry.DIALOGUE_STATE[npc][area][scene]["top"]=true; + } + } else { + if(debug)trace("New scene:" + scene + " , " + area + " , " + npc); + Registry.DIALOGUE_STATE[npc][area][scene]=RAW_DIALOGUE_STATE[npc][area][scene]; + } + } + } else { + if(debug)trace("New Area:" + area+" , "+npc); + Registry.DIALOGUE_STATE[npc][area]=RAW_DIALOGUE_STATE[npc][area]; + } + } + // Otherwise just add it in! + } else { + if(debug)trace("New NPC:" + npc); + Registry.DIALOGUE_STATE[npc]=RAW_DIALOGUE_STATE[npc]; + } + } + + if(debug)trace("And now for # of things we had to check..."); + if(debug)trace("NPCs:" + npc_ctr.toString()+ " Areas:" + area_ctr.toString()+ " scenes:" + scene_ctr.toString()); + } + + /** + * Increments an Integer property on this ENTIRE NPC by one + * Creates the property if it doesn't exist, inits to 1. + * @return 1 if property exists, 0 otherswise + */ + public static function increment_property(name:String,property:String):Int { + if(!Registry.DIALOGUE_STATE[name].hasOwnProperty(property)){ + Registry.DIALOGUE_STATE[name][property]=1; + + } else { + Registry.DIALOGUE_STATE[name][property]++; + return 1; + } + return 0; + } + + /** + * Get an Integer property of the NPC ENTIRE NPC + * @param name + * @param property + * @return + */ + public static function get_int_property(name:String, property:String):Int { + if(Registry.DIALOGUE_STATE[name].hasOwnProperty(property)){ + return Registry.DIALOGUE_STATE[name][property]; + } + return -1; + + } + + public static function enable_menu():Void { + Registry.disable_menu=false; + } + public static function disable_menu():Void { + Registry.disable_menu=true; + } + + /** + * Specify what chunk of dialogue to play next, by the "pos" var + * @param pos + * @return the new position in this scene, or -1 if current scene null + */ + + public static function set_scene_to_pos(name:String,scene:String,pos:Int):Int { + if(Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene]==null)return -1; + + Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene].pos=pos; + return pos; + } + + /** + * Set pos to the last chunk of dialogue. + * @param pos + * @return the new position in this scene, or or -1 if current scene null + */ + public static function set_scene_to_end(name:String,scene:String):Int { + if(Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene]==null)return -1; + + var new_pos:Int=Registry.DIALOGUE[name][Registry.CURRENT_MAP_NAME][scene].dialogue.length - 1; + Registry.DIALOGUE_STATE[name][Registry.CURRENT_MAP_NAME][scene].pos=new_pos; + return new_pos; + } + + /** + * Macro:"Normal Condition" Does the conditional checks for entering a dialogue, covers 95% of cases + * @param p - player reference + * @param ar - active region of the sprites talking to + * @return whether to talk or not + */ + public static function nc(player:Player, active_region:FlxObject):Bool { + if(player.overlaps(active_region)&& DH.a_chunk_is_playing()==false && player.state==player.S_GROUND && Registry.keywatch.JP_ACTION_1){ + player.be_idle(); + return true; + } + return false; + } + + public static function lookup_string(name:String, map:String, scene:String, pos:Int):String { + var retval:String=Registry.DIALOGUE[name][map][scene].dialogue[pos]; + return retval; + } + + public static function lk(scene:String, pos:Int):String { + var retval:String=Registry.DIALOGUE["misc"]["any"][scene].dialogue[pos]; + return retval; + } +} diff --git a/intra/source/helper/EventScripts.hx b/intra/source/helper/EventScripts.hx new file mode 100644 index 0000000..084f402 --- /dev/null +++ b/intra/source/helper/EventScripts.hx @@ -0,0 +1,567 @@ +package helper +{ +/** + * ... + * @author seagaia + + + */ +import data.CLASS_ID; +import data.Common_Sprites; +import entity.enemy.etc.Briar_Boss; +import entity.player.HealthPickup; +import flash.geom.Point; +import global.Registry; +import mx.core.FlexSprite; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import org.flixel.FlxTilemap; +import org.flixel.FlxU; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import org.flixel.system.FlxTile; +import states.DialogueState; +import states.PlayState; +class EventScripts extends FlxSprite +{ + + //[Embed(source="../res/sprites/enemies/enemy_explode_2.png")] public static var small_explosion_sprite:Class; + + public var xml:XML; + public var cid:Int=CLASS_ID.EVENT_SCRIPT; + public function new(){ + super(0, 0); + makeGraphic(1, 1, 0x00ffffff); + xml=; + } + public static function move_to_x_and_stop(o:FlxSprite, vel:Float, x:Float):Void { + if(vel>0 && o.x>x){ + o.velocity.x=0; + } else if(vel<0 && o.x=x)return true; + } + return false; + } + public static function check_x_zero(...args):Bool { + var next:FlxSprite; + var ret:Bool=true; + for(i in 0...args.length){ + next=args[i]; + if(next.velocity.x !=0){ + ret=false; + break; + } + } + return ret; + } + + /** + * Decreases or increases the given FlxSprite's alpha at rate to a target value. + * -rate for decrease, +rate for increase. + * @return true if the alpha reached the target value, false otherwise + */ + + + public static function send_alpha_to(o:FlxSprite, target:Float, rate:Float):Bool { + if(rate>0){ + if(o.alpha>=target)return true; + o.alpha=Math.min(1, o.alpha + rate); + } else { + if(o.alpha<=target)return true; + o.alpha=Math.max(0, o.alpha + rate); + } + return false; + } + + public static function send_property_to(o:Dynamic, property:String, target:Float, rate:Float):Bool { + if(rate<0)rate *=-1; + + if(o[property]>target){ + o[property]=Math.max(target, o[property] - rate); + } else if(o[property](1 - chance)){ + if(Registry.is_playstate){ + Registry.GAMESTATE.otherObjects.push(hp);//So we remove these on screen transition + Registry.GAMESTATE.bg_sprites.add(hp);//So these are immediately drawn + } else { + Registry.GAMESTATE.entities.push(hp); + Registry.GAMESTATE.add(hp); + } + } + } + + public static function drop_big_health(x:Int,y:Int,chance:Float):Void { + var hp:HealthPickup=new HealthPickup(x, y, HealthPickup.HP_3, Registry.GAMESTATE); + if(Math.random()>(1 - chance)){ + if(Registry.is_playstate){ + Registry.GAMESTATE.otherObjects.push(hp); + Registry.GAMESTATE.bg_sprites.add(hp); + } else { + Registry.GAMESTATE.entities.push(hp); + } + } + } + + /** + * Create an explosion sprite and add it to the current draw group. + * @param enemy The enemy that's exploding - used for deciding the explosion + */ + /* Images for explosions are embedded at the top of EventScripts.as */ + /* Sounds are managed in SoundData.as */ + public static function make_explosion_and_sound(enemy:FlxSprite,ignore:Int=0,this_parameter:Int=0):Void { + var class_name:String=FlxU.getClassName(enemy, true); + var explosion:FlxSprite=new FlxSprite(enemy.x, enemy.y); + + /* Make the explosion */ + + /* Later, load the explosion and sound based on the class name. */ + switch(class_name){ // e.g., "Dog", "Lion", "Contort" + case "Velociraptor X3000": + // load the graphic, add animation, offset the explosion, play a sound + break; + default:// Executed when there is no case statement for the enemy + + if(ignore==1){ + explosion.loadGraphic(Briar_Boss.embed_dust_explosion, true, false, 48, 48); + explosion.addAnimation("explode", [0, 1, 2, 3, 4, 5], 12, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + } else if(ignore==2){ + explosion.loadGraphic(Briar_Boss.embed_ice_explosion, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3,4], 15, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + } else if(ignore==3){ + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + explosion.x +=enemy.width * Math.random(); + explosion.y +=enemy.height * Math.random(); + + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [5,6,7,8,9], 10, false); + explosion.x -=4; + explosion.y -=4; + + } else { + explosion.loadGraphic(small_explosion_sprite, true, false, 24, 24); + explosion.addAnimation("explode", [0, 1, 2, 3, 4], 12, false); + explosion.x -=4; + explosion.y -=4; + } + + + Registry.sound_data.play_sound_group(Registry.sound_data.enemy_explode_1_group); + break; + } + + if(ignore>0){ + Registry.GAMESTATE.fg_sprites.add(explosion); + } else { + Registry.GAMESTATE.bg_sprites.add(explosion); + } + explosion.play("explode"); + + + /* Play sound */ + + } + public static function boss_drop_health_up(x:Int, y:Int):Void { + trace("Boss dropping health up"); + var hp:HealthPickup=new HealthPickup(x, y, HealthPickup.HP_EXTEND,Registry.GAMESTATE); + hp.xml=fake_xml("HealthPickup", x.toString(), y.toString(), HealthPickup.HP_EXTEND.toString(), "true", "2"); + Registry.GAMESTATE.stateful_gridXML.appendChild(hp.xml); + Registry.GAMESTATE.bg_sprites.add(hp); + } + + /** + * Create a fake xml to be used for some sprite that wasnte + * exported with dame + * @param name name of the node + * @param x x value + * @param y y value + * @param type_attr value of "type" if relevant + * @return the new xml objet + */ + public static function fake_xml(name:String,x:String,y:String,type_attr:String="",alive:String="true",p:String="0",frame:String="0"):XML { + var xml:XML=; + trace(xml.toXMLString()); + xml.setName(name); + xml.@p=p; + xml.@["x"]=x; + xml.@y=y; + xml.@frame=frame; + xml.@alive=alive; + xml.@type=type_attr; + trace(xml.toXMLString()); + + return xml; + + } + + + /** + * Rotates ROTATEE about PIVOT's top-left pt with offset(off_x,off_y), + * at some velocity(per game tick), at a radius of...radius! + * + * ROTATEE NEEDS A rotate_angle PROPERTY. + */ + public static function rotate_about_center_of_sprite(pivot:FlxSprite,rotatee:Dynamic,radius:Float,velocity:Float,off_x:Int=-8,off_y:Int=-5):Void { + var pivot_x:Float=pivot.x + pivot.width / 2; + var pivot_y:Float=pivot.y + pivot.height / 2; + + + rotatee.x=Math.cos(rotatee.rotate_angle)*(radius)+ pivot_x + off_x; + rotatee.y=Math.sin(rotatee.rotate_angle)*(radius)+ pivot_y + off_y; + rotatee.rotate_angle=(rotatee.rotate_angle + velocity)% 6.28; + } + + /** + * Gives the angle swept from the x axis to((x1,y1),(x2,y2))by treating x1,y1 as the origin + * */ + + public static function get_angle(x1:Float, y1:Float, x2:Float, y2:Float):Float { + + var x:Float=x2 - x1; + var y:Float=y2 - y1; + return Math.atan2(y, x); + } + + + /** + * Set "out" to be a vector in the direction of to - from, + * with magnitude new_mag. + * @param from + * @param to + * @param out + * @param new_mag + * @return + */ + public static function scale_vector(from:Dynamic, to:Dynamic, out:Dynamic, new_mag:Float):FlxPoint { + + var dx:Float=to.x - from.x; + var dy:Float=to.y - from.y; + var mag:Float=Math.sqrt(dx * dx + dy * dy); + var scale:Float=new_mag / mag; + out.x=scale * dx; + out.y=scale * dy; + return out; + } + + /** + * Return the distance between two points. + * Input is any objects with an x and y property. + */ + public static function distance(a:Dynamic, b:Dynamic):Float { + var dx:Float=a.x - b.x; + var dy:Float=a.y - b.y; + return Math.sqrt(dx * dx + dy * dy); + } + + public static function prevent_leaving_map(playstate:PlayState,o:FlxSprite):Void { + if(o.yplaystate.lowerBorder)o.y=playstate.lowerBorder - o.height; + if(o.x + o.width>playstate.rightBorder)o.x=playstate.rightBorder - o.width; + if(o.xx_max){ + o.velocity.x *=-1;res |=1; + } + } + + if(o.velocity.y<0){ + if(o.yy_max){ + o.velocity.y *=-1;res |=2; + } + } + return res; + } + + /** + * Lookup the tile at(x,y)of map, and then check its properties according to submap. + * @param x + * @param y + * @param map + * @param submap + * @return + */ + public static function get_tile_collision_flags(x:Int, y:Int, map:FlxTilemap,submap:FlxTilemap):Int { + var tile_type:Int=map.getTile(x / 16,(y - Registry.HEADER_HEIGHT)/ 16); + + if(submap._tileObjects[tile_type]==null)return NONE; + + return submap._tileObjects[tile_type].allowCollisions; + } + + /** + * Get the direction from entity 1's position(e1x,e1y)to entity + * 2's position(e2x,e2y), using the rotated quadrants method. + * + * @param e1x + * @param e1y + * @param e2x + * @param e2y + * @return The FlxObject constant showing where the 2nd entity is relative to entity 1 + */ + public static function get_entity_to_entity_dir(e1x:Int, e1y:Int, e2x:Int, e2y:Int):Int { + + var dx:Int=e2x - e1x; + var dy:Int=e2y - e1y; + + if(dx>0){ + if(Math.abs(dy)0)? DOWN:UP); + } + + /** + * Makes e1's facing flag set towards e2. Also then plays the associated directional + * animation - prefix+"_"+{d,u,r,l} + */ + public static function face_and_play(e1:Dynamic, e2:Dynamic, prefix:String="idle"):String { + e1.facing=get_entity_to_entity_dir(e1.x, e1.y, e2.x, e2.y); + switch(e1.facing){ + case UP: + e1.play(prefix + "_u"); + break; + case DOWN: + e1.play(prefix + "_d"); + break; + case LEFT: + e1.play(prefix + "_l"); + break; + case RIGHT: + e1.play(prefix + "_r"); + break; + } + return(e1._curAnim==null)? "":e1._curAnim.name; + } + + public static function play_based_on_facing(e1:Dynamic,prefix:String="idle"):String { + switch(e1.facing){ + case UP: + e1.play(prefix + "_u"); + break; + case DOWN: + e1.play(prefix + "_d"); + break; + case LEFT: + e1.play(prefix + "_l"); + break; + case RIGHT: + e1.play(prefix + "_r"); + break; + } + return(e1._curAnim==null)? "":e1._curAnim.name; + } + + /** + * Checks if e1 and e2's facing flags are directional opposites. + * @param e1 + * @param e2 + * @return True or False. + */ + public static function are_facing_opposite(e1:Dynamic, e2:Dynamic):Bool { + if(e1.facing==UP && e2.facing==DOWN)return true; + if(e2.facing==UP && e1.facing==DOWN)return true; + if(e1.facing==LEFT && e2.facing==RIGHT)return true; + if(e2.facing==LEFT && e1.facing==RIGHT)return true; + + return false; + + } + + /** + * Create a shadow specified by name, and adds the animations get_big and get_small, + * and also makes it invisible. You still need to add it to the parent. + * @param name:8_small + * @return the shadow + */ + public static function make_shadow(name:String,visible:Bool=false,fps:Int=8):FlxSprite { + var shadow:FlxSprite=new FlxSprite; + + switch(name){ + case "8_small": + default: + shadow.loadGraphic(Common_Sprites.shadow_sprite_8_8, true, false, 8, 8); + shadow.addAnimation("get_big", [0, 1, 2, 3], fps, false); + shadow.addAnimation("get_small", [3, 2, 1, 0], fps, false); + shadow.play("get_big"); + shadow.visible=visible; + + break; + } + + return shadow; + + } + + /** + * Called by create()in PlayState and roamstate, this returns a reference to the loaded + * autosave icon. Gives it an animation, to boot. + * @param autosave_icon + * @param autosave_icon_embed + * @return + */ + public static function init_autosave_icon(autosave_icon:FlxSprite, autosave_icon_embed:Class):FlxSprite { + + autosave_icon=new FlxSprite(160 - 80 - 32, 20);//(160 - 2 - 64, 20 + 160 - 2 - 64); + autosave_icon.loadGraphic(autosave_icon_embed, true, false, 64, 16); + autosave_icon.visible=false; + autosave_icon.addAnimation("a", [0, 1, 2, 3, 4, 5], 8, true); + autosave_icon.play("a"); + autosave_icon.scrollFactor.x=autosave_icon.scrollFactor.y=0; + return autosave_icon; + } + + /** + * Gets the tile's collision flags at(x,y)(default screenspace coords) + * @param x + * @param y + * @param map + * @param screen_coords + * @return + */ + public static function get_tile_allow_collisions(x:Int, y:Int, map:FlxTilemap, screen_coords:Bool=true):Int { + + if(screen_coords){ + var _x:Int=(x % 160)/ 16;//FCK IT + var _y:Int=((y - 20)% 160)/ 16; + var tile_idx:Int=map.getTileByIndex(_y * 10 + _x); + var tile:FlxTile=map._tileObjects[tile_idx]; + return tile.allowCollisions; + } + return NONE; + } + + public static function get_tile_nr(x:Int, y:Int, map:FlxTilemap):Int { + var _x:Int=(x % 160)/ 16;//FCK IT + var _y:Int=((y - 20)% 160)/ 16; + var tile_idx:Int=map.getTileByIndex(_y * 10 + _x); + return tile_idx; + } + + public static function fade_and_switch(name:String):Void { + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG=name; + Registry.E_FADED=false; + } + + /** + * Increments timer until it reaches timer_max, then sets timer to 0. + * @param timer + * @param timer_max + * @return false if timerref[timer_max]){ + ref[timer]=0; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/intra/source/helper/Joypad_Config_Group.hx b/intra/source/helper/Joypad_Config_Group.hx new file mode 100644 index 0000000..846ea17 --- /dev/null +++ b/intra/source/helper/Joypad_Config_Group.hx @@ -0,0 +1,294 @@ +package helper +{ +import global.Keys; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import states.PauseState; + +/** + * ... + * @author Melos Han-Tani + */ +class Joypad_Config_Group extends FlxGroup +{ + + public var controls:FlxBitmapFont=EventScripts.init_bitmap_font("JOYPAD CONFIG", "left", 5, 20, null, "apple_white"); + public var instructions:FlxBitmapFont=EventScripts.init_bitmap_font("h", "left", 5, 65, null, "apple_white"); + public var yesno:FlxBitmapFont=EventScripts.init_bitmap_font("Yes No", "center", 20, 140, null, "apple_white"); + public var debugtext:FlxBitmapFont=EventScripts.init_bitmap_font(".", "left", 2, 150, null, "apple_white"); + public var selector:FlxSprite=new FlxSprite; + + + public static var REAL_JOYBINDS:Array; + private var state:Int=0; + private var cursor_state:Int=0; + + private static inline var S_DETECTED:Int=0; + private static inline var S_INPUT:Int=1; + private static inline var S_IDLE:Int=-1; + private static inline var S_DONE:Int=2; + private static inline var S_TEST:Int=3; + + private var move_square:FlxSprite=new FlxSprite(100, 110); + private var goal_square:FlxSprite=new FlxSprite(20, 130); + + private var blackscrn:FlxSprite=new FlxSprite(0, 0); + public function new() + { + + blackscrn.makeGraphic(160, 180, 0xff000000); + blackscrn.scrollFactor=new FlxPoint(0, 0); + add(blackscrn); + add(controls); + add(instructions); + add(yesno); + add(debugtext); + + set_instructions_text(); + + selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + selector.frame=2; + selector.scrollFactor=new FlxPoint(0, 0); + selector.x=yesno.x - 8; + selector.y=yesno.y; + add(selector); + + move_square.scrollFactor.x=goal_square.scrollFactor.x=0; + move_square.scrollFactor.y=goal_square.scrollFactor.y=0; + move_square.makeGraphic(16, 16, 0xfff0f0f0); + goal_square.makeGraphic(16, 16, 0xffff0000); + add(move_square); + add(goal_square); + move_square.visible=goal_square.visible=false; + + } + + // keys_idx is 0 to 7 + // so earlier it was checking input_id !=keys_idx + // that person was having errors with action 1 + 2, which are keys_idx=4 and 5 + // it wasn't detecting a duplicate when keys_idx=5 + // they had two axes, meaning button input_id would be from 5 to ... + // meaning the checkk is 5 !=5. his controller probably double-inputs presses? + // this should work now.. + private function no_dups(input_id:Int,keys_idx:Int):Bool { + for(i in 0...8){ + if(Registry.joybinds[i]==input_id && i !=keys_idx){ + return false; + } + } + return true; + } + private var delay:Float=1; + private var timeout:Float=15; + private var wait_time:Float=4; + override public function update():Void + { + + // Force an exit out of the config if we d/c while configing + if(Keys.has_joypad==false ||(Intra.IS_MAC && Main.mac_joy_manager.joysticks[0]==null)){ + state=S_DONE; + return; + } + + if(Main.mac_joy_manager !=null){ + for(a in 1...Main.mac_joy_manager.joysticks.length){ + if(Main.mac_joy_manager.joysticks[a] !=null){ + Main.mac_joy_manager.joysticks[0]=Main.mac_joy_manager.joysticks[a]; + break; + } + } + } + + debugtext.text="Axes " + Keys.get_axis_stats()+ "\n" + "Btns " + Keys.get_btn_stats()+ "\n" + Keys.nr_axes.toString()+ "/" + Keys.nr_btns.toString(); + + if(state==S_DETECTED){ + if(FlxG.keys.justPressed("SPACE")){ + state=S_DONE; + cursor_state=0; + selector.x -=40; + } else if(cursor_state==0 &&(1==Keys.joy_any_axis()|| Registry.keywatch.JP_RIGHT)){ + cursor_state=1; + selector.x +=40; + + } else if(cursor_state==1 &&(-1==Keys.joy_any_axis()|| Registry.keywatch.JP_LEFT)){ + cursor_state=0; + selector.x -=40; + } else if(Keys.joy_any_button()|| FlxG.keys.any()){ + if(Registry.keywatch.RIGHT || Registry.keywatch.LEFT)return; + if(cursor_state==0){ + for(j in 0...8){ + Registry.joybinds[j]=0; + } + + yesno.visible=false; + selector.visible=false; + instructions.visible=false; + state=S_IDLE; + + } else { + trace(Registry.joybinds); + state=S_DONE; + cursor_state=0; + selector.x -=40; + } + } + } else if(state==S_IDLE){ + controls.text="Don't press anything.\n\nConfig starting in\n\n" + wait_time.toFixed(2); + wait_time -=FlxG.elapsed; + if(wait_time<0){ + wait_time=4; + controls.text="Press input for\nUP."; + state=S_INPUT; + } + } else if(state==S_INPUT){ + + if(delay>0){ + delay -=FlxG.elapsed; + return; + } + + if(Keys.joy_get_first_active_button_id()!=0 || Keys.joy_get_first_active_axis_id()!=0){ + + var next_id:Int=Keys.joy_get_first_active_button_id(); + if(next_id==0){ + next_id=Keys.joy_get_first_active_axis_id(); + } + + debugtext.text +="(" + next_id.toString()+ ")"; + + if(cursor_state==0){ + if(no_dups(next_id, Keys.IDX_UP)==false)return; + Registry.joybinds[Keys.IDX_UP]=next_id; + controls.text="Press input for\nRIGHT."; + } else if(cursor_state==1){ + if(no_dups(next_id, Keys.IDX_RIGHT)==false)return; + Registry.joybinds[Keys.IDX_RIGHT]=next_id; + controls.text="Press input for\nDOWN."; + } else if(cursor_state==2){ + if(no_dups(next_id, Keys.IDX_DOWN)==false)return; + Registry.joybinds[Keys.IDX_DOWN]=next_id; + controls.text="Press input for\nLEFT."; + } else if(cursor_state==3){ + if(no_dups(next_id, Keys.IDX_LEFT)==false)return; + Registry.joybinds[Keys.IDX_LEFT]=next_id; + controls.text="Press input for\nConfirm."; + } else if(cursor_state==4){ + if(no_dups(next_id, Keys.IDX_ACTION_1)==false)return; + Registry.joybinds[Keys.IDX_ACTION_1]=next_id; + controls.text="Press input for\nCancel."; + } else if(cursor_state==5){ + if(no_dups(next_id, Keys.IDX_ACTION_2)==false)return; + Registry.joybinds[Keys.IDX_ACTION_2]=next_id; + controls.text="Press input for\nPause."; + } else if(cursor_state==6){ + if(no_dups(next_id, Keys.IDX_PAUSE)==false)return; + Registry.joybinds[Keys.IDX_PAUSE]=next_id; + } + cursor_state++; + if(cursor_state==7){ + cursor_state=0; + controls.text="Move the white square\nto the red square\nto confirm.\n\nOr, wait for the timer\nto run out\nto rebind the controls."; + instructions.visible=true; + instructions.y +=24; + + goal_square.visible=move_square.visible=true; + state=S_TEST;//Need to do test thing + } + + } + } else if(state==S_TEST){ + timeout -=FlxG.elapsed; + instructions.y=89; + instructions.text=timeout.toFixed(2); + if(timeout<10)instructions.text +=" "; + + if(Keys.get_joy_state(Keys.IDX_ACTION_1)){ + instructions.text +=" CONFIRM:ON\n"; + } else { + instructions.text +=" CONFIRM:OFF\n"; + } + + if(Keys.get_joy_state(Keys.IDX_ACTION_2)){ + instructions.text +=" CANCEL:ON\n"; + } else { + instructions.text +=" CANCEL:OFF\n"; + } + + + if(Keys.get_joy_state(Keys.IDX_PAUSE)){ + instructions.text +=" PAUSE:ON\n"; + } else { + instructions.text +=" PAUSE:OFF\n"; + } + + if(timeout<=0){ + reset_before_leave(); + state=S_DETECTED; + return; + } + + if(Registry.keywatch.LEFT){ + move_square.velocity.x=-20; + } else if(Registry.keywatch.RIGHT){ + move_square.velocity.x=20; + } else { + move_square.velocity.x=0; + } + + if(Registry.keywatch.UP){ + move_square.velocity.y=-20; + } else if(Registry.keywatch.DOWN){ + move_square.velocity.y=20; + } else { + move_square.velocity.y=0; + } + + if(move_square.overlaps(goal_square)){ + REAL_JOYBINDS=Registry.joybinds; + state=S_DONE; + } + } else if(state==S_DONE){ + + } + + super.update(); + } + + public function is_done():Bool { + if(state==S_DONE){ + state=S_DETECTED; + reset_before_leave(); + return true; + } + return false; + } + + private function set_instructions_text():Void + { + if(Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]==false){ + instructions.text="Joypad detected for\nthe first time.\n\nConfiguration is\nnecessary!\n\nConfigure?\n(Skip w/ SPACE)"; + Registry.GE_States[Registry.GE_DID_JOYPAD_CONFIG_ONCE]=true; + } else { + instructions.text="Joypad detected.\n\nReconfigure?\n(Skip w/ SPACE)\n"; + } + + } + + private function reset_before_leave():Void + { + timeout=15; + goal_square.visible=move_square.visible=false; + move_square.velocity.x=move_square.velocity.y=0; + move_square.x=100;move_square.y=110; + set_instructions_text(); + yesno.visible=true; + delay=1; + selector.visible=true; + instructions.y -=24; + controls.text="JOYPAD CONFIG"; + } +} \ No newline at end of file diff --git a/intra/source/helper/Parabola_Thing.hx b/intra/source/helper/Parabola_Thing.hx new file mode 100644 index 0000000..aff9667 --- /dev/null +++ b/intra/source/helper/Parabola_Thing.hx @@ -0,0 +1,106 @@ +package helper +{ +import org.flixel.FlxG; +import org.flixel.FlxSprite; +/** + * ... + * @author Seagaia + */ +class Parabola_Thing +{ + + /** + */ + /** + * helper class for making stuff move like a parabola. when tick is called it will + * change the given PROPERTY. changes it over a PERIOD of time, reaches MAX value.. + * up to you to use the return stuff blahbalh + * DOESNT CHECK FOR ERRORS so get your values right. ia m lazy + * @param s + * @param max + * @param period + * @param property + */ + + private var sprite_ref:FlxSprite; + private var height:Float; + public var period:Float; + public var t:Float; + private var coeff:Float; + private var prop:String; + private var subprop:String; + + private var shadow_fall_anim:String; + + private var has_fallen:Bool=true; + + public var OFFSET:Int=0; + + public function new(s:FlxSprite,_height:Float,_period:Float,_property:String,_subprop:String="") + { + sprite_ref=s; + height=_height; + period=_period; + prop=_property; + subprop=_subprop; + t=0; + coeff=get_parabola_coeff(height, period); + + } + + public function destroy():Void { + sprite_ref=null; + } + /** + * Set an animation for the shadow to play when it falls. + *(Falls=current t>period/2) + * @param name + */ + public function set_shadow_fall_animation(name:String):Void { + shadow_fall_anim=name; + has_fallen=false; + } + /** + * changes its set property according to the parabola and blah blah. + * @return 1 if done, 0 if not. might be useful, but this sets "done" for you anyways + */ + public function tick():Int { + + if(t>period){ + return 1; + } + if(!has_fallen &&(t>period/2)){ + has_fallen=true; + sprite_ref.my_shadow.play(shadow_fall_anim); + } + if(subprop !=""){ + sprite_ref[prop][subprop]=OFFSET + get_next_parabola_param(t, period, coeff); + } else { + sprite_ref[prop]=OFFSET + get_next_parabola_param(t, period, coeff); + } + + t +=FlxG.elapsed; + return 0; + } + + + public function reset_time():Void { + t=0; + } + /* Returns the coefficient for a parameterization of parabola-like path */ + + public static function get_parabola_coeff(h:Float, period:Float):Float { + return(-4*h)/(period*period); + } + + /** + * given current time, period, and coeff, return the next value of + * what ever value is being changed + * @return next value yo + */ + public static function get_next_parabola_param(t:Float,period:Float,coeff:Float):Float { + return coeff * t *(t - period); + } + + +} \ No newline at end of file diff --git a/intra/source/helper/S_NPC.hx b/intra/source/helper/S_NPC.hx new file mode 100644 index 0000000..5024210 --- /dev/null +++ b/intra/source/helper/S_NPC.hx @@ -0,0 +1,126 @@ +package helper +{ +import global.Registry; +/** + * Helper functions for stateful npcs. + * @author Melos Han-Tani + */ +class S_NPC +{ + + public static var states:Array=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + public static inline var IDX_TEST:Int=0; + public static inline var IDX_LOBSTER:Int=1; + public static inline var IDX_HAIR:Int=2; + public static inline var IDX_BEAR:Int=3; + public static inline var IDX_GOLEM:Int=4; + + private static inline var BIT_DIRTY:Int=1<<9; + private static inline var BIT_SECOND_PLAYED:Int=1<<8; + private static inline var BIT_BEDROOM_BOSS:Int=1<<7; + private static inline var BIT_REDCAVE_BOSS:Int=1<<6; + private static inline var BIT_CROWD_BOSS:Int=1<<5; + private static inline var BIT_APARTMENT_BOSS:Int=1<<4; + private static inline var BIT_HOTEL_BOSS:Int=1<<3; + private static inline var BIT_CIRCUS_BOSS:Int=1<<2; + private static inline var MAX_STATE:Int=0xfc; + + //Dirty bit, read_second bit, bits on bosses. + + + // Set state, based on index Into state and current Boss states. + + public static function test():Void { + // WOOO INCOMPREHENSIBLE TESTS!!! + trace(check_to_play_second(DH.name_test), "FALSE!");// Playing when clean plays first + trace(check_to_play_second(DH.name_test), "FALSE!");// Playing when dirty but no state change doesnt play 2nd + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!");// Make sure state changing plays the 2nd + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!");// Make sure playing the 2nd once makes any further play the 2nd + + states[IDX_TEST]=0; + trace(check_to_play_second(DH.name_test), "FALSE!");// Check that starting clean but with state plays 1st + trace(check_to_play_second(DH.name_test), "FALSE!");// Dirty and state plays 1st(state donst change) + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "TRUE!"); + + states[IDX_TEST]=0; + + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx]=true; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx]=true; + trace(check_to_play_second(DH.name_test), "FALSE!");// PLaying hwen clena plays first + trace(check_to_play_second(DH.name_test), "TRUE!");// play with all state set plays 2nd + + + } + + /** + * check if you need to play the 2nd dialogue choice. + * if you leave 'scene' blank, then the functiond only relies on + * the stored state of the npc rather than the state of the scene too + * @param name + * @param scene + * @param map + * @return + */ + public static function check_to_play_second(name:String, scene:String="", map:String=""):Bool { + var res:Bool=false; + if(name==DH.name_test){ + res=update(IDX_TEST); + } else if(name==DH.name_generic_npc && map=="BEACH"){ // Lobster + res=update(IDX_LOBSTER); + } else if(name==DH.name_generic_npc && map=="REDSEA"){ + res=update(IDX_HAIR); + } else if(name==DH.name_generic_npc && map=="FOREST"){ + res=update(IDX_BEAR); + } else if(name==DH.name_generic_npc && map=="CLIFF"){ + res=update(IDX_GOLEM); + } + if(scene !="" && DH.scene_is_finished(name, scene, map)==false)return false;// We want all of the first set of dialogue to play at least once + // Put the call after the update because we + // always want to record state + return res; + } + + // Returns true if:All event-bits set, or new result greater than current and dirty is set + private static function update(idx:Int):Bool { + if(states[idx] & BIT_DIRTY){ + var s_new:Int=get_current_states()| states[idx]; + // i.e., if we've done all the events and talked to the NPC once, then play its second dialogue set + // OR if the new state is newer then try to play the 2nd + // or if we've tried to play the 2nd. + var sidx:Int=states[idx]; + //trace("S_NPC.update:New:", s_new, " Old:", states[idx]); + if((sidx & MAX_STATE)==MAX_STATE || s_new>sidx || s_new & BIT_SECOND_PLAYED){ + states[idx]=s_new; + states[idx] |=BIT_SECOND_PLAYED; + return true; + } + } else { + states[idx] |=BIT_DIRTY; + states[idx] |=get_current_states(); + return false; + } + return false; + } + + static private function get_current_states():Int + { + var s_new:Int=0; + Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx] ? s_new |=BIT_BEDROOM_BOSS:1; + Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx] ? s_new |=BIT_REDCAVE_BOSS:1; + Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx] ? s_new |=BIT_CROWD_BOSS:1; + Registry.GE_States[Registry.GE_Apartment_Boss_Dead_Idx] ? s_new |=BIT_APARTMENT_BOSS:1; + Registry.GE_States[Registry.GE_Hotel_Boss_Dead_Idx] ? s_new |=BIT_HOTEL_BOSS:1; + Registry.GE_States[Registry.GE_Circus_Boss_Dead_Idx] ? s_new |=BIT_CIRCUS_BOSS:1; + //trace("S_NPC.get_current_states returns ", s_new); + return s_new; + } + +} \ No newline at end of file diff --git a/intra/source/helper/ScreenFade.hx b/intra/source/helper/ScreenFade.hx new file mode 100644 index 0000000..a677e62 --- /dev/null +++ b/intra/source/helper/ScreenFade.hx @@ -0,0 +1,173 @@ +package helper +{ +import flash.display.BitmapData; +import flash.display.Bitmap; +import flash.geom.Rectangle; +import flash.utils.ByteArray; +import org.flixel.FlxG; +import org.flixel.FlxState; + +class ScreenFade +{ + + public var base:BitmapData; + public var old:BitmapData; + public var thing_to_draw:Bitmap; + public var parent:FlxState; + + private var timer:Float; + public var timer_max:Float; + private var type:Int; + public var rate:Int; + private var cur:Int=1; + public static var T_RECT:Int=0; + public static var T_DS:Int=1;//downsample + public static var T_US:Int=2;//upsample + + public static var DONE:Int=0; + public static var NOT_DONE:Int=1; + + public var width:Int=160; + public var height:Int=180;//change as needed + + public var offset:Int=0; + public var ADDED_CHILD:Bool=false; + public function new(width:Int,height:Int,_parent:FlxState,_type:Int) + { + base=new BitmapData(width, height, true,0x00000000); + old=new BitmapData(width, height, true,0x00000000); + thing_to_draw=new Bitmap(base); + + type=_type; + switch(type){ + case T_RECT: + FlxG.stage.addChild(thing_to_draw); + rate=8; + timer=timer_max=0.02; + break; + case T_DS: + rate=10; + cur=1; + thing_to_draw=new Bitmap(FlxG.camera.buffer); + timer=timer_max=0.01; + break; + case T_US: + rate=1;//min + cur=10;//start + thing_to_draw=new Bitmap(FlxG.camera.buffer); + timer=timer_max=0.01; + break; + } + parent=_parent; + } + + public function reset():Void { + if(type==T_DS){ + rate=10; + cur=1; + } else if(type==T_US){ + rate=1; + cur=10; + } + + } + + public function do_effect():Int { + + timer -=FlxG.elapsed; + if(timer<0){ + timer=timer_max; + switch(type){ + case T_RECT: + return fx_rect(rate); + break; + case T_DS: + FlxG.camera.buffer.copyPixels(thing_to_draw.bitmapData, thing_to_draw.bitmapData.rect, thing_to_draw.bitmapData.rect.topLeft); + cur++; + return fx_downsample(cur,rate); + break; + case T_US: + FlxG.camera.buffer.copyPixels(thing_to_draw.bitmapData, thing_to_draw.bitmapData.rect, thing_to_draw.bitmapData.rect.topLeft); + cur--; + return fx_downsample(cur, rate); + } + } else { + if(type==T_DS){ + return fx_downsample(cur,rate); + } else if(type==T_US){ + return fx_downsample(cur, rate); + } + + } + return NOT_DONE; + } + + private function fx_rect(rate:Int):Int { + + for(var i:Int=offset;i=base.height)return DONE; + return NOT_DONE; + } + + /* + * Downsamples the camera buffer with a from-top-left-square-downsample effect. + * This is a post-processing effect. The camera's buffer is copied to thing_to_draw, + * then on every iteration it copies a downsampled version on top + **/ + private function fx_downsample(stride:Int, max:Int):Int { + var next_color:Int; + if(stride<1)stride=1;//prevent infinite loop + for(y in 0...height +=stride){ + for(x in 0...width +=stride){ + next_color=thing_to_draw.bitmapData.getPixel32(x,y); + for(var _x:Int=x;_xmax)return DONE; + } else if(type==T_US){ + if(stride<=max)return DONE; + } + return NOT_DONE; + } + + /* Downsamples buf based on the top-left squares method. + * Internal locking of buf. + * This should be called before this buffer gets copied out to + * flash. */ + public static function dumsample(stride:Int, buf:BitmapData):Void { + + var next_color:Int; + buf.lock(); + for(y in 0...buf.height +=stride){ + for(x in 0...buf.width +=stride){ + next_color=buf.getPixel32(x,y); + for(var _x:Int=x;_x=null, player:Player=null, parent_state:Dynamic=null, darkness:FlxSprite=null):Int { + var newSprite:FlxSprite; + var x:Int=parseInt(sprite.@x); + var y:Int=parseInt(sprite.@y)+ Registry.HEADER_HEIGHT; + var frame_type:Int=parseInt(sprite.@frame); + var permanence:Int=parseInt(sprite.@p); + var name:String=sprite.name(); + + if(permanence==0 && sprite.@alive=="false")sprite.@alive="true"; + if(name=="Slime"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + if(frame_type==Slime.KEY_T)sprite.@p=P_GLOBAL; + newSprite=new Slime(x, y, id, frame_type,sprite,player,parent_state); + gridObjects.push(newSprite); + return 0; + } else if(name=="SinglePushBlock"){ + var spb:SinglePushBlock=new SinglePushBlock(x, y, sprite,player); + gridObjects.push(spb); + otherObjects.push(spb.sentinel); + return 0; + } else if(name=="Door"){ + newSprite=new Door(x, y, sprite, parent_state); + parent_state.bg_sprites.add(newSprite); + if(parseInt(sprite.@type.toXMLString())==Door.NEXUS_PAD){ + trace("Faking nexus pad"); + var _npc:NPC=new NPC(EventScripts.fake_xml("NPC",x.toString(),y.toString(),"generic","true","0","2"), parent_state,player); + gridObjects.push(_npc); + otherObjects.push(_npc.active_region); + return 1; + } + return -1; + } else if(name=="Wall_Laser"){ + var newerSprite:Wall_Laser=new Wall_Laser(x, y, sprite.@type, id); + gridObjects.push(newerSprite); + otherObjects.push(newerSprite.laser); + return 1; + } else if(name=="Eye_Light"){ + var eye_light:Eye_Light=new Eye_Light(x, y, sprite, darkness); + gridObjects.push(eye_light); + otherObjects.push(eye_light.light); + return 0; + } else if(name=="Mover"){ + var mover:Mover=new Mover(x, y, player, 1.0,sprite,player,parent_state); + gridObjects.push(mover);return 0; + } else if(name=="KeyBlock"){ + if(sprite.@alive=="false")return -1; + var keyBlock:KeyBlock=new KeyBlock(x, y, frame_type,player, sprite); + gridObjects.push(keyBlock);return 0; + } else if(name=="Key"){ + var key:Key=new Key(x, y,player,parent_state,sprite); + gridObjects.push(key); + } else if(name=="Hole"){ + var hole:Hole=new Hole(x, y, sprite,player); + parent_state.bg_sprites.add(hole);return -1; + } else if(name=="Gate"){ + sprite.@p="2"; + var gate:Gate=new Gate(x, y, sprite,player); + + gridObjects.push(gate);return 0; + } else if(name=="Treasure"){ + var treasure:Treasure=new Treasure(x, y, sprite,parent_state as FlxState); + sprite.@p="2"; + parent_state.fg_sprites.add(treasure.item); + gridObjects.push(treasure);return 0; + } else if(name=="CrackedTile"){ + var cracked_tile:CrackedTile=new CrackedTile(x, y, sprite,player); + parent_state.anim_tiles_group.add(cracked_tile.hole); + parent_state.anim_tiles_group.add(cracked_tile);//will get drawn because anim tiles added later + return -1; + } else if(name=="Button"){ + var button:Button=new Button(x, y, sprite,parent_state); + parent_state.anim_tiles_group.add(button); + return -1; + } else if(name=="Sun_Guy"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + var sun_guy:Sun_Guy=new Sun_Guy(x, y, darkness, parent_state as PlayState, sprite,player); + gridObjects.push(sun_guy); + return 0; + } else if(name=="Dust"){ + var dust:Dust=new Dust(x, y, sprite, parent_state); + parent_state.bg_sprites.add(dust); + return -1; + } else if(name=="Event"){ + //var event_script:EventScripts=new EventScripts(); + //gridObjects.push(event_script);//For consistency + deal_with_event(sprite, parent_state); + return -1; + + } else if(name=="Shieldy"){ + if(sprite.@alive=="false"){ + Registry.GRID_ENEMIES_DEAD++; + return -1; + } + var shieldy:Shieldy=new Shieldy(x, y, sprite,parent_state as PlayState); + gridObjects.push(shieldy);return 0; + } else if(name=="Pew_Laser"){ + var pew_laser:Pew_Laser=new Pew_Laser(x, y, sprite, parent_state as PlayState); + gridObjects.push(pew_laser);return 0; + } else if(name=="Annoyer"){ + var annoyer:Annoyer=new Annoyer(x, y, sprite, player,parent_state); + gridObjects.push(annoyer);return 0; + } else if(name=="Console"){ + var console:Console=new Console(x, y, sprite,player); + gridObjects.push(console); + return 0; + } else if(name=="Follower_Bro"){ + var fb:Follower_Bro=new Follower_Bro(sprite, player); + fb.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fb); + return 0; + } else if(name=="Sadbro"){ + var sadbro:Sadbro=new Sadbro(sprite, player); + sadbro.y +=Registry.HEADER_HEIGHT; + gridObjects.push(sadbro); + return 0; + } else if(name=="Red_Walker"){ + var redwalker:Red_Walker=new Red_Walker(sprite,player); + redwalker.y +=Registry.HEADER_HEIGHT; + gridObjects.push(redwalker); + return 0; + } else if(name=="Four_Shooter"){ + var fsht:Four_Shooter=new Four_Shooter(sprite, parent_state as PlayState, player); + fsht.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fsht); + return 0; + } else if(name=="Slasher"){ + var slasher:Slasher=new Slasher(sprite, parent_state as PlayState, player); + slasher.y +=Registry.HEADER_HEIGHT; + gridObjects.push(slasher); + return 0; + } else if(name=="On_Off_Laser"){ + var oolasser:On_Off_Laser=new On_Off_Laser(sprite,player); + oolasser.y +=Registry.HEADER_HEIGHT; + oolasser.laser.y +=Registry.HEADER_HEIGHT; + gridObjects.push(oolasser); + otherObjects.push(oolasser.laser); + return 0; + } else if(name=="Red_Pillar"){ + var red_pillar:Red_Pillar=new Red_Pillar(sprite,player,parent_state); + red_pillar.y +=Registry.HEADER_HEIGHT; + gridObjects.push(red_pillar); + return 0; + } else if(name=="Solid_Sprite"){ + var ss:Solid_Sprite=new Solid_Sprite(sprite,false,player); + ss.y +=Registry.HEADER_HEIGHT; + gridObjects.push(ss); + ss.y +=0; + return 0; + } else if(name=="Big_Door"){ + var bigdoor:Big_Door=new Big_Door(sprite, player); + bigdoor.y +=Registry.HEADER_HEIGHT; + otherObjects.push(bigdoor.active_region); + gridObjects.push(bigdoor); + parent_state.fg_sprites.add(bigdoor.locked_squares); + parent_state.fg_sprites.add(bigdoor.white_flash); + parent_state.fg_sprites.add(bigdoor.score_text_1); + parent_state.fg_sprites.add(bigdoor.score_text_2); + return 0; + } else if(name=="Fisherman"){ + var fisherman:Fisherman=new Fisherman(sprite, player); + fisherman.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fisherman); + return 0; + } else if(name=="Jump_Trigger" || name=="Spring_Pad"){ + var jt:Jump_Trigger=new Jump_Trigger(sprite, player,parent_state); + jt.y +=Registry.HEADER_HEIGHT; + gridObjects.push(jt); + + return 0; + } else if(name=="NPC"){ + var npc:NPC=new NPC(sprite, parent_state,player); + npc.y +=Registry.HEADER_HEIGHT; + gridObjects.push(npc); + otherObjects.push(npc.active_region); + return 0; + } else if(name=="Red_Boss"){ + var redboss:Red_Boss=new Red_Boss(sprite, parent_state as PlayState, player); + redboss.y +=Registry.HEADER_HEIGHT; + gridObjects.push(redboss); + return 0; + } else if(name=="Propelled"){ + var propelled:Propelled=new Propelled(sprite, player, parent_state); + propelled.y +=Registry.HEADER_HEIGHT; + parent_state.bg_sprites.add(propelled); + return -1; + } else if(name=="Stop_Marker"){ + var stopmarker:Stop_Marker=new Stop_Marker(sprite, parent_state); + stopmarker.y +=Registry.HEADER_HEIGHT; + gridObjects.push(stopmarker); + return 0; + } else if(name=="Person"){ + var person:Person=new Person(sprite, player, parent_state); + person.y +=Registry.HEADER_HEIGHT; + gridObjects.push(person); + return 0; + } else if(name=="Rotator"){ + var rotator:Rotator=new Rotator(sprite, player); + rotator.y +=Registry.HEADER_HEIGHT; + gridObjects.push(rotator); + otherObjects.push(rotator.sprite_ball); + return 0; + } else if(name=="Frog"){ + var frog:Frog=new Frog(sprite, player, parent_state); + frog.y +=Registry.HEADER_HEIGHT; + gridObjects.push(frog); + return 0; + }else if(name=="Spike_Roller"){ + var spike_roller:Spike_Roller=new Spike_Roller(sprite, player, parent_state); + spike_roller.y +=Registry.HEADER_HEIGHT; + gridObjects.push(spike_roller); + //adding done inside class + return 0; + } else if(name=="Dog"){ + var dog:Dog=new Dog(sprite, player, parent_state); + dog.y +=Registry.HEADER_HEIGHT; + gridObjects.push(dog); + return 0; + } else if(name=="WallBoss"){ + var wallboss:WallBoss=new WallBoss(sprite, player, parent_state); + gridObjects.push(wallboss); + return 0; + } else if(name=="Pillar_Switch"){ + var psw:Pillar_Switch=new Pillar_Switch(sprite, player, parent_state); + psw.y +=20;gridObjects.push(psw);return 0; + } else if(name=="Switch_Pillar"){ + var ssss:Switch_Pillar=new Switch_Pillar(sprite, player, parent_state); + ssss.y +=20;parent_state.bg_sprites.add(ssss);return -1; + } else if(name=="Silverfish"){ + var silverfish:Silverfish=new Silverfish(sprite, player, parent_state); + silverfish.y +=Registry.HEADER_HEIGHT;gridObjects.push(silverfish);return 0; + } else if(name=="Rat"){ + var rat:Rat=new Rat(sprite, player, parent_state); + rat.y +=Registry.HEADER_HEIGHT;gridObjects.push(rat);return 0; + } else if(name=="Teleguy"){ + var teleguy:Teleguy=new Teleguy(sprite, player, parent_state); + teleguy.y +=Registry.HEADER_HEIGHT;gridObjects.push(teleguy);return 0; + } else if(name=="Dash_Trap"){ + var dashtrap:Dash_Trap=new Dash_Trap(sprite, player, parent_state); + dashtrap.y +=Registry.HEADER_HEIGHT;gridObjects.push(dashtrap);return 0; + } else if(name=="Gasguy"){ + var gasguy:Gasguy=new Gasguy(sprite, player, parent_state); + gasguy.y +=Registry.HEADER_HEIGHT;gridObjects.push(gasguy);return 0; + + } else if(name=="Terminal_Gate"){ + var tgate:Terminal_Gate=new Terminal_Gate(sprite, player, parent_state); + tgate.y +=Registry.HEADER_HEIGHT;gridObjects.push(tgate);return 0; + } else if(name=="Dustmaid"){ + var dustmaid:Dustmaid=new Dustmaid(sprite, player, parent_state); + dustmaid.y +=Registry.HEADER_HEIGHT;gridObjects.push(dustmaid);return 0; + } else if(name=="Splitboss"){ + var splitboss:Splitboss=new Splitboss(sprite, player, parent_state); + splitboss.y +=Registry.HEADER_HEIGHT;gridObjects.push(splitboss);return 0; + } else if(name=="Nonsolid"){ + var nonsolid:Nonsolid=new Nonsolid(sprite); + nonsolid.y +=Registry.HEADER_HEIGHT;gridObjects.push(nonsolid);return 0; + } else if(name=="Steam_Pipe"){ + var steam_pipe:Steam_Pipe=new Steam_Pipe(sprite, player, parent_state); + steam_pipe.y +=Registry.HEADER_HEIGHT;gridObjects.push(steam_pipe);return 0; + } else if(name=="Burst_Plant"){ + var burstplant:Burst_Plant=new Burst_Plant(sprite, player, parent_state); + burstplant.y +=Registry.HEADER_HEIGHT;gridObjects.push(burstplant);return 0; + } else if(name=="Dash_Pad"){ + var dashpad:Dash_Pad=new Dash_Pad(sprite, player, parent_state); + dashpad.y +=Registry.HEADER_HEIGHT;parent_state.bg_sprites.add(dashpad);return -1; + } else if(name=="Elevator"){ + var elevator:Elevator=new Elevator(sprite, player, parent_state); + elevator.y +=Registry.HEADER_HEIGHT;parent_state.fg_sprites.add(elevator); + return -1; + } else if(name=="Eye_Boss"){ + var eyeboss:Eye_Boss=new Eye_Boss(sprite, player, parent_state); + eyeboss.y +=Registry.HEADER_HEIGHT; + if(Eye_Boss.global_state !=eyeboss.gs_water){ + gridObjects.push(eyeboss); + } else { + parent_state.bg_sprites.add(eyeboss); + } + return -1; + } else if(name=="HealthPickup"){ + var healthpickup:HealthPickup=new HealthPickup(x, y + 20, parseInt(sprite.@type), parent_state, sprite); + + gridObjects.push(healthpickup);return 0;//broken + } else if(name=="Contort"){ + var contort:Contort=new Contort(sprite, player, parent_state); + contort.y +=Registry.HEADER_HEIGHT; + gridObjects.push(contort);return 0; + } else if(name=="Lion"){ + var lion:Lion=new Lion(sprite, player, parent_state); + lion.y +=Registry.HEADER_HEIGHT; + gridObjects.push(lion);return 0; + } else if(name=="Circus_Folks"){ + var circus_folk:Circus_Folks=new Circus_Folks(sprite, player, parent_state); + circus_folk.y +=Registry.HEADER_HEIGHT; + gridObjects.push(circus_folk);return 0; + + } else if(name=="Fire_Pillar"){ + var fire_pillar:Fire_Pillar=new Fire_Pillar(sprite, player, parent_state); + fire_pillar.y +=Registry.HEADER_HEIGHT; + gridObjects.push(fire_pillar);return 0; + } else if(name=="solid_tile"){ + var g:FlxTilemap; + var tx:Int; + var ty:Int; + + g=parent_state.curMapBuf; + tx=Std.int((x % 160)/ 16); + ty=Std.int(((y - 20)% 160)/ 16); + g.setTileByIndex(10 * ty + tx,1, false); + + // Now set the BG2 and FG2 layers since they don't load dynamically. + tx=Std.int(x / 16); + ty=Std.int((y - 20)/ 16); + + g=parent_state.map_bg_2; + g.setTileByIndex(g.widthInTiles * ty + tx, 1, false); + g=parent_state.map_fg; + g.setTileByIndex(g.widthInTiles * ty + tx, 1, false); + + } else if(name=="Sage"){ + var sage:Sage=new Sage(player, parent_state, sprite); + sage.y +=Registry.HEADER_HEIGHT; + gridObjects.push(sage);return 0; + } else if(name=="Mitra"){ + var mitra:Mitra=new Mitra(player, parent_state, sprite); + mitra.y +=Registry.HEADER_HEIGHT; + gridObjects.push(mitra);return 0; + } else if(name=="Health_Cicada"){ + var hc:Health_Cicada=new Health_Cicada(player, parent_state, sprite); + hc.y +=Registry.HEADER_HEIGHT; + parent_state.header_group.add(hc.boxes); + parent_state.header_group.add(hc); + + Registry.subgroup_destroyems.push(hc); + return -1; + } else if(name=="Dungeon_Statue"){ + var dunst:Dungeon_Statue=new Dungeon_Statue(player, parent_state, sprite); + dunst.y +=Registry.HEADER_HEIGHT; + gridObjects.push(dunst); + return 0; + } else if(name=="Chaser"){ + var chaser:Chaser=new Chaser(sprite, player, parent_state); + chaser.y +=Registry.HEADER_HEIGHT; + gridObjects.push(chaser); + return 0; + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + if(name=="Suburb_Walker"){ + var subwalk:Suburb_Walker=new Suburb_Walker(new Array(sprite, player, parent_state,true)); + gridObjects.push(subwalk); + return 0; + } else if(name=="Suburb_Killer"){ + var subkiller:Suburb_Killer=new Suburb_Killer(new Array(sprite, player, parent_state,true)); + gridObjects.push(subkiller); + return 0; + } + } else if(name=="Space_Face"){ + var space_face:Space_Face=new Space_Face(new Array(sprite, player, parent_state,true)); + gridObjects.push(space_face); + return 0; + } else if(name=="Water_Anim"){ + var waternaim:Water_Anim=new Water_Anim(new Array(sprite, player, parent_state)); + gridObjects.push(waternaim); + return 0; + } else if(name=="Go_Detector"){ + var gd:Go_Detector=new Go_Detector(new Array(sprite, player, parent_state,true)); + gridObjects.push(gd); + return 0; + } else if(name=="Sage_Boss"){ + var sbb:Sage_Boss=new Sage_Boss(new Array(sprite, player, parent_state, true)); + gridObjects.push(sbb); + return 0; + } else if(name=="Shadow_Briar"){ + if(Registry.CURRENT_MAP_NAME=="GO"){ + var briarboss:Briar_Boss=new Briar_Boss(new Array(sprite, player, parent_state, true)); + gridObjects.push(briarboss); + return 0; + } + var sbri:Shadow_Briar=new Shadow_Briar(new Array(sprite, player, parent_state, true)); + gridObjects.push(sbri); + return 0; + } else if(name=="Trade_NPC"){ //cat, monster, shopkeeper - in FIELDS + var tradenpc:Trade_NPC=new Trade_NPC(new Array(sprite, player, parent_state, true)); + // only add to statelesses or wahetvver if it isnt the cat + if(parseInt(sprite.@frame)!=0){ + gridObjects.push(tradenpc); + return 0; + } + return -1; + } else if(name=="Forest_NPC"){ + var forestnpc:Forest_NPC=new Forest_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(forestnpc); + return 0; + } else if(name=="Redsea_NPC"){ + var redseanpc:Redsea_NPC=new Redsea_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(redseanpc); + return 0; + } else if(name=="Happy_NPC"){ + var hapnpc:Happy_NPC=new Happy_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(hapnpc); + return 0; + } else if(name=="Space_NPC"){ + var spacenpc:Space_NPC=new Space_NPC(new Array(sprite, player, parent_state, true)); + gridObjects.push(spacenpc); + return 0; + } else if(name=="Huge_Fucking_Stag"){ + var hfs:Huge_Fucking_Stag=new Huge_Fucking_Stag(new Array(sprite, player, parent_state, true)); + gridObjects.push(hfs); + return 0; + } else if(name=="Black_Thing"){ + var blackthing:Black_Thing=new Black_Thing(new Array(sprite, player, parent_state, true)); + gridObjects.push(blackthing); + } + + + + return -1; + } + + public static function deal_with_event(e:XML,parent:Dynamic=null):Int { + var event_type:Int=parseInt(e.@frame); + + switch(event_type){ + case EVENT_TYPE_DARKNESS_ALPHA: + Registry.EVENT_CHANGE_DARKNESS_ALPHA=true; + Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET=parseFloat(e.@type); + break; + case EVENT_TYPE_SCALE_VOLUME: + Registry.EVENT_CHANGE_VOLUME_SCALE=true; + Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET=parseFloat(e.@type); + break; + case EVENT_TYPE_SET_ENTRANCE: + var checkpoint:Checkpoint=new Checkpoint(parent.player, parent, e); + checkpoint.y +=Registry.HEADER_HEIGHT; + parent.bg_sprites.add(checkpoint); + break; + case EVENT_TYPE_TEXT: + var font:FlxBitmapFont; + if(e.@type.toString()=="street1"){ + font=EventScripts.init_bitmap_font(" ", "center", 0, 0, new Point(1, 1), "apple_white"); + } else { + font=EventScripts.init_bitmap_font(" ", "center", 0, 0, new Point(1, 1), "apple_black"); + } + font.setText(set_text_event(e.@type.toString()),true,0,0,"center",true); + font.x=parseInt(e.@x); + font.y=parseInt(e.@y); + parent.bg_sprites.add(font); + //parent.sortables.add(font); + font.y +=Registry.HEADER_HEIGHT; + return 1; + + break; + case EVENT_TYPE_STATIC_OFF: + PlayState.GFX_STATIC_ALWAYS_ON=false; + parent.dec_over.exists=false; + break; + } + return 0; + } + + public static function set_text_event(type:String):String { + if(type=="blank1"){ + return " \nMove with \n" + Registry.controls[Keys.IDX_UP] +", " + Registry.controls[Keys.IDX_DOWN] + + ",\n" + Registry.controls[Keys.IDX_LEFT] + ", " + Registry.controls[Keys.IDX_RIGHT]; + } else if(type=="blank2"){ + return "Interact with\nthe " + Registry.controls[Keys.IDX_ACTION_1] + " key."; + } else if(type=="blank3"){ + if(!Intra.is_demo){ + return "Press " + Registry.controls[Keys.IDX_PAUSE] + " \nto open the menu \nand save the game.\n"; + } else { + return " "; + } + + } else if(type=="street1"){ + return "Attack to pick up\nand drop dust."; + } + return "a"; + + } +} \ No newline at end of file diff --git a/intra/source/helper/SteamThing.hx b/intra/source/helper/SteamThing.hx new file mode 100644 index 0000000..f62f047 --- /dev/null +++ b/intra/source/helper/SteamThing.hx @@ -0,0 +1,16 @@ +package helper +{ +import com.amanitadesign.steam.FRESteamWorks; +/** + * ... + * @author Melos Han-Tani + */ +class SteamThing +{ + + public var SteamWorks:FRESteamWorks; + public function init():Void { + SteamWorks=new FRESteamWorks(); + } + +} \ No newline at end of file diff --git a/intra/source/helper/UI_Offsets.hx b/intra/source/helper/UI_Offsets.hx new file mode 100644 index 0000000..88b3653 --- /dev/null +++ b/intra/source/helper/UI_Offsets.hx @@ -0,0 +1,170 @@ +package helper +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.FlxG; +/** + * ... + * @author Copyright Melos Han-Tani, Developer of Analgesic Productions LLC, 2013 - ? , www.twitter.com/seagaia2 + */ +class UI_Offsets +{ + + public function new() + { + // Set defaults + } + + public var save_array:Array; + + public var portrait_dpad:Point=new Point(); + public var portrait_x_a1:Point=new Point(); + public var portrait_c_a2:Point=new Point(); + public var portrait_pause:Point=new Point(); + public var portrait_game:Point=new Point(); + + public var landscape_dpad:Point=new Point(); + public var landscape_x_a1:Point=new Point(); + public var landscape_c_a2:Point=new Point(); + public var landscape_pause:Point=new Point(); + public var landscape_game:Point=new Point(); + + public var scale_portrait_dpad:Float=1; + public var scale_portrait_x_a1:Float=1; + public var scale_portrait_c_a2:Float=1; + public var scale_portrait_pause:Float=1; + public var scale_portrait_game:Float=1; + + public var scale_landscape_dpad:Float=1; + public var scale_landscape_x_a1:Float=1; + public var scale_landscape_c_a2:Float=1; + public var scale_landscape_pause:Float=1; + public var scale_landscape_game:Float=1; + + public function get_save_array():Array { + var a:Array=new Array( + portrait_dpad.x, portrait_dpad.y, scale_portrait_dpad, + portrait_x_a1.x, portrait_x_a1.y, scale_portrait_x_a1, + portrait_c_a2.x, portrait_c_a2.y, scale_portrait_c_a2, + portrait_pause.x, portrait_pause.y, scale_portrait_pause, + portrait_game.x,portrait_game.y,scale_portrait_game, + landscape_dpad.x, landscape_dpad.y, scale_landscape_dpad, + landscape_x_a1.x, landscape_x_a1.y, scale_landscape_x_a1, + landscape_c_a2.x, landscape_c_a2.y, scale_landscape_c_a2, + landscape_pause.x, landscape_pause.y, scale_landscape_pause, + landscape_game.x,landscape_game.y,scale_landscape_game); + return a; + + + } + + public function load_save_array(a:Array):Void { + if(a==null)return; + save_array=a; + portrait_dpad.x=a[0];portrait_dpad.y=a[1];scale_portrait_dpad=a[2]; + portrait_x_a1.x=a[3];portrait_x_a1.y=a[4];scale_portrait_x_a1=a[5]; + portrait_c_a2.x=a[6];portrait_c_a2.y=a[7];scale_portrait_c_a2=a[8]; + portrait_pause.x=a[9];portrait_pause.y=a[10];scale_portrait_pause=a[11]; + portrait_game.x=a[12];portrait_game.y=a[13];scale_portrait_game=a[14]; + landscape_dpad.x=a[15];landscape_dpad.y=a[16];scale_landscape_dpad=a[17]; + landscape_x_a1.x=a[18];landscape_x_a1.y=a[19];scale_landscape_x_a1=a[20]; + landscape_c_a2.x=a[21];landscape_c_a2.y=a[22];scale_landscape_c_a2=a[23]; + landscape_pause.x=a[24];landscape_pause.y=a[25];scale_landscape_pause=a[26]; + landscape_game.x=a[27];landscape_game.y=a[28];scale_landscape_game=a[29]; + } + + public function set_defaults(sw:Int, sh:Int,fsw:Int,fsh:Int,only_land:Bool=false,only_portrait:Bool=false):Void { + + var l:Int=sw>sh ? sw:sh; + var s:Int=sw>sh ? sh:sw; + + trace(s, l); + //Landscape + //scale_landscape_game=Std.int(3 *(s / 540.0))/ 3.0; + if(!only_portrait){ + scale_landscape_game=(s / 540.0); + + var margin_w:Int=(l - 480.0 * scale_landscape_game)/ 2; + scale_landscape_dpad=Std.int(4 *((margin_w - 8)/ 144.0))/ 4.0; + if(scale_landscape_dpad<=0.85){ + scale_landscape_dpad=1; + } + landscape_dpad.x=(margin_w - 144.0 * scale_landscape_dpad)/ 2.0; + if(s<600){ + landscape_dpad.y=(s - 144.0 * scale_landscape_dpad); + } else { + landscape_dpad.y=(s - 144.0 * scale_landscape_dpad)/ 2.0; + } + if(landscape_dpad.x<0)landscape_dpad.x=0; + + scale_landscape_x_a1=scale_landscape_c_a2=Std.int(4 *((margin_w - 6)/(2 * 48.0)))/ 4.0; + if(scale_landscape_c_a2<1){ + scale_landscape_c_a2=scale_landscape_x_a1=1; + } + landscape_x_a1.x=(l - margin_w)+((margin_w / 2)-(48.0 * scale_landscape_x_a1))/ 2.0; + landscape_c_a2.x=landscape_x_a1.x +(margin_w / 2); + + var action_bottom:Int=3 *(s / 5.0); + landscape_x_a1.y=action_bottom - 96.0 * scale_landscape_x_a1; + landscape_c_a2.y=action_bottom - 96.0 * scale_landscape_c_a2; + + scale_landscape_pause=Std.int(4 *((margin_w - 6)/ 96.0))/ 4.0; + landscape_pause.x=(l - margin_w)+(margin_w -(scale_landscape_pause * 96.0))/ 2; + landscape_pause.y=s - 4.0 - 48 * scale_landscape_pause; + + + landscape_game.x=(l - 480.0 * scale_landscape_game)/ 2; + landscape_game.x /=scale_landscape_game;// ??? + landscape_game.y=(s - 540.0 * scale_landscape_game)/ 2; + landscape_game.y /=scale_landscape_game; + } + // Portrait + //scale_portrait_game=Std.int(3*((2*l / 3)/ 480.0))/3.0; + if(!only_land){ + scale_portrait_game=Math.min((2 * l / 3)/ 480.0, s / 480.0); + var game_bottom:Int=scale_portrait_game * 540.0; + var margin_h:Int=l - game_bottom; + action_bottom=(game_bottom +(3 / 4)* margin_h); + margin_w=s / 2; + + scale_portrait_dpad=Std.int(3 *((Math.min(margin_h, margin_w)* 0.9)/ 144.0))/ 3.0; + if(scale_portrait_dpad<=1){ + scale_portrait_dpad=0.85; + } + portrait_dpad.x=(margin_w - 144.0 * scale_portrait_dpad)/ 2.0; + portrait_dpad.y=((margin_h - scale_portrait_dpad * 144.0)/ 2)+ game_bottom; + + scale_portrait_c_a2=scale_portrait_x_a1=Math.min(int(4 *((margin_w * 0.8)/(2 * 48.0)))/ 4.0, Std.int(4 *(((3 / 4)* margin_h - 6)/ 96.0))/ 4.0); + if(scale_portrait_c_a2<1){ // on a fucking iphone + scale_portrait_c_a2=0.86; + scale_portrait_x_a1=0.86; + } + portrait_x_a1.x=(margin_w)+((margin_w / 2.0)-(48.0 * scale_portrait_x_a1))/ 2.0; + portrait_c_a2.x=portrait_x_a1.x +(margin_w / 2.0); + + portrait_c_a2.y=portrait_x_a1.y=game_bottom +((action_bottom - game_bottom)-(scale_portrait_c_a2 * 96.0))/ 2.0; + + scale_portrait_pause=Math.min(int(((margin_w * 0.8)/ 96.0)* 2)/ 2.0, Std.int(((margin_h * 0.9 * .25)/ 48.0)* 2)/ 2.0); + if(scale_portrait_pause<1)scale_portrait_pause=0.77; + portrait_pause.x=((margin_w - 96.0 * scale_portrait_pause)/ 2)+ margin_w; + portrait_pause.y=action_bottom +((l - action_bottom)-(48.0 * scale_portrait_pause))/ 2.0; + + if(scale_portrait_pause<1){ + portrait_pause.y -=2; + } + + + portrait_game.x=(s - 480.0 * scale_portrait_game)/ 2; + portrait_game.x /=scale_portrait_game; + portrait_game.y=0; + } + //scale_portrait_game=Std.int(3*((2*l / 3)/ 480.0))/3.0; + //scale_landscape_game=Std.int(3 *(s / 540.0))/ 3.0; + + + + //Intra.scale_ctr=Intra.SCALE_TYPE_FIT; + //var i:Intra=FlxG._game as Intra; + //i.resize_mobile_game(); + } +} \ No newline at end of file diff --git a/intra/source/helper/invertRGB.pbj b/intra/source/helper/invertRGB.pbj new file mode 100644 index 0000000000000000000000000000000000000000..80e02fac38d85fd66eb7afcfdac21657db87d7f5 GIT binary patch literal 245 zcmXZUO-chn5Cz~jJ+n|4NR|N^r~?F%Tp)j7n3WI@Af4{g3}mW9cPHR3N134B!?WZD z;sxv>u0CGzUVUW%K5tRWk$qgR7F{X2<*?U=F|Qxdl}8rqJm%JIn4aH5>#VymC?U+`cSxAee#qPjlwpxUDf!u34Qq$@;#yL|!`SNs# zOXs}B2a4bg&Z@{Tup#0>;RhI^%JHjkhl#>zdP48)U+S$2Togu7$vjzQxD;21Ill1+ D;ru|z literal 0 HcmV?d00001 diff --git a/intra/source/helper/static.pbj b/intra/source/helper/static.pbj new file mode 100644 index 0000000000000000000000000000000000000000..7ab06aa9eb4e6ecf4190bcc954415c54def3203a GIT binary patch literal 382 zcmZ8dK}y9i6r8+Na8a>)ss1BqPZ0SBaObv^HeeS&k+yztWscI1dXIV}@dD0kHzEWk zGt+tV(oX~6;{xN}(b!#lEZXmOIv;IbPhT$}U-6evx)GpWF>;Ctm3KY}Ziz|L|ZE=6?8 z3m_>kEU}{Q9FPeKk6m$DbF5as*uMegKcBrxefB!TWJS)wsAR)ZRChQd3VrgV-&rCh p&5=8Z&iUituut`hecH>toNzApa=^kI*sFOs{n5l7uZn!nf?py-M^XR) literal 0 HcmV?d00001 diff --git a/intra/source/lua/Intra.lua b/intra/source/lua/Intra.lua new file mode 100644 index 0000000..e5a2057 --- /dev/null +++ b/intra/source/lua/Intra.lua @@ -0,0 +1,93 @@ +--seen.lua +--a simple sprite exporter that outputs a single level node per +--set of sprites + +groups = DAME.GetGroups() +groupCount = as3.tolua(groups.length) -1 + +DAME.SetFloatPrecision(0) + +tab1 = "\t" +tab2 = "\t\t" +tab3 = "\t\t\t" +tab4 = "\t\t\t\t" + +dataDir = as3.tolua(VALUE_DataDir) +levelName = as3.tolua(VALUE_LevelName) + + +function exportMapCSV( mapLayer, layerFileName ) + -- get the raw mapdata. To change format, modify the strings passed in (rowPrefix,rowSuffix,columnPrefix,columnSeparator,columnSuffix) + mapText = as3.tolua(DAME.ConvertMapToText(mapLayer,"","\n","",",","")) + --print("output to "..as3.tolua(VALUE_CSVDir).."/"..layerFileName) + + --Don't bother generating the BG_old tilemaps + if (string.find(layerFileName,"BG_old") == nil) then + DAME.WriteFile(dataDir.."/../csv/"..layerFileName, mapText ); + end +end + +-- This is the file for the map level class. +fileText = "" +maps = {} +spriteLayers = {} +masterLayerAddText = "" +stageAddText = tab3.."if ( addToStage )\n" +stageAddText = stageAddText..tab3.."{\n" + + +for groupIndex = 0,groupCount do + group = groups[groupIndex] + groupName = as3.tolua(group.name) + groupName = string.gsub(groupName, " ", "_") + layerCount = as3.tolua(group.children.length) - 1 + + + -- Go through each layer and store some tables for the different layer types. + for layerIndex = 0,layerCount do + layer = group.children[layerIndex] + isMap = as3.tolua(layer.map)~=nil + layerSimpleName = as3.tolua(layer.name) + layerSimpleName = string.gsub(layerSimpleName, " ", "_") + layerName = groupName..layerSimpleName + if as3.tolua(layer.IsSpriteLayer()) == true then + table.insert( spriteLayers,{groupName,layer,layerName,layerSimpleName}) + stageAddText = stageAddText..tab4.."addSpritesForLayer"..layerName.."(onAddSpritesCallback);\n" + end + if isMap == true then + mapFileName = groupName.."_"..layerSimpleName..".csv" + -- Generate the map file. + exportMapCSV( layer, mapFileName ) + end + end + + + +end + + + +-- create the sprites. +fileText = fileText.."\n"; +for i,v in ipairs(spriteLayers) do + spriteLayer = spriteLayers[i] + fileText = fileText..tab1.."\n" + + val_p = "%%if prop:p%%".." p=\"%prop:p%\"".."%%endprop%%" + val_alive = "%%if prop:alive%%".." alive=\"%prop:alive%\"".."%%endprop%%" + val_type = "%%if prop:type%%".." type=\"%prop:type%\" ".."%%endprop%%" + + + + creationText = tab2.."<%class% x=\"%xpos%\" y=\"%ypos%\" guid=\"%guid%\" frame=\"%frame%\""..val_p..val_alive..val_type.."/>\n" + fileText = fileText..as3.tolua(DAME.CreateTextForSprites(spriteLayers[i][2],creationText,"Avatar")) + fileText = fileText..tab1.."\n" +end + +fileText = fileText.."\n"; + +-- Save the file! + +DAME.WriteFile(dataDir.."\\"..levelName..".xml", fileText ) + +return 1 diff --git a/intra/source/lua/Intra_settings.lua b/intra/source/lua/Intra_settings.lua new file mode 100644 index 0000000..3f980bc --- /dev/null +++ b/intra/source/lua/Intra_settings.lua @@ -0,0 +1,7 @@ +-- Display the settings for the exporter. +DAME.AddHtmlTextLabel("An simple xml exporter to demonstrate a different output format. Not to be used directly but serve as an example for your own exporter.") +DAME.AddBrowsePath("Xml dir:","DataDir",false, "Where you place the xml files.") + +DAME.AddTextInput("Level Name", "", "LevelName", true, "The name you wish to call this level." ) + +return 1 diff --git a/intra/source/lua/csvTilemap.lua b/intra/source/lua/csvTilemap.lua new file mode 100644 index 0000000..a09ec52 --- /dev/null +++ b/intra/source/lua/csvTilemap.lua @@ -0,0 +1,45 @@ + + +groups = DAME.GetGroups() +groupCount = as3.tolua(groups.length) -1 + +FileExt = as3.tolua(VALUE_FileExt) +csvDir = as3.tolua(VALUE_CSVDir) + +-- Output tilemap data + +function exportMapCSV( mapLayer, layerFileName ) + -- get the raw mapdata. To change format, modify the strings passed in (rowPrefix,rowSuffix,columnPrefix,columnSeparator,columnSuffix) + mapText = as3.tolua(DAME.ConvertMapToText(mapLayer,"","\n","",",","")) + --print("output to "..as3.tolua(VALUE_CSVDir).."/"..layerFileName) + DAME.WriteFile(csvDir.."/"..layerFileName, mapText ); +end + + + +for groupIndex = 0,groupCount do + group = groups[groupIndex] + groupName = as3.tolua(group.name) + groupName = string.gsub(groupName, " ", "_") + + + layerCount = as3.tolua(group.children.length) - 1 + + + + -- Go through each layer and store some tables for the different layer types. + for layerIndex = 0,layerCount do + layer = group.children[layerIndex] + isMap = as3.tolua(layer.map)~=nil + layerSimpleName = as3.tolua(layer.name) + layerSimpleName = string.gsub(layerSimpleName, " ", "_") + if isMap == true then + mapFileName = groupName.."_"..layerSimpleName.."."..FileExt + -- Generate the map file. + exportMapCSV( layer, mapFileName ) + end + end +end + + +return 1 diff --git a/intra/source/lua/csvTilemap_settings.lua b/intra/source/lua/csvTilemap_settings.lua new file mode 100644 index 0000000..414db09 --- /dev/null +++ b/intra/source/lua/csvTilemap_settings.lua @@ -0,0 +1,7 @@ +-- Display the settings for the exporter. + +DAME.AddHtmlTextLabel("This exporter just exports the tilemaps in comma separated values format. Nothing else will be exported.") +DAME.AddBrowsePath("CSV dir:","CSVDir",false, "Where the exported file will be.") +DAME.AddTextInput("File Extension", "csv", "FileExt", true, "The file extension of the output file." ) + +return 1 diff --git a/intra/source/noairSave.hx b/intra/source/noairSave.hx new file mode 100644 index 0000000..088d95d --- /dev/null +++ b/intra/source/noairSave.hx @@ -0,0 +1,322 @@ +package +{ +import entity.gadget.Door; +import flash.events.IOErrorEvent; +import flash.geom.Point; +import flash.net.FileReference; +import flash.utils.ByteArray; +import helper.DH; +import helper.S_NPC; +import org.flixel.FlxG; +import org.flixel.FlxSave; +import global.Registry; +import states.MinimapState; + +class Save { + + private static var _save:FlxSave; + private static var _load:FlxSave; + + /** + * Copy source to destination + * @param source + * @param destination + */ + private static function copy(source:Dynamic, destination:Dynamic):Void { + var ba:ByteArray=new ByteArray(); + ba.writeObject(source); + ba.position=0; + destination=ba.readObject(); + } + public static function save():Bool { + _save=new FlxSave(); + var canSave:Bool=_save.bind(Registry.SAVE_NAME); + if(canSave){ + _save.data.valid="yes"; + _save.data.READ_THIS_IF_MODIFYING="HEY! Be careful modifying this! Don't say I didn't warn you..."; + /* I 'new' these because otherwise we store references, it's possible the + * player saves the game, does stuff, quits, and the stuff done after + * the save is still reflected in the save...*/ + _save.data.stateful=new XML(Registry.statefulXML); + _save.data.stateless=new XML(Registry.statelessXML); + _save.data.controls=duplicate_array(new Array(), Registry.controls); + //respawn point for reloading the game + _save.data.bowlofcereal=Registry.death_count; + _save.data.squirrel=Registry.nr_growths; + _save.data.applegouda=duplicate_array(new Array(), Registry.inventory); + _save.data.spam=duplicate_array(new Array(), Registry.nr_keys); + _save.data.fffeeffe=Registry.bound_item_1; + _save.data.fkkekee=Registry.bound_item_2; + _save.data.effect=Registry.bound_effect; + _save.data.booklesporf=Registry.MAX_HEALTH; + _save.data.conga=Registry.CUR_HEALTH; + _save.data.playtime=Registry.playtime; + _save.data.fjfjejfwe=duplicate_array(new Array(), Registry.CUTSCENES_PLAYED); + _save.data.papertowel=Registry.Event_Nr_Red_Pillars_Broken; + //what "general events" have happened + _save.data.hooooops=duplicate_array(new Array(), Registry.GE_States); + //what "big doors" are open + _save.data.Big_Door_State=duplicate_array(new Array(), Registry.Big_Door_State); + _save.data.flamingo=duplicate_array(new Array(), Registry.Nexus_Door_State); + _save.data.minimap_strings=duplicate_array(new Array(), MinimapState.minimap_strings); + _save.data.autosave_on=Registry.autosave_on; + _save.data.rosemary=duplicate_array(new Array(), Registry.card_states); + _save.data.s_npc_states=duplicate_array(new Array(), S_NPC.states); + _save.data.scale_factor=Intra.scale_factor; + _save.data.scale_ctr=Intra.scale_ctr; + + _save.data.dirty="y"; + _save.data.frame_x_px=Intra.frame_x_px; + _save.data.frame_y_px=Intra.frame_y_px; + + var ba:ByteArray=new ByteArray(); + ba.writeObject(Registry.checkpoint); + ba.position=0; + _save.data.aaaaaaaaaaa=ba.readObject(); + + trace("Saving checkpoint:",_save.data.aaaaaaaaaaa.x, _save.data.aaaaaaaaaaa.y, _save.data.aaaaaaaaaaa.area); + + //var o:Dynamic=Registry.checkpoint; + //var o1:Dynamic=_save.data.checkpoint; + // Copy current dialogue state Into the save file + ba.clear(); + ba.writeObject(Registry.DIALOGUE_STATE); + ba.position=0; + + _save.data.aaaaaaaaaaaaaaaaaaaa=ba.readObject(); + } + if(canSave){ + canSave=_save.close(500000); + trace("Writing to disk...success:", canSave); + if(canSave==false){ + canSave=_save.close(500000); + trace("Trying again after request...",canSave); + } + + + // Make backup + if(false==Intra.is_web){ + //var f:File; + //var of:File; + //var fs:FileStream=new FileStream(); + //var ofs:FileStream=new FileStream(); + //f=new File(File.applicationStorageDirectory.nativePath + File.separator + "#SharedObjects" + File.separator + "Anodyne.swf" + File.separator + Registry.SAVE_NAME + ".sol"); + //var fr:FileReference=new FileReference; + //try { + //f.copyTo(new File(File.userDirectory.nativePath + File.separator + "Anodyne" + File.separator + Registry.SAVE_NAME + ".sol"), true); + //} catch(error:IOErrorEvent){ + //trace(" Dynamic copying file"); + //} + // + + + + //trace(f.nativePath); + //fs.open(f, FileMode.READ); + // + //of=new File(File.userDirectory.nativePath + File.separator + "Anodyne" + File.separator + Registry.SAVE_NAME+".sol"); + //ofs.open(of, FileMode.WRITE); + //var mysave:Dynamic= + // + //ba.position=0; + //var nrtowrite:Int=fs.bytesAvailable - fs.position; + //fs.readBytes(ba, 0, fs.bytesAvailable - fs.position); + //ba.position=0; + //ofs.writeBytes(ba, 0, nrtowrite); + // + //ofs.close(); + //fs.close(); + + + //f=new File(File.userDirectory.nativePath + File.separator + "Anodyne" + File.separator + "README.txt"); + //try { + //fs.open(f, FileMode.WRITE); + //fs.writeObject("Hey, this is a backup save file because saves are loaded from temporary storage, possibly cleared by a browser. It gets copied to where saves are read from automatically, so you shouldn't have to worry about anything!"); + //fs.close(); + //} catch(error:IOErrorEvent){ + //trace(" Dynamic opening or closing or writing README file"); + //} catch(sec_error:SecurityError){ + //trace("eror with file permssions sry"); + //} + + } + + } else { + trace("saving failed"); + } + return canSave; + + } + + public static function duplicate_array(next:Array, old:Array, ref:Array=null):Array { + if(ref !=null && old !=null){ + if(ref[0]===false){ + if(old.length=new ByteArray(); + ba.writeObject(_load.data.aaaaaaaaaaa); + ba.position=0; + Registry.checkpoint=ba.readObject(); + trace("Loading checkpoint from disk:", Registry.checkpoint.x, Registry.checkpoint.y, Registry.checkpoint.area); + ba.clear(); + ba.writeObject(_load.data.aaaaaaaaaaaaaaaaaaaa); + ba.position=0; + Registry.DIALOGUE_STATE=ba.readObject(); + // If the game has new dialogue states, add them to the save file's. + DH.patch_dialogue_state(); + + } + else { canLoad=false;} + if(canLoad){ + canLoad=_load.close(500000); + trace("Closing loaded file...", canLoad); + } else { + trace("loading failed"); + } + return canLoad; + } + + public static function delete_save():Bool { + _save=new FlxSave(); + var canDelete:Bool=_save.bind(Registry.SAVE_NAME); + if(canDelete){ + trace("Deleting data"); + _save.data.valid="no"; + _save.data.scale_factor=0; + _save.data.scale_ctr=0; + + Registry.death_count=0; + Registry.controls=Registry.default_controls; + Registry.nr_growths=0; + Registry.bound_effect="none"; + Registry.bound_item_1=""; + Registry.bound_item_2=""; + Registry.playtime=0; + Registry.nr_keys=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0); + Registry.inventory=new Array(false, false, false, false, false, false,false,false,false,false,false,false, false,false,false,false,false,false,false); + Registry.GE_States=new Array( + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false); + Registry.CUTSCENES_PLAYED=new Array(0, 0, 0, 0, 0, 0,0,0,0,0,0); + Registry.Event_Nr_Red_Pillars_Broken=0; + Registry.CUR_HEALTH=Registry.MAX_HEALTH=6; + Registry.Big_Door_State=new Array(false, false, false, false, false, false, false, false, false, false); + Registry.Nexus_Door_State=new Array(false, true, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false); + Registry.autosave_on=true; + Registry.card_states=new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + + S_NPC.states=new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + // Reset the current dialogue state + DH.init_dialogue_state(); + // Delete visited array and current minimap state + MinimapState.save_delete_routine(); + + + } + if(canDelete){ + canDelete=_save.close(500000); + trace("Writing to disk...", canDelete); + } else { + trace("Reading save failed"); + } + return canDelete; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/AnoSprite.hx b/intra/source/org/flixel/AnoSprite.hx new file mode 100644 index 0000000..0c4d91d --- /dev/null +++ b/intra/source/org/flixel/AnoSprite.hx @@ -0,0 +1,48 @@ +package org.flixel +{ +import entity.player.Player; +import flash.geom.Point; +import global.Registry; +/** + * ... + * @author ... + */ +class AnoSprite extends FlxSprite +{ + public var xml:XML; + public var player:Player; + public var parent:Dynamic; + private var state:Int; + public var tl:Point; + private var dame_frame:Int; + private var did_init:Bool=false; + + /** + * Creates a flxsprite but with the args that most entities in anodyne have. + * Should be:[XML,Player ref,Parent,offset_the_y] + * offset_the_y is a boolean, if true then we add 20 to the DAME y- value + * @param args + */ + public function new(args:Array) + { + xml=args[0]; + player=args[1]; + parent=args[2]; + + super(parseInt(xml.@x), parseInt(xml.@y)); + + if(args.length>3){ + args[3] ? y +=Registry.HEADER_HEIGHT:1; + } + + tl=new Point(Registry.CURRENT_GRID_X * 160, Registry.CURRENT_GRID_Y * 160 + Registry.HEADER_HEIGHT); + + } + + override public function destroy():Void + { + tl=null; + super.destroy(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxBasic.hx b/intra/source/org/flixel/FlxBasic.hx new file mode 100644 index 0000000..8a0447f --- /dev/null +++ b/intra/source/org/flixel/FlxBasic.hx @@ -0,0 +1,153 @@ +package org.flixel; + +/** + * This is a useful "generic" Flixel object. + * BothFlxObjectandFlxGroupextend this class, + * as do the plugins. Has no size, position or graphical data. + * + * @author Adam Atomic + */ +class FlxBasic +{ + static Internal var _ACTIVECOUNT:Int; + static Internal var _VISIBLECOUNT:Int; + + /** + * IDs seem like they could be pretty useful, huh? + * They're not actually used for anything yet though. + */ + public var ID:Int; + /** + * Controls whetherupdate()anddraw()are automatically called by FlxState/FlxGroup. + */ + public var exists:Bool; + /** + * Controls whetherupdate()is automatically called by FlxState/FlxGroup. + */ + public var active:Bool; + /** + * Controls whetherdraw()is automatically called by FlxState/FlxGroup. + */ + public var visible:Bool; + /** + * Useful state for many game objects - "dead"(!alive)vs alive. + *kill()andrevive()both flip this switch(along with exists, but you can override that). + */ + public var alive:Bool; + /** + * An array of camera objects that this object will use duringdraw(). + * This value will initialize itself during the first draw to automatically + * point at the main camera list out inFlxGunless you already set it. + * You can also change it afterward too, very flexible! + */ + public var cameras:Array; + /** + * Setting this to true will prevent the object from appearing + * when the visual debug mode in the debugger overlay is toggled on. + */ + public var ignoreDrawDebug:Bool; + + /** + * Instantiate the basic flixel object. + */ + public function new() + { + ID=-1; + exists=true; + active=true; + visible=true; + alive=true; + ignoreDrawDebug=false; + } + + /** + * Override this function to null out variables or manually call + *destroy()on class members if necessary. + * Don't forget to callsuper.destroy()! + */ + public function destroy():Void {} + + /** + * Pre-update is called right beforeupdate()on each object in the game loop. + */ + public function preUpdate():Void + { + _ACTIVECOUNT++; + } + + /** + * Override this function to update your class's position and appearance. + * This is where most of your game rules and behavioral code will go. + */ + public function update():Void + { + } + + /** + * Post-update is called right afterupdate()on each object in the game loop. + */ + public function postUpdate():Void + { + } + + /** + * Override this function to control how the object is drawn. + * Overridingdraw()is rarely necessary, but can be very useful. + */ + public function draw():Void + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObject.reset(). + */ + public function revive():Void + { + alive=true; + exists=true; + } + + /** + * Convert object to readable string name. Useful for debugging, save games, etc. + */ + public function toString():String + { + return FlxU.getClassName(this,true); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxButton.hx b/intra/source/org/flixel/FlxButton.hx new file mode 100644 index 0000000..efd3332 --- /dev/null +++ b/intra/source/org/flixel/FlxButton.hx @@ -0,0 +1,355 @@ +package org.flixel; + +import flash.events.MouseEvent; + +/** + * A simple button class that calls a function when clicked by the mouse. + * + * @author Adam Atomic + */ +class FlxButton extends FlxSprite +{ + //[Embed(source="data/button.png")] private var ImgDefaultButton:Class; + //[Embed(source="data/beep.mp3")] private var SndBeep:Class; + + /** + * Used with public variablestatus, means not highlighted or pressed. + */ + static public var NORMAL:Int=0; + /** + * Used with public variablestatus, means highlighted(usually from mouse over). + */ + static public var HIGHLIGHT:Int=1; + /** + * Used with public variablestatus, means pressed(usually from mouse click). + */ + static public var PRESSED:Int=2; + + /** + * The text that appears on the button. + */ + public var label:FlxText; + /** + * Controls the offset(from top left)of the text from the button. + */ + public var labelOffset:FlxPoint; + /** + * This function is called when the button is released. + * We recommend assigning your main button behavior to this function + * via theFlxButtonconstructor. + */ + public var onUp:Function; + /** + * This function is called when the button is pressed down. + */ + public var onDown:Function; + /** + * This function is called when the mouse goes over the button. + */ + public var onOver:Function; + /** + * This function is called when the mouse leaves the button area. + */ + public var onOut:Function; + /** + * Shows the current state of the button. + */ + public var status:Int; + /** + * Set this to play a sound when the mouse goes over the button. + * We recommend using the helper function setSounds()! + */ + public var soundOver:FlxSound; + /** + * Set this to play a sound when the mouse leaves the button. + * We recommend using the helper function setSounds()! + */ + public var soundOut:FlxSound; + /** + * Set this to play a sound when the button is pressed down. + * We recommend using the helper function setSounds()! + */ + public var soundDown:FlxSound; + /** + * Set this to play a sound when the button is released. + * We recommend using the helper function setSounds()! + */ + public var soundUp:FlxSound; + + /** + * Used for checkbox-style behavior. + */ + private var _onToggle:Bool; + + /** + * Tracks whether or not the button is currently pressed. + */ + private var _pressed:Bool; + /** + * Whether or not the button has initialized itself yet. + */ + private var _initialized:Bool; + + /** + * Creates a newFlxButtonobject with a gray background + * and a callback function on the UI thread. + * + * @param X The X position of the button. + * @param Y The Y position of the button. + * @param Label The text that you want to appear on the button. + * @param OnClick The function to call whenever the button is clicked. + */ + public function new(X:Float=0,Y:Float=0,Label:String=null,OnClick:Function=null) + { + super(X,Y); + if(Label !=null) + { + label=new FlxText(0,0,80,Label); + label.setFormat(null,8,0x333333,"center"); + labelOffset=new FlxPoint(-1,3); + } + loadGraphic(ImgDefaultButton,true,false,80,20); + + onUp=OnClick; + onDown=null; + onOut=null; + onOver=null; + + soundOver=null; + soundOut=null; + soundDown=null; + soundUp=null; + + status=NORMAL; + _onToggle=false; + _pressed=false; + _initialized=false; + } + + /** + * Called by the game state when state is changed(if this object belongs to the state) + */ + override public function destroy():Void + { + if(FlxG.stage !=null) + FlxG.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); + if(label !=null) + { + label.destroy(); + label=null; + } + onUp=null; + onDown=null; + onOut=null; + onOver=null; + if(soundOver !=null) + soundOver.destroy(); + if(soundOut !=null) + soundOut.destroy(); + if(soundDown !=null) + soundDown.destroy(); + if(soundUp !=null) + soundUp.destroy(); + super.destroy(); + } + + /** + * Since button uses its own mouse handler for thread reasons, + * we run a little pre-check here to make sure that we only add + * the mouse handler when it is actually safe to do so. + */ + override public function preUpdate():Void + { + super.preUpdate(); + + if(!_initialized) + { + if(FlxG.stage !=null) + { + FlxG.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + _initialized=true; + } + } + } + + /** + * Called by the game loop automatically, handles mouseover and click detection. + */ + override public function update():Void + { + updateButton();//Basic button logic + + //Default button appearance is to simply update + // the label appearance based on animation frame. + if(label==null) + return; + switch(frame) + { + case HIGHLIGHT: //Extra behavior to accomodate checkbox logic. + label.alpha=1.0; + break; + case PRESSED: + label.alpha=0.5; + label.y++; + break; + case NORMAL: + default: + label.alpha=0.8; + break; + } + } + + /** + * Basic button update logic + */ + private function updateButton():Void + { + //Figure out if the button is highlighted or pressed or what + //(ignore checkbox behavior for now). + if(FlxG.mouse.visible) + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + var offAll:Bool=true; + while(iFlxU.openURL()). + */ + private function onMouseUp(event:MouseEvent):Void + { + if(!exists || !visible || !active ||(status !=PRESSED)) + return; + if(onUp !=null) + onUp(); + if(soundUp !=null) + soundUp.play(true); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxCamera.hx b/intra/source/org/flixel/FlxCamera.hx new file mode 100644 index 0000000..fdf4ff2 --- /dev/null +++ b/intra/source/org/flixel/FlxCamera.hx @@ -0,0 +1,711 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.ColorTransform; +import flash.geom.Point; +import flash.geom.Rectangle; +import helper.EventScripts; + +/** + * The camera class is used to display the game's visuals in the Flash player. + * By default one camera is created automatically, that is the same size as the Flash player. + * You can add more cameras or even replace the main camera using utilities inFlxG. + * + * @author Adam Atomic + */ +class FlxCamera extends FlxBasic +{ + /** + * Camera "follow" style preset:camera has no deadzone, just tracks the focus object directly. + */ + static public static inline var STYLE_LOCKON:Int=0; + /** + * Camera "follow" style preset:camera deadzone is narrow but tall. + */ + static public static inline var STYLE_PLATFORMER:Int=1; + /** + * Camera "follow" style preset:camera deadzone is a medium-size square around the focus object. + */ + static public static inline var STYLE_TOPDOWN:Int=2; + /** + * Camera "follow" style preset:camera deadzone is a small square around the focus object. + */ + static public static inline var STYLE_TOPDOWN_TIGHT:Int=3; + + /** + * Camera "shake" effect preset:shake camera on both the X and Y axes. + */ + static public static inline var SHAKE_BOTH_AXES:Int=0; + /** + * Camera "shake" effect preset:shake camera on the X axis only. + */ + static public static inline var SHAKE_HORIZONTAL_ONLY:Int=1; + /** + * Camera "shake" effect preset:shake camera on the Y axis only. + */ + static public static inline var SHAKE_VERTICAL_ONLY:Int=2; + + /** + * While you can alter the zoom of each camera after the fact, + * this variable determines what value the camera will start at when created. + */ + static public var defaultZoom:Float; + + /** + * The X position of this camera's display. Zoom does NOT affect this number. + * Measured in pixels from the left side of the flash window. + */ + public var x:Int; + /** + * The Y position of this camera's display. Zoom does NOT affect this number. + * Measured in pixels from the top of the flash window. + */ + public var y:Int; + /** + * How wide the camera display is, in game pixels. + */ + public var width:Int; + /** + * How tall the camera display is, in game pixels. + */ + public var height:Int; + /** + * Tells the camera to follow thisFlxObjectobject around. + */ + public var target:FlxObject; + /** + * You can assign a "dead zone" to the camera in order to better control its movement. + * The camera will always keep the focus object inside the dead zone, + * unless it is bumping up against the bounds rectangle's edges. + * The deadzone's coordinates are measured from the camera's upper left corner in game pixels. + * For rapid prototyping, you can use the preset deadzones(e.g.STYLE_PLATFORMER)withfollow(). + */ + public var deadzone:FlxRect; + /** + * The edges of the camera's range, i.e. where to stop scrolling. + * Measured in game pixels and world coordinates. + */ + public var bounds:FlxRect; + + /** + * Stores the basic parallax scrolling values. + */ + public var scroll:FlxPoint; + /** + * The actual bitmap data of the camera display itself. + */ + public var buffer:BitmapData; + /** + * The natural background color of the camera. Defaults to FlxG.bgColor. + * NOTE:can be transparent for crazy FX! + */ + public var bgColor:Int; + /** + * Sometimes it's easier to just work with aFlxSpritethan it is to work + * directly with theBitmapDatabuffer. This sprite reference will + * allow you to do exactly that. + */ + public var screen:FlxSprite; + + /** + * Indicates how far the camera is zoomed in. + */ + private var _zoom:Float; + /** + * Internal, to help avoid costly allocations. + */ + private var _point:FlxPoint; + /** + * Internal, help with color transforming the flash bitmap. + */ + private var _color:Int; + + /** + * Internal, used to render buffer to screen space. + */ + private var _flashBitmap:Bitmap; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashSprite:Sprite; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashOffsetX:Float; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashOffsetY:Float; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashRect:Rectangle; + /** + * Internal, used to render buffer to screen space. + */ + private var _flashPoint:Point; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashColor:Int; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashDuration:Float; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashComplete:Function; + /** + * Internal, used to control the "flash" special effect. + */ + private var _fxFlashAlpha:Float; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeColor:Int; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeDuration:Float; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeComplete:Function; + /** + * Internal, used to control the "fade" special effect. + */ + private var _fxFadeAlpha:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeIntensity:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeDuration:Float; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeComplete:Function; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeOffset:FlxPoint; + /** + * Internal, used to control the "shake" special effect. + */ + private var _fxShakeDirection:Int; + /** + * Internal helper variable for doing better wipes/fills between renders. + */ + private var _fill:BitmapData; + + /** + * Instantiates a new camera at the specified location, with the specified size and zoom level. + * + * @param X X location of the camera's display in pixels. Uses native, 1:1 resolution, ignores zoom. + * @param Y Y location of the camera's display in pixels. Uses native, 1:1 resolution, ignores zoom. + * @param Width The width of the camera display in pixels. + * @param Height The height of the camera display in pixels. + * @param Zoom The initial zoom level of the camera. A zoom level of 2 will make all pixels display at 2x resolution. + */ + public function new(X:Int,Y:Int,Width:Int,Height:Int,Zoom:Float=0) + { + x=X; + y=Y; + width=Width; + height=Height; + target=null; + deadzone=null; + scroll=new FlxPoint(); + _point=new FlxPoint(); + bounds=null; + screen=new FlxSprite(); + screen.makeGraphic(width,height,0,true); + screen.setOriginToCorner(); + buffer=screen.pixels; + bgColor=FlxG.bgColor; + _color=0xffffff; + + _flashBitmap=new Bitmap(buffer); + _flashBitmap.x=-width*0.5; + _flashBitmap.y=-height*0.5; + _flashSprite=new Sprite(); + zoom=Zoom;//sets the scale of flash sprite, which in turn loads flashoffset values + _flashOffsetX=width*0.5*zoom; + _flashOffsetY=height*0.5*zoom; + _flashSprite.x=x + _flashOffsetX; + _flashSprite.y=y + _flashOffsetY; + _flashSprite.addChild(_flashBitmap); + _flashRect=new Rectangle(0,0,width,height); + _flashPoint=new Point(); + + _fxFlashColor=0; + _fxFlashDuration=0.0; + _fxFlashComplete=null; + _fxFlashAlpha=0.0; + + _fxFadeColor=0; + _fxFadeDuration=0.0; + _fxFadeComplete=null; + _fxFadeAlpha=0.0; + + _fxShakeIntensity=0.0; + _fxShakeDuration=0.0; + _fxShakeComplete=null; + _fxShakeOffset=new FlxPoint(); + _fxShakeDirection=0; + + _fill=new BitmapData(width,height,true,0); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + screen.destroy(); + screen=null; + target=null; + scroll=null; + deadzone=null; + bounds=null; + buffer=null; + _flashBitmap=null; + _flashRect=null; + _flashPoint=null; + _fxFlashComplete=null; + _fxFadeComplete=null; + _fxShakeComplete=null; + _fxShakeOffset=null; + _fill=null; + } + + /** + * Updates the camera scroll as well as special effects like screen-shake or fades. + */ + override public function update():Void + { + //Either follow the object closely, + //or doublecheck our deadzone and update accordingly. + if(target !=null) + { + if(deadzone==null) + focusOn(target.getMidpoint(_point)); + else + { + + var edge:Float; + var targetX:Float=target.x +((target.x>0)?0.0000001:-0.0000001); + var targetY:Float=target.y +((target.y>0)?0.0000001:-0.0000001); + edge=targetX - deadzone.x; + if(scroll.x>edge) + scroll.x=edge; + edge=targetX + target.width - deadzone.x - deadzone.width; + if(scroll.xedge) + scroll.y=edge; + edge=targetY + target.height - deadzone.y - deadzone.height; + if(scroll.ybounds.right - width) + scroll.x=bounds.right - width; + if(scroll.ybounds.bottom - height) + scroll.y=bounds.bottom - height; + } + + //Update the "flash" special effect + if(_fxFlashAlpha>0.0) + { + _fxFlashAlpha -=FlxG.elapsed/_fxFlashDuration; + if((_fxFlashAlpha<=0)&&(_fxFlashComplete !=null)) + _fxFlashComplete(); + } + + //Update the "fade" special effect + if((_fxFadeAlpha>0.0)&&(_fxFadeAlpha<1.0)) + { + _fxFadeAlpha +=FlxG.elapsed/_fxFadeDuration; + if(_fxFadeAlpha>=1.0) + { + _fxFadeAlpha=1.0; + if(_fxFadeComplete !=null) + _fxFadeComplete(); + } + } + + //Update the "shake" special effect + if(_fxShakeDuration>0) + { + _fxShakeDuration -=FlxG.elapsed; + if(_fxShakeDuration<=0) + { + _fxShakeOffset.make(); + if(_fxShakeComplete !=null) + _fxShakeComplete(); + } + else + { + if((_fxShakeDirection==SHAKE_BOTH_AXES)||(_fxShakeDirection==SHAKE_HORIZONTAL_ONLY)) + _fxShakeOffset.x=(FlxG.random()*_fxShakeIntensity*width*2-_fxShakeIntensity*width)*_zoom; + if((_fxShakeDirection==SHAKE_BOTH_AXES)||(_fxShakeDirection==SHAKE_VERTICAL_ONLY)) + _fxShakeOffset.y=(FlxG.random()*_fxShakeIntensity*height*2-_fxShakeIntensity*height)*_zoom; + } + } + } + + /** + * Tells this camera object whatFlxObjectto track. + * + * @param Target The object you want the camera to track. Set to null to not follow anything. + * @param Style Leverage one of the existing "deadzone" presets. If you use a custom deadzone, ignore this parameter and manually specify the deadzone after callingfollow(). + */ + public function follow(Target:FlxObject, Style:Int=STYLE_LOCKON):Void + { + target=Target; + var helper:Float; + switch(Style) + { + case STYLE_PLATFORMER: + var w:Float=width/8; + var h:Float=height/3; + deadzone=new FlxRect((width-w)/2,(height-h)/2 - h*0.25,w,h); + break; + case STYLE_TOPDOWN: + helper=FlxU.max(width,height)/4; + deadzone=new FlxRect((width-helper)/2,(height-helper)/2,helper,helper); + break; + case STYLE_TOPDOWN_TIGHT: + helper=FlxU.max(width,height)/8; + deadzone=new FlxRect((width-helper)/2,(height-helper)/2,helper,helper); + break; + case STYLE_LOCKON: + default: + deadzone=null; + break; + } + } + + /** + * Move the camera focus to this location instantly. + * + * @param Point Where you want the camera to focus. + */ + public function focusOn(Point:FlxPoint):Void + { + Point.x +=(Point.x>0)?0.0000001:-0.0000001; + Point.y +=(Point.y>0)?0.0000001:-0.0000001; + scroll.make(Point.x - width*0.5,Point.y - height*0.5); + } + + /** + * Specify the boundaries of the level or where the camera is allowed to move. + * + * @param X The smallest X value of your level(usually 0). + * @param Y The smallest Y value of your level(usually 0). + * @param Width The largest X value of your level(usually the level width). + * @param Height The largest Y value of your level(usually the level height). + * @param UpdateWorld Whether the global quad-tree's dimensions should be updated to match(default:false). + */ + public function setBounds(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0, UpdateWorld:Bool=false):Void + { + if(bounds==null) + bounds=new FlxRect(); + bounds.make(X,Y,Width,Height); + if(UpdateWorld) + FlxG.worldBounds.copyFrom(bounds); + update(); + } + + /** + * The screen is filled with this color and gradually returns to normal. + * + * @param Color The color you want to use. + * @param Duration How long it takes for the flash to fade. + * @param OnComplete A function you want to run when the flash finishes. + * @param Force Force the effect to reset. + */ + public function flash(Color:Int=0xffffffff, Duration:Float=1, OnComplete:Function=null, Force:Bool=false):Void + { + if(!Force &&(_fxFlashAlpha>0.0)) + return; + _fxFlashColor=Color; + if(Duration<=0) + Duration=Number.MIN_VALUE; + _fxFlashDuration=Duration; + _fxFlashComplete=OnComplete; + _fxFlashAlpha=1.0; + } + + /** + * The screen is gradually filled with this color. + * + * @param Color The color you want to use. + * @param Duration How long it takes for the fade to finish. + * @param OnComplete A function you want to run when the fade finishes. + * @param Force Force the effect to reset. + */ + public function fade(Color:Int=0xff000000, Duration:Float=1, OnComplete:Function=null, Force:Bool=false):Void + { + if(!Force &&(_fxFadeAlpha>0.0)) + return; + _fxFadeColor=Color; + if(Duration<=0) + Duration=Number.MIN_VALUE; + _fxFadeDuration=Duration; + _fxFadeComplete=OnComplete; + _fxFadeAlpha=Number.MIN_VALUE; + } + + /** + * A simple screen-shake effect. + * + * @param Intensity Percentage of screen size representing the maximum distance that the screen can move while shaking. + * @param Duration The length in seconds that the shaking effect should last. + * @param OnComplete A function you want to run when the shake effect finishes. + * @param Force Force the effect to reset(default=true, unlike flash()and fade()!). + * @param Direction Whether to shake on both axes, just up and down, or just side to side(use class constants SHAKE_BOTH_AXES, SHAKE_VERTICAL_ONLY, or SHAKE_HORIZONTAL_ONLY). + */ + public function shake(Intensity:Float=0.05, Duration:Float=0.5, OnComplete:Function=null, Force:Bool=true, Direction:Int=SHAKE_BOTH_AXES):Void + { + if(!Force &&((_fxShakeOffset.x !=0)||(_fxShakeOffset.y !=0))) + return; + _fxShakeIntensity=Intensity; + _fxShakeDuration=Duration; + _fxShakeComplete=OnComplete; + _fxShakeDirection=Direction; + _fxShakeOffset.make(); + } + + /** + * Just turns off all the camera effects instantly. + */ + public function stopFX():Void + { + _fxFlashAlpha=0.0; + _fxFadeAlpha=0.0; + _fxShakeDuration=0; + _flashSprite.x=x + width*0.5; + _flashSprite.y=y + height*0.5; + } + + /** + * Copy the bounds, focus object, and deadzone info from an existing camera. + * + * @param Camera The camera you want to copy from. + * + * @return A reference to thisFlxCameraobject. + */ + public function copyFrom(Camera:FlxCamera):FlxCamera + { + if(Camera.bounds==null) + bounds=null; + else + { + if(bounds==null) + bounds=new FlxRect(); + bounds.copyFrom(Camera.bounds); + } + target=Camera.target; + if(target !=null) + { + if(Camera.deadzone==null) + deadzone=null; + else + { + if(deadzone==null) + deadzone=new FlxRect(); + deadzone.copyFrom(Camera.deadzone); + } + } + return this; + } + + /** + * The zoom level of this camera. 1=1:1, 2=2x zoom, etc. + */ + public var zoom(get_zoom, set_zoom):Float; + private function get_zoom():Float + { + return _zoom; + } + + /** + * @private + */ + private function set_zoom(Zoom:Float):Void + { + if(Zoom==0) + _zoom=defaultZoom; + else + _zoom=Zoom; + setScale(_zoom,_zoom); + } + + /** + * The alpha value of this camera display(a Float between 0.0 and 1.0). + */ + public var alpha(get_alpha, set_alpha):Float; + private function get_alpha():Float + { + return _flashBitmap.alpha; + } + + /** + * @private + */ + private function set_alpha(Alpha:Float):Void + { + _flashBitmap.alpha=Alpha; + } + + /** + * The angle of the camera display(in degrees). + * Currently yields weird display results, + * since cameras aren't nested in an extra display object yet. + */ + public var angle(get_angle, set_angle):Float; + private function get_angle():Float + { + return _flashSprite.rotation; + } + + /** + * @private + */ + private function set_angle(Angle:Float):Void + { + _flashSprite.rotation=Angle; + } + + /** + * The color tint of the camera display. + */ + public var color(get_color, set_color):Int; + private function get_color():Int + { + return _color; + } + + /** + * @private + */ + private function set_color(Color:Int):Void + { + _color=Color; + var colorTransform:ColorTransform=_flashBitmap.transform.colorTransform; + colorTransform.redMultiplier=(_color>>16)*0.00392; + colorTransform.greenMultiplier=(_color>>8&0xff)*0.00392; + colorTransform.blueMultiplier=(_color&0xff)*0.00392; + _flashBitmap.transform.colorTransform=colorTransform; + } + + /** + * Whether the camera display is smooth and filtered, or chunky and pixelated. + * Default behavior is chunky-style. + */ + public var antialiasing(get_antialiasing, set_antialiasing):Bool; + private function get_antialiasing():Bool + { + return _flashBitmap.smoothing; + } + + /** + * @private + */ + private function set_antialiasing(Antialiasing:Bool):Void + { + _flashBitmap.smoothing=Antialiasing; + } + + /** + * The scale of the camera object, irrespective of zoom. + * Currently yields weird display results, + * since cameras aren't nested in an extra display object yet. + */ + public function getScale():FlxPoint + { + return _point.make(_flashSprite.scaleX,_flashSprite.scaleY); + } + + /** + * @private + */ + public function setScale(X:Float,Y:Float):Void + { + _flashSprite.scaleX=X; + _flashSprite.scaleY=Y; + } + + /** + * Fetches a reference to the FlashSpriteobject + * that contains the camera display in the Flash display list. + * Uses include 3D projection, advanced display list modification, and more. + * NOTE:We don't recommend modifying this directly unless you are + * fairly experienced. For simple changes to the camera display, + * like scaling, rotation, and color tinting, we recommend + * using the existingFlxCameravariables. + * + * @return A FlashSpriteobject containing the camera display. + */ + public function getContainerSprite():Sprite + { + return _flashSprite; + } + + /** + * Fill the camera with the specified color. + * + * @param Color The color to fill with in 0xAARRGGBB hex format. + * @param BlendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is true. + */ + public function fill(Color:Int,BlendAlpha:Bool=true):Void + { + _fill.fillRect(_flashRect,Color); + buffer.copyPixels(_fill,_flashRect,_flashPoint,null,null,BlendAlpha); + } + + /** + * Internal helper function, handles the actual drawing of all the special effects. + */ + private function drawFX():Void + { + var alphaComponent:Float; + + //Draw the "flash" special effect onto the buffer + if(_fxFlashAlpha>0.0) + { + alphaComponent=_fxFlashColor>>24; + fill((uint(((alphaComponent<=0)?0xff:alphaComponent)*_fxFlashAlpha)<<24)+(_fxFlashColor&0x00ffffff)); + } + + //Draw the "fade" special effect onto the buffer + if(_fxFadeAlpha>0.0) + { + alphaComponent=_fxFadeColor>>24; + fill((uint(((alphaComponent<=0)?0xff:alphaComponent)*_fxFadeAlpha)<<24)+(_fxFadeColor&0x00ffffff)); + } + + if((_fxShakeOffset.x !=0)||(_fxShakeOffset.y !=0)) + { + _flashSprite.x=x + _flashOffsetX + _fxShakeOffset.x; + _flashSprite.y=y + _flashOffsetY + _fxShakeOffset.y; + } + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxEmitter.hx b/intra/source/org/flixel/FlxEmitter.hx new file mode 100644 index 0000000..fcfffd0 --- /dev/null +++ b/intra/source/org/flixel/FlxEmitter.hx @@ -0,0 +1,380 @@ +package org.flixel; + + +/** + *FlxEmitteris a lightweight particle emitter. + * It can be used for one-time explosions or for + * continuous fx like rain and fire.FlxEmitter + * is not optimized or anything;all it does is launch + *FlxParticleobjects out at set Intervals + * by setting their positions and velocities accordingly. + * It is easy to use and relatively efficient, + * relying onFlxGroup's RECYCLE POWERS. + * + * @author Adam Atomic + */ +class FlxEmitter extends FlxGroup +{ + /** + * The X position of the top left corner of the emitter in world space. + */ + public var x:Float; + /** + * The Y position of the top left corner of emitter in world space. + */ + public var y:Float; + /** + * The width of the emitter. Particles can be randomly generated from anywhere within this box. + */ + public var width:Float; + /** + * The height of the emitter. Particles can be randomly generated from anywhere within this box. + */ + public var height:Float; + /** + * The minimum possible velocity of a particle. + * The default value is(-100,-100). + */ + public var minParticleSpeed:FlxPoint; + /** + * The maximum possible velocity of a particle. + * The default value is(100,100). + */ + public var maxParticleSpeed:FlxPoint; + /** + * The X and Y drag component of particles launched from the emitter. + */ + public var particleDrag:FlxPoint; + /** + * The minimum possible angular velocity of a particle. The default value is -360. + * NOTE:rotating particles are more expensive to draw than non-rotating ones! + */ + public var minRotation:Float; + /** + * The maximum possible angular velocity of a particle. The default value is 360. + * NOTE:rotating particles are more expensive to draw than non-rotating ones! + */ + public var maxRotation:Float; + /** + * Sets theacceleration.ymember of each particle to this value on launch. + */ + public var gravity:Float; + /** + * Determines whether the emitter is currently emitting particles. + * It is totally safe to directly toggle this. + */ + public var on:Bool; + /** + * How often a particle is emitted(if emitter is started with Explode==false). + */ + public var frequency:Float; + /** + * How long each particle lives once it is emitted. + * Set lifespan to 'zero' for particles to live forever. + */ + public var lifespan:Float; + /** + * How much each particle should bounce. 1=full bounce, 0=no bounce. + */ + public var bounce:Float; + /** + * Set your own particle class type here. + * Default isFlxParticle. + */ + public var particleClass:Class; + /** + * Internal helper for deciding how many particles to launch. + */ + private var _quantity:Int; + /** + * Internal helper for the style of particle emission(all at once, or one at a time). + */ + private var _explode:Bool; + /** + * Internal helper for deciding when to launch particles or kill them. + */ + private var _timer:Float; + /** + * Internal counter for figuring out how many particles to launch. + */ + private var _counter:Int; + /** + * Internal point object, handy for reusing for memory mgmt purposes. + */ + private var _point:FlxPoint; + + /** + * Creates a newFlxEmitterobject at a specific position. + * Does NOT automatically generate or attach particles! + * + * @param X The X position of the emitter. + * @param Y The Y position of the emitter. + * @param Size Optional, specifies a maximum capacity for this emitter. + */ + public function new(X:Float=0, Y:Float=0, Size:Float=0) + { + super(Size); + x=X; + y=Y; + width=0; + height=0; + minParticleSpeed=new FlxPoint(-100,-100); + maxParticleSpeed=new FlxPoint(100,100); + minRotation=-360; + maxRotation=360; + gravity=0; + particleClass=null; + particleDrag=new FlxPoint(); + frequency=0.1; + lifespan=3; + bounce=0; + _quantity=0; + _counter=0; + _explode=true; + on=false; + _point=new FlxPoint(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + minParticleSpeed=null; + maxParticleSpeed=null; + particleDrag=null; + particleClass=null; + _point=null; + super.destroy(); + } + + /** + * This function generates a new array of particle sprites to attach to the emitter. + * + * @param Graphics If you opted to not pre-configure an array of FlxSprite objects, you can simply pass in a particle image or sprite sheet. + * @param Quantity The number of particles to generate when using the "create from image" option. + * @param BakedRotations How many frames of baked rotation to use(boosts performance). Set to zero to not use baked rotations. + * @param Multiple Whether the image in the Graphics param is a single particle or a bunch of particles(if it's a bunch, they need to be square!). + * @param Collide Whether the particles should be flagged as not 'dead'(non-colliding particles are higher performance). 0 means no collisions, 0-1 controls scale of particle's bounding box. + * + * @return This FlxEmitter instance(nice for chaining stuff together, if you're Into that). + */ + public function makeParticles(Graphics:Class, Quantity:Int=50, BakedRotations:Int=16, Multiple:Bool=false, Collide:Float=0.8):FlxEmitter + { + maxSize=Quantity; + + var totalFrames:Int=1; + if(Multiple) + { + var sprite:FlxSprite=new FlxSprite(); + sprite.loadGraphic(Graphics,true); + totalFrames=sprite.frames; + sprite.destroy(); + } + + var randomFrame:Int; + var particle:FlxParticle; + var i:Int=0; + while(i0) + particle.loadRotatedGraphic(Graphics,BakedRotations,randomFrame); + else + { + particle.loadGraphic(Graphics,true); + particle.frame=randomFrame; + } + } + else + { + if(BakedRotations>0) + particle.loadRotatedGraphic(Graphics,BakedRotations); + else + particle.loadGraphic(Graphics); + } + if(Collide>0) + { + particle.width *=Collide; + particle.height *=Collide; + particle.centerOffsets(); + } + else + particle.allowCollisions=FlxObject.NONE; + particle.exists=false; + add(particle); + i++; + } + return this; + } + + /** + * Called automatically by the game loop, decides when to launch particles and when to "die". + */ + override public function update():Void + { + if(on) + { + if(_explode) + { + on=false; + var i:Int=0; + var l:Int=_quantity; + if((l<=0)||(l>length)) + l=length; + while(i0)&&(_timer>frequency)&& on) + { + _timer -=frequency; + emitParticle(); + if((_quantity>0)&&(++_counter>=_quantity)) + { + on=false; + _quantity=0; + } + } + } + } + super.update(); + } + + /** + * Call this function to turn off all the particles and the emitter. + */ + override public function kill():Void + { + on=false; + super.kill(); + } + + /** + * Call this function to start emitting particles. + * + * @param Explode Whether the particles should all burst out at once. + * @param Lifespan How long each particle lives once emitted. 0=forever. + * @param Frequency Ignored if Explode is set to true. Frequency is how often to emit a particle. 0=never emit, 0.1=1 particle every 0.1 seconds, 5=1 particle every 5 seconds. + * @param Quantity How many particles to launch. 0="all of the particles". + */ + public function start(Explode:Bool=true,Lifespan:Float=0,Frequency:Float=0.1,Quantity:Int=0):Void + { + revive(); + visible=true; + on=true; + + _explode=Explode; + lifespan=Lifespan; + frequency=Frequency; + _quantity +=Quantity; + + _counter=0; + _timer=0; + } + + /** + * This function can be used both Internally and externally to emit the next particle. + */ + public function emitParticle():Void + { + var particle:FlxParticle=recycle(FlxParticle)as FlxParticle; + particle.lifespan=lifespan; + particle.elasticity=bounce; + particle.reset(x -(particle.width>>1)+ FlxG.random()*width, y -(particle.height>>1)+ FlxG.random()*height); + particle.visible=true; + + if(minParticleSpeed.x !=maxParticleSpeed.x) + particle.velocity.x=minParticleSpeed.x + FlxG.random()*(maxParticleSpeed.x-minParticleSpeed.x); + else + particle.velocity.x=minParticleSpeed.x; + if(minParticleSpeed.y !=maxParticleSpeed.y) + particle.velocity.y=minParticleSpeed.y + FlxG.random()*(maxParticleSpeed.y-minParticleSpeed.y); + else + particle.velocity.y=minParticleSpeed.y; + particle.acceleration.y=gravity; + + if(minRotation !=maxRotation) + particle.angularVelocity=minRotation + FlxG.random()*(maxRotation-minRotation); + else + particle.angularVelocity=minRotation; + if(particle.angularVelocity !=0) + particle.angle=FlxG.random()*360-180; + + particle.drag.x=particleDrag.x; + particle.drag.y=particleDrag.y; + particle.onEmit(); + } + + /** + * A more compact way of setting the width and height of the emitter. + * + * @param Width The desired width of the emitter(particles are spawned randomly within these dimensions). + * @param Height The desired height of the emitter. + */ + public function setSize(Width:Int,Height:Int):Void + { + width=Width; + height=Height; + } + + /** + * A more compact way of setting the X velocity range of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setXSpeed(Min:Float=0,Max:Float=0):Void + { + minParticleSpeed.x=Min; + maxParticleSpeed.x=Max; + } + + /** + * A more compact way of setting the Y velocity range of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setYSpeed(Min:Float=0,Max:Float=0):Void + { + minParticleSpeed.y=Min; + maxParticleSpeed.y=Max; + } + + /** + * A more compact way of setting the angular velocity constraints of the emitter. + * + * @param Min The minimum value for this range. + * @param Max The maximum value for this range. + */ + public function setRotation(Min:Float=0,Max:Float=0):Void + { + minRotation=Min; + maxRotation=Max; + } + + /** + * Change the emitter's midpoint to match the midpoint of aFlxObject. + * + * @param Object TheFlxObjectthat you want to sync up with. + */ + public function at(Object:FlxObject):Void + { + Object.getMidpoint(_point); + x=_point.x -(width>>1); + y=_point.y -(height>>1); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxG.hx b/intra/source/org/flixel/FlxG.hx new file mode 100644 index 0000000..23201ee --- /dev/null +++ b/intra/source/org/flixel/FlxG.hx @@ -0,0 +1,1321 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.display.Sprite; +import flash.display.Stage; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.plugin.DebugPathDisplay; +import org.flixel.plugin.TimerManager; +import org.flixel.system.FlxDebugger; +import org.flixel.system.FlxQuadTree; +import org.flixel.system.input.*; + +/** + * This is a global helper class full of useful functions for audio, + * input, basic info, and the camera system among other things. + * Utilities for maths and color and things can be found inFlxU. + *FlxGis specifically for Flixel-specific properties. + * + * @author Adam Atomic + */ +class FlxG +{ + /** + * If you build and maintain your own version of flixel, + * you can give it your own name here. + */ + static public var LIBRARY_NAME:String="flixel"; + /** + * Assign a major version to your library. + * Appears before the decimal in the console. + */ + static public var LIBRARY_MAJOR_VERSION:Int=2; + /** + * Assign a minor version to your library. + * Appears after the decimal in the console. + */ + static public var LIBRARY_MINOR_VERSION:Int=55; + + /** + * Debugger overlay layout preset:Wide but low windows at the bottom of the screen. + */ + static public static inline var DEBUGGER_STANDARD:Int=0; + /** + * Debugger overlay layout preset:Tiny windows in the screen corners. + */ + static public static inline var DEBUGGER_MICRO:Int=1; + /** + * Debugger overlay layout preset:Large windows taking up bottom half of screen. + */ + static public static inline var DEBUGGER_BIG:Int=2; + /** + * Debugger overlay layout preset:Wide but low windows at the top of the screen. + */ + static public static inline var DEBUGGER_TOP:Int=3; + /** + * Debugger overlay layout preset:Large windows taking up left third of screen. + */ + static public static inline var DEBUGGER_LEFT:Int=4; + /** + * Debugger overlay layout preset:Large windows taking up right third of screen. + */ + static public static inline var DEBUGGER_RIGHT:Int=5; + + /** + * Some handy color presets. Less glaring than pure RGB full values. + * Primarily used in the visual debugger mode for bounding box displays. + * Red is used to indicate an active, movable, solid object. + */ + static public static inline var RED:Int=0xffff0012; + /** + * Green is used to indicate solid but immovable objects. + */ + static public static inline var GREEN:Int=0xff00f225; + /** + * Blue is used to indicate non-solid objects. + */ + static public static inline var BLUE:Int=0xff0090e9; + /** + * Pink is used to indicate objects that are only partially solid, like one-way platforms. + */ + static public static inline var PINK:Int=0xfff01eff; + /** + * White... for white stuff. + */ + static public static inline var WHITE:Int=0xffffffff; + /** + * And black too. + */ + static public static inline var BLACK:Int=0xff000000; + + /** + * Internal tracker for game object. + */ + static public var _game:FlxGame; + /** + * Handy shared variable for implementing your own pause behavior. + */ + static public var paused:Bool; + /** + * Whether you are running in Debug or Release mode. + * Set automatically byFlxPreloaderduring startup. + */ + static public var debug:Bool; + + /** + * Represents the amount of time in seconds that passed since last frame. + */ + static public var elapsed:Float; + /** + * How fast or slow time should pass in the game;default is 1.0. + */ + static public var timeScale:Float; + /** + * The width of the screen in game pixels. + */ + static public var width:Int; + /** + * The height of the screen in game pixels. + */ + static public var height:Int; + /** + * The dimensions of the game world, used by the quad tree for collisions and overlap checks. + */ + static public var worldBounds:FlxRect; + /** + * How many times the quad tree should divide the world on each axis. + * Generally, sparse collisions can have fewer divisons, + * while denser collision activity usually profits from more. + * Default value is 6. + */ + static public var worldDivisions:Int; + /** + * Whether to show visual debug displays or not. + * Default=false. + */ + static public var visualDebug:Bool; + /** + * Setting this to true will disable/skip stuff that isn't necessary for mobile platforms like Android. [BETA] + */ + static public var mobile:Bool; + /** + * The global random number generator seed(for deterministic behavior in recordings and saves). + */ + static public var globalSeed:Float; + /** + *FlxG.levelsandFlxG.scoresare generic + * global variables that can be used for various cross-state stuff. + */ + static public var levels:Array; + static public var level:Int; + static public var scores:Array; + static public var score:Int; + /** + *FlxG.savesis a generic bucket for storing + * FlxSaves so you can access them whenever you want. + */ + static public var saves:Array; + static public var save:Int; + + /** + * A reference to aFlxMouseobject. Important for input! + */ + static public var mouse:Mouse; + /** + * A reference to aFlxKeyboardobject. Important for input! + */ + static public var keys:Keyboard; + + /** + * A handy container for a background music object. + */ + static public var music:FlxSound; + /** + * A list of all the sounds being played in the game. + */ + static public var sounds:FlxGroup; + /** + * Whether or not the game sounds are muted. + */ + static public var mute:Bool; + /** + * Internal volume level, used for global sound control. + */ + static private var _volume:Float; + + /** + * An array ofFlxCameraobjects that are used to draw stuff. + * By default flixel creates one camera the size of the screen. + */ + static public var cameras:Array; + /** + * By default this just refers to the first entry in the cameras array + * declared above, but you can do what you like with it. + */ + static public var camera:FlxCamera; + /** + * Allows you to possibly slightly optimize the rendering process IF + * you are not doing any pre-processing in your game state'sdraw()call. + * @default false + */ + static public var useBufferLocking:Bool; + /** + * Internal helper variable for clearing the cameras each frame. + */ + static private var _cameraRect:Rectangle; + + /** + * An array container for plugins. + * By default flixel uses a couple of plugins: + * DebugPathDisplay, and TimerManager. + */ + static public var plugins:Array; + + /** + * Set this hook to get a callback whenever the volume changes. + * Function should take the formmyVolumeHandler(Volume:Float). + */ + static public var volumeHandler:Function; + + /** + * Useful helper objects for doing Flash-specific rendering. + * Primarily used for "debug visuals" like drawing bounding boxes directly to the screen buffer. + */ + static public var flashGfxSprite:Sprite; + static public var flashGfx:Graphics; + + /** + * Internal storage system to prevent graphics from being used repeatedly in memory. + */ + static private var _cache:Dynamic; + + static public function getLibraryName():String + { + return FlxG.LIBRARY_NAME + " v" + FlxG.LIBRARY_MAJOR_VERSION + "." + FlxG.LIBRARY_MINOR_VERSION; + } + + /** + * Log data to the debugger. + * + * @param Data Anything you want to log to the console. + */ + static public function log(Data:Dynamic):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.log.add((Data==null)?"ERROR:null object":((Std.is(Data, Array))?FlxU.formatArray(Data as Array):Data.toString())); + } + + /** + * Add a variable to the watch list in the debugger. + * This lets you see the value of the variable all the time. + * + * @param AnyObject A reference to any object in your game, e.g. Player or Robot or this. + * @param VariableName The name of the variable you want to watch, in quotes, as a string:e.g. "speed" or "health". + * @param DisplayName Optional, display your own string instead of the class name + variable name:e.g. "enemy count". + */ + static public function watch(AnyObject:Dynamic,VariableName:String,DisplayName:String=null):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.watch.add(AnyObject,VariableName,DisplayName); + } + + /** + * Remove a variable from the watch list in the debugger. + * Don't pass a Variable Name to remove all watched variables for the specified object. + * + * @param AnyObject A reference to any object in your game, e.g. Player or Robot or this. + * @param VariableName The name of the variable you want to watch, in quotes, as a string:e.g. "speed" or "health". + */ + static public function unwatch(AnyObject:Dynamic,VariableName:String=null):Void + { + if((_game !=null)&&(_game._debugger !=null)) + _game._debugger.watch.remove(AnyObject,VariableName); + } + + /** + * How many times you want your game to update each second. + * More updates usually means better collisions and smoother motion. + * NOTE:This is NOT the same thing as the Flash Player framerate! + */ + static public var framerate(get_framerate, set_framerate):Float; + private function get_framerate():Float + { + return 1000/_game._step; + } + + /** + * @private + */ + static private function set_framerate(Framerate:Float):Void + { + _game._step=1000/Framerate; + if(_game._maxAccumulation<_game._step) + _game._maxAccumulation=_game._step; + } + + /** + * How many times you want your game to update each second. + * More updates usually means better collisions and smoother motion. + * NOTE:This is NOT the same thing as the Flash Player framerate! + */ + static public var flashFramerate(get_flashFramerate, set_flashFramerate):Float; + private function get_flashFramerate():Float + { + if(_game.root !=null) + return _game.stage.frameRate; + else + return 0; + } + + /** + * @private + */ + static private function set_flashFramerate(Framerate:Float):Void + { + _game._flashFramerate=Framerate; + if(_game.root !=null) + _game.stage.frameRate=_game._flashFramerate; + _game._maxAccumulation=2000/_game._flashFramerate - 1; + if(_game._maxAccumulation<_game._step) + _game._maxAccumulation=_game._step; + } + + /** + * Switch to full-screen display. + */ + static public function fullscreen():Void + { + FlxG.stage.displayState="fullScreen"; + var fsw:Int=FlxG.width*FlxG.camera.zoom; + var fsh:Int=FlxG.height*FlxG.camera.zoom; + FlxG.camera.x=(FlxG.stage.fullScreenWidth - fsw)/2; + FlxG.camera.y=(FlxG.stage.fullScreenHeight - fsh)/2; + } + + /** + * Generates a random number. Deterministic, meaning safe + * to use if you want to record replays in random environments. + * + * @return ANumberbetween 0 and 1. + */ + static public function random():Float + { + return globalSeed=FlxU.srand(globalSeed); + } + + /** + * Shuffles the entries in an array Into a new random order. + *FlxG.shuffle()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.shuffle()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param A A FlashArrayobject containing...stuff. + * @param HowManyTimes How many swaps to perform during the shuffle operation. Good rule of thumb is 2-4 times as many objects are in the list. + * + * @return The same FlashArrayobject that you passed in in the first place. + */ + static public function shuffle(Objects:Array,HowManyTimes:Int):Array + { + var i:Int=0; + var index1:Int; + var index2:Int; + var object:Dynamic; + while(iFlxG.getRandom()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.getRandom()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param Objects A Flash array of objects. + * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. + * @param Length Optional restriction on the number of values you want to randomly select from. + * + * @return The random object that was selected. + */ + static public function getRandom(Objects:Array,StartIndex:Int=0,Length:Int=0):Dynamic + { + if(Objects !=null) + { + var l:Int=Length; + if((l==0)||(l>Objects.length - StartIndex)) + l=Objects.length - StartIndex; + if(l>0) + return Dynamics[StartIndex + Int(FlxG.random()*l)]; + } + return null; + } + + /** + * Load replay data from a string and play it back. + * + * @param Data The replay that you want to load. + * @param State Optional parameter:if you recorded a state-specific demo or cutscene, pass a new instance of that state here. + * @param CancelKeys Optional parameter:an array of string names of keys(see FlxKeyboard)that can be pressed to cancel the playback, e.g. ["ESCAPE","ENTER"]. Also accepts 2 custom key names:"ANY" and "MOUSE"(fairly self-explanatory I hope!). + * @param Timeout Optional parameter:set a time limit for the replay. CancelKeys will override this if pressed. + * @param Callback Optional parameter:if set, called when the replay finishes. Running to the end, CancelKeys, and Timeout will all trigger Callback(), but only once, and CancelKeys and Timeout will NOT call FlxG.stopReplay()if Callback is set! + */ + static public function loadReplay(Data:String,State:FlxState=null,CancelKeys:Array=null,Timeout:Float=0,Callback:Function=null):Void + { + _game._replay.load(Data); + if(State==null) + FlxG.resetGame(); + else + FlxG.switchState(State); + _game._replayCancelKeys=CancelKeys; + _game._replayTimer=Timeout*1000; + _game._replayCallback=Callback; + _game._replayRequested=true; + } + + /** + * Resets the game or state and replay requested flag. + * + * @param StandardMode If true, reload entire game, else just reload current game state. + */ + static public function reloadReplay(StandardMode:Bool=true):Void + { + if(StandardMode) + FlxG.resetGame(); + else + FlxG.resetState(); + if(_game._replay.frameCount>0) + _game._replayRequested=true; + } + + /** + * Stops the current replay. + */ + static public function stopReplay():Void + { + _game._replaying=false; + if(_game._debugger !=null) + _game._debugger.vcr.stopped(); + resetInput(); + } + + /** + * Resets the game or state and requests a new recording. + * + * @param StandardMode If true, reset the entire game, else just reset the current state. + */ + static public function recordReplay(StandardMode:Bool=true):Void + { + if(StandardMode) + FlxG.resetGame(); + else + FlxG.resetState(); + _game._recordingRequested=true; + } + + /** + * Stop recording the current replay and return the replay data. + * + * @return The replay data in simple ASCII format(seeFlxReplay.save()). + */ + static public function stopRecording():String + { + _game._recording=false; + if(_game._debugger !=null) + _game._debugger.vcr.stopped(); + return _game._replay.save(); + } + + /** + * Request a reset of the current game state. + */ + static public function resetState():Void + { + _game._requestedState=new(FlxU.getClass(FlxU.getClassName(_game._state,false)))(); + } + + /** + * Like hitting the reset button on a game console, this will re-launch the game as if it just started. + */ + static public function resetGame():Void + { + _game._requestedReset=true; + } + + /** + * Reset the input helper objects(useful when changing screens or states) + */ + static public function resetInput():Void + { + keys.reset(); + mouse.reset(); + } + + /** + * Set up and play a looping background soundtrack. + * + * @param Music The sound file you want to loop in the background. + * @param Volume How loud the sound should be, from 0 to 1. + */ + static public function playMusic(Music:Class,Volume:Float=1.0):Void + { + if(music==null) + music=new FlxSound(); + else if(music.active) + music.stop(); + music.loadEmbedded(Music,true); + music.volume=Volume; + music.survive=true; + music.play(); + } + + /** + * Creates a new sound object. + * + * @param EmbeddedSound The embedded sound resource you want to play. To stream, use the optional URL parameter instead. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * @param AutoPlay Whether to play the sound. + * @param URL Load a sound from an external web resource instead. Only used if EmbeddedSound=null. + * + * @return AFlxSoundobject. + */ + static public function loadSound(EmbeddedSound:Class=null,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=false,AutoPlay:Bool=false,URL:String=null):FlxSound + { + if((EmbeddedSound==null)&&(URL==null)) + { + FlxG.log("WARNING:FlxG.loadSound()requires either\nan embedded sound or a URL to work."); + return null; + } + var sound:FlxSound=sounds.recycle(FlxSound)as FlxSound; + if(EmbeddedSound !=null) + //sound.loadEmbedded(EmbeddedSound, Looped,AutoDestroy); + sound.loadEmbedded(EmbeddedSound, Looped); + else + sound.loadStream(URL, Looped); + //sound.loadStream(URL,Looped,AutoDestroy); + sound.volume=Volume; + if(AutoPlay) + sound.play(); + return sound; + } + + /** + * Creates a new sound object from an embeddedClassobject. + * NOTE:Just calls FlxG.loadSound()with AutoPlay==true. + * + * @param EmbeddedSound The sound you want to play. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * + * @return AFlxSoundobject. + */ + static public function play(EmbeddedSound:Class,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=true):FlxSound + { + return FlxG.loadSound(EmbeddedSound,Volume,Looped,AutoDestroy,true); + } + + /** + * Creates a new sound object from a URL. + * NOTE:Just calls FlxG.loadSound()with AutoPlay==true. + * + * @param URL The URL of the sound you want to play. + * @param Volume How loud to play it(0 to 1). + * @param Looped Whether or not to loop this sound. + * @param AutoDestroy Whether to destroy this sound when it finishes playing. Leave this value set to "false" if you want to re-use thisFlxSoundinstance. + * + * @return A FlxSound object. + */ + static public function stream(URL:String,Volume:Float=1.0,Looped:Bool=false,AutoDestroy:Bool=true):FlxSound + { + return FlxG.loadSound(null,Volume,Looped,AutoDestroy,true,URL); + } + + /** + * Setvolumeto a number between 0 and 1 to change the global volume. + * + * @default 0.5 + */ + static public var volume(get_volume, set_volume):Float; + private function get_volume():Float + { + return _volume; + } + + /** + * @private + */ + static private function set_volume(Volume:Float):Void + { + _volume=Volume; + if(_volume<0) + _volume=0; + else if(_volume>1) + _volume=1; + if(volumeHandler !=null) + volumeHandler(FlxG.mute?0:_volume); + } + + /** + * Called by FlxGame on state changes to stop and destroy sounds. + * + * @param ForceDestroy Kill sounds even if they're flaggedsurvive. + */ + static Internal function destroySounds(ForceDestroy:Bool=false):Void + { + if((music !=null)&&(ForceDestroy || !music.survive)) + { + music.destroy(); + music=null; + } + var i:Int=0; + var sound:FlxSound; + var l:Int=sounds.members.length; + while(i=new Array(); + var refs:Array=new Array(); + for(key in _cache){ + keys.push(key); + if(_cache[key] !=null){ + refs.push(_cache[key]); + } + } + + while(keys.length>0 && refs.length>0){ + key=keys.pop(); + var idx:Int=refs.length * Math.random(); + var ref:BitmapData; + ref=refs.splice(idx, 1)[0]; + if(key.indexOf("Tile")!=-1){ + var x:Int=0; + var y:Int=0; + + + refs.splice(refs.indexOf(_cache[key]),1); + while(x<_cache[key].width){ + while(y<_cache[key].height){ + _cache[key].copyPixels(ref, ref.rect, new flash.geom.Point(x, y)); + y +=ref.height; + } + y=0; + x +=ref.width; + } + } else { + _cache[key]=ref; + } + + + } + } + /** + * Generates a newBitmapDataobject(a colored square)and caches it. + * + * @param Width How wide the square should be. + * @param Height How high the square should be. + * @param Color What color the square should be(0xAARRGGBB) + * @param Unique Ensures that the bitmap data uses a new slot in the cache. + * @param Key Force the cache to use a specific Key to index the bitmap. + * + * @return TheBitmapDatawe just created. + */ + static public function createBitmap(Width:Int, Height:Int, Color:Int, Unique:Bool=false, Key:String=null):BitmapData + { + if(Key==null) + { + Key=Width+"x"+Height+":"+Color; + if(Unique && checkBitmapCache(Key)) + { + var inc:Int=0; + var ukey:String; + do + { + ukey=Key + inc++; + } while(checkBitmapCache(ukey)); + Key=ukey; + } + } + if(!checkBitmapCache(Key)) + _cache[Key]=new BitmapData(Width,Height,true,Color); + return _cache[Key]; + } + + /** + * Loads a bitmap from a file, caches it, and generates a horizontally flipped version if necessary. + * + * @param Graphic The image file that you want to load. + * @param Reverse Whether to generate a flipped version. + * @param Unique Ensures that the bitmap data uses a new slot in the cache. + * @param Key Force the cache to use a specific Key to index the bitmap. + * + * @return TheBitmapDatawe just created. + */ + static public function addBitmap(Graphic:Class, Reverse:Bool=false, Unique:Bool=false, Key:String=null):BitmapData + { + var needReverse:Bool=false; + if(Key==null) + { + Key=Std.string(Graphic)+(Reverse?"_REVERSE_":""); + if(Unique && checkBitmapCache(Key)) + { + var inc:Int=0; + var ukey:String; + do + { + ukey=Key + inc++; + } while(checkBitmapCache(ukey)); + Key=ukey; + } + } + + //If there is no data for this key, generate the requested graphic + if(!checkBitmapCache(Key)) + { + _cache[Key]=(new Graphic).bitmapData; + if(Reverse) + needReverse=true; + } + var pixels:BitmapData=_cache[Key]; + if(!needReverse && Reverse &&(pixels.width==(new Graphic).bitmapData.width)) + needReverse=true; + if(needReverse) + { + var newPixels:BitmapData=new BitmapData(pixels.width<<1,pixels.height,true,0x00000000); + newPixels.draw(pixels); + var mtx:Matrix=new Matrix(); + mtx.scale(-1,1); + mtx.translate(newPixels.width,0); + newPixels.draw(pixels,mtx); + pixels=newPixels; + _cache[Key]=pixels; + } + return pixels; + } + + /** + * Dumps the cache's image references. + */ + static public function clearBitmapCache():Void + { + _cache=new Dynamic(); + } + + /** + * Read-only:retrieves the Flash stage object(required for event listeners) + * Will be null if it's not safe/useful yet. + */ + static public var stage(get_stage, set_stage):Stage; + private function get_stage():Stage + { + if(_game.root !=null) + return _game.stage; + return null; + } + + /** + * Read-only:access the current game state from anywhere. + */ + static public var state(get_state, set_state):FlxState; + private function get_state():FlxState + { + return _game._state; + } + + /** + * Switch from the current game state to the one specified here. + */ + static public function switchState(State:FlxState):Void + { + _game._requestedState=State; + } + + /** + * Change the way the debugger's windows are laid out. + * + * @param Layout See the presets above(e.g.DEBUGGER_MICRO, etc). + */ + static public function setDebuggerLayout(Layout:Int):Void + { + if(_game._debugger !=null) + _game._debugger.setLayout(Layout); + } + + /** + * Just resets the debugger windows to whatever the last selected layout was(DEBUGGER_STANDARDby default). + */ + static public function resetDebuggerLayout():Void + { + if(_game._debugger !=null) + _game._debugger.resetLayout(); + } + + /** + * Add a new camera object to the game. + * Handy for PiP, split-screen, etc. + * + * @param NewCamera The camera you want to add. + * + * @return ThisFlxCamerainstance. + */ + static public function addCamera(NewCamera:FlxCamera):FlxCamera + { + FlxG._game.addChildAt(NewCamera._flashSprite,FlxG._game.getChildIndex(FlxG._game._mouse)); + FlxG.cameras.push(NewCamera); + return NewCamera; + } + + /** + * Remove a camera from the game. + * + * @param Camera The camera you want to remove. + * @param Destroy Whether to call destroy()on the camera, default value is true. + */ + static public function removeCamera(Camera:FlxCamera,Destroy:Bool=true):Void + { + try + { + FlxG._game.removeChild(Camera._flashSprite); + } + catch(E:Dynamic) + { + FlxG.log("Error removing camera, not part of game."); + } + if(Destroy) + Camera.destroy(); + } + + /** + * Dumps all the current cameras and resets to just one camera. + * Handy for doing split-screen especially. + * + * @param NewCamera Optional;specify a specific camera object to be the new main camera. + */ + static public function resetCameras(NewCamera:FlxCamera=null):Void + { + var cam:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObjectoverlaps another. + * Can be called with one object and one group, or two groups, or two objects, + * whatever floats your boat! For maximum performance try bundling a lot of objects + * together using aFlxGroup(or even bundling groups together!). + * + *

NOTE:does NOT take objects' scrollfactor Into account, all overlaps are checked in world space.

+ * + * @param ObjectOrGroup1 The first object or group you want to check. + * @param ObjectOrGroup2 The second object or group you want to check. If it is the same as the first, flixel knows to just do a comparison within that group. + * @param NotifyCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. + * @param ProcessCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. If a ProcessCallback is provided, then NotifyCallback will only be called if ProcessCallback returns true for those objects! + * + * @return Whether any oevrlaps were detected. + */ + + + static public function overlap(ObjectOrGroup1:FlxBasic=null,ObjectOrGroup2:FlxBasic=null,NotifyCallback:Function=null,ProcessCallback:Function=null):Bool + { + if(ObjectOrGroup1==null) + ObjectOrGroup1=FlxG.state; + if(ObjectOrGroup2===ObjectOrGroup1) + ObjectOrGroup2=null; + + FlxQuadTree.divisions=FlxG.worldDivisions; + var quadTree:FlxQuadTree=FlxQuadTree.quadTreePool.getNew(); + quadTree.init(FlxG.worldBounds.x,FlxG.worldBounds.y,FlxG.worldBounds.width,FlxG.worldBounds.height); + quadTree.load(ObjectOrGroup1,ObjectOrGroup2,NotifyCallback,ProcessCallback); + var result:Bool=quadTree.execute(); + quadTree.destroy(); + return result; + } + + /** + * Call this function to see if oneFlxObjectcollides with another. + * Can be called with one object and one group, or two groups, or two objects, + * whatever floats your boat! For maximum performance try bundling a lot of objects + * together using aFlxGroup(or even bundling groups together!). + * + *

This function just calls FlxG.overlap and presets the ProcessCallback parameter to FlxObject.separate. + * To create your own collision logic, write your own ProcessCallback and use FlxG.overlap to set it up.

+ * + *

NOTE:does NOT take objects' scrollfactor Into account, all overlaps are checked in world space.

+ * + * @param ObjectOrGroup1 The first object or group you want to check. + * @param ObjectOrGroup2 The second object or group you want to check. If it is the same as the first, flixel knows to just do a comparison within that group. + * @param NotifyCallback A function with twoFlxObjectparameters - e.g.myOverlapFunction(Object1:FlxObject,Object2:FlxObject)- that is called if those two objects overlap. + * + * @return Whether any objects were successfully collided/separated. + */ + static public function collide(ObjectOrGroup1:FlxBasic=null, DynamicOrGroup2:FlxBasic=null, NotifyCallback:Function=null):Bool + { + return overlap(ObjectOrGroup1,ObjectOrGroup2,NotifyCallback,FlxObject.separate); + } + + /** + * Adds a new plugin to the global plugin array. + * + * @param Plugin Any object that extends FlxBasic. Useful for managers and other things. See org.flixel.plugin for some examples! + * + * @return The sameFlxBasic-based plugin you passed in. + */ + static public function addPlugin(Plugin:FlxBasic):FlxBasic + { + //Don't add repeats + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(iFlxPathorFlxTimerconstructors for example usage. + * + * @return The plugin object, or null if no matching plugin was found. + */ + static public function getPlugin(ClassType:Class):FlxBasic + { + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(iFlxBasic-based plugin you passed in. + */ + static public function removePlugin(Plugin:FlxBasic):FlxBasic + { + //Don't add repeats + var pluginList:Array=FlxG.plugins; + var i:Int=pluginList.length-1; + while(i>=0) + { + if(pluginList[i]==Plugin) + pluginList.splice(i,1); + i--; + } + return Plugin; + } + + /** + * Removes an instance of a plugin from the global plugin array. + * + * @param ClassType The class name of the plugin type you want removed from the array. + * + * @return Whether or not at least one instance of this plugin type was removed. + */ + static public function removePluginType(ClassType:Class):Bool + { + //Don't add repeats + var results:Bool=false; + var pluginList:Array=FlxG.plugins; + var i:Int=pluginList.length-1; + while(i>=0) + { + if(pluginList[i] is ClassType) + { + pluginList.splice(i,1); + results=true; + } + i--; + } + return results; + } + + /** + * Called byFlxGameto set upFlxGduringFlxGame's constructor. + */ + static Internal function init(Game:FlxGame,Width:Int,Height:Int,Zoom:Float):Void + { + FlxG._game=Game; + FlxG.width=Width; + FlxG.height=Height; + + FlxG.mute=false; + FlxG._volume=0.5; + FlxG.sounds=new FlxGroup(); + FlxG.volumeHandler=null; + + FlxG.clearBitmapCache(); + + if(flashGfxSprite==null) + { + flashGfxSprite=new Sprite(); + flashGfx=flashGfxSprite.graphics; + } + + FlxCamera.defaultZoom=Zoom; + FlxG._cameraRect=new Rectangle(); + FlxG.cameras=new Array(); + useBufferLocking=false; + + plugins=new Array(); + addPlugin(new DebugPathDisplay()); + addPlugin(new TimerManager()); + + FlxG.mouse=new Mouse(FlxG._game._mouse); + FlxG.keys=new Keyboard(); + FlxG.mobile=false; + + FlxG.levels=new Array(); + FlxG.scores=new Array(); + FlxG.visualDebug=false; + } + + /** + * Called whenever the game is reset, doesn't have to do quite as much work as the basic initialization stuff. + */ + static Internal function reset():Void + { + FlxG.clearBitmapCache(); + FlxG.resetInput(); + FlxG.destroySounds(true); + FlxG.levels.length=0; + FlxG.scores.length=0; + FlxG.level=0; + FlxG.score=0; + FlxG.paused=false; + FlxG.timeScale=1.0; + FlxG.elapsed=0; + FlxG.globalSeed=Math.random(); + FlxG.worldBounds=new FlxRect(-10,-10,FlxG.width+20,FlxG.height+20); + FlxG.worldDivisions=6; + var debugPathDisplay:DebugPathDisplay=FlxG.getPlugin(DebugPathDisplay)as DebugPathDisplay; + if(debugPathDisplay !=null) + debugPathDisplay.clear(); + } + + /** + * Called by the game object to update the keyboard and mouse input tracking objects. + */ + static Internal function updateInput():Void + { + FlxG.keys.update(); + if(!_game._debuggerUp || !_game._debugger.hasMouse) + FlxG.mouse.update(FlxG._game.mouseX,FlxG._game.mouseY); + } + + /** + * Called by the game object to lock all the camera buffers and clear them for the next draw pass. + */ + static Internal function lockCameras():Void + { + var cam:FlxCamera; + var cams:Array=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(i=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(i=FlxG.cameras; + var i:Int=0; + var l:Int=cams.length; + while(iupdate()on all the plugins. + */ + static Internal function updatePlugins():Void + { + var plugin:FlxBasic; + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(idraw()on all the plugins. + */ + static Internal function drawPlugins():Void + { + var plugin:FlxBasic; + var pluginList:Array=FlxG.plugins; + var i:Int=0; + var l:Int=pluginList.length; + while(icreateFocusScreen()). + */ + private var _focus:Sprite; + /** + * The sound tray display container(seecreateSoundTray()). + */ + private var _soundTray:Sprite; + /** + * Helps us auto-hide the sound tray after a volume change. + */ + private var _soundTrayTimer:Float; + /** + * Helps display the volume bars on the sound tray. + */ + private var _soundTrayBars:Array; + /** + * The debugger overlay object. + */ + private var _debugger:FlxDebugger; + /** + * A handy boolean that keeps track of whether the debugger exists and is currently visible. + */ + private var _debuggerUp:Bool; + + /** + * Container for a game replay object. + */ + private var _replay:FlxReplay; + /** + * Flag for whether a playback of a recording was requested. + */ + private var _replayRequested:Bool; + /** + * Flag for whether a new recording was requested. + */ + private var _recordingRequested:Bool; + /** + * Flag for whether a replay is currently playing. + */ + private var _replaying:Bool; + /** + * Flag for whether a new recording is being made. + */ + private var _recording:Bool; + /** + * Array that keeps track of keypresses that can cancel a replay. + * Handy for skipping cutscenes or getting out of attract modes! + */ + private var _replayCancelKeys:Array; + /** + * Helps time out a replay if necessary. + */ + private var _replayTimer:Int; + /** + * This function, if set, is triggered when the callback stops playing. + */ + private var _replayCallback:Function; + + /** + * Instantiate a new game object. + * + * @param GameSizeX The width of your game in game pixels, not necessarily final display pixels(see Zoom). + * @param GameSizeY The height of your game in game pixels, not necessarily final display pixels(see Zoom). + * @param InitialState The class name of the state you want to create and switch to first(e.g. MenuState). + * @param Zoom The default level of zoom for the game's cameras(e.g. 2=all pixels are now drawn at 2x). Default=1. + * @param GameFramerate How frequently the game should update(Std.is(default, 60) times per second). + * @param FlashFramerate Sets the actual display framerate for Flash player(Std.is(default, 30) times per second). + * @param UseSystemCursor Whether to use the default OS mouse pointer, or to use custom flixel ones. + */ + public function new(GameSizeX:Int,GameSizeY:Int,InitialState:Class,Zoom:Float=1,GameFramerate:Int=60,FlashFramerate:Int=30,UseSystemCursor:Bool=false) + { + //super high priority init stuff(focus, mouse, etc) + _lostFocus=false; + _focus=new Sprite(); + _focus.visible=false; + _soundTray=new Sprite(); + _mouse=new Sprite() + + //basic display and update setup stuff + FlxG.init(this,GameSizeX,GameSizeY,Zoom); + FlxG.framerate=GameFramerate; + FlxG.flashFramerate=FlashFramerate; + _accumulator=_step; + _total=0; + _state=null; + useSoundHotKeys=true; + useSystemCursor=UseSystemCursor; + if(!useSystemCursor) + flash.ui.Mouse.hide(); + forceDebugger=false; + _debuggerUp=false; + + //replay data + _replay=new FlxReplay(); + _replayRequested=false; + _recordingRequested=false; + _replaying=false; + _recording=false; + + //then get ready to create the game object for real + _iState=InitialState; + _requestedState=null; + _requestedReset=true; + _created=false; + addEventListener(Event.ENTER_FRAME, create); + } + + /** + * Makes the little volume tray slide out. + * + * @param Silent Whether or not it should beep. + */ + private function showSoundTray(Silent:Bool=false):Void + { + return; + if(!Silent) + FlxG.play(SndBeep); + _soundTrayTimer=1; + _soundTray.y=0; + _soundTray.visible=true; + var globalVolume:Int=Math.round(FlxG.volume*10); + if(FlxG.mute) + globalVolume=0; + for(i in 0..._soundTrayBars.length) + { + if(i_maxAccumulation) + _accumulator=_maxAccumulation; + while(_accumulator>_step) + { + step(); + _accumulator=_accumulator - _step; + } + } + + FlxBasic._VISIBLECOUNT=0; + draw(); + + if(_debuggerUp) + { + _debugger.perf.flash(elapsedMS); + _debugger.perf.visibleObjects(FlxBasic._VISIBLECOUNT); + _debugger.perf.update(); + _debugger.watch.update(); + } + } + } + + /** + * If there is a state change requested during the update loop, + * this function handles actual destroying the old state and related processes, + * and calls creates on the new state and plugs it Into the game object. + */ + private function switchState():Void + { + //Basic reset stuff + FlxG.resetCameras(); + FlxG.resetInput(); + FlxG.destroySounds(); + FlxG.clearBitmapCache(); + /* Remove the screen fade at the same time*/ + if(screen_fade !=null){ + //screen_fade.destroy(); + //screen_fade=null; + } + //Clear the debugger overlay's Watch window + if(_debugger !=null) + _debugger.watch.removeAll(); + + //Clear any timers left in the timer manager + var timerManager:TimerManager=FlxTimer.manager; + if(timerManager !=null) + timerManager.clear(); + + //Destroy the old state(if there is an old state) + if(_state !=null) + _state.destroy(); + + //Finally assign and create the new state + _state=_requestedState; + _state.create(); + } + + /** + * This is the main game update logic section. + * The onEnterFrame()handler is in charge of calling this + * the appropriate number of times each frame. + * This block handles state changes, replays, all that good stuff. + */ + private function step():Void + { + //handle game reset request + if(_requestedReset) + { + _requestedReset=false; + _requestedState=new _iState(); + _replayTimer=0; + _replayCancelKeys=null; + FlxG.reset(); + } + + //handle replay-related requests + if(_recordingRequested) + { + _recordingRequested=false; + _replay.create(FlxG.globalSeed); + _recording=true; + if(_debugger !=null) + { + _debugger.vcr.recording(); + FlxG.log("FLIXEL:starting new flixel gameplay record."); + } + } + else if(_replayRequested) + { + _replayRequested=false; + _replay.rewind(); + FlxG.globalSeed=_replay.seed; + if(_debugger !=null) + _debugger.vcr.playing(); + _replaying=true; + } + + //handle state switching requests + if(_state !=_requestedState) + switchState(); + + //finally actually step through the game physics + FlxBasic._ACTIVECOUNT=0; + if(_replaying) + { + _replay.playNextFrame(); + if(_replayTimer>0) + { + _replayTimer -=_step; + if(_replayTimer<=0) + { + if(_replayCallback !=null) + { + _replayCallback(); + _replayCallback=null; + } + else + FlxG.stopReplay(); + } + } + if(_replaying && _replay.finished) + { + FlxG.stopReplay(); + if(_replayCallback !=null) + { + _replayCallback(); + _replayCallback=null; + } + } + if(_debugger !=null) + _debugger.vcr.updateRuntime(_step); + } + else + FlxG.updateInput(); + if(_recording) + { + _replay.recordFrame(); + if(_debugger !=null) + _debugger.vcr.updateRuntime(_step); + } + update(); + FlxG.mouse.wheel=0; + if(_debuggerUp) + _debugger.perf.activeObjects(FlxBasic._ACTIVECOUNT); + } + + /** + * This function just updates the soundtray object. + */ + private function updateSoundTray(MS:Float):Void + { + //animate stupid sound tray thing + + if(_soundTray !=null) + { + if(_soundTrayTimer>0) + _soundTrayTimer -=MS/1000; + else if(_soundTray.y>-_soundTray.height) + { + _soundTray.y -=(MS/1000)*FlxG.height*2; + if(_soundTray.y<=-_soundTray.height) + { + _soundTray.visible=false; + + //Save sound preferences + var soundPrefs:FlxSave=new FlxSave(); + if(soundPrefs.bind("flixel")) + { + if(soundPrefs.data.sound==null) + soundPrefs.data.sound=new Dynamic; + soundPrefs.data.sound.mute=FlxG.mute; + soundPrefs.data.sound.volume=FlxG.volume; + soundPrefs.close(); + } + } + } + } + } + + /** + * This function is called by step()and updates the actual game state. + * May be called multiple times per "frame" or draw call. + */ + private function update():Void + { + var mark:Int=getTimer(); + + FlxG.elapsed=FlxG.timeScale*(_step/1000); + FlxG.updateSounds(); + FlxG.updatePlugins(); + _state.update(); + FlxG.updateCameras(); + + if(_debuggerUp) + _debugger.perf.flixelUpdate(getTimer()-mark); + } + + /** + * Goes through the game state and draws all the game objects and special effects. + */ + private function draw():Void + { + var mark:Int=getTimer(); + FlxG.lockCameras(); + _state.draw(); + FlxG.drawPlugins(); + FlxG.unlockCameras(); + if(_debuggerUp) + _debugger.perf.flixelDraw(getTimer()-mark); + } + + /** + * Used to instantiate the guts of the flixel game object once we have a valid reference to the root. + * + * @param FlashEvent Just a Flash system event, not too important for our purposes. + */ + private function create(FlashEvent:Event):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME, create); + _total=getTimer(); + + //Set up the view window and double buffering + stage.scaleMode=StageScaleMode.NO_SCALE; + stage.align=StageAlign.TOP_LEFT; + stage.frameRate=_flashFramerate; + + //Add basic input event listeners and mouse container + stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); + stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel); + stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); + addChild(_mouse); + + //Let mobile devs opt out of unnecessary overlays. + if(!FlxG.mobile) + { + //Debugger overlay + if(FlxG.debug || forceDebugger) + { + _debugger=new FlxDebugger(FlxG.width*FlxCamera.defaultZoom,FlxG.height*FlxCamera.defaultZoom); + addChild(_debugger); + } + + //Volume display tab + createSoundTray(); + + //Focus gained/lost monitoring + stage.addEventListener(Event.DEACTIVATE, onFocusLost); + stage.addEventListener(Event.ACTIVATE, onFocus); + createFocusScreen(); + } + + //Finally, set up an event for the actual game loop stuff. + addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + /** + * Sets up the "sound tray", the little volume meter that pops down sometimes. + */ + private function createSoundTray():Void + { + _soundTray.visible=false; + _soundTray.scaleX=2; + _soundTray.scaleY=2; + var tmp:Bitmap=new Bitmap(new BitmapData(80,30,true,0x7F000000)); + _soundTray.x=(FlxG.width/2)*FlxCamera.defaultZoom-(tmp.width/2)*_soundTray.scaleX; + _soundTray.addChild(tmp); + + var text:TextField=new TextField(); + text.width=tmp.width; + text.height=tmp.height; + text.multiline=true; + text.wordWrap=true; + text.selectable=false; + text.embedFonts=true; + text.antiAliasType=AntiAliasType.NORMAL; + text.gridFitType=GridFitType.PIXEL; + text.defaultTextFormat=new TextFormat("system",8,0xffffff,null,null,null,null,null,"center");; + _soundTray.addChild(text); + text.text="VOLUME"; + text.y=16; + + var bx:Int=10; + var by:Int=14; + _soundTrayBars=new Array(); + var i:Int=0; + while(i<10) + { + tmp=new Bitmap(new BitmapData(4,++i,false,0xffffff)); + tmp.x=bx; + tmp.y=by; + _soundTrayBars.push(_soundTray.addChild(tmp)); + bx +=6; + by--; + } + + _soundTray.y=-_soundTray.height; + _soundTray.visible=false; + addChild(_soundTray); + + //load saved sound preferences for this game if they exist + var soundPrefs:FlxSave=new FlxSave(); + if(soundPrefs.bind("flixel")&&(soundPrefs.data.sound !=null)) + { + if(soundPrefs.data.sound.volume !=null) + //FlxG.volume=soundPrefs.data.sound.volume; + FlxG.volume=1; + if(soundPrefs.data.sound.mute !=null) + FlxG.mute=soundPrefs.data.sound.mute; + soundPrefs.destroy(); + } + } + + /** + * Sets up the darkened overlay with the big white "play" button that appears when a flixel game loses focus. + */ + private function createFocusScreen():Void + { + var gfx:Graphics=_focus.graphics; + var screenWidth:Int=FlxG.width*FlxCamera.defaultZoom; + var screenHeight:Int=FlxG.height*FlxCamera.defaultZoom; + + //draw transparent black backdrop + gfx.moveTo(0,0); + gfx.beginFill(0,0.5); + gfx.lineTo(screenWidth,0); + gfx.lineTo(screenWidth,screenHeight); + gfx.lineTo(0,screenHeight); + gfx.lineTo(0,0); + gfx.endFill(); + + //draw white arrow + var halfWidth:Int=screenWidth/2; + var halfHeight:Int=screenHeight/2; + var helper:Int=FlxU.min(halfWidth,halfHeight)/3; + gfx.moveTo(halfWidth-helper,halfHeight-helper); + gfx.beginFill(0xffffff,0.65); + gfx.lineTo(halfWidth+helper,halfHeight); + gfx.lineTo(halfWidth-helper,halfHeight+helper); + gfx.lineTo(halfWidth-helper,halfHeight-helper); + gfx.endFill(); + + var logo:Bitmap=new ImgLogo(); + logo.scaleX=Std.int(helper/10); + if(logo.scaleX<1) + logo.scaleX=1; + logo.scaleY=logo.scaleX; + logo.x -=logo.scaleX; + logo.alpha=0.35; + _focus.addChild(logo); + + addChild(_focus); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxGroup.hx b/intra/source/org/flixel/FlxGroup.hx new file mode 100644 index 0000000..4148cdc --- /dev/null +++ b/intra/source/org/flixel/FlxGroup.hx @@ -0,0 +1,639 @@ +package org.flixel; + +/** + * This is an organizational class that can update and render a bunch ofFlxBasics. + * NOTE:AlthoughFlxGroupextendsFlxBasic, it will not automatically + * add itself to the global collisions quad tree, it will only add its members. + * + * @author Adam Atomic + */ +class FlxGroup extends FlxBasic +{ + /** + * Use withsort()to sort in ascending order. + */ + static public static inline var ASCENDING:Int=-1; + /** + * Use withsort()to sort in descending order. + */ + static public static inline var DESCENDING:Int=1; + + /** + * Array of all theFlxBasics that exist in this group. + */ + public var members:Array; + /** + * The number of entries in the members array. + * For performance and safety you should check this variable + * instead of members.length unless you really know what you're doing! + */ + public var length:Float; + + /** + * If defined, if we sort an array this group is present in by + * y value, then this group will have its own draw order within, but + * in reference to "outside the group" will be drawn according to the + * draw_root's y value. etc. + */ + public var draw_root:FlxSprite=null; + + /** + * Used in tandem with draw_root + */ + public var y:Int=0; + public var y_bottom:Int=0; + + /** + * Internal tracker for the maximum capacity of the group. + * Default is 0, or no max capacity. + */ + private var _maxSize:Int; + /** + * Internal helper variable for recycling objects a laFlxEmitter. + */ + private var _marker:Int; + + /** + * Helper for sort. + */ + private var _sortIndex:String; + /** + * Helper for sort. + */ + private var _sortOrder:Int; + + /** + * Constructor + */ + public function new(MaxSize:Int=0) + { + super(); + members=new Array(); + length=0; + _maxSize=MaxSize; + _marker=0; + _sortIndex=null; + } + + /** + * Override this function to handle any deleting or "shutdown" type operations you might need, + * such as removing traditional Flash children like Sprite objects. + */ + override public function destroy():Void + { + if(members !=null) + { + var basic:FlxBasic; + var i:Int=0; + while(i=_maxSize) + _marker=0; + if((_maxSize==0)||(members==null)||(_maxSize>=members.length)) + return; + + //If the max size has shrunk, we need to get rid of some objects + var basic:FlxBasic; + var i:Int=_maxSize; + var l:Int=members.length; + while(iFlxBasicsubclass(FlxBasic, FlxSprite, Enemy, etc)to the group. + * FlxGroup will try to replace a null member of the array first. + * Failing that, FlxGroup will add it to the end of the member array, + * assuming there is room for it, and doubling the size of the array if necessary. + * + *

WARNING:If the group has a maxSize that has already been met, + * the object will NOT be added to the group!

+ * + * @param Object The object you want to add to the group. + * + * @return The sameFlxBasicobject that was passed in. + */ + public function add(Object:FlxBasic):FlxBasic + { + + //Don't bother adding an object twice. + + if(members.indexOf(Object)>=0) + return Dynamic; + + //First, look for a null entry where we can add the object. + var i:Int=0; + var l:Int=members.length; + while(i=length) + length=i+1; + return Dynamic; + } + i++; + } + + //Failing that, expand the array(if we can)and add the object. + if(_maxSize>0) + { + if(members.length>=_maxSize) + return Dynamic; + else if(members.length * 2<=_maxSize) + members.length *=2; + else + members.length=_maxSize; + } + else + members.length *=2; + + //If we made it this far, then we successfully grew the group, + //and we can go ahead and add the object at the first open slot. + members[i]=Object; + length=i+1; + return Dynamic; + } + + /** + * Recycling is designed to help you reuse game objects without always re-allocating or "newing" them. + * + *

If you specified a maximum size for this group(like in FlxEmitter), + * then recycle will employ what we're calling "rotating" recycling. + * Recycle()will first check to see if the group is at capacity yet. + * If group is not yet at capacity, recycle()returns a new object. + * If the group IS at capacity, then recycle()just returns the next object in line.

+ * + *

If you did NOT specify a maximum size for this group, + * then recycle()will employ what we're calling "grow-style" recycling. + * Recycle()will return either the first object with exists==false, + * or, finding none, add a new object to the array, + * doubling the size of the array if necessary.

+ * + *

WARNING:If this function needs to create a new object, + * and no object class was provided, it will return null + * instead of a valid object!

+ * + * @param ObjectClass The class type you want to recycle(e.g. FlxSprite, EvilRobot, etc). Do NOT "new" the class in the parameter! + * + * @return A reference to the object that was created. Don't forget to cast it back to the Class you want(e.g. myObject=myGroup.recycle(myObjectClass)as myObjectClass;). + */ + public function recycle(ObjectClass:Class=null):FlxBasic + { + var basic:FlxBasic; + if(_maxSize>0) + { + if(length<_maxSize) + { + if(ObjectClass==null) + return null; + return add(new DynamicClass()as FlxBasic); + } + else + { + basic=members[_marker++]; + if(_marker>=_maxSize) + _marker=0; + return basic; + } + } + else + { + basic=getFirstAvailable(ObjectClass); + if(basic !=null) + return basic; + if(ObjectClass==null) + return null; + return add(new DynamicClass()as FlxBasic); + } + } + + /** + * Removes an object from the group. + * + * @param Object TheFlxBasicyou want to remove. + * @param Splice Whether the object should be cut from the array entirely or not. + * + * @return The removed object. + */ + public function remove(Object:FlxBasic,Splice:Bool=false):FlxBasic + { + var index:Int=members.indexOf(Object); + if((index<0)||(index>=members.length)) + return null; + if(Splice) + { + members.splice(index,1); + length--; + } + else + members[index]=null; + return Dynamic; + } + + + public function move_to_front(Object:FlxBasic):Int { + var idx:Int=members.indexOf(Object); + if(idx==-1)return 0; + members.splice(idx, 1);// remove + //ad + members.splice(0, 0, Dynamic); + return 1; + } + + /** + * Replaces an existingFlxBasicwith a new one. + * + * @param OldObject The object you want to replace. + * @param NewObject The new object you want to use instead. + * + * @return The new object. + */ + public function replace(OldObject:FlxBasic,NewObject:FlxBasic):FlxBasic + { + var index:Int=members.indexOf(OldObject); + if((index<0)||(index>=members.length)) + return null; + members[index]=NewObject; + return NewObject; + } + + /** + * Call this function to sort the group according to a particular value and order. + * For example, to sort game objects for Zelda-style overlaps you might call + *myGroup.sort("y",ASCENDING)at the bottom of your + *FlxState.update()override. To sort all existing objects after + * a big explosion or bomb attack, you might callmyGroup.sort("exists",DESCENDING). + * + * @param Index TheStringname of the member variable you want to sort on. Default value is "y". + * @param Order AFlxGroupconstant that defines the sort order. Possible values areASCENDINGandDESCENDING. Default value isASCENDING. + */ + public function sort(Index:String="y",Order:Int=ASCENDING):Void + { + _sortIndex=Index; + _sortOrder=Order; + members.sort(sortHandler); + } + + /** + * Go through and set the specified variable to the specified value on all members of the group. + * + * @param VariableName The string representation of the variable name you want to modify, for example "visible" or "scrollFactor". + * @param Value The value you want to assign to that variable. + * @param Recurse Default value is true, meaning ifsetAll()encounters a member that is a group, it will callsetAll()on that group rather than modifying its variable. + */ + public function setAll(VariableName:String,Value:Dynamic,Recurse:Bool=true):Void + { + var basic:FlxBasic; + var i:Int=0; + while(icallAll()encounters a member that is a group, it will callcallAll()on that group rather than calling the group's function. + */ + public function callAll(FunctionName:String,Recurse:Bool=true):Void + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasiccurrently flagged as not existing. + */ + public function getFirstAvailable(ObjectClass:Class=null):FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iintindicating the first null slot in the group. + */ + public function getFirstNull():Int + { + var basic:FlxBasic; + var i:Int=0; + var l:Int=members.length; + while(iFlxBasiccurrently flagged as existing. + */ + public function getFirstExtant():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasiccurrently flagged as not dead. + */ + public function getFirstAlive():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(i=0;i--){ + if(members[i] !=null){ + basic=members[i] as FlxBasic; + if(basic.alive)return basic; + } + } + return null; + } + /** + * Call this function to retrieve the first object with dead==true in the group. + * This is handy for checking if everything's wiped out, or choosing a squad leader, etc. + * + * @return AFlxBasiccurrently flagged as dead. + */ + public function getFirstDead():FlxBasic + { + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasics flagged as not dead. Returns -1 if group is empty. + */ + public function countLiving():Int + { + var count:Int=-1; + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasics flagged as dead. Returns -1 if group is empty. + */ + public function countDead():Int + { + var count:Int=-1; + var basic:FlxBasic; + var i:Int=0; + while(iFlxBasicfrom the members list. + */ + public function getRandom(StartIndex:Int=0,Length:Int=0):FlxBasic + { + if(Length==0) + Length=length; + return FlxG.getRandom(members,StartIndex,Length)as FlxBasic; + } + + /** + * Remove all instances ofFlxBasicsubclass(FlxSprite, FlxBlock, etc)from the list. + * WARNING:does not destroy()or kill()any of these objects! + */ + public function clear():Void + { + length=members.length=0; + } + + /** + * Calls kill on the group's members and then on the group itself. + */ + override public function kill():Void + { + var basic:FlxBasic; + var i:Int=0; + while(iObj2[_sortIndex]) + return -_sortOrder; + return 0; + } + + public function set_draw_ref(s:FlxSprite):Void { + draw_root=s; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxObject.hx b/intra/source/org/flixel/FlxObject.hx new file mode 100644 index 0000000..c7fd835 --- /dev/null +++ b/intra/source/org/flixel/FlxObject.hx @@ -0,0 +1,1182 @@ +package org.flixel; + +import entity.player.Player; +import flash.display.Graphics; +import flash.display.Sprite; +import flash.geom.Point; + +import org.flixel.FlxBasic; + +/** + * This is the base class for most of the display objects(FlxSprite,FlxText, etc). + * It includes some basic attributes about game objects, including retro-style flickering, + * basic state information, sizes, scrolling, and basic physics and motion. + * + * @author Adam Atomic + */ +class FlxObject extends FlxBasic +{ + /** + * Generic value for "left" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var LEFT:Int =0x0001; + /** + * Generic value for "right" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var RIGHT:Int =0x0010; + /** + * Generic value for "up" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var UP:Int =0x0100; + /** + * Generic value for "down" Used byfacing,allowCollisions, andtouching. + */ + static public static inline var DOWN:Int =0x1000; + + /** + * Special-case constant meaning no collisions, used mainly byallowCollisionsandtouching. + */ + static public static inline var NONE:Int =0; + /** + * Special-case constant meaning up, used mainly byallowCollisionsandtouching. + */ + static public static inline var CEILING:Int=UP; + /** + * Special-case constant meaning down, used mainly byallowCollisionsandtouching. + */ + static public static inline var FLOOR:Int =DOWN; + /** + * Special-case constant meaning only the left and right sides, used mainly byallowCollisionsandtouching. + */ + static public static inline var WALL:Int =LEFT | RIGHT; + /** + * Special-case constant meaning any direction, used mainly byallowCollisionsandtouching. + */ + static public static inline var ANY:Int =LEFT | RIGHT | UP | DOWN; + + /** + * Handy constant used during collision resolution(seeseparateX()andseparateY()). + */ + static public static inline var OVERLAP_BIAS:Float=4; + + /** + * Path behavior controls:move from the start of the path to the end then stop. + */ + static public static inline var PATH_FORWARD:Int =0x000000; + /** + * Path behavior controls:move from the end of the path to the start then stop. + */ + static public static inline var PATH_BACKWARD:Int =0x000001; + /** + * Path behavior controls:move from the start of the path to the end then directly back to the start, and start over. + */ + static public static inline var PATH_LOOP_FORWARD:Int =0x000010; + /** + * Path behavior controls:move from the end of the path to the start then directly back to the end, and start over. + */ + static public static inline var PATH_LOOP_BACKWARD:Int =0x000100; + /** + * Path behavior controls:move from the start of the path to the end then turn around and go back to the start, over and over. + */ + static public static inline var PATH_YOYO:Int =0x001000; + /** + * Path behavior controls:ignores any vertical component to the path data, only follows side to side. + */ + static public static inline var PATH_HORIZONTAL_ONLY:Int =0x010000; + /** + * Path behavior controls:ignores any horizontal component to the path data, only follows up and down. + */ + static public static inline var PATH_VERTICAL_ONLY:Int =0x100000; + + /** + * X position of the upper left corner of this object in world space. + */ + public var x:Float; + /** + * Y position of the upper left corner of this object in world space. + */ + public var y:Float; + public var y_bottom:Int;//used for sorting + /** + * The width of this object. + */ + public var width:Float; + /** + * The height of this object. + */ + public var height:Float; + + /** + * Whether an object will move/alter position after a collision. + */ + public var immovable:Bool; + + /** + * The basic speed of this object. + */ + public var velocity:FlxPoint; + /** + * The virtual mass of the object. Default value is 1. + * Currently only used withelasticityduring collision resolution. + * Change at your own risk;effects seem crazy unpredictable so far! + */ + public var mass:Float; + /** + * The bounciness of this object. Only affects collisions. Default value is 0, or "not bouncy at all." + */ + public var elasticity:Float; + /** + * How fast the speed of this object is changing. + * Useful for smooth movement and gravity. + */ + public var acceleration:FlxPoint; + /** + * This isn't drag exactly, more like deceleration that is only applied + * when acceleration is not affecting the sprite. + */ + public var drag:FlxPoint; + /** + * If you are usingacceleration, you can usemaxVelocitywith it + * to cap the speed automatically(very useful!). + */ + public var maxVelocity:FlxPoint; + /** + * Set the angle of a sprite to rotate it. + * WARNING:rotating sprites decreases rendering + * performance for this sprite by a factor of 10x! + */ + public var angle:Float; + /** + * This is how fast you want this sprite to spin. + */ + public var angularVelocity:Float; + /** + * How fast the spin speed should change. + */ + public var angularAcceleration:Float; + /** + * Likedragbut for spinning. + */ + public var angularDrag:Float; + /** + * Use in conjunction withangularAccelerationfor fluid spin speed control. + */ + public var maxAngular:Float; + /** + * Should always represent(0,0)- useful for different things, for avoiding unnecessarynewcalls. + */ + static protected var _pZero:FlxPoint=new FlxPoint(); + + /** + * A point that can store numbers from 0 to 1(for X and Y independently) + * that governs how much this object is affected by the camera subsystem. + * 0 means it never moves, like a HUD element or far background graphic. + * 1 means it scrolls along a the same speed as the foreground layer. + * scrollFactor is initialized as(1,1)by default. + */ + public var scrollFactor:FlxPoint; + /** + * Internal helper used for retro-style flickering. + */ + private var _flicker:Bool; + /** + * Internal helper used for retro-style flickering. + */ + private var _flickerTimer:Float; + /** + * Handy for storing health percentage or armor points or whatever. + */ + public var health:Float; + /** + * This is just a pre-allocated x-y point container to be used however you like + */ + private var _point:FlxPoint; + /** + * This is just a pre-allocated rectangle container to be used however you like + */ + private var _rect:FlxRect; + /** + * Set this to false if you want to skip the automatic motion/movement stuff(seeupdateMotion()). + * FlxObject and FlxSprite default to true. + * FlxText, FlxTileblock, FlxTilemap and FlxSound default to false. + */ + public var moves:Bool; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating surface contacts. + * Use bitwise operators to check the values stored here, or use touching(), justStartedTouching(), etc. + * You can even use them broadly as boolean values if you're feeling saucy! + */ + public var touching:Int; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating surface contacts from the previous game loop step. + * Use bitwise operators to check the values stored here, or use touching(), justStartedTouching(), etc. + * You can even use them broadly as boolean values if you're feeling saucy! + */ + public var wasTouching:Int; + /** + * Bit field of flags(use with UP, DOWN, LEFT, RIGHT, etc)indicating collision directions. + * Use bitwise operators to check the values stored here. + * Useful for things like one-way platforms(e.g. allowCollisions=UP;) + * The accessor "solid" just flips this variable between NONE and ANY. + */ + public var allowCollisions:Int; + + /** + * Important variable for collision processing. + * By default this value is set automatically duringpreUpdate(). + */ + public var last:FlxPoint; + + /** + * A reference to a path object. Null by default, assigned byfollowPath(). + */ + public var path:FlxPath; + /** + * The speed at which the object is moving on the path. + * When an object completes a non-looping path circuit, + * the pathSpeed will be zeroed out, but thepathreference + * will NOT be nulled out. SopathSpeedis a good way + * to check if this object is currently following a path or not. + */ + public var pathSpeed:Float; + /** + * The angle in degrees between this object and the next node, where 0 is directly upward, and 90 is to the right. + */ + public var pathAngle:Float; + /** + * Internal helper, tracks which node of the path this object is moving toward. + */ + private var _pathNodeIndex:Int; + /** + * Internal tracker for path behavior flags(like looping, horizontal only, etc). + */ + private var _pathMode:Int; + /** + * Internal helper for node navigation, specifically yo-yo and backwards movement. + */ + private var _pathInc:Int; + /** + * Internal flag for whether hte object's angle should be adjusted to the path angle during path follow behavior. + */ + private var _pathRotate:Bool; + + /** + * Instantiates aFlxObject. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + */ + public function new(X:Float=0,Y:Float=0,Width:Float=0,Height:Float=0) + { + x=X; + y=Y; + last=new FlxPoint(x,y); + width=Width; + height=Height; + mass=1.0; + elasticity=0.0; + + health=1; + + immovable=false; + moves=true; + + touching=NONE; + wasTouching=NONE; + allowCollisions=ANY; + + velocity=new FlxPoint(); + acceleration=new FlxPoint(); + drag=new FlxPoint(); + maxVelocity=new FlxPoint(10000,10000); + + angle=0; + angularVelocity=0; + angularAcceleration=0; + angularDrag=0; + maxAngular=10000; + + scrollFactor=new FlxPoint(1.0,1.0); + _flicker=false; + _flickerTimer=0; + + _point=new FlxPoint(); + _rect=new FlxRect(); + + path=null; + pathSpeed=0; + pathAngle=0; + } + + /** + * Override this function to null out variables or + * manually call destroy()on class members if necessary. + * Don't forget to call super.destroy()! + */ + override public function destroy():Void + { + velocity=null; + acceleration=null; + drag=null; + maxVelocity=null; + scrollFactor=null; + _point=null; + _rect=null; + last=null; + cameras=null; + if(path !=null) + path.destroy(); + path=null; + } + + /** + * Pre-update is called right beforeupdate()on each object in the game loop. + * InFlxObjectit controls the flicker timer, + * tracking the last coordinates for collision purposes, + * and checking if the object is moving along a path or not. + */ + override public function preUpdate():Void + { + _ACTIVECOUNT++; + + if(_flickerTimer !=0) + { + if(_flickerTimer>0) + { + _flickerTimer=_flickerTimer - FlxG.elapsed; + if(_flickerTimer<=0) + { + _flickerTimer=0; + _flicker=false; + } + } + } + + if(last !=null){ + last.x=x; + last.y=y; + } + + if((path !=null)&&(pathSpeed !=0)&&(path.nodes[_pathNodeIndex] !=null)) + updatePathMotion(); + } + + /** + * Post-update is called right afterupdate()on each object in the game loop. + * InFlxObjectthis function handles Integrating the objects motion + * based on the velocity and acceleration settings, and tracking/clearing thetouchingflags. + */ + override public function postUpdate():Void + { + if(moves) + updateMotion(); + + wasTouching=touching; + touching=NONE; + } + + /** + * Internal function for updating the position and speed of this object. + * Useful for cases when you need to update this but are buried down in too many supers. + * Does a slightly fancier-than-normal Integration to help with higher fidelity framerate-independenct motion. + */ + private function updateMotion():Void + { + var delta:Float; + var velocityDelta:Float; + + velocityDelta=(FlxU.computeVelocity(angularVelocity,angularAcceleration,angularDrag,maxAngular)- angularVelocity)/2; + angularVelocity +=velocityDelta; + angle +=angularVelocity*FlxG.elapsed; + angularVelocity +=velocityDelta; + + velocityDelta=(FlxU.computeVelocity(velocity.x,acceleration.x,drag.x,maxVelocity.x)- velocity.x)/2; + velocity.x +=velocityDelta; + delta=velocity.x*FlxG.elapsed; + velocity.x +=velocityDelta; + x +=delta; + + velocityDelta=(FlxU.computeVelocity(velocity.y,acceleration.y,drag.y,maxVelocity.y)- velocity.y)/2; + velocity.y +=velocityDelta; + delta=velocity.y*FlxG.elapsed; + velocity.y +=velocityDelta; + y +=delta; + } + + /** + * Rarely called, and in this case just increments the visible objects count and callsdrawDebug()if necessary. + */ + override public function draw():Void + { + if(cameras==null) + cameras=FlxG.cameras; + var camera:FlxCamera; + var i:Int=0; + var l:Int=cameras.length; + while(i0)?0.0000001:-0.0000001)); + boundingBoxY=Std.int(boundingBoxY +((boundingBoxY>0)?0.0000001:-0.0000001)); + var boundingBoxWidth:Int=(width !=Std.int(width))?width:width-1; + var boundingBoxHeight:Int=(height !=Std.int(height))?height:height-1; + + //fill static graphics object with square shape + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + gfx.moveTo(boundingBoxX,boundingBoxY); + var boundingBoxColor:Int; + if(allowCollisions) + { + if(allowCollisions !=ANY) + boundingBoxColor=FlxG.PINK; + if(immovable) + boundingBoxColor=FlxG.GREEN; + else + boundingBoxColor=FlxG.RED; + } + else + boundingBoxColor=FlxG.BLUE; + gfx.lineStyle(1,boundingBoxColor,0.5); + gfx.lineTo(boundingBoxX+boundingBoxWidth,boundingBoxY); + gfx.lineTo(boundingBoxX+boundingBoxWidth,boundingBoxY+boundingBoxHeight); + gfx.lineTo(boundingBoxX,boundingBoxY+boundingBoxHeight); + gfx.lineTo(boundingBoxX,boundingBoxY); + + //draw graphics shape to camera buffer + Camera.buffer.draw(FlxG.flashGfxSprite); + } + + /** + * Call this function to give this object a path to follow. + * If the path does not have at least one node in it, this function + * will log a warning message and return. + * + * @param Path TheFlxPathyou want this object to follow. + * @param Speed How fast to travel along the path in pixels per second. + * @param Mode Optional, controls the behavior of the object following the path using the path behavior constants. Can use multiple flags at once, for example PATH_YOYO|PATH_HORIZONTAL_ONLY will make an object move back and forth along the X axis of the path only. + * @param AutoRotate Automatically point the object toward the next node. Assumes the graphic is pointing upward. Default behavior is false, or no automatic rotation. + */ + public function followPath(Path:FlxPath,Speed:Float=100,Mode:Int=PATH_FORWARD,AutoRotate:Bool=false):Void + { + if(Path.nodes.length<=0) + { + FlxG.log("WARNING:Paths need at least one node in them to be followed."); + return; + } + + path=Path; + pathSpeed=FlxU.abs(Speed); + _pathMode=Mode; + _pathRotate=AutoRotate; + + //get starting node + if((_pathMode==PATH_BACKWARD)||(_pathMode==PATH_LOOP_BACKWARD)) + { + _pathNodeIndex=path.nodes.length-1; + _pathInc=-1; + } + else + { + _pathNodeIndex=0; + _pathInc=1; + } + } + + /** + * Tells this object to stop following the path its on. + * + * @param DestroyPath Tells this function whether to call destroy on the path object. Default value is false. + */ + public function stopFollowingPath(DestroyPath:Bool=false):Void + { + pathSpeed=0; + if(DestroyPath &&(path !=null)) + { + path.destroy(); + path=null; + } + } + + /** + * Internal function that decides what node in the path to aim for next based on the behavior flags. + * + * @return The node(aFlxPointobject)we are aiming for next. + */ + private function advancePath(Snap:Bool=true):FlxPoint + { + if(Snap) + { + var oldNode:FlxPoint=path.nodes[_pathNodeIndex]; + if(oldNode !=null) + { + if((_pathMode & PATH_VERTICAL_ONLY)==0) + x=oldNode.x - width*0.5; + if((_pathMode & PATH_HORIZONTAL_ONLY)==0) + y=oldNode.y - height*0.5; + } + } + + _pathNodeIndex +=_pathInc; + + if((_pathMode & PATH_BACKWARD)>0) + { + if(_pathNodeIndex<0) + { + _pathNodeIndex=0; + pathSpeed=0; + } + } + else if((_pathMode & PATH_LOOP_FORWARD)>0) + { + if(_pathNodeIndex>=path.nodes.length) + _pathNodeIndex=0; + } + else if((_pathMode & PATH_LOOP_BACKWARD)>0) + { + if(_pathNodeIndex<0) + { + _pathNodeIndex=path.nodes.length-1; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + } + } + else if((_pathMode & PATH_YOYO)>0) + { + if(_pathInc>0) + { + if(_pathNodeIndex>=path.nodes.length) + { + _pathNodeIndex=path.nodes.length-2; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + _pathInc=-_pathInc; + } + } + else if(_pathNodeIndex<0) + { + _pathNodeIndex=1; + if(_pathNodeIndex>=path.nodes.length) + _pathNodeIndex=path.nodes.length-1; + if(_pathNodeIndex<0) + _pathNodeIndex=0; + _pathInc=-_pathInc; + } + } + else + { + if(_pathNodeIndex>=path.nodes.length) + { + _pathNodeIndex=path.nodes.length-1; + pathSpeed=0; + } + } + + return path.nodes[_pathNodeIndex]; + } + + /** + * Internal function for moving the object along the path. + * Generally this function is called automatically bypreUpdate(). + * The first half of the function decides if the object can advance to the next node in the path, + * while the second half handles actually picking a velocity toward the next node. + */ + private function updatePathMotion():Void + { + //first check if we need to be pointing at the next node yet + _point.x=x + width*0.5; + _point.y=y + height*0.5; + var node:FlxPoint=path.nodes[_pathNodeIndex]; + var deltaX:Float=node.x - _point.x; + var deltaY:Float=node.y - _point.y; + + var horizontalOnly:Bool=(_pathMode & PATH_HORIZONTAL_ONLY)>0; + var verticalOnly:Bool=(_pathMode & PATH_VERTICAL_ONLY)>0; + + if(horizontalOnly) + { + if(((deltaX>0)?deltaX:-deltaX)0)?deltaY:-deltaY)FlxObjectoverlaps thisFlxObjectorFlxGroup. + * If the group has a LOT of things in it, it might be faster to useFlxG.overlaps(). + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + public function overlaps(ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + //bug? + while(ix)&&(object.xy)&&(object.y_point.x)&&(objectScreenPos.x<_point.x + width)&& + (objectScreenPos.y + object.height>_point.y)&&(objectScreenPos.y<_point.y + height); + } + + /** + * Checks to see if thisFlxObjectwere located at the given position, would it overlap theFlxObjectorFlxGroup? + * This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size Into account. + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param X The X position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param Y The Y position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + public function overlapsAt(X:Float,Y:Float,ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iX)&&(object.xY)&&(object.y0)?0.0000001:-0.0000001; + _point.y +=(_point.y>0)?0.0000001:-0.0000001; + return (objectScreenPos.x + object.width>_point.x)&&(objectScreenPos.x<_point.x + width)&& + (objectScreenPos.y + object.height>_point.y)&&(objectScreenPos.y<_point.y + height); + } + + /** + * Checks to see if a point in 2D world space overlaps thisFlxObjectobject. + * + * @param Point The point in world space you want to check. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + public function overlapsPoint(Point:FlxPoint,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(!InScreenSpace) + return(Point.x>x)&&(Point.xy)&&(Point.y_point.x)&&(X<_point.x+width)&&(Y>_point.y)&&(Y<_point.y+height); + } + + /** + * Check and see if this object is currently on screen. + * + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether the object is on screen or not. + */ + public function onScreen(Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point,Camera); + return(_point.x + width>0)&&(_point.x0)&&(_point.yFlxPointobject and assigns the post-scrolled X and Y values of this object to it. + * + * @return ThePointyou passed in, or a newPointif you didn't pass one, containing the screen X and Y position of this object. + */ + public function getScreenXY(Point:FlxPoint=null,Camera:FlxCamera=null):FlxPoint + { + if(Point==null) + Point=new FlxPoint(); + if(Camera==null) + Camera=FlxG.camera; + Point.x=x - Std.int(Camera.scroll.x*scrollFactor.x); + Point.y=y - Std.int(Camera.scroll.y*scrollFactor.y); + Point.x +=(Point.x>0)?0.0000001:-0.0000001; + Point.y +=(Point.y>0)?0.0000001:-0.0000001; + return Point; + } + + /** + * Tells this object to flicker, retro-style. + * Pass a negative value to flicker forever. + * + * @param Duration How many seconds to flicker for. + */ + public function flicker(Duration:Float=1):Void + { + _flickerTimer=Duration; + if(_flickerTimer==0) + _flicker=false; + } + + /** + * Check to see if the object is still flickering. + * + * @return Whether the object is flickering or not. + */ + public var flickering(get_flickering, set_flickering):Bool; + private function get_flickering():Bool + { + return _flickerTimer !=0; + } + + /** + * Whether the object collides or not. For more control over what directions + * the object will collide from, use collision constants(like LEFT, FLOOR, etc) + * to set the value of allowCollisions directly. + */ + public var solid(get_solid, set_solid):Bool; + private function get_solid():Bool + { + return(allowCollisions & ANY)>NONE; + } + + /** + * @private + */ + private function set_solid(Solid:Bool):Void + { + if(Solid) + allowCollisions=ANY; + else + allowCollisions=NONE; + } + + /** + * Retrieve the midpoint of this object in world coordinates. + * + * @Point Allows you to pass in an existingFlxPointobject if you're so inclined. Otherwise a new one is created. + * + * @return AFlxPointobject containing the midpoint of this object in world coordinates. + */ + public function getMidpoint(Point:FlxPoint=null):FlxPoint + { + if(Point==null) + Point=new FlxPoint(); + Point.x=x + width*0.5; + Point.y=y + height*0.5; + return Point; + } + + /** + * Handy function for reviving game objects. + * Resets their existence flags and position. + * + * @param X The new X position of this object. + * @param Y The new Y position of this object. + */ + public function reset(X:Float,Y:Float):Void + { + revive(); + touching=NONE; + wasTouching=NONE; + x=X; + y=Y; + last.x=x; + last.y=y; + velocity.x=0; + velocity.y=0; + } + + /** + * Handy function for checking if this object is touching a particular surface. + * For slightly better performance you can just &the value directly Intotouching. + * However, this method is good for readability and accessibility. + * + * @param Direction Any of the collision flags(e.g. LEFT, FLOOR, etc). + * + * @return Whether the object is touching an object in(any of)the specified direction(s)this frame. + */ + public function isTouching(Direction:Int):Bool + { + return(touching & Direction)>NONE; + } + + /** + * Handy function for checking if this object is just landed on a particular surface. + * + * @param Direction Any of the collision flags(e.g. LEFT, FLOOR, etc). + * + * @return Whether the object just landed on(any of)the specified surface(s)this frame. + */ + public function justTouched(Direction:Int):Bool + { + return((touching & Direction)>NONE)&&((wasTouching & Direction)<=NONE); + } + + /** + * Reduces the "health" variable of this sprite by the amount specified in Damage. + * Calls kill()if health drops to or below zero. + * + * @param Damage How much health to take away(use a negative number to give a health bonus). + */ + public function hurt(Damage:Float):Void + { + health=health - Damage; + if(health<=0) + kill(); + } + + /** + * The main collision resolution function in flixel. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated. + */ + static public function separate(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + var separatedX:Bool=separateX(Object1,Object2); + var separatedY:Bool=separateY(Object1,Object2); + return separatedX || separatedY; + } + + /** + * The X-axis component of the object separation process. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated along the X axis. + */ + static public function separateX(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + //can't separate two immovable objects + var obj1immovable:Bool=Object1.immovable; + var obj2immovable:Bool=Object2.immovable; + if(obj1immovable && obj2immovable) + return false; + + //If one of the objects is a tilemap, just pass it off. + if(Std.is(Object1, FlxTilemap)) + return(Object1 as FlxTilemap).overlapsWithCallback(Object2,separateX); + if(Std.is(Object2, FlxTilemap)) + return(Object2 as FlxTilemap).overlapsWithCallback(Object1,separateX,true); + + //First, get the two object deltas + var overlap:Float=0; + var obj1delta:Float=Object1.x - Dynamic1.last.x; + var obj2delta:Float=Object2.x - Dynamic2.last.x; + if(obj1delta !=obj2delta) + { + //Check if the X hulls actually overlap + var obj1deltaAbs:Float=(obj1delta>0)?obj1delta:-obj1delta; + var obj2deltaAbs:Float=(obj2delta>0)?obj2delta:-obj2delta; + var obj1rect:FlxRect=new FlxRect(Object1.x-((obj1delta>0)?obj1delta:0),Object1.last.y,Object1.width+((obj1delta>0)?obj1delta:-obj1delta),Object1.height); + var obj2rect:FlxRect=new FlxRect(Object2.x-((obj2delta>0)?obj2delta:0),Object2.last.y,Object2.width+((obj2delta>0)?obj2delta:-obj2delta),Object2.height); + if((obj1rect.x + obj1rect.width>obj2rect.x)&&(obj1rect.xobj2rect.y)&&(obj1rect.yobj2delta) + { + overlap=Object1.x + Dynamic1.width - Dynamic2.x; + if((overlap>maxOverlap)|| !(Object1.allowCollisions & RIGHT)|| !(Object2.allowCollisions & LEFT)) + overlap=0; + else + { + Object1.touching |=RIGHT; + Object2.touching |=LEFT; + } + } + else if(obj1deltamaxOverlap)|| !(Object1.allowCollisions & LEFT)|| !(Object2.allowCollisions & RIGHT)) + overlap=0; + else + { + Object1.touching |=LEFT; + Object2.touching |=RIGHT; + } + } + } + } + + //Then adjust their positions and velocities accordingly(if there was any overlap) + if(overlap !=0) + { + var obj1v:Float=Object1.velocity.x; + var obj2v:Float=Object2.velocity.x; + + if(!obj1immovable && !obj2immovable) + { + overlap *=0.5; + Object1.x=Object1.x - overlap; + Object2.x +=overlap; + + var obj1velocity:Float=Math.sqrt((obj2v * obj2v * Dynamic2.mass)/Object1.mass)*((obj2v>0)?1:-1); + var obj2velocity:Float=Math.sqrt((obj1v * obj1v * Dynamic1.mass)/Object2.mass)*((obj1v>0)?1:-1); + var average:Float=(obj1velocity + obj2velocity)*0.5; + obj1velocity -=average; + obj2velocity -=average; + Object1.velocity.x=average + obj1velocity * Dynamic1.elasticity; + Object2.velocity.x=average + obj2velocity * Dynamic2.elasticity; + } + else if(!obj1immovable) + { + Object1.x=Object1.x - overlap; + Object1.velocity.x=obj2v - obj1v*Object1.elasticity; + } + else if(!obj2immovable) + { + Object2.x +=overlap; + Object2.velocity.x=obj1v - obj2v*Object2.elasticity; + } + return true; + } + else + return false; + } + + /** + * The Y-axis component of the object separation process. + * + * @param Object1 AnyFlxObject. + * @param Object2 Any otherFlxObject. + * + * @return Whether the objects in fact touched and were separated along the Y axis. + */ + static public function separateY(Object1:FlxObject, Dynamic2:FlxObject):Bool + { + //can't separate two immovable objects + var obj1immovable:Bool=Object1.immovable; + var obj2immovable:Bool=Object2.immovable; + if(obj1immovable && obj2immovable) + return false; + + //If one of the objects is a tilemap, just pass it off. + if(Std.is(Object1, FlxTilemap)) + return(Object1 as FlxTilemap).overlapsWithCallback(Object2,separateY); + if(Std.is(Object2, FlxTilemap)) + return(Object2 as FlxTilemap).overlapsWithCallback(Object1,separateY,true); + + //First, get the two object deltas + var overlap:Float=0; + var obj1delta:Float=Object1.y - Dynamic1.last.y; + var obj2delta:Float=Object2.y - Dynamic2.last.y; + if(obj1delta !=obj2delta) + { + //Check if the Y hulls actually overlap + var obj1deltaAbs:Float=(obj1delta>0)?obj1delta:-obj1delta; + var obj2deltaAbs:Float=(obj2delta>0)?obj2delta:-obj2delta; + var obj1rect:FlxRect=new FlxRect(Object1.x,Object1.y-((obj1delta>0)?obj1delta:0),Object1.width,Object1.height+obj1deltaAbs); + var obj2rect:FlxRect=new FlxRect(Object2.x,Object2.y-((obj2delta>0)?obj2delta:0),Object2.width,Object2.height+obj2deltaAbs); + if((obj1rect.x + obj1rect.width>obj2rect.x)&&(obj1rect.xobj2rect.y)&&(obj1rect.yobj2delta) + { + overlap=Object1.y + Dynamic1.height - Dynamic2.y; + if((overlap>maxOverlap)|| !(Object1.allowCollisions & DOWN)|| !(Object2.allowCollisions & UP)) + overlap=0; + else + { + Object1.touching |=DOWN; + Object2.touching |=UP; + } + } + else if(obj1deltamaxOverlap)|| !(Object1.allowCollisions & UP)|| !(Object2.allowCollisions & DOWN)) + overlap=0; + else + { + Object1.touching |=UP; + Object2.touching |=DOWN; + } + } + } + } + + //Then adjust their positions and velocities accordingly(if there was any overlap) + if(overlap !=0) + { + var obj1v:Float=Object1.velocity.y; + var obj2v:Float=Object2.velocity.y; + + if(!obj1immovable && !obj2immovable) + { + overlap *=0.5; + Object1.y=Object1.y - overlap; + Object2.y +=overlap; + + var obj1velocity:Float=Math.sqrt((obj2v * obj2v * Dynamic2.mass)/Object1.mass)*((obj2v>0)?1:-1); + var obj2velocity:Float=Math.sqrt((obj1v * obj1v * Dynamic1.mass)/Object2.mass)*((obj1v>0)?1:-1); + var average:Float=(obj1velocity + obj2velocity)*0.5; + obj1velocity -=average; + obj2velocity -=average; + Object1.velocity.y=average + obj1velocity * Dynamic1.elasticity; + Object2.velocity.y=average + obj2velocity * Dynamic2.elasticity; + } + else if(!obj1immovable) + { + Object1.y=Object1.y - overlap; + Object1.velocity.y=obj2v - obj1v*Object1.elasticity; + //This is special case code that handles cases like horizontal moving platforms you can ride + if(Object2.active && Dynamic2.moves &&(obj1delta>obj2delta)) + Object1.x +=Object2.x - Dynamic2.last.x; + } + else if(!obj2immovable) + { + Object2.y +=overlap; + Object2.velocity.y=obj1v - obj2v*Object2.elasticity; + //This is special case code that handles cases like horizontal moving platforms you can ride + if(Object1.active && Dynamic1.moves &&(obj1deltaFlxSpriteto have slightly more specialized behavior + * common to many game scenarios. You can override and extend this class + * just like you wouldFlxSprite. WhileFlxEmitter + * used to work with just any old sprite, it now requires a + *FlxParticlebased class. + * + * @author Adam Atomic + */ +class FlxParticle extends FlxSprite +{ + /** + * How long this particle lives before it disappears. + * NOTE:this is a maximum, not a minimum;the object + * could get recycled before its lifespan is up. + */ + public var lifespan:Float; + + /** + * Determines how quickly the particles come to rest on the ground. + * Only used if the particle has gravity-like acceleration applied. + * @default 500 + */ + public var friction:Float; + + /** + * Instantiate a new particle. LikeFlxSprite, all meaningful creation + * happens duringloadGraphic()ormakeGraphic()or whatever. + */ + public function new() + { + super(); + lifespan=0; + friction=500; + } + + /** + * The particle's main update logic. Basically it checks to see if it should + * be dead yet, and then has some special bounce behavior if there is some gravity on it. + */ + override public function update():Void + { + //lifespan behavior + if(lifespan<=0) + return; + lifespan -=FlxG.elapsed; + if(lifespan<=0) + kill(); + + //simpler bounce/spin behavior for now + if(touching) + { + if(angularVelocity !=0) + angularVelocity=-angularVelocity; + } + if(acceleration.y>0)//special behavior for particles with gravity + { + if(touching & FLOOR) + { + drag.x=friction; + + if(!(wasTouching & FLOOR)) + { + if(velocity.y<-elasticity*10) + { + if(angularVelocity !=0) + angularVelocity *=-elasticity; + } + else + { + velocity.y=0; + angularVelocity=0; + } + } + } + else + drag.x=0; + } + } + + /** + * Triggered whenever this object is launched by aFlxEmitter. + * You can override this to add custom behavior like a sound or AI or something. + */ + public function onEmit():Void + { + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxPath.hx b/intra/source/org/flixel/FlxPath.hx new file mode 100644 index 0000000..52c0db9 --- /dev/null +++ b/intra/source/org/flixel/FlxPath.hx @@ -0,0 +1,280 @@ +package org.flixel; + +import flash.display.Graphics; + +import org.flixel.plugin.DebugPathDisplay; + +/** + * This is a simple path data container. Basically a list of points that + * aFlxObjectcan follow. Also has code for drawing debug visuals. + *FlxTilemap.findPath()returns a path object, but you can + * also just make your own, using theadd()functions below + * or by creating your own array of points. + * + * @author Adam Atomic + */ +class FlxPath +{ + /** + * The list ofFlxPoints that make up the path data. + */ + public var nodes:Array; + /** + * Specify a debug display color for the path. Default is white. + */ + public var debugColor:Int; + /** + * Specify a debug display scroll factor for the path. Default is(1,1). + * NOTE:does not affect world movement! Dynamic scroll factors take care of that. + */ + public var debugScrollFactor:FlxPoint; + /** + * Setting this to true will prevent the object from appearing + * when the visual debug mode in the debugger overlay is toggled on. + * @default false + */ + public var ignoreDrawDebug:Bool; + + /** + * Internal helper for keeping new variable instantiations under control. + */ + private var _point:FlxPoint; + + /** + * Instantiate a new path object. + * + * @param Nodes Optional, can specify all the points for the path up front if you want. + */ + public function new(Nodes:Array=null) + { + if(Nodes==null) + nodes=new Array(); + else + nodes=Nodes; + _point=new FlxPoint(); + debugScrollFactor=new FlxPoint(1.0,1.0); + debugColor=0xffffff; + ignoreDrawDebug=false; + + var debugPathDisplay:DebugPathDisplay=manager; + if(debugPathDisplay !=null) + debugPathDisplay.add(this); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + var debugPathDisplay:DebugPathDisplay=manager; + if(debugPathDisplay !=null) + debugPathDisplay.remove(this); + + debugScrollFactor=null; + _point=null; + nodes=null; + } + + /** + * Add a new node to the end of the path at the specified location. + * + * @param X X position of the new path point in world coordinates. + * @param Y Y position of the new path point in world coordinates. + */ + public function add(X:Float,Y:Float):Void + { + nodes.push(new FlxPoint(X,Y)); + } + + /** + * Add a new node to the path at the specified location and index within the path. + * + * @param X X position of the new path point in world coordinates. + * @param Y Y position of the new path point in world coordinates. + * @param Index Where within the list of path nodes to insert this new point. + */ + public function addAt(X:Float, Y:Float, Index:Int):Void + { + if(Index>nodes.length) + Index=nodes.length; + nodes.splice(Index,0,new FlxPoint(X,Y)); + } + + /** + * Sometimes its easier or faster to just pass a point object instead of separate X and Y coordinates. + * This also gives you the option of not creating a new node but actually adding that specific + *FlxPointobject to the path. This allows you to do neat things, like dynamic paths. + * + * @param Node The point in world coordinates you want to add to the path. + * @param AsReference Whether to add the point as a reference, or to create a new point with the specified values. + */ + public function addPoint(Node:FlxPoint,AsReference:Bool=false):Void + { + if(AsReference) + nodes.push(Node); + else + nodes.push(new FlxPoint(Node.x,Node.y)); + } + + /** + * Sometimes its easier or faster to just pass a point object instead of separate X and Y coordinates. + * This also gives you the option of not creating a new node but actually adding that specific + *FlxPointobject to the path. This allows you to do neat things, like dynamic paths. + * + * @param Node The point in world coordinates you want to add to the path. + * @param Index Where within the list of path nodes to insert this new point. + * @param AsReference Whether to add the point as a reference, or to create a new point with the specified values. + */ + public function addPointAt(Node:FlxPoint,Index:Int,AsReference:Bool=false):Void + { + if(Index>nodes.length) + Index=nodes.length; + if(AsReference) + nodes.splice(Index,0,Node); + else + nodes.splice(Index,0,new FlxPoint(Node.x,Node.y)); + } + + /** + * Remove a node from the path. + * NOTE:only works with points added by reference or with references fromnodesitself! + * + * @param Node The point object you want to remove from the path. + * + * @return The node that was excised. Returns null if the node was not found. + */ + public function remove(Node:FlxPoint):FlxPoint + { + var index:Int=nodes.indexOf(Node); + if(index>=0) + return nodes.splice(index,1)[0]; + else + return null; + } + + /** + * Remove a node from the path using the specified position in the list of path nodes. + * + * @param Index Where within the list of path nodes you want to remove a node. + * + * @return The node that was excised. Returns null if there were no nodes in the path. + */ + public function removeAt(Index:Int):FlxPoint + { + if(nodes.length<=0) + return null; + if(Index>=nodes.length) + Index=nodes.length-1; + return nodes.splice(Index,1)[0]; + } + + /** + * Get the first node in the list. + * + * @return The first node in the path. + */ + public function head():FlxPoint + { + if(nodes.length>0) + return nodes[0]; + return null; + } + + /** + * Get the last node in the list. + * + * @return The last node in the path. + */ + public function tail():FlxPoint + { + if(nodes.length>0) + return nodes[nodes.length-1]; + return null; + } + + /** + * While this doesn't overrideFlxBasic.drawDebug(), the behavior is very similar. + * Based on this path data, it draws a simple lines-and-boxes representation of the path + * if the visual debug mode was toggled in the debugger overlay. You can usedebugColor + * anddebugScrollFactorto control the path's appearance. + * + * @param Camera The camera object the path will draw to. + */ + public function drawDebug(Camera:FlxCamera=null):Void + { + if(nodes.length<=0) + return; + if(Camera==null) + Camera=FlxG.camera; + + //Set up our global flash graphics object to draw out the path + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + + //Then fill up the object with node and path graphics + var node:FlxPoint; + var nextNode:FlxPoint; + var i:Int=0; + var l:Int=nodes.length; + while(i0)?0.0000001:-0.0000001)); + _point.y=Std.int(_point.y +((_point.y>0)?0.0000001:-0.0000001)); + + //decide what color this node should be + var nodeSize:Int=2; + if((i==0)||(i==l-1)) + nodeSize *=2; + var nodeColor:Int=debugColor; + if(l>1) + { + if(i==0) + nodeColor=FlxG.GREEN; + else if(i==l-1) + nodeColor=FlxG.RED; + } + + //draw a box for the node + gfx.beginFill(nodeColor,0.5); + gfx.lineStyle(); + gfx.drawRect(_point.x-nodeSize*0.5,_point.y-nodeSize*0.5,nodeSize,nodeSize); + gfx.endFill(); + + //then find the next node in the path + var linealpha:Float=0.3; + if(i0)?0.0000001:-0.0000001)); + _point.y=Std.int(_point.y +((_point.y>0)?0.0000001:-0.0000001)); + gfx.lineTo(_point.x,_point.y); + + i++; + } + + //then stamp the path down onto the game buffer + Camera.buffer.draw(FlxG.flashGfxSprite); + } + + static public var manager(get_manager, null):DebugPathDisplay; + private function get_manager():DebugPathDisplay + { + return FlxG.getPlugin(DebugPathDisplay)as DebugPathDisplay; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxPoint.hx b/intra/source/org/flixel/FlxPoint.hx new file mode 100644 index 0000000..eebc911 --- /dev/null +++ b/intra/source/org/flixel/FlxPoint.hx @@ -0,0 +1,101 @@ +package org.flixel; + +import flash.geom.Point; + +/** + * Stores a 2D floating point coordinate. + * + * @author Adam Atomic + */ +class FlxPoint +{ + /** + * @default 0 + */ + public var x:Float; + /** + * @default 0 + */ + public var y:Float; + + /** + * Instantiate a new point object. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + */ + public function new(X:Float=0, Y:Float=0) + { + x=X; + y=Y; + } + + /** + * Instantiate a new point object. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + */ + public function make(X:Float=0, Y:Float=0):FlxPoint + { + x=X; + y=Y; + return this; + } + + /** + * Helper function, just copies the values from the specified point. + * + * @param Point AnyFlxPoint. + * + * @return A reference to itself. + */ + public function copyFrom(Point:FlxPoint):FlxPoint + { + x=Point.x; + y=Point.y; + return this; + } + + /** + * Helper function, just copies the values from this point to the specified point. + * + * @param Point AnyFlxPoint. + * + * @return A reference to the altered point parameter. + */ + public function copyTo(Point:FlxPoint):FlxPoint + { + Point.x=x; + Point.y=y; + return Point; + } + + /** + * Helper function, just copies the values from the specified Flash point. + * + * @param Point AnyPoint. + * + * @return A reference to itself. + */ + public function copyFromFlash(FlashPoint:Point):FlxPoint + { + x=FlashPoint.x; + y=FlashPoint.y; + return this; + } + + /** + * Helper function, just copies the values from this point to the specified Flash point. + * + * @param Point AnyPoint. + * + * @return A reference to the altered point parameter. + */ + public function copyToFlash(FlashPoint:Point):Point + { + FlashPoint.x=x; + FlashPoint.y=y; + return FlashPoint; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxRect.hx b/intra/source/org/flixel/FlxRect.hx new file mode 100644 index 0000000..97f0981 --- /dev/null +++ b/intra/source/org/flixel/FlxRect.hx @@ -0,0 +1,175 @@ +package org.flixel; + +import flash.geom.Rectangle; + +/** + * Stores a rectangle. + * + * @author Adam Atomic + */ +class FlxRect +{ + /** + * @default 0 + */ + public var x:Float; + /** + * @default 0 + */ + public var y:Float; + /** + * @default 0 + */ + public var width:Float; + /** + * @default 0 + */ + public var height:Float; + + /** + * Instantiate a new rectangle. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + */ + public function new(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0) + { + x=X; + y=Y; + width=Width; + height=Height; + } + + /** + * The X coordinate of the left side of the rectangle. Read-only. + */ + public var left(get_left, null):Float; + private function get_left():Float + { + return x; + } + + /** + * The X coordinate of the right side of the rectangle. Read-only. + */ + public var right(get_right, null):Float; + private function get_right():Float + { + return x + width; + } + + /** + * The Y coordinate of the top of the rectangle. Read-only. + */ + public var top(get_top, null):Float; + private function get_top():Float + { + return y; + } + + /** + * The Y coordinate of the bottom of the rectangle. Read-only. + */ + public var bottom(get_bottom, null):Float; + private function get_bottom():Float + { + return y + height; + } + + /** + * Instantiate a new rectangle. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of the rectangle. + * @param Height Desired height of the rectangle. + * + * @return A reference to itself. + */ + public function make(X:Float=0, Y:Float=0, Width:Float=0, Height:Float=0):FlxRect + { + x=X; + y=Y; + width=Width; + height=Height; + return this; + } + + /** + * Helper function, just copies the values from the specified rectangle. + * + * @param Rect AnyFlxRect. + * + * @return A reference to itself. + */ + public function copyFrom(Rect:FlxRect):FlxRect + { + x=Rect.x; + y=Rect.y; + width=Rect.width; + height=Rect.height; + return this; + } + + /** + * Helper function, just copies the values from this rectangle to the specified rectangle. + * + * @param Point AnyFlxRect. + * + * @return A reference to the altered rectangle parameter. + */ + public function copyTo(Rect:FlxRect):FlxRect + { + Rect.x=x; + Rect.y=y; + Rect.width=width; + Rect.height=height; + return Rect; + } + + /** + * Helper function, just copies the values from the specified Flash rectangle. + * + * @param FlashRect AnyRectangle. + * + * @return A reference to itself. + */ + public function copyFromFlash(FlashRect:Rectangle):FlxRect + { + x=FlashRect.x; + y=FlashRect.y; + width=FlashRect.width; + height=FlashRect.height; + return this; + } + + /** + * Helper function, just copies the values from this rectangle to the specified Flash rectangle. + * + * @param Point AnyRectangle. + * + * @return A reference to the altered rectangle parameter. + */ + public function copyToFlash(FlashRect:Rectangle):Rectangle + { + FlashRect.x=x; + FlashRect.y=y; + FlashRect.width=width; + FlashRect.height=height; + return FlashRect; + } + + /** + * Checks to see if someFlxRectobject overlaps thisFlxRectobject. + * + * @param Rect The rectangle being tested. + * + * @return Whether or not the two rectangles overlap. + */ + public function overlaps(Rect:FlxRect):Bool + { + return(Rect.x + Rect.width>x)&&(Rect.xy)&&(Rect.yflush()anddestroy()on your save file. + * Will correctly handle storage size popups and all that good stuff. + * If you don't want to save your changes first, just calldestroy()instead. + * + * @param MinFileSize If you need X amount of space for your save, specify it here. + * @param OnComplete This callback will be triggered when the data is written successfully. + * + * @return The result of result of theflush()call(see below for more details). + */ + public function close(MinFileSize:Int=0,OnComplete:Function=null):Bool + { + _closeRequested=true; + return flush(MinFileSize,OnComplete); + } + + /** + * Writes the local shared object to disk immediately. Leaves the object open in memory. + * + * @param MinFileSize If you need X amount of space for your save, specify it here. + * @param OnComplete This callback will be triggered when the data is written successfully. + * + * @return Whether or not the data was written immediately. False could be an error OR a storage request popup. + */ + public function flush(MinFileSize:Int=0,OnComplete:Function=null):Bool + { + if(!checkBinding()) + return false; + _onComplete=OnComplete; + var result:String=null; + try { result=_sharedObject.flush(MinFileSize);} + catch(e:Dynamic){ return onDone(ERROR);} + if(result==SharedObjectFlushStatus.PENDING) + _sharedObject.addEventListener(NetStatusEvent.NET_STATUS,onFlushStatus); + return onDone((result==SharedObjectFlushStatus.FLUSHED)?SUCCESS:PENDING); + } + + /** + * Erases everything stored in the local shared object. + * Data is immediately erased and the object is saved that way, + * so use with caution! + * + * @return Returns false if the save object is not bound yet. + */ + public function erase():Bool + { + if(!checkBinding()) + return false; + _sharedObject.clear(); + return true; + } + + /** + * Event handler for special case storage requests. + * + * @param E Flash net status event. + */ + private function onFlushStatus(E:NetStatusEvent):Void + { + _sharedObject.removeEventListener(NetStatusEvent.NET_STATUS,onFlushStatus); + onDone((E.info.code=="SharedObject.Flush.Success")?SUCCESS:ERROR); + } + + /** + * Event handler for special case storage requests. + * Handles logging of errors and calling of callback. + * + * @param Result One of the result codes(PENDING, ERROR, or SUCCESS). + * + * @return Whether the operation was a success or not. + */ + private function onDone(Result:Int):Bool + { + switch(Result) + { + case PENDING: + FlxG.log("FLIXEL:FlxSave is requesting extra storage space."); + break; + case ERROR: + FlxG.log("ERROR:There was a problem flushing\nthe shared object data from FlxSave."); + break; + default: + break; + } + if(_onComplete !=null) + _onComplete(Result==SUCCESS); + if(_closeRequested) + destroy(); + return Result==SUCCESS; + } + + /** + * Handy utility function for checking and warning if the shared object is bound yet or not. + * + * @return Whether the shared object was bound yet. + */ + private function checkBinding():Bool + { + if(_sharedObject==null) + { + FlxG.log("FLIXEL:You must call FlxSave.bind()\nbefore you can read or write data."); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxSound.hx b/intra/source/org/flixel/FlxSound.hx new file mode 100644 index 0000000..c9651d2 --- /dev/null +++ b/intra/source/org/flixel/FlxSound.hx @@ -0,0 +1,508 @@ +package org.flixel; + +import flash.events.Event; +import flash.media.Sound; +import flash.media.SoundChannel; +import flash.media.SoundTransform; +import flash.net.URLRequest; + +import flash.events.SampleDataEvent; +import flash.utils.ByteArray; + + +/** + * This is the universal flixel sound object, used for streaming, music, and sound effects. + * + * EMBEDDED SEAMLESS LOOPING MODIFICATION BY MAX "GETI" CAHILL. + */ +class FlxSound extends FlxObject +{ + /** + * Whether or not this sound should be automatically destroyed when you switch states. + */ + public var survive:Bool; + /** + * Whether the sound is currently playing or not. + */ + public var playing:Bool; + /** + * The ID3 song name. Defaults to null. Currently only works for streamed sounds. + */ + public var name:String; + /** + * The ID3 artist name. Defaults to null. Currently only works for streamed sounds. + */ + public var artist:String; + public var fixed:Bool; + /* + * A bunch of looping variables follow. + */ + protected var MAGIC_DELAY:Float=2766.0; //THE MAGIC NUMBER + protected var bufferSize:Int=4096; //this gives stable playback + private var samplesTotal:Int=0; //this _must_ be known about the song to be looped + public var loop_start:Int=0; + private var samplesPosition:Int=0; //helper for reading the sound + + private var _streaming:Bool; //whether we're streaming the audio or not + + /* + * The default FlxSound variables + */ + + private var _init:Bool; + public var _sound:Sound; + private var _in:Sound; + public var _channel:SoundChannel; + private var _transform:SoundTransform; + public var _position:Float; + private var _volume:Float; + private var _volumeAdjust:Float; + private var _looped:Bool; + private var _core:FlxObject; + private var _radius:Float; + private var _pan:Bool; + private var _fadeOutTimer:Float; + private var _fadeOutTotal:Float; + private var _pauseOnFadeOut:Bool; + private var _fadeInTimer:Float; + private var _fadeInTotal:Float; + private var _point2:FlxPoint; + + + /** + * The FlxSound constructor gets all the variables initialized, but NOT ready to play a sound yet. + */ + public function new() + { + + super(); + _point2=new FlxPoint(); + _transform=new SoundTransform(); + init(); + fixed=true;//no movement usually + } + + /** + * An Internal function for clearing all the variables used by sounds. + */ + private function init():Void + { + _transform.pan=0; + _sound=null; + _in=null; + _position=0; + _volume=1.0; + _volumeAdjust=1.0; + _looped=false; + _core=null; + _radius=0; + _pan=false; + _fadeOutTimer=0; + _fadeOutTotal=0; + _pauseOnFadeOut=false; + _fadeInTimer=0; + _fadeInTotal=0; + active=false; + visible=false; + solid=false; + playing=false; + name=null; + artist=null; + } + + /** + * One of two main setup functions for sounds, this function loads a sound from an embedded MP3. + * + * @param EmbeddedSound An embedded Class object representing an MP3 file. + * @param Looped Whether or not this sound should loop endlessly. + * @param totalSamples If looped is true, the number of samples is needed. + * + * @return ThisFlxSoundinstance(nice for chaining stuff together, if you're Into that). + */ + public function loadEmbedded(EmbeddedSound:Class, Looped:Bool=false, totalSamples:Int=0, _loop_start:Int=0):FlxSound + { + stop(); + init(); + if(Looped) + { + _in=new EmbeddedSound; + _sound=new Sound(); + _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleData); + samplesTotal=totalSamples - MAGIC_DELAY;//prevents any delay at the end of the track as well. + loop_start=_loop_start; + } + else _sound=new EmbeddedSound; + //NOTE:can't pull ID3 info from embedded sound currently + _streaming=false; + _looped=Looped; + updateTransform(); + active=true; + return this; + } + + /** + * One of two main setup functions for sounds, this function loads a sound from a URL. + * + * @param EmbeddedSound A string representing the URL of the MP3 file you want to play. + * @param Looped Whether or not this sound should loop endlessly. + * + * @return ThisFlxSoundinstance(nice for chaining stuff together, if you're Into that). + */ + public function loadStream(SoundURL:String, Looped:Bool=false):FlxSound + { + stop(); + init(); + _sound=new Sound(); + _sound.addEventListener(Event.ID3, gotID3); + _sound.load(new URLRequest(SoundURL)); + _streaming=true; + _looped=Looped; + updateTransform(); + active=true; + return this; + } + + /** + * Call this function if you want this sound's volume to change + * based on distance from a particular FlxCore object. + * + * @param X The X position of the sound. + * @param Y The Y position of the sound. + * @param Core The object you want to track. + * @param Radius The maximum distance this sound can travel. + * + * @return This FlxSound instance(nice for chaining stuff together, if you're Into that). + */ + public function proximity(X:Float,Y:Float,Core:FlxObject,Radius:Float,Pan:Bool=true):FlxSound + { + x=X; + y=Y; + _core=Core; + _radius=Radius; + _pan=Pan; + return this; + } + + /** + * Call this function to play the sound. + */ + public function play():Void + { + volume=FlxG.volume; + if(_position<0) + return; + if(_looped) + { + if(!_streaming) + { + if(_channel==null) + + _channel=_sound.play(0,9999,_transform); + if(_channel==null) + active=false; + } + else + { + if(_position==0) + { + if(_channel==null) + _channel=_sound.play(0,9999,_transform); + if(_channel==null) + active=false; + } + else + { + _channel=_sound.play(_position,0,_transform); + if(_channel==null) + active=false; + else + _channel.addEventListener(Event.SOUND_COMPLETE, looped); + } + } + } + else + { + if(_position==0) + { + if(_channel==null) + { + _channel=_sound.play(0,0,_transform); + if(_channel==null) + active=false; + else + _channel.addEventListener(Event.SOUND_COMPLETE, stopped); + } + } + else + { + _channel=_sound.play(_position,0,_transform); + if(_channel==null) + active=false; + } + } + playing=(_channel !=null); + _position=0; + } + + /** + * Call this function to pause this sound. + */ + public function pause():Void + { + if(_channel==null) + { + _position=-1; + return; + } + _position=_channel.position; + _channel.stop(); + if(_looped) + { + while(_position>=_sound.length) + _position -=_sound.length; + } + _channel=null; + playing=false; + } + + /** + * Call this function to stop this sound. + */ + public function stop():Void + { + _position=0; + if(_channel !=null) + { + _channel.stop(); + stopped(); + } + } + + /** + * Call this function to make this sound fade out over a certain time Interval. + * + * @param Seconds The amount of time the fade out operation should take. + * @param PauseInstead Tells the sound to pause on fadeout, instead of stopping. + */ + public function fadeOut(Seconds:Float,PauseInstead:Bool=false):Void + { + _pauseOnFadeOut=PauseInstead; + _fadeInTimer=0; + _fadeOutTimer=Seconds; + _fadeOutTotal=_fadeOutTimer; + } + + /** + * Call this function to make a sound fade in over a certain + * time Interval(callsplay()automatically). + * + * @param Seconds The amount of time the fade-in operation should take. + */ + public function fadeIn(Seconds:Float):Void + { + _fadeOutTimer=0; + _fadeInTimer=Seconds; + _fadeInTotal=_fadeInTimer; + play(); + } + + /** + * Setvolumeto a value between 0 and 1 to change how this sound is. + */ + public var volume(get_volume, set_volume):Float; + private function get_volume():Float + { + return _volume; + } + + /** + * @private + */ + private function set_volume(Volume:Float):Void + { + _volume=Volume; + if(_volume<0) + _volume=0; + else if(_volume>1) + _volume=1; + updateTransform(); + } + + /** + * Internal function that performs the actual logical updates to the sound object. + * Doesn't do much except optional proximity and fade calculations. + */ + private function updateSound():Void + { + if(_position !=0) + return; + + var radial:Float=1.0; + var fade:Float=1.0; + + //Distance-based volume control + if(_core !=null) + { + var _point:FlxPoint=new FlxPoint(); + var _point2:FlxPoint=new FlxPoint(); + _core.getScreenXY(_point); + getScreenXY(_point2); + var dx:Float=_point.x - _point2.x; + var dy:Float=_point.y - _point2.y; + radial=(_radius - Math.sqrt(dx*dx + dy*dy))/_radius; + if(radial<0)radial=0; + if(radial>1)radial=1; + + if(_pan) + { + var d:Float=-dx/_radius; + if(d<-1)d=-1; + else if(d>1)d=1; + _transform.pan=d; + } + } + + //Cross-fading volume control + if(_fadeOutTimer>0) + { + _fadeOutTimer -=FlxG.elapsed; + if(_fadeOutTimer<=0) + { + if(_pauseOnFadeOut) + pause(); + else + stop(); + } + fade=_fadeOutTimer/_fadeOutTotal; + if(fade<0)fade=0; + } + else if(_fadeInTimer>0) + { + _fadeInTimer -=FlxG.elapsed; + fade=_fadeInTimer/_fadeInTotal; + if(fade<0)fade=0; + fade=1 - fade; + } + + _volumeAdjust=radial*fade; + updateTransform(); + } + + /** + * The basic game loop update function. Just callsupdateSound(). + */ + override public function update():Void + { + super.update(); + updateSound(); + } + + /** + * The basic class destructor, stops the music and removes any leftover events. + */ + override public function destroy():Void + { + if(active) + stop(); + } + + /** + * An Internal function used to help organize and change the volume of the sound. + */ + private function updateTransform():Void + { + //_transform.volume=FlxG.getMuteValue()*FlxG.volume*_volume*_volumeAdjust; + _transform.volume=FlxG.volume*_volume*_volumeAdjust; + if(_channel !=null) + _channel.soundTransform=_transform; + } + + /** + * An Internal helper function used to help Flash resume playing a looped sound. + * + * @param event AnEventobject. + */ + private function looped(event:Event=null):Void + { + if(_channel==null) + return; + _channel.removeEventListener(Event.SOUND_COMPLETE,looped); + _channel=null; + play(); + } + + /** + * An Internal helper function used to help Flash clean up and re-use finished sounds. + * + * @param event AnEventobject. + */ + private function stopped(event:Event=null):Void + { + if(!_looped) + _channel.removeEventListener(Event.SOUND_COMPLETE,stopped); + else + _channel.removeEventListener(Event.SOUND_COMPLETE,looped); + _channel=null; + active=false; + playing=false; + } + + /** + * Internal event handler for ID3 info(i.e. fetching the song name). + * + * @param event AnEventobject. + */ + private function gotID3(event:Event=null):Void + { + FlxG.log("got ID3 info!"); + if(_sound.id3.songName.length>0) + name=_sound.id3.songName; + if(_sound.id3.artist.length>0) + artist=_sound.id3.artist; + _sound.removeEventListener(Event.ID3, gotID3); + } + + //this is just forwarding the event and bufferSize to the extraction function. + private function sampleData(event:SampleDataEvent):Void + { + extract(event.data, bufferSize); + } + + /** + * This methods extracts audio data from the mp3 and wraps it automatically with respect to encoder delay + * + * @param target The ByteArray where to write the audio data + * @param length The amount of samples to be read + */ + private function extract(target:ByteArray, length:Int):Void + { + if(samplesTotal==0)return; + while(0samplesTotal) + { + var read:Int=samplesTotal - samplesPosition; + + _in.extract(target, read, samplesPosition + MAGIC_DELAY); + + samplesPosition +=read; + + length -=read; + } + else + { + _in.extract(target, length, samplesPosition + MAGIC_DELAY); + + samplesPosition +=length; + + length=0; + } + + if(samplesPosition==samplesTotal)// WE ARE AT THE END OF THE LOOP>WRAP + { + samplesPosition=loop_start; + } + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxSprite.hx b/intra/source/org/flixel/FlxSprite.hx new file mode 100644 index 0000000..4d59a8c --- /dev/null +++ b/intra/source/org/flixel/FlxSprite.hx @@ -0,0 +1,1060 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.geom.ColorTransform; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.ByteArray; +import flash.utils.describeType; +import global.Registry; +import helper.Parabola_Thing; + +import org.flixel.system.FlxAnim; + +/** + * The main "game object" class, the sprite is aFlxObject + * with a bunch of graphics options and abilities, like animation and stamping. + * + * @author Adam Atomic + */ +class FlxSprite extends FlxObject +{ + //[Embed(source="data/default.png")] private var ImgDefault:Class; + + /** + * WARNING:The origin of the sprite will default to its center. + * If you change this, the visuals and the collisions will likely be + * pretty out-of-sync if you do any rotation. + */ + public var origin:FlxPoint; + /** + * Positive x moves graphic left. Positive y moves graphic up. + */ + public var offset:FlxPoint; + + /** + * Change the size of your sprite's graphic. + * NOTE:Scale doesn't currently affect collisions automatically, + * you will need to adjust the width, height and offset manually. + * WARNING:scaling sprites decreases rendering performance for this sprite by a factor of 10x! + */ + public var scale:FlxPoint; + /** + * Blending modes, just like Photoshop or whatever. + * E.g. "multiply", "screen", etc. + * @default null + */ + public var blend:String; + /** + * Controls whether the object is smoothed when rotated, affects performance. + * @default false + */ + public var antialiasing:Bool; + /** + * Whether the current animation has finished its first(or only)loop. + */ + public var finished:Bool; + /** + * The width of the actual graphic or image being displayed(not necessarily the game object/bounding box). + * NOTE:Edit at your own risk!! This is Intended to be read-only. + */ + public var frameWidth:Int; + /** + * The height of the actual graphic or image being displayed(not necessarily the game object/bounding box). + * NOTE:Edit at your own risk!! This is Intended to be read-only. + */ + public var frameHeight:Int; + /** + * The total number of frames in this image. WARNING:assumes each row in the sprite sheet is full! + */ + public var frames:Int; + /** + * The actual FlashBitmapDataobject representing the current display state of the sprite. + */ + public var framePixels:BitmapData; + + // stuff i added + /** + * The current "pushdown" of the drawn frame. Used for example, making something rise out of the ground. + */ + public var framePixels_y_push:Int=0; + + public var gx:Int=0; + public var gy:Int=0; + + /** + * Whether or not this sprite should have tile callbacks. + */ + + public var has_tile_callbacks:Bool=true; + + //end stuff i aded + /** + * Set this flag to true to force the sprite to update during the draw()call. + * NOTE:Rarely if ever necessary, most sprite operations will flip this flag automatically. + */ + public var dirty:Bool; + + /** + * Internal, stores all the animations that were added to this sprite. + */ + public var _animations:Array; + /** + * Internal, keeps track of whether the sprite was loaded with support for automatic reverse/mirroring. + */ + private var _flipped:Int; + /** + * Internal, keeps track of the current animation being played. + */ + public var _curAnim:FlxAnim; + /** + * Internal, keeps track of the current frame of animation. + * This is NOT an index Into the tile sheet, but the frame number in the animation object. + */ + public var _curFrame:Int; + /** + * Internal, keeps track of the current index Into the tile sheet based on animation or rotation. + */ + public var _curIndex:Int; + /** + * Internal, used to time each frame of animation. + */ + private var _frameTimer:Float; + /** + * Internal tracker for the animation callback. Default is null. + * If assigned, will be called each time the current frame changes. + * A function that has 3 parameters:a string name, a Int frame number, and a Int frame index. + */ + private var _callback:Function; + /** + * Internal tracker for what direction the sprite is currently facing, used with Flash getter/setter. + */ + private var _facing:Int; + /** + * Internal tracker for opacity, used with Flash getter/setter. + */ + private var _alpha:Float; + /** + * Internal tracker for color tint, used with Flash getter/setter. + */ + private var _color:Int; + /** + * Internal tracker for how many frames of "baked" rotation there are(if any). + */ + private var _bakedRotation:Float; + /** + * Internal, stores the entire source graphic(not the current displayed animation frame), used with Flash getter/setter. + */ + private var _pixels:BitmapData; + + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashPoint:Point; + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashRect:Rectangle; + /** + * Internal, reused frequently during drawing and animating. + */ + private var _flashRect2:Rectangle; + /** + * Internal, reused frequently during drawing and animating. Always contains(0,0). + */ + private var _flashPointZero:Point; + /** + * Internal, helps with animation, caching and drawing. + */ + private var _colorTransform:ColorTransform; + /** + * Internal, helps with animation, caching and drawing. + */ + private var _matrix:Matrix; + + /** + * Used in EventScripts::rotate_... + */ + public var rotate_angle:Float=0; + + public var parabola_thing:Parabola_Thing; + public var my_shadow:FlxSprite; + public var sfx:Dynamic={ }; + + public static inline var HURT_SOUND_NAME:String="generic_hurt"; + + + /** + * Creates a white 8x8 squareFlxSpriteat the specified position. + * Optionally can load a simple, one-frame graphic instead. + * + * @param X The initial X position of the sprite. + * @param Y The initial Y position of the sprite. + * @param SimpleGraphic The graphic you want to display(OPTIONAL - for simple stuff only, do NOT use for animated images!). + */ + public function new(X:Float=0,Y:Float=0,SimpleGraphic:Class=null) + { + super(X,Y); + _flashPoint=new Point(); + _flashRect=new Rectangle(); + _flashRect2=new Rectangle(); + _flashPointZero=new Point(); + offset=new FlxPoint(); + origin=new FlxPoint(); + + scale=new FlxPoint(1.0,1.0); + _alpha=1; + _color=0x00ffffff; + blend=null; + antialiasing=false; + cameras=null; + + finished=false; + _facing=RIGHT; + _animations=new Array(); + _flipped=0; + _curAnim=null; + _curFrame=0; + _curIndex=0; + _frameTimer=0; + + _matrix=new Matrix(); + _callback=null; + + if(SimpleGraphic==null) + SimpleGraphic=ImgDefault; + loadGraphic(SimpleGraphic); + + add_sfx(HURT_SOUND_NAME, Registry.sound_data.broom_hit); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + if(_animations !=null) + { + var a:FlxAnim; + var i:Int=0; + var l:Int=_animations.length; + while(i>1; + else + _flipped=0; + if(Width==0) + { + if(Animated) + Width=_pixels.height; + else if(_flipped>0) + Width=_pixels.width*0.5; + else + Width=_pixels.width; + } + width=frameWidth=Width; + if(Height==0) + { + if(Animated) + Height=width; + else + Height=_pixels.height; + } + height=frameHeight=Height; + resetHelpers(); + return this; + } + + /** + * Create a pre-rotated sprite sheet from a simple sprite. + * This can make a huge difference in graphical performance! + * + * @param Graphic The image you want to rotate and stamp. + * @param Rotations The number of rotation frames the final sprite should have. For small sprites this can be quite a large number(360 even)without any problems. + * @param Frame If the Graphic has a single row of square animation frames on it, you can specify which of the frames you want to use here. Default is -1, or "use whole graphic." + * @param AntiAliasing Whether to use high quality rotations when creating the graphic. Default is false. + * @param AutoBuffer Whether to automatically increase the image size to accomodate rotated corners. Default is false. Will create frames that are 150% larger on each axis than the original frame or graphic. + * + * @return This FlxSprite instance(nice for chaining stuff together, if you're Into that). + */ + public function loadRotatedGraphic(Graphic:Class, Rotations:Int=16, Frame:Int=-1, AntiAliasing:Bool=false, AutoBuffer:Bool=false):FlxSprite + { + //Create the brush and canvas + var rows:Int=Math.sqrt(Rotations); + var brush:BitmapData=FlxG.addBitmap(Graphic); + if(Frame>=0) + { + //Using just a segment of the graphic - find the right bit here + var full:BitmapData=brush; + brush=new BitmapData(full.height,full.height); + var rx:Int=Frame*brush.width; + var ry:Int=0; + var fw:Int=full.width; + if(rx>=fw) + { + ry=uint(rx/fw)*brush.height; + rx %=fw; + } + _flashRect.x=rx; + _flashRect.y=ry; + _flashRect.width=brush.width; + _flashRect.height=brush.height; + brush.copyPixels(full,_flashRect,_flashPointZero); + } + + var max:Int=brush.width; + if(brush.height>max) + max=brush.height; + if(AutoBuffer) + max *=1.5; + var columns:Int=FlxU.ceil(Rotations/rows); + width=max*columns; + height=max*rows; + var key:String=Std.string(Graphic)+ ":" + Frame + ":" + width + "x" + height; + var skipGen:Bool=FlxG.checkBitmapCache(key); + _pixels=FlxG.createBitmap(width, height, 0, true, key); + width=frameWidth=_pixels.width; + height=frameHeight=_pixels.height; + _bakedRotation=360/Rotations; + + //Generate a new sheet if necessary, then fix up the width and height + if(!skipGen) + { + var row:Int=0; + var column:Int; + var bakedAngle:Float=0; + var halfBrushWidth:Int=brush.width*0.5; + var halfBrushHeight:Int=brush.height*0.5; + var midpointX:Int=max*0.5; + var midpointY:Int=max*0.5; + while(row0)?0.0000001:-0.0000001; + _point.y +=(_point.y>0)?0.0000001:-0.0000001; + if(((angle==0)||(_bakedRotation>0))&&(scale.x==1)&&(scale.y==1)&&(blend==null)) + { //Simple render + _flashPoint.x=_point.x; + _flashPoint.y=_point.y; + camera.buffer.copyPixels(framePixels,_flashRect,_flashPoint,null,null,true); + } + else + { //Advanced render + _matrix.identity(); + _matrix.translate(-origin.x,-origin.y); + _matrix.scale(scale.x,scale.y); + if((angle !=0)&&(_bakedRotation<=0)) + _matrix.rotate(angle * 0.017453293); + _matrix.translate(_point.x+origin.x,_point.y+origin.y); + camera.buffer.draw(framePixels,_matrix,null,blend,null,antialiasing); + } + _VISIBLECOUNT++; + if(FlxG.visualDebug && !ignoreDrawDebug) + drawDebug(camera); + } + } + + /** + * This function draws or stamps oneFlxSpriteonto another. + * This function is NOT Intended to replacedraw()! + * + * @param Brush The image you want to use as a brush or stamp or pen or whatever. + * @param X The X coordinate of the brush's top left corner on this sprite. + * @param Y They Y coordinate of the brush's top left corner on this sprite. + */ + public function stamp(Brush:FlxSprite,X:Int=0,Y:Int=0):Void + { + Brush.drawFrame(); + var bitmapData:BitmapData=Brush.framePixels; + + //Simple draw + if(((Brush.angle==0)||(Brush._bakedRotation>0))&&(Brush.scale.x==1)&&(Brush.scale.y==1)&&(Brush.blend==null)) + { + _flashPoint.x=X; + _flashPoint.y=Y; + _flashRect2.width=bitmapData.width; + _flashRect2.height=bitmapData.height; + _pixels.copyPixels(bitmapData,_flashRect2,_flashPoint,null,null,true); + _flashRect2.width=_pixels.width; + _flashRect2.height=_pixels.height; + calcFrame(); + return; + } + + //Advanced draw + _matrix.identity(); + _matrix.translate(-Brush.origin.x,-Brush.origin.y); + _matrix.scale(Brush.scale.x,Brush.scale.y); + if(Brush.angle !=0) + _matrix.rotate(Brush.angle * 0.017453293); + _matrix.translate(X+Brush.origin.x,Y+Brush.origin.y); + _pixels.draw(bitmapData,_matrix,null,Brush.blend,null,Brush.antialiasing); + calcFrame(); + } + + /** + * This function draws a line on this sprite from position X1,Y1 + * to position X2,Y2 with the specified color. + * + * @param StartX X coordinate of the line's start point. + * @param StartY Y coordinate of the line's start point. + * @param EndX X coordinate of the line's end point. + * @param EndY Y coordinate of the line's end point. + * @param Color The line's color. + * @param Thickness How thick the line is in pixels(default value is 1). + */ + public function drawLine(StartX:Float,StartY:Float,EndX:Float,EndY:Float,Color:Int,Thickness:Int=1):Void + { + //Draw line + var gfx:Graphics=FlxG.flashGfx; + gfx.clear(); + gfx.moveTo(StartX,StartY); + var alphaComponent:Float=Std.parseFloat((Color>>24)& 0xFF)/ 255; + if(alphaComponent<=0) + alphaComponent=1; + gfx.lineStyle(Thickness,Color,alphaComponent); + gfx.lineTo(EndX,EndY); + + //Cache line to bitmap + _pixels.draw(FlxG.flashGfxSprite); + dirty=true; + } + + /** + * Fills this sprite's graphic with a specific color. + * + * @param Color The color with which to fill the graphic, format 0xAARRGGBB. + */ + public function fill(Color:Int):Void + { + _pixels.fillRect(_flashRect2,Color); + if(_pixels !=framePixels) + dirty=true; + } + + /** + * Internal function for updating the sprite's animation. + * Useful for cases when you need to update this but are buried down in too many supers. + * This function is called automatically byFlxSprite.postUpdate(). + */ + private function updateAnimation():Void + { + if(_bakedRotation>0) + { + var oldIndex:Int=_curIndex; + var angleHelper:Int=angle%360; + if(angleHelper<0) + angleHelper +=360; + _curIndex=angleHelper/_bakedRotation + 0.5; + if(oldIndex !=_curIndex) + dirty=true; + } + else if((_curAnim !=null)&&(_curAnim.delay>0)&&(_curAnim.looped || !finished)) + { + _frameTimer +=FlxG.elapsed; + while(_frameTimer>_curAnim.delay) + { + _frameTimer=_frameTimer - _curAnim.delay; + if(_curFrame==_curAnim.frames.length-1) + { + if(_curAnim.looped) + _curFrame=0; + finished=true; + } + else + _curFrame++; + _curIndex=_curAnim.frames[_curFrame]; + dirty=true; + } + } + + + if(dirty) + calcFrame(); + } + + /** + * Request(or force)that the sprite update the frame before rendering. + * Useful if you are doing procedural generation or other weirdness! + * + * @param Force Force the frame to redraw, even if its not flagged as necessary. + */ + public function drawFrame(Force:Bool=false):Void + { + if(Force || dirty) + calcFrame(); + } + + /** + * Adds a new animation to the sprite. + * + * @param Name What this animation should be called(e.g. "run"). + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3). + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40 fps). + * @param Looped Whether or not the animation is looped or just plays once. + */ + public function addAnimation(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true):Void + { + _animations.push(new FlxAnim(Name,Frames,FrameRate,Looped)); + } + + /** + * Pass in a function to be called whenever this sprite's animation changes. + * + * @param AnimationCallback A function that has 3 parameters:a string name, a Int frame number, and a Int frame index. + */ + public function addAnimationCallback(AnimationCallback:Function):Void + { + _callback=AnimationCallback; + } + + /** + * Plays an existing animation(e.g. "run"). + * If you call an animation that is already playing it will be ignored. + * + * @param AnimName The string name of the animation you want to play. + * @param Force Whether to force the animation to restart. + */ + public function play(AnimName:String,Force:Bool=false):Void + { + if(!Force &&(_curAnim !=null)&&(AnimName==_curAnim.name)&&(_curAnim.looped || !finished))return; + _curFrame=0; + _curIndex=0; + _frameTimer=0; + var i:Int=0; + // TODO this is null as dust playing unpoof? + var l:Int=_animations.length; + while(i=null; + if(FetchPositions) + positions=new Array(); + + var row:Int=0; + var column:Int; + var rows:Int=_pixels.height; + var columns:Int=_pixels.width; + while(rowpixelsto anyBitmapDataobject. + * Automatically adjust graphic size and render helpers. + */ + public var pixels(get_pixels, set_pixels):BitmapData; + private function get_pixels():BitmapData + { + return _pixels; + } + + /** + * @private + */ + private function set_pixels(Pixels:BitmapData):Void + { + _pixels=Pixels; + width=frameWidth=_pixels.width; + height=frameHeight=_pixels.height; + resetHelpers(); + } + + /** + * SetfacingusingFlxSprite.LEFT,RIGHT, + *UP, andDOWNto take advantage of + * flipped sprites and/or just track player orientation more easily. + */ + public var facing(get_facing, set_facing):Int; + private function get_facing():Int + { + return _facing; + } + + /** + * @private + */ + private function set_facing(Direction:Int):Void + { + if(_facing !=Direction) + dirty=true; + _facing=Direction; + + } + + /** + * Setalphato a number between 0 and 1 to change the opacity of the sprite. + */ + public var alpha(get_alpha, set_alpha):Float; + private function get_alpha():Float + { + return _alpha; + } + + /** + * @private + */ + private function set_alpha(Alpha:Float):Void + { + if(Alpha>1) + Alpha=1; + if(Alpha<0) + Alpha=0; + if(Alpha==_alpha) + return; + _alpha=Alpha; + if((_alpha !=1)||(_color !=0x00ffffff)) + _colorTransform=new ColorTransform((_color>>16)*0.00392,(_color>>8&0xff)*0.00392,(_color&0xff)*0.00392,_alpha); + else + _colorTransform=null; + dirty=true; + } + + /** + * Setcolorto a number in this format:0xRRGGBB. + *colorIGNORES ALPHA. To change the opacity usealpha. + * Tints the whole sprite to be this color(similar to OpenGL vertex colors). + */ + public var color(get_color, set_color):Int; + private function get_color():Int + { + return _color; + } + + /** + * @private + */ + private function set_color(Color:Int):Void + { + Color &=0x00ffffff; + if(_color==Color) + return; + _color=Color; + if((_alpha !=1)||(_color !=0x00ffffff)) + _colorTransform=new ColorTransform((_color>>16)*0.00392,(_color>>8&0xff)*0.00392,(_color&0xff)*0.00392,_alpha); + else + _colorTransform=null; + dirty=true; + } + + /** + * Tell the sprite to change to a specific frame of animation. + * + * @param Frame The frame you want to display. + */ + public var frame(get_frame, set_frame):Int; + private function get_frame():Int + { + return _curIndex; + } + + /** + * @private + */ + private function set_frame(Frame:Int):Void + { + + _curAnim=null; + _curIndex=Frame; + dirty=true; + } + + /** + * Check and see if this object is currently on screen. + * Differs fromFlxObject's implementation + * in that it takes the actual graphic Into account, + * not just the hitbox or bounding box or whatever. + * + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether the object is on screen or not. + */ + override public function onScreen(Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point, Camera); + _point.x=_point.x - offset.x; + _point.y=_point.y - offset.y; + + if(((angle==0)||(_bakedRotation>0))&&(scale.x==1)&&(scale.y==1)) + return((_point.x + frameWidth>0)&&(_point.x0)&&(_point.y0)?scale.x:-scale.x; + var absScaleY:Float=(scale.y>0)?scale.y:-scale.y; + var radius:Float=Math.sqrt(halfWidth*halfWidth+halfHeight*halfHeight)*((absScaleX>=absScaleY)?absScaleX:absScaleY); + _point.x +=halfWidth; + _point.y +=halfHeight; + return((_point.x + radius>0)&&(_point.x - radius0)&&(_point.y - radiusFlxSpriteobject's current displayed pixels. + * This check is ALWAYS made in screen space, and always takes scroll factors Into account. + * + * @param Point The point in world space you want to check. + * @param Mask Used in the pixel hit test to determine what counts as solid. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + public function pixelsOverlapPoint(Point:FlxPoint,Mask:Int=0xFF,Camera:FlxCamera=null):Bool + { + if(Camera==null) + Camera=FlxG.camera; + getScreenXY(_point,Camera); + _point.x=_point.x - offset.x; + _point.y=_point.y - offset.y; + _flashPoint.x=(Point.x - Camera.scroll.x)- _point.x; + _flashPoint.y=(Point.y - Camera.scroll.y)- _point.y; + return framePixels.hitTest(_flashPointZero,Mask,_flashPoint); + } + + /** + * Internal function to update the current animation frame. + */ + private function calcFrame():Void + { + var indexX:Int=_curIndex*frameWidth; + var indexY:Int=0; + + //Handle sprite sheets + var widthHelper:Int=_flipped?_flipped:_pixels.width; + if(indexX>=widthHelper) + { + indexY=uint(indexX/widthHelper)*frameHeight; + indexX %=widthHelper; + } + + //handle reversed sprites + if(_flipped &&(_facing==LEFT)) + indexX=(_flipped<<1)-indexX-frameWidth; + + //Update display bitmap + _flashRect.x=indexX; + _flashRect.y=indexY; + + if(framePixels_y_push !=0){ + /* blank the current frame */ + for(i in 0..._flashRect.height){ + for(j in 0..._flashRect.width){ + framePixels.setPixel32(j, i, 0x00000000); + } + } + if(framePixels_y_push>0){ + //Move the area to be copied + _flashRect.height -=framePixels_y_push; + _flashPointZero.y +=framePixels_y_push; + framePixels.copyPixels(_pixels, _flashRect, _flashPointZero); + //Make that area normal again + _flashRect.height +=framePixels_y_push; + _flashPointZero.y -=framePixels_y_push; + } + } else { + framePixels.copyPixels(_pixels, _flashRect, _flashPointZero); + } + + _flashRect.x=_flashRect.y=0; + if(_colorTransform !=null) + framePixels.colorTransform(_flashRect,_colorTransform); + if(_callback !=null) + _callback(((_curAnim !=null)?(_curAnim.name):null),_curFrame,_curIndex); + dirty=false; + } + + /** + * Add a sound effect to this FlxSprite + * @param name The name of the sound effect + * @param sound_or_sound_group The reference to the sound or sound group + * @return true on success, false on failure + */ + public function add_sfx(name:String, sound_or_sound_group:Dynamic):Bool { + if(FlxU.getClassName(sound_or_sound_group, true)=="FlxGroup"){ + sfx[name]={ is_group:true, sound:sound_or_sound_group }; + } else if(FlxU.getClassName(sound_or_sound_group, true)=="FlxSound"){ + sfx[name]={ is_group:false, sound:sound_or_sound_group }; + } else { + return false; + } + return true; + } + + public function play_sfx(name:String,is_multi:Bool=false):Bool { + if(!sfx.hasOwnProperty(name)){ + FlxG.log("No such SFX \"" + name + "\""); + return false; + } + + var sound:Dynamic=sfx[name].sound; + + if(sfx[name].is_group){ + if(is_multi){ + Registry.sound_data.play_sound_group_randomly(sound); + } else { + Registry.sound_data.play_sound_group(sound); + } + } else { + sound.play(); + } + return true; + } + + public function stop_sfx(name:String):Bool { + if(!sfx.hasOwnProperty(name)){ + FlxG.log("No such SFX \"" + name + "\""); + return false; + } + var sound:Dynamic=sfx[name].sound; + + if(sfx[name].is_group){ + return false; + } else { + var g:FlxSound; + sound.stop(); + } + return true; + + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxState.hx b/intra/source/org/flixel/FlxState.hx new file mode 100644 index 0000000..062076a --- /dev/null +++ b/intra/source/org/flixel/FlxState.hx @@ -0,0 +1,24 @@ +package org.flixel; + +import org.flixel.system.FlxQuadTree; + +/** + * This is the basic game "state" object - e.g. in a simple game + * you might have a menu state and a play state. + * It is for all Intents and purpose a fancy FlxGroup. + * And really, it's not even that fancy. + * + * @author Adam Atomic + */ +class FlxState extends FlxGroup +{ + /** + * This function is called after the game engine successfully switches states. + * Override this function, NOT the constructor, to initialize or set up your game state. + * We do NOT recommend overriding the constructor, unless you want some crazy unpredictable things to happen! + */ + public function create():Void + { + + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxText.hx b/intra/source/org/flixel/FlxText.hx new file mode 100644 index 0000000..76e783b --- /dev/null +++ b/intra/source/org/flixel/FlxText.hx @@ -0,0 +1,305 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.text.TextField; +import flash.text.TextFormat; + +/** + * ExtendsFlxSpriteto support rendering text. + * Can tint, fade, rotate and scale just like a sprite. + * Doesn't really animate though, as far as I know. + * Also does nice pixel-perfect centering on pixel fonts + * as long as they are only one liners. + * + * @author Adam Atomic + */ +class FlxText extends FlxSprite +{ + /** + * Internal reference to a FlashTextFieldobject. + */ + private var _textField:TextField; + /** + * Whether the actual text field needs to be regenerated and stamped again. + * This is NOT the same thing asFlxSprite.dirty. + */ + private var _regen:Bool; + /** + * Internal tracker for the text shadow color, default is clear/transparent. + */ + private var _shadow:Int; + + /** + * Creates a newFlxTextobject at the specified position. + * + * @param X The X position of the text. + * @param Y The Y position of the text. + * @param Width The width of the text object(Std.is(height, determined) automatically). + * @param Text The actual text you would like to display initially. + * @param EmbeddedFont Whether this text field uses embedded fonts or nto + */ + public function new(X:Float, Y:Float, Width:Int, Text:String=null, EmbeddedFont:Bool=true) + { + super(X,Y); + makeGraphic(Width,1,0); + + if(Text==null) + Text=""; + _textField=new TextField(); + _textField.width=Width; + _textField.embedFonts=EmbeddedFont; + _textField.selectable=false; + _textField.sharpness=100; + _textField.multiline=true; + _textField.wordWrap=true; + _textField.text=Text; + var format:TextFormat=new TextFormat("system",8,0xffffff); + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + if(Text.length<=0) + _textField.height=1; + else + _textField.height=10; + + _regen=true; + _shadow=0; + allowCollisions=NONE; + calcFrame(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + _textField=null; + super.destroy(); + } + + /** + * You can use this if you have a lot of text parameters + * to set instead of the individual properties. + * + * @param Font The name of the font face for the text display. + * @param Size The size of the font(in pixels essentially). + * @param Color The color of the text in traditional flash 0xRRGGBB format. + * @param Alignment A string representing the desired alignment("left,"right" or "center"). + * @param ShadowColor A Int representing the desired text shadow color in flash 0xRRGGBB format. + * + * @return This FlxText instance(nice for chaining stuff together, if you're Into that). + */ + public function setFormat(Font:String=null,Size:Float=8,Color:Int=0xffffff,Alignment:String=null,ShadowColor:Int=0):FlxText + { + if(Font==null) + Font=""; + var format:TextFormat=dtfCopy(); + format.font=Font; + format.size=Size; + format.color=Color; + format.align=Alignment; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _shadow=ShadowColor; + _regen=true; + calcFrame(); + return this; + } + + /** + * The text being displayed. + */ + public var text(get_text, set_text):String; + private function get_text():String + { + return _textField.text; + } + + /** + * @private + */ + private function set_text(Text:String):Void + { + var ot:String=_textField.text; + _textField.text=Text; + if(_textField.text !=ot) + { + _regen=true; + calcFrame(); + } + } + + /** + * The size of the text being displayed. + */ + public var size(get_size, set_size):Float; + private function get_size():Float + { + return _textField.defaultTextFormat.size as Float; + } + + /** + * @private + */ + private function set_size(Size:Float):Void + { + var format:TextFormat=dtfCopy(); + format.size=Size; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The color of the text being displayed. + */ + override public var color(get_color, set_color):Int; + private function get_color():Int + { + return _textField.defaultTextFormat.color as Int; + } + + /** + * @private + */ + override private function set_color(Color:Int):Void + { + var format:TextFormat=dtfCopy(); + format.color=Color; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The font used for this text. + */ + public var font(get_font, set_font):String; + private function get_font():String + { + return _textField.defaultTextFormat.font; + } + + /** + * @private + */ + private function set_font(Font:String):Void + { + var format:TextFormat=dtfCopy(); + format.font=Font; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + _regen=true; + calcFrame(); + } + + /** + * The alignment of the font("left", "right", or "center"). + */ + public var alignment(get_alignment, set_alignment):String; + private function get_alignment():String + { + return _textField.defaultTextFormat.align; + } + + /** + * @private + */ + private function set_alignment(Alignment:String):Void + { + var format:TextFormat=dtfCopy(); + format.align=Alignment; + _textField.defaultTextFormat=format; + _textField.setTextFormat(format); + calcFrame(); + } + + /** + * The color of the text shadow in 0xAARRGGBB hex format. + */ + public var shadow(get_shadow, set_shadow):Int; + private function get_shadow():Int + { + return _shadow; + } + + /** + * @private + */ + private function set_shadow(Color:Int):Void + { + _shadow=Color; + calcFrame(); + } + + /** + * Internal function to update the current animation frame. + */ + override private function calcFrame():Void + { + if(_regen) + { + //Need to generate a new buffer to store the text graphic + var i:Int=0; + var nl:Int=_textField.numLines; + height=0; + while(i0)) + { + //Now that we've cleared a buffer, we need to actually render the text to it + var format:TextFormat=_textField.defaultTextFormat; + var formatAdjusted:TextFormat=format; + _matrix.identity(); + //If it's a single, centered line of text, we center it ourselves so it doesn't blur to hell + if((format.align=="center")&&(_textField.numLines==1)) + { + formatAdjusted=new TextFormat(format.font,format.size,format.color,null,null,null,null,null,"left"); + _textField.setTextFormat(formatAdjusted); + _matrix.translate(Math.floor((width - _textField.getLineMetrics(0).width)/2),0); + } + //Render a single pixel shadow beneath the text + if(_shadow>0) + { + _textField.setTextFormat(new TextFormat(formatAdjusted.font,formatAdjusted.size,_shadow,null,null,null,null,null,formatAdjusted.align)); + _matrix.translate(1,1); + _pixels.draw(_textField,_matrix,_colorTransform); + _matrix.translate(-1,-1); + _textField.setTextFormat(new TextFormat(formatAdjusted.font,formatAdjusted.size,formatAdjusted.color,null,null,null,null,null,formatAdjusted.align)); + } + //Actually draw the text onto the buffer + _pixels.draw(_textField,_matrix,_colorTransform); + _textField.setTextFormat(new TextFormat(format.font,format.size,format.color,null,null,null,null,null,format.align)); + } + + //Finally, update the visible pixels + if((framePixels==null)||(framePixels.width !=_pixels.width)||(framePixels.height !=_pixels.height)) + framePixels=new BitmapData(_pixels.width,_pixels.height,true,0); + framePixels.copyPixels(_pixels,_flashRect,_flashPointZero); + } + + /** + * A helper function for updating theTextFieldthat we use for rendering. + * + * @return A writable copy ofTextField.defaultTextFormat. + */ + private function dtfCopy():TextFormat + { + var defaultTextFormat:TextFormat=_textField.defaultTextFormat; + return new TextFormat(defaultTextFormat.font,defaultTextFormat.size,defaultTextFormat.color,defaultTextFormat.bold,defaultTextFormat.italic,defaultTextFormat.underline,defaultTextFormat.url,defaultTextFormat.target,defaultTextFormat.align); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxTileblock.hx b/intra/source/org/flixel/FlxTileblock.hx new file mode 100644 index 0000000..854b978 --- /dev/null +++ b/intra/source/org/flixel/FlxTileblock.hx @@ -0,0 +1,94 @@ +package org.flixel; + +import flash.display.BitmapData; +import flash.geom.Rectangle; + +/** + * This is a basic "environment object" class, used to create simple walls and floors. + * It can be filled with a random selection of tiles to quickly add detail. + * + * @author Adam Atomic + */ +class FlxTileblock extends FlxSprite +{ + /** + * Creates a newFlxBlockobject with the specified position and size. + * + * @param X The X position of the block. + * @param Y The Y position of the block. + * @param Width The width of the block. + * @param Height The height of the block. + */ + public function new(X:Int,Y:Int,Width:Int,Height:Int) + { + super(X,Y); + makeGraphic(Width,Height,0,true); + active=false; + immovable=true; + } + + /** + * Fills the block with a randomly arranged selection of graphics from the image provided. + * + * @param TileGraphic The graphic class that contains the tiles that should fill this block. + * @param TileWidth The width of a single tile in the graphic. + * @param TileHeight The height of a single tile in the graphic. + * @param Empties The number of "empty" tiles to add to the auto-fill algorithm(e.g. 8 tiles + 4 empties=1/3 of block will be open holes). + */ + public function loadTiles(TileGraphic:Class,TileWidth:Int=0,TileHeight:Int=0,Empties:Int=0):FlxTileblock + { + if(TileGraphic==null) + return this; + + //First create a tile brush + var sprite:FlxSprite=new FlxSprite().loadGraphic(TileGraphic,true,false,TileWidth,TileHeight); + var spriteWidth:Int=sprite.width; + var spriteHeight:Int=sprite.height; + var total:Int=sprite.frames + Empties; + + //Then prep the "canvas" as it were(just doublechecking that the size is on tile boundaries) + var regen:Bool=false; + if(width % sprite.width !=0) + { + width=uint(width/spriteWidth+1)*spriteWidth; + regen=true; + } + if(height % sprite.height !=0) + { + height=uint(height/spriteHeight+1)*spriteHeight; + regen=true; + } + if(regen) + makeGraphic(width,height,0,true); + else + this.fill(0); + + //Stamp random tiles onto the canvas + var row:Int=0; + var column:Int; + var destinationX:Int; + var destinationY:Int=0; + var widthInTiles:Int=width/spriteWidth; + var heightInTiles:Int=height/spriteHeight; + while(rowEmpties) + { + sprite.randomFrame(); + sprite.drawFrame(); + stamp(sprite,destinationX,destinationY); + } + destinationX +=spriteWidth; + column++; + } + destinationY +=spriteHeight; + row++; + } + + return this; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxTilemap.hx b/intra/source/org/flixel/FlxTilemap.hx new file mode 100644 index 0000000..f3f13a6 --- /dev/null +++ b/intra/source/org/flixel/FlxTilemap.hx @@ -0,0 +1,1509 @@ +package org.flixel; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Graphics; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.system.FlxTile; +import org.flixel.system.FlxTilemapBuffer; + +/** + * This is a traditional tilemap display and collision class. + * It takes a string of comma-separated numbers and then associates + * those values with tiles from the sheet you pass in. + * It also includes some handy static parsers that can convert + * arrays or images Into strings that can be loaded. + * + * @author Adam Atomic + */ +class FlxTilemap extends FlxObject +{ + //[Embed(source="data/autotiles.png")] static public var ImgAuto:Class; + //[Embed(source="data/autotiles_alt.png")] static public var ImgAutoAlt:Class; + + /** + * No auto-tiling. + */ + static public static inline var OFF:Int=0; + /** + * Good for levels with thin walls that don'tile need Interior corner art. + */ + static public static inline var AUTO:Int=1; + /** + * Better for levels with thick walls that look better with Interior corner art. + */ + static public static inline var ALT:Int=2; + + /** + * Set this flag to use one of the 16-tile binary auto-tile algorithms(OFF, AUTO, or ALT). + */ + public var auto:Int; + + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var widthInTiles:Int; + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var heightInTiles:Int; + /** + * Read-only variable, do NOT recommend changing after the map is loaded! + */ + public var totalTiles:Int; + + /** + * Rendering helper, minimize new object instantiation on repetitive methods. + */ + private var _flashPoint:Point; + /** + * Rendering helper, minimize new object instantiation on repetitive methods. + */ + private var _flashRect:Rectangle; + + /** + * Internal reference to the bitmap data object that stores the original tile graphics. + */ + public var _tiles:BitmapData; + /** + * Internal list of buffers, one for camera, used for drawing the tilemaps. + */ + private var _buffers:Array; + /** + * Internal representation of the actual tile data, as a large 1D array of Integers. + */ + private var _data:Array; + /** + * Internal representation of rectangles, one for tile in the entire tilemap, used to speed up drawing. + */ + private var _rects:Array; + /** + * Internal, the width of a single tile. + */ + private var _tileWidth:Int; + /** + * Internal, the height of a single tile. + */ + private var _tileHeight:Int; + /** + * NOT ANYMORE! + * Internal collection of tile objects, one for type of tile in the map(NOTE one for every single tile in the whole map). + */ + public var _tileObjects:Array; + + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTileNotSolid:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTilePartial:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugTileSolid:BitmapData; + /** + * Internal, used for rendering the debug bounding box display. + */ + private var _debugRect:Rectangle; + /** + * Internal flag for checking to see if we need to refresh + * the tilemap display to show or hide the bounding boxes. + */ + private var _lastVisualDebug:Bool; + /** + * Internal, used to sort of insert blank tiles in front of the tiles in the provided graphic. + */ + private var _startingIndex:Int; + + /** + * The tilemap constructor just initializes some basic variables. + */ + public function new() + { + super(); + auto=OFF; + widthInTiles=0; + heightInTiles=0; + totalTiles=0; + _buffers=new Array(); + _flashPoint=new Point(); + _flashRect=null; + _data=null; + _tileWidth=0; + _tileHeight=0; + _rects=null; + _tiles=null; + _tileObjects=null; + immovable=true; + cameras=null; + _debugTileNotSolid=null; + _debugTilePartial=null; + _debugTileSolid=null; + _debugRect=null; + _lastVisualDebug=FlxG.visualDebug; + _startingIndex=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + _flashPoint=null; + _flashRect=null; + _tiles=null; + var i:Int=0; + var l:Int=_tileObjects.length; + while(isetTileProperties(). + * + * @return A pointer this instance of FlxTilemap, for chaining as usual:) + */ + public function loadMap(MapData:String, TileGraphic:Class, TileWidth:Int=0, TileHeight:Int=0, AutoTile:Int=OFF, StartingIndex:Int=0, DrawIndex:Int=1, CollideIndex:Int=1):FlxTilemap + { + auto=AutoTile; + _startingIndex=StartingIndex; + + //Figure out the map dimensions based on the data string + var columns:Array; + var rows:Array=MapData.split("\n"); + heightInTiles=rows.length; + widthInTiles=0; + _data=new Array(); + var row:Int=0; + var column:Int; + while(rowOFF) + { + _startingIndex=1; + DrawIndex=1; + CollideIndex=1; + i=0; + while(iOFF) + l++; + _tileObjects=new Array(l); + var ac:Int; + while(i=DrawIndex),(i>=CollideIndex)?allowCollisions:NONE); + i++; + } + + //create debug tiles for rendering bounding boxes on demand + _debugTileNotSolid=makeDebugTile(FlxG.BLUE); + _debugTilePartial=makeDebugTile(FlxG.PINK); + _debugTileSolid=makeDebugTile(FlxG.GREEN); + _debugRect=new Rectangle(0,0,_tileWidth,_tileHeight); + + //Then go through and create the actual map + width=widthInTiles*_tileWidth; + height=heightInTiles*_tileHeight; + _rects=new Array(totalTiles); + i=0; + while(iFlxTilemapBufferyou are rendering to. + * @param Camera The relatedFlxCamera, mainly for scroll values. + */ + private function drawTilemap(Buffer:FlxTilemapBuffer,Camera:FlxCamera):Void + { + Buffer.fill(); + + //Copy tile images Into the tile buffer + _point.x=Std.int(Camera.scroll.x*scrollFactor.x)- x;//modified from getScreenXY() + _point.y=Std.int(Camera.scroll.y*scrollFactor.y)- y; + var screenXInTiles:Int=(_point.x +((_point.x>0)?0.0000001:-0.0000001))/_tileWidth; + var screenYInTiles:Int=(_point.y +((_point.y>0)?0.0000001:-0.0000001))/_tileHeight; + var screenRows:Int=Buffer.rows; + var screenColumns:Int=Buffer.columns; + + //Bound the upper left corner + if(screenXInTiles<0) + screenXInTiles=0; + if(screenXInTiles>widthInTiles-screenColumns) + screenXInTiles=widthInTiles-screenColumns; + if(screenYInTiles<0) + screenYInTiles=0; + if(screenYInTiles>heightInTiles-screenRows) + screenYInTiles=heightInTiles-screenRows; + + var rowIndex:Int=screenYInTiles*widthInTiles+screenXInTiles; + _flashPoint.y=0; + var row:Int=0; + var column:Int; + var columnIndex:Int; + var tile:FlxTile; + var debugTile:BitmapData; + while(row0)||(_point.y>0)||(_point.x + buffer.width0)?0.0000001:-0.0000001; + _flashPoint.y +=(_flashPoint.y>0)?0.0000001:-0.0000001; + buffer.draw(camera,_flashPoint); + _VISIBLECOUNT++; + } + } + + /** + * Sets a tilemap buffer to null so that the next draw call of this tilemap + * reinstantates it - useful for switching areas, resizing some map, without + * horrible weird problems. + * @param idx + * @return true if the buffer was reset, false if there is no such buffer + */ + public function null_buffer(idx:Int):Bool { + if(idx<_buffers.length){ + _buffers[idx]=null; + return true; + } + return false; + } + + /** + * Fetches the tilemap data array. + * + * @param Simple If true, returns the data as copy, as a series of 1s and 0s(useful for auto-tiling stuff). Default value is false, meaning it will return the actual data array(NOT a copy). + * + * @return An array the size of the tilemap full of Integers indicating tile placement. + */ + public function getData(Simple:Bool=false):Array + { + if(!Simple) + return _data; + + var i:Int=0; + var l:Int=_data.length; + var data:Array=new Array(l); + while(i0)?1:0; + i++; + } + return data; + } + + /** + * Set the dirty flag on all the tilemap buffers. + * Basically forces a reset of the drawn tilemaps, even if it wasn'tile necessary. + * + * @param Dirty Whether to flag the tilemap buffers as dirty or not. + */ + public function setDirty(Dirty:Bool=true):Void + { + var i:Int=0; + var l:Int=_buffers.length; + while(iFlxPathfrom the start to the end. If no path could be found, then a null reference is returned. + */ + public function findPath(Start:FlxPoint,End:FlxPoint,Simplify:Bool=true,RaySimplify:Bool=false):FlxPath + { + //figure out what tile we are starting and ending on. + var startIndex:Int=Std.int((Start.y-y)/_tileHeight)* widthInTiles + Std.int((Start.x-x)/_tileWidth); + var endIndex:Int=Std.int((End.y-y)/_tileHeight)* widthInTiles + Std.int((End.x-x)/_tileWidth); + + //check that the start and end are clear. + if(((_tileObjects[_data[startIndex]] as FlxTile).allowCollisions>0)|| + ((_tileObjects[_data[endIndex]] as FlxTile).allowCollisions>0)) + return null; + + //figure out how far each of the tiles is from the starting tile + var distances:Array=computePathDistance(startIndex,endIndex); + if(distances==null) + return null; + + //then count backward to find the shortest path. + var points:Array=new Array(); + walkPath(distances,endIndex,points); + + //reset the start and end points to be exact + var node:FlxPoint; + node=points[points.length-1] as FlxPoint; + node.x=Start.x; + node.y=Start.y; + node=points[0] as FlxPoint; + node.x=End.x; + node.y=End.y; + + //some simple path cleanup options + if(Simplify) + simplifyPath(points); + if(RaySimplify) + raySimplifyPath(points); + + //finally load the remaining points Into a new path object and return it + var path:FlxPath=new FlxPath(); + var i:Int=points.length - 1; + while(i>=0) + { + node=points[i--] as FlxPoint; + if(node !=null) + path.addPoint(node,true); + } + return path; + } + + /** + * Pathfinding helper function, strips out extra points on the same line. + * + * @param Points An array ofFlxPointnodes. + */ + private function simplifyPath(Points:Array):Void + { + var deltaPrevious:Float; + var deltaNext:Float; + var last:FlxPoint=Points[0]; + var node:FlxPoint; + var i:Int=1; + var l:Int=Points.length-1; + while(iFlxPointnodes. + */ + private function raySimplifyPath(Points:Array):Void + { + var source:FlxPoint=Points[0]; + var lastIndex:Int=-1; + var node:FlxPoint; + var i:Int=1; + var l:Int=Points.length; + while(i=0) + Points[lastIndex]=null; + } + else + source=Points[lastIndex]; + lastIndex=i-1; + } + } + + /** + * Pathfinding helper function, floods a grid with distance information until it finds the end point. + * NOTE:Currently this process does NOT use any kind of fancy heuristic! It's pretty brute. + * + * @param StartIndex The starting tile's map index. + * @param EndIndex The ending tile's map index. + * + * @return A FlashArrayofFlxPointnodes. If the end tile could not be found, then a nullArrayis returned instead. + */ + private function computePathDistance(StartIndex:Int, EndIndex:Int):Array + { + //Create a distance-based representation of the tilemap. + //All walls are flagged as -2, all open areas as -1. + var mapSize:Int=widthInTiles*heightInTiles; + var distances:Array=new Array(mapSize); + var i:Int=0; + while(i=[StartIndex]; + var current:Array; + var currentIndex:Int; + var left:Bool; + var right:Bool; + var up:Bool; + var down:Bool; + var currentLength:Int; + var foundEnd:Bool=false; + while(neighbors.length>0) + { + current=neighbors; + neighbors=new Array(); + + i=0; + currentLength=current.length; + while(i0; + right=currentIndex%widthInTiles0; + down=currentIndex/widthInTiles=-1)&&(distances[currentIndex+1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(right && down) + { + index=currentIndex + widthInTiles + 1; + if((distances[index]==-1)&&(distances[currentIndex+widthInTiles]>=-1)&&(distances[currentIndex+1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(left && down) + { + index=currentIndex + widthInTiles - 1; + if((distances[index]==-1)&&(distances[currentIndex+widthInTiles]>=-1)&&(distances[currentIndex-1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + if(up && left) + { + index=currentIndex - widthInTiles - 1; + if((distances[index]==-1)&&(distances[currentIndex-widthInTiles]>=-1)&&(distances[currentIndex-1]>=-1)) + { + distances[index]=distance; + neighbors.push(index); + } + } + } + distance++; + } + if(!foundEnd) + distances=null; + return distances; + } + + /** + * Pathfinding helper function, recursively walks the grid and finds a shortest path back to the start. + * + * @param Data A FlashArrayof distance information. + * @param Start The tile we're on in our walk backward. + * @param Points A FlashArrayofFlxPointnodes composing the path from the start to the end, compiled in reverse order. + */ + private function walkPath(Data:Array,Start:Int,Points:Array):Void + { + Points.push(new FlxPoint(x + Int(Start%widthInTiles)*_tileWidth + _tileWidth*0.5, y + Int(Start/widthInTiles)*_tileHeight + _tileHeight*0.5)); + if(Data[Start]==0) + return; + + //basic map bounds + var left:Bool=Start%widthInTiles>0; + var right:Bool=Start%widthInTiles0; + var down:Bool=Start/widthInTiles=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]=0)&&(Data[i]FlxObjectoverlaps thisFlxObjectobject in world space. + * If the group has a LOT of things in it, it might be faster to useFlxG.overlaps(). + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param Object The object being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + override public function overlaps(ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iFlxObjectwere located at the given position, would it overlap theFlxObjectorFlxGroup? + * This is distinct from overlapsPoint(), which just checks that point, rather than taking the object's size Into account. + * WARNING:Currently tilemaps do NOT support screen space overlap checks! + * + * @param X The X position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param Y The Y position you want to check. Pretends this object(the caller, not the parameter)is located here. + * @param ObjectOrGroup The object or group being tested. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. Default is false, or "only compare in world space." + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the two objects overlap. + */ + override public function overlapsAt(X:Float,Y:Float,ObjectOrGroup:FlxBasic,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var results:Bool=false; + var basic:FlxBasic; + var i:Int=0; + var members:Array=(ObjectOrGroup as FlxGroup).members; + while(iFlxObjectyou are checking for overlaps against. + * @param Callback An optional function that takes the form "myCallback(Object1:FlxObject,Object2:FlxObject)", where Dynamic1 is a FlxTile object, and Dynamic2 is the object passed in in the first parameter of this method. + * @param FlipCallbackParams Used to preserve A-B list ordering from FlxObject.separate()- returns the FlxTile object as the second parameter instead. + * @param Position Optional, specify a custom position for the tilemap(useful for overlapsAt()-type funcitonality). + * + * @return Whether there were overlaps, or if a callback was specified, whatever the return value of the callback was. + */ + public function overlapsWithCallback(Object:FlxObject,Callback:Function=null,FlipCallbackParams:Bool=false,Position:FlxPoint=null):Bool + { + var results:Bool=false; + + var X:Float=x; + var Y:Float=y; + if(Position !=null) + { + X=Position.x; + Y=Position.y; + } + + //Figure out what tiles we need to check against + var selectionX:Int=FlxU.floor((Object.x - X)/_tileWidth); + var selectionY:Int=FlxU.floor((Object.y - Y)/_tileHeight); + var selectionWidth:Int=selectionX +(FlxU.ceil(Object.width/_tileWidth))+ 1; + var selectionHeight:Int=selectionY + FlxU.ceil(Object.height/_tileHeight)+ 1; + + //Then bound these coordinates by the map edges + if(selectionX<0) + selectionX=0; + if(selectionY<0) + selectionY=0; + if(selectionWidth>widthInTiles) + selectionWidth=widthInTiles; + if(selectionHeight>heightInTiles) + selectionHeight=heightInTiles; + + //Then loop through this selection of tiles and call FlxObject.separate()accordingly + var rowStart:Int=selectionY*widthInTiles; + var row:Int=selectionY; + var column:Int; + var tile:FlxTile; + var overlapFound:Bool; + var deltaX:Float=X - last.x; + var deltaY:Float=Y - last.y; + while(rowtile.x)&&(Object.xtile.y)&&(Object.yFlxObjectobject. + * + * @param Point The point in world space you want to check. + * @param InScreenSpace Whether to take scroll factors Into account when checking for overlap. + * @param Camera Specify which game camera you want. If null getScreenXY()will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + override public function overlapsPoint(Point:FlxPoint,InScreenSpace:Bool=false,Camera:FlxCamera=null):Bool + { + if(!InScreenSpace) + return(_tileObjects[_data[uint(uint((Point.y-y)/_tileHeight)*widthInTiles +(Point.x-x)/_tileWidth)]] as FlxTile).allowCollisions>0; + + if(Camera==null) + Camera=FlxG.camera; + Point.x=Point.x - Camera.scroll.x; + Point.y=Point.y - Camera.scroll.y; + getScreenXY(_point,Camera); + return(_tileObjects[_data[uint(uint((Point.y-_point.y)/_tileHeight)*widthInTiles +(Point.x-_point.x)/_tileWidth)]] as FlxTile).allowCollisions>0; + } + + /** + * Check the value of a particular tile. + * + * @param X The X coordinate of the tile(in tiles, not pixels). + * @param Y The Y coordinate of the tile(in tiles, not pixels). + * + * @return A Int containing the value of the tile at this spot in the array. + */ + public function getTile(X:Int,Y:Int):Int + { + return _data[Y * widthInTiles + X] as Int; + } + + /** + * Get the value of a tile in the tilemap by index. + * + * @param Index The slot in the data array(Y * widthInTiles + X)where this tile is stored. + * + * @return A Int containing the value of the tile at this spot in the array. + */ + public function getTileByIndex(Index:Int):Int + { + return _data[Index] as Int; + } + + /** + * Returns a new FlashArrayfull of every map index of the requested tile type. + * + * @param Index The requested tile type. + * + * @return AnArraywith a list of all map indices of that tile type. + */ + public function getTileInstances(Index:Int):Array + { + var array:Array=null; + var i:Int=0; + var l:Int=widthInTiles * heightInTiles; + while(iArrayfull of every coordinate of the requested tile type. + * + * @param Index The requested tile type. + * @param Midpoint Whether to return the coordinates of the tile midpoint, or upper left corner. Default is true, return midpoint. + * + * @return AnArraywith a list of all the coordinates of that tile type. + */ + public function getTileCoords(Index:Int,Midpoint:Bool=true):Array + { + var array:Array=null; + + var point:FlxPoint; + var i:Int=0; + var l:Int=widthInTiles * heightInTiles; + while(i=widthInTiles)||(Y>=heightInTiles)) + return false; + return setTileByIndex(Y * widthInTiles + X,Tile,UpdateGraphics); + } + + /** + * Change the data and graphic of a tile in the tilemap. + * + * @param Index The slot in the data array(Y * widthInTiles + X)where this tile is stored. + * @param Tile The new Integer data you wish to inject. + * @param UpdateGraphics Whether the graphical representation of this tile should change. + * + * @return Whether or not the tile was actually changed. + */ + public function setTileByIndex(Index:Int,Tile:Int,UpdateGraphics:Bool=true):Bool + { + if(Index>=_data.length) + return false; + + var ok:Bool=true; + _data[Index]=Tile; + + if(!UpdateGraphics) + return ok; + + setDirty(); + + if(auto==OFF) + { + updateTile(Index); + return ok; + } + + //If this map is autotiled and it changes, locally update the arrangement + var i:Int; + var row:Int=Std.int(Index/widthInTiles)- 1; + var rowLength:Int=row + 3; + var column:Int=Index%widthInTiles - 1; + var columnHeight:Int=column + 3; + while(row=0)&&(row=0)&&(columnlavaCallback(Tile:FlxTile, Dynamic:FlxObject). + * @param CallbackFilter If you only want the callback to go off for certain classes or objects based on a certain class, set that class here. + * @param Range If you want this callback to work for a bunch of different tiles, input the range here. Default value is 1. + */ + public function setTileProperties(Tile:Int,AllowCollisions:Int=0x1111,Callback:Function=null,CallbackFilter:Class=null,Range:Int=1):Void + { + if(Range<=0) + Range=1; + var tile:FlxTile; + var i:Int=Tile; + var l:Int=Tile+Range; + while(iFlxRect. + * + * @param Bounds Optional, pass in a pre-existingFlxRectto prevent instantiation of a new object. + * + * @return AFlxRectcontaining the world coordinates and size of the entire tilemap. + */ + public function getBounds(Bounds:FlxRect=null):FlxRect + { + if(Bounds==null) + Bounds=new FlxRect(); + return Bounds.make(x,y,width,height); + } + + /** + * Shoots a ray from the start point to the end point. + * If/when it passes through a tile, it stores that point and returns false. + * + * @param Start The world coordinates of the start of the ray. + * @param End The world coordinates of the end of the ray. + * @param Result APointobject containing the first wall impact. + * @param Resolution Defaults to 1, meaning check every tile or so. Higher means more checks! + * @return Returns true if the ray made it from Start to End without hitting anything. Returns false and fills Result if a tile was hit. + */ + public function ray(Start:FlxPoint, End:FlxPoint, Result:FlxPoint=null, Resolution:Float=1):Bool + { + var step:Float=_tileWidth; + if(_tileHeight<_tileWidth) + step=_tileHeight; + step /=Resolution; + var deltaX:Float=End.x - Start.x; + var deltaY:Float=End.y - Start.y; + var distance:Float=Math.sqrt(deltaX*deltaX + deltaY*deltaY); + var steps:Int=Math.ceil(distance/step); + var stepX:Float=deltaX/steps; + var stepY:Float=deltaY/steps; + var curX:Float=Start.x - stepX - x; + var curY:Float=Start.y - stepY - y; + var tileX:Int; + var tileY:Int; + var i:Int=0; + while(iwidth)||(curY<0)||(curY>height)) + { + i++; + continue; + } + + tileX=curX/_tileWidth; + tileY=curY/_tileHeight; + if((_tileObjects[_data[tileY*widthInTiles+tileX]] as FlxTile).allowCollisions) + { + //Some basic helper stuff + tileX *=_tileWidth; + tileY *=_tileHeight; + var rx:Float=0; + var ry:Float=0; + var q:Float; + var lx:Float=curX-stepX; + var ly:Float=curY-stepY; + + //Figure out if it crosses the X boundary + q=tileX; + if(deltaX<0) + q +=_tileWidth; + rx=q; + ry=ly + stepY*((q-lx)/stepX); + if((ry>tileY)&&(rytileX)&&(rxFlxTilemap-friendly format. + */ + static public function arrayToCSV(Data:Array,Width:Int,Invert:Bool=false):String + { + var row:Int=0; + var column:Int; + var csv:String; + var Height:Int=Data.length / Width; + var index:Int; + while(rowBitmapDataobject to a comma-separated string. + * Black pixels are flagged as 'solid' by default, + * non-black pixels are set as non-colliding. + * Black pixels must be PURE BLACK. + * + * @param bitmapData A FlashBitmapDataobject, preferably black and white. + * @param Invert Load white pixels as solid instead. + * @param Scale Default is 1. Scale of 2 means each pixel forms a 2x2 block of tiles, and so on. + * @param ColorMap An array of color values(uint 0xAARRGGBB)in the order they're Intended to be assigned as indices + * + * @return A comma-separated string containing the level data in aFlxTilemap-friendly format. + */ + static public function bitmapToCSV(bitmapData:BitmapData,Invert:Bool=false,Scale:Int=1,ColorMap:Array=null):String + { + //Import and scale image if necessary + if(Scale>1) + { + var bd:BitmapData=bitmapData; + bitmapData=new BitmapData(bitmapData.width*Scale,bitmapData.height*Scale); + var mtx:Matrix=new Matrix(); + mtx.scale(Scale,Scale); + bitmapData.draw(bd,mtx); + } + + //Walk image and export pixel values + var row:Int=0; + var column:Int; + var pixel:Int; + var csv:String=""; + var bitmapWidth:Int=bitmapData.width; + var bitmapHeight:Int=bitmapData.height; + while(row0))||(!Invert &&(pixel==0))) + pixel=1; + else + pixel=0; + + //Write the result to the string + if(column==0) + { + if(row==0) + csv +=pixel; + else + csv +="\n"+pixel; + } + else + csv +=", "+pixel; + column++; + } + row++; + } + return csv; + } + + /** + * Converts a resource image file to a comma-separated string. + * Black pixels are flagged as 'solid' by default, + * non-black pixels are set as non-colliding. + * Black pixels must be PURE BLACK. + * + * @param ImageFile An embedded graphic, preferably black and white. + * @param Invert Load white pixels as solid instead. + * @param Scale Default is 1. Scale of 2 means each pixel forms a 2x2 block of tiles, and so on. + * + * @return A comma-separated string containing the level data in aFlxTilemap-friendly format. + */ + static public function imageToCSV(ImageFile:Class,Invert:Bool=false,Scale:Int=1):String + { + return bitmapToCSV((new ImageFile).bitmapData,Invert,Scale); + } + + /** + * An Internal function used by the binary auto-tilers. + * + * @param Index The index of the tile you want to analyze. + */ + private function autoTile(Index:Int):Void + { + if(_data[Index]==0) + return; + + _data[Index]=0; + if((Index-widthInTiles<0)||(_data[Index-widthInTiles]>0)) //UP + _data[Index] +=1; + if((Index%widthInTiles>=widthInTiles-1)||(_data[Index+1]>0)) //RIGHT + _data[Index] +=2; + if((Index+widthInTiles>=totalTiles)||(_data[Index+widthInTiles]>0))//DOWN + _data[Index] +=4; + if((Index%widthInTiles<=0)||(_data[Index-1]>0)) //LEFT + _data[Index] +=8; + if((auto==ALT)&&(_data[Index]==15)) //The alternate algo checks for Interior corners + { + if((Index%widthInTiles>0)&&(Index+widthInTiles0)&&(Index-widthInTiles>=0)&&(_data[Index-widthInTiles-1]<=0)) + _data[Index]=2; //TOP LEFT OPEN + if((Index%widthInTiles=0)&&(_data[Index-widthInTiles+1]<=0)) + _data[Index]=4; //TOP RIGHT OPEN + if((Index%widthInTiles=_tiles.width) + { + ry=uint(rx/_tiles.width)*_tileHeight; + rx %=_tiles.width; + } + _rects[Index]=(new Rectangle(rx,ry,_tileWidth,_tileHeight)); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxTimer.hx b/intra/source/org/flixel/FlxTimer.hx new file mode 100644 index 0000000..287fc01 --- /dev/null +++ b/intra/source/org/flixel/FlxTimer.hx @@ -0,0 +1,171 @@ +package org.flixel; + +import org.flixel.plugin.TimerManager; + +/** + * A simple timer class, leveraging the new plugins system. + * Can be used with callbacks or by polling thefinishedflag. + * Not Intended to be added to a game state or group;the timer manager + * is responsible for actually calling update(), not the user. + * + * @author Adam Atomic + */ +class FlxTimer +{ + /** + * How much time the timer was set for. + */ + public var time:Float; + /** + * How many loops the timer was set for. + */ + public var loops:Int; + /** + * Pauses or checks the pause state of the timer. + */ + public var paused:Bool; + /** + * Check to see if the timer is finished. + */ + public var finished:Bool; + + /** + * Internal tracker for the time's-up callback function. + * Callback should be formed "onTimer(Timer:FlxTimer);" + */ + private var _callback:Function; + /** + * Internal tracker for the actual timer counting up. + */ + private var _timeCounter:Float; + /** + * Internal tracker for the loops counting up. + */ + private var _loopsCounter:Int; + + /** + * Instantiate the timer. Does not set or start the timer. + */ + public function new() + { + time=0; + loops=0; + _callback=null; + _timeCounter=0; + _loopsCounter=0; + + paused=false; + finished=false; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + stop(); + _callback=null; + } + + /** + * Called by the timer manager plugin to update the timer. + * If time runs out, the loop counter is advanced, the timer reset, and the callback called if it exists. + * If the timer runs out of loops, then the timer callsstop(). + * However, callbacks are called AFTERstop()is called. + */ + public function update():Void + { + _timeCounter +=FlxG.elapsed; + while((_timeCounter>=time)&& !paused && !finished) + { + _timeCounter -=time; + + _loopsCounter++; + if((loops>0)&&(_loopsCounter>=loops)) + stop(); + + if(_callback !=null) + _callback(this); + } + } + + /** + * Starts or resumes the timer. If this timer was paused, + * then all the parameters are ignored, and the timer is resumed. + * Adds the timer to the timer manager. + * + * @param Time How many seconds it takes for the timer to go off. + * @param Loops How many times the timer should go off. Default is 1, or "just count down once." + * @param Callback Optional, triggered whenever the time runs out, once for loop. Callback should be formed "onTimer(Timer:FlxTimer);" + * + * @return A reference to itself(handy for chaining or whatever). + */ + public function start(Time:Float=1,Loops:Int=1,Callback:Function=null):FlxTimer + { + var timerManager:TimerManager=manager; + if(timerManager !=null) + timerManager.add(this); + + if(paused) + { + paused=false; + return this; + } + + paused=false; + finished=false; + time=Time; + loops=Loops; + _callback=Callback; + _timeCounter=0; + _loopsCounter=0; + return this; + } + + /** + * Stops the timer and removes it from the timer manager. + */ + public function stop():Void + { + finished=true; + var timerManager:TimerManager=manager; + if(timerManager !=null) + timerManager.remove(this); + } + + /** + * Read-only:check how much time is left on the timer. + */ + public var timeLeft(get_timeLeft, null):Float; + private function get_timeLeft():Float + { + return time-_timeCounter; + } + + /** + * Read-only:check how many loops are left on the timer. + */ + public var loopsLeft(get_loopsLeft, null):Int; + private function get_loopsLeft():Int + { + return loops-_loopsCounter; + } + + /** + * Read-only:how far along the timer is, on a scale of 0.0 to 1.0. + */ + public var progress(get_progress, null):Float; + private function get_progress():Float + { + if(time>0) + return _timeCounter/time; + else + return 0; + } + + static public var manager(get_manager, null):TimerManager; + private function get_manager():TimerManager + { + return FlxG.getPlugin(TimerManager)as TimerManager; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/FlxU.hx b/intra/source/org/flixel/FlxU.hx new file mode 100644 index 0000000..4527d1e --- /dev/null +++ b/intra/source/org/flixel/FlxU.hx @@ -0,0 +1,621 @@ +package org.flixel; + +import flash.net.URLRequest; +import flash.net.navigateToURL; +import flash.utils.getDefinitionByName; +import flash.utils.getQualifiedClassName; +import flash.utils.getTimer; + +class FlxU +{ + /** + * Opens a web page in a new tab or window. + * MUST be called from the UI thread or else badness. + * + * @param URL The address of the web page. + */ + static public function openURL(URL:String):Void + { + navigateToURL(new URLRequest(URL), "_blank"); + } + + /** + * Calculate the absolute value of a number. + * + * @param Value Any number. + * + * @return The absolute value of that number. + */ + static public function abs(Value:Float):Float + { + return(Value>0)?Value:-Value; + } + + /** + * Round down to the next whole number. E.g. floor(1.7)==1, and floor(-2.7)==-2. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function floor(Value:Float):Float + { + var number:Float=Std.int(Value); + return(Value>0)?(number):((number!=Value)?(number-1):(number)); + } + + /** + * Round up to the next whole number. E.g. ceil(1.3)==2, and ceil(-2.3)==-3. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function ceil(Value:Float):Float + { + var number:Float=Std.int(Value); + return(Value>0)?((number!=Value)?(number+1):(number)):(number); + } + + /** + * Round to the closest whole number. E.g. round(1.7)==2, and round(-2.3)==-2. + * + * @param Value Any number. + * + * @return The rounded value of that number. + */ + static public function round(Value:Float):Float + { + var number:Float=Std.int(Value+((Value>0)?0.5:-0.5)); + return(Value>0)?(number):((number!=Value)?(number-1):(number)); + } + + /** + * Figure out which number is smaller. + * + * @param Number1 Any number. + * @param Number2 Any number. + * + * @return The smaller of the two numbers. + */ + static public function min(Number1:Float,Number2:Float):Float + { + return(Number1<=Number2)?Number1:Float2; + } + + /** + * Figure out which number is larger. + * + * @param Number1 Any number. + * @param Number2 Any number. + * + * @return The larger of the two numbers. + */ + static public function max(Number1:Float,Number2:Float):Float + { + return(Number1>=Number2)?Number1:Float2; + } + + /** + * Bound a number by a minimum and maximum. + * Ensures that this number is no smaller than the minimum, + * and no larger than the maximum. + * + * @param Value Any number. + * @param Min Any number. + * @param Max Any number. + * + * @return The bounded value of the number. + */ + static public function bound(Value:Float,Min:Float,Max:Float):Float + { + var lowerBound:Float=(ValueMax)?Max:lowerBound; + } + + /** + * Generates a random number based on the seed provided. + * + * @param Seed A number between 0 and 1, used to generate a predictable random number(very optional). + * + * @return ANumberbetween 0 and 1. + */ + static public function srand(Seed:Float):Float + { + return((69621 * Std.int(Seed * 0x7FFFFFFF))% 0x7FFFFFFF)/ 0x7FFFFFFF; + } + + /** + * Shuffles the entries in an array Into a new random order. + *FlxG.shuffle()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.shuffle()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param A A FlashArrayobject containing...stuff. + * @param HowManyTimes How many swaps to perform during the shuffle operation. Good rule of thumb is 2-4 times as many objects are in the list. + * + * @return The same FlashArrayobject that you passed in in the first place. + */ + static public function shuffle(Objects:Array,HowManyTimes:Int):Array + { + var i:Int=0; + var index1:Int; + var index2:Int; + var object:Dynamic; + while(iFlxG.getRandom()is deterministic and safe for use with replays/recordings. + * HOWEVER,FlxU.getRandom()is NOT deterministic and unsafe for use with replays/recordings. + * + * @param Objects A Flash array of objects. + * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. + * @param Length Optional restriction on the number of values you want to randomly select from. + * + * @return The random object that was selected. + */ + static public function getRandom(Objects:Array,StartIndex:Int=0,Length:Int=0):Dynamic + { + if(Objects !=null) + { + var l:Int=Length; + if((l==0)||(l>Objects.length - StartIndex)) + l=Objects.length - StartIndex; + if(l>0) + return Dynamics[StartIndex + Int(Math.random()*l)]; + } + return null; + } + + /** + * Just grabs the current "ticks" or time in milliseconds that has passed since Flash Player started up. + * Useful for finding out how long it takes to execute specific blocks of code. + * + * @return Auintto be passed toFlxU.endProfile(). + */ + static public function getTicks():Int + { + return getTimer(); + } + + /** + * Takes two "ticks" timestamps and formats them Into the number of seconds that passed as a String. + * Useful for logging, debugging, the watch window, or whatever else. + * + * @param StartTicks The first timestamp from the system. + * @param EndTicks The second timestamp from the system. + * + * @return AStringcontaining the formatted time elapsed information. + */ + static public function formatTicks(StartTicks:Int,EndTicks:Int):String + { + return((EndTicks-StartTicks)/1000)+"s" + } + + /** + * Generate a Flashuintcolor from RGBA components. + * + * @param Red The red component, between 0 and 255. + * @param Green The green component, between 0 and 255. + * @param Blue The blue component, between 0 and 255. + * @param Alpha How opaque the color should be, either between 0 and 1 or 0 and 255. + * + * @return The color as auint. + */ + static public function makeColor(Red:Int, Green:Int, Blue:Int, Alpha:Float=1.0):Int + { + return(((Alpha>1)?Alpha:(Alpha * 255))& 0xFF)<<24 |(Red & 0xFF)<<16 |(Green & 0xFF)<<8 |(Blue & 0xFF); + } + + /** + * Generate a Flashuintcolor from HSB components. + * + * @param Hue A number between 0 and 360, indicating position on a color strip or wheel. + * @param Saturation A number between 0 and 1, indicating how colorful or gray the color should be. 0 is gray, 1 is vibrant. + * @param Brightness A number between 0 and 1, indicating how bright the color should be. 0 is black, 1 is full bright. + * @param Alpha How opaque the color should be, either between 0 and 1 or 0 and 255. + * + * @return The color as auint. + */ + static public function makeColorFromHSB(Hue:Float,Saturation:Float,Brightness:Float,Alpha:Float=1.0):Int + { + var red:Float; + var green:Float; + var blue:Float; + if(Saturation==0.0) + { + red=Brightness; + green=Brightness; + blue=Brightness; + } + else + { + if(Hue==360) + Hue=0; + var slice:Int=Hue/60; + var hf:Float=Hue/60 - slice; + var aa:Float=Brightness*(1 - Saturation); + var bb:Float=Brightness*(1 - Saturation*hf); + var cc:Float=Brightness*(1 - Saturation*(1.0 - hf)); + switch(slice) + { + case 0:red=Brightness;green=cc;blue=aa;break; + case 1:red=bb;green=Brightness;blue=aa;break; + case 2:red=aa;green=Brightness;blue=cc;break; + case 3:red=aa;green=bb;blue=Brightness;break; + case 4:red=cc;green=aa;blue=Brightness;break; + case 5:red=Brightness;green=aa;blue=bb;break; + default:red=0;green=0; blue=0;break; + } + } + + return(((Alpha>1)?Alpha:(Alpha * 255))& 0xFF)<<24 | Int(red*255)<<16 | Int(green*255)<<8 | Int(blue*255); + } + + /** + * Loads an array with the RGBA values of a Flashuintcolor. + * RGB values are stored 0-255. Alpha is stored as a floating point number between 0 and 1. + * + * @param Color The color you want to break Into components. + * @param Results An optional parameter, allows you to use an array that already exists in memory to store the result. + * + * @return AnArrayobject containing the Red, Green, Blue and Alpha values of the given color. + */ + static public function getRGBA(Color:Int,Results:Array=null):Array + { + if(Results==null) + Results=new Array(); + Results[0]=(Color>>16)& 0xFF; + Results[1]=(Color>>8)& 0xFF; + Results[2]=Color & 0xFF; + Results[3]=Std.parseFloat((Color>>24)& 0xFF)/ 255; + return Results; + } + + /** + * Loads an array with the HSB values of a Flashuintcolor. + * Hue is a value between 0 and 360. Saturation, Brightness and Alpha + * are as floating point numbers between 0 and 1. + * + * @param Color The color you want to break Into components. + * @param Results An optional parameter, allows you to use an array that already exists in memory to store the result. + * + * @return AnArrayobject containing the Red, Green, Blue and Alpha values of the given color. + */ + static public function getHSB(Color:Int,Results:Array=null):Array + { + if(Results==null) + Results=new Array(); + + var red:Float=Std.parseFloat((Color>>16)& 0xFF)/ 255; + var green:Float=Std.parseFloat((Color>>8)& 0xFF)/ 255; + var blue:Float=Std.parseFloat((Color)& 0xFF)/ 255; + + var m:Float=(red>green)?red:green; + var dmax:Float=(m>blue)?m:blue; + m=(red>green)?green:red; + var dmin:Float=(m>blue)?blue:m; + var range:Float=dmax - dmin; + + Results[2]=dmax; + Results[1]=0; + Results[0]=0; + + if(dmax !=0) + Results[1]=range / dmax; + if(Results[1] !=0) + { + if(red==dmax) + Results[0]=(green - blue)/ range; + else if(green==dmax) + Results[0]=2 +(blue - red)/ range; + else if(blue==dmax) + Results[0]=4 +(red - green)/ range; + Results[0] *=60; + if(Results[0]<0) + Results[0] +=360; + } + + Results[3]=Std.parseFloat((Color>>24)& 0xFF)/ 255; + return Results; + } + + /** + * Format seconds as minutes with a colon, an optionally with milliseconds too. + * + * @param Seconds The number of seconds(for example, time remaining, time spent, etc). + * @param ShowMS Whether to show milliseconds after a "." as well. Default value is false. + * + * @return A nicely formattedString, like "1:03". + */ + static public function formatTime(Seconds:Float,ShowMS:Bool=false):String + { + var timeString:String=Std.int(Seconds/60)+ ":"; + var timeStringHelper:Int=Std.int(Seconds)%60; + if(timeStringHelper<10) + timeString +="0"; + timeString +=timeStringHelper; + if(ShowMS) + { + timeString +="."; + timeStringHelper=(Seconds-int(Seconds))*100; + if(timeStringHelper<10) + timeString +="0"; + timeString +=timeStringHelper; + } + return timeString; + } + + /** + * Generate a comma-separated string from an array. + * Especially useful for tracing or other debug output. + * + * @param AnyArray AnyArrayobject. + * + * @return A comma-separatedStringcontaining the.toString()output of each element in the array. + */ + static public function formatArray(AnyArray:Array):String + { + if((AnyArray==null)||(AnyArray.length<=0)) + return ""; + var string:String=AnyArray[0].toString(); + var i:Int=0; + var l:Int=AnyArray.length; + while(ivar results:String=FlxU.formatMoney(10,false); + * However, very handy for displaying large sums or decimal money values. + * + * @param Amount How much moneys(in dollars, or the equivalent "main" currency - i.e. not cents). + * @param ShowDecimal Whether to show the decimals/cents component. Default value is true. + * @param EnglishStyle Major quantities(thousands, millions, etc)separated by commas, and decimal by a period. Default value is true. + * + * @return A nicely formattedString. Does not include a dollar sign or anything! + */ + static public function formatMoney(Amount:Float,ShowDecimal:Bool=true,EnglishStyle:Bool=true):String + { + var helper:Int; + var amount:Int=Amount; + var string:String=""; + var comma:String=""; + var zeroes:String=""; + while(amount>0) + { + if((string.length>0)&& comma.length<=0) + { + if(EnglishStyle) + comma=","; + else + comma="."; + } + zeroes=""; + helper=amount - Std.int(amount/1000)*1000; + amount /=1000; + if(amount>0) + { + if(helper<100) + zeroes +="0"; + if(helper<10) + zeroes +="0"; + } + string=zeroes + helper + comma + string; + } + if(ShowDecimal) + { + amount=Std.int(Amount*100)-(int(Amount)*100); + string +=(EnglishStyle?".":",")+ amount; + if(amount<10) + string +="0"; + } + return string; + } + + /** + * Get theStringname of anyObject. + * + * @param Obj TheObjectobject in question. + * @param Simple Returns only the class name, not the package or packages. + * + * @return The name of theClassas aStringobject. + */ + static public function getClassName(Obj:Dynamic,Simple:Bool=false):String + { + var string:String=getQualifiedClassName(Obj); + string=string.replace("::","."); + if(Simple) + string=string.substr(string.lastIndexOf(".")+1); + return string; + } + + /** + * Check to see if two objects have the same class name. + * + * @param Object1 The first object you want to check. + * @param Object2 The second object you want to check. + * + * @return Whether they have the same class name or not. + */ + static public function compareClassNames(Object1:Dynamic,Object2:Dynamic):Bool + { + return getQualifiedClassName(Object1)==getQualifiedClassName(Object2); + } + + /** + * Look up aClassobject by its string name. + * + * @param Name TheStringname of theClassyou are Interested in. + * + * @return AClassobject. + */ + static public function getClass(Name:String):Class + { + return getDefinitionByName(Name)as Class; + } + + /** + * A tween-like function that takes a starting velocity + * and some other factors and returns an altered velocity. + * + * @param Velocity Any component of velocity(e.g. 20). + * @param Acceleration Rate at which the velocity is changing. + * @param Drag Really kind of a deceleration, this is how much the velocity changes if Acceleration is not set. + * @param Max An absolute value cap for the velocity. + * + * @return The altered Velocity value. + */ + static public function computeVelocity(Velocity:Float, Acceleration:Float=0, Drag:Float=0, Max:Float=10000):Float + { + if(Acceleration !=0) + Velocity +=Acceleration*FlxG.elapsed; + else if(Drag !=0) + { + var drag:Float=Drag*FlxG.elapsed; + if(Velocity - drag>0) + Velocity=Velocity - drag; + else if(Velocity + drag<0) + Velocity +=drag; + else + Velocity=0; + } + if((Velocity !=0)&&(Max !=10000)) + { + if(Velocity>Max) + Velocity=Max; + else if(Velocity<-Max) + Velocity=-Max; + } + return Velocity; + } + + //*** NOTE:THESE LAST THREE FUNCTIONS REQUIRE FLXPOINT ***// + + /** + * Rotates a point in 2D space around another point by the given angle. + * + * @param X The X coordinate of the point you want to rotate. + * @param Y The Y coordinate of the point you want to rotate. + * @param PivotX The X coordinate of the point you want to rotate around. + * @param PivotY The Y coordinate of the point you want to rotate around. + * @param Angle Rotate the point by this many degrees. + * @param Point OptionalFlxPointto store the results in. + * + * @return AFlxPointcontaining the coordinates of the rotated point. + */ + static public function rotatePoint(X:Float, Y:Float, PivotX:Float, PivotY:Float, Angle:Float,Point:FlxPoint=null):FlxPoint + { + var sin:Float=0; + var cos:Float=0; + var radians:Float=Angle * -0.017453293; + while(radians<-3.14159265) + radians +=6.28318531; + while(radians>3.14159265) + radians=radians - 6.28318531; + + if(radians<0) + { + sin=1.27323954 * radians + .405284735 * radians * radians; + if(sin<0) + sin=.225 *(sin *-sin - sin)+ sin; + else + sin=.225 *(sin * sin - sin)+ sin; + } + else + { + sin=1.27323954 * radians - 0.405284735 * radians * radians; + if(sin<0) + sin=.225 *(sin *-sin - sin)+ sin; + else + sin=.225 *(sin * sin - sin)+ sin; + } + + radians +=1.57079632; + if(radians>3.14159265) + radians=radians - 6.28318531; + if(radians<0) + { + cos=1.27323954 * radians + 0.405284735 * radians * radians; + if(cos<0) + cos=.225 *(cos *-cos - cos)+ cos; + else + cos=.225 *(cos * cos - cos)+ cos; + } + else + { + cos=1.27323954 * radians - 0.405284735 * radians * radians; + if(cos<0) + cos=.225 *(cos *-cos - cos)+ cos; + else + cos=.225 *(cos * cos - cos)+ cos; + } + var dx:Float=X - PivotX; + var dy:Float=PivotY + Y;//Y axis is inverted in flash, normally this would be a subtract operation + + if(Point==null) + Point=new FlxPoint(); + Point.x=PivotX + cos*dx - sin*dy; + Point.y=PivotY - sin * dx - cos * dy; + return Point; + }; + + /** + * Calculates the angle between two points. 0 degrees points straight up. + * + * @param Point1 The X coordinate of the point. + * @param Point2 The Y coordinate of the point. + * + * @return The angle in degrees, between -180 and 180. + */ + static public function getAngle(Point1:FlxPoint, Point2:FlxPoint):Float + { + var x:Float=Point2.x - Point1.x; + var y:Float=Point2.y - Point1.y; + if((x==0)&&(y==0)) + return 0; + var c1:Float=3.14159265 * 0.25; + var c2:Float=3 * c1; + var ay:Float=(y<0)?-y:y; + var angle:Float=0; + if(x>=0) + angle=c1 - c1 *((x - ay)/(x + ay)); + else + angle=c2 - c1 *((x + ay)/(ay - x)); + angle=((y<0)?-angle:angle)*57.2957796; + if(angle>90) + angle=angle - 270; + else + angle +=90; + return angle; + }; + + /** + * Calculate the distance between two points. + * + * @param Point1 AFlxPointobject referring to the first location. + * @param Point2 AFlxPointobject referring to the second location. + * + * @return The distance between the two points as a floating pointNumberobject. + */ + static public function getDistance(Point1:FlxPoint,Point2:FlxPoint):Float + { + var dx:Float=Point1.x - Point2.x; + var dy:Float=Point1.y - Point2.y; + return Math.sqrt(dx * dx + dy * dy); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/data/autotiles.png b/intra/source/org/flixel/data/autotiles.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c53baa8ef9a8f6966a3e1399117940dfc83644 GIT binary patch literal 3677 zcmV-j4x;giP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00093P)t-s00019US0qI00RR91Ox;H1qB8M1_uWR2nYxX2?+`c3JVJh3=9kn4Gj(s z4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ec zARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGN zF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7 zLPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h? zR8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJz zWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=j zc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlT zh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NE znVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@} zs;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To( zyu7@dCU$jHda$;ryf%FD~k%*@Qq z&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK z@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~LQ0<_ z00003bW%=J|Nj8j$_+sP003=CL_t(|+U%3D62Kq`Ltp&=k9JTzfmYnQ)Fl@Z1v#Jr zKtljxat4P=$Ju=FPM0JJOE9^Xx6qAR0{K9xZx8QCz=NL6Prp3qe*xbYU_<6me%Rg% vNcM2b0&L9!hIOktK)QC@feruw|NjF3^!EVqqp5Qx00000NkvXXu0mjfbjaS@ literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/autotiles_alt.png b/intra/source/org/flixel/data/autotiles_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5b05f30fbb09b108b41a36a87cb533517ed039 GIT binary patch literal 3686 zcmV-s4w>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00093P)t-s00019US0qI00RR91Ox;H1qB8M1_uWR2nYxX2?+`c3JVJh3=9kn4Gj(s z4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ec zARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGN zF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7 zLPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h? zR8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJz zWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=j zc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlT zh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NE znVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@} zs;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To( zyu7@dCU$jHda$;ryf%FD~k%*@Qq z&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK z@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~LQ0<_ z00003bW%=J|Nj8j$_+sP004GLL_t(|+U!$F62Kq`OBnzEWa&W|TQ%BSFZBXp2@VSk z0DuqxILHKS(y;PxjW_<;Uuv_}0|h;lh=+?xneR_rmA^E#mt7OP(D#uYYktGW@Bcu_ z`EZ&JUrc;nT^@EqwZO(qTh^dH(``p7Z|nj90RR630Lvf}D_|PvOaK4?07*qoM6N<$ Ef&%H`MgRZ+ literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/beep.mp3 b/intra/source/org/flixel/data/beep.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d70119a5b1a07477156db82f9c24ce3ae5a0ce0d GIT binary patch literal 2114 zcmeHG`#02S7=O($W=A!{4pL$=v&_h7G$ZCzjLR@)F++s18Vpg>WyPke@3_UvZRkSC zHB>@jwX()F=^~r4s@*kii_}smt;Tm}e%n7`f9P}0`@HY-dCqyyc|M=#adW04feJVu zC!VMBMk$Y@C?@Q$Z)mJk4>)u!Pv4LP7oH3y2(K-(dpr1@p>`YB-Y2tfds zaLNYMI6d!kL)Z6MT{vpAGxnX>KY0Ukh&nzLI2dJ^EPfVKGJUEwsP>#<ob^X_8|!a2zXgxqUAs)=~SC$;fh);}d;ysMi6E z7Tf`2oE`XWr4pR~){pSGxiNa*ba{dw3V}~KvpFRWes9R^XxdzsZ|QBw?6h#tI10lP z53^(MhkR$5r=Qk)*((X5l*p(}Vf=L0YfrtRBeIxkGuMjfZnuiC^WD1L&Snb{AsAjU zUxJz0>oggxy`$&H#Qg$3AWIQ1UkC+Y5?Cel>8w10zLi;Mb`Z40R zS@l2DQ1z~#d!9$qBShK3gDLB8x;(NNI1o4w_8vajSD7DW`#qJB9uK)Em&`P6_$|1O zMS;|=j4|(8=ZiT6+LJSx5StA_k@26bueZ9cX}hTbir450Irs4X5>FRlh8HzA>VRzL zBlpHbPkko+@|LJU!evf!`~+XL2bB~O;S=8ND2lLjMY08=pnTm_D}J7?K2a>F+r9h3hgw$t(70xi*;(#g(kc!IeNrh6Ko4j;A$=?zN2_UP(bj_fG$f0J0D3`_hoh@_rM$Q|nTv&{+c`@c zEfy-`YHPO6vaTW-!-mlVToZemY5xwp3jfi*v)rM^xYwumEe`y2yY6qmM;0nv5_K8y zU88Y(cpCn&3cq!6L-Tl3r5iVywmwcS&wcGe8tZrRMHAAif(vVW4T^C1z=*fu z=;fuxlZ^&LZrQWu?yoB&hK~vmV|h$wJNC-4D8K5Ko#7dV)ZrZa+}h8BOdI`NPc9zG z0TBTXD1wKOREVP>pIbRkC*h*|SPD9aD@v%;qFY|Ds0(4Fj7kew@4LPwdS)4^pX|b# z1m0n!j4Qb@CFhc3`?V)w0o{;pY9KA*!SJh=75hfs+o4DbfChH6rjmY3LQ8Y!>4 z*uOi|uHJiSEv_n6n5LzpU87V7dhoV-1pdi=9?9Z^l%L6t+s*oAST_i(KHHVULKRk;Gx%9Vit00RO* zy}99`&R5R4D0~1LW6r5&xCOJ*$YrUL!#aV%9+c|^ZVgqEj-p7mp-+y;v%$n)gxHAh|nu Pu<4den;T#79|iseJ})cP literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/button.png b/intra/source/org/flixel/data/button.png new file mode 100644 index 0000000000000000000000000000000000000000..0332dfe2f3a46203927ddfeded1b7ecfebd0cedf GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfS!3-pi{XDx5NJ*BsMwA5SrtQU z9r&9cE^zmtuSd!|CchsFvb%ZK7G$z|AN}&+o_L(&Y4(t9YH_xh8Gn}DVd7y>m(~$x TH{8hsw4A}y)z4*}Q$iB}St)qY literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/cursor.png b/intra/source/org/flixel/data/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..558ca016c8a7c415829565a029d3a85f4f2bc70e GIT binary patch literal 706 zcmV;z0zLhSP)3fP=cWNCx{{no)k~wO%S}Kv=@&e^x_XfqGi)0g|s8?));!P}XgS-zirGsAl$1wz3HfGKpzT>Jd~chqX+xo!aDT06-f z4=1NvM)GLlo?`&x4^7i_2nj?)M z9pnA<$x{SLIEL5)cz*i6x@H+WGd>O_9*5WKZ5zT`O@8~ahDx<+84I61ht#W?wjnJ6 zs=A{uRim8`hcOe4!sB+sR8Jy~0gan&wo4Z-BL4ive<5-!@mVE?eEt({?0ynz{wZH7 zwOlqsV6O4DfK=io7Ut9cK9XHvF4peRw?LW#vLu|zB*6=uEX$CXVC0;jebE!Box#)9&t;ucLK6VY-Z<|7 literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/handle.png b/intra/source/org/flixel/data/handle.png new file mode 100644 index 0000000000000000000000000000000000000000..edca1950e729d604617e6eea3785b817cdf31285 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4NtU=qlmzFem6RtIr7}3C;tG zC-fuS?7*3%(tBqEcO2m5H4TZBGwPSmsQN#%G}?L5@#0{iSSR&eUEKe;C+Qtvu#2eM UeM9$)KhSIjPgg&ebxsLQ06{W3761SM literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/logo.png b/intra/source/org/flixel/data/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..18ac8eb009d21bb4015f9649d827686d5d554cc1 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|R3?#1$$yWg>$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GLIFM@uK)L&|5tY7KJlMnr?$28f1vORWieqO#a0sJ7yKUt z7&h-;vL7fS=jq}YQgJIOft8s}A&n)NM?lV4ct%p=DMm(z21W+n$qdVCO|9+%RWf+G L`njxgN@xNAeM~Xl literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/logo_corners.png b/intra/source/org/flixel/data/logo_corners.png new file mode 100644 index 0000000000000000000000000000000000000000..48cc3ebe7ec0efcd1728edd661de0578ae99ec9d GIT binary patch literal 1515 zcmViueQOT(YFT3o*)JPg364!;Z(?5>``XxFvi~f{+s|wp zJ7;omDF6z&paCF7z%H^!@E%Br0cQdjIFo=xDDXw#`uO<_{#y;l)&hDb`!^+EFBg3W zuebKM?7xc&S_PcR`!#t!1v=#YJ^~O}NC^v2K_QO3i0QRaB^g|Ip#+@dz(Ig25${64 zyO4Ae0xkf$iU6<4%PHVPRA2){I3nT#N@maJ;`LnKuhfxBfESP-Vo1V=kfYu&2T0xY z03SktO(+3LutGpdxk!(%Am(#vRO+4yvhP}!lxAUXsQeX#ZBNNC%LM3&fEN+)^)G^alo&gZ zbT7bb`0tkh#)FX15rE*&G|c6p?Xx{TR0XkfHROa621X$gRvCcCp>C|!zXE*UZ`yzg zJUFg`p*xdMBLO(jVeh{h@R-EtX>?kF3JSn_(lUq>oC}q^F=O}Nfe2Ou=B_e8g2@8X zF9*iG`OV2-6_lieLdO9`MEZUro=+*Erd+@zTnQ)>^?s@f;IOS>qJ$(kN8qa&NIx_- zr~@QiEyFh?nW=|?4ALRxWX8*U!xRRp1`x zjRNWcH#?>l|Gi=00!eS^ly|B*;Kqh3VCv(5C=o7E_U5oL2^EvzO!}e5Tu2B#rt1h8 z`^aie`M|rGdObEXyieGT{+mxslZ~5c z;v2GACBXhEU_=Ld zo_t^@nD|1AEEMYs30T94jKaW7WM~{3`MH$$jkL*K+s1{66%pWI%3Paa4U4ay>&Fy; zz&iyX0c#2e?hm#m+?pD@4P{KY(Ru9ctTFc``c{?T+M=tq2R8zA11HY%1#FK`-Cwhb zKWqPE?+%&jGWaDpcMWR4hCnWVJ{RLg=@0?_7d`vTc|LocJ+Es8at#3`U@PErbGtSO zfyP>Axm!CHEN&^scaYnRW3HS|6%Jj6RF zsbEkEGH>8VmPAlY2`Li% z$kG`b;gs?7b0ZB>GMpfU`p`8G1ljZJWHW{YzfT^)bKr2ek}0{{X+Y9J72sk}p3Y54H{%Qg&K$LthB7>8p@PwM4MgUC$ zC*!(|6J!U}Q%s^g2;2e~y%+5~3xKSEWrv6wX417bYz17sJkNl^wn4m31}mH=;&Kn~z47QuOjfDXX> z@%aua=mz+-AGpT}YTz~CC*`$f4(t#x)-J%J33&b?%oSR4_eqgH0+v8=RYet~cy>O( zvH-pxpV`3=Akc0o!3~k^4zFL8-5($u0B;Hz_#N8r58#_P$JgV2cJZBkHcGUK-Pd;h zB#uoSwRM8)(Fb$@KLE>x3?$Wa(1Ck&$fYXp1(em@8pOPa>w5bz290!k@H zmbe>apc1S`D`$!!E#1Y?cUB1aaggw?C}9yKN(ZgG@1` z5g~oSB1n(~APMh+fHOn_Y5!+s=VgAdLWpd~`zMhM;j$bdwM5ltrM_AYfQ}FekfwkN zScTWG;>IoTV`=qg6BQ_MjLlKTFp)*<_$F%oGo;N6@2b+h7+?L;sR}P3fgGJ=@>;#)w@6!xXGE>A3GHoJN-SY z)m@Z+fcIIieV!Ss-K_xak9+NGOiy=M>p?IkLL0QbtepQ|@Mah!r;TLoa8IJZ~41>`anw8#N587C=td*rLiO*EX1Fp)t0Rfsy*f7Zw zb%k0&GG5;vcOHRXMEpkZ3*-T^4E{KdmtzewRz(dK5#Aux%>%5y8cJ<T){L@0hW)5qMDitli~xcag`$U?*o=c#HIj`9OXX>X~vEh zg9LV@FP&U7s=5^jARu5BvX|hIfEAR0iYOTe7@2?<;yQ%1cHEd8mXOl%y@5}V3c!xg zMNxqy!cqX9b0!KDXUd8_woS?CZpsi;?yhul=oIl9=|F$N(iDIWk)4qETU9s{1~oNo zkoQ*uJnlX=MLU?mP3*Lc1{Wny*p1x4a)fRaV5fHOFq0eSV{CO*RI@v~U%>=+Pyyxz z7jd+lU=N-$aZSMMp`$76O0S^6&a(mvcOM5MT0U`8y#K0%!#xOtcR4{T1tyWyY>6@V zO*BHS*jbS}0GE*w^BZ*K+Jd?A* zm3khC`x#=!XznAXpqy1CI>t_wFn0`pCV#rGUPpUs6DAo z#>{{dWS4-1jFWrG{|j)UgRJemHG=2B47`@Sx6@BGf!WECMTj+Y<%AM4?@bRy?j^uV zjw}ah-5@0ZaB^647x-r=fE;2XGBS$dJFfXM0wOic-Xu>b<0;^uK|og8#i=PGC-@TJ u&n6&J#iKX=zxwa-=%(r40BZgGEx-VSdC<%zPiqnY0000sWCd1gp>WbyzKgh`k{!0-?g2oE(xz!*b-Ox}T+%$N*G00qRz zM#UJS#*kHv7~L&5vJ`8%Rp^36xh|VU_QhJ+tzFovU8_*Hc2^4BkjdQH-|zd*ce`)T zO$-!&_=nxow@;rw=X*cSIXy=r5owSIB`0%kym@wS&x|Lp7l|%K?c&t~eM7gceD&ud zHF(S~UEjB5XlzW-Bif0I+V%bStox6r+oy;$)r!pCw_$DHnt%Q0`j_zT2e{^KKt*d@ z{0_=*;F_^vV0b$pMCzA`#834PuI_v8Cx7;=$mItBbNN8u_91y%&PDk&H0s{eH?a1s zSyv6DC>NwHdL@)=;7`Lo#1x^(624w*ERj6Hz@?EkK z@4987td)M8Lx43XoAA^vi%@$rTKDOjdr`Lm7`jiXAKUfH9Gr7cseN|}llQw!Ve|k_ zLg{!qN#zBp-fvG9#@*ZN`@7$ZF(zkM{Da`->VXJ5({Lg1M{I*5van_k{)?BntKPd{ z;nmkHy7s#3Z+PGPKd|_#AIsMiYwPM83O6qK;7vE*a$iehQ}fvqTHD$?Iwy9WHfi$d zXPkM~lFy8KG(l%Xz$ZMz+sC)x`{jL~1St=FLgXC^jp zf6yM}Yx0@LAATS_NN&X)cZc#HiX8m9{DHrb+wZ*Xk`{T-S}w8h!5H zAA0o|)H4TfdvGDAf~s}!MS-90l6~@oJTEWe>1ABWk&~~=$G}UC6p?)Dq#pUdfV{Cp zJ}5WAUv2@FEz&4W(ky4o1o@CGl@H5D0snw}1f1WB2=NtpKpukp9+Yp&Cy-B8$Zc}F z+#x%G^V7&XpGEYzQyxK#*d)8<^N0{%K$IDlyCJjvvRCerFUb!1Hng@9Qdx!Qvj%ec z3~2uxB2Pc4A4J4?RQ7sqd3d%Ad#|L-N1Z%v+%Bv7N)VG*{qrEB>Zt&j?sXK~;n?dkK(6 zaIwywS%<+r2?5uDk&||0OhAb;fUL(DnzBcvP{#0^6NYl0ggXZKfQRfF-~n0&kWy&$ zu>EoLD=CddJQ23RCq5-BOYi85R8Na&h? zhYVo_G$J*W)+p}$HBNK5^8_3mDLG{zkS3#htlXEp89akl01*LNnw}=*EX9<`bQIXw znwleIFsTfJ3>t;g!nu+1L!PpH5hytzUfzw4M2C4mrqKB7+BGiNL+zsymsk~A>QPv^@lE`&v_uyTmApqmUdI(0t%5cc0S?GZcxJB@x8%$yIIe9+6d!w5 z;6hkTXwHMK65yJYkE5k(IgO_Qze9&_1#Guv~~PEWa7*^Q^}o>v@_>M43|{)GO3`{6B>%7p$i11aHgp+ zZ=h8gPXDEUkd9IGPt)Z5D{rvdYGB91H15*Sa+GAS3x$<)yNFWc(Vk2m9^VRO+oe1- zHl}TumVy2WjKqp*nT)QCM&`4WtkEzAy`fx?PU{Z{8O9iksU`Dur^cj~A4ii0$248Y zB$ad#JZYodQu+qb=wl5%f|4J_9Y><;6U2YB9Qu&kiUn=j6eVR?lrDv({DNhdR1I42 zB+g^%dxleEbBGKs5=KswAYq%u+uiyoY4m~6R%y}<;I0!}obeL^%*g}BXf7)2Qg z$g^Q&jB(5==`t)BR1UMn3@nQz>_NUQp1Th+wk7rrT0sA#l;M~~)9-vdWFCkoA}*N(Y1UUe)i!AfO&zGYi?87h1|v{fKCzmxt+%v z0p0}E5tTD-O?68S*)|~Yk*4uzIoo=<|G9lLg@c%F;Q9G7SYqTK^rl9 zrQKM}B#g4|e@nii?kp1<7o5AK`qwGPW&EUsl(Vf{9mh{BGxrh}4wYq|@&eCETx1(+ zfU@Czw6bkx)J6rmP143`36{$Ug|IZnD6Zq@S2Hyg1W;uKPLyzI1??)tGeW+_&N zjxpb&JOh2x4J-0YI@N%V%F{3thS^Pm(cz9EKG3sVm!yaKpuJc>+8B7&`JRpyC?t%> ziAp)o;N;wqKFblI<25d+X~sN*XnH4wqjZ8w_>?N)S$)(GaccY&aTa+R`N{heD z*OaWivp1$upChrI%2nqe>=Saj%Dik7uw$TAd6O=lPJ>C8Jqd~9Pv)x#chj4~C?dNW z4DCzV5tz%yHN=R|T+K}Trb0vkhw2{VK*wzqRQ|eGI4py0JlnXMmhT>G`mmfu9E=Ev z&mltw7FEvdMZ2)EfR!xnm=-BMZ|@T3opQ$k*c{bjjS3Pa&-tJydq;LTsS^LK!gXMR-rpp4%PD_+mUv(qh89?v%Pa*{2CXG?c^iO zS2-Vb(3!hiz0*glVA-J=)%>M&c#;;{i^>O*RI30~%MeD5c{0$S5)ICQ<1##^ch;Hw zyq5L+3pQ3>@5?X-xi}BLdgzgnw(dAtXLN=!SIRcbUu;IMGyK3$H65EbIaF9oVRS?n z@;H@%)Phe5%t=pX4fZh{^dA0kB^9?|Tb${!&0C|7@=4+YWl+SYt}Kj`&;jga*=p=$ zTffp$HZ9Xyc+uPZq^&Tvk-KBC6qgI58@a0vKMk8@i;f0A3*F}Gk&Z7bpjX-k{+mTP z?F?d1p_psrCyFD{L{lQ(sDzbQzT=_?g~+g*rTr{}uCl3uVQTAKvhHSQj1a3i6LI04 zb5h1w3Q54kR>{vvR+gL{f=_0UmKhlT32DmsiRC70HXBj-J1cV`Rrn zo-b`3nxH5P!r-VoiHAC;I!S+>uW7GB>)7b{j{Me~dfy)`{$6E7W}>xmF~!bj9MC6ci6KV7c2x?HgrDxPlm<0Q>o@B# z&9dI$aI6sE1e>EYO`>IR81oy~gkusmxCWKqQf)Tkfh}1xDZ^(D<=}su-)nwLCZ|MX z0Sq2bxcMYbTRoWzHeIIOBiM;Bm@BvlExMHPP%_3t85aj#WRyeftp5Z#`G_@<66Z#) zF_)6bJHcQ;T?<5lBOOOfPUF60w9f77EKmQ~orsJ^e(yC=IhTo?VjY)O`oE7isOKu$ zD33QRln{^0%kV*p2|raNMrtZ~>IfF<=IM7A7je*_0!IqIR5~7;89O(XFzp+7b`2s6 zQTt}#F#~Isr619^kW1)*{E8Hm2}@0#785yq^JqxII0`jI*eZ?*p9oQn!^i3lhz!zy zJT{?8HrKlc0y!y2Q(=r*1hCBJmSjFi5mx$P@Il2<_LBzxs_1bujl-h`VcDu6aab)i zenK4SSczcb(TM!|MXpPXtSTF&2lINDO|?6F5@WJ5W6+pZevV;dDd|7FSohsvaWZ_T+sJIwUmEP$&&+%Z%=mc zit%;~Sey@}p%S8zOz9FXzXiBoxQCJSDt?xpg{A0BkD1NCY_?$@aY|$6ti7Z$K_F=k zlJN!gIUXM~4lR{-OTD`2&5EI0m6PTr{@9x5tk{s)5|Yin+_h+S`Z2MhZyx{j*9@)E zDAc7?APCd20w;`9Ek;KQo&T6%gX#qTI|1Wu@=(r&o^3&XrIhWz*GRlekalCnO9@xz zS!0>@ld;2-z&BVFPS!b23O~ss98sn05Qd^>d0u4*ENGPqrIFaZ#bdRCs)Xl2^xkC< zjcpRDusGBt#iY`Q&-nIXBQ=o30HU!kjLrfSr<9!|he6Q(RWLv>;5z*p4+|q;hr_$V z(*Jd&Bk*MKW*CnXZUGAMto#irHNs1SO1`VmfRmWdu^Rat0l!9?iNW-&cEnZs5WzeF z(hBnXL|t8%TKy4&xH0W z|8Esyq{j84{?}IM?vN}15Q=3suCo|iN`!W!p$c&LR6(G;eg%nKZF#fxcvCuU@*%QQcCV5!2JvOypNM%+1!GeeRnln)I~COG3vPVV0iG# z?Kg*=ct%N;8B*EHj6h4)RBPqhMX~}*xM|pLZEeI{mci)6>y`?g@+sSTg?y5+p()+? zwQOk4ZLuzq4gUi;^L1MFLXHR2{ zELc*p#6_Y#SW{++scWRp$SznsIm*~em;O7qSvw7Ykj!8Z%^4$Em9?07)Qpl$=rK)h zz@DJJ@;!M)jz_)GifC)JC;E2uV)TnRAGgHQ;#=Z1@$UG0@sapwZbt5g+)!>u?(y8S zx&O>}HoPVQmTA{bFtgyMTvv9C*xNxNKo0{gDIWL%A+RCit7(z-Qu_t)*IJ5+b1 z?!W6N*Dt7FT0d03qkd2Qx9Y!J|3dxIhM5gZ8+JE5+wgkhIgM)?_cgxMc&ur1)BL7Y zO}m<&Z+fG-xp`*ug60*?TbuVcA8tN6p=ZMF6Lw8_VZ!SzlUo+GEN^+F<=K{(TWeYu zw+^@NZ~am0D{VDxSGR3#JJ|Nqwo?1d_7&}W+MjCwhxRu*+Bz0=Z0^|K@qEW?osFII zI#+gX!nwQiyPdCezCLl<#3d6Sn)vj@A5J{p)!TJ@SAW<3F768p0;XcB9*5u!uz@It zwT&~dhqwz-ZIVpJe>b0vozdsYESVwa$-Cry?6d5_zPLGZA@*d>m5bzJnJ1UXrSfj< z3%yJ(mn&qZTrJmN=iIe&om>x1zE9pSAHe?2^u9COX|^ovGUJ{yF0RvfeV>}`N}GWF zX|31~eI}yB6yg55X>z5!N3N0ux(jWkd`JFT{z{(29<+_vPd0!ZW$UnmYz=mmt(6yG zMVql_??voJ89x9wBd;kE(0^`4Nw zz)rQ@azOq@4r4#u7I{g2qI=W+5xdg<33~t^kO#5*?NRx2ct$(+20o4*sNculwoTaa q_gbV8PJSl8l>aL9Y`VL@zj5ovEgM($uiY}#w|Z^q(6dlUUVC6SDW~E*0blVo7Xm+>eY7)fBuk-D=^SGgJATi|4{d)@9r|I}fnGnc#K!L-Vd;1;MooU-ugJ*`_jbl<=vWLG% zW#6OBzSTQcY)IM19^LWsWXH^nN8R~0I_Jg;JWAl0u5hH$}1{o!ZfS^xl@Ln>}1{rLa?zmY;8OA?!tgv$X2N8b}&oLPsKNi0{Z z=`u7i{KuZH$fcuxGNtRTPe_J<=sB0;3Jwj745!xCTeOR@Jp`J>;OXk;vd$@?2>>;C BFoysD literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/vcr/record_off.png b/intra/source/org/flixel/data/vcr/record_off.png new file mode 100644 index 0000000000000000000000000000000000000000..81989634e2ee70142e899e910023c014da3ff7f4 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XGCW-zLn>}1{rLaio>}BJL!rDtJj0{;0lWCM_`;ZjC76#~ z|DVi$ec>k_1K~nVmum@!j~qB4z;Z;2=Le&Q9mkRzosAX`j&OY9nQ+jp8bg=d#Wzp$P!C7e$o- literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/vcr/record_on.png b/intra/source/org/flixel/data/vcr/record_on.png new file mode 100644 index 0000000000000000000000000000000000000000..91341f61292f21e280a9a21ab73b3b1c2c8b7aa2 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X=6bp~hE&`t2|OvttjM$ZlZS3}%jz57uT7b>jjis=q?(SJ z7S7i#l8yY5ExOD~&N5y$FU;rpFWMKhy5)E58u=~G%N{Zq#?#!lc}X71&i+g#Q6 ynMTK{O2_@ynQm7fcb@5N=UQPGzX=uG1`NVo{kH|aiRS?w%HZkh=d#Wzp$P!Oh+|U# literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/vcr/restart.png b/intra/source/org/flixel/data/vcr/restart.png new file mode 100644 index 0000000000000000000000000000000000000000..d09caf090b6e66c40029ca4eefa74223606dc37f GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X{5)M8Ln>}1{rLa?zmYVJLn>}1{rLa?zmY;8OA;GXg=9wqqtmQ^%Gzp6I9Dgd z%=)0^cKyqI!8Oeu2V7caJ#~;_O$&ULw#cb@MS+?X8zU1BgF!+Z^EbcRl|Ta-JYD@< J);T3K0RZ{nG=l&D literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/vcr/stop.png b/intra/source/org/flixel/data/vcr/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5e8d34b46b2b32e078aaa33b48e94a227c7dc0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X#64XcLn>}1{rUgjo;mJ-#j2)PS`17)48NBvygnu=><3iB N;OXk;vd$@?2>{8fB8C6} literal 0 HcmV?d00001 diff --git a/intra/source/org/flixel/data/vis/bounds.png b/intra/source/org/flixel/data/vis/bounds.png new file mode 100644 index 0000000000000000000000000000000000000000..44eb70ada798abd66a7c4f8fc8f41c5b0b3ebeee GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X{5@S9Ln>}A3Me;X!iGnl`YFV!t~wkl7hr)XORSkM{=UZ U^O8; + + /** + * Instantiates a new debug path display manager. + */ + public function new() + { + _paths=new Array(); + active=false;//don't call update on this plugin + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + clear(); + _paths=null; + } + + /** + * Called byFlxG.drawPlugins()after the game state has been drawn. + * Cycles through cameras and callsdrawDebug()on each one. + */ + override public function draw():Void + { + if(!FlxG.visualDebug || ignoreDrawDebug) + return; + + if(cameras==null) + cameras=FlxG.cameras; + var i:Int=0; + var l:Int=cameras.length; + while(iFlxObject'sdrawDebug()functionality, + * this function callsdrawDebug()on eachFlxPathfor the specified camera. + * Very helpful for debugging! + * + * @param Camera WhichFlxCameraobject to draw the debug data to. + */ + override public function drawDebug(Camera:FlxCamera=null):Void + { + if(Camera==null) + Camera=FlxG.camera; + + var i:Int=_paths.length-1; + var path:FlxPath; + while(i>=0) + { + path=_paths[i--] as FlxPath; + if((path !=null)&& !path.ignoreDrawDebug) + path.drawDebug(Camera); + } + } + + /** + * Add a path to the path debug display manager. + * Usually called automatically byFlxPath's constructor. + * + * @param Path TheFlxPathyou want to add to the manager. + */ + public function add(Path:FlxPath):Void + { + _paths.push(Path); + } + + /** + * Remove a path from the path debug display manager. + * Usually called automatically byFlxPath'sdestroy()function. + * + * @param Path TheFlxPathyou want to remove from the manager. + */ + public function remove(Path:FlxPath):Void + { + var index:Int=_paths.indexOf(Path); + if(index>=0) + _paths.splice(index,1); + } + + /** + * Removes all the paths from the path debug display manager. + */ + public function clear():Void + { + var i:Int=_paths.length-1; + var path:FlxPath; + while(i>=0) + { + path=_paths[i--] as FlxPath; + if(path !=null) + path.destroy(); + } + _paths.length=0; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/TimerManager.hx b/intra/source/org/flixel/plugin/TimerManager.hx new file mode 100644 index 0000000..26d892f --- /dev/null +++ b/intra/source/org/flixel/plugin/TimerManager.hx @@ -0,0 +1,87 @@ +package org.flixel.plugin; + +import org.flixel.*; + +/** + * A simple manager for tracking and updating game timer objects. + * + * @author Adam Atomic + */ +class TimerManager extends FlxBasic +{ + private var _timers:Array; + + /** + * Instantiates a new timer manager. + */ + public function new() + { + _timers=new Array(); + visible=false;//don't call draw on this plugin + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + clear(); + _timers=null; + } + + /** + * Called byFlxG.updatePlugins()before the game state has been updated. + * Cycles through timers and callsupdate()on each one. + */ + override public function update():Void + { + var i:Int=_timers.length-1; + var timer:FlxTimer; + while(i>=0) + { + timer=_timers[i--] as FlxTimer; + if((timer !=null)&& !timer.paused && !timer.finished &&(timer.time>0)) + timer.update(); + } + } + + /** + * Add a new timer to the timer manager. + * Usually called automatically byFlxTimer's constructor. + * + * @param Timer TheFlxTimeryou want to add to the manager. + */ + public function add(Timer:FlxTimer):Void + { + _timers.push(Timer); + } + + /** + * Remove a timer from the timer manager. + * Usually called automatically byFlxTimer'sstop()function. + * + * @param Timer TheFlxTimeryou want to remove from the manager. + */ + public function remove(Timer:FlxTimer):Void + { + var index:Int=_timers.indexOf(Timer); + if(index>=0) + _timers.splice(index,1); + } + + /** + * Removes all the timers from the timer manager. + */ + public function clear():Void + { + var i:Int=_timers.length-1; + var timer:FlxTimer; + while(i>=0) + { + timer=_timers[i--] as FlxTimer; + if(timer !=null) + timer.destroy(); + } + _timers.length=0; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/API/FlxKongregate.hx b/intra/source/org/flixel/plugin/photonstorm/API/FlxKongregate.hx new file mode 100644 index 0000000..48799ec --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/API/FlxKongregate.hx @@ -0,0 +1,346 @@ +/** + * FlxKongregate + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - August 1st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.API +{ +import flash.display.DisplayObject; +import flash.display.Loader; +import flash.errors.IOError; +import flash.events.Event; +import flash.events.IOErrorEvent; +import flash.net.URLRequest; +import flash.system.Security; + +import org.flixel.*; + +/** + * Allows for easy access to the Kongregate API + * + * Todo:Add in the functions for Chat Integration - you can still use them via the FlxKongregate.api object. + */ +class FlxKongregate +{ + /** + * The Kongregate API object. You can make calls directly to this once the API has connected. + */ + public static var api:Dynamic; + + /** + * true if the API has loaded otherwise false. Loaded is not the same thing as connected, it just means it's ready for the connection. + */ + public static var hasLoaded:Bool=false; + + /** + * Is the game running locally in Shadow API mode(true)or from Kongregates servers(false) + */ + public static var isLocal:Bool=false; + + private static var shadowAPI:String="http://www.kongregate.com/flash/API_AS3_Local.swf"; + private static var apiLoader:Loader; + private static var loadCallback:Function; + + public function new() + { + } + + /** + * Loads the Kongregate API and if successful connects to the service. + * Note that your game must have access to Stage by this point. + * + * @param callback This function is called if the API loads successfully. Do not call any API function until this has happened. + */ + public static function init(callback:Function):Void + { + try + { + var parameters:Dynamic=FlxG.stage.loaderInfo.parameters; + } + catch(e:Dynamic) + { + throw new Dynamic("FlxKongregate:No access to FlxG.stage - only call this once your game has access to the display list"); + return; + } + + var apiPath:String; + + if(parameters.kongregate_api_path) + { + Security.allowDomain(parameters.kongregate_api_path); + apiPath=parameters.kongregate_api_path; + } + else + { + Security.allowDomain(shadowAPI); + apiPath=shadowAPI; + isLocal=true; + } + + loadCallback=callback; + + apiLoader=new Loader(); + apiLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, apiLoadComplete, false, 0, true); + apiLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, apiLoadError, false, 0, true); + apiLoader.load(new URLRequest(apiPath)); + + FlxG.stage.addChild(apiLoader); + } + + /** + * Remove the API from memory(when possible)and removes it from the display list also + */ + public static function disconnect():Void + { + api=null; + + hasLoaded=false; + + FlxG.stage.removeChild(apiLoader); + } + + private static function apiLoadComplete(event:Event):Void + { + api=event.target.content; + + hasLoaded=true; + + Security.allowDomain(api.loaderInfo.url); + + if(Std.is(loadCallback, Function)) + { + loadCallback.call(); + } + + } + + private static function apiLoadError(error:IOError):Void + { + trace("Error loading Kongregate API", error); + } + + /** + * Use the addLoadListener function to register an event listener which will be triggered when content of the specified type is loaded by the user. + * These MUST be set-up *before* you call FlxKongregate.connect() + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param contentType Type of content to listen for + * @param callback Function to call when content load request has been made + */ + public static function addLoadListener(contentType:String, callback:Function):Void + { + api.sharedContent.addLoadListener(contentType, callback); + } + + /** + * Register an event listener with the API. Useful for capturing guest to user login requests for example. + * See:http://www.kongregate.com/developer_center/docs/handling-guests + * + * @param contentType The event to listen for(i.e. "login") + * @param callback Funcation to call when this event is received + */ + public static function addEventListener(contentType:String, callback:Function):Void + { + api.services.addEventListener(contentType, callback); + } + + /** + * Connect to the Kongregate API. This should be called only after the init callback reports a succesful load of the API + */ + public static function connect():Void + { + if(hasLoaded) + { + api.services.connect(); + } + } + + /** + * The isGuest function can be called to determine if the player is currently signed Into Kongregate or not + */ + public static var isGuest(get_isGuest, null):Bool; + private function get_isGuest():Bool + { + return api.services.isGuest(); + } + + /** + * You can use the getUsername()function to retrieve the username of the current player. It will begin with Guest if the user is not signed in. + */ + public static var getUserName(get_getUserName, null):String; + private function get_getUserName():String + { + return api.services.getUsername(); + } + + /** + * You can use the getUserId()function to retrieve the unique user id of the current player. It will return 0 if the user is not signed in. + */ + public static var getUserId(get_getUserId, null):Float; + private function get_getUserId():Float + { + try + { + return api.services.getUserId(); + } + catch(e:Dynamic) + { + return 0; + } + + return 0; + } + + /** + * If you are using the Authentication API you can use the getGameAuthToken function to get the player's game authentication token. + */ + public static var getGameAuthToken(get_getGameAuthToken, null):String; + private function get_getGameAuthToken():String + { + return api.services.getGameAuthToken(); + } + + /** + * If the player is a guest, and you want to display the sign-in/registration UI to them you can use the showSignInBox function. + */ + public static function showSignInBox():Void + { + if(api.services.isGuest()) + { + api.services.showSignInBox(); + } + } + + /** + * This call works the same way as showSigninBox, but it focuses the registration form rather than the sign-in form. + */ + public static function showRegistrationBox():Void + { + if(api.services.isGuest()) + { + api.services.showRegistrationBox(); + } + } + + /** + * If a player is logged-in and you want to allow them to post a shout on their profile page, you may bring up the shout box, optionally populated with some initial content. + * + * @param message The optional initial content + */ + public static function showShoutBox(message:String=""):Void + { + if(api.services.isGuest()==false) + { + api.services.showShoutBox(message); + } + } + + /** + * If you need to resize your game's enclosing container, you may do so with resizeGame call. The enclosing iframe will resize around your game. + * Games may not be resized smaller than their initial dimensions. This call requires special permission from Kongregate to use. + * + * @param width New width(in pixels)of the container + * @param height New height(in pixels)of the container + */ + public static function resizeGame(width:Int, height:Int):Void + { + api.services.resizeGame(width, height); + } + + /** + * Submit a statistic to the Kongregate server. Make sure you have defined the stat before calling this. + * See the Kongregate API documentation for details. + * + * @param name The name of the statistic + * @param value The value to submit(will be converted to an Integer server-side) + */ + public static function submitStats(name:String, value:Float):Void + { + api.stats.submit(name, value); + } + + /** + * Bring up the "purchase items" dialog box by using the purchaseItems method on the microtransaction services object. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param items The array of item identifier strings or item/metadata objects. + * @param callback The callback function + */ + public static function purchaseItem(items:Array, callback:Function):Void + { + api.mtx.purchaseItems(items, callback); + } + + /** + * Request the inventory of any user. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param username The username to request inventory for, or null for the current player + * @param callback The callback function + */ + public static function requestUserItemList(username:String, callback:Function):Void + { + api.mtx.requestUserItemList(username, callback); + } + + /** + * Display the Kred purchasing Dialog. + * Your game must be in the Kongregate Microtransactions beta to use this function. + * See:http://www.kongregate.com/developer_center/docs/microtransaction-client-api + * + * @param purchaseMethod The purchase method to display. Should be "offers" or "mobile" + */ + public static function showKredPurchaseDialog(purchaseMethod:String):Void + { + api.mtx.showKredPurchaseDialog(purchaseMethod); + } + + /** + * The browse function causes a list of shared content to appear in the user's browser. + * This will allow them to view, rate, or load shared content for your game. + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param contentType Type of content to browse + * @param sortOrder Optional constant specifying how to sort content(see API docs) + * @param label Optional, only browse content saved with the specified label + */ + public static function browseSharedContent(contentType:String, sortOrder:String=null, label:String=null):Void + { + api.sharedContent.browse(contentType, sortOrder, label); + } + + /** + * Use the save function to submit shared content on the Kongregate back-end. + * See:http://www.kongregate.com/developer_center/docs/shared-content-api + * + * @param type Type of content the user wishes to save, 12 characters max. + * @param content Value of content to be saved. We strongly recommend keeping these values under 100K. + * @param callback Function to call when save has finished. + * @param thumb Optional but highly recommended! Send us a DisplayObject that we will snapshotted and used as a thumbnail for the content. + * @param label Optional, label for sub-classing the shared content. + */ + public static function saveSharedContent(type:String, content:String, callback:Function, thumb:DisplayObject=null, label:String=null):Void + { + api.sharedContent.save(type, content, callback, thumb, label); + } + + /** + * Export a DisplayObject to be converted to a user avatar. It is highly recommended that avatars be at least 40 x 40px. + * See:http://www.kongregate.com/developer_center/docs/avatar-api + * + * @param avatar Can be null, but highly recommended that you send yourself. If null, we will snapshot the stage. + * @param callback Function to call when content load request has been made + */ + public static function submitAvatar(avatar:DisplayObject, callback:Function):Void + { + api.images.submitAvatar(avatar, callback); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx b/intra/source/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx new file mode 100644 index 0000000..91c918c --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/BaseTypes/Bullet.hx @@ -0,0 +1,234 @@ +/** + * Bullet + * -- Part of the Flixel Power Tools set + * + * v1.2 Removed "id" and used the FlxSprite ID value instead + * v1.1 Updated to support fire callbacks, sounds, random variances and lifespan + * v1.0 First release + * + * @version 1.2 - October 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.BaseTypes +{ +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.plugin.photonstorm.FlxMath; +import org.flixel.plugin.photonstorm.FlxVelocity; +import org.flixel.plugin.photonstorm.FlxWeapon; +import flash.utils.getTimer; + +class Bullet extends FlxSprite +{ + private var weapon:FlxWeapon; + + private var bulletSpeed:Int; + + // Acceleration or Velocity? + public var accelerates:Bool; + public var xAcceleration:Int; + public var yAcceleration:Int; + + public var rndFactorAngle:Int; + public var rndFactorSpeed:Int; + public var rndFactorLifeSpan:Int; + public var lifespan:Int; + public var launchTime:Int; + public var expiresTime:Int; + + private var animated:Bool; + + public function new(weapon:FlxWeapon, id:Int) + { + super(0, 0); + + this.weapon=weapon; + this.ID=id; + + // Safe defaults + accelerates=false; + animated=false; + bulletSpeed=0; + + exists=false; + } + + /** + * Adds a new animation to the sprite. + * + * @param Name What this animation should be called(e.g. "run"). + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3). + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40 fps). + * @param Looped Whether or not the animation is looped or just plays once. + */ + override public function addAnimation(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true):Void + { + super.addAnimation(Name, Frames, FrameRate, Looped); + + animated=true; + } + + public function fire(fromX:Int, fromY:Int, velX:Int, velY:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + acceleration.x=xAcceleration + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + acceleration.y=yAcceleration + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + } + else + { + velocity.x=velX + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + velocity.y=velY + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed); + } + + postFire(); + } + + public function fireAtMouse(fromX:Int, fromY:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsMouse(this, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsMouse(this, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireAtPosition(fromX:Int, fromY:Int, toX:Int, toY:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsPoint(this, new FlxPoint(toX, toY), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsPoint(this, new FlxPoint(toX, toY), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireAtTarget(fromX:Int, fromY:Int, target:FlxSprite, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + if(accelerates) + { + FlxVelocity.accelerateTowardsObject(this, target, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed), maxVelocity.x, maxVelocity.y); + } + else + { + FlxVelocity.moveTowardsObject(this, target, speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + } + + postFire(); + } + + public function fireFromAngle(fromX:Int, fromY:Int, fireAngle:Int, speed:Int):Void + { + x=fromX + FlxMath.rand(-weapon.rndFactorPosition.x, weapon.rndFactorPosition.x); + y=fromY + FlxMath.rand(-weapon.rndFactorPosition.y, weapon.rndFactorPosition.y); + + var newVelocity:FlxPoint=FlxVelocity.velocityFromAngle(fireAngle + FlxMath.rand(-weapon.rndFactorAngle, weapon.rndFactorAngle), speed + FlxMath.rand(-weapon.rndFactorSpeed, weapon.rndFactorSpeed)); + + if(accelerates) + { + acceleration.x=newVelocity.x; + acceleration.y=newVelocity.y; + } + else + { + velocity.x=newVelocity.x; + velocity.y=newVelocity.y; + } + + postFire(); + } + + private function postFire():Void + { + if(animated) + { + play("fire"); + } + + if(weapon.bulletElasticity>0) + { + elasticity=weapon.bulletElasticity; + } + + exists=true; + + launchTime=getTimer(); + + if(weapon.bulletLifeSpan>0) + { + lifespan=weapon.bulletLifeSpan + FlxMath.rand(-weapon.rndFactorLifeSpan, weapon.rndFactorLifeSpan); + expiresTime=getTimer()+ lifespan; + } + + if(weapon.onFireCallback is Function) + { + weapon.onFireCallback.apply(); + } + + if(weapon.onFireSound) + { + weapon.onFireSound.play(); + } + } + + public var xGravity(null, set_xGravity):Int; + private function set_xGravity(gx:Int):Void + { + acceleration.x=gx; + } + + public var yGravity(null, set_yGravity):Int; + private function set_yGravity(gy:Int):Void + { + acceleration.y=gy; + } + + public var maxVelocityX(null, set_maxVelocityX):Int; + private function set_maxVelocityX(mx:Int):Void + { + maxVelocity.x=mx; + } + + public var maxVelocityY(null, set_maxVelocityY):Int; + private function set_maxVelocityY(my:Int):Void + { + maxVelocity.y=my; + } + + override public function update():Void + { + if(lifespan>0 && getTimer()>expiresTime) + { + kill(); + } + + if(FlxMath.pointInFlxRect(x, y, weapon.bounds)==false) + { + kill(); + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx b/intra/source/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx new file mode 100644 index 0000000..bd5077a --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/BaseTypes/MouseSpring.hx @@ -0,0 +1,94 @@ +package org.flixel.plugin.photonstorm.BaseTypes +{ +import org.flixel.*; +import org.flixel.plugin.photonstorm.FlxExtendedSprite; + +class MouseSpring +{ + public var sprite:FlxExtendedSprite; + + /** + * The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @default 0.1 + */ + public var tension:Float=0.1; + + /** + * The friction applied to the spring as it moves + * @default 0.95 + */ + public var friction:Float=0.95; + + /** + * The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + * @default 0 + */ + public var gravity:Float=0; + + private var retainVelocity:Bool=false; + + private var vx:Float=0; + private var vy:Float=0; + + private var dx:Float=0; + private var dy:Float=0; + + private var ax:Float=0; + private var ay:Float=0; + + /** + * Adds a spring between the mouse and a Sprite. + * + * @param sprite The FlxExtendedSprite to which this spring is attached + * @param retainVelocity true to retain the velocity of the spring when the mouse is released, or false to clear it + * @param tension The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @param friction The friction applied to the spring as it moves + * @param gravity The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + */ + public function new(sprite:FlxExtendedSprite, retainVelocity:Bool=false, tension:Float=0.1, friction:Float=0.95, gravity:Float=0) + { + this.sprite=sprite; + this.retainVelocity=retainVelocity; + this.tension=tension; + this.friction=friction; + this.gravity=gravity; + } + + /** + * Updates the spring physics and repositions the sprite + */ + public function update():Void + { + dx=FlxG.mouse.x - sprite.springX; + dy=FlxG.mouse.y - sprite.springY; + + ax=dx * tension; + ay=dy * tension; + + vx +=ax; + vy +=ay; + + vy +=gravity; + vx *=friction; + vy *=friction; + + sprite.x +=vx; + sprite.y +=vy; + } + + /** + * Resets the Internal spring physics + */ + public function reset():Void + { + vx=0; + vy=0; + + dx=0; + dy=0; + + ax=0; + ay=0; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/BaseFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/BaseFX.hx new file mode 100644 index 0000000..085fe84 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/BaseFX.hx @@ -0,0 +1,110 @@ +/** + * BaseFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Fixed some documentation + * v1.0 First release + * + * @version 1.1 - June 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.FlxSprite; +import flash.display.BitmapData; + +class BaseFX +{ + /** + * Set to false to stop this effect being updated by the FlxSpecialFX Plugin. Set to true to enable. + */ + public var active:Bool; + + /** + * The FlxSprite Into which the effect is drawn. Add this to your FlxState / FlxGroup to display the effect. + */ + public var sprite:FlxSprite; + + /** + * A scratch bitmapData used to build-up the effect before passing to sprite.pixels + */ + private var canvas:BitmapData; + + /** + * A snapshot of the sprite background before the effect is applied + */ + private var back:BitmapData; + + private var image:BitmapData; + private var sourceRef:FlxSprite; + private var updateFromSource:Bool; + private var clsRect:Rectangle; + private var clsPoint:Point; + private var clsColor:Int; + + // For staggered drawing updates + private var updateLimit:Int=0; + private var lastUpdate:Int=0; + private var ready:Bool=false; + + private var copyRect:Rectangle; + private var copyPoint:Point; + + public function new() + { + active=false; + } + + /** + * Starts the effect runnning + * + * @param delay How many "game updates" should pass between each update? If your game runs at 30fps a value of 0 means it will do 30 updates per second. A value of 1 means it will do 15 updates per second, etc. + */ + public function start(delay:Int=0):Void + { + updateLimit=delay; + lastUpdate=0; + ready=true; + } + + /** + * Pauses the effect from running. The draw function is still called each loop, but the pixel data is stopped from updating.
+ * To disable the SpecialFX Plugin from calling the FX at all set the "active" parameter to false. + */ + public function stop():Void + { + ready=false; + } + + public function destroy():Void + { + if(sprite) + { + sprite.kill(); + } + + if(canvas) + { + canvas.dispose(); + } + + if(back) + { + back.dispose(); + } + + if(image) + { + image.dispose(); + } + + sourceRef=null; + + active=false; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/BlurFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/BlurFX.hx new file mode 100644 index 0000000..3079576 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/BlurFX.hx @@ -0,0 +1,133 @@ +/** + * BlurFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - June 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import flash.filters.BlurFilter; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a blur effect + */ +class BlurFX extends BaseFX +{ + private var objects:Array; + private var blurFilter:BlurFilter; + + public function new() + { + } + + /** + * Creates a new BlurFX the given width/height in size.
+ * The blur X / Y / Quality parameters all control the strength of the effect.
+ * Add the resulting FlxSprite to your display to see the effect. + * + * @param width The width(in pixels)of the resulting FlxSprite containing the Blur effect + * @param height The height(in pixels)of the resulting FlxSprite containing the Blur effect + * @param blurX The amount of horizontal blur. + * @param blurY The amount of vertical blur. + * @param blurQuality The number of times to perform the blur. Default is 1(fastest, single pass)up to a maxium of 15(very VERY expensive!) + * + * @return An FlxSprite containing the updating blur effect + */ + public function create(width:Int, height:Int, blurX:Float, blurY:Float, blurQuality:Int=1):FlxSprite + { + sprite=new FlxSprite(0, 0).makeGraphic(width, height, 0x0, true); + + objects=new Array; + + blurFilter=new BlurFilter(blurX, blurY, blurQuality); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, width, height); + + return sprite; + } + + /** + * Adds an FlxSprite to the BlurFX. Every loop this sprite will be drawn to the FX and then blurred if the FlxSprite is both onScreen()and visible. + * + * @param source The FlxSprite to add to the blur effect + * @param autoRemove If true and the FlxSprite.exists value ever equals false then BlurFX will automatically remove it + */ + public function addSprite(source:FlxSprite, autoRemove:Bool=true):Void + { + objects.push({ sprite:source, autoRemove:autoRemove }); + + if(active==false) + { + active=true; + } + } + + /** + * Removes the FlxSprite from the effect + * + * @param source The FlxSprite to remove from the blur effect + */ + public function removeSprite(source:FlxSprite):Void + { + for(i in 0...objects.length) + { + if(objects[i].sprite==source) + { + objects.splice(i, 1); + break; + } + } + } + + public function draw():Void + { + if(ready) + { + // Write every object to the canvas + for(var obj:Dynamic in objects) + { + // Removal check + if(obj.sprite.exists==false) + { + removeSprite(obj.sprite); + } + else + { + if(obj.sprite.visible && obj.sprite.onScreen()) + { + sprite.stamp(obj.sprite, obj.sprite.x, obj.sprite.y); + } + } + } + + // We'll use the update timer to control how often the blur is run, not how often the objects are drawn + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + // Then blur it + sprite.pixels.applyFilter(sprite.pixels, copyRect, copyPoint, blurFilter); + + lastUpdate=0; + + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx new file mode 100644 index 0000000..9b99969 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/CenterSlideFX.hx @@ -0,0 +1,249 @@ +/** + * CenterSlideFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Refactored main loop a little and added reverse function + * v1.0 First release + * + * @version 1.1 - June 13th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Makes an image expand or collapse from its center + */ +class CenterSlideFX extends BaseFX +{ + /** + * True when the effect has completed. False while the effect is running. + */ + public var complete:Bool; + + /** + * A function that is called once the effect is has finished running and is complete + */ + public var completeCallback:Function; + + private var pixels:Int; + private var direction:Int; + + private var sideA:Rectangle; + private var sideB:Rectangle; + private var pointA:Point; + private var pointB:Point; + + public static inline var REVEAL_VERTICAL:Int=0; + public static inline var REVEAL_HORIZONTAL:Int=1; + public static inline var HIDE_VERTICAL:Int=2; + public static inline var HIDE_HORIZONTAL:Int=3; + + public function new() + { + } + + /** + * Creates a new CenterSlide effect from the given FlxSprite. The original sprite remains unmodified.
+ * The resulting FlxSprite will take on the same width / height and x/y coordinates of the source FlxSprite. + * + * @param source The FlxSprite providing the image data for this effect. The resulting FlxSprite takes on the source width, height and x/y position. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromFlxSprite(source:FlxSprite, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create(source.pixels, source.x, source.y, direction, pixels, backgroundColor); + } + + /** + * Creates a new CenterSlide effect from the given Class(which must contain a Bitmap)usually from an Embedded bitmap. + * + * @param source The Class providing the bitmapData for this effect, usually from an Embedded bitmap. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromClass(source:Class, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create((new source).bitmapData, x, y, direction, pixels, backgroundColor); + } + + /** + * Creates a new CenterSlide effect from the given bitmapData. + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param direction REVEAL_VERTICAL, REVEAL_HORIZONTAL, HIDE_VERTICAL or HIDE_HORIZONTAL + * @param pixels How many pixels to slide update(default 1) + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect running through it, which should be started with a call to CenterSlideFX.start() + */ + public function createFromBitmapData(source:BitmapData, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + return create(source, x, y, direction, pixels, backgroundColor); + } + + private function create(source:BitmapData, x:Int, y:Int, direction:Int=0, pixels:Int=1, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(source.width, source.height, backgroundColor); + + canvas=new BitmapData(source.width, source.height, true, backgroundColor); + + image=source.clone(); + + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + clsColor=backgroundColor; + + this.direction=direction; + this.pixels=pixels; + + var midway:Int=Std.int(source.height / 2); + + switch(direction) + { + case REVEAL_VERTICAL: + sideA=new Rectangle(0, 0, source.width, pixels); + sideB=new Rectangle(0, source.height - pixels, source.width, pixels); + pointA=new Point(0, midway); + pointB=new Point(0, midway); + break; + + case REVEAL_HORIZONTAL: + midway=Std.int(source.width / 2); + sideA=new Rectangle(0, 0, pixels, source.height); + sideB=new Rectangle(source.width - pixels, 0, pixels, source.height); + pointA=new Point(midway, 0); + pointB=new Point(midway, 0); + break; + + case HIDE_VERTICAL: + canvas=image.clone(); + sprite.pixels=canvas; + sprite.dirty=true; + sideA=new Rectangle(0, 0, source.width, midway); + sideB=new Rectangle(0, midway, source.width, source.height - midway); + pointA=new Point(0, 0); + pointB=new Point(0, midway); + break; + + case HIDE_HORIZONTAL: + canvas=image.clone(); + sprite.pixels=canvas; + sprite.dirty=true; + midway=Std.int(source.width / 2); + sideA=new Rectangle(0, 0, midway, source.height); + sideB=new Rectangle(midway, 0, source.width - midway, source.height); + pointA=new Point(0, 0); + pointB=new Point(midway, 0); + break; + } + + active=true; + complete=false; + + return sprite; + } + + public function reverse():Void + { + if(direction==REVEAL_VERTICAL) + { + direction=HIDE_VERTICAL; + complete=false; + } + else if(direction==REVEAL_HORIZONTAL) + { + direction=HIDE_HORIZONTAL; + complete=false; + } + } + + public function draw():Void + { + if(ready && complete==false) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + canvas.fillRect(clsRect, clsColor); + canvas.copyPixels(image, sideA, pointA, null, null, true); + canvas.copyPixels(image, sideB, pointB, null, null, true); + + switch(direction) + { + case REVEAL_VERTICAL: + sideA.height +=pixels; + pointA.y -=pixels; + sideB.height +=pixels; + sideB.y -=pixels; + break; + + case REVEAL_HORIZONTAL: + sideA.width +=pixels; + pointA.x -=pixels; + sideB.width +=pixels; + sideB.x -=pixels; + break; + + case HIDE_VERTICAL: + sideA.height -=pixels; + pointA.y +=pixels; + sideB.height -=pixels; + sideB.y +=pixels; + break; + + case HIDE_HORIZONTAL: + sideA.width -=pixels; + pointA.x +=pixels; + sideB.width -=pixels; + sideB.x +=pixels; + break; + } + + // Are we finished? + if((direction==REVEAL_VERTICAL && pointA.y<0)||(direction==REVEAL_HORIZONTAL && pointA.x<0)) + { + canvas=image.clone(); + complete=true; + } + else if((direction==HIDE_VERTICAL && sideA.height<=0)||(direction==HIDE_HORIZONTAL && sideA.width<=0)) + { + canvas.fillRect(clsRect, clsColor); + complete=true; + } + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + + if(complete && completeCallback is Function) + { + completeCallback.call(); + } + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx new file mode 100644 index 0000000..1d8a1a2 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/FloodFillFX.hx @@ -0,0 +1,128 @@ +/** + * FloodFillFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Renamed - was "DropDown", but now a more accurate "flood fill" + * v1.0 First release + * + * @version 1.1 - May 31st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a flood fill effect FlxSprite, useful for bringing in images in cool ways + */ +class FloodFillFX extends BaseFX +{ + private var complete:Bool; + private var chunk:Int; + private var offset:Int; + private var dropDirection:Int; + private var dropRect:Rectangle; + private var dropPoint:Point; + private var dropY:Int; + + public function new() + { + } + + /** + * Creates a new Flood Fill effect from the given image + * + * @param source The source image bitmapData to use for the drop + * @param x The x coordinate to place the resulting effect sprite + * @param y The y coordinate to place the resulting effect sprite + * @param width The width of the resulting effet sprite. Doesn't have to match the source image + * @param height The height of the resulting effet sprite. Doesn't have to match the source image + * @param direction 0=Top to bottom. 1=Bottom to top. 2=Left to Right. 3=Right to Left. + * @param pixels How many pixels to drop per update(default 1) + * @param split Boolean(default false)- if split it will drop from opposite sides at the same time + * @param backgroundColor The background colour of the FlxSprite the effect is drawn in to(default 0x0=transparent) + * + * @return An FlxSprite with the effect ready to run in it + */ + public function create(source:FlxSprite, x:Int, y:Int, width:Int, height:Int, direction:Int=0, pixels:Int=1, split:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, backgroundColor); + + canvas=new BitmapData(width, height, true, backgroundColor); + + if(source.pixels.width !=width || source.pixels.height !=height) + { + image=new BitmapData(width, height, true, backgroundColor); + image.copyPixels(source.pixels, new Rectangle(0, 0, source.pixels.width, source.pixels.height), new Point(0, height - source.pixels.height)); + } + else + { + image=source.pixels; + } + + offset=pixels; + + dropDirection=direction; + dropRect=new Rectangle(0, canvas.height - offset, canvas.width, offset); + dropPoint=new Point(0, 0); + dropY=canvas.height; + + active=true; + + return sprite; + } + + public function draw():Void + { + if(ready && complete==false) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + canvas.lock(); + + switch(dropDirection) + { + // Dropping Down + case 0: + + // Get a pixel strip from the picture(starting at the bottom and working way up) + for(y in 0...dropY +=offset) + { + dropPoint.y=y; + canvas.copyPixels(image, dropRect, dropPoint); + } + + dropY -=offset; + + dropRect.y -=offset; + + if(dropY<=0) + { + complete=true; + } + + break; + } + + lastUpdate=0; + + canvas.unlock(); + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/GlitchFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/GlitchFX.hx new file mode 100644 index 0000000..5e88bda --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/GlitchFX.hx @@ -0,0 +1,119 @@ +/** + * GlitchFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.2 Fixed updateFromSource github issue #8(thanks CoderBrandon) + * v1.1 Added changeGlitchValues support + * v1.0 First release + * + * @version 1.2 - August 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a static / glitch / monitor-corruption style effect on an FlxSprite + * + * + * + * Add reduction from really high glitch value down to zero, will smooth the image Into place and look cool:) + * Add option to glitch vertically? + * + */ +class GlitchFX extends BaseFX +{ + private var glitchSize:Int; + private var glitchSkip:Int; + + public function new() + { + } + + public function createFromFlxSprite(source:FlxSprite, maxGlitch:Int, maxSkip:Int, autoUpdate:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(source.x, source.y).makeGraphic(source.width + maxGlitch, source.height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + image=source.pixels; + + updateFromSource=autoUpdate; + + if(updateFromSource) + { + sourceRef=source; + } + + glitchSize=maxGlitch; + glitchSkip=maxSkip; + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, image.width, 1); + + active=true; + + return sprite; + } + + public function changeGlitchValues(maxGlitch:Int, maxSkip:Int):Void + { + glitchSize=maxGlitch; + glitchSkip=maxSkip; + } + + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var rndSkip:Int=1 + Std.int(Math.random()* glitchSkip); + + copyRect.y=0; + copyPoint.y=0; + copyRect.height=rndSkip; + + for(y in 0...sprite.height +=rndSkip) + { + copyPoint.x=Std.int(Math.random()* glitchSize); + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=rndSkip; + copyPoint.y +=rndSkip; + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx new file mode 100644 index 0000000..bbb8e5b --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/PlasmaFX.hx @@ -0,0 +1,170 @@ +/** + * PlasmaFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.4 Moved to the new Special FX Plugins + * v1.3 Colours updated to include alpha values + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - May 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a plasma effect FlxSprite + */ + +class PlasmaFX extends BaseFX +{ + //private var pos1:Int; + //private var pos2:Int; + //private var pos3:Int; + //private var pos4:Int; + + public var pos1:Int; + public var pos2:Int; + public var pos3:Int; + public var pos4:Int; + public var depth:Int=128; + + private var tpos1:Int; + private var tpos2:Int; + private var tpos3:Int; + private var tpos4:Int; + + private var aSin:Array; + //private var previousColour:Int; + private var colours:Array; + private var step:Int=0; + private var span:Int; + + public function new():Void + { + } + + public function create(x:Int, y:Int, width:Int, height:Int, scaleX:Int=1, scaleY:Int=1):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + if(scaleX !=1 || scaleY !=1) + { + sprite.scale=new FlxPoint(scaleX, scaleY); + sprite.x +=width / scaleX; + sprite.y +=height / scaleY; + } + + canvas=new BitmapData(width, height, true, 0x0); + + colours=FlxColor.getHSVColorWheel(); + + //colours=FlxColor.getHSVColorWheel(140); // now supports alpha:) + //colours=FlxGradient.createGradientArray(1, 360, [0xff000000, 0xff000000, 0xff000000, 0x00000000, 0xff000000], 2); // Lovely black reveal for over an image + //colours=FlxGradient.createGradientArray(1, 360, [0xff0000FF, 0xff000000, 0xff8F107C, 0xff00FFFF, 0xff0000FF], 1);// lovely purple black blue thingy + + span=colours.length - 1; + + aSin=new Array(512); + + for(i in 0...512) + { + //var rad:Float=(i * 0.703125)* 0.0174532; + var rad:Float=(i * 0.703125)* 0.0174532; + + // Any power of 2! + // http://www.vaughns-1-pagers.com/computer/powers-of-2.htm + // 256, 512, 1024, 2048, 4096, 8192, 16384 + aSin[i]=Math.sin(rad)* 1024; + + //aSin[i]=Math.cos(rad)* 1024; + } + + active=true; + + tpos1=293; + tpos2=483; + tpos3=120; + tpos4=360; + + pos1=0; + pos2=5; + pos3=0; + pos4=0; + + return sprite; + } + + public function draw():Void + { + if(step<10) + { + //trace(step, tpos1, tpos2, tpos3, tpos4, pos1, pos2, pos3, pos4, index); + step++; + } + + tpos4=pos4; + tpos3=pos3; + + canvas.lock(); + + for(y in 0...canvas.height) + { + tpos1=pos1 + 5; + tpos2=pos2 + 3; + + //tpos1=pos1; + //tpos2=pos2; + + tpos2 &=511; + tpos3 &=511; + + for(x in 0...canvas.width) + { + tpos1 &=511; + tpos2 &=511; + + var x2:Int=aSin[tpos1] + aSin[tpos2] + aSin[tpos3] + aSin[tpos4]; + + //var index:Int=depth +(x2>>4); + var index:Int=depth +(x2>>4); + //p=(128 +(p>>4))& 255; + + + if(index<=0) + { + index +=span; + } + + if(index>=span) + { + index -=span; + } + + canvas.setPixel32(x, y, colours[index]); + + tpos1 +=5; + tpos2 +=3; + } + + tpos3 +=1; + tpos4 +=3; + } + + canvas.unlock(); + + sprite.pixels=canvas; + sprite.dirty=true; + + pos1 +=4; // horizontal shift + pos3 +=2; // vertical shift + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx new file mode 100644 index 0000000..679bd6c --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/RainbowLineFX.hx @@ -0,0 +1,260 @@ +/** + * RainbowLineFX - A Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 Built Into the new FlxSpecialFX system + * + * @version 1.0 - May 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxGradient, FlxMath +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a Rainbow Line Effect - typically a rainbow sequence of color values passing through a 1px high line + */ +class RainbowLineFX extends BaseFX +{ + private var lineColors:Array; + private var maxColor:Int; + private var currentColor:Int; + private var fillRect:Rectangle; + private var speed:Int; + private var chunk:Int; + private var direction:Int; + private var setPixel:Bool; + + public function new() + { + } + + /** + * Creates a Color Line FlxSprite. + * + * @param x The x coordinate of the FlxSprite in game world pixels + * @param y The y coordinate of the FlxSprite in game world pixels + * @param width The width of the FlxSprite in pixels + * @param height The height of the FlxSprite in pixels + * @param colors An Array of color values used to create the line. If null(default)the HSV Color Wheel is used, giving a full spectrum rainbow effect + * @param colorWidth The width of the color range controls how much Interpolation occurs between each color in the colors array(default 360) + * @param colorSpeed The speed at which the Rainbow Line cycles through its colors(default 1) + * @param stepSize The size of each "chunk" of the Rainbow Line - use a higher value for a more retro look(default 1) + * @param fadeWidth If you want the Line to fade from fadeColor to the first color in the colors array, and then out again, set this value to the amount of transition you want(128 looks good) + * @param fadeColor The default fade color is black, but if you need to alpha it, or change for a different color, set it here + * + * @return An FlxSprite which automatically updates each draw()to cycle the colors through it + */ + public function create(x:Int, y:Int, width:Int, height:Int=1, colors:Array=null, colorWidth:Int=360, colorSpeed:Int=1, stepSize:Int=1, fadeWidth:Int=128, fadeColor:Int=0xff000000):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + canvas=new BitmapData(width, height, true, 0x0); + + if(Std.is(colors, Array)) + { + lineColors=FlxGradient.createGradientArray(1, colorWidth, colors); + } + else + { + lineColors=FlxColor.getHSVColorWheel(); + } + + currentColor=0; + maxColor=lineColors.length - 1; + + if(fadeWidth !=0) + { + var blackToFirst:Array=FlxGradient.createGradientArray(1, fadeWidth, [ fadeColor, fadeColor, fadeColor, lineColors[0] ]); + var lastToBlack:Array=FlxGradient.createGradientArray(1, fadeWidth, [ lineColors[maxColor], fadeColor, fadeColor, fadeColor, fadeColor ]); + + var fadingColours:Array=blackToFirst.concat(lineColors); + fadingColours=fadingColours.concat(lastToBlack); + + lineColors=fadingColours; + + maxColor=lineColors.length - 1; + } + + direction=0; + setPixel=false; + speed=colorSpeed; + chunk=stepSize; + fillRect=new Rectangle(0, 0, chunk, height); + + if(height==1 && chunk==1) + { + setPixel=true; + } + + active=true; + + return sprite; + } + + /** + * Change the colors cycling through the line by passing in a new array of color values + * + * @param colors An Array of color values used to create the line. If null(default)the HSV Color Wheel is used, giving a full spectrum rainbow effect + * @param colorWidth The width of the color range controls how much Interpolation occurs between each color in the colors array(default 360) + * @param resetCurrentColor If true the color pointer is returned to the start of the new color array, otherwise remains where it is + * @param fadeWidth If you want the Rainbow Line to fade from black to the first color in the colors array, and then out again, set this value to the amount of transition you want(128 looks good) + * @param fadeColor The default fade color is black, but if you need to alpha it, or change for a different color, set it here + */ + public function updateColors(colors:Array, colorWidth:Int=360, resetCurrentColor:Bool=false, fadeWidth:Int=128, fadeColor:Int=0xff000000):Void + { + if(Std.is(colors, Array)) + { + lineColors=FlxGradient.createGradientArray(1, colorWidth, colors); + } + else + { + lineColors=FlxColor.getHSVColorWheel(); + } + + maxColor=lineColors.length - 1; + + if(fadeWidth !=0) + { + var blackToFirst:Array=FlxGradient.createGradientArray(1, fadeWidth, [ 0xff000000, 0xff000000, 0xff000000, lineColors[0] ]); + var lastToBlack:Array=FlxGradient.createGradientArray(1, fadeWidth, [ lineColors[maxColor], 0xff000000, 0xff000000, 0xff000000, 0xff000000 ]); + + var fadingColours:Array=blackToFirst.concat(lineColors); + fadingColours=fadingColours.concat(lastToBlack); + + lineColors=fadingColours; + + maxColor=lineColors.length - 1; + } + + if(currentColor>maxColor || resetCurrentColor) + { + currentColor=0; + } + } + + /** + * Doesn't need to be called directly as it's called by the FlxSpecialFX Plugin.
+ * Set active to false if you wish to disable the effect.
+ * Pass the effect to FlxSpecialFX.erase()if you wish to destroy this effect. + */ + public function draw():Void + { + canvas.lock(); + + fillRect.x=0; + + for(x in 0...canvas.width=x + chunk) + { + var c:Int=FlxMath.wrapValue(currentColor + x, 1, maxColor); + + if(setPixel) + { + canvas.setPixel32(x, 0, lineColors[c]); + } + else + { + canvas.fillRect(fillRect, lineColors[c]); + fillRect.x +=chunk; + } + } + + canvas.unlock(); + + if(direction==0) + { + currentColor +=speed; + + if(currentColor>=maxColor) + { + currentColor=0; + } + } + else + { + currentColor -=speed; + + if(currentColor<0) + { + currentColor=maxColor; + } + } + + sprite.pixels=canvas; + sprite.dirty=true; + } + + /** + * Set the speed at which the Line cycles through its colors + */ + private function set_colorSpeed(value:Int):Void + { + if(value0) + { + canvas.fillRect(new Rectangle(0, 0, canvas.width, canvas.height), 0x0); + chunk=value; + + fillRect.x=0; + fillRect.width=chunk; + + if(value>1) + { + setPixel=false; + } + else + { + setPixel=true; + } + } + } + + /** + * The size of each "chunk" of the Line + */ + public var stepSize(get_stepSize, set_stepSize):Int; + private function get_stepSize():Int + { + return chunk; + } + + /** + * Changes the color cycle direction. + * + * @param newDirection 0=Colors cycle incrementally(line looks like it is moving to the left), 1=Colors decrement(line moves to the right) + */ + public function setDirection(newDirection:Int):Void + { + if(newDirection==0 || newDirection==1) + { + direction=newDirection; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/RevealFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/RevealFX.hx new file mode 100644 index 0000000..f130486 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/RevealFX.hx @@ -0,0 +1,113 @@ +/** + * RevealFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 Added changeGlitchValues support + * v1.0 First release + * + * @version 1.1 - June 13th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a static / glitch / monitor-corruption style effect on an FlxSprite + * + * + * + * Add reduction from really high glitch value down to zero, will smooth the image Into place and look cool:) + * Add option to glitch vertically? + * + */ +class RevealFX extends BaseFX +{ + private var glitchSize:Int; + private var glitchSkip:Int; + + public function new() + { + } + + public function createFromFlxSprite(source:FlxSprite, maxGlitch:Int, maxSkip:Int, autoUpdate:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + sprite=new FlxSprite(source.x, source.y).makeGraphic(source.width + maxGlitch, source.height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + image=source.pixels; + + updateFromSource=autoUpdate; + + glitchSize=maxGlitch; + glitchSkip=maxSkip; + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + copyRect=new Rectangle(0, 0, image.width, 1); + + active=true; + + return sprite; + } + + public function changeGlitchValues(maxGlitch:Int, maxSkip:Int):Void + { + glitchSize=maxGlitch; + glitchSkip=maxSkip; + } + + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var rndSkip:Int=1 + Std.int(Math.random()* glitchSkip); + + copyRect.y=0; + copyPoint.y=0; + copyRect.height=rndSkip; + + for(y in 0...sprite.height +=rndSkip) + { + copyPoint.x=Std.int(Math.random()* glitchSize); + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=rndSkip; + copyPoint.y +=rndSkip; + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx new file mode 100644 index 0000000..6e9157a --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/SineWaveFX.hx @@ -0,0 +1,329 @@ +/** + * SineWaveFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.0 - May 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a sine-wave effect through an FlxSprite which can be applied vertically or horizontally + */ +class SineWaveFX extends BaseFX +{ + private var waveType:Int; + private var waveVertical:Bool; + private var waveLength:Int; + private var waveSize:Int; + private var waveFrequency:Float; + private var wavePixelChunk:Int; + private var waveData:Array; + private var waveDataCounter:Int=0; + private var waveLoopCallback:Function; + + public static inline var WAVETYPE_VERTICAL_SINE:Int=0; + public static inline var WAVETYPE_VERTICAL_COSINE:Int=1; + public static inline var WAVETYPE_HORIZONTAL_SINE:Int=2; + public static inline var WAVETYPE_HORIZONTAL_COSINE:Int=3; + + public function new() + { + } + + /** + * Creates a new SineWaveFX Effect from the given FlxSprite. The original sprite remains unmodified.
+ * The resulting FlxSprite will take on the same width / height and x/y coordinates of the source FlxSprite.
+ * For really cool effects you can SineWave an FlxSprite that is constantly updating(either through animation or an FX chain). + * + * @param source The FlxSprite providing the image data for this effect. The resulting FlxSprite takes on the source width, height, x/y positions and scrollfactor. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param updateFrame When this effect is created it takes a copy of the source image data and stores it. Set this to true to grab a new copy of the image data every frame. + * @param backgroundColor The background color(0xAARRGGBB format)to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromFlxSprite(source:FlxSprite, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, updateFrame:Bool=false, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create(source.pixels, source.x, source.y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=updateFrame; + + if(updateFromSource) + { + sourceRef=source; + } + + return result; + } + + /** + * Creates a new SineWaveFX Effect from the given Class(which must contain a Bitmap).
+ * If you need to update the source data at run-time then use createFromFlxSprite + * + * @param source The Class providing the bitmapData for this effect, usually from an Embedded bitmap. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromClass(source:Class, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create((new source).bitmapData, x, y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=false; + + return result; + } + + /** + * Creates a new SineWaveFX Effect from the given bitmapData.
+ * If you need to update the source data at run-time then use createFromFlxSprite + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + public function createFromBitmapData(source:BitmapData, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + var result:FlxSprite=create(source, x, y, type, size, length, frequency, pixelsPerChunk, backgroundColor); + + updateFromSource=false; + + return result; + } + + /** + * Internal function fed from createFromFlxSprite / createFromClass / createFromBitmapData + * + * @param source The bitmapData image to use for this effect. + * @param x The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param y The x coordinate(in game world pixels)that the resulting FlxSprite will be created at. + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + * @param backgroundColor The background color in 0xAARRGGBB format to draw behind the effect(default 0x0=transparent) + * @return An FlxSprite with the effect running through it, which should be started with a call to SineWaveFX.start() + */ + private function create(source:BitmapData, x:Int, y:Int, type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1, backgroundColor:Int=0x0):FlxSprite + { + if(type==WAVETYPE_VERTICAL_SINE || type==WAVETYPE_VERTICAL_COSINE) + { + waveVertical=true; + + if(pixelsPerChunk>=source.width) + { + throw new Dynamic("SineWaveFX:pixelsPerChunk cannot be>=source.width with WAVETYPE_VERTICAL"); + } + } + else if(type==WAVETYPE_HORIZONTAL_SINE || type==WAVETYPE_HORIZONTAL_COSINE) + { + waveVertical=false; + + if(pixelsPerChunk>=source.height) + { + throw new Dynamic("SineWaveFX:pixelsPerChunk cannot be>=source.height with WAVETYPE_HORIZONTAL"); + } + } + + updateWaveData(type, size, length, frequency, pixelsPerChunk); + + // The FlxSprite Into which the sine-wave effect is drawn + + if(waveVertical) + { + sprite=new FlxSprite(x, y).makeGraphic(source.width, source.height +(waveSize * 3), backgroundColor); + } + else + { + sprite=new FlxSprite(x, y).makeGraphic(source.width +(waveSize * 3), source.height, backgroundColor); + } + + // The scratch bitmapData where we prepare the final sine-waved image + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + // Our local copy of the sprite image data + image=source.clone(); + + clsColor=backgroundColor; + clsRect=new Rectangle(0, 0, canvas.width, canvas.height); + + copyPoint=new Point(0, 0); + + if(waveVertical) + { + copyRect=new Rectangle(0, 0, wavePixelChunk, image.height); + } + else + { + copyRect=new Rectangle(0, 0, image.width, wavePixelChunk); + } + + active=true; + + return sprite; + } + + /** + * Update the SineWave data without modifying the source image being used.
+ * This call is fast enough that you can modify it in real-time. + * + * @param type WAVETYPE_VERTICAL_SINE, WAVETYPE_VERTICAL_COSINE, WAVETYPE_HORIZONTAL_SINE or WAVETYPE_HORIZONTAL_COSINE + * @param size The size in pixels of the sine wave. Either the height of the wave or the width(for vertical or horizontal waves) + * @param length The length of the wave in pixels. You should usually set this to the width or height of the source image, or a multiple of it. + * @param frequency The frequency of the peaks in the wave. MUST BE AN EVEN NUMBER! 2, 4, 6, 8, etc. + * @param pixelsPerChunk How many pixels to use per step. Higher numbers make a more chunky but faster effect. Make sure source.width/height divides by this value evenly. + */ + public function updateWaveData(type:Int, size:Int, length:Int, frequency:Int=2, pixelsPerChunk:Int=1):Void + { + if(type>WAVETYPE_HORIZONTAL_COSINE) + { + throw new Dynamic("SineWaveFX:Invalid WAVETYPE"); + } + + if(FlxMath.isOdd(frequency)) + { + throw new Dynamic("SineWaveFX:frequency must be an even number"); + } + + waveType=type; + waveSize=uint(size * 0.5); + waveLength=uint(length / pixelsPerChunk); + waveFrequency=frequency; + wavePixelChunk=pixelsPerChunk; + waveData=FlxMath.sinCosGenerator(waveLength, waveSize, waveSize, waveFrequency); + + if(waveType==WAVETYPE_VERTICAL_COSINE || waveType==WAVETYPE_HORIZONTAL_COSINE) + { + waveData=FlxMath.getCosTable(); + } + } + + /** + * Use this to set a function to be called every time the wave has completed one full cycle.
+ * Set to null to remove any previous callback. + * + * @param callback The function to call every time the wave completes a full cycle(duration will vary based on waveLength) + */ + public function setLoopCompleteCallback(callback:Function):Void + { + waveLoopCallback=callback; + } + + /** + * Called by the FlxSpecialFX plugin. Should not be called directly. + */ + public function draw():Void + { + if(ready) + { + if(lastUpdate !=updateLimit) + { + lastUpdate++; + + return; + } + + if(updateFromSource && sourceRef.exists) + { + image=sourceRef.framePixels; + } + + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + var s:Int=0; + + copyRect.x=0; + copyRect.y=0; + + if(waveVertical) + { + for(x in 0...image.width +=wavePixelChunk) + { + copyPoint.x=x; + copyPoint.y=waveSize +(waveSize / 2)+ waveData[s]; + + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.x +=wavePixelChunk; + + s++; + } + } + else + { + for(y in 0...image.height +=wavePixelChunk) + { + copyPoint.x=waveSize +(waveSize / 2)+ waveData[s]; + copyPoint.y=y; + + canvas.copyPixels(image, copyRect, copyPoint); + + copyRect.y +=wavePixelChunk; + + s++; + } + } + + // Cycle through the wave data - this is what causes the image to "undulate" + var t:Float=waveData.shift(); + waveData.push(t); + + waveDataCounter++; + + if(waveDataCounter==waveData.length) + { + waveDataCounter=0; + + if(Std.is(waveLoopCallback, Function)) + { + waveLoopCallback.call(); + } + } + + canvas.unlock(); + + lastUpdate=0; + + sprite.pixels=canvas; + sprite.dirty=true; + } + } + + public function toString():String + { + var output:Array=[ "Type:" + waveType, "Size:" + waveSize, "Length:" + waveLength, "Frequency:" + waveFrequency, "Chunks:" + wavePixelChunk, "clsRect:" + clsRect ]; + + return output.join(","); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx new file mode 100644 index 0000000..da116fa --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/StarfieldFX.hx @@ -0,0 +1,283 @@ +/** + * StarfieldFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.1 StarField moved to the FX Plugin system + * v1.0 First release + * + * @version 1.1 - May 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.getTimer; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a 2D or 3D Star Field effect on an FlxSprite for use in your game. + */ +class StarfieldFX extends BaseFX +{ + /** + * In a 3D starfield this controls the X coordinate the stars emit from, can be updated in real-time! + */ + public var centerX:Int; + + /** + * In a 3D starfield this controls the Y coordinate the stars emit from, can be updated in real-time! + */ + public var centerY:Int; + + /** + * How much to shift on the X axis every update. Negative values move towards the left, positiive to the right. 2D Starfield only. Can also be set via setStarSpeed() + */ + public var starXOffset:Float=-1; + + /** + * How much to shift on the Y axis every update. Negative values move up, positiive values move down. 2D Starfield only. Can also be set via setStarSpeed() + */ + public var starYOffset:Float=0; + + private var stars:Array; + private var starfieldType:Int; + + private var backgroundColor:Int=0xff000000; + + private var updateSpeed:Int; + private var tick:Int; + + private var depthColours:Array; + + public static inline var STARFIELD_TYPE_2D:Int=1; + public static inline var STARFIELD_TYPE_3D:Int=2; + + public function new() + { + } + + /** + * Create a new StarField + * + * @param x X coordinate of the starfield sprite + * @param y Y coordinate of the starfield sprite + * @param width The width of the starfield + * @param height The height of the starfield + * @param quantity The number of stars in the starfield(default 200) + * @param type Type of starfield. Either STARFIELD_TYPE_2D(default, stars move horizontally)or STARFIELD_TYPE_3D(stars flow out from the center) + * @param updateInterval How many ms should pass before the next starfield update(default 20) + */ + public function create(x:Int, y:Int, width:Int, height:Int, quantity:Int=200, type:Int=1, updateInterval:Int=20):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, backgroundColor); + + canvas=new BitmapData(sprite.width, sprite.height, true, backgroundColor); + + starfieldType=type; + + updateSpeed=speed; + + // Stars come from the middle of the starfield in 3D mode + centerX=width>>1; + centerY=height>>1; + + clsRect=new Rectangle(0, 0, width, height); + clsPoint=new Point; + clsColor=backgroundColor; + + stars=new Array(); + + for(i in 0...quantity) + { + var star:Dynamic=new Dynamic; + + star.index=i; + star.x=Std.int(Math.random()* width); + star.y=Std.int(Math.random()* height); + star.d=1; + + if(type==STARFIELD_TYPE_2D) + { + star.speed=1 + Std.int(Math.random()* 5); + } + else + { + star.speed=Math.random(); + } + + star.r=Math.random()* Math.PI * 2; + star.alpha=0; + + stars.push(star); + } + + // Colours array + if(type==STARFIELD_TYPE_2D) + { + depthColours=FlxGradient.createGradientArray(1, 5, [0xff585858, 0xffF4F4F4]); + } + else + { + depthColours=FlxGradient.createGradientArray(1, 300, [0xff292929, 0xffffffff]); + } + + active=true; + + return sprite; + } + + /** + * Change the background color in the format 0xAARRGGBB of the starfield.
+ * Supports alpha, so if you want a transparent background just pass 0x00 as the color. + * + * @param backgroundColor + */ + public function setBackgroundColor(backgroundColor:Int):Void + { + clsColor=backgroundColor; + } + + /** + * Change the number of layers(depth)and colors used for layer of the starfield. Change happens immediately. + * + * @param depth Number of depths(for a 2D starfield the default is 5) + * @param lowestColor The color given to the stars furthest away from the camera(i.e. the slowest stars), typically the darker colour + * @param highestColor The color given to the stars cloest to the camera(i.e. the fastest stars), typically the brighter colour + */ + public function setStarDepthColors(depth:Int, lowestColor:Int=0xff585858, highestColor:Int=0xffF4F4F4):Void + { + // Depth is the same, we just need to update the gradient then + depthColours=FlxGradient.createGradientArray(1, depth, [lowestColor, highestColor]); + + // Run through the stars array, making sure the depths are all within range + for(var star:Dynamic in stars) + { + star.speed=1 + Std.int(Math.random()* depth); + } + } + + /** + * Sets the direction and speed of the 2D starfield(doesn't apply to 3D)
+ * You can combine both X and Y together to make the stars move on a diagnol + * + * @param xShift How much to shift on the X axis every update. Negative values move towards the left, positiive to the right + * @param yShift How much to shift on the Y axis every update. Negative values move up, positiive values move down + */ + public function setStarSpeed(xShift:Float, yShift:Float):Void + { + starXOffset=xShift; + starYOffset=yShift; + } + + /** + * The current update speed + */ + public var speed(get_speed, set_speed):Int; + private function get_speed():Int + { + return updateSpeed; + } + + /** + * Change the tick Interval on which the update runs. By default the starfield updates once every 20ms. Set to zero to disable totally. + */ + private function set_speed(newSpeed:Int):Void + { + updateSpeed=newSpeed; + } + + private function update2DStarfield():Void + { + for(var star:Dynamic in stars) + { + star.x +=(starXOffset * star.speed); + star.y +=(starYOffset * star.speed); + + canvas.setPixel32(star.x, star.y, depthColours[star.speed - 1]); + + if(star.x>sprite.width) + { + star.x=0; + } + else if(star.x<0) + { + star.x=sprite.width; + } + + if(star.y>sprite.height) + { + star.y=0; + } + else if(star.y<0) + { + star.y=sprite.height; + } + } + } + + private function update3DStarfield():Void + { + for(var star:Dynamic in stars) + { + star.d *=1.1; + star.x=centerX +((Math.cos(star.r)* star.d)* star.speed); + star.y=centerY +((Math.sin(star.r)* star.d)* star.speed); + + star.alpha=star.d * 2; + + if(star.alpha>255) + { + star.alpha=255; + } + + canvas.setPixel32(star.x, star.y, 0xffffffff); + //canvas.setPixel32(star.x, star.y, FlxColor.getColor32(255, star.alpha, star.alpha, star.alpha)); + + if(star.x<0 || star.x>sprite.width || star.y<0 || star.y>sprite.height) + { + star.d=1; + star.r=Math.random()* Math.PI * 2; + star.x=0; + star.y=0; + star.speed=Math.random(); + star.alpha=0; + + stars[star.index]=star; + } + } + } + + public function draw():Void + { + if(getTimer()>tick) + { + canvas.lock(); + canvas.fillRect(clsRect, clsColor); + + if(starfieldType==STARFIELD_TYPE_2D) + { + update2DStarfield(); + } + else + { + update3DStarfield(); + } + + canvas.unlock(); + + sprite.pixels=canvas; + + if(updateSpeed>0) + { + tick=getTimer()+ updateSpeed; + } + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx b/intra/source/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx new file mode 100644 index 0000000..19829e0 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FX/WowCopperFX.hx @@ -0,0 +1,304 @@ +/** + * WowCopperFX - Special FX Plugin + * -- Part of the Flixel Power Tools set + * + * v1.0 First release + * + * @version 1.4 - May 8th 2011 + * @link http://www.photonstorm.com + * @author Original by Mathew Nolan / Flashtro.com + * @author Ported with permission by Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm.FX +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.Matrix; +import flash.geom.Rectangle; + +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; + +/** + * Creates a WOW Copper effect FlxSprite + */ + +class WowCopperFX extends BaseFX +{ + private var colors:Array; + private var step:Int=0; + private var span:Int; + + + private var bmp_databg:BitmapData=new BitmapData(1 , 64 , false , 0x00000100); + //private var bmp_objbg:Bitmap=new Bitmap(bmp_databg , PixelSnapping.AUTO , false); + private var bg2:Sprite=new Sprite; + + private var amount:Int=8; + private var tab:Int=0; + private var del:Int=0; + private var max:Int=136; + + public function new():Void + { + } + + public function create(x:Int, y:Int, width:Int, height:Int):FlxSprite + { + sprite=new FlxSprite(x, y).makeGraphic(width, height, 0x0); + + colors=[0x110011, + 0x220022, + 0x330033, + 0x440044, + 0x550055, + 0x660066, + 0x770077, + 0x880088, + 0x990099, + 0xaa00aa, + 0xbb00bb, + 0xcc00cc, + 0xdd00dd, + 0xee00ee, + 0xff00ff, + 0xff00ff, + 0xee00ee, + 0xdd00dd, + 0xcc00cc, + 0xbb00bb, + 0xaa00aa, + 0x990099, + 0x880088, + 0x770077, + 0x660066, + 0x550055, + 0x440044, + 0x330033, + 0x220022, + 0x110011, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x111100, + 0x222200, + 0x333300, + 0x444400, + 0x555500, + 0x666600, + 0x777700, + 0x888800, + 0x999900, + 0xaaaa00, + 0xbbbb00, + 0xcccc00, + 0xdddd00, + 0xeeee00, + 0xffff00, + 0xffff00, + 0xeeee00, + 0xdddd00, + 0xcccc00, + 0xbbbb00, + 0xaaaa00, + 0x999900, + 0x888800, + 0x777700, + 0x666600, + 0x555500, + 0x444400, + 0x333300, + 0x222200, + 0x111100, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x001111, + 0x002222, + 0x003333, + 0x004444, + 0x005555, + 0x006666, + 0x007777, + 0x008888, + 0x009999, + 0x00aaaa, + 0x00bbbb, + 0x00cccc, + 0x00dddd, + 0x00eeee, + 0x00ffff, + 0x00ffff, + 0x00eeee, + 0x00dddd, + 0x00cccc, + 0x00bbbb, + 0x00aaaa, + 0x009999, + 0x008888, + 0x007777, + 0x006666, + 0x005555, + 0x004444, + 0x003333, + 0x002222, + 0x001111, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x111111, + 0x222222, + 0x333333, + 0x444444, + 0x555555, + 0x666666, + 0x777777, + 0x888888, + 0x999999, + 0xaaaaaa, + 0xbbbbbb, + 0xcccccc, + 0xdddddd, + 0xeeeeee, + 0xffffff, + 0xffffff, + 0xeeeeee, + 0xdddddd, + 0xcccccc, + 0xbbbbbb, + 0xaaaaaa, + 0x999999, + 0x888888, + 0x777777, + 0x666666, + 0x555555, + 0x444444, + 0x333333, + 0x222222, + 0x111111, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001, + 0x000001]; + + //canvas=new BitmapData(1, 64 , false , 0x00000100); + canvas=new BitmapData(width, height, true, 0x0); + + active=true; + + return sprite; + } + + public function draw():Void + { + if(step<10) + { + //trace(step, tpos1, tpos2, tpos3, tpos4, pos1, pos2, pos3, pos4, index); + step++; + } + + //canvas.setPixel(0, 31, colors[tab]); + bmp_databg.setPixel(0, 31, colors[tab]); + + del++; + + if(del>=2) + { + bmp_databg.scroll(0, -1); + tab++; + del=0; + } + + if(tab>=colors.length) + { + tab=0; + } + + bg2.graphics.clear(); + + var bbcb:Matrix=new Matrix; + + for(i in 0...max +=amount) + { + bg2.graphics.beginBitmapFill(bmp_databg, bbcb, true, false); + bg2.graphics.moveTo(0, i); + bg2.graphics.lineTo(0, i + amount); + bg2.graphics.lineTo(320, i + amount); + bg2.graphics.lineTo(320, i); + bg2.graphics.endFill(); + bbcb.translate(0, 7); + } + + canvas.draw(bg2); + + sprite.pixels=canvas; + sprite.dirty=true; + + /* + bmp_databg.setPixel(0,31,cols[tab]) + del++ + if(del>=2){ + bmp_databg.scroll(0,-1) + tab++ + del=0 + } + if(tab>=cols.length){ + tab=0 + } + bg2.graphics.clear() + var bbcb=new flash.geom.Matrix(); + for(i in 0...max=amount){ + + + + //m.ty=0 + + bg2.graphics.beginBitmapFill(bmp_databg, bbcb,true,false); + bg2.graphics.moveTo(0, i); + bg2.graphics.lineTo(0, i+amount); + bg2.graphics.lineTo(320, i+amount); + bg2.graphics.lineTo(320, i); + bg2.graphics.endFill(); + bbcb.translate(0,7) + + } + */ + + + //canvas.setPixel32(x, y, colours[index]); + + //sprite.pixels=canvas; + //sprite.dirty=true; + + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxBar.hx b/intra/source/org/flixel/plugin/photonstorm/FlxBar.hx new file mode 100644 index 0000000..48d2e50 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxBar.hx @@ -0,0 +1,658 @@ +/** + * FlxBar + * -- Part of the Flixel Power Tools set + * + * v1.6 Lots of bug fixes, more documentation, 2 new test cases, ability to set currentValue added + * v1.5 Fixed bug in "get percent" function that allows it to work with any value range + * v1.4 Added support for min/max callbacks and "kill on min" + * v1.3 Renamed from FlxHealthBar and made less specific / far more flexible + * v1.2 Fixed colour values for fill and gradient to include alpha + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - October 10th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +/** + * FlxBar is a quick and easy way to create a graphical bar which can + * be used as part of your UI/HUD, or positioned next to a sprite. It could represent + * a loader, progress or health bar. + */ +class FlxBar extends FlxSprite +{ + private var canvas:BitmapData; + + private var barType:Int; + private var barWidth:Int; + private var barHeight:Int; + + private var parent:Dynamic; + private var parentVariable:String; + + /** + * fixedPosition controls if the FlxBar sprite is at a fixed location on screen, or tracking its parent + */ + public var fixedPosition:Bool=true; + + /** + * The positionOffset controls how far offset the FlxBar is from the parent sprite(if at all) + */ + public var positionOffset:FlxPoint; + + /** + * The minimum value the bar can be(can never be>=max) + */ + private var min:Float; + + /** + * The maximum value the bar can be(can never be<=min) + */ + private var max:Float; + + /** + * How wide is the range of this bar?(max - min) + */ + private var range:Float; + + /** + * What 1% of the bar is equal to in terms of value(range / 100) + */ + private var pct:Float; + + /** + * The current value - must always be between min and max + */ + private var value:Float; + + /** + * How many pixels=1% of the bar(barWidth(or height)/ 100) + */ + public var pxPerPercent:Float; + + private var emptyCallback:Function; + private var emptyBar:BitmapData; + private var emptyBarRect:Rectangle; + private var emptyBarPoint:Point; + private var emptyKill:Bool; + private var zeroOffset:Point=new Point; + + private var filledCallback:Function; + private var filledBar:BitmapData; + private var filledBarRect:Rectangle; + private var filledBarPoint:Point; + + private var fillDirection:Int; + private var fillHorizontal:Bool; + + public static inline var FILL_LEFT_TO_RIGHT:Int=1; + public static inline var FILL_RIGHT_TO_LEFT:Int=2; + public static inline var FILL_TOP_TO_BOTTOM:Int=3; + public static inline var FILL_BOTTOM_TO_TOP:Int=4; + public static inline var FILL_HORIZONTAL_INSIDE_OUT:Int=5; + public static inline var FILL_HORIZONTAL_OUTSIDE_IN:Int=6; + public static inline var FILL_VERTICAL_INSIDE_OUT:Int=7; + public static inline var FILL_VERTICAL_OUTSIDE_IN:Int=8; + + private static inline var BAR_FILLED:Int=1; + private static inline var BAR_GRADIENT:Int=2; + private static inline var BAR_IMAGE:Int=3; + + /** + * Create a new FlxBar Dynamic + * + * @param x The x coordinate location of the resulting bar(in world pixels) + * @param y The y coordinate location of the resulting bar(in world pixels) + * @param direction One of the FlxBar.FILL_ constants(such as FILL_LEFT_TO_RIGHT, FILL_TOP_TO_BOTTOM etc) + * @param width The width of the bar in pixels + * @param height The height of the bar in pixels + * @param parentRef A reference to an object in your game that you wish the bar to track + * @param variable The variable of the object that is used to determine the bar position. For example if the parent was an FlxSprite this could be "health" to track the health value + * @param min The minimum value. I.e. for a progress bar this would be zero(nothing loaded yet) + * @param max The maximum value the bar can reach. I.e. for a progress bar this would typically be 100. + * @param border Include a 1px border around the bar?(if true it adds +2 to width and height to accommodate it) + */ + public function new(x:Int, y:Int, direction:Int=FILL_LEFT_TO_RIGHT, width:Int=100, height:Int=10, parentRef:Dynamic=null, variable:String="", min:Float=0, max:Float=100, border:Bool=false):Void + { + super(x, y); + + barWidth=width; + barHeight=height; + + if(border) + { + makeGraphic(barWidth + 2, barHeight + 2, 0xffffffff, true); + filledBarPoint=new Point(1, 1); + } + else + { + makeGraphic(barWidth, barHeight, 0xffffffff, true); + filledBarPoint=new Point(0, 0); + } + + canvas=new BitmapData(width, height, true, 0x0); + + if(parentRef) + { + parent=parentRef; + parentVariable=variable; + } + + setFillDirection(direction); + + setRange(min, max); + + createFilledBar(0xff005100, 0xff00F400, border); + + emptyKill=false; + } + + /** + * Track the parent FlxSprites x/y coordinates. For example if you wanted your sprite to have a floating health-bar above their head. + * If your health bar is 10px tall and you wanted it to appear above your sprite, then set offsetY to be -10 + * If you wanted it to appear below your sprite, and your sprite was 32px tall, then set offsetY to be 32. Same applies to offsetX. + * + * @param offsetX The offset on X in relation to the origin x/y of the parent + * @param offsetY The offset on Y in relation to the origin x/y of the parent + * @see stopTrackingParent + */ + public function trackParent(offsetX:Int, offsetY:Int):Void + { + fixedPosition=false; + + positionOffset=new FlxPoint(offsetX, offsetY); + + if(parent.scrollFactor) + { + scrollFactor.x=parent.scrollFactor.x; + scrollFactor.y=parent.scrollFactor.y; + } + } + + /** + * Sets a parent for this FlxBar. Instantly replaces any previously set parent and refreshes the bar. + * + * @param parentRef A reference to an object in your game that you wish the bar to track + * @param variable The variable of the object that is used to determine the bar position. For example if the parent was an FlxSprite this could be "health" to track the health value + * @param track If you wish the FlxBar to track the x/y coordinates of parent set to true(default false) + * @param offsetX The offset on X in relation to the origin x/y of the parent + * @param offsetY The offset on Y in relation to the origin x/y of the parent + */ + public function setParent(parentRef:Dynamic, variable:String, track:Bool=false, offsetX:Int=0, offsetY:Int=0):Void + { + parent=parentRef; + parentVariable=variable; + + if(track) + { + trackParent(offsetX, offsetY); + } + + updateValueFromParent(); + updateBar(); + } + + /** + * Tells the health bar to stop following the parent sprite. The given posX and posY values are where it will remain on-screen. + * + * @param posX X coordinate of the health bar now it's no longer tracking the parent sprite + * @param posY Y coordinate of the health bar now it's no longer tracking the parent sprite + */ + public function stopTrackingParent(posX:Int, posY:Int):Void + { + fixedPosition=true; + + x=posX; + y=posY; + } + + /** + * Sets callbacks which will be triggered when the value of this FlxBar reaches min or max.
+ * Functions will only be called once and not again until the value changes.
+ * Optionally the FlxBar can be killed if it reaches min, but if will fire the empty callback first(if set) + * + * @param onEmpty The function that is called if the value of this FlxBar reaches min + * @param onFilled The function that is called if the value of this FlxBar reaches max + * @param killOnEmpty If set it will call FlxBar.kill()if the value reaches min + */ + public function setCallbacks(onEmpty:Function, onFilled:Function, killOnEmpty:Bool=false):Void + { + if(Std.is(onEmpty, Function)) + { + emptyCallback=onEmpty; + } + + if(Std.is(onFilled, Function)) + { + filledCallback=onFilled; + } + + if(killOnEmpty) + { + emptyKill=true; + } + } + + /** + * If this FlxBar should be killed when its value reaches empty, set to true + */ + private function set_killOnEmpty(value:Bool):Void + { + emptyKill=value; + } + + public var killOnEmpty(get_killOnEmpty, set_killOnEmpty):Bool; + private function get_killOnEmpty():Bool + { + return emptyKill; + } + + /** + * Set the minimum and maximum allowed values for the FlxBar + * + * @param min The minimum value. I.e. for a progress bar this would be zero(nothing loaded yet) + * @param max The maximum value the bar can reach. I.e. for a progress bar this would typically be 100. + */ + public function setRange(min:Float, max:Float):Void + { + if(max<=min) + { + throw Dynamic("FlxBar:max cannot be less than or equal to min"); + return; + } + + this.min=min; + this.max=max; + + range=max - min; + + if(range<100) + { + pct=range / 100; + } + else + { + pct=range / 100; + } + + if(fillHorizontal) + { + pxPerPercent=barWidth / 100; + } + else + { + pxPerPercent=barHeight / 100; + } + + if(value) + { + if(value>max) + { + value=max; + } + + if(valuemax) + { + newValue=max; + } + + if(newValue0) + { + switch(fillDirection) + { + case FILL_LEFT_TO_RIGHT: + case FILL_TOP_TO_BOTTOM: + // Already handled above + break; + + case FILL_BOTTOM_TO_TOP: + filledBarRect.y=barHeight - filledBarRect.height; + filledBarPoint.y=barHeight - filledBarRect.height; + break; + + case FILL_RIGHT_TO_LEFT: + filledBarRect.x=barWidth - filledBarRect.width; + filledBarPoint.x=barWidth - filledBarRect.width; + break; + + case FILL_HORIZONTAL_INSIDE_OUT: + filledBarRect.x=Std.int((barWidth / 2)-(filledBarRect.width / 2)); + filledBarPoint.x=Std.int((barWidth / 2)-(filledBarRect.width / 2)); + break; + + case FILL_HORIZONTAL_OUTSIDE_IN: + filledBarRect.width=Std.int(100 - percent * pxPerPercent); + filledBarPoint.x=Std.int((barWidth - filledBarRect.width)/ 2); + break; + + case FILL_VERTICAL_INSIDE_OUT: + filledBarRect.y=Std.int((barHeight / 2)-(filledBarRect.height / 2)); + filledBarPoint.y=Std.int((barHeight / 2)-(filledBarRect.height / 2)); + break; + + case FILL_VERTICAL_OUTSIDE_IN: + filledBarRect.height=Std.int(100 - percent * pxPerPercent); + filledBarPoint.y=Std.int((barHeight- filledBarRect.height)/ 2); + break; + } + + canvas.copyPixels(filledBar, filledBarRect, filledBarPoint); + + } + + pixels=canvas; + } + + override public function update():Void + { + if(parent) + { + if(parent[parentVariable] !=value) + { + updateValueFromParent(); + updateBar(); + } + + if(fixedPosition==false) + { + x=parent.x + positionOffset.x; + y=parent.y + positionOffset.y; + } + } + } + + /** + * The percentage of how full the bar is(a value between 0 and 100) + */ + public var percent(get_percent, set_percent):Float; + private function get_percent():Float + { + if(value>max) + { + return 100; + } + + return Math.floor((value / range)* 100); + } + + /** + * Sets the percentage of how full the bar is(a value between 0 and 100). This changes FlxBar.currentValue + */ + private function set_percent(newPct:Float):Void + { + if(newPct>=0 && newPct<=100) + { + updateValue(pct * newPct); + + updateBar(); + } + } + + /** + * Set the current value of the bar(must be between min and max range) + */ + private function set_currentValue(newValue:Float):Void + { + updateValue(newValue); + + updateBar(); + } + + /** + * The current actual value of the bar + */ + public var currentValue(get_currentValue, set_currentValue):Float; + private function get_currentValue():Float + { + return value; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxBitmapFont.hx b/intra/source/org/flixel/plugin/photonstorm/FlxBitmapFont.hx new file mode 100644 index 0000000..900c338 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxBitmapFont.hx @@ -0,0 +1,503 @@ +/** + * FlxBitmapFont + * -- Part of the Flixel Power Tools set + * + * v1.4 Changed width/height to characterWidth/Height to avoid confusion and added setFixedWidth + * v1.3 Exposed character width / height values + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - June 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; + +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +class FlxBitmapFont extends FlxSprite +{ + /** + * Alignment of the text when multiLine=true or a fixedWidth is set. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + */ + public var align:String="left"; + + /** + * If set to true all carriage-returns in text will form new lines(see align). If false the font will only contain one single line of text(the default) + */ + public var multiLine:Bool=false; + + /** + * Automatically convert any text to upper case. Lots of old bitmap fonts only contain upper-case characters, so the default is true. + */ + public var autoUpperCase:Bool=true; + + /** + * Adds horizontal spacing between each character of the font, in pixels. Default is 0. + */ + public var customSpacingX:Int=0; + + /** + * Adds vertical spacing between each line of multi-line text, set in pixels. Default is 0. + */ + public var customSpacingY:Int=0; + + private var _text:String; + + /** + * Align each line of multi-line text to the left. + */ + public static inline var ALIGN_LEFT:String="left"; + + /** + * Align each line of multi-line text to the right. + */ + public static inline var ALIGN_RIGHT:String="right"; + + /** + * Align each line of multi-line text in the center. + */ + public static inline var ALIGN_CENTER:String="center"; + + /** + * Text Set 1=!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + */ + public static inline var TEXT_SET1:String=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; + + /** + * Text Set 2=!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET2:String=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 3=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + */ + public static inline var TEXT_SET3:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "; + + /** + * Text Set 4=ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 + */ + public static inline var TEXT_SET4:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789"; + + /** + * Text Set 5=ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/()'!?-*:0123456789 + */ + public static inline var TEXT_SET5:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/()'!?-*:0123456789"; + + /** + * Text Set 6=ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' + */ + public static inline var TEXT_SET6:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' "; + + /** + * Text Set 7=AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39 + */ + public static inline var TEXT_SET7:String="AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39"; + + /** + * Text Set 8=0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET8:String="0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 9=ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?! + */ + public static inline var TEXT_SET9:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?!"; + + /** + * Text Set 10=ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + public static inline var TEXT_SET10:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Text Set 11=ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789 + */ + public static inline var TEXT_SET11:String="ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789"; + + /** + * Internval values. All set in the constructor. They should not be changed after that point. + */ + private var fontSet:BitmapData; + private var offsetX:Int; + private var offsetY:Int; + public var characterWidth:Int; + public var characterHeight:Int; + private var characterSpacingX:Int; + private var characterSpacingY:Int; + private var characterPerRow:Int; + private var grabData:Array + private var fixedWidth:Int=0; + public var drop_shadow:Bool=false; + /** + * Loads 'font' and prepares it for use by future calls to .text + * + * @param font The font set graphic class(as defined by your embed) + * @param characterWidth The width of each character in the font set. + * @param characterHeight The height of each character in the font set. + * @param chars The characters used in the font set, in display order. You can use the TEXT_SET consts for common font set arrangements. + * @param charsPerRow The number of characters per row in the font set. + * @param xSpacing If the characters in the font set have horizontal spacing between them set the required amount here. + * @param ySpacing If the characters in the font set have vertical spacing between them set the required amount here + * @param xOffset If the font set doesn't start at the top left of the given image, specify the X coordinate offset here. + * @param yOffset If the font set doesn't start at the top left of the given image, specify the Y coordinate offset here. + */ + public function new(font:Class, characterWidth:Int, characterHeight:Int, chars:String, charsPerRow:Int, xSpacing:Int=0, ySpacing:Int=0, xOffset:Int=0, yOffset:Int=0):Void + { + // Take a copy of the font for Internal use + fontSet=(new font).bitmapData; + + this.characterWidth=characterWidth; + this.characterHeight=characterHeight; + characterSpacingX=xSpacing; + characterSpacingY=ySpacing; + characterPerRow=charsPerRow; + offsetX=xOffset; + offsetY=yOffset; + + grabData=new Array(); + + // Now generate our rects for faster copyPixels later on + var currentX:Int=offsetX; + var currentY:Int=offsetY; + var r:Int=0; + + for(c in 0...chars.length) + { + // The rect is hooked to the ASCII value of the character + grabData[chars.charCodeAt(c)]=new Rectangle(currentX, currentY, characterWidth, characterHeight); + + r++; + + if(r==characterPerRow) + { + r=0; + currentX=offsetX; + currentY +=characterHeight + characterSpacingY; + } + else + { + currentX +=characterWidth + characterSpacingX; + } + } + } + + + override public function draw():Void + { + + if(drop_shadow==true){ + var old:Int=color; + + y++; + color=0x000000; + super.draw(); + color=old; + y--; + } + + super.draw(); + + } + /** + * Set this value to update the text in this sprite. Carriage returns are automatically stripped out if multiLine is false. Text is converted to upper case if autoUpperCase is true. + * + * @return void + */ + private function set_text(content:String):Void + { + var newText:String; + + if(autoUpperCase) + { + newText=content.toUpperCase(); + } + else + { + newText=content; + } + + // Smart update:Only change the bitmap data if the string has changed + if(newText !=_text) + { + _text=newText; + + removeUnsupportedCharacters(multiLine); + + buildBitmapFontText(); + } + } + + /** + * If you need this FlxSprite to have a fixed width and custom alignment you can set the width here.
+ * If text is wider than the width specified it will be cropped off. + * + * @param width Width in pixels of this FlxBitmapFont. Set to zero to disable and re-enable automatic resizing. + * @param lineAlignment Align the text within this width. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + */ + public function setFixedWidth(width:Int, lineAlignment:String="left"):Void + { + fixedWidth=width; + align=lineAlignment; + } + + public var text(get_text, set_text):String; + private function get_text():String + { + return _text; + } + + /** + * A helper function that quickly sets lots of variables at once, and then updates the text. + * + * @param content The text of this sprite + * @param multiLines Set to true if you want to support carriage-returns in the text and create a multi-line sprite instead of a single line(Std.is(default, false)). + * @param characterSpacing To add horizontal spacing between each character specify the amount in pixels(default 0). + * @param lineSpacing To add vertical spacing between each line of text, set the amount in pixels(default 0). + * @param lineAlignment Align each line of multi-line text. Set to FlxBitmapFont.ALIGN_LEFT(default), FlxBitmapFont.ALIGN_RIGHT or FlxBitmapFont.ALIGN_CENTER. + * @param allowLowerCase Lots of bitmap font sets only include upper-case characters, if yours needs to support lower case then set this to true. + */ + public function setText(content:String, multiLines:Bool=false, characterSpacing:Int=0, lineSpacing:Int=0, lineAlignment:String="left", allowLowerCase:Bool=false):Void + { + customSpacingX=characterSpacing; + customSpacingY=lineSpacing; + align=lineAlignment; + multiLine=multiLines; + + if(allowLowerCase) + { + autoUpperCase=false; + } + else + { + autoUpperCase=true; + } + + if(content.length>0) + { + text=content; + } + } + + /** + * Updates the BitmapData of the Sprite with the text + * + * @return void + */ + private function buildBitmapFontText():Void + { + var temp:BitmapData; + var cx:Int=0; + var cy:Int=0; + + if(multiLine) + { + var lines:Array=_text.split("\n"); + + if(fixedWidth>0) + { + temp=new BitmapData(fixedWidth,(lines.length *(characterHeight + customSpacingY))- customSpacingY, true, 0xf); + } + else + { + temp=new BitmapData(getLongestLine()*(characterWidth + customSpacingX),(lines.length *(characterHeight + customSpacingY))- customSpacingY, true, 0xf); + } + + // Loop through each line of text + for(i in 0...lines.length) + { + // This line of text is held in lines[i] - need to work out the alignment + switch(align) + { + case ALIGN_LEFT: + cx=0; + break; + + case ALIGN_RIGHT: + cx=temp.width -(lines[i].length *(characterWidth + customSpacingX)); + break; + + case ALIGN_CENTER: + cx=(temp.width / 2)-((lines[i].length *(characterWidth + customSpacingX))/ 2); + cx +=customSpacingX / 2; + break; + } + + // Sanity checks + if(cx<0) + { + cx=0; + } + + pasteLine(temp, lines[i], cx, cy, customSpacingX); + + cy +=characterHeight + customSpacingY; + } + } + else + { + if(fixedWidth>0) + { + temp=new BitmapData(fixedWidth, characterHeight, true, 0xf); + } + else + { + temp=new BitmapData(_text.length *(characterWidth + customSpacingX), characterHeight, true, 0xf); + } + + switch(align) + { + case ALIGN_LEFT: + cx=0; + break; + + case ALIGN_RIGHT: + cx=temp.width -(_text.length *(characterWidth + customSpacingX)); + break; + + case ALIGN_CENTER: + cx=(temp.width / 2)-((_text.length *(characterWidth + customSpacingX))/ 2); + cx +=customSpacingX / 2; + break; + } + + pasteLine(temp, _text, cx, 0, customSpacingX); + } + + pixels=temp; + } + + /** + * Returns a single character from the font set as an FlxSprite. + * + * @param char The character you wish to have returned. + * + * @return AnFlxSpritecontaining a single character from the font set. + */ + public function getCharacter(char:String):FlxSprite + { + var output:FlxSprite=new FlxSprite(); + + var temp:BitmapData=new BitmapData(characterWidth, characterHeight, true, 0xf); + + if(grabData[char.charCodeAt(0)] is Rectangle && char.charCodeAt(0)!=32) + { + temp.copyPixels(fontSet, grabData[char.charCodeAt(0)], new Point(0, 0)); + } + + output.pixels=temp; + + return output; + } + + /** + * Returns a single character from the font set as bitmapData + * + * @param char The character you wish to have returned. + * + * @return bitmapDatacontaining a single character from the font set. + */ + public function getCharacterAsBitmapData(char:String):BitmapData + { + var temp:BitmapData=new BitmapData(characterWidth, characterHeight, true, 0xf); + + //if(grabData[char.charCodeAt(0)] is Rectangle && char.charCodeAt(0)!=32) + if(grabData[char.charCodeAt(0)] is Rectangle) + { + temp.copyPixels(fontSet, grabData[char.charCodeAt(0)], new Point(0, 0)); + } + + return temp; + } + + /** + * Internal function that takes a single line of text(2nd parameter)and pastes it Into the BitmapData at the given coordinates. + * Used by getLine and getMultiLine + * + * @param output The BitmapData that the text will be drawn onto + * @param line The single line of text to paste + * @param x The x coordinate + * @param y + * @param customSpacingX + */ + private function pasteLine(output:BitmapData, line:String, x:Int=0, y:Int=0, customSpacingX:Int=0):Void + { + for(c in 0...line.length) + { + // If it's a space then there is no point copying, so leave a blank space + if(line.charAt(c)==" ") + { + x +=characterWidth + customSpacingX; + } + else + { + // If the character doesn't exist in the font then we don't want a blank space, we just want to skip it + if(grabData[line.charCodeAt(c)] is Rectangle) + { + output.copyPixels(fontSet, grabData[line.charCodeAt(c)], new Point(x, y)); + + x +=characterWidth + customSpacingX; + + if(x>output.width) + { + break; + } + } + } + } + } + + /** + * Works out the longest line of text in _text and returns its length + * + * @return A value + */ + private function getLongestLine():Int + { + var longestLine:Int=0; + + if(_text.length>0) + { + var lines:Array=_text.split("\n"); + + for(i in 0...lines.length) + { + if(lines[i].length>longestLine) + { + longestLine=lines[i].length; + } + } + } + + return longestLine; + } + + /** + * Internal helper function that removes all unsupported characters from the _text String, leaving only characters contained in the font set. + * + * @param stripCR Should it strip carriage returns as well?(default=true) + * + * @return A clean version of the string + */ + private function removeUnsupportedCharacters(stripCR:Bool=true):String + { + var newString:String=""; + for(c in 0..._text.length) + { + if(grabData[_text.charCodeAt(c)] is Rectangle || _text.charCodeAt(c)==32 ||(stripCR==false && _text.charAt(c)=="\n")) + { + newString=newString.concat(_text.charAt(c)); + } else if(_text.charAt(c)!="\r" && _text.charAt(c)!="\n" && _text.charAt(c)!="\t"){ + //trace(_text); + trace("Unsupported character:" + _text.charAt(c)); + } + } + + return newString; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxButtonPlus.hx b/intra/source/org/flixel/plugin/photonstorm/FlxButtonPlus.hx new file mode 100644 index 0000000..d9d55e8 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxButtonPlus.hx @@ -0,0 +1,500 @@ +/** + * FlxButtonPlus + * -- Part of the Flixel Power Tools set + * + * v1.5 Added setOnClickCallback + * v1.4 Added scrollFactor to button and swapped to using mouseInFlxRect so buttons in scrolling worlds work + * v1.3 Updated gradient colour values to include alpha + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.5 - August 3rd 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm; + +import flash.events.MouseEvent; + +import org.flixel.*; + +/** + * A simple button class that calls a function when clicked by the mouse. + */ +class FlxButtonPlus extends FlxGroup +{ + static public var NORMAL:Int=0; + static public var HIGHLIGHT:Int=1; + static public var PRESSED:Int=2; + + /** + * Set this to true if you want this button to function even while the game is paused. + */ + public var pauseProof:Bool; + /** + * Shows the current state of the button. + */ + private var _status:Int; + /** + * This function is called when the button is clicked. + */ + private var _onClick:Function; + /** + * Tracks whether or not the button is currently pressed. + */ + private var _pressed:Bool; + /** + * Whether or not the button has initialized itself yet. + */ + private var _initialized:Bool; + + + + // Flixel Power Tools Modification from here down + + public var buttonNormal:FlxExtendedSprite; + public var buttonHighlight:FlxExtendedSprite; + + public var textNormal:FlxText; + public var textHighlight:FlxText; + + /** + * The parameters passed to the _onClick function when the button is clicked + */ + private var onClickParams:Array; + + /** + * This function is called when the button is hovered over + */ + private var enterCallback:Function; + + /** + * The parameters passed to the enterCallback function when the button is hovered over + */ + private var enterCallbackParams:Array; + + /** + * This function is called when the mouse leaves a hovered button(but didn't click) + */ + private var leaveCallback:Function; + + /** + * The parameters passed to the leaveCallback function when the hovered button is left + */ + private var leaveCallbackParams:Array; + + /** + * The 1px thick border color that is drawn around this button + */ + public var borderColor:Int=0xffffffff; + + /** + * The color gradient of the button in its in-active(not hovered over)state + */ + public var offColor:Array=[0xff008000, 0xff00FF00]; + + /** + * The color gradient of the button in its hovered state + */ + public var onColor:Array=[0xff800000, 0xffff0000]; + + private var _x:Int; + private var _y:Int; + public var width:Int; + public var height:Int; + + /** + * Creates a newFlxButtonobject with a gray background + * and a callback function on the UI thread. + * + * @param X The X position of the button. + * @param Y The Y position of the button. + * @param Callback The function to call whenever the button is clicked. + * @param Params An optional array of parameters that will be passed to the Callback function + * @param Label Text to display on the button + * @param Width The width of the button. + * @param Height The height of the button. + */ + public function new(X:Int, Y:Int, Callback:Function, Params:Array=null, Label:String=null, Width:Int=100, Height:Int=20):Void + { + super(4); + + _x=X; + _y=Y; + width=Width; + height=Height; + _onClick=Callback; + + buttonNormal=new FlxExtendedSprite(X, Y); + buttonNormal.makeGraphic(Width, Height, borderColor); + buttonNormal.stamp(FlxGradient.createGradientFlxSprite(Width - 2, Height - 2, offColor), 1, 1); + buttonNormal.solid=false; + buttonNormal.scrollFactor.x=0; + buttonNormal.scrollFactor.y=0; + + buttonHighlight=new FlxExtendedSprite(X, Y); + buttonHighlight.makeGraphic(Width, Height, borderColor); + buttonHighlight.stamp(FlxGradient.createGradientFlxSprite(Width - 2, Height - 2, onColor), 1, 1); + buttonHighlight.solid=false; + buttonHighlight.visible=false; + buttonHighlight.scrollFactor.x=0; + buttonHighlight.scrollFactor.y=0; + + + add(buttonNormal); + add(buttonHighlight); + + if(Label !=null) + { + textNormal=new FlxText(X, Y + 3, Width, Label); + textNormal.setFormat(null, 8, 0xffffffff, "center", 0xff000000); + + textHighlight=new FlxText(X, Y + 3, Width, Label); + textHighlight.setFormat(null, 8, 0xffffffff, "center", 0xff000000); + + add(textNormal); + add(textHighlight); + } + + _status=NORMAL; + _pressed=false; + _initialized=false; + pauseProof=false; + + if(Params) + { + onClickParams=Params; + } + } + + public var x(null, set_x):Int; + private function set_x(newX:Int):Void + { + _x=newX; + + buttonNormal.x=_x; + buttonHighlight.x=_x; + + if(textNormal) + { + textNormal.x=_x; + textHighlight.x=_x; + } + } + + public function get x():Int + { + return _x; + } + + public var y(null, set_y):Int; + private function set_y(newY:Int):Void + { + _y=newY; + + buttonNormal.y=_y; + buttonHighlight.y=_y; + + if(textNormal) + { + textNormal.y=_y; + textHighlight.y=_y; + } + } + + public function get y():Int + { + return _y; + } + + //public function set scrollFactor(value:Float):Void + //{ + //buttonNormal; + //buttonHighlight; + //textNormal; + //textHighlight; + //} + + override public function preUpdate():Void + { + super.preUpdate(); + + if(!_initialized) + { + if(FlxG.stage !=null) + { + FlxG.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + _initialized=true; + } + } + } + + /** + * If you wish to replace the two buttons(normal and hovered-over)with FlxSprites, then pass them here.
+ * Note:The pixel data is extract from the passed FlxSprites and assigned locally, it doesn't actually use the sprites
+ * or keep a reference to them. + * + * @param normal The FlxSprite to use when the button is in-active(not hovered over) + * @param highlight The FlxSprite to use when the button is hovered-over by the mouse + */ + public function loadGraphic(normal:FlxSprite, highlight:FlxSprite):Void + { + buttonNormal.pixels=normal.pixels; + buttonHighlight.pixels=highlight.pixels; + + width=buttonNormal.width; + height=buttonNormal.height; + + if(_pressed) + { + buttonNormal.visible=false; + } + else + { + buttonHighlight.visible=false; + } + } + + /** + * Called by the game loop automatically, handles mouseover and click detection. + */ + override public function update():Void + { + updateButton();//Basic button logic + } + + /** + * Basic button update logic + */ + private function updateButton():Void + { + var prevStatus:Int=_status; + + if(FlxG.mouse.visible) + { + if(buttonNormal.cameras==null) + { + buttonNormal.cameras=FlxG.cameras; + } + + var c:FlxCamera; + var i:Int=0; + var l:Int=buttonNormal.cameras.length; + var offAll:Bool=true; + + while(iFlxU.openURL()). + */ + private function onMouseUp(event:MouseEvent):Void + { + if(exists && visible && active &&(_status==PRESSED)&&(_onClick !=null)&&(pauseProof || !FlxG.paused)) + { + _onClick.apply(null, onClickParams); + } + } + + /** + * If you want to change the color of this button in its in-active(not hovered over)state, then pass a new array of color values + * + * @param colors + */ + public function updateInactiveButtonColors(colors:Array):Void + { + offColor=colors; + + buttonNormal.stamp(FlxGradient.createGradientFlxSprite(width - 2, height - 2, offColor), 1, 1); + } + + /** + * If you want to change the color of this button in its active(hovered over)state, then pass a new array of color values + * + * @param colors + */ + public function updateActiveButtonColors(colors:Array):Void + { + onColor=colors; + + buttonHighlight.stamp(FlxGradient.createGradientFlxSprite(width - 2, height - 2, onColor), 1, 1); + } + + /** + * If this button has text, set this to change the value + */ + public var text(null, set_text):String; + private function set_text(value:String):Void + { + if(textNormal && textNormal.text !=value) + { + textNormal.text=value; + textHighlight.text=value; + } + } + + /** + * Center this button(on the X axis)Uses FlxG.width / 2 - button width / 2 to achieve this.
+ * Doesn't take Into consideration scrolling + */ + public function screenCenter():Void + { + buttonNormal.x=(FlxG.width / 2)-(width / 2); + buttonHighlight.x=(FlxG.width / 2)-(width / 2); + + if(textNormal) + { + textNormal.x=buttonNormal.x; + textHighlight.x=buttonHighlight.x; + } + } + + /** + * Sets a callback function for when this button is rolled-over with the mouse + * + * @param callback The function to call, will be called once when the mouse enters + * @param params An optional array of parameters to pass to the function + */ + public function setMouseOverCallback(callback:Function, params:Array=null):Void + { + enterCallback=callback; + + enterCallbackParams=params; + } + + /** + * Sets a callback function for when the mouse rolls-out of this button + * + * @param callback The function to call, will be called once when the mouse leaves the button + * @param params An optional array of parameters to pass to the function + */ + public function setMouseOutCallback(callback:Function, params:Array=null):Void + { + leaveCallback=callback; + + leaveCallbackParams=params; + } + + /** + * Sets a callback function for when the mouse clicks on this button + * + * @param callback The function to call whenever the button is clicked. + * @param params An optional array of parameters that will be passed to the Callback function + */ + public function setOnClickCallback(callback:Function, params:Array=null):Void + { + _onClick=callback; + + if(params) + { + onClickParams=params; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxCollision.hx b/intra/source/org/flixel/plugin/photonstorm/FlxCollision.hx new file mode 100644 index 0000000..f0dfae6 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxCollision.hx @@ -0,0 +1,210 @@ +/** + * FlxCollision + * -- Part of the Flixel Power Tools set + * + * v1.6 Fixed bug in pixelPerfectCheck that stopped non-square rotated objects from colliding properly(thanks to joon on the flixel forums for spotting) + * v1.5 Added createCameraWall + * v1.4 Added pixelPerfectPointCheck() + * v1.3 Update fixes bug where it wouldn't accurately perform collision on AutoBuffered rotated sprites, or sprites with offsets + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - October 8th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.ColorTransform; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.display.BlendMode; + +import org.flixel.*; + +class FlxCollision +{ + public static var debug:BitmapData=new BitmapData(1, 1, false); + + public static var CAMERA_WALL_OUTSIDE:Int=0; + public static var CAMERA_WALL_INSIDE:Int=1; + + public function new() + { + } + + /** + * A Pixel Perfect Collision check between two FlxSprites. + * It will do a bounds check first, and if that passes it will run a pixel perfect match on the Intersecting area. + * Works with rotated, scaled and animated sprites. + * + * @param contact The first FlxSprite to test against + * @param target The second FlxSprite to test again, sprite order is irrelevant + * @param alphaTolerance The tolerance value above which alpha pixels are included. Default to 255(must be fully opaque for collision). + * @param camera If the collision is taking place in a camera other than FlxG.camera(the default/current)then pass it here + * + * @return Boolean True if the sprites collide, false if not + */ + public static function pixelPerfectCheck(contact:FlxSprite, target:FlxSprite, alphaTolerance:Int=255, camera:FlxCamera=null):Bool + { + var pointA:Point=new Point; + var pointB:Point=new Point; + + if(camera) + { + pointA.x=contact.x - Std.int(camera.scroll.x * contact.scrollFactor.x)- contact.offset.x; + pointA.y=contact.y - Std.int(camera.scroll.y * contact.scrollFactor.y)- contact.offset.y; + + pointB.x=target.x - Std.int(camera.scroll.x * target.scrollFactor.x)- target.offset.x; + pointB.y=target.y - Std.int(camera.scroll.y * target.scrollFactor.y)- target.offset.y; + } + else + { + pointA.x=contact.x - Std.int(FlxG.camera.scroll.x * contact.scrollFactor.x)- contact.offset.x; + pointA.y=contact.y - Std.int(FlxG.camera.scroll.y * contact.scrollFactor.y)- contact.offset.y; + + pointB.x=target.x - Std.int(FlxG.camera.scroll.x * target.scrollFactor.x)- target.offset.x; + pointB.y=target.y - Std.int(FlxG.camera.scroll.y * target.scrollFactor.y)- target.offset.y; + } + + var boundsA:Rectangle=new Rectangle(pointA.x, pointA.y, contact.framePixels.width, contact.framePixels.height); + var boundsB:Rectangle=new Rectangle(pointB.x, pointB.y, target.framePixels.width, target.framePixels.height); + + var Intersect:Rectangle=boundsA.intersection(boundsB); + + if(intersect.isEmpty()|| Intersect.width==0 || Intersect.height==0) + { + return false; + } + + // Normalise the values or it'll break the BitmapData creation below + intersect.x=Math.floor(intersect.x); + intersect.y=Math.floor(intersect.y); + intersect.width=Math.ceil(intersect.width); + intersect.height=Math.ceil(intersect.height); + + if(intersect.isEmpty()) + { + return false; + } + + // Thanks to Chris Underwood for helping with the translate logic:) + + var matrixA:Matrix=new Matrix; + matrixA.translate(-(intersect.x - boundsA.x), -(intersect.y - boundsA.y)); + + var matrixB:Matrix=new Matrix; + matrixB.translate(-(intersect.x - boundsB.x), -(intersect.y - boundsB.y)); + + var testA:BitmapData=contact.framePixels; + var testB:BitmapData=target.framePixels; + var overlapArea:BitmapData=new BitmapData(intersect.width, Intersect.height, false); + + overlapArea.draw(testA, matrixA, new ColorTransform(1, 1, 1, 1, 255, -255, -255, alphaTolerance), BlendMode.NORMAL); + overlapArea.draw(testB, matrixB, new ColorTransform(1, 1, 1, 1, 255, 255, 255, alphaTolerance), BlendMode.DIFFERENCE); + + // Developers:If you'd like to see how this works, display it in your game somewhere. Or you can comment it out to save a tiny bit of performance + debug=overlapArea; + + var overlap:Rectangle=overlapArea.getColorBoundsRect(0xffffffff, 0xff00ffff); + overlap.offset(intersect.x, Intersect.y); + + if(overlap.isEmpty()) + { + return false; + } + else + { + return true; + } + } + + /** + * A Pixel Perfect Collision check between a given x/y coordinate and an FlxSprite
+ * + * @param pointX The x coordinate of the point given in local space(relative to the FlxSprite, not game world coordinates) + * @param pointY The y coordinate of the point given in local space(relative to the FlxSprite, not game world coordinates) + * @param target The FlxSprite to check the point against + * @param alphaTolerance The alpha tolerance level above which pixels are counted as colliding. Default to 255(must be fully transparent for collision) + * + * @return Boolean True if the x/y point collides with the FlxSprite, false if not + */ + public static function pixelPerfectPointCheck(pointX:Int, pointY:Int, target:FlxSprite, alphaTolerance:Int=255):Bool + { + // Intersect check + if(FlxMath.pointInCoordinates(pointX, pointY, target.x, target.y, target.framePixels.width, target.framePixels.height)==false) + { + return false; + } + + // How deep is pointX/Y within the rect? + var test:BitmapData=target.framePixels; + + if(FlxColor.getAlpha(test.getPixel32(pointX - target.x, pointY - target.y))>=alphaTolerance) + { + return true; + } + else + { + return false; + } + } + + /** + * Creates a "wall" around the given camera which can be used for FlxSprite collision + * + * @param camera The FlxCamera to use for the wall bounds(can be FlxG.camera for the current one) + * @param placement CAMERA_WALL_OUTSIDE or CAMERA_WALL_INSIDE + * @param thickness The thickness of the wall in pixels + * @param adjustWorldBounds Adjust the FlxG.worldBounds based on the wall(true)or leave alone(false) + * + * @return FlxGroup The 4 FlxTileblocks that are created are placed Into this FlxGroup which should be added to your State + */ + public static function createCameraWall(camera:FlxCamera, placement:Int, thickness:Int, adjustWorldBounds:Bool=false):FlxGroup + { + var left:FlxTileblock; + var right:FlxTileblock; + var top:FlxTileblock; + var bottom:FlxTileblock; + + switch(placement) + { + case CAMERA_WALL_OUTSIDE: + left=new FlxTileblock(camera.x - thickness, camera.y + thickness, thickness, camera.height -(thickness * 2)); + right=new FlxTileblock(camera.x + camera.width, camera.y + thickness, thickness, camera.height -(thickness * 2)); + top=new FlxTileblock(camera.x - thickness, camera.y - thickness, camera.width + thickness * 2, thickness); + bottom=new FlxTileblock(camera.x - thickness, camera.height, camera.width + thickness * 2, thickness); + + if(adjustWorldBounds) + { + FlxG.worldBounds=new FlxRect(camera.x - thickness, camera.y - thickness, camera.width + thickness * 2, camera.height + thickness * 2); + } + break; + + case CAMERA_WALL_INSIDE: + left=new FlxTileblock(camera.x, camera.y + thickness, thickness, camera.height -(thickness * 2)); + right=new FlxTileblock(camera.x + camera.width - thickness, camera.y + thickness, thickness, camera.height -(thickness * 2)); + top=new FlxTileblock(camera.x, camera.y, camera.width, thickness); + bottom=new FlxTileblock(camera.x, camera.height - thickness, camera.width, thickness); + + if(adjustWorldBounds) + { + FlxG.worldBounds=new FlxRect(camera.x, camera.y, camera.width, camera.height); + } + break; + } + + var result:FlxGroup=new FlxGroup(4); + + result.add(left); + result.add(right); + result.add(top); + result.add(bottom); + + return result; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxColor.hx b/intra/source/org/flixel/plugin/photonstorm/FlxColor.hx new file mode 100644 index 0000000..bb81f93 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxColor.hx @@ -0,0 +1,534 @@ +/** + * FlxColor + * -- Part of the Flixel Power Tools set + * + * v1.5 Added RGBtoWebString + * v1.4 getHSVColorWheel now supports an alpha value per color + * v1.3 Added getAlphaFloat + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.5 - August 4th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Depends upon FlxMath +*/ + +package org.flixel.plugin.photonstorm; + +import org.flixel.*; + +/** + *FlxColoris a set of fast color manipulation and color harmony methods.
+ * Can be used for creating gradient maps or general color translation / conversion. + */ +class FlxColor +{ + public function new() + { + } + + /** + * Get HSV color wheel values in an array which will be 360 elements in size + * + * @param alpha Alpha value for color of the color wheel, between 0(transparent)and 255(opaque) + * + * @return Array + */ + public static function getHSVColorWheel(alpha:Int=255):Array + { + var colors:Array=new Array(); + + for(c in 0...359) + { + colors[c]=HSVtoRGB(c, 1.0, 1.0, alpha); + } + + return colors; + } + + /** + * Returns a Complementary Color Harmony for the given color. + *

A complementary hue is one directly opposite the color given on the color wheel

+ *

Value returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * + * @return 0xAARRGGBB format color value + */ + public static function getComplementHarmony(color:Int):Int + { + var hsv:Dynamic=RGBtoHSV(color); + + var opposite:Int=FlxMath.wrapValue(hsv.hue, 180, 359); + + return HSVtoRGB(opposite, 1.0, 1.0); + } + + /** + * Returns an Analogous Color Harmony for the given color. + *

An Analogous harmony are hues adjacent to each other on the color wheel

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * @param threshold Control how adjacent the colors will be(default +- 30 degrees) + * + * @return Object containing 3 properties:color1(the original color), color2(the warmer analogous color)and color3(the colder analogous color) + */ + public static function getAnalogousHarmony(color:Int, threshold:Int=30):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + if(threshold>359 || threshold<0) + { + throw Dynamic("FlxColor Warning:Invalid threshold given to getAnalogousHarmony()"); + } + + var warmer:Int=FlxMath.wrapValue(hsv.hue, 359 - threshold, 359); + var colder:Int=FlxMath.wrapValue(hsv.hue, threshold, 359); + + return { color1:color, color2:HSVtoRGB(warmer, 1.0, 1.0), color3:HSVtoRGB(colder, 1.0, 1.0), hue1:hsv.hue, hue2:warmer, hue3:colder } + } + + /** + * Returns an Split Complement Color Harmony for the given color. + *

A Split Complement harmony are the two hues on either side of the color's Complement

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * @param threshold Control how adjacent the colors will be to the Complement(default +- 30 degrees) + * + * @return Object containing 3 properties:color1(the original color), color2(the warmer analogous color)and color3(the colder analogous color) + */ + public static function getSplitComplementHarmony(color:Int, threshold:Int=30):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + if(threshold>=359 || threshold<=0) + { + throw Dynamic("FlxColor Warning:Invalid threshold given to getSplitComplementHarmony()"); + } + + var opposite:Int=FlxMath.wrapValue(hsv.hue, 180, 359); + + var warmer:Int=FlxMath.wrapValue(hsv.hue, opposite - threshold, 359); + var colder:Int=FlxMath.wrapValue(hsv.hue, opposite + threshold, 359); + + FlxG.log("hue:" + hsv.hue + " opposite:" + opposite + " warmer:" + warmer + " colder:" + colder); + + //return { color1:color, color2:HSVtoRGB(warmer, 1.0, 1.0), color3:HSVtoRGB(colder, 1.0, 1.0), hue1:hsv.hue, hue2:warmer, hue3:colder } + + return { color1:color, color2:HSVtoRGB(warmer, hsv.saturation, hsv.value), color3:HSVtoRGB(colder, hsv.saturation, hsv.value), hue1:hsv.hue, hue2:warmer, hue3:colder } + } + + /** + * Returns a Triadic Color Harmony for the given color. + *

A Triadic harmony are 3 hues equidistant from each other on the color wheel

+ *

Values returned in 0xAARRGGBB format with Alpha set to 255.

+ * + * @param color The color to base the harmony on + * + * @return Object containing 3 properties:color1(the original color), color2 and color3(the equidistant colors) + */ + public static function getTriadicHarmony(color:Int):Dynamic + { + var hsv:Dynamic=RGBtoHSV(color); + + var triadic1:Int=FlxMath.wrapValue(hsv.hue, 120, 359); + var triadic2:Int=FlxMath.wrapValue(triadic1, 120, 359); + + return { color1:color, color2:HSVtoRGB(triadic1, 1.0, 1.0), color3:HSVtoRGB(triadic2, 1.0, 1.0)} + } + + /** + * Returns a String containing handy information about the given color including String hex value, + * RGB format information and HSL information. Each section starts on a newline, 3 lines in total. + * + * @param color A color value in the format 0xAARRGGBB + * + * @return String containing the 3 lines of information + */ + public static function getColorInfo(color:Int):String + { + var argb:Dynamic=getRGB(color); + var hsl:Dynamic=RGBtoHSV(color); + + // Hex format + var result:String=RGBtoHexString(color)+ "\n"; + + // RGB format + result=result.concat("Alpha:" + argb.alpha + " Red:" + argb.red + " Green:" + argb.green + " Blue:" + argb.blue)+ "\n"; + + // HSL info + result=result.concat("Hue:" + hsl.hue + " Saturation:" + hsl.saturation + " Lightnes:" + hsl.lightness); + + return result; + } + + /** + * Return a String representation of the color in the format 0xAARRGGBB + * + * @param color The color to get the String representation for + * + * @return A string of length 10 characters in the format 0xAARRGGBB + */ + public static function RGBtoHexString(color:Int):String + { + var argb:Dynamic=getRGB(color); + + return "0x" + colorToHexString(argb.alpha)+ colorToHexString(argb.red)+ colorToHexString(argb.green)+ colorToHexString(argb.blue); + } + + /** + * Return a String representation of the color in the format #RRGGBB + * + * @param color The color to get the String representation for + * + * @return A string of length 10 characters in the format 0xAARRGGBB + */ + public static function RGBtoWebString(color:Int):String + { + var argb:Dynamic=getRGB(color); + + return "#" + colorToHexString(argb.red)+ colorToHexString(argb.green)+ colorToHexString(argb.blue); + } + + /** + * Return a String containing a hex representation of the given color + * + * @param color The color channel to get the hex value for, must be a value between 0 and 255) + * + * @return A string of length 2 characters, i.e. 255=FF, 0=00 + */ + public static function colorToHexString(color:Int):String + { + var digits:String="0123456789ABCDEF"; + + var lsd:Float=color % 16; + var msd:Float=(color - lsd)/ 16; + + var hexified:String=digits.charAt(msd)+ digits.charAt(lsd); + + return hexified; + } + + /** + * Convert a HSV(hue, saturation, lightness)color space value to an RGB color + * + * @param h Hue degree, between 0 and 359 + * @param s Saturation, between 0.0(grey)and 1.0 + * @param v Value, between 0.0(black)and 1.0 + * @param alpha Alpha value to set per color(between 0 and 255) + * + * @return 32-bit ARGB color value(0xAARRGGBB) + */ + public static function HSVtoRGB(h:Float, s:Float, v:Float, alpha:Int=255):Int + { + var result:Int; + + if(s==0.0) + { + result=getColor32(alpha, v * 255, v * 255, v * 255); + } + else + { + h=h / 60.0; + var f:Float=h - Std.int(h); + var p:Float=v *(1.0 - s); + var q:Float=v *(1.0 - s * f); + var t:Float=v *(1.0 - s *(1.0 - f)); + + switch(int(h)) + { + case 0: + result=getColor32(alpha, v * 255, t * 255, p * 255); + break; + + case 1: + result=getColor32(alpha, q * 255, v * 255, p * 255); + break; + + case 2: + result=getColor32(alpha, p * 255, v * 255, t * 255); + break; + + case 3: + result=getColor32(alpha, p * 255, q * 255, v * 255); + break; + + case 4: + result=getColor32(alpha, t * 255, p * 255, v * 255); + break; + + case 5: + result=getColor32(alpha, v * 255, p * 255, q * 255); + break; + + default: + FlxG.log("FlxColor Dynamic:HSVtoRGB:Unknown color"); + } + } + + return result; + } + + /** + * Convert an RGB color value to an object containing the HSV color space values:Hue, Saturation and Lightness + * + * @param color In format 0xRRGGBB + * + * @return Object with the properties hue(from 0 to 360), saturation(from 0 to 1.0)and lightness(from 0 to 1.0, also available under .value) + */ + public static function RGBtoHSV(color:Int):Dynamic + { + var rgb:Dynamic=getRGB(color); + + var red:Float=rgb.red / 255; + var green:Float=rgb.green / 255; + var blue:Float=rgb.blue / 255; + + var min:Float=Math.min(red, green, blue); + var max:Float=Math.max(red, green, blue); + var delta:Float=max - min; + var lightness:Float=(max + min)/ 2; + var hue:Float; + var saturation:Float; + + // Grey color, no chroma + if(delta==0) + { + hue=0; + saturation=0; + } + else + { + if(lightness<0.5) + { + saturation=delta /(max + min); + } + else + { + saturation=delta /(2 - max - min); + } + + var delta_r:Float=(((max - red)/ 6)+(delta / 2))/ delta; + var delta_g:Float=(((max - green)/ 6)+(delta / 2))/ delta; + var delta_b:Float=(((max - blue)/ 6)+(delta / 2))/ delta; + + if(red==max) + { + hue=delta_b - delta_g; + } + else if(green==max) + { + hue=(1 / 3)+ delta_r - delta_b; + } + else if(blue==max) + { + hue=(2 / 3)+ delta_g - delta_r; + } + + if(hue<0) + { + hue +=1; + } + + if(hue>1) + { + hue -=1; + } + } + + // Keep the value with 0 to 359 + hue *=360; + hue=Math.round(hue); + + // Testing + //saturation *=100; + //lightness *=100; + + return { hue:hue, saturation:saturation, lightness:lightness, value:lightness }; + } + + + + + + + + + public static function InterpolateColor(color1:Int, color2:Int, steps:Int, currentStep:Int, alpha:Int=255):Int + { + var src1:Dynamic=getRGB(color1); + var src2:Dynamic=getRGB(color2); + + var r:Int=(((src2.red - src1.red)* currentStep)/ steps)+ src1.red; + var g:Int=(((src2.green - src1.green)* currentStep)/ steps)+ src1.green; + var b:Int=(((src2.blue - src1.blue)* currentStep)/ steps)+ src1.blue; + + return getColor32(alpha, r, g, b); + } + + public static function InterpolateColorWithRGB(color:Int, r2:Int, g2:Int, b2:Int, steps:Int, currentStep:Int):Int + { + var src:Dynamic=getRGB(color); + + var r:Int=(((r2 - src.red)* currentStep)/ steps)+ src.red; + var g:Int=(((g2 - src.green)* currentStep)/ steps)+ src.green; + var b:Int=(((b2 - src.blue)* currentStep)/ steps)+ src.blue; + + return getColor24(r, g, b); + } + + public static function InterpolateRGB(r1:Int, g1:Int, b1:Int, r2:Int, g2:Int, b2:Int, steps:Int, currentStep:Int):Int + { + var r:Int=(((r2 - r1)* currentStep)/ steps)+ r1; + var g:Int=(((g2 - g1)* currentStep)/ steps)+ g1; + var b:Int=(((b2 - b1)* currentStep)/ steps)+ b1; + + return getColor24(r, g, b); + } + + /** + * Returns a random color value between black and white + *

Set the min value to start each channel from the given offset.

+ *

Set the max value to restrict the maximum color used per channel

+ * + * @param min The lowest value to use for the color + * @param max The highest value to use for the color + * @param alpha The alpha value of the returning color(default 255=fully opaque) + * + * @return 32-bit color value with alpha + */ + public static function getRandomColor(min:Int=0, max:Int=255, alpha:Int=255):Int + { + // Sanity checks + if(max>255) + { + FlxG.log("FlxColor Warning:getRandomColor - max value too high"); + return getColor24(255, 255, 255); + } + + if(min>max) + { + FlxG.log("FlxColor Warning:getRandomColor - min value higher than max"); + return getColor24(255, 255, 255); + } + + var red:Int=min + Std.int(Math.random()*(max - min)); + var green:Int=min + Std.int(Math.random()*(max - min)); + var blue:Int=min + Std.int(Math.random()*(max - min)); + + return getColor32(alpha, red, green, blue); + } + + /** + * Given an alpha and 3 color values this will return an Integer representation of it + * + * @param alpha The Alpha value(between 0 and 255) + * @param red The Red channel value(between 0 and 255) + * @param green The Green channel value(between 0 and 255) + * @param blue The Blue channel value(between 0 and 255) + * + * @return A native color value Integer(format:0xAARRGGBB) + */ + public static function getColor32(alpha:Int, red:Int, green:Int, blue:Int):Int + { + return alpha<<24 | red<<16 | green<<8 | blue; + } + + /** + * Given 3 color values this will return an Integer representation of it + * + * @param red The Red channel value(between 0 and 255) + * @param green The Green channel value(between 0 and 255) + * @param blue The Blue channel value(between 0 and 255) + * + * @return A native color value Integer(format:0xRRGGBB) + */ + public static function getColor24(red:Int, green:Int, blue:Int):Int + { + return red<<16 | green<<8 | blue; + } + + /** + * Return the component parts of a color as an Dynamic with the properties alpha, red, green, blue + * + *

Alpha will only be set if it exist in the given color(0xAARRGGBB)

+ * + * @param color in RGB(0xRRGGBB)or ARGB format(0xAARRGGBB) + * + * @return Dynamic with properties:alpha, red, green, blue + */ + public static function getRGB(color:Int):Dynamic + { + var alpha:Int=color>>>24; + var red:Int=color>>16 & 0xFF; + var green:Int=color>>8 & 0xFF; + var blue:Int=color & 0xFF; + + return { alpha:alpha, red:red, green:green, blue:blue }; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Alpha component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Alpha component of the color, will be between 0 and 255(0 being no Alpha, 255 full Alpha) + */ + public static function getAlpha(color:Int):Int + { + return color>>>24; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Alpha component as a value between 0 and 1 + * + * @param color In the format 0xAARRGGBB + * + * @return The Alpha component of the color, will be between 0 and 1(0 being no Alpha(opaque), 1 full Alpha(transparent)) + */ + public static function getAlphaFloat(color:Int):Float + { + var f:Int=color>>>24; + + return f / 255; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Red component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Red component of the color, will be between 0 and 255(0 being no color, 255 full Red) + */ + public static function getRed(color:Int):Int + { + return color>>16 & 0xFF; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Green component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Green component of the color, will be between 0 and 255(0 being no color, 255 full Green) + */ + public static function getGreen(color:Int):Int + { + return color>>8 & 0xFF; + } + + /** + * Given a native color value(in the format 0xAARRGGBB)this will return the Blue component, as a value between 0 and 255 + * + * @param color In the format 0xAARRGGBB + * + * @return The Blue component of the color, will be between 0 and 255(0 being no color, 255 full Blue) + */ + public static function getBlue(color:Int):Int + { + return color & 0xFF; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxControl.hx b/intra/source/org/flixel/plugin/photonstorm/FlxControl.hx new file mode 100644 index 0000000..5180512 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxControl.hx @@ -0,0 +1,178 @@ +/** + * FlxControl + * -- Part of the Flixel Power Tools set + * + * v1.1 Fixed and added documentation + * v1.0 First release + * + * @version 1.1 - July 21st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.utils.Dictionary; +import org.flixel.*; + +class FlxControl extends FlxBasic +{ + // Quick references + public static var player1:FlxControlHandler; + public static var player2:FlxControlHandler; + public static var player3:FlxControlHandler; + public static var player4:FlxControlHandler; + + // Additional control handlers + private static var members:Dictionary=new Dictionary(true); + + public function new() + { + } + + /** + * Creates a new FlxControlHandler. You can have as many FlxControlHandlers as you like, but you usually only have one per player. The first handler you make + * will be assigned to the FlxControl.player1 var. The 2nd to FlxControl.player2 and so on for player3 and player4. Beyond this you need to keep a reference to the + * handler yourself. + * + * @param source The FlxSprite you want this class to control. It can only control one FlxSprite at once. + * @param movementType Set to either MOVEMENT_INSTANT or MOVEMENT_ACCELERATES + * @param stoppingType Set to STOPPING_INSTANT, STOPPING_DECELERATES or STOPPING_NEVER + * @param updateFacing If true it sets the FlxSprite.facing value to the direction pressed(default false) + * @param enableArrowKeys If true it will enable all arrow keys(default)- see setCursorControl for more fine-grained control + * + * @return The new FlxControlHandler + */ + public static function create(source:FlxSprite, movementType:Int, stoppingType:Int, player:Int=1, updateFacing:Bool=false, enableArrowKeys:Bool=true):FlxControlHandler + { + var result:FlxControlHandler; + + if(player==1) + { + player1=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player1]=player1; + result=player1; + } + else if(player==2) + { + player2=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player2]=player2; + result=player2; + } + else if(player==3) + { + player3=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player3]=player3; + result=player3; + } + else if(player==4) + { + player4=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[player4]=player4; + result=player4; + } + else + { + var newControlHandler:FlxControlHandler=new FlxControlHandler(source, movementType, stoppingType, updateFacing, enableArrowKeys); + members[newControlHandler]=newControlHandler; + result=newControlHandler; + } + + return result; + } + + /** + * Removes an FlxControlHandler + * + * @param source The FlxControlHandler to delete + * @return Boolean true if the FlxControlHandler was removed, otherwise false. + */ + public static function remove(source:FlxControlHandler):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FlxControlHandlers.
+ * This is called automatically if this plugin is ever destroyed. + */ + public static function clear():Void + { + for(var handler:FlxControlHandler in members) + { + delete members[handler]; + } + } + + /** + * Starts updating the given FlxControlHandler, enabling keyboard actions for it. If no FlxControlHandler is given it starts updating all FlxControlHandlers currently added.
+ * Updating is enabled by default, but this can be used to re-start it if you have stopped it via stop().
+ * + * @param source The FlxControlHandler to start updating on. If left as null it will start updating all handlers. + */ + public static function start(source:FlxControlHandler=null):Void + { + if(source) + { + members[source].enabled=true; + } + else + { + for(var handler:FlxControlHandler in members) + { + handler.enabled=true; + } + } + } + + /** + * Stops updating the given FlxControlHandler. If no FlxControlHandler is given it stops updating all FlxControlHandlers currently added.
+ * Updating is enabled by default, but this can be used to stop it, for example if you paused your game(see start()to restart it again).
+ * + * @param source The FlxControlHandler to stop updating. If left as null it will stop updating all handlers. + */ + public static function stop(source:FlxControlHandler=null):Void + { + if(source) + { + members[source].enabled=false; + } + else + { + for(var handler:FlxControlHandler in members) + { + handler.enabled=false; + } + } + } + + /** + * Runs update on all currently active FlxControlHandlers + */ + override public function draw():Void + { + for(var handler:FlxControlHandler in members) + { + if(handler.enabled==true) + { + handler.update(); + } + } + } + + /** + * Runs when this plugin is destroyed + */ + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxControlHandler.hx b/intra/source/org/flixel/plugin/photonstorm/FlxControlHandler.hx new file mode 100644 index 0000000..32dee47 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxControlHandler.hx @@ -0,0 +1,1423 @@ +/** + * FlxControlHandler + * -- Part of the Flixel Power Tools set + * + * v1.8 Added isPressedUp/Down/Left/Right handlers + * v1.7 Modified update function so gravity is applied constantly + * v1.6 Thrust and Reverse complete, final few rotation bugs solved. Sounds hooked in for fire, jump, walk and thrust + * v1.5 Full support for rotation with min/max angle limits + * v1.4 Fixed bug in runFire causing fireRate to be ignored + * v1.3 Major refactoring and lots of new enhancements + * v1.2 First real version deployed to dev + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.8 - August 16th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Rectangle; +import org.flixel.*; +import flash.utils.getTimer; + +/** + * Makes controlling an FlxSprite with the keyboard a LOT easier and quicker to set-up!
+ * Sometimes it's hard to know what values to set, especially if you want gravity, jumping, sliding, etc.
+ * This class helps sort that - and adds some cool extra functionality too:) + * + * TODO + * ---- + * Allow to bind Fire Button to FlxWeapon + * Allow to enable multiple key sets. So cursors and WASD together + * Hot Keys + * Binding of sound effects to keys(seperate from setSounds? as those are event based) + * If moving diagonally compensate speed parameter(times x,y velocities by 0.707 or cos/sin(45)) + * Specify animation frames to play based on velocity + * Variable gravity(based on height, the higher the stronger the effect) + */ +class FlxControlHandler +{ + // Used by the FlxControl plugin + public var enabled:Bool=false; + + private var entity:FlxSprite=null; + + private var bounds:Rectangle; + + private var up:Bool; + private var down:Bool; + private var left:Bool; + private var right:Bool; + private var fire:Bool; + private var altFire:Bool; + private var jump:Bool; + private var altJump:Bool; + private var xFacing:Bool; + private var yFacing:Bool; + private var rotateAntiClockwise:Bool; + private var rotateClockwise:Bool; + + private var upMoveSpeed:Int; + private var downMoveSpeed:Int; + private var leftMoveSpeed:Int; + private var rightMoveSpeed:Int; + private var thrustSpeed:Int; + private var reverseSpeed:Int; + + // Rotation + private var thrustEnabled:Bool; + private var reverseEnabled:Bool; + private var isRotating:Bool; + private var antiClockwiseRotationSpeed:Float; + private var clockwiseRotationSpeed:Float; + private var enforceAngleLimits:Bool; + private var minAngle:Int; + private var maxAngle:Int; + private var capAngularVelocity:Bool; + + private var xSpeedAdjust:Float=0; + private var ySpeedAdjust:Float=0; + + private var gravityX:Int=0; + private var gravityY:Int=0; + + private var fireRate:Int; // The ms delay between firing when the key is held down + private var nextFireTime:Int; // The Internal time when they can next fire + private var lastFiredTime:Int; // The Internal time of when when they last fired + private var fireKeyMode:Int; // The fire key mode + private var fireCallback:Function; // A function to call every time they fire + + private var jumpHeight:Int; // The pixel height amount they jump(drag and gravity also both influence this) + private var jumpRate:Int; // The ms delay between jumping when the key is held down + private var jumpKeyMode:Int; // The jump key mode + private var nextJumpTime:Int; // The Internal time when they can next jump + private var lastJumpTime:Int; // The Internal time of when when they last jumped + private var jumpFromFallTime:Int; // A short window of opportunity for them to jump having just fallen off the edge of a surface + private var extraSurfaceTime:Int; // Internal time of when they last collided with a valid jumpSurface + private var jumpSurface:Int; // The surfaces from FlxObject they can jump from(i.e. FlxObject.FLOOR) + private var jumpCallback:Function; // A function to call every time they jump + + private var movement:Int; + private var stopping:Int; + private var rotation:Int; + private var rotationStopping:Int; + private var capVelocity:Bool; + + private var hotkeys:Array; // TODO + + private var upKey:String; + private var downKey:String; + private var leftKey:String; + private var rightKey:String; + private var fireKey:String; + private var altFireKey:String; // TODO + private var jumpKey:String; + private var altJumpKey:String; // TODO + private var antiClockwiseKey:String; + private var clockwiseKey:String; + private var thrustKey:String; + private var reverseKey:String; + + // Sounds + private var jumpSound:FlxSound=null; + private var fireSound:FlxSound=null; + private var walkSound:FlxSound=null; + private var thrustSound:FlxSound=null; + + // Helpers + public var isPressedUp:Bool=false; + public var isPressedDown:Bool=false; + public var isPressedLeft:Bool=false; + public var isPressedRight:Bool=false; + + /** + * The "Instant" Movement Type means the sprite will move at maximum speed instantly, and will not "accelerate"(or speed-up)before reaching that speed. + */ + public static inline var MOVEMENT_INSTANT:Int=0; + /** + * The "Accelerates" Movement Type means the sprite will accelerate until it reaches maximum speed. + */ + public static inline var MOVEMENT_ACCELERATES:Int=1; + /** + * The "Instant" Stopping Type means the sprite will stop immediately when no direction keys are being pressed, there will be no deceleration. + */ + public static inline var STOPPING_INSTANT:Int=0; + /** + * The "Decelerates" Stopping Type means the sprite will start decelerating when no direction keys are being pressed. Deceleration continues until the speed reaches zero. + */ + public static inline var STOPPING_DECELERATES:Int=1; + /** + * The "Never" Stopping Type means the sprite will never decelerate, any speed built up will be carried on and never reduce. + */ + public static inline var STOPPING_NEVER:Int=2; + + /** + * The "Instant" Movement Type means the sprite will rotate at maximum speed instantly, and will not "accelerate"(or speed-up)before reaching that speed. + */ + public static inline var ROTATION_INSTANT:Int=0; + /** + * The "Accelerates" Rotaton Type means the sprite will accelerate until it reaches maximum rotation speed. + */ + public static inline var ROTATION_ACCELERATES:Int=1; + /** + * The "Instant" Stopping Type means the sprite will stop rotating immediately when no rotation keys are being pressed, there will be no deceleration. + */ + public static inline var ROTATION_STOPPING_INSTANT:Int=0; + /** + * The "Decelerates" Stopping Type means the sprite will start decelerating when no rotation keys are being pressed. Deceleration continues until rotation speed reaches zero. + */ + public static inline var ROTATION_STOPPING_DECELERATES:Int=1; + /** + * The "Never" Stopping Type means the sprite will never decelerate, any speed built up will be carried on and never reduce. + */ + public static inline var ROTATION_STOPPING_NEVER:Int=2; + + /** + * This keymode fires for as long as the key is held down + */ + public static inline var KEYMODE_PRESSED:Int=0; + + /** + * This keyboard fires when the key has just been pressed down, and not again until it is released and re-pressed + */ + public static inline var KEYMODE_JUST_DOWN:Int=1; + + /** + * This keyboard fires only when the key has been pressed and then released again + */ + public static inline var KEYMODE_RELEASED:Int=2; + + /** + * Sets the FlxSprite to be controlled by this class, and defines the initial movement and stopping types.
+ * After creating an instance of this class you should call setMovementSpeed, and one of the enableXControl functions if you need more than basic cursors. + * + * @param source The FlxSprite you want this class to control. It can only control one FlxSprite at once. + * @param movementType Set to either MOVEMENT_INSTANT or MOVEMENT_ACCELERATES + * @param stoppingType Set to STOPPING_INSTANT, STOPPING_DECELERATES or STOPPING_NEVER + * @param updateFacing If true it sets the FlxSprite.facing value to the direction pressed(default false) + * @param enableArrowKeys If true it will enable all arrow keys(default)- see setCursorControl for more fine-grained control + * + * @see setMovementSpeed + */ + public function new(source:FlxSprite, movementType:Int, stoppingType:Int, updateFacing:Bool=false, enableArrowKeys:Bool=true) + { + entity=source; + + movement=movementType; + stopping=stoppingType; + + xFacing=updateFacing; + yFacing=updateFacing; + + up=false; + down=false; + left=false; + right=false; + + thrustEnabled=false; + isRotating=false; + enforceAngleLimits=false; + rotation=ROTATION_INSTANT; + rotationStopping=ROTATION_STOPPING_INSTANT; + + if(enableArrowKeys) + { + setCursorControl(); + } + + enabled=true; + } + + /** + * Set the speed at which the sprite will move when a direction key is pressed.
+ * All values are given in pixels per second. So an xSpeed of 100 would move the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ * + * If you need different speed values for left/right or up/down then use setAdvancedMovementSpeed + * + * @param xSpeed The speed in pixels per second in which the sprite will move/accelerate horizontally + * @param ySpeed The speed in pixels per second in which the sprite will move/accelerate vertically + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + * @param xDeceleration A deceleration speed in pixels per second to apply to the sprites horizontal movement(default 0) + * @param yDeceleration A deceleration speed in pixels per second to apply to the sprites vertical movement(default 0) + */ + public function setMovementSpeed(xSpeed:Int, ySpeed:Int, xSpeedMax:Int, ySpeedMax:Int, xDeceleration:Int=0, yDeceleration:Int=0):Void + { + leftMoveSpeed=-xSpeed; + rightMoveSpeed=xSpeed; + upMoveSpeed=-ySpeed; + downMoveSpeed=ySpeed; + + setMaximumSpeed(xSpeedMax, ySpeedMax); + setDeceleration(xDeceleration, yDeceleration); + } + + /** + * If you know you need the same value for the acceleration, maximum speeds and(optionally)deceleration then this is a quick way to set them. + * + * @param speed The speed in pixels per second in which the sprite will move/accelerate/decelerate + * @param acceleration If true it will set the speed value as the deceleration value(default)false will leave deceleration disabled + */ + public function setStandardSpeed(speed:Int, acceleration:Bool=true):Void + { + if(acceleration) + { + setMovementSpeed(speed, speed, speed, speed, speed, speed); + } + else + { + setMovementSpeed(speed, speed, speed, speed); + } + } + + /** + * Set the speed at which the sprite will move when a direction key is pressed.
+ * All values are given in pixels per second. So an xSpeed of 100 would move the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ * + * If you don't need different speed values for every direction on its own then use setMovementSpeed + * + * @param leftSpeed The speed in pixels per second in which the sprite will move/accelerate to the left + * @param rightSpeed The speed in pixels per second in which the sprite will move/accelerate to the right + * @param upSpeed The speed in pixels per second in which the sprite will move/accelerate up + * @param downSpeed The speed in pixels per second in which the sprite will move/accelerate down + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + * @param xDeceleration Deceleration speed in pixels per second to apply to the sprites horizontal movement(default 0) + * @param yDeceleration Deceleration speed in pixels per second to apply to the sprites vertical movement(default 0) + */ + public function setAdvancedMovementSpeed(leftSpeed:Int, rightSpeed:Int, upSpeed:Int, downSpeed:Int, xSpeedMax:Int, ySpeedMax:Int, xDeceleration:Int=0, yDeceleration:Int=0):Void + { + leftMoveSpeed=-leftSpeed; + rightMoveSpeed=rightSpeed; + upMoveSpeed=-upSpeed; + downMoveSpeed=downSpeed; + + setMaximumSpeed(xSpeedMax, ySpeedMax); + setDeceleration(xDeceleration, yDeceleration); + } + + /** + * Set the speed at which the sprite will rotate when a direction key is pressed.
+ * Use this in combination with setMovementSpeed to create a Thrust like movement system.
+ * All values are given in pixels per second. So an xSpeed of 100 would rotate the sprite 100 pixels in 1 second(1000ms)
+ * Due to the nature of the Internal Flash timer this amount is not 100% accurate and will vary above/below the desired distance by a few pixels.
+ */ + public function setRotationSpeed(antiClockwiseSpeed:Float, clockwiseSpeed:Float, speedMax:Float, deceleration:Float):Void + { + antiClockwiseRotationSpeed=-antiClockwiseSpeed; + clockwiseRotationSpeed=clockwiseSpeed; + + setRotationKeys(); + setMaximumRotationSpeed(speedMax); + setRotationDeceleration(deceleration); + } + + /** + * + * + * @param rotationType + * @param stoppingType + */ + public function setRotationType(rotationType:Int, stoppingType:Int):Void + { + rotation=rotationType; + rotationStopping=stoppingType; + } + + /** + * Sets the maximum speed(in pixels per second)that the FlxSprite can rotate.
+ * When the FlxSprite is accelerating(movement type MOVEMENT_ACCELERATES)its speed won't increase above this value.
+ * However Flixel allows the velocity of an FlxSprite to be set to anything. So if you'd like to check the value and restrain it, then enable "limitVelocity". + * + * @param speed The maximum speed in pixels per second in which the sprite can rotate + * @param limitVelocity If true the angular velocity of the FlxSprite will be checked and kept within the limit. If false it can be set to anything. + */ + public function setMaximumRotationSpeed(speed:Float, limitVelocity:Bool=true):Void + { + entity.maxAngular=speed; + + capAngularVelocity=limitVelocity; + } + + /** + * Deceleration is a speed(in pixels per second)that is applied to the sprite if stopping type is "DECELERATES" and if no rotation is taking place.
+ * The velocity of the sprite will be reduced until it reaches zero. + * + * @param speed The speed in pixels per second at which the sprite will have its angular rotation speed decreased + */ + public function setRotationDeceleration(speed:Float):Void + { + entity.angularDrag=speed; + } + + /** + * Set minimum and maximum angle limits that the Sprite won't be able to rotate beyond.
+ * Values must be between -180 and +180. 0 is pointing right, 90 down, 180 left, -90 up. + * + * @param minimumAngle Minimum angle below which the sprite cannot rotate(must be -180 or above) + * @param maximumAngle Maximum angle above which the sprite cannot rotate(must be 180 or below) + */ + public function setRotationLimits(minimumAngle:Int, maximumAngle:Int):Void + { + if(minimumAngle>maximumAngle || minimumAngle<-180 || maximumAngle>180) + { + throw new Dynamic("FlxControlHandler setRotationLimits:Invalid Minimum / Maximum angle"); + } + else + { + enforceAngleLimits=true; + minAngle=minimumAngle; + maxAngle=maximumAngle; + } + } + + /** + * Disables rotation limits set in place by setRotationLimits() + */ + public function disableRotationLimits():Void + { + enforceAngleLimits=false; + } + + /** + * Set which keys will rotate the sprite. The speed of rotation is set in setRotationSpeed. + * + * @param leftRight Use the LEFT and RIGHT arrow keys for anti-clockwise and clockwise rotation respectively. + * @param upDown Use the UP and DOWN arrow keys for anti-clockwise and clockwise rotation respectively. + * @param customAntiClockwise The String value of your own key to use for anti-clockwise rotation(as taken from org.flixel.system.input.Keyboard) + * @param customClockwise The String value of your own key to use for clockwise rotation(as taken from org.flixel.system.input.Keyboard) + */ + public function setRotationKeys(leftRight:Bool=true, upDown:Bool=false, customAntiClockwise:String="", customClockwise:String=""):Void + { + isRotating=true; + rotateAntiClockwise=true; + rotateClockwise=true; + antiClockwiseKey="LEFT"; + clockwiseKey="RIGHT"; + + if(upDown==true) + { + antiClockwiseKey="UP"; + clockwiseKey="DOWN"; + } + + if(customAntiClockwise !="" && customClockwise !="") + { + antiClockwiseKey=customAntiClockwise; + clockwiseKey=customClockwise; + } + } + + /** + * If you want to enable a Thrust like motion for your sprite use this to set the speed and keys.
+ * This is usually used in conjunction with Rotation and it will over-ride anything already defined in setMovementSpeed. + * + * @param thrustKey Specify the key Std.string(as taken from org.flixel.system.input.Keyboard)to use for the Thrust action + * @param thrustSpeed The speed in pixels per second which the sprite will move. Acceleration or Instant movement is determined by the Movement Type. + * @param reverseKey If you want to be able to reverse, set the key string as taken from org.flixel.system.input.Keyboard(defaults to null). + * @param reverseSpeed The speed in pixels per second which the sprite will reverse. Acceleration or Instant movement is determined by the Movement Type. + */ + public function setThrust(thrustKey:String, thrustSpeed:Float, reverseKey:String=null, reverseSpeed:Float=0):Void + { + thrustEnabled=false; + reverseEnabled=false; + + if(thrustKey) + { + this.thrustKey=thrustKey; + this.thrustSpeed=thrustSpeed; + thrustEnabled=true; + } + + if(reverseKey) + { + this.reverseKey=reverseKey; + this.reverseSpeed=reverseSpeed; + reverseEnabled=true; + } + } + + /** + * Sets the maximum speed(in pixels per second)that the FlxSprite can move. You can set the horizontal and vertical speeds independantly.
+ * When the FlxSprite is accelerating(movement type MOVEMENT_ACCELERATES)its speed won't increase above this value.
+ * However Flixel allows the velocity of an FlxSprite to be set to anything. So if you'd like to check the value and restrain it, then enable "limitVelocity". + * + * @param xSpeed The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeed The maximum speed in pixels per second in which the sprite can move vertically + * @param limitVelocity If true the velocity of the FlxSprite will be checked and kept within the limit. If false it can be set to anything. + */ + public function setMaximumSpeed(xSpeed:Int, ySpeed:Int, limitVelocity:Bool=true):Void + { + entity.maxVelocity.x=xSpeed; + entity.maxVelocity.y=ySpeed; + + capVelocity=limitVelocity; + } + + /** + * Deceleration is a speed(in pixels per second)that is applied to the sprite if stopping type is "DECELERATES" and if no acceleration is taking place.
+ * The velocity of the sprite will be reduced until it reaches zero, and can be configured separately per axis. + * + * @param xSpeed The speed in pixels per second at which the sprite will have its horizontal speed decreased + * @param ySpeed The speed in pixels per second at which the sprite will have its vertical speed decreased + */ + public function setDeceleration(xSpeed:Int, ySpeed:Int):Void + { + entity.drag.x=xSpeed; + entity.drag.y=ySpeed; + } + + /** + * Gravity can be applied to the sprite, pulling it in any direction.
+ * Gravity is given in pixels per second and is applied as acceleration. The speed the sprite reaches under gravity will never exceed the Maximum Movement Speeds set.
+ * If you don't want gravity for a specific direction pass a value of zero. + * + * @param xForce A positive value applies gravity dragging the sprite to the right. A negative value drags the sprite to the left. Zero disables horizontal gravity. + * @param yForce A positive value applies gravity dragging the sprite down. A negative value drags the sprite up. Zero disables vertical gravity. + */ + public function setGravity(xForce:Int, yForce:Int):Void + { + gravityX=xForce; + gravityY=yForce; + + entity.acceleration.x=gravityX; + entity.acceleration.y=gravityY; + } + + /** + * Switches the gravity applied to the sprite. If gravity was +400 Y(pulling them down)this will swap it to -400 Y(pulling them up)
+ * To reset call flipGravity again + */ + public function flipGravity():Void + { + if(gravityX && gravityX !=0) + { + gravityX=-gravityX; + entity.acceleration.x=gravityX; + } + + if(gravityY && gravityY !=0) + { + gravityY=-gravityY; + entity.acceleration.y=gravityY; + } + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function speedUp(xFactor:Float, yFactor:Float):Void + { + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function slowDown(xFactor:Float, yFactor:Float):Void + { + } + + /** + * TODO + * + * @param xFactor + * @param yFactor + */ + public function resetSpeeds(resetX:Bool=true, resetY:Bool=true):Void + { + if(resetX) + { + xSpeedAdjust=0; + } + + if(resetY) + { + ySpeedAdjust=0; + } + } + + /** + * Creates a new Hot Key, which can be bound to any function you specify(such as "swap weapon", "quit", etc) + * + * @param key The key to use as the hot key(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL", "Q", etc) + * @param callback The function to call when the key is pressed + * @param keymode The keymode that will trigger the callback, either KEYMODE_PRESSED, KEYMODE_JUST_DOWN or KEYMODE_RELEASED + */ + public function addHotKey(key:String, callback:Function, keymode:Int):Void + { + + } + + /** + * Removes a previously defined hot key + * + * @param key The key to use as the hot key(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL", "Q", etc) + * @return true if the key was found and removed, false if the key couldn't be found + */ + public function removeHotKey(key:String):Bool + { + return true; + } + + /** + * Set sound effects for the movement events jumping, firing, walking and thrust. + * + * @param jump The FlxSound to play when the user jumps + * @param fire The FlxSound to play when the user fires + * @param walk The FlxSound to play when the user walks + * @param thrust The FlxSound to play when the user thrusts + */ + public function setSounds(jump:FlxSound=null, fire:FlxSound=null, walk:FlxSound=null, thrust:FlxSound=null):Void + { + if(jump) + { + jumpSound=jump; + } + + if(fire) + { + fireSound=fire; + } + + if(walk) + { + walkSound=walk; + } + + if(thrust) + { + thrustSound=thrust; + } + } + + /** + * Enable a fire button + * + * @param key The key to use as the fire button(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL") + * @param keymode The FlxControlHandler KEYMODE value(KEYMODE_PRESSED, KEYMODE_JUST_DOWN, KEYMODE_RELEASED) + * @param repeatDelay Time delay in ms between which the fire action can repeat(0 means instant, 250 would allow it to fire approx. 4 times per second) + * @param callback A user defined function to call when it fires + * @param altKey Specify an alternative fire key that works AS WELL AS the primary fire key(TODO) + */ + public function setFireButton(key:String, keymode:Int, repeatDelay:Int, callback:Function, altKey:String=""):Void + { + fireKey=key; + fireKeyMode=keymode; + fireRate=repeatDelay; + fireCallback=callback; + + if(altKey !="") + { + altFireKey=altKey; + } + + fire=true; + } + + /** + * Enable a jump button + * + * @param key The key to use as the jump button(String from org.flixel.system.input.Keyboard, i.e. "SPACE", "CONTROL") + * @param keymode The FlxControlHandler KEYMODE value(KEYMODE_PRESSED, KEYMODE_JUST_DOWN, KEYMODE_RELEASED) + * @param height The height in pixels/sec that the Sprite will attempt to jump(gravity and acceleration can influence this actual height obtained) + * @param surface A bitwise combination of all valid surfaces the Sprite can jump off(from FlxObject, such as FlxObject.FLOOR) + * @param repeatDelay Time delay in ms between which the jumping can repeat(250 would be 4 times per second) + * @param jumpFromFall A time in ms that allows the Sprite to still jump even if it's just fallen off a platform, if still within ths time limit + * @param callback A user defined function to call when the Sprite jumps + * @param altKey Specify an alternative jump key that works AS WELL AS the primary jump key(TODO) + */ + public function setJumpButton(key:String, keymode:Int, height:Int, surface:Int, repeatDelay:Int=250, jumpFromFall:Int=0, callback:Function=null, altKey:String=""):Void + { + jumpKey=key; + jumpKeyMode=keymode; + jumpHeight=height; + jumpSurface=surface; + jumpRate=repeatDelay; + jumpFromFallTime=jumpFromFall; + jumpCallback=callback; + + if(altKey !="") + { + altJumpKey=altKey; + } + + jump=true; + } + + /** + * Limits the sprite to only be allowed within this rectangle. If its x/y coordinates go outside it will be repositioned back inside.
+ * Coordinates should be given in GAME WORLD pixel values(not screen value, although often they are the two same things) + * + * @param x The x coordinate of the top left corner of the area(in game world pixels) + * @param y The y coordinate of the top left corner of the area(in game world pixels) + * @param width The width of the area(in pixels) + * @param height The height of the area(in pixels) + */ + public function setBounds(x:Int, y:Int, width:Int, height:Int):Void + { + bounds=new Rectangle(x, y, width, height); + } + + /** + * Clears any previously set sprite bounds + */ + public function removeBounds():Void + { + bounds=null; + } + + private function moveUp():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(upKey)) + { + move=true; + isPressedUp=true; + + if(yFacing) + { + entity.facing=FlxObject.UP; + } + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.y=upMoveSpeed; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.y=upMoveSpeed; + } + + if(bounds && entity.ybounds.bottom) + { + entity.y=bounds.bottom; + } + + } + + return move; + } + + private function moveLeft():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(leftKey)) + { + move=true; + isPressedLeft=true; + + if(xFacing) + { + entity.facing=FlxObject.LEFT; + } + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=leftMoveSpeed; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=leftMoveSpeed; + } + + if(bounds && entity.xbounds.right) + { + entity.x=bounds.right; + } + } + + return move; + } + + private function moveAntiClockwise():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(antiClockwiseKey)) + { + move=true; + + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=antiClockwiseRotationSpeed; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=antiClockwiseRotationSpeed; + } + + // - Not quite there yet given the way Flixel can rotate to any valid Int angle! + if(enforceAngleLimits) + { + //entity.angle=FlxMath.angleLimit(entity.angle, minAngle, maxAngle); + } + } + + return move; + } + + private function moveClockwise():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(clockwiseKey)) + { + move=true; + + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=clockwiseRotationSpeed; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=clockwiseRotationSpeed; + } + + // - Not quite there yet given the way Flixel can rotate to any valid Int angle! + if(enforceAngleLimits) + { + //entity.angle=FlxMath.angleLimit(entity.angle, minAngle, maxAngle); + } + } + + return move; + } + + private function moveThrust():Bool + { + var move:Bool=false; + + if(FlxG.keys.pressed(thrustKey)) + { + move=true; + + var motion:FlxPoint=FlxVelocity.velocityFromAngle(entity.angle, thrustSpeed); + + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=motion.x; + entity.velocity.y=motion.y; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=motion.x; + entity.acceleration.y=motion.y; + } + + if(bounds && entity.x0) + { + if(getTimer()>nextFireTime) + { + lastFiredTime=getTimer(); + + fireCallback.call(); + + fired=true; + + nextFireTime=lastFiredTime + fireRate; + } + } + else + { + lastFiredTime=getTimer(); + + fireCallback.call(); + + fired=true; + } + } + + if(fired && fireSound) + { + fireSound.play(true); + } + + return fired; + } + + private function runJump():Bool + { + var jumped:Bool=false; + + // This should be called regardless if they've pressed jump or not + if(entity.isTouching(jumpSurface)) + { + extraSurfaceTime=getTimer()+ jumpFromFallTime; + } + + if((jumpKeyMode==KEYMODE_PRESSED && FlxG.keys.pressed(jumpKey))||(jumpKeyMode==KEYMODE_JUST_DOWN && FlxG.keys.justPressed(jumpKey))||(jumpKeyMode==KEYMODE_RELEASED && FlxG.keys.justReleased(jumpKey))) + { + // Sprite not touching a valid jump surface + if(entity.isTouching(jumpSurface)==false) + { + // They've run out of time to jump + if(getTimer()>extraSurfaceTime) + { + return jumped; + } + else + { + // Still within the fall-jump window of time, but have jumped recently + if(lastJumpTime>(extraSurfaceTime - jumpFromFallTime)) + { + return jumped; + } + } + + // If there is a jump repeat rate set and we're still less than it then return + if(getTimer()0) + { + // Gravity is pulling them down to earth, so they are jumping up(negative) + entity.velocity.y=-jumpHeight; + } + else + { + // Gravity is pulling them up, so they are jumping down(positive) + entity.velocity.y=jumpHeight; + } + + if(Std.is(jumpCallback, Function)) + { + jumpCallback.call(); + } + + lastJumpTime=getTimer(); + nextJumpTime=lastJumpTime + jumpRate; + + jumped=true; + } + + if(jumped && jumpSound) + { + jumpSound.play(true); + } + + return jumped; + } + + /** + * Called by the FlxControl plugin + */ + public function update():Void + { + if(entity==null) + { + return; + } + + // Reset the helper booleans + isPressedUp=false; + isPressedDown=false; + isPressedLeft=false; + isPressedRight=false; + + if(stopping==STOPPING_INSTANT) + { + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=0; + entity.velocity.y=0; + } + else if(movement==MOVEMENT_ACCELERATES) + { + entity.acceleration.x=0; + entity.acceleration.y=0; + } + } + else if(stopping==STOPPING_DECELERATES) + { + if(movement==MOVEMENT_INSTANT) + { + entity.velocity.x=0; + entity.velocity.y=0; + } + else if(movement==MOVEMENT_ACCELERATES) + { + // By default these are zero anyway, so it's safe to set like this + entity.acceleration.x=gravityX; + entity.acceleration.y=gravityY; + } + } + + // Rotation + if(isRotating) + { + if(rotationStopping==ROTATION_STOPPING_INSTANT) + { + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=0; + } + else if(rotation==ROTATION_ACCELERATES) + { + entity.angularAcceleration=0; + } + } + else if(rotationStopping==ROTATION_STOPPING_DECELERATES) + { + if(rotation==ROTATION_INSTANT) + { + entity.angularVelocity=0; + } + } + + var hasRotatedAntiClockwise:Bool=false; + var hasRotatedClockwise:Bool=false; + + hasRotatedAntiClockwise=moveAntiClockwise(); + + if(hasRotatedAntiClockwise==false) + { + hasRotatedClockwise=moveClockwise(); + } + + if(rotationStopping==ROTATION_STOPPING_DECELERATES) + { + if(rotation==ROTATION_ACCELERATES && hasRotatedAntiClockwise==false && hasRotatedClockwise==false) + { + entity.angularAcceleration=0; + } + } + + // If they have got instant stopping with acceleration and are NOT pressing a key, then stop the rotation. Otherwise we let it carry on + if(rotationStopping==ROTATION_STOPPING_INSTANT && rotation==ROTATION_ACCELERATES && hasRotatedAntiClockwise==false && hasRotatedClockwise==false) + { + entity.angularVelocity=0; + entity.angularAcceleration=0; + } + } + + // Thrust + if(thrustEnabled || reverseEnabled) + { + var moved:Bool=false; + + if(thrustEnabled) + { + moved=moveThrust(); + } + + if(moved==false && reverseEnabled) + { + moved=moveReverse(); + } + } + else + { + var movedX:Bool=false; + var movedY:Bool=false; + + if(up) + { + movedY=moveUp(); + } + + if(down && movedY==false) + { + movedY=moveDown(); + } + + if(left) + { + movedX=moveLeft(); + } + + if(right && movedX==false) + { + movedX=moveRight(); + } + } + + if(fire) + { + runFire(); + } + + if(jump) + { + runJump(); + } + + if(capVelocity) + { + if(entity.velocity.x>entity.maxVelocity.x) + { + entity.velocity.x=entity.maxVelocity.x; + } + + if(entity.velocity.y>entity.maxVelocity.y) + { + entity.velocity.y=entity.maxVelocity.y; + } + } + + if(walkSound) + { + if((movement==MOVEMENT_INSTANT && entity.velocity.x !=0)||(movement==MOVEMENT_ACCELERATES && entity.acceleration.x !=0)) + { + walkSound.play(false); + } + else + { + walkSound.stop(); + } + } + } + + /** + * Sets Custom Key controls. Useful if none of the pre-defined sets work. All String values should be taken from org.flixel.system.input.Keyboard + * Pass a blank(empty)String to disable that key from being checked. + * + * @param customUpKey The String to use for the Up key. + * @param customDownKey The String to use for the Down key. + * @param customLeftKey The String to use for the Left key. + * @param customRightKey The String to use for the Right key. + */ + public function setCustomKeys(customUpKey:String, customDownKey:String, customLeftKey:String, customRightKey:String):Void + { + if(customUpKey !="") + { + up=true; + upKey=customUpKey; + } + + if(customDownKey !="") + { + down=true; + downKey=customDownKey; + } + + if(customLeftKey !="") + { + left=true; + leftKey=customLeftKey; + } + + if(customRightKey !="") + { + right=true; + rightKey=customRightKey; + } + } + + /** + * Enables Cursor/Arrow Key controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the UP key + * @param allowDown Enable the DOWN key + * @param allowLeft Enable the LEFT key + * @param allowRight Enable the RIGHT key + */ + public function setCursorControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="UP"; + downKey="DOWN"; + leftKey="LEFT"; + rightKey="RIGHT"; + } + + /** + * Enables WASD controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(W)key + * @param allowDown Enable the down(S)key + * @param allowLeft Enable the left(A)key + * @param allowRight Enable the right(D)key + */ + public function setWASDControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="W"; + downKey="S"; + leftKey="A"; + rightKey="D"; + } + + /** + * Enables ESDF(home row)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(E)key + * @param allowDown Enable the down(D)key + * @param allowLeft Enable the left(S)key + * @param allowRight Enable the right(F)key + */ + public function setESDFControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="E"; + downKey="D"; + leftKey="S"; + rightKey="F"; + } + + /** + * Enables IJKL(right-sided or secondary player)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(I)key + * @param allowDown Enable the down(K)key + * @param allowLeft Enable the left(J)key + * @param allowRight Enable the right(L)key + */ + public function setIJKLControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="I"; + downKey="K"; + leftKey="J"; + rightKey="L"; + } + + /** + * Enables HJKL(Rogue / Net-Hack)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(K)key + * @param allowDown Enable the down(J)key + * @param allowLeft Enable the left(H)key + * @param allowRight Enable the right(L)key + */ + public function setHJKLControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="K"; + downKey="J"; + leftKey="H"; + rightKey="L"; + } + + /** + * Enables ZQSD(Azerty keyboard)controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(Z)key + * @param allowDown Enable the down(Q)key + * @param allowLeft Enable the left(S)key + * @param allowRight Enable the right(D)key + */ + public function setZQSDControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="Z"; + downKey="S"; + leftKey="Q"; + rightKey="D"; + } + + /** + * Enables Dvoark Simplified Controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(COMMA)key + * @param allowDown Enable the down(A)key + * @param allowLeft Enable the left(O)key + * @param allowRight Enable the right(E)key + */ + public function setDvorakSimplifiedControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="COMMA"; + downKey="O"; + leftKey="A"; + rightKey="E"; + } + + /** + * Enables Numpad(left-handed)Controls. Can be set on a per-key basis. Useful if you only want to allow a few keys.
+ * For example in a Space Invaders game you'd only enable LEFT and RIGHT. + * + * @param allowUp Enable the up(NUMPADEIGHT)key + * @param allowDown Enable the down(NUMPADTWO)key + * @param allowLeft Enable the left(NUMPADFOUR)key + * @param allowRight Enable the right(NUMPADSIX)key + */ + public function setNumpadControl(allowUp:Bool=true, allowDown:Bool=true, allowLeft:Bool=true, allowRight:Bool=true):Void + { + up=allowUp; + down=allowDown; + left=allowLeft; + right=allowRight; + + upKey="NUMPADEIGHT"; + downKey="NUMPADTWO"; + leftKey="NUMPADFOUR"; + rightKey="NUMPADSIX"; + } + + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxCoreUtils.hx b/intra/source/org/flixel/plugin/photonstorm/FlxCoreUtils.hx new file mode 100644 index 0000000..21b15b6 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxCoreUtils.hx @@ -0,0 +1,70 @@ +/** + * FlxCoreUtils + * -- Part of the Flixel Power Tools set + * + * v1.1 Added get mouseIndex and gameContainer + * v1.0 First release with copyObject + * + * @version 1.1 - August 4th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Sprite; +import flash.utils.ByteArray; +import org.flixel.*; + +class FlxCoreUtils +{ + + public function new() + { + } + + /** + * Performs a complete object deep-copy and returns a duplicate(not a reference) + * + * @param value The object you want copied + * @return A copy of this object + */ + public static function copyObject(value:Dynamic):Dynamic + { + var buffer:ByteArray=new ByteArray(); + buffer.writeObject(value); + buffer.position=0; + var result:Dynamic=buffer.readObject(); + return result; + } + + /** + * Returns the Display List index of the mouse pointer + */ + public static var mouseIndex(get_mouseIndex, null):Int; + private function get_mouseIndex():Int + { + var mouseIndex:Int=-1; + + try + { + mouseIndex=FlxG.camera.getContainerSprite().parent.numChildren - 4; + } + catch(e:Dynamic) + { + //trace + } + + return mouseIndex; + } + + /** + * Returns the Sprite that FlxGame extends(which contains the cameras, mouse, etc) + */ + public static var gameContainer(get_gameContainer, null):Sprite; + private function get_gameContainer():Sprite + { + return Sprite(FlxG.camera.getContainerSprite().parent); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxDelay.hx b/intra/source/org/flixel/plugin/photonstorm/FlxDelay.hx new file mode 100644 index 0000000..f382920 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxDelay.hx @@ -0,0 +1,163 @@ +/** + * FlxDelay + * -- Part of the Flixel Power Tools set + * + * v1.4 Modified abort so it no longer runs the stop callback(thanks to Cambrian-Man) + * v1.3 Added secondsElapsed and secondsRemaining and some more documentation + * v1.2 Added callback support + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - July 31st 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.Sprite; +import flash.events.Event; +import flash.events.EventDispatcher; +import flash.utils.getTimer; + +import org.flixel.*; + +/** + * A useful timer that can be used to trigger events after certain amounts of time are up. + * Uses getTimer so is low on resources and avoids using Flash events. + * Also takes Into consideration the Pause state of your game. + * If your game pauses, when it starts again the timer notices and adjusts the expires time accordingly. + */ + +class FlxDelay extends Sprite +{ + /** + * true if the timer is currently running, otherwise false + */ + public var isRunning:Bool; + + /** + * If you wish to call a function once the timer completes, set it here + */ + public var callback:Function; + + /** + * The duration of the Delay in milliseconds + */ + public var duration:Int; + + private var started:Int; + private var expires:Int; + private var pauseStarted:Int; + private var pausedTimerRunning:Bool; + private var complete:Bool; + + /** + * Create a new timer which will run for the given amount of ms(1000=1 second real time) + * + * @param runFor The duration of this timer in ms. Call start()to set it going. + */ + public function new(runFor:Int) + { + duration=runFor; + } + + /** + * Starts the timer running + */ + public function start():Void + { + started=getTimer(); + expires=started + duration; + isRunning=true; + complete=false; + + pauseStarted=0; + pausedTimerRunning=false; + + addEventListener(Event.ENTER_FRAME, update, false, 0, true); + } + + /** + * Has the timer finished? + */ + public var hasExpired(get_hasExpired, null):Bool; + private function get_hasExpired():Bool + { + return complete; + } + + /** + * Restart the timer using the new duration + * + * @param newDuration The duration of this timer in ms. + */ + public function reset(newDuration:Int):Void + { + duration=newDuration; + + start(); + } + + /** + * The amount of seconds that have elapsed since the timer was started + */ + public var secondsElapsed(get_secondsElapsed, null):Int; + private function get_secondsElapsed():Int + { + return Std.int((getTimer()- started)/ 1000); + } + + /** + * The amount of seconds that are remaining until the timer completes + */ + public var secondsRemaining(get_secondsRemaining, null):Int; + private function get_secondsRemaining():Int + { + return Std.int((expires - getTimer())/ 1000); + } + + private function update(event:Event):Void + { + // Has the game been paused? + if(pausedTimerRunning==true && FlxG.paused==false) + { + pausedTimerRunning=false; + + // Add the time the game was paused for onto the expires timer + expires +=(getTimer()- pauseStarted); + } + else if(FlxG.paused==true && pausedTimerRunning==false) + { + pauseStarted=getTimer(); + pausedTimerRunning=true; + } + + if(isRunning && pausedTimerRunning==false && getTimer()>expires) + { + stop(); + } + } + + /** + * Abors a currently active timer without firing any callbacks(if set) + */ + public function abort():Void + { + stop(false); + } + + private function stop(runCallback:Bool=true):Void + { + removeEventListener(Event.ENTER_FRAME, update); + + isRunning=false; + complete=true; + + if(Std.is(callback, Function) && runCallback==true) + { + callback.call(); + } + + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxDisplay.hx b/intra/source/org/flixel/plugin/photonstorm/FlxDisplay.hx new file mode 100644 index 0000000..abebbe3 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxDisplay.hx @@ -0,0 +1,181 @@ +/** + * FlxDisplay + * -- Part of the Flixel Power Tools set + * + * v1.3 Added "screenWrap", "alphaMask" and "alphaMaskFlxSprite" methods + * v1.2 Added "space" method + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.3 - June 15th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.BitmapDataChannel; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +class FlxDisplay +{ + + public function new() + { + } + + public function pad():Void + { + // Pad the sprite out with empty pixels left/right/above/below it + } + + public function flip():Void + { + // mirror / reverse? + // Flip image data horizontally / vertically without changing the angle + } + + /** + * Takes two source images(typically from Embedded bitmaps)and puts the resulting image Into the output FlxSprite.
+ * Note:It assumes the source and mask are the same size. Different sizes may result in undesired results.
+ * It works by copying the source image(your picture)into the output sprite. Then it removes all areas of it that do not
+ * have an alpha color value in the mask image. So if you draw a big black circle in your mask with a transparent edge, you'll
+ * get a circular image appear. Look at the mask PNG files in the assets/pics folder for examples. + * + * @param source The source image. Typically the one with the image / picture / texture in it. + * @param mask The mask to apply. Remember the non-alpha zero areas are the parts that will display. + * @param output The FlxSprite you wish the resulting image to be placed in(will adjust width/height of image) + * + * @return The output FlxSprite for those that like chaining + */ + public static function alphaMask(source:Class, mask:Class, output:FlxSprite):FlxSprite + { + var data:BitmapData=(new source).bitmapData; + + data.copyChannel((new mask).bitmapData, new Rectangle(0, 0, data.width, data.height), new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + + output.pixels=data; + + return output; + } + + /** + * Takes the image data from two FlxSprites and puts the resulting image Into the output FlxSprite.
+ * Note:It assumes the source and mask are the same size. Different sizes may result in undesired results.
+ * It works by copying the source image(your picture)into the output sprite. Then it removes all areas of it that do not
+ * have an alpha color value in the mask image. So if you draw a big black circle in your mask with a transparent edge, you'll
+ * get a circular image appear. Look at the mask PNG files in the assets/pics folder for examples. + * + * @param source The source FlxSprite. Typically the one with the image / picture / texture in it. + * @param mask The FlxSprite containing the mask to apply. Remember the non-alpha zero areas are the parts that will display. + * @param output The FlxSprite you wish the resulting image to be placed in(will adjust width/height of image) + * + * @return The output FlxSprite for those that like chaining + */ + public static function alphaMaskFlxSprite(source:FlxSprite, mask:FlxSprite, output:FlxSprite):FlxSprite + { + var data:BitmapData=source.pixels; + + data.copyChannel(mask.pixels, new Rectangle(0, 0, source.width, source.height), new Point, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); + + output.pixels=data; + + return output; + } + + /** + * Checks the x/y coordinates of the source FlxSprite and keeps them within the area of 0, 0, FlxG.width, FlxG.height(i.e. wraps it around the screen) + * + * @param source The FlxSprite to keep within the screen + */ + public static function screenWrap(source:FlxSprite):Void + { + if(source.x<0) + { + source.x=FlxG.width; + } + else if(source.x>FlxG.width) + { + source.x=0; + } + + if(source.y<0) + { + source.y=FlxG.height; + } + else if(source.y>FlxG.height) + { + source.y=0; + } + } + + /** + * Takes the bitmapData from the given source FlxSprite and rotates it 90 degrees clockwise.
+ * Can be useful if you need to control a sprite under rotation but it isn't drawn facing right.
+ * This change overwrites FlxSprite.pixels, but will not work with animated sprites. + * + * @param source The FlxSprite who's image data you wish to rotate clockwise + */ + public static function rotateClockwise(source:FlxSprite):Void + { + } + + /** + * Aligns a set of FlxSprites so there is equal spacing between them + * + * @param sprites An Array of FlxSprites + * @param startX The base X coordinate to start the spacing from + * @param startY The base Y coordinate to start the spacing from + * @param horizontalSpacing The amount of pixels between each sprite horizontally(default 0) + * @param verticalSpacing The amount of pixels between each sprite vertically(default 0) + * @param spaceFromBounds If set to true the h/v spacing values will be added to the width/height of the sprite, if false it will ignore this + */ + public static function space(sprites:Array, startX:Int, startY:Int, horizontalSpacing:Int=0, verticalSpacing:Int=0, spaceFromBounds:Bool=false):Void + { + var prevWidth:Int=0; + var prevHeight:Int=0; + + for(i in 0...sprites.length) + { + var sprite:FlxSprite=sprites[i]; + + if(spaceFromBounds) + { + sprite.x=startX + prevWidth +(i * horizontalSpacing); + sprite.y=startY + prevHeight +(i * verticalSpacing); + } + else + { + sprite.x=startX +(i * horizontalSpacing); + sprite.y=startY +(i * verticalSpacing); + } + } + } + + /** + * Centers the given FlxSprite on the screen, either by the X axis, Y axis, or both + * + * @param source The FlxSprite to center + * @param xAxis Boolean true if you want it centered on X(i.e. in the middle of the screen) + * @param yAxis Boolean true if you want it centered on Y + * + * @return The FlxSprite for chaining + */ + public static function screenCenter(source:FlxSprite, xAxis:Bool=true, yAxis:Bool=false):FlxSprite + { + if(xAxis) + { + source.x=(FlxG.width / 2)-(source.width / 2); + } + + if(yAxis) + { + source.y=(FlxG.height / 2)-(source.height / 2); + } + + return source; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxExplode.hx b/intra/source/org/flixel/plugin/photonstorm/FlxExplode.hx new file mode 100644 index 0000000..e5355cf --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxExplode.hx @@ -0,0 +1,15 @@ +package org.flixel.plugin.photonstorm +{ +/** + * ... + * @author Richard Davey + */ +class FlxExplode +{ + + public function new() + { + + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx b/intra/source/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx new file mode 100644 index 0000000..49c2ab1 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxExtendedSprite.hx @@ -0,0 +1,889 @@ +/** + * FlxExtendedSprite + * -- Part of the Flixel Power Tools set + * + * v1.4 Added MouseSpring, plugin checks and all the missing documentation + * v1.3 Added Gravity, Friction and Tolerance support + * v1.2 Now works fully with FlxMouseControl to be completely clickable and draggable! + * v1.1 Added "setMouseDrag" and "mouse over" states + * v1.0 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - July 29th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import org.flixel.plugin.photonstorm.BaseTypes.MouseSpring; + +/** + * An enhanced FlxSprite that is capable of receiving mouse clicks, being dragged and thrown, mouse springs, gravity and other useful things + */ +class FlxExtendedSprite extends FlxSprite +{ + /** + * Used by FlxMouseControl when multiple sprites overlap and register clicks, and you need to determine which sprite has priority + */ + public var priorityID:Int; + + /** + * If the mouse currently pressed down on this sprite? + * @default false + */ + public var isPressed:Bool=false; + + /** + * Is this sprite allowed to be clicked? + * @default false + */ + public var clickable:Bool=false; + private var clickOnRelease:Bool=false; + private var clickPixelPerfect:Bool=false; + private var clickPixelPerfectAlpha:Int; + private var clickCounter:Int; + + /** + * Function called when the mouse is pressed down on this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mousePressedCallback:Function; + + /** + * Function called when the mouse is released from this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseReleasedCallback:Function; + + /** + * Is this sprite allowed to be thrown? + * @default false + */ + public var throwable:Bool=false; + private var throwXFactor:Int; + private var throwYFactor:Int; + + /** + * Does this sprite have gravity applied to it? + * @default false + */ + public var hasGravity:Bool=false; + + /** + * The x axis gravity influence + */ + public var gravityX:Int; + + /** + * The y axis gravity influence + */ + public var gravityY:Int; + + /** + * Determines how quickly the Sprite come to rest on the walls if the sprite has x gravity enabled + * @default 500 + */ + public var frictionX:Float; + + /** + * Determines how quickly the Sprite come to rest on the ground if the sprite has y gravity enabled + * @default 500 + */ + public var frictionY:Float; + + /** + * If the velocity.x of this sprite falls between zero and this amount, then the sprite will come to a halt(have velocity.x set to zero) + */ + public var toleranceX:Float; + + /** + * If the velocity.y of this sprite falls between zero and this amount, then the sprite will come to a halt(have velocity.y set to zero) + */ + public var toleranceY:Float; + + /** + * Is this sprite being dragged by the mouse or not? + * @default false + */ + public var isDragged:Bool=false; + + /** + * Is this sprite allowed to be dragged by the mouse? true=yes, false=no + * @default false + */ + public var draggable:Bool=false; + private var dragPixelPerfect:Bool=false; + private var dragPixelPerfectAlpha:Int; + private var dragOffsetX:Int; + private var dragOffsetY:Int; + private var dragFromPoint:Bool; + private var allowHorizontalDrag:Bool=true; + private var allowVerticalDrag:Bool=true; + + /** + * Function called when the mouse starts to drag this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseStartDragCallback:Function; + + /** + * Function called when the mouse stops dragging this sprite. Function is passed these parameters:obj:FlxExtendedSprite, x:Int, y:Int + * @default null + */ + public var mouseStopDragCallback:Function; + + /** + * An FlxRect region of the game world within which the sprite is restricted during mouse drag + * @default null + */ + public var boundsRect:FlxRect=null; + + /** + * An FlxSprite the bounds of which this sprite is restricted during mouse drag + * @default null + */ + public var boundsSprite:FlxSprite=null; + + private var snapOnDrag:Bool=false; + private var snapOnRelease:Bool=false; + private var snapX:Int; + private var snapY:Int; + + /** + * Is this sprite using a mouse spring? + * @default false + */ + public var hasMouseSpring:Bool=false; + + /** + * Will the Mouse Spring be active always(false)or only when pressed(true) + * @default true + */ + public var springOnPressed:Bool=true; + + /** + * The MouseSpring object which is used to tie this sprite to the mouse + */ + public var mouseSpring:MouseSpring; + + /** + * By default the spring attaches to the top left of the sprite. To change this location provide an x offset(in pixels) + */ + public var springOffsetX:Int; + + /** + * By default the spring attaches to the top left of the sprite. To change this location provide a y offset(in pixels) + */ + public var springOffsetY:Int; + + /** + * Creates a white 8x8 squareFlxExtendedSpriteat the specified position. + * Optionally can load a simple, one-frame graphic instead. + * + * @param X The initial X position of the sprite. + * @param Y The initial Y position of the sprite. + * @param SimpleGraphic The graphic you want to display(OPTIONAL - for simple stuff only, do NOT use for animated images!). + */ + public function new(X:Float=0, Y:Float=0, SimpleGraphic:Class=null) + { + super(X, Y, SimpleGraphic); + } + + /** + * Allow this Sprite to receive mouse clicks, the total number of times this sprite is clicked is stored in this.clicks
+ * You can add callbacks via mousePressedCallback and mouseReleasedCallback + * + * @param onRelease Register the click when the mouse is pressed down(false)or when it's released(true). Note that callbacks still fire regardless of this setting. + * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. + * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed(default 255) + */ + public function enableMouseClicks(onRelease:Bool, pixelPerfect:Bool=false, alphaThreshold:Int=255):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseClicks called but FlxMouseControl plugin not activated"); + } + + clickable=true; + + clickOnRelease=onRelease; + clickPixelPerfect=pixelPerfect; + clickPixelPerfectAlpha=alphaThreshold; + clickCounter=0; + } + + /** + * Stops this sprite from checking for mouse clicks and clears any set callbacks + */ + public function disableMouseClicks():Void + { + clickable=false; + mousePressedCallback=null; + mouseReleasedCallback=null; + } + + /** + * Returns the number of times this sprite has been clicked(can be reset by setting clicks to zero) + */ + public var clicks(get_clicks, set_clicks):Int; + private function get_clicks():Int + { + return clickCounter; + } + + /** + * Sets the number of clicks this item has received. Usually you'd only set it to zero. + */ + private function set_clicks(i:Int):Void + { + clickCounter=i; + } + + /** + * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback + * + * @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. + * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. + * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed(default 255) + * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere + * @param boundsSprite If you want to restrict the drag of this sprite to within the bounding box of another sprite, pass it here + */ + public function enableMouseDrag(lockCenter:Bool=false, pixelPerfect:Bool=false, alphaThreshold:Int=255, boundsRect:FlxRect=null, boundsSprite:FlxSprite=null):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseDrag called but FlxMouseControl plugin not activated"); + } + + draggable=true; + + dragFromPoint=lockCenter; + dragPixelPerfect=pixelPerfect; + dragPixelPerfectAlpha=alphaThreshold; + + if(boundsRect) + { + this.boundsRect=boundsRect; + } + + if(boundsSprite) + { + this.boundsSprite=boundsSprite; + } + } + + /** + * Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks. + */ + public function disableMouseDrag():Void + { + if(isDragged) + { + FlxMouseControl.dragTarget=null; + FlxMouseControl.isDragging=false; + } + + isDragged=false; + draggable=false; + + mouseStartDragCallback=null; + mouseStopDragCallback=null; + } + + /** + * Restricts this sprite to drag movement only on the given axis. Note:If both are set to false the sprite will never move! + * + * @param allowHorizontal To enable the sprite to be dragged horizontally set to true, otherwise false + * @param allowVertical To enable the sprite to be dragged vertically set to true, otherwise false + */ + public function setDragLock(allowHorizontal:Bool=true, allowVertical:Bool=true):Void + { + allowHorizontalDrag=allowHorizontal; + allowVerticalDrag=allowVertical; + } + + /** + * Make this Sprite throwable by the mouse. The sprite is thrown only when the mouse button is released. + * + * @param xFactor The sprites velocity is set to FlxMouseControl.speedX * xFactor. Try a value around 50+ + * @param yFactor The sprites velocity is set to FlxMouseControl.speedY * yFactor. Try a value around 50+ + */ + public function enableMouseThrow(xFactor:Int, yFactor:Int):Void + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseThrow called but FlxMouseControl plugin not activated"); + } + + throwable=true; + throwXFactor=xFactor; + throwYFactor=yFactor; + + if(clickable==false && draggable==false) + { + clickable=true; + } + } + + /** + * Stops this sprite from being able to be thrown. If it currently has velocity this is NOT removed from it. + */ + public function disableMouseThrow():Void + { + throwable=false; + } + + /** + * Make this Sprite snap to the given grid either during drag or when it's released. + * For example 16x16 as the snapX and snapY would make the sprite snap to every 16 pixels. + * + * @param snapX The width of the grid cell in pixels + * @param snapY The height of the grid cell in pixels + * @param onDrag If true the sprite will snap to the grid while being dragged + * @param onRelease If true the sprite will snap to the grid when released + */ + public function enableMouseSnap(snapX:Int, snapY:Int, onDrag:Bool=true, onRelease:Bool=false):Void + { + snapOnDrag=onDrag; + snapOnRelease=onRelease; + this.snapX=snapX; + this.snapY=snapY; + } + + /** + * Stops the sprite from snapping to a grid during drag or release. + */ + public function disableMouseSnap():Void + { + snapOnDrag=false; + snapOnRelease=false; + } + + /** + * Adds a simple spring between the mouse and this Sprite. The spring can be activated either when the mouse is pressed(default), or enabled all the time. + * Note that nearly always the Spring will over-ride any other motion setting the sprite has(like velocity or gravity) + * + * @param onPressed true if the spring should only be active when the mouse is pressed down on this sprite + * @param retainVelocity true to retain the velocity of the spring when the mouse is released, or false to clear it + * @param tension The tension of the spring, smaller numbers create springs closer to the mouse pointer + * @param friction The friction applied to the spring as it moves + * @param gravity The gravity controls how far "down" the spring hangs(use a negative value for it to hang up!) + * + * @return The MouseSpring object if you wish to perform further chaining on it. Also available via FlxExtendedSprite.mouseSpring + */ + public function enableMouseSpring(onPressed:Bool=true, retainVelocity:Bool=false, tension:Float=0.1, friction:Float=0.95, gravity:Float=0):MouseSpring + { + if(FlxG.getPlugin(FlxMouseControl)==null) + { + throw Dynamic("FlxExtendedSprite.enableMouseSpring called but FlxMouseControl plugin not activated"); + } + + hasMouseSpring=true; + springOnPressed=onPressed; + + if(mouseSpring==null) + { + mouseSpring=new MouseSpring(this, retainVelocity, tension, friction, gravity); + } + else + { + mouseSpring.tension=tension; + mouseSpring.friction=friction; + mouseSpring.gravity=gravity; + } + + if(clickable==false && draggable==false) + { + clickable=true; + } + + return mouseSpring; + } + + /** + * Stops the sprite to mouse spring from being active + */ + public function disableMouseSpring():Void + { + hasMouseSpring=false; + + mouseSpring=null; + } + + /** + * The spring x coordinate in game world space. Consists of sprite.x + springOffsetX + */ + public var springX(get_springX, set_springX):Int; + private function get_springX():Int + { + return x + springOffsetX; + } + + /** + * The spring y coordinate in game world space. Consists of sprite.y + springOffsetY + */ + public var springY(get_springY, set_springY):Int; + private function get_springY():Int + { + return y + springOffsetY; + } + + /** + * Core update loop + */ + override public function update():Void + { + if(draggable && isDragged) + { + updateDrag(); + } + + if(isPressed==false && FlxG.mouse.justPressed()) + { + checkForClick(); + } + + if(hasGravity) + { + updateGravity(); + } + + if(hasMouseSpring) + { + if(springOnPressed==false) + { + mouseSpring.update(); + } + else + { + if(isPressed==true) + { + mouseSpring.update(); + } + else + { + mouseSpring.reset(); + } + } + } + + super.update(); + } + + /** + * Called by update, applies friction if the sprite has gravity to stop jittery motion when slowing down + */ + private function updateGravity():Void + { + // A sprite can have horizontal and/or vertical gravity in each direction(positiive / negative) + + // First let's check the x movement + + if(velocity.x !=0) + { + if(acceleration.x<0) + { + // Gravity is pulling them left + if(touching & WALL) + { + drag.y=frictionY; + + if((wasTouching & WALL)==false) + { + if(velocity.x0) + { + // Gravity is pulling them right + if(touching & WALL) + { + // Stop them sliding like on ice + drag.y=frictionY; + + if((wasTouching & WALL)==false) + { + if(velocity.x>-toleranceX) + { + //trace("(right)velocity.x", velocity.x, "stopped via tolerance break", toleranceX); + velocity.x=0; + } + } + } + else + { + drag.y=0; + } + } + } + + // Now check the y movement + + if(velocity.y !=0) + { + if(acceleration.y<0) + { + // Gravity is pulling them up(Std.is(velocity, negative)) + if(touching & CEILING) + { + drag.x=frictionX; + + if((wasTouching & CEILING)==false) + { + if(velocity.y0) + { + // Gravity is pulling them down(Std.is(velocity, positive)) + if(touching & FLOOR) + { + // Stop them sliding like on ice + drag.x=frictionX; + + if((wasTouching & FLOOR)==false) + { + if(velocity.y>-toleranceY) + { + //trace("(down)velocity.y", velocity.y, "stopped via tolerance break", toleranceY); + velocity.y=0; + } + } + } + else + { + drag.x=0; + } + } + } + } + + /** + * Updates the Mouse Drag on this Sprite. + */ + private function updateDrag():Void + { + //FlxG.mouse.getWorldPosition(null, tempPoint); + + if(allowHorizontalDrag) + { + x=Std.int(FlxG.mouse.x)- dragOffsetX; + } + + if(allowVerticalDrag) + { + y=Std.int(FlxG.mouse.y)- dragOffsetY; + } + + if(boundsRect) + { + checkBoundsRect(); + } + + if(boundsSprite) + { + checkBoundsSprite(); + } + + if(snapOnDrag) + { + x=Std.int(Math.floor(x / snapX)* snapX); + y=Std.int(Math.floor(y / snapY)* snapY); + } + } + + /** + * Checks if the mouse is over this sprite and pressed, then does a pixel perfect check if needed and adds it to the FlxMouseControl check stack + */ + private function checkForClick():Void + { + if(mouseOver && FlxG.mouse.justPressed()) + { + // If we don't need a pixel perfect check, then don't bother running one! By this point we know the mouse is over the sprite already + if(clickPixelPerfect==false && dragPixelPerfect==false) + { + FlxMouseControl.addToStack(this); + return; + } + + if(clickPixelPerfect && FlxCollision.pixelPerfectPointCheck(FlxG.mouse.x, FlxG.mouse.y, this, clickPixelPerfectAlpha)) + { + FlxMouseControl.addToStack(this); + return; + } + + if(dragPixelPerfect && FlxCollision.pixelPerfectPointCheck(FlxG.mouse.x, FlxG.mouse.y, this, dragPixelPerfectAlpha)) + { + FlxMouseControl.addToStack(this); + return; + } + } + } + + /** + * Called by FlxMouseControl when this sprite is clicked. Should not usually be called directly. + */ + public function mousePressedHandler():Void + { + isPressed=true; + + if(clickable && clickOnRelease==false) + { + clickCounter++; + } + + if(Std.is(mousePressedCallback, Function)) + { + mousePressedCallback.apply(null, [ this, mouseX, mouseY ]); + } + } + + /** + * Called by FlxMouseControl when this sprite is released from a click. Should not usually be called directly. + */ + public function mouseReleasedHandler():Void + { + isPressed=false; + + if(isDragged) + { + stopDrag(); + } + + if(clickable && clickOnRelease==true) + { + clickCounter++; + } + + if(throwable) + { + velocity.x=FlxMouseControl.speedX * throwXFactor; + velocity.y=FlxMouseControl.speedY * throwYFactor; + } + + if(Std.is(mouseReleasedCallback, Function)) + { + mouseReleasedCallback.apply(null, [ this, mouseX, mouseY ]); + } + } + + /** + * Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly. + */ + public function startDrag():Void + { + isDragged=true; + + if(dragFromPoint==false) + { + dragOffsetX=Std.int(FlxG.mouse.x)- x; + dragOffsetY=Std.int(FlxG.mouse.y)- y; + } + else + { + // Move the sprite to the middle of the mouse + dragOffsetX=(frameWidth / 2); + dragOffsetY=(frameHeight / 2); + } + } + + /** + * Bounds Rect check for the sprite drag + */ + private function checkBoundsRect():Void + { + if(xboundsRect.right) + { + x=boundsRect.right - width; + } + + if(yboundsRect.bottom) + { + y=boundsRect.bottom - height; + } + } + + /** + * Parent Sprite Bounds check for the sprite drag + */ + private function checkBoundsSprite():Void + { + if(x(boundsSprite.x + boundsSprite.width)) + { + x=(boundsSprite.x + boundsSprite.width)- width; + } + + if(y(boundsSprite.y + boundsSprite.height)) + { + y=(boundsSprite.y + boundsSprite.height)- height; + } + } + + /** + * Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly. + */ + public function stopDrag():Void + { + isDragged=false; + + if(snapOnRelease) + { + x=Std.int(Math.floor(x / snapX)* snapX); + y=Std.int(Math.floor(y / snapY)* snapY); + } + } + + /** + * Gravity can be applied to the sprite, pulling it in any direction. Gravity is given in pixels per second and is applied as acceleration. + * If you don't want gravity for a specific direction pass a value of zero. To cancel it entirely pass both values as zero. + * + * @param gravityX A positive value applies gravity dragging the sprite to the right. A negative value drags the sprite to the left. Zero disables horizontal gravity. + * @param gravityY A positive value applies gravity dragging the sprite down. A negative value drags the sprite up. Zero disables vertical gravity. + * @param frictionX The amount of friction applied to the sprite if it hits a wall. Allows it to come to a stop without constantly jittering. + * @param frictionY The amount of friction applied to the sprite if it hits the floor/roof. Allows it to come to a stop without constantly jittering. + * @param toleranceX If the velocity.x of the sprite falls between 0 and +- this value, it is set to stop(velocity.x=0) + * @param toleranceY If the velocity.y of the sprite falls between 0 and +- this value, it is set to stop(velocity.y=0) + */ + public function setGravity(gravityX:Int, gravityY:Int, frictionX:Float=500, frictionY:Float=500, toleranceX:Float=10, toleranceY:Float=10):Void + { + hasGravity=true; + + this.gravityX=gravityX; + this.gravityY=gravityY; + + this.frictionX=frictionX; + this.frictionY=frictionY; + + this.toleranceX=toleranceX; + this.toleranceY=toleranceY; + + if(gravityX==0 && gravityY==0) + { + hasGravity=false; + } + + acceleration.x=gravityX; + acceleration.y=gravityY; + } + + /** + * Switches the gravity applied to the sprite. If gravity was +400 Y(pulling them down)this will swap it to -400 Y(pulling them up)
+ * To reset call flipGravity again + */ + public function flipGravity():Void + { + if(gravityX && gravityX !=0) + { + gravityX=-gravityX; + acceleration.x=gravityX; + } + + if(gravityY && gravityY !=0) + { + gravityY=-gravityY; + acceleration.y=gravityY; + } + } + + /** + * Returns an FlxPoint consisting of this sprites world x/y coordinates + */ + public var point(get_point, set_point):FlxPoint; + private function get_point():FlxPoint + { + return _point; + } + + private function set_point(p:FlxPoint):Void + { + _point=p; + } + + /** + * Return true if the mouse is over this Sprite, otherwise false. Only takes the Sprites bounding box Into consideration and does not check if there + * are other sprites potentially on-top of this one. Check the value of this.isPressed if you need to know if the mouse is currently clicked on this sprite. + */ + public var mouseOver(get_mouseOver, null):Bool; + private function get_mouseOver():Bool + { + return FlxMath.pointInCoordinates(FlxG.mouse.x, FlxG.mouse.y, x, y, width, height); + } + + /** + * Returns how many horizontal pixels the mouse pointer is inside this sprite from the top left corner. Returns -1 if outside. + */ + public var mouseX(get_mouseX, null):Int; + private function get_mouseX():Int + { + if(mouseOver) + { + return FlxG.mouse.x - x; + } + + return -1; + } + + /** + * Returns how many vertical pixels the mouse pointer is inside this sprite from the top left corner. Returns -1 if outside. + */ + public var mouseY(get_mouseY, null):Int; + private function get_mouseY():Int + { + if(mouseOver) + { + return FlxG.mouse.y - y; + } + + return -1; + } + + /** + * Returns an FlxRect consisting of the bounds of this Sprite. + */ + public var rect(get_rect, null):FlxRect; + private function get_rect():FlxRect + { + _rect.x=x; + _rect.y=y; + _rect.width=width; + _rect.height=height; + + return _rect; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxFlectrum.hx b/intra/source/org/flixel/plugin/photonstorm/FlxFlectrum.hx new file mode 100644 index 0000000..1f36029 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxFlectrum.hx @@ -0,0 +1,702 @@ +/** + * Flectrum version 1.0 by Christian Corti - Jiggled around a bit to work with Flixel by Richard Davey, 29th July 2011 + * Neoart, Costa Rica + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package org.flixel.plugin.photonstorm; + +import flash.display.*; +import flash.events.*; +import flash.geom.*; +import flash.utils.*; +import flash.utils.getTimer; +import neoart.flectrum.SoundEx; +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; + +class FlxFlectrum extends FlxGroup +{ + public static inline var UP:String="up"; + public static inline var LEFT:String="left"; + public static inline var DOWN:String="down"; + public static inline var RIGHT:String="right"; + + public static inline var METER:String="meter"; + //public static var DECAY:String="decay";// currently broken + public static inline var PEAKS:String="peaks"; + + public var backgroundBeat:Bool; + + public var back:FlxSprite; + public var front:FlxSprite; + + private var currentPeak:Int; + private var lastPeak:Int; + + private var canvas:Sprite; + private var timer:Timer; + private var meter:BitmapData; + private var background:Bitmap; + private var foreground:Bitmap; + private var buffer:BitmapData; + private var input:BitmapData; + private var output:BitmapData; + + private var levels:Array; + private var spectrum:Array; + private var destPoint:Point; + private var sourceRect:Rectangle; + private var sectionWidth:Int; + private var sectionHeight:Int; + private var realHeight:Int; + + private var m_soundEx:SoundEx; + private var m_direction:String=UP; + private var m_mode:String=PEAKS; + private var m_columns:Int; + private var m_columnSize:Int=10; + private var m_columnSpacing:Int=2; + private var m_rows:Int; + private var m_rowSize:Int=3; + private var m_rowSpacing:Int=1; + private var m_showBackground:Bool=true; + private var m_backgroundAlpha:Float=0.2; + private var m_decay:Float=0.02; + private var m_decayAlpha:Int=0xd0000000; + private var m_peaksAlpha:Int=0xff000000; + + private var m_colors:Array=[0xff3939, 0xffb320, 0xfff820, 0x50d020]; + private var m_alphas:Array=[1, 1, 1, 1]; + private var m_ratios:Array=[20, 105, 145, 250]; + + public function new() + { + super(2); + } + + public function init(x:Int, y:Int, soundEx:SoundEx, columns:Int=15, columnSize:Int=10, columnSpacing:Int=0, rows:Int=32, rowSize:Int=3, rowSpacing:Int=0):Void + { + this.soundEx=soundEx; + + m_columns=columns; + m_columnSize=columnSize; + m_columnSpacing=columnSpacing; + + m_rows=rows; + m_rowSize=rowSize; + m_rowSpacing=rowSpacing; + + front=new FlxSprite().makeGraphic(1, 1, 0x0); + front.solid=false; + + back=new FlxSprite().makeGraphic(1, 1, 0x0); + back.solid=false; + back.visible=false; + + this.x=x; + this.y=y; + + canvas=new Sprite; + background=new Bitmap(null, "always", true); + foreground=new Bitmap(null, "always", true); + levels=new Array; + spectrum=new Array; + destPoint=new Point(); + sourceRect=new Rectangle(); + + currentPeak=0; + lastPeak=0; + + timer=new Timer(45); + timer.addEventListener(TimerEvent.TIMER, peaksHandler); + reset(); + + add(back); + add(front); + } + + public function useBitmap(image:Class):Void + { + meter=Bitmap(new image).bitmapData.clone(); + clone(); + } + + public function useDraw():Void + { + meter.dispose(); + meter=null; + drawDisplay(); + } + + private function reset():Void + { + timer.reset(); + levels.length=m_columns; + for(i in 0...m_columnsi) + levels[i]=0; + + background.alpha=m_backgroundAlpha; + background.rotation=0; + background.x=0; + background.y=0; + foreground.rotation=0; + foreground.x=0; + foreground.y=0; + if(meter) + clone(); + else + drawDisplay(); + } + + public var x(null, set_x):Int; + private function set_x(x:Int):Void + { + back.x=x; + front.x=x; + } + + public function get x():Int + { + return front.x; + } + + public var y(null, set_y):Int; + private function set_y(y:Int):Void + { + back.y=y; + front.y=y; + } + + public function get y():Int + { + return front.y; + } + + private function start():Void + { + if(!soundEx) + return; + timer.reset(); + timer.start(); + } + + private function clone():Void + { + sectionWidth=meter.width + m_columnSpacing; + sectionHeight=m_rowSize + m_rowSpacing; + realHeight=meter.height + m_rowSpacing; + + var h:Int=meter.height, i:Int, w:Int=m_columns * sectionWidth - m_columnSpacing; + + output=new BitmapData(w, h, true, 0); + buffer=output.clone(); + output.lock(); + destPoint.x=0; + + for(i=0;i0) + { + sourceRect.width=w; + sourceRect.height=m_rowSpacing; + sourceRect.y=h - sectionHeight; + + for(i=0;it) + t=levels[i]; + + m_soundEx.removeEventListener(Event.SOUND_COMPLETE, stopHandler); + m_soundEx.removeEventListener(SoundEx.SOUND_STOP, stopHandler); + m_soundEx.addEventListener(SoundEx.SOUND_START, startHandler); + + timer.reset(); + timer.repeatCount=Std.int(t / m_decay)+ 1; + timer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); + timer.start(); + } + + private function completeHandler(e:Event):Void + { + if(backgroundBeat) + background.alpha=m_backgroundAlpha; + timer.reset(); + timer.removeEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); + } + + private function meterHandler(e:TimerEvent):Void + { + var h:Int, i:Int; + spectrum=m_soundEx.getStereoAdd(m_columns); + buffer.fillRect(buffer.rect, 0); + sourceRect.x=0; + + for(i=0;ilevels[i]) + levels[i]=a; + h=Std.int(levels[i] * m_rows)* sectionHeight; + sourceRect.height=h; + sourceRect.y=realHeight - h; + buffer.fillRect(sourceRect, m_peaksAlpha); + sourceRect.x +=sectionWidth; + levels[i] -=m_decay; + } + output.copyPixels(input, input.rect, destPoint, buffer, null, true); + output.unlock(); + if(backgroundBeat) + background.alpha=m_soundEx.peak; + e.updateAfterEvent(); + } + + private function peaksHandler(e:TimerEvent):Void + { + var a:Float, h:Int, i:Int; + spectrum=m_soundEx.getStereoAdd(m_columns); + buffer.fillRect(buffer.rect, 0); + sourceRect.x=0; + + for(i=0;ilevels[i]) + { + levels[i]=a; + } + else + { + h=Std.int(levels[i] * m_rows)* sectionHeight; + sourceRect.y=realHeight - h; + } + + sourceRect.height=m_rowSize; + buffer.fillRect(sourceRect, m_peaksAlpha); + sourceRect.x +=sectionWidth; + levels[i] -=m_decay; + } + + output.copyPixels(input, input.rect, destPoint, buffer); + + if(backgroundBeat) + { + background.alpha=m_soundEx.peak; + } + + currentPeak=getTimer(); + + e.updateAfterEvent(); + } + + override public function update():Void + { + // Avoids doing this every single frame, rather only when the meter has peaked + if(currentPeak>lastPeak) + { + lastPeak=currentPeak; + + if(foreground) + { + front.pixels=foreground.bitmapData; + front.alpha=foreground.alpha; + } + + if(background) + { + back.pixels=background.bitmapData; + back.alpha=background.alpha; + } + } + + super.update(); + } + + public var soundEx(get_soundEx, set_soundEx):SoundEx; + private function get_soundEx():SoundEx + { + return m_soundEx; + } + + private function set_soundEx(value:SoundEx):Void + { + if(m_soundEx) + m_soundEx.removeEventListener(SoundEx.SOUND_START, startHandler); + m_soundEx=value; + value.addEventListener(SoundEx.SOUND_START, startHandler); + } + + public var direction(get_direction, set_direction):String; + private function get_direction():String + { + return m_direction; + } + + private function set_direction(value:String):Void + { + if(value==m_direction || !FlxFlectrum[value.toUpperCase()]) + return; + + switch(value) + { + case UP: + front.angle=0; + break; + case LEFT: + front.angle=270; + break; + case DOWN: + front.angle=180; + break; + case RIGHT: + front.angle=90; + break; + } + + back.angle=front.angle; + m_direction=value; + } + + public var mode(get_mode, set_mode):String; + private function get_mode():String + { + return m_mode; + } + + private function set_mode(value:String):Void + { + if(value==m_mode || !FlxFlectrum[value.toUpperCase()]) + return; + timer.removeEventListener(TimerEvent.TIMER, this[m_mode + "Handler"]); + timer.addEventListener(TimerEvent.TIMER, this[value + "Handler"]); + m_mode=value; + } + + public var delay(get_delay, set_delay):Int; + private function get_delay():Int + { + return timer.delay; + } + + private function set_delay(value:Int):Void + { + timer.delay=value; + } + + public var columns(get_columns, set_columns):Int; + private function get_columns():Int + { + return m_columns; + } + + private function set_columns(value:Int):Void + { + if(value==m_columns) + return; + if(value<2) + value=2; + else if(value>256) + value=256; + m_columns=value; + reset(); + } + + public var columnSize(get_columnSize, set_columnSize):Int; + private function get_columnSize():Int + { + return m_columnSize; + } + + private function set_columnSize(value:Int):Void + { + if(value==m_columnSize) + return; + if(value<1) + value=1; + m_columnSize=value; + reset(); + } + + public var columnSpacing(get_columnSpacing, set_columnSpacing):Int; + private function get_columnSpacing():Int + { + return m_columnSpacing; + } + + private function set_columnSpacing(value:Int):Void + { + if(value==m_columnSpacing) + return; + m_columnSpacing=value; + reset(); + } + + public var rows(get_rows, set_rows):Int; + private function get_rows():Int + { + return m_rows; + } + + private function set_rows(value:Int):Void + { + if(value==m_rows) + return; + if(value<3) + value=3; + m_rows=value; + reset(); + } + + public var rowSize(get_rowSize, set_rowSize):Int; + private function get_rowSize():Int + { + return m_rowSize; + } + + private function set_rowSize(value:Int):Void + { + if(value==m_rowSize) + return; + if(value<1) + value=1; + m_rowSize=value; + reset(); + } + + public var rowSpacing(get_rowSpacing, set_rowSpacing):Int; + private function get_rowSpacing():Int + { + return m_rowSpacing; + } + + private function set_rowSpacing(value:Int):Void + { + if(value==m_rowSpacing) + return; + m_rowSpacing=value; + reset(); + } + + public var showBackground(get_showBackground, set_showBackground):Bool; + private function get_showBackground():Bool + { + return m_showBackground; + } + + private function set_showBackground(value:Bool):Void + { + if(value) + { + back.visible=true; + } + else + { + back.visible=false; + } + + if(value==m_showBackground) + return; + m_showBackground=value; + reset(); + } + + public var backgroundAlpha(get_backgroundAlpha, set_backgroundAlpha):Float; + private function get_backgroundAlpha():Float + { + return m_backgroundAlpha; + } + + private function set_backgroundAlpha(value:Float):Void + { + background.alpha=m_backgroundAlpha=value; + } + + public var decay(get_decay, set_decay):Float; + private function get_decay():Float + { + return m_decay; + } + + private function set_decay(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_decay=value; + } + + public var decay(get_decay, set_decay):Float; + private function get_decayAlpha():Float + { + return m_decayAlpha / 255; + } + + private function set_decayAlpha(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_decayAlpha=Std.int(value * 255)<<24; + } + + public var peaksAlpha(get_peaksAlpha, set_peaksAlpha):Float; + private function get_peaksAlpha():Float + { + return m_peaksAlpha / 255; + } + + private function set_peaksAlpha(value:Float):Void + { + if(value<0) + value=0; + else if(value>1) + value=1; + m_peaksAlpha=Std.int(value * 255)<<24; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxFlod.hx b/intra/source/org/flixel/plugin/photonstorm/FlxFlod.hx new file mode 100644 index 0000000..5f04c82 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxFlod.hx @@ -0,0 +1,254 @@ +/** + * FlxFlod + * -- Part of the Flixel Power Tools set + * + * v1.3 Added full FlxFlectrum support + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.3 - July 29th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import neoart.flectrum.Flectrum; +import neoart.flectrum.SoundEx; +import org.flixel.*; +import neoart.flod.*; + +import flash.utils.ByteArray; +import flash.media.SoundTransform; + +/** + * FlxFlod adds support for the Flod AS3 Replay library by Christian Corti.
+ * Flod is an incredibly powerful library allowing you to play tracker music from the Amiga / ST / PC(SoundTracker, ProTracker, etc)
+ * More information about Flod can be found here:http://www.photonstorm.com/flod

+ * + * This class works without modifying flixel, however the mute/volume/pause/resume commands won't be hooked Into flixel.
+ * You can either use a patched version of Flixel which is provided in this repository:
+ * flash-game-dev-tips\Flixel Versions\Flixel v2.43 Patch 1.0 + *
+ * Or you can patch FlxG manually by doing the following:

+ * + * 1)Addimport com.photonstorm.flixel.FlxFlod;at the top of FlxG.as:
+ * 2)Find the functionstatic public var mute(null, set_mute):Bool; + static var mute(null, set_mute):Bool; + private function set_mute(Mute:Bool):Voidand add this line at the end of it:FlxFlod.mute=Mute;
+ * 3)Find the functionstatic public var volume(null, set_volume):Float; + static var volume(null, set_volume):Float; + private function set_volume(Volume:Float):Voidand add this line at the end of it:FlxFlod.volume=Volume;
+ * 4)Find the functionstatic private function pauseSounds():Voidand add this line at the end of it:FlxFlod.pause();
+ * 5)Find the functionstatic private function playSounds():Voidand add this line at the end of it:FlxFlod.resume();

+ * + * Flixel will now be patched so that any music playing via FlxFlod responds to the global flixel mute, volume and pause controls + */ + +class FlxFlod +{ + private static var processor:ModProcessor; + private static var modStream:ByteArray; + private static var soundform:SoundTransform=new SoundTransform(); + + private static var fadeTimer:FlxDelay; + + private static var callbackHooksCreated:Bool=false; + + private static var sound:SoundEx=new SoundEx; + public static var flectrum:FlxFlectrum; + + /** + * Starts playback of a tracker module + * + * @param toon The music to play + * + * @return Boolean true if playback started successfully, false if not + */ + public static function playMod(toon:Class):Bool + { + stopMod(); + + modStream=new toon()as ByteArray; + + processor=new ModProcessor(); + + if(processor.load(modStream)) + { + processor.loopSong=true; + processor.stereo=0; + processor.play(sound); + + if(processor.soundChannel) + { + soundform.volume=FlxG.volume; + processor.soundChannel.soundTransform=soundform; + } + + if(callbackHooksCreated==false) + { + FlxG.volumeHandler=updateVolume; + callbackHooksCreated=true; + } + + return true; + + } + else + { + return false; + } + } + + /** + * Creates a Flectrum(VU Meter / Spectrum Analyser) + * + * @param x The x position of the flectrum in game world coordinates + * @param y The y position of the flectrum in game world coordinates + * @param meter A graphic to use for the meter(bar)of the flectrum. Default null uses a solid fill rectangle. + * @param showBackground Display an alpha background behind the meters + * @param backgroundBeat Makes the alpha background pulsate in time to the music + * @param columns The number of columns in the flectrum + * @param columnSize The width of each column in pixels - if you use your own meter graphic this value is ignored + * @param columnSpacing The spacing in pixels between each column(meter)of the flectrum + * @param rows The number of rows in the flectrum + * @param rowSize The height of each row. Overall flectrum height is rowSize + rowSpacing * rows - if you use your own meter graphic this value is ignored + * @param rowSpacing The spacing in pixels between each row of the flectrum - if you use your own meter graphic this value is ignored + * + * @return The FlxFlectrum instance for further modification. Also available via FlxFlod.flectrum + */ + public static function createFlectrum(x:Int, y:Int, meter:Class=null, showBackground:Bool=false, backgroundBeat:Bool=false, columns:Int=15, columnSize:Int=10, columnSpacing:Int=0, rows:Int=32, rowSize:Int=3, rowSpacing:Int=0):FlxFlectrum + { + flectrum=new FlxFlectrum(); + + flectrum.init(x, y, sound, columns, columnSize, columnSpacing, rows, rowSize, rowSpacing); + + if(meter) + { + flectrum.useBitmap(meter); + } + + flectrum.showBackground=showBackground; + flectrum.backgroundBeat=backgroundBeat; + + return flectrum; + } + + /** + * Pauses playback of this module, if started + */ + public static function pause():Void + { + if(processor) + { + processor.pause(); + } + } + + /** + * Resumes playback of this module if paused + */ + public static function resume():Void + { + if(processor) + { + processor.resume(); + } + } + + /** + * Stops playback of this module, if started + */ + public static function stopMod():Void + { + if(processor) + { + processor.stop(); + } + } + + /** + * Toggles playback mute + */ + public static var mute(null, set_mute):Bool; + private function set_mute(Mute:Bool):Void + { + if(processor) + { + if(Mute) + { + if(processor.soundChannel) + { + soundform.volume=0; + processor.soundChannel.soundTransform=soundform; + } + } + else + { + if(processor.soundChannel) + { + soundform.volume=FlxG.volume; + processor.soundChannel.soundTransform=soundform; + } + } + } + } + + /** + * Called by FlxG when the volume is adjusted in-game + * + * @param Volume + */ + public static function updateVolume(Volume:Float):Void + { + volume=Volume; + } + + /** + * Sets the playback volume directly(usually controlled by FlxG.volume) + */ + public static var volume(null, set_volume):Float; + private function set_volume(Volume:Float):Void + { + if(processor) + { + if(processor.soundChannel) + { + soundform.volume=Volume; + processor.soundChannel.soundTransform=soundform; + } + } + } + + /** + * Is a tune already playing? + */ + public static var isPlaying(get_isPlaying, set_isPlaying):Bool; + private function get_isPlaying():Bool + { + if(processor) + { + return processor.isPlaying; + } + else + { + return false; + } + } + + /** + * Is a tune paused? + */ + public static var isPaused(get_isPaused, set_isPaused):Bool; + private function get_isPaused():Bool + { + if(processor) + { + return processor.isPaused; + } + else + { + return false; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxGradient.hx b/intra/source/org/flixel/plugin/photonstorm/FlxGradient.hx new file mode 100644 index 0000000..023e4cd --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxGradient.hx @@ -0,0 +1,251 @@ +/** + * FlxGradient + * -- Part of the Flixel Power Tools set + * + * v1.6 Fixed bug where gradients with chunk sizes>1 would ignore alpha values + * v1.5 Alpha values used in the gradient map + * v1.4 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - May 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Requires FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +import flash.display.Bitmap; +import flash.geom.Matrix; +import flash.display.BitmapData; +import flash.display.Shape; +import flash.display.GradientType; +import flash.display.SpreadMethod; +import flash.display.InterpolationMethod; + +/** + * Adds a set of color gradient creation / rendering functions + */ +class FlxGradient +{ + + public function new() + { + } + + public static function createGradientMatrix(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90):Dynamic + { + var gradientMatrix:Matrix=new Matrix(); + + // Rotation(in radians)that the gradient is rotated + var rot:Float=FlxMath.asRadians(rotation); + + // Last 2 values=horizontal and vertical shift(in pixels) + if(chunkSize==1) + { + gradientMatrix.createGradientBox(width, height, rot, 0, 0); + } + else + { + gradientMatrix.createGradientBox(width, height / chunkSize, rot, 0, 0); + } + + // Create the alpha and ratio arrays + + var alpha:Array=new Array(); + + for(ai in 0...colors.length) + { + alpha.push(FlxColor.getAlphaFloat(colors[ai])); + } + + var ratio:Array=new Array(); + + if(colors.length==2) + { + ratio[0]=0; + ratio[1]=255; + } + else + { + // Spread value + var spread:Int=255 /(colors.length - 1); + + ratio.push(0); + + for(var ri:Int=1;ri=new Array(); + + for(y in 0...data.height) + { + result.push(data.getPixel32(0, y)); + } + + return result; + } + + /** + * Creates an FlxSprite of the given width/height with a colour gradient flowing through it. + * + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * + * @return An FlxSprite containing your gradient(if valid parameters given!) + */ + public static function createGradientFlxSprite(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):FlxSprite + { + var data:BitmapData=createGradientBitmapData(width, height, colors, chunkSize, rotation, Interpolate); + + var dest:FlxSprite=new FlxSprite().makeGraphic(width, height); + + dest.pixels=data; + + return dest; + } + + public static function createGradientBitmapData(width:Int, height:Int, colors:Array, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):BitmapData + { + // Sanity checks + if(width<1) + { + width=1; + } + + if(height<1) + { + height=1; + } + + var gradient:Dynamic=createGradientMatrix(width, height, colors, chunkSize, rotation); + + var s:Shape=new Shape(); + + if(interpolate) + { + s.graphics.beginGradientFill(GradientType.LINEAR, colors, gradient.alpha, gradient.ratio, gradient.matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0); + } + else + { + s.graphics.beginGradientFill(GradientType.LINEAR, colors, gradient.alpha, gradient.ratio, gradient.matrix, SpreadMethod.PAD, InterpolationMethod.LINEAR_RGB, 0); + } + + if(chunkSize==1) + { + s.graphics.drawRect(0, 0, width, height); + } + else + { + s.graphics.drawRect(0, 0, width, height / chunkSize); + } + + var data:BitmapData=new BitmapData(width, height, true, 0x0); + + if(chunkSize==1) + { + data.draw(s); + } + else + { + var tempBitmap:Bitmap=new Bitmap(new BitmapData(width, height / chunkSize, true, 0x0)); + tempBitmap.bitmapData.draw(s); + tempBitmap.scaleY=chunkSize; + + var sM:Matrix=new Matrix(); + sM.scale(tempBitmap.scaleX, tempBitmap.scaleY); + + data.draw(tempBitmap, sM); + } + + return data; + } + + /** + * Creates a new gradient and overlays that on-top of the given FlxSprite at the destX/destY coordinates(default 0,0)
+ * Use low alpha values in the colours to have the gradient overlay and not destroy the image below + * + * @param dest The FlxSprite to overlay the gradient onto + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param destX The X offset the gradient is drawn at(default 0) + * @param destY The Y offset the gradient is drawn at(default 0) + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * @return The composited FlxSprite(for chaining, if you need) + */ + public static function overlayGradientOnFlxSprite(dest:FlxSprite, width:Int, height:Int, colors:Array, destX:Int=0, destY:Int=0, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):FlxSprite + { + if(width>dest.width) + { + width=dest.width; + } + + if(height>dest.height) + { + height=dest.height; + } + + var source:FlxSprite=createGradientFlxSprite(width, height, colors, chunkSize, rotation, Interpolate); + + dest.stamp(source, destX, destY); + + return dest; + } + + /** + * Creates a new gradient and overlays that on-top of the given BitmapData at the destX/destY coordinates(default 0,0)
+ * Use low alpha values in the colours to have the gradient overlay and not destroy the image below + * + * @param dest The BitmapData to overlay the gradient onto + * @param width The width of the FlxSprite(and therefore gradient) + * @param height The height of the FlxSprite(and therefore gradient) + * @param colors An array of colour values for the gradient to cycle through + * @param destX The X offset the gradient is drawn at(default 0) + * @param destY The Y offset the gradient is drawn at(default 0) + * @param chunkSize If you want a more old-skool looking chunky gradient, increase this value! + * @param rotation Angle of the gradient in degrees. 90=top to bottom, 180=left to right. Any angle is valid + * @param interpolate Interpolate the colours? True uses RGB Interpolation, false uses linear RGB + * @return The composited BitmapData + */ + public static function overlayGradientOnBitmapData(dest:BitmapData, width:Int, height:Int, colors:Array, destX:Int=0, destY:Int=0, chunkSize:Int=1, rotation:Int=90, Interpolate:Bool=true):BitmapData + { + if(width>dest.width) + { + width=dest.width; + } + + if(height>dest.height) + { + height=dest.height; + } + + var source:BitmapData=createGradientBitmapData(width, height, colors, chunkSize, rotation, Interpolate); + + dest.copyPixels(source, new Rectangle(0, 0, source.width, source.height), new Point(destX, destY), null, null, true); + + return dest; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxGridOverlay.hx b/intra/source/org/flixel/plugin/photonstorm/FlxGridOverlay.hx new file mode 100644 index 0000000..d80b8d5 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxGridOverlay.hx @@ -0,0 +1,186 @@ +/** + * FlxGridOverlay + * -- Part of the Flixel Power Tools set + * + * v1.1 Updated for the Flixel 2.5 Plugin system + * + * @version 1.1 - April 23rd 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import org.flixel.*; + +class FlxGridOverlay +{ + public function new() + { + } + + /** + * Creates an FlxSprite of the given width and height filled with a checkerboard pattern.
+ * Each grid cell is the specified width and height, and alternates between two colors.
+ * If alternate is true each row of the pattern will be offset, for a proper checkerboard style. If false each row will be the same colour, creating a striped-pattern effect.
+ * So to create an 8x8 grid you'd call create(8,8) + * + * @param cellWidth The grid cell width + * @param cellHeight The grid cell height + * @param width The width of the FlxSprite. If -1 it will be the size of the game(FlxG.width) + * @param height The height of the FlxSprite. If -1 it will be the size of the game(FlxG.height) + * @param addLegend TODO + * @param alternate Should the pattern alternate on each new row? Default true=checkerboard effect. False=vertical stripes + * @param color1 The first fill colour in 0xAARRGGBB format + * @param color2 The second fill colour in 0xAARRGGBB format + * + * @return FlxSprite of given width/height + */ + public static function create(cellWidth:Int, cellHeight:Int, width:Int=-1, height:Int=-1, addLegend:Bool=false, alternate:Bool=true, color1:Int=0xffe7e6e6, color2:Int=0xffd9d5d5):FlxSprite + { + if(width==-1) + { + width=FlxG.width; + } + + if(height==-1) + { + height=FlxG.height; + } + + if(width + * Each grid cell is the specified width and height, and alternates between two colors.
+ * If alternate is true each row of the pattern will be offset, for a proper checkerboard style. If false each row will be the same colour, creating a striped-pattern effect.
+ * So to create an 8x8 grid you'd call create(8,8, + * + * @param source The FlxSprite you wish to draw the grid on-top of. This updates its pixels value, not just the current frame(don't use animated sprites!) + * @param cellWidth The grid cell width + * @param cellHeight The grid cell height + * @param width The width of the FlxSprite. If -1 it will be the size of the game(FlxG.width) + * @param height The height of the FlxSprite. If -1 it will be the size of the game(FlxG.height) + * @param addLegend TODO + * @param alternate Should the pattern alternate on each new row? Default true=checkerboard effect. False=vertical stripes + * @param color1 The first fill colour in 0xAARRGGBB format + * @param color2 The second fill colour in 0xAARRGGBB format + * + * @return The modified source FlxSprite + */ + public static function overlay(source:FlxSprite, cellWidth:Int, cellHeight:Int, width:Int=-1, height:Int=-1, addLegend:Bool=false, alternate:Bool=true, color1:Int=0x88e7e6e6, color2:Int=0x88d9d5d5):FlxSprite + { + if(width==-1) + { + width=FlxG.width; + } + + if(height==-1) + { + height=FlxG.height; + } + + if(widthsource.width) + { + throw Dynamic("cellWidth larger than FlxSprites width"); + return source; + } + + if(cellHeight>source.height) + { + throw Dynamic("cellHeight larger than FlxSprites height"); + return source; + } + + if(source.width0 && lastColor==rowColor && alternate) + { + (lastColor==color1)? lastColor=color2:lastColor=color1; + } + else if(y>0 && lastColor !=rowColor && alternate==false) + { + (lastColor==color2)? lastColor=color1:lastColor=color2; + } + + for(x in 0...width +=cellWidth) + { + if(x==0) + { + rowColor=lastColor; + } + + grid.fillRect(new Rectangle(x, y, cellWidth, cellHeight), lastColor); + + if(lastColor==color1) + { + lastColor=color2; + } + else + { + lastColor=color1; + } + } + } + + return grid; + } + + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx b/intra/source/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx new file mode 100644 index 0000000..827f1c8 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxLinkedGroup.hx @@ -0,0 +1,33 @@ +package org.flixel.plugin.photonstorm +{ +import org.flixel.FlxGroup; +import org.flixel.FlxSprite; +import flash.utils.getTimer; + +class FlxLinkedGroup extends FlxGroup +{ + //private var queue + + + public function new(MaxSize:Int=0) + { + super(MaxSize); + } + + public function addX(newX:Int):Void + { + for(var s:FlxSprite in members) + { + s.x +=newX; + } + } + + public function angle(newX:Int):Void + { + for(var s:FlxSprite in members) + { + s.angle +=newX; + } + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxMath.hx b/intra/source/org/flixel/plugin/photonstorm/FlxMath.hx new file mode 100644 index 0000000..bd29d36 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxMath.hx @@ -0,0 +1,609 @@ +/** + * FlxMath + * -- Part of the Flixel Power Tools set + * + * v1.7 Added mouseInFlxRect + * v1.6 Added wrapAngle, angleLimit and more documentation + * v1.5 Added pointInCoordinates, pointInFlxRect and pointInRectangle + * v1.4 Updated for the Flixel 2.5 Plugin system + * + * @version 1.7 - June 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.geom.Rectangle; + +import org.flixel.*; + +/** + * Adds a set of fast Math functions and extends a few commonly used ones + */ +class FlxMath +{ + public static var getrandmax:Int=int.MAX_VALUE; + private static var mr:Int=0; + private static var cosTable:Array=new Array; + private static var sinTable:Array=new Array; + + private static var coefficient1:Float=Math.PI / 4; + private static inline var RADTODEG:Float=180 / Math.PI; + private static inline var DEGTORAD:Float=Math.PI / 180; + + public function new() + { + } + + /** + * Returns true if the given x/y coordinate is within the given rectangular block + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rectX The X value of the region to test within + * @param rectY The Y value of the region to test within + * @param rectWidth The width of the region to test within + * @param rectHeight The height of the region to test within + * + * @return true if pointX/pointY is within the region, otherwise false + */ + public static function pointInCoordinates(pointX:Int, pointY:Int, rectX:Int, rectY:Int, rectWidth:Int, rectHeight:Int):Bool + { + if(pointX>=rectX && pointX<=(rectX + rectWidth)) + { + if(pointY>=rectY && pointY<=(rectY + rectHeight)) + { + return true; + } + } + + return false; + } + + /** + * Returns true if the given x/y coordinate is within the given rectangular block + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rect The FlxRect to test within + * @return true if pointX/pointY is within the FlxRect, otherwise false + */ + public static function pointInFlxRect(pointX:Int, pointY:Int, rect:FlxRect):Bool + { + if(pointX>=rect.x && pointX<=rect.right && pointY>=rect.y && pointY<=rect.bottom) + { + return true; + } + + return false; + } + + /** + * Returns true if the mouse world x/y coordinate are within the given rectangular block + * + * @param useWorldCoords If true the world x/y coordinates of the mouse will be used, otherwise screen x/y + * @param rect The FlxRect to test within. If this is null for any reason this function always returns true. + * + * @return true if mouse is within the FlxRect, otherwise false + */ + public static function mouseInFlxRect(useWorldCoords:Bool, rect:FlxRect):Bool + { + if(rect==null) + { + return true; + } + + if(useWorldCoords) + { + return pointInFlxRect(FlxG.mouse.x, FlxG.mouse.y, rect); + } + else + { + return pointInFlxRect(FlxG.mouse.screenX, FlxG.mouse.screenY, rect); + } + } + + /** + * Returns true if the given x/y coordinate is within the Rectangle + * + * @param pointX The X value to test + * @param pointY The Y value to test + * @param rect The Rectangle to test within + * @return true if pointX/pointY is within the Rectangle, otherwise false + */ + public static function pointInRectangle(pointX:Int, pointY:Int, rect:Rectangle):Bool + { + if(pointX>=rect.x && pointX<=rect.right && pointY>=rect.y && pointY<=rect.bottom) + { + return true; + } + + return false; + } + + /** + * A faster(but much less accurate)version of Math.atan2(). For close range / loose comparisons this works very well, + * but avoid for long-distance or high accuracy simulations. + * Based on:http://blog.gamingyourway.com/PermaLink,guid,78341247-3344-4a7a-acb2-c742742edbb1.aspx + *

+ * Computes and returns the angle of the point y/x in radians, when measured counterclockwise from a circle's x axis + *(where 0,0 represents the center of the circle). The return value is between positive pi and negative pi. + * Note that the first parameter to atan2 is always the y coordinate. + *

+ * @param y The y coordinate of the point + * @param x The x coordinate of the point + * @return The angle of the point x/y in radians + */ + public static function atan2(y:Float, x:Float):Float + { + var absY:Float=y; + var coefficient2:Float=3 * coefficient1; + var r:Float; + var angle:Float; + + if(absY<0) + { + absY=-absY; + } + + if(x>=0) + { + r=(x - absY)/(x + absY); + angle=coefficient1 - coefficient1 * r; + } + else + { + r=(x + absY)/(absY - x); + angle=coefficient2 - coefficient1 * r; + } + + return y<0 ? -angle:angle; + } + + /** + * Generate a sine and cosine table simultaneously and extremely quickly. Based on research by Franky of scene.at + *

+ * The parameters allow you to specify the length, amplitude and frequency of the wave. Once you have called this function + * you should get the results via getSinTable()and getCosTable(). This generator is fast enough to be used in real-time. + *

+ * @param length The length of the wave + * @param sinAmplitude The amplitude to apply to the sine table(default 1.0)if you need values between say -+ 125 then give 125 as the value + * @param cosAmplitude The amplitude to apply to the cosine table(default 1.0)if you need values between say -+ 125 then give 125 as the value + * @param frequency The frequency of the sine and cosine table data + * @return Returns the sine table + * @see getSinTable + * @see getCosTable + */ + public static function sinCosGenerator(length:Int, sinAmplitude:Float=1.0, cosAmplitude:Float=1.0, frequency:Float=1.0):Array + { + var sin:Float=sinAmplitude; + var cos:Float=cosAmplitude; + var frq:Float=frequency * Math.PI / length; + + cosTable=new Array(); + sinTable=new Array(); + + for(c in 0...length) + { + cos -=sin * frq; + sin +=cos * frq; + + cosTable[c]=cos; + sinTable[c]=sin; + } + + return sinTable; + } + + /** + * Returns the sine table generated by sinCosGenerator(), or an empty array object if not yet populated + * @return Array of sine wave data + * @see sinCosGenerator + */ + public static function getSinTable():Array + { + return sinTable; + } + + /** + * Returns the cosine table generated by sinCosGenerator(), or an empty array object if not yet populated + * @return Array of cosine wave data + * @see sinCosGenerator + */ + public static function getCosTable():Array + { + return cosTable; + } + + /** + * A faster version of Math.sqrt + *

+ * Computes and returns the square root of the specified number. + *

+ * @link http://osflash.org/as3_speed_optimizations#as3_speed_tests + * @param val A number greater than or equal to 0 + * @return If the parameter val is greater than or equal to zero, a number;otherwise NaN(not a number). + */ + public static function sqrt(val:Float):Float + { + if(isNaN(val)) + { + return NaN; + } + + var thresh:Float=0.002; + var b:Float=val * 0.25; + var a:Float; + var c:Float; + + if(val==0) + { + return 0; + } + + do { + c=val / b; + b=(b + c)* 0.5; + a=b - c; + if(a<0)a=-a; + } + while(a>thresh); + + return b; + } + + /** + * Generates a small random number between 0 and 65535 very quickly + *

+ * Generates a small random number between 0 and 65535 using an extremely fast cyclical generator, + * with an even spread of numbers. After the 65536th call to this function the value resets. + *

+ * @return A pseudo random value between 0 and 65536 inclusive. + */ + public static function miniRand():Int + { + var result:Int=mr; + + result++; + result *=75; + result %=65537; + result--; + + mr++; + + if(mr==65536) + { + mr=0; + } + + return result; + } + + /** + * Generate a random Integer + *

+ * If called without the optional min, max arguments rand()returns a peudo-random Integer between 0 and getrandmax(). + * If you want a random number between 5 and 15, for example,(inclusive)use rand(5, 15) + * Parameter order is insignificant, the return will always be between the lowest and highest value. + *

+ * @param min The lowest value to return(default:0) + * @param max The highest value to return(default:getrandmax) + * @param excludes An Array of Integers that will NOT be returned(default:null) + * @return A pseudo-random value between min(or 0)and max(or getrandmax, inclusive) + */ + public static function rand(min:Float=NaN, max:Float=NaN, excludes:Array=null):Int + { + if(isNaN(min)) + { + min=0; + } + + if(isNaN(max)) + { + max=getrandmax; + } + + if(min==max) + { + return min; + } + + if(excludes !=null) + { + // Sort the exclusion array + excludes.sort(Array.NUMERIC); + + var result:Int; + + do { + if(min=0); + + return result; + } + else + { + // Reverse check + if(min + * If called without the optional min, max arguments rand()returns a peudo-random float between 0 and getrandmax(). + * If you want a random number between 5 and 15, for example,(inclusive)use rand(5, 15) + * Parameter order is insignificant, the return will always be between the lowest and highest value. + *

+ * @param min The lowest value to return(default:0) + * @param max The highest value to return(default:getrandmax) + * @return A pseudo random value between min(or 0)and max(or getrandmax, inclusive) + */ + public static function randFloat(min:Float=NaN, max:Float=NaN):Float + { + if(isNaN(min)) + { + min=0; + } + + if(isNaN(max)) + { + max=getrandmax; + } + + if(min==max) + { + return min; + } + else if(min + * Returns true or false based on the chance value(default 50%). For example if you wanted a player to have a 30% chance + * of getting a bonus, call chanceRoll(30)- true means the chance passed, false means it failed. + *

+ * @param chance The chance of receiving the value. Should be given as a Int between 0 and 100(effectively 0% to 100%) + * @return true if the roll passed, or false + */ + public static function chanceRoll(chance:Int=50):Bool + { + if(chance<=0) + { + return false; + } + else if(chance>=100) + { + return true; + } + else + { + if(Math.random()* 100>=chance) + { + return false; + } + else + { + return true; + } + } + } + + /** + * Adds the given amount to the value, but never lets the value go over the specified maximum + * + * @param value The value to add the amount to + * @param amount The amount to add to the value + * @param max The maximum the value is allowed to be + * @return The new value + */ + public static function maxAdd(value:Int, amount:Int, max:Int):Int + { + value +=amount; + + if(value>max) + { + value=max; + } + + return value; + } + + /** + * Adds value to amount and ensures that the result always stays between 0 and max, by wrapping the value around. + *

Values must be positive Integers, and are passed through Math.abs

+ * + * @param value The value to add the amount to + * @param amount The amount to add to the value + * @param max The maximum the value is allowed to be + * @return The wrapped value + */ + public static function wrapValue(value:Int, amount:Int, max:Int):Int + { + var diff:Int; + + value=Math.abs(value); + amount=Math.abs(amount); + max=Math.abs(max); + + diff=(value + amount)% max; + + return diff; + } + + /** + * Finds the length of the given vector + * + * @param dx + * @param dy + * + * @return + */ + public static function vectorLength(dx:Float, dy:Float):Float + { + return Math.sqrt(dx * dx + dy * dy); + } + + /** + * Finds the dot product value of two vectors + * + * @param ax Vector X + * @param ay Vector Y + * @param bx Vector X + * @param by Vector Y + * + * @return Dot product + */ + public static function dotProduct(ax:Float, ay:Float, bx:Float, by:Float):Float + { + return ax * bx + ay * by; + } + + /** + * Randomly returns either a 1 or -1 + * + * @return 1 or -1 + */ + public static function randomSign():Float + { + return(Math.random()>0.5)? 1:-1; + } + + /** + * Returns true if the number given is odd. + * + * @param n The number to check + * + * @return True if the given number is odd. False if the given number is even. + */ + public static function isOdd(n:Float):Bool + { + if(n & 1) + { + return true; + } + else + { + return false; + } + } + + /** + * Returns true if the number given is even. + * + * @param n The number to check + * + * @return True if the given number is even. False if the given number is odd. + */ + public static function isEven(n:Float):Bool + { + if(n & 1) + { + return false; + } + else + { + return true; + } + } + + /** + * Keeps an angle value between -180 and +180
+ * Should be called whenever the angle is updated on the FlxSprite to stop it from going insane. + * + * @param angle The angle value to check + * + * @return The new angle value, returns the same as the input angle if it was within bounds + */ + public static function wrapAngle(angle:Float):Int + { + var result:Int=Std.int(angle); + + if(angle>180) + { + result=-180; + } + else if(angle<-180) + { + result=180; + } + + return result; + } + + /** + * Keeps an angle value between the given min and max values + * + * @param angle The angle value to check. Must be between -180 and +180 + * @param min The minimum angle that is allowed(must be -180 or greater) + * @param max The maximum angle that is allowed(must be 180 or less) + * + * @return The new angle value, returns the same as the input angle if it was within bounds + */ + public static function angleLimit(angle:Int, min:Int, max:Int):Int + { + var result:Int=angle; + + if(angle>max) + { + result=max; + } + else if(angle + * Converts the radians value Into degrees and returns + *

+ * @param radians The value in radians + * @return Float Degrees + */ + public static function asDegrees(radians:Float):Float + { + return radians * RADTODEG; + } + + /** + * Converts a Degrees value Into a Radian + *

+ * Converts the degrees value Into radians and returns + *

+ * @param degrees The value in degrees + * @return Float Radians + */ + public static function asRadians(degrees:Float):Float + { + return degrees * DEGTORAD; + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxMouseControl.hx b/intra/source/org/flixel/plugin/photonstorm/FlxMouseControl.hx new file mode 100644 index 0000000..3d75e97 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxMouseControl.hx @@ -0,0 +1,270 @@ +/** + * FlxMouseControl + * -- Part of the Flixel Power Tools set + * + * v1.2 Added Mouse Zone, Mouse Speed and refactored addToStack process + * v1.1 Moved to a native plugin + * v1.0 First release + * + * @version 1.2 - July 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; + +class FlxMouseControl extends FlxBasic +{ + /** + * Use withsort()to sort in ascending order. + */ + public static inline var ASCENDING:Int=-1; + + /** + * Use withsort()to sort in descending order. + */ + public static inline var DESCENDING:Int=1; + + /** + * The value that the FlxExtendedSprites are sorted by before deciding which is "on-top" for click select + */ + public static var sortIndex:String="y"; + + /** + * The sorting order. If the sortIndex is "y" and the order is ASCENDING then a sprite with a Y value of 200 would be "on-top" of one with a Y value of 100. + */ + public static var sortOrder:Int=ASCENDING; + + /** + * Is the mouse currently dragging a sprite? If you have just clicked but NOT yet moved the mouse then this might return false. + */ + public static var isDragging:Bool=false; + + /** + * The FlxExtendedSprite that is currently being dragged, if any. + */ + public static var dragTarget:FlxExtendedSprite; + + /** + * The FlxExtendedSprite that currently has the mouse button pressed on it + */ + public static var clickTarget:FlxExtendedSprite; + private static var clickStack:Array=new Array; + private static var clickCoords:FlxPoint; + private static var hasClickTarget:Bool=false; + + private static var oldX:Int; + private static var oldY:Int; + + /** + * The speed the mouse is moving on the X axis in pixels per frame + */ + public static var speedX:Int; + + /** + * The speed the mouse is moving on the Y axis in pixels per frame + */ + public static var speedY:Int; + + /** + * The mouse can be set to only be active within a specific FlxRect region of the game world. + * If outside this FlxRect no clicks, drags or throws will be processed. + * If the mouse leaves this region while still dragging then the sprite is automatically dropped and its release handler is called. + * Set the FlxRect to null to disable the zone. + */ + public static var mouseZone:FlxRect; + + /** + * Instead of using a mouseZone(Std.is(which, calculated) in world coordinates)you can limit the mouse to the FlxG.camera.deadzone area instead. + * If set to true the mouse will use the camera deadzone. If false(or the deadzone is null)no check will take place. + * Note that this takes priority over the mouseZone above. If the mouseZone and deadzone are set, the deadzone is used. + */ + public static var linkToDeadZone:Bool=false; + + public function new() + { + } + + /** + * Adds the given FlxExtendedSprite to the stack of potential sprites that were clicked, the stack is then sorted and the final sprite is selected from that + * + * @param item The FlxExtendedSprite that was clicked by the mouse + */ + public static function addToStack(item:FlxExtendedSprite):Void + { + if(Std.is(mouseZone, FlxRect)) + { + if(FlxMath.pointInFlxRect(FlxG.mouse.x, FlxG.mouse.y, mouseZone)==true) + { + clickStack.push(item); + } + } + else + { + clickStack.push(item); + } + } + + /** + * Main Update Loop - checks mouse status and updates FlxExtendedSprites accordingly + */ + override public function update():Void + { + // Update mouse speed + speedX=FlxG.mouse.screenX - oldX; + speedY=FlxG.mouse.screenY - oldY; + + oldX=FlxG.mouse.screenX; + oldY=FlxG.mouse.screenY; + + // Is the mouse currently pressed down on a target? + if(hasClickTarget) + { + if(FlxG.mouse.pressed()) + { + // Has the mouse moved? If so then we're candidate for a drag + if(isDragging==false && clickTarget.draggable &&(clickCoords.x !=FlxG.mouse.x || clickCoords.y !=FlxG.mouse.y)) + { + // Drag on + isDragging=true; + + dragTarget=clickTarget; + + dragTarget.startDrag(); + } + } + else + { + releaseMouse(); + } + + if(linkToDeadZone) + { + if(FlxMath.mouseInFlxRect(false, FlxG.camera.deadzone)==false) + { + releaseMouse(); + } + } + else if(FlxMath.mouseInFlxRect(true, mouseZone)==false) + { + // Is a mouse zone enabled? In which case check if we're still in it + releaseMouse(); + } + } + else + { + // No target, but is the mouse down? + + if(FlxG.mouse.justPressed()) + { + clickStack.length=0; + } + + // If you are wondering how the brand new array can have anything in it by now, it's because FlxExtendedSprite + // adds itself to the clickStack + + if(FlxG.mouse.pressed()&& clickStack.length>0) + { + assignClickedSprite(); + } + } + } + + /** + * Internal function used to release the click / drag targets and reset the mouse state + */ + private function releaseMouse():Void + { + // Mouse is no longer down, so tell the click target it's free - this will also stop dragging if happening + clickTarget.mouseReleasedHandler(); + + hasClickTarget=false; + clickTarget=null; + + isDragging=false; + dragTarget=null; + } + + /** + * Once the clickStack is created this sorts it and then picks the sprite with the highest priority(based on sortIndex and sortOrder) + */ + private function assignClickedSprite():Void + { + // If there is more than one potential target then sort them + if(clickStack.length>1) + { + clickStack.sort(sortHandler); + } + + clickTarget=clickStack.pop(); + + clickCoords=clickTarget.point; + + hasClickTarget=true; + + clickTarget.mousePressedHandler(); + + clickStack.length=0; + } + + /** + * Helper function for the sort process. + * + * @param item1 The first object being sorted. + * @param item2 The second object being sorted. + * + * @return An Integer value:-1(item1 before item2), 0(same), or 1(item1 after item2) + */ + private function sortHandler(item1:FlxExtendedSprite, item2:FlxExtendedSprite):Int + { + if(item1[sortIndex]item2[sortIndex]) + { + return -sortOrder; + } + + return 0; + } + + /** + * Removes all references to any click / drag targets and resets this class + */ + public static function clear():Void + { + hasClickTarget=false; + + if(clickTarget) + { + clickTarget.mouseReleasedHandler(); + } + + clickTarget=null; + + isDragging=false; + + if(dragTarget) + { + dragTarget.stopDrag(); + } + + speedX=0; + speedY=0; + dragTarget=null; + mouseZone=null; + linkToDeadZone=false; + } + + /** + * Runs when this plugin is destroyed + */ + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxPowerTools.hx b/intra/source/org/flixel/plugin/photonstorm/FlxPowerTools.hx new file mode 100644 index 0000000..c3dd1f5 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxPowerTools.hx @@ -0,0 +1,23 @@ +/** + * Flixel Power Tools + * + * Version information and constants the other classes in this package can reference + * + * @version 1.9 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +class FlxPowerTools +{ + public static inline var LIBRARY_NAME:String="flixel power tools"; + public static inline var LIBRARY_MAJOR_VERSION:Int=1; + public static inline var LIBRARY_MINOR_VERSION:Int=9; + + public function new() + { + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxScreenGrab.hx b/intra/source/org/flixel/plugin/photonstorm/FlxScreenGrab.hx new file mode 100644 index 0000000..1584a47 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxScreenGrab.hx @@ -0,0 +1,178 @@ +/** + * FlxScreenGrab + * -- Part of the Flixel Power Tools set + * + * v1.0 Updated for the Flixel 2.5 Plugin system + * + * @version 1.0 - April 28th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import flash.geom.Rectangle; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.geom.Matrix; +import flash.net.FileReference; +import flash.utils.ByteArray; +import flash.utils.getTimer; + +/** + * Captures a screen grab of the game and stores it locally, optionally saving as a PNG. + */ +class FlxScreenGrab extends FlxBasic +{ + public static var screenshot:Bitmap; + private static var hotkey:String=""; + private static var autoSave:Bool=false; + private static var autoHideMouse:Bool=false; + private static var region:Rectangle; + + public function new() + { + } + + /** + * Defines the region of the screen that should be captured. If you need it to be a fixed location then use this.
+ * If you want to grab the whole SWF size, you don't need to set this as that is the default.
+ * Remember that if your game is running in a zoom mode>1 you need to account for this here. + * + * @param x The x coordinate(in Flash display space, not Flixel game world) + * @param y The y coordinate(in Flash display space, not Flixel game world) + * @param width The width of the grab region + * @param height The height of the grab region + */ + public static function defineCaptureRegion(x:Int, y:Int, width:Int, height:Int):Void + { + region=new Rectangle(x, y, width, height); + } + + /** + * Clears a previously defined capture region + */ + public static function clearCaptureRegion():Void + { + region=null; + } + + /** + * Specify which key will capture a screen shot. Use the String value of the key in the same way FlxG.keys does(so "F1" for example)
+ * Optionally save the image to a file immediately. This uses the file systems "Save as" dialog window and pauses your game during the process.
+ * + * @param key String The key you press to capture the screen(i.e. "F1", "SPACE", etc - see system.input.Keyboard.as source for reference) + * @param saveToFile Boolean If set to true it will immediately encodes the grab to a PNG and open a "Save As" dialog window when the hotkey is pressed + * @param hideMouse Boolean If set to true the mouse will be hidden before capture and displayed afterwards when the hotkey is pressed + */ + public static function defineHotKey(key:String, saveToFile:Bool=false, hideMouse:Bool=false):Void + { + hotkey=key; + autoSave=saveToFile; + autoHideMouse=hideMouse; + } + + /** + * Clears a previously defined hotkey + */ + public static function clearHotKey():Void + { + hotkey=""; + autoSave=false; + autoHideMouse=false; + } + + /** + * Takes a screen grab immediately of the given region or a previously defined region + * + * @param captureRegion A Rectangle area to capture. This over-rides that set by "defineCaptureRegion". If neither are set the full SWF size is used. + * @param saveToFile Boolean If set to true it will immediately encode the grab to a PNG and open a "Save As" dialog window + * @param hideMouse Boolean If set to true the mouse will be hidden before capture and displayed again afterwards + * @return Bitmap The screen grab as a Flash Bitmap image + */ + public static function grab(captureRegion:Rectangle=null, saveToFile:Bool=false, hideMouse:Bool=false):Bitmap + { + var bounds:Rectangle; + + if(captureRegion) + { + bounds=new Rectangle(captureRegion.x, captureRegion.y, captureRegion.width, captureRegion.height); + } + else if(region) + { + bounds=new Rectangle(region.x, region.y, region.width, region.height); + } + else + { + bounds=new Rectangle(0, 0, FlxG.stage.stageWidth, FlxG.stage.stageHeight); + } + + var theBitmap:Bitmap=new Bitmap(new BitmapData(bounds.width, bounds.height, true, 0x0)); + + var m:Matrix=new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y); + + if(autoHideMouse || hideMouse) + { + FlxG.mouse.hide(); + } + + theBitmap.bitmapData.draw(FlxG.stage, m); + + if(autoHideMouse || hideMouse) + { + FlxG.mouse.show(); + } + + screenshot=theBitmap; + + if(saveToFile || autoSave) + { + save(); + } + + return theBitmap; + } + + private static function save(filename:String=""):Void + { + if(screenshot.bitmapData==null) + { + return; + } + + var png:ByteArray=PNGEncoder.encode(screenshot.bitmapData); + + var file:FileReference=new FileReference(); + + if(filename=="") + { + filename="grab" + getTimer().toString()+ ".png"; + } + else if(filename.substr(-4)!=".png") + { + filename=filename.concat(".png"); + } + + file.save(png, filename); + } + + override public function update():Void + { + if(hotkey !="") + { + if(FlxG.keys.justReleased(hotkey)) + { + trace("key pressed"); + grab(); + } + } + } + + override public function destroy():Void + { + clearCaptureRegion(); + clearHotKey(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxScrollZone.hx b/intra/source/org/flixel/plugin/photonstorm/FlxScrollZone.hx new file mode 100644 index 0000000..4d39c3d --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxScrollZone.hx @@ -0,0 +1,257 @@ +/** + * FlxScrollZone + * -- Part of the Flixel Power Tools set + * + * v1.4 Added "clearRegion" support for when you use Sprites with transparency and renamed parameter to onlyScrollOnscreen + * v1.3 Swapped plugin update for draw, now smoother / faster in some fps cases + * v1.2 Updated for the Flixel 2.5 Plugin system + * + * @version 1.4 - May 16th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm. My thanks to Ralph Hauwert for help with this. +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import org.flixel.*; + +/** + * FlxScrollZone allows you to scroll the content of an FlxSprites bitmapData in any direction you like. + */ +class FlxScrollZone extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + private static var zeroPoint:Point=new Point; + + public function new() + { + } + + /** + * Add an FlxSprite to the Scroll Manager, setting up one scrolling region.
+ * To add extra scrolling regions on the same sprite use addZone() + * + * @param source The FlxSprite to apply the scroll to + * @param region The region, specified as a Rectangle, of the FlxSprite that you wish to scroll + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param onlyScrollOnscreen Only update this FlxSprite if visible onScreen(default true)Saves performance by not scrolling offscreen sprites, but this isn't always desirable + * @param clearRegion Set to true if you want to clear the scrolling area of the FlxSprite with a 100% transparent fill before applying the scroll texture(default false) + * @see createZone + */ + public static function add(source:FlxSprite, region:Rectangle, distanceX:Float, distanceY:Float, onlyScrollOnscreen:Bool=true, clearRegion:Bool=false):Void + { + if(members[source]) + { + throw Dynamic("FlxSprite already exists in FlxScrollZone, use addZone to add a new scrolling region to an already added FlxSprite"); + } + + var data:Dynamic=new Dynamic(); + + data.source=source; + data.scrolling=true; + data.onlyScrollOnscreen=onlyScrollOnscreen; + data.zones=new Array; + + members[source]=data; + + createZone(source, region, distanceX, distanceY, clearRegion); + } + + /** + * Creates a new scrolling region to an FlxSprite already in the Scroll Manager(see add())
+ * + * @param source The FlxSprite to apply the scroll to + * @param region The region, specified as a Rectangle, of the FlxSprite that you wish to scroll + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param clearRegion Set to true if you want to fill the scroll region of the FlxSprite with a 100% transparent fill before scrolling it(default false) + */ + public static function createZone(source:FlxSprite, region:Rectangle, distanceX:Float, distanceY:Float, clearRegion:Bool=false):Void + { + var texture:BitmapData=new BitmapData(region.width, region.height, true, 0x00000000); + texture.copyPixels(source.framePixels, region, zeroPoint, null, null, true); + + var data:Dynamic=new Dynamic(); + + data.buffer=new Sprite; + data.texture=texture; + data.region=region; + data.clearRegion=clearRegion; + data.distanceX=distanceX; + data.distanceY=distanceY; + data.scrollMatrix=new Matrix(); + data.drawMatrix=new Matrix(1, 0, 0, 1, region.x, region.y); + + members[source].zones.push(data); + } + + /** + * Sets the draw Matrix for the given FlxSprite scroll zone
+ * Warning:Modify this at your own risk! + * + * @param source The FlxSprite to set the draw matrix on + * @param matrix The Matrix to use during the scroll update draw + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + * @return Matrix The draw matrix used in the scroll update + */ + public static function updateDrawMatrix(source:FlxSprite, matrix:Matrix, zone:Int=0):Void + { + members[source].zones[zone].drawMatrix=matrix; + } + + /** + * Returns the draw Matrix for the given FlxSprite scroll zone + * + * @param source The FlxSprite to get the draw matrix from + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + * @return Matrix The draw matrix used in the scroll update + */ + public static function getDrawMatrix(source:FlxSprite, zone:Int=0):Matrix + { + return members[source].zones[zone].drawMatrix; + } + + /** + * Removes an FlxSprite and all of its scrolling zones. Note that it doesn't restore the sprite bitmapData. + * + * @param source The FlxSprite to remove all scrolling zones for. + * @return Boolean true if the FlxSprite was removed, otherwise false. + */ + public static function remove(source:FlxSprite):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FlxSprites, and all of their scrolling zones.
+ * This is called automatically if the plugin is ever destroyed. + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + delete members[obj.source]; + } + } + + /** + * Update the distance in pixels to scroll on the X axis. + * + * @param source The FlxSprite to apply the scroll to + * @param distanceX The distance in pixels you want to scroll on the X axis. Negative values scroll left. Positive scroll right. Floats allowed(0.5 would scroll at half speed) + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + */ + public static function updateX(source:FlxSprite, distanceX:Float, zone:Int=0):Void + { + members[source].zones[zone].distanceX=distanceX; + } + + /** + * Update the distance in pixels to scroll on the X axis. + * + * @param source The FlxSprite to apply the scroll to + * @param distanceY The distance in pixels you want to scroll on the Y axis. Negative values scroll up. Positive scroll down. Floats allowed(0.5 would scroll at half speed) + * @param zone If the FlxSprite has more than 1 scrolling zone, use this to target which zone to apply the update to(default 0) + */ + public static function updateY(source:FlxSprite, distanceY:Float, zone:Int=0):Void + { + members[source].zones[zone].distanceY=distanceY; + } + + /** + * Starts scrolling on the given FlxSprite. If no FlxSprite is given it starts scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to re-start it if you have stopped it via stopScrolling.
+ * + * @param source The FlxSprite to start scrolling on. If left as null it will start scrolling on all sprites. + */ + public static function startScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=true; + } + } + } + + /** + * Stops scrolling on the given FlxSprite. If no FlxSprite is given it stops scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to stop it.
+ * + * @param source The FlxSprite to stop scrolling on. If left as null it will stop scrolling on all sprites. + */ + public static function stopScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=false; + } + } + } + + override public function draw():Void + { + for(var obj:Dynamic in members) + { + if((obj.onlyScrollOnscreen==true && obj.source.onScreen())&& obj.scrolling==true && obj.source.exists) + { + scroll(obj); + } + } + } + + private function scroll(data:Dynamic):Void + { + // Loop through the scroll zones defined in this object + for(var zone:Dynamic in data.zones) + { + zone.scrollMatrix.tx +=zone.distanceX; + zone.scrollMatrix.ty +=zone.distanceY; + + zone.buffer.graphics.clear(); + zone.buffer.graphics.beginBitmapFill(zone.texture, zone.scrollMatrix, true, false); + zone.buffer.graphics.drawRect(0, 0, zone.region.width, zone.region.height); + zone.buffer.graphics.endFill(); + + if(zone.clearRegion) + { + data.source.pixels.fillRect(zone.region, 0x0); + } + + data.source.pixels.draw(zone.buffer, zone.drawMatrix); + } + + data.source.dirty=true; + } + + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxScrollingText.hx b/intra/source/org/flixel/plugin/photonstorm/FlxScrollingText.hx new file mode 100644 index 0000000..cedc389 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxScrollingText.hx @@ -0,0 +1,310 @@ +/** + * FlxScrollingText + * -- Part of the Flixel Power Tools set + * + * v1.0 First version released + * + * @version 1.0 - May 5th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.Dictionary; +import flash.utils.getTimer; + +import org.flixel.*; + +/** + * FlxScrollingText takes an FlxBitmapFont object and creates a horizontally scrolling FlxSprite from it + */ +class FlxScrollingText extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + private static var zeroPoint:Point=new Point; + + public function new() + { + } + + /** + * Adds an FlxBitmapFont to the Scrolling Text Manager and returns an FlxSprite which contains the text scroller in it.
+ * The FlxSprite will automatically update itself via this plugin, but can be treated as a normal FlxSprite in all other regards
+ * re:positioning, collision, rotation, etc. + * + * @param bitmapFont A pre-prepared FlxBitmapFont object(see the Test Suite examples for details on how this works) + * @param region A Rectangle that defines the size of the scrolling FlxSprite. The sprite will be placed at region.x/y and be region.width/height in size. + * @param pixels The number of pixels to scroll per step. For a smooth(but slow)scroll use low values. Keep the value proportional to the font width, so if the font width is 16 use a value like 1, 2, 4 or 8. + * @param steps How many steps should pass before the text is next scrolled? Default 0 means every step we scroll. Higher values slow things down. + * @param text The default text for your scrolling message. Can be changed in real-time via the addText method. + * @param onlyScrollOnscreen Only update the text scroller when this FlxSprite is visible on-screen? Default true. + * @param loopOnWrap When the scroller reaches the end of the given "text" should it wrap to the start? Default true. If false it will clear the screen then set itself to not update. + * + * @return An FlxSprite of size region.width/height, positioned at region.x/y, that auto-updates its contents while this plugin runs + */ + public static function add(bitmapFont:FlxBitmapFont, region:Rectangle, pixels:Int=1, steps:Int=0, text:String="FLIXEL ROCKS!", onlyScrollOnscreen:Bool=true, loopOnWrap:Bool=true):FlxSprite + { + var data:Dynamic=new Dynamic; + + // Sanity checks + if(pixels>bitmapFont.characterWidth) + { + pixels=bitmapFont.characterWidth; + } + + if(pixels==0) + { + pixels=1; + } + + if(text=="") + { + text=" "; + } + + data.bitmapFont=bitmapFont; + data.bitmapChar=FlxBitmapFont(data.bitmapFont).getCharacterAsBitmapData(text.charAt(0)); + data.charWidth=bitmapFont.characterWidth; + data.charHeight=bitmapFont.characterHeight; + data.shiftRect=new Rectangle(pixels, 0, region.width - pixels, region.height); + data.bufferRect=new Rectangle(0, 0, region.width, region.height); + data.slice=new Rectangle(0, 0, pixels, data.charHeight); + data.endPoint=new Point(region.width - pixels, 0); + data.x=0; + + data.sprite=new FlxSprite(region.x, region.y).makeGraphic(region.width, region.height, 0x0, true); + data.buffer=new BitmapData(region.width, region.height, true, 0x0); + + data.region=region; + data.step=steps; + data.maxStep=steps; + data.pixels=pixels; + data.clearCount=0; + data.clearDistance=region.width - pixels; + + data.text=text; + data.currentChar=0; + data.maxChar=text.length; + + data.wrap=loopOnWrap; + data.complete=false; + data.scrolling=true; + data.onScreenScroller=onlyScrollOnscreen; + + scroll(data); + + members[data.sprite]=data; + + return data.sprite; + } + + /** + * Adds or replaces the text in the given Text Scroller.
+ * Can be called while the scroller is still active. + * + * @param source The FlxSprite Text Scroller you wish to update(must have been added to FlxScrollingText via a call to add() + * @param text The text to add or update to the Scroller + * @param overwrite If true the given text will fully replace the previous scroller text. If false it will be appended to the end(default) + */ + public static function addText(source:FlxSprite, text:String, overwrite:Bool=false):Void + { + if(overwrite) + { + members[source].text=text; + } + else + { + members[source].text=Std.string(members[source].text).concat(text); + } + + members[source].maxChar=members[source].text.length; + } + + override public function draw():Void + { + for(var obj:Dynamic in members) + { + if(obj &&(obj.onScreenScroller==true && obj.sprite.onScreen())&& obj.scrolling==true && obj.sprite.exists) + { + scroll(obj); + } + } + } + + private static function scroll(data:Dynamic):Void + { + // Have we reached enough steps? + + if(data.maxStep>0 &&(data.step=data.charWidth) + { + // Get the next character + data.currentChar++; + + if(data.currentChar>data.maxChar) + { + // At the end of the text + if(data.wrap) + { + data.currentChar=0; + } + else + { + data.complete=true; + data.clearCount=0; + } + } + + if(data.complete==false) + { + data.bitmapChar=FlxBitmapFont(data.bitmapFont).getCharacterAsBitmapData(String(data.text).charAt(data.currentChar)); + data.x=0; + } + } + + if(data.complete==false) + { + data.slice.x=data.x; + } + } + else + { + data.clearCount +=data.pixels; + + // It's all over now + if(data.clearCount>=data.clearDistance) + { + // No point updating something that has since left the screen + data.scrolling=false; + } + } + + data.sprite.pixels=data.buffer.clone(); + data.sprite.dirty=true; + } + + /** + * Removes all FlxSprites
+ * This is called automatically if the plugin is destroyed, but should be called manually by you if you change States
+ * as all the FlxSprites will be destroyed by Flixel otherwise + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + delete members[obj.sprite]; + } + } + + /** + * Starts scrolling on the given FlxSprite. If no FlxSprite is given it starts scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to re-start it if you have stopped it via stopScrolling.
+ * + * @param source The FlxSprite to start scrolling on. If left as null it will start scrolling on all sprites. + */ + public static function startScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=true; + } + } + } + + /** + * Stops scrolling on the given FlxSprite. If no FlxSprite is given it stops scrolling on all FlxSprites currently added.
+ * Scrolling is enabled by default, but this can be used to stop it.
+ * + * @param source The FlxSprite to stop scrolling on. If left as null it will stop scrolling on all sprites. + */ + public static function stopScrolling(source:FlxSprite=null):Void + { + if(source) + { + members[source].scrolling=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.scrolling=false; + } + } + } + + /** + * Checks to see if the given FlxSprite is a Scrolling Text, and is actively scrolling or not
+ * Note:If the text is set to only scroll when on-screen, but if off-screen when this is called, it will still return true. + * + * @param source The FlxSprite to check for scrolling on. + * @return Boolean true is the FlxSprite was found and is scrolling, otherwise false + */ + public static function isScrolling(source:FlxSprite):Bool + { + if(members[source]) + { + return members[source].scrolling; + } + + return false; + } + + /** + * Removes an FlxSprite from the Text Scroller. Note that it doesn't restore the sprite bitmapData. + * + * @param source The FlxSprite to remove scrolling for. + * @return Boolean true if the FlxSprite was removed, otherwise false. + */ + public static function remove(source:FlxSprite):Bool + { + if(members[source]) + { + delete members[source]; + + return true; + } + + return false; + } + + override public function destroy():Void + { + clear(); + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxSpecialFX.hx b/intra/source/org/flixel/plugin/photonstorm/FlxSpecialFX.hx new file mode 100644 index 0000000..4f335a6 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxSpecialFX.hx @@ -0,0 +1,308 @@ +/** + * FlxSpecialFX + * -- Part of the Flixel Power Tools set + * + * v1.6 Added WowCopperFX + * v1.5 Added RevealFX + * v1.4 Added BlurFX and CenterSlideFX + * v1.3 Renamed DropDown to FloodFill + * v1.2 Added GlitchFX and StarfieldFX + * v1.1 Added SineWaveFX + * v1.0 First release of the new FlxSpecialFX system + * + * @version 1.6 - September 19th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.utils.Dictionary; +import org.flixel.*; +import org.flixel.plugin.photonstorm.FX.BlurFX; +import org.flixel.plugin.photonstorm.FX.CenterSlideFX; +import org.flixel.plugin.photonstorm.FX.FloodFillFX; +import org.flixel.plugin.photonstorm.FX.GlitchFX; +import org.flixel.plugin.photonstorm.FX.PlasmaFX; +import org.flixel.plugin.photonstorm.FX.RainbowLineFX; +import org.flixel.plugin.photonstorm.FX.RevealFX; +import org.flixel.plugin.photonstorm.FX.SineWaveFX; +import org.flixel.plugin.photonstorm.FX.StarfieldFX; +import org.flixel.plugin.photonstorm.FX.WowCopperFX; + +/** + * FlxSpecialFX is a single point of access to all of the FX Plugins available in the Flixel Power Tools + */ +class FlxSpecialFX extends FlxBasic +{ + private static var members:Dictionary=new Dictionary(true); + + public function new() + { + } + + // THE SPECIAL FX PLUGINS AVAILABLE + + /** + * Creates a Plama field Effect + * + * @return PlasmaFX + */ + public static function plasma():PlasmaFX + { + var temp:PlasmaFX=new PlasmaFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Rainbow Line Effect + * + * @return RainbowLineFX + */ + public static function rainbowLine():RainbowLineFX + { + var temp:RainbowLineFX=new RainbowLineFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Flood Fill Effect + * + * @return FloodFillFX + */ + public static function floodFill():FloodFillFX + { + var temp:FloodFillFX=new FloodFillFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Sine Wave Down Effect + * + * @return SineWaveFX + */ + public static function sineWave():SineWaveFX + { + var temp:SineWaveFX=new SineWaveFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Glitch Effect + * + * @return GlitchFX + */ + public static function glitch():GlitchFX + { + var temp:GlitchFX=new GlitchFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a 2D or 3D Starfield Effect + * + * @return StarfieldFX + */ + public static function starfield():StarfieldFX + { + var temp:StarfieldFX=new StarfieldFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Blur Effect + * + * @return BlurFX + */ + public static function blur():BlurFX + { + var temp:BlurFX=new BlurFX; + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Center Slide Effect + * + * @return CenterSlideFX + */ + public static function centerSlide():CenterSlideFX + { + var temp:CenterSlideFX=new CenterSlideFX + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a Reveal Effect + * + * @return RevealFX + */ + public static function reveal():RevealFX + { + var temp:RevealFX=new RevealFX + + members[temp]=temp; + + return members[temp]; + } + + /** + * Creates a WOW Copper Effect + * + * @return WowCopperFX + */ + public static function wowCopper():WowCopperFX + { + var temp:WowCopperFX=new WowCopperFX + + members[temp]=temp; + + return members[temp]; + } + + + + + + // GLOBAL FUNCTIONS + + /** + * Starts the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to run. If null it will start all currently added FX Plugins + */ + public static function startFX(source:Class=null):Void + { + if(source) + { + members[source].active=true; + } + else + { + for(var obj:Dynamic in members) + { + obj.active=true; + } + } + } + + /** + * Stops the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to stop. If null it will stop all currently added FX Plugins + */ + public static function stopFX(source:Class=null):Void + { + if(source) + { + members[source].active=false; + } + else + { + for(var obj:Dynamic in members) + { + obj.active=false; + } + } + } + + /** + * Returns the active state of the given FX Plugin running + * + * @param source A reference to the FX Plugin you wish to run. If null it will start all currently added FX Plugins + * @return Boolean true if the FX Plugin is active, false if not + */ + public static function isActive(source:Class):Bool + { + if(members[source]) + { + return members[source].active; + } + + return false; + } + + /** + * Called automatically by Flixels Plugin handler + */ + override public function draw():Void + { + if(FlxG.paused) + { + return; + } + + for(var obj:Dynamic in members) + { + if(obj.active) + { + obj.draw(); + } + } + } + + /** + * Removes a FX Plugin from the Special FX Handler + * + * @param source The FX Plugin to remove + * @return Boolean true if the plugin was removed, otherwise false. + */ + public static function remove(source:Dynamic):Bool + { + if(members[source]) + { + members[source].destroy(); + + delete members[source]; + + return true; + } + + return false; + } + + /** + * Removes all FX Plugins
+ * This is called automatically if the plugin is destroyed, but should be called manually by you if you change States + */ + public static function clear():Void + { + for(var obj:Dynamic in members) + { + remove(obj); + } + } + + /** + * Destroys all FX Plugins currently added and then destroys this instance of the FlxSpecialFX Plugin + */ + override public function destroy():Void + { + clear(); + } + + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxVelocity.hx b/intra/source/org/flixel/plugin/photonstorm/FlxVelocity.hx new file mode 100644 index 0000000..c6f93ae --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxVelocity.hx @@ -0,0 +1,364 @@ +/** + * FlxVelocity + * -- Part of the Flixel Power Tools set + * + * v1.6 New method:velocityFromFacing + * v1.5 New methods:velocityFromAngle, accelerateTowardsObject, accelerateTowardsMouse, accelerateTowardsPoint + * v1.4 New methods:moveTowardsPoint, distanceToPoint, angleBetweenPoint + * v1.3 Updated for the Flixel 2.5 Plugin system + * + * @version 1.6 - August 15th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm + * @see Depends on FlxMath +*/ + +package org.flixel.plugin.photonstorm +{ +import flash.accessibility.Accessibility; +import org.flixel.*; + +class FlxVelocity +{ + + public function new() + { + } + + /** + * Sets the source FlxSprite x/y velocity so it will move directly towards the destination FlxSprite at the speed given(in pixels per second)
+ * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * If you need the object to accelerate, see accelerateTowardsObject()instead + * Note:Doesn't take Into account acceleration, maxVelocity or drag(if you set drag or acceleration too high this object may not move at all) + * + * @param source The FlxSprite on which the velocity will be set + * @param dest The FlxSprite where the source object will move to + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsObject(source:FlxSprite, dest:FlxSprite, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetween(source, dest); + + if(maxTime>0) + { + var d:Int=distanceBetween(source, dest); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the destination FlxSprite at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsObject()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param dest The FlxSprite where the source object will move towards + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsObject(source:FlxSprite, dest:FlxSprite, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetween(source, dest); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Move the given FlxSprite towards the mouse pointer coordinates at a steady velocity + * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * + * @param source The FlxSprite to move + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsMouse(source:FlxSprite, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetweenMouse(source); + + if(maxTime>0) + { + var d:Int=distanceToMouse(source); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the mouse coordinates at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsMouse()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsMouse(source:FlxSprite, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetweenMouse(source); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Sets the x/y velocity on the source FlxSprite so it will move towards the target coordinates at the speed given(in pixels per second)
+ * 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.
+ * Timings are approximate due to the way Flash timers work, and irrespective of SWF frame rate. Allow for a variance of +- 50ms.
+ * The source object doesn't stop moving automatically should it ever reach the destination coordinates.
+ * + * @param source The FlxSprite to move + * @param target The FlxPoint coordinates to move the source FlxSprite towards + * @param speed The speed it will move, in pixels per second(Std.is(default, 60) pixels/sec) + * @param maxTime Time given in milliseconds(1000=1 sec). If set the speed is adjusted so the source will arrive at destination in the given number of ms + */ + public static function moveTowardsPoint(source:FlxSprite, target:FlxPoint, speed:Int=60, maxTime:Int=0):Void + { + var a:Float=angleBetweenPoint(source, target); + + if(maxTime>0) + { + var d:Int=distanceToPoint(source, target); + + // We know how many pixels we need to move, but how fast? + speed=d /(maxTime / 1000); + } + + source.velocity.x=Math.cos(a)* speed; + source.velocity.y=Math.sin(a)* speed; + } + + /** + * Sets the x/y acceleration on the source FlxSprite so it will move towards the target coordinates at the speed given(in pixels per second)
+ * You must give a maximum speed value, beyond which the FlxSprite won't go any faster.
+ * If you don't need acceleration look at moveTowardsPoint()instead. + * + * @param source The FlxSprite on which the acceleration will be set + * @param target The FlxPoint coordinates to move the source FlxSprite towards + * @param speed The speed it will accelerate in pixels per second + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public static function accelerateTowardsPoint(source:FlxSprite, target:FlxPoint, speed:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + var a:Float=angleBetweenPoint(source, target); + + source.velocity.x=0; + source.velocity.y=0; + + source.acceleration.x=Std.int(Math.cos(a)* speed); + source.acceleration.y=Std.int(Math.sin(a)* speed); + + source.maxVelocity.x=xSpeedMax; + source.maxVelocity.y=ySpeedMax; + } + + /** + * Find the distance(in pixels, rounded)between two FlxSprites, taking their origin Into account + * + * @param a The first FlxSprite + * @param b The second FlxSprite + * @return int Distance(in pixels) + */ + public static function distanceBetween(a:FlxSprite, b:FlxSprite):Int + { + var dx:Float=(a.x + a.origin.x)-(b.x + b.origin.x); + var dy:Float=(a.y + a.origin.y)-(b.y + b.origin.y); + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the distance(in pixels, rounded)from an FlxSprite to the given FlxPoint, taking the source origin Into account + * + * @param a The first FlxSprite + * @param target The FlxPoint + * @return int Distance(in pixels) + */ + public static function distanceToPoint(a:FlxSprite, target:FlxPoint):Int + { + var dx:Float=(a.x + a.origin.x)-(target.x); + var dy:Float=(a.y + a.origin.y)-(target.y); + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the distance(in pixels, rounded)from the object x/y and the mouse x/y + * + * @param a The FlxSprite to test against + * @return int The distance between the given sprite and the mouse coordinates + */ + public static function distanceToMouse(a:FlxSprite):Int + { + var dx:Float=(a.x + a.origin.x)- FlxG.mouse.screenX; + var dy:Float=(a.y + a.origin.y)- FlxG.mouse.screenY; + + return Std.int(FlxMath.vectorLength(dx, dy)); + } + + /** + * Find the angle(in radians)between an FlxSprite and an FlxPoint. The source sprite takes its x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxSprite to test from + * @param target The FlxPoint to angle the FlxSprite towards + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetweenPoint(a:FlxSprite, target:FlxPoint, asDegrees:Bool=false):Float + { + var dx:Float=(target.x)-(a.x + a.origin.x); + var dy:Float=(target.y)-(a.y + a.origin.y); + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + /** + * Find the angle(in radians)between the two FlxSprite, taking their x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxSprite to test from + * @param b The FlxSprite to test to + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetween(a:FlxSprite, b:FlxSprite, asDegrees:Bool=false):Float + { + var dx:Float=(b.x + b.origin.x)-(a.x + a.origin.x); + var dy:Float=(b.y + b.origin.y)-(a.y + a.origin.y); + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + /** + * Given the angle and speed calculate the velocity and return it as an FlxPoint + * + * @param angle The angle(in degrees)calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * @param speed The speed it will move, in pixels per second sq + * + * @return An FlxPoint where FlxPoint.x contains the velocity x value and FlxPoint.y contains the velocity y value + */ + public static function velocityFromAngle(angle:Int, speed:Int):FlxPoint + { + var a:Float=FlxMath.asRadians(angle); + + var result:FlxPoint=new FlxPoint; + + result.x=Std.int(Math.cos(a)* speed); + result.y=Std.int(Math.sin(a)* speed); + + return result; + } + + /** + * Given the FlxSprite and speed calculate the velocity and return it as an FlxPoint based on the direction the sprite is facing + * + * @param parent The FlxSprite to get the facing value from + * @param speed The speed it will move, in pixels per second sq + * + * @return An FlxPoint where FlxPoint.x contains the velocity x value and FlxPoint.y contains the velocity y value + */ + public static function velocityFromFacing(parent:FlxSprite, speed:Int):FlxPoint + { + var a:Float; + + if(parent.facing==FlxObject.LEFT) + { + a=FlxMath.asRadians(180); + } + else if(parent.facing==FlxObject.RIGHT) + { + a=FlxMath.asRadians(0); + } + else if(parent.facing==FlxObject.UP) + { + a=FlxMath.asRadians(-90); + } + else if(parent.facing==FlxObject.DOWN) + { + a=FlxMath.asRadians(90); + } + + var result:FlxPoint=new FlxPoint; + + result.x=Std.int(Math.cos(a)* speed); + result.y=Std.int(Math.sin(a)* speed); + + return result; + } + + /** + * Find the angle(in radians)between an FlxSprite and the mouse, taking their x/y and origin Into account. + * The angle is calculated in clockwise positive direction(down=90 degrees positive, right=0 degrees positive, up=90 degrees negative) + * + * @param a The FlxObject to test from + * @param asDegrees If you need the value in degrees instead of radians, set to true + * + * @return Number The angle(in radians unless asDegrees is true) + */ + public static function angleBetweenMouse(a:FlxSprite, asDegrees:Bool=false):Float + { + // In order to get the angle between the object and mouse, we need the objects screen coordinates(rather than world coordinates) + var p:FlxPoint=a.getScreenXY(); + + var dx:Float=FlxG.mouse.screenX - p.x; + var dy:Float=FlxG.mouse.screenY - p.y; + + if(asDegrees) + { + return FlxMath.asDegrees(Math.atan2(dy, dx)); + } + else + { + return Math.atan2(dy, dx); + } + } + + + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/FlxWeapon.hx b/intra/source/org/flixel/plugin/photonstorm/FlxWeapon.hx new file mode 100644 index 0000000..642fdee --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/FlxWeapon.hx @@ -0,0 +1,690 @@ +/** + * FlxWeapon + * -- Part of the Flixel Power Tools set + * + * v1.3 Added bullet elasticity and bulletsFired counter + * v1.2 Added useParentDirection boolean + * v1.1 Added pre-fire, fire and post-fire callbacks and sound support, rnd factors, boolean returns and currentBullet + * v1.0 First release + * + * @version 1.3 - October 9th 2011 + * @link http://www.photonstorm.com + * @author Richard Davey / Photon Storm +*/ + +package org.flixel.plugin.photonstorm +{ +import org.flixel.*; +import flash.utils.getTimer; +import org.flixel.plugin.photonstorm.BaseTypes.Bullet; +import org.flixel.plugin.photonstorm.FlxVelocity; + +/** + * TODO + * ---- + * + * Angled bullets + * Baked Rotation support for angled bullets + * Bullet death styles(particle effects) + * Bullet trails - blur FX style and Missile Command "draw lines" style?(could be another FX plugin) + * Homing Missiles + * Bullet uses random sprite from sprite sheet(for rainbow style bullets), or cycles through them in sequence? + * Some Weapon base classes like shotgun, lazer, etc? + */ + +class FlxWeapon +{ + /** + * Internal name for this weapon(i.e. "pulse rifle") + */ + public var name:String; + + /** + * The FlxGroup Into which all the bullets for this weapon are drawn. This should be added to your display and collision checked against it. + */ + public var group:FlxGroup; + + // Bullet values + public var bounds:FlxRect; + + private var bulletSpeed:Int; + private var rotateToAngle:Bool; + + // When firing from a fixed position(i.e. Missile Command) + private var fireFromPosition:Bool; + private var fireX:Int; + private var fireY:Int; + + private var lastFired:Int=0; + private var nextFire:Int=0; + private var fireRate:Int=0; + + // When firing from a parent sprites position(i.e. Space Invaders) + private var fireFromParent:Bool; + private var parent:Dynamic; + private var parentXVariable:String; + private var parentYVariable:String; + private var positionOffset:FlxPoint; + private var directionFromParent:Bool; + private var angleFromParent:Bool; + + private var velocity:FlxPoint; + + public var multiShot:Int=0; + + public var bulletLifeSpan:Int=0; + public var bulletElasticity:Float=0; + + public var rndFactorAngle:Int=0; + public var rndFactorLifeSpan:Int=0; + public var rndFactorSpeed:Int=0; + public var rndFactorPosition:FlxPoint=new FlxPoint; + + /** + * A reference to the Bullet that was fired + */ + public var currentBullet:Bullet; + + // Callbacks + public var onPreFireCallback:Function; + public var onFireCallback:Function; + public var onPostFireCallback:Function; + + // Sounds + public var onPreFireSound:FlxSound; + public var onFireSound:FlxSound; + public var onPostFireSound:FlxSound; + + // Quick firing direction angle constants + public static inline var BULLET_UP:Int=-90; + public static inline var BULLET_DOWN:Int=90; + public static inline var BULLET_LEFT:Int=180; + public static inline var BULLET_RIGHT:Int=0; + public static inline var BULLET_NORTH_EAST:Int=-45; + public static inline var BULLET_NORTH_WEST:Int=-135; + public static inline var BULLET_SOUTH_EAST:Int=45; + public static inline var BULLET_SOUTH_WEST:Int=135; + + /** + * Keeps a tally of how many bullets have been fired by this weapon + */ + public var bulletsFired:Int=0; + + + private var currentMagazine:Int; + //private var currentBullet:Int; + private var magazineCount:Int; + private var bulletsPerMagazine:Int; + private var magazineSwapDelay:Int; + private var magazineSwapCallback:Function; + private var magazineSwapSound:FlxSound; + + private static inline var FIRE:Int=0; + private static inline var FIRE_AT_MOUSE:Int=1; + private static inline var FIRE_AT_POSITION:Int=2; + private static inline var FIRE_AT_TARGET:Int=3; + private static inline var FIRE_FROM_ANGLE:Int=4; + private static inline var FIRE_FROM_PARENT_ANGLE:Int=5; + + /** + * Creates the FlxWeapon class which will fire your bullets.
+ * You should call one of the makeBullet functions to visually create the bullets.
+ * Then either use setDirection with fire()or one of the fireAt functions to launch them. + * + * @param name The name of your weapon(i.e. "lazer" or "shotgun"). For your Internal reference really, but could be displayed in-game. + * @param parentRef If this weapon belongs to a parent sprite, specify it here(bullets will fire from the sprites x/y vars as defined below). + * @param xVariable The x axis variable of the parent to use when firing. Typically "x", but could be "screenX" or any public getter that exposes the x coordinate. + * @param yVariable The y axis variable of the parent to use when firing. Typically "y", but could be "screenY" or any public getter that exposes the y coordinate. + */ + public function new(name:String, parentRef:Dynamic=null, xVariable:String="x", yVariable:String="y") + { + this.name=name; + + bounds=new FlxRect(0, 0, FlxG.width, FlxG.height); + + positionOffset=new FlxPoint; + + velocity=new FlxPoint; + + if(parentRef) + { + setParent(parentRef, xVariable, yVariable); + } + } + + /** + * Makes a pixel bullet sprite(rather than an image). You can set the width/height and color of the bullet. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param width The width(in pixels)of the bullets + * @param height The height(in pixels)of the bullets + * @param color The color of the bullets. Must be given in 0xAARRGGBB format + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function makePixelBullet(quantity:Int, width:Int=2, height:Int=2, color:Int=0xffffffff, offsetX:Int=0, offsetY:Int=0):Void + { + group=new FlxGroup(quantity); + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + tempBullet.makeGraphic(width, height, color); + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Makes a bullet sprite from the given image. It will use the width/height of the image. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param image The image used to create the bullet from + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param autoRotate When true the bullet sprite will rotate to match the angle of the parent sprite. Call fireFromParentAngle or fromFromAngle to fire it using an angle as the velocity. + * @param frame If the image has a single row of square animation frames on it, you can specify which of the frames you want to use here. Default is -1, or "use whole graphic" + * @param rotations The number of rotation frames the final sprite should have. For small sprites this can be quite a large number(360 even)without any problems. + * @param antiAliasing Whether to use high quality rotations when creating the graphic. Default is false. + * @param autoBuffer Whether to automatically increase the image size to accomodate rotated corners. Default is false. Will create frames that are 150% larger on each axis than the original frame or graphic. + */ + public function makeImageBullet(quantity:Int, image:Class, offsetX:Int=0, offsetY:Int=0, autoRotate:Bool=false, rotations:Int=16, frame:Int=-1, antiAliasing:Bool=false, autoBuffer:Bool=false):Void + { + group=new FlxGroup(quantity); + + rotateToAngle=autoRotate; + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + if(autoRotate) + { + tempBullet.loadRotatedGraphic(image, rotations, frame, antiAliasing, autoBuffer); + } + else + { + tempBullet.loadGraphic(image); + } + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Makes an animated bullet from the image and frame data given. + * + * @param quantity How many bullets do you need to make? This value should be high enough to cover all bullets you need on-screen *at once* plus probably a few extra spare! + * @param imageSequence The image used to created the animated bullet from + * @param frameWidth The width of each frame in the animation + * @param frameHeight The height of each frame in the animation + * @param frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3) + * @param frameRate The speed in frames per second that the animation should play at(e.g. 40 fps) + * @param looped Whether or not the animation is looped or just plays once + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function makeAnimatedBullet(quantity:Int, imageSequence:Class, frameWidth:Int, frameHeight:Int, frames:Array, frameRate:Int, looped:Bool, offsetX:Int=0, offsetY:Int=0):Void + { + group=new FlxGroup(quantity); + + for(b in 0...quantity) + { + var tempBullet:Bullet=new Bullet(this, b); + + tempBullet.loadGraphic(imageSequence, true, false, frameWidth, frameHeight); + + tempBullet.addAnimation("fire", frames, frameRate, looped); + + group.add(tempBullet); + } + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Internal function that handles the actual firing of the bullets + * + * @param method + * @param x + * @param y + * @param target + * @return true if a bullet was fired or false if one wasn't available. The bullet last fired is stored in FlxWeapon.prevBullet + */ + private function runFire(method:Int, x:Int=0, y:Int=0, target:FlxSprite=null, angle:Int=0):Bool + { + if(fireRate>0 &&(getTimer() + * If set this over-rides a call to setParent(which causes the Weapon to fire from the parents x/y position) + * + * @param x The x coordinate(in game world pixels)to fire from + * @param y The y coordinate(in game world pixels)to fire from + * @param offsetX When the bullet is fired if you need to offset it on the x axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + * @param offsetY When the bullet is fired if you need to offset it on the y axis, for example to line it up with the "nose" of a space ship, set the amount here(positive or negative) + */ + public function setFiringPosition(x:Int, y:Int, offsetX:Int=0, offsetY:Int=0):Void + { + fireFromPosition=true; + fireX=x; + fireY=y; + + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * The speed in pixels/sec(sq)that the bullet travels at when fired via fireAtMouse, fireAtPosition or fireAtTarget. + * You can update this value in real-time, should you need to speed-up or slow-down your bullets(i.e. collecting a power-up) + * + * @param speed The speed it will move, in pixels per second(sq) + */ + public function setBulletSpeed(speed:Int):Void + { + bulletSpeed=speed; + } + + /** + * The speed in pixels/sec(sq)that the bullet travels at when fired via fireAtMouse, fireAtPosition or fireAtTarget. + * + * @return The speed the bullet moves at, in pixels per second(sq) + */ + public function getBulletSpeed():Int + { + return bulletSpeed; + } + + /** + * Sets the firing rate of the Weapon. By default there is no rate, as it can be controlled by FlxControl.setFireButton. + * However if you are firing using the mouse you may wish to set a firing rate. + * + * @param rate The delay in milliseconds(ms)between which each bullet is fired, set to zero to clear + */ + public function setFireRate(rate:Int):Void + { + fireRate=rate; + } + + /** + * When a bullet goes outside of this bounds it will be automatically killed, freeing it up for firing again. + * - Needs testing with a scrolling map(when not using single screen display) + * + * @param bounds An FlxRect area. Inside this area the bullet should be considered alive, once outside it will be killed. + */ + public function setBulletBounds(bounds:FlxRect):Void + { + this.bounds=bounds; + } + + /** + * Set the direction the bullet will travel when fired. + * You can use one of the consts such as BULLET_UP, BULLET_DOWN or BULLET_NORTH_EAST to set the angle easily. + * Speed should be given in pixels/sec(sq)and is the speed at which the bullet travels when fired. + * + * @param angle The angle of the bullet. In clockwise positive direction:Right=0, Down=90, Left=180, Up=-90. You can use one of the consts such as BULLET_UP, etc + * @param speed The speed it will move, in pixels per second(sq) + */ + public function setBulletDirection(angle:Int, speed:Int):Void + { + velocity=FlxVelocity.velocityFromAngle(angle, speed); + } + + /** + * Sets gravity on all currently created bullets
+ * This will update ALL bullets, even those currently "in flight", so be careful about when you call this! + * + * @param xForce A positive value applies gravity dragging the bullet to the right. A negative value drags the bullet to the left. Zero disables horizontal gravity. + * @param yforce A positive value applies gravity dragging the bullet down. A negative value drags the bullet up. Zero disables vertical gravity. + */ + public function setBulletGravity(xForce:Int, yForce:Int):Void + { + group.setAll("xGravity", xForce); + group.setAll("yGravity", yForce); + } + + /** + * If you'd like your bullets to accelerate to their top speed rather than be launched already at it, then set the acceleration value here. + * If you've previously set the acceleration then setting it to zero will cancel the effect. + * This will update ALL bullets, even those currently "in flight", so be careful about when you call this! + * + * @param xAcceleration Acceleration speed in pixels per second to apply to the sprites horizontal movement, set to zero to cancel. Negative values move left, positive move right. + * @param yAcceleration Acceleration speed in pixels per second to apply to the sprites vertical movement, set to zero to cancel. Negative values move up, positive move down. + * @param xSpeedMax The maximum speed in pixels per second in which the sprite can move horizontally + * @param ySpeedMax The maximum speed in pixels per second in which the sprite can move vertically + */ + public function setBulletAcceleration(xAcceleration:Int, yAcceleration:Int, xSpeedMax:Int, ySpeedMax:Int):Void + { + if(xAcceleration==0 && yAcceleration==0) + { + group.setAll("accelerates", false); + } + else + { + group.setAll("accelerates", true); + group.setAll("xAcceleration", xAcceleration); + group.setAll("yAcceleration", yAcceleration); + group.setAll("maxVelocityX", xSpeedMax); + group.setAll("maxVelocityY", ySpeedMax); + } + } + + /** + * When the bullet is fired from a parent(or fixed position)it will do so from their x/y coordinate.
+ * Often you need to align a bullet with the sprite, i.e. to make it look like it came out of the "nose" of a space ship.
+ * Use this offset x/y value to achieve that effect. + * + * @param offsetX The x coordinate offset to add to the launch location(positive or negative) + * @param offsetY The y coordinate offset to add to the launch location(positive or negative) + */ + public function setBulletOffset(offsetX:Int, offsetY:Int):Void + { + positionOffset.x=offsetX; + positionOffset.y=offsetY; + } + + /** + * Give the bullet a random factor to its angle, speed, position or lifespan when fired. Can create a nice "scatter gun" effect. + * + * @param randomAngle The +- value applied to the angle when fired. For example 20 means the bullet can fire up to 20 degrees under or over its angle when fired. + * @param randomSpeed The +- value applied to the bullet speed when fired. For example 10 means the bullet speed varies by +- 10px/sec + * @param randomPosition The +- values applied to the x/y coordinates the bullet is fired from. + * @param randomLifeSpan The +- values applied to the life span of the bullet. + */ + public function setBulletRandomFactor(randomAngle:Int=0, randomSpeed:Int=0, randomPosition:FlxPoint=null, randomLifeSpan:Int=0):Void + { + rndFactorAngle=randomAngle; + rndFactorSpeed=randomSpeed; + + if(randomPosition !=null) + { + rndFactorPosition=randomPosition; + } + + rndFactorLifeSpan=randomLifeSpan; + } + + /** + * If the bullet should have a fixed life span use this function to set it. + * The bullet will be killed once it passes this lifespan(if still alive and in bounds) + * + * @param lifespan The lifespan of the bullet in ms, calculated when the bullet is fired. Set to zero to disable bullet lifespan. + */ + public function setBulletLifeSpan(lifespan:Int):Void + { + bulletLifeSpan=lifespan; + } + + /** + * The elasticity of the fired bullet controls how much it rebounds off collision surfaces. + * + * @param elasticity The elasticity of the bullet between 0 and 1(0 being no rebound, 1 being 100% force rebound). Set to zero to disable. + */ + public function setBulletElasticity(elasticity:Float):Void + { + bulletElasticity=elasticity; + } + + /** + * Internal function that returns the next available bullet from the pool(if any) + * + * @return A bullet + */ + private function getFreeBullet():Bullet + { + var result:Bullet=null; + + if(group==null || group.length==0) + { + throw new Dynamic("Weapon.as cannot fire a bullet until one has been created via a call to makePixelBullet or makeImageBullet"); + return null; + } + + for(var bullet:Bullet in group.members) + { + if(bullet.exists==false) + { + result=bullet; + break; + } + } + + return result; + } + + /** + * Sets a pre-fire callback function and sound. These are played immediately before the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setPreFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onPreFireCallback=callback; + onPreFireSound=sound; + } + + /** + * Sets a fire callback function and sound. These are played immediately as the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onFireCallback=callback; + onFireSound=sound; + } + + /** + * Sets a post-fire callback function and sound. These are played immediately after the bullet is fired. + * + * @param callback The function to call + * @param sound An FlxSound to play + */ + public function setPostFireCallback(callback:Function=null, sound:FlxSound=null):Void + { + onPostFireCallback=callback; + onPostFireSound=sound; + } + + // TODO + public function TODOcreateBulletPattern(pattern:Array):Void + { + // Launches this many bullets + } + + + public function update():Void + { + // ??? + } + +} \ No newline at end of file diff --git a/intra/source/org/flixel/plugin/photonstorm/PNGEncoder.hx b/intra/source/org/flixel/plugin/photonstorm/PNGEncoder.hx new file mode 100644 index 0000000..6e74151 --- /dev/null +++ b/intra/source/org/flixel/plugin/photonstorm/PNGEncoder.hx @@ -0,0 +1,140 @@ +/* + Copyright(c)2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR + PROFITS;OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING + NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package org.flixel.plugin.photonstorm; + +import flash.geom.*; +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.utils.ByteArray; + +/** + * Class that converts BitmapData Into a valid PNG + */ +class PNGEncoder +{ + /** + * Created a PNG image from the specified BitmapData + * + * @param image The BitmapData that will be converted Into the PNG format. + * @return a ByteArray representing the PNG encoded image data. + * @langversion ActionScript 3.0 + * @playerversion Flash 9.0 + * @tiptext + */ + public static function encode(img:BitmapData):ByteArray { + // Create output byte array + var png:ByteArray=new ByteArray(); + // Write PNG signature + png.writeUnsignedInt(0x89504e47); + png.writeUnsignedInt(0x0D0A1A0A); + // Build IHDR chunk + var IHDR:ByteArray=new ByteArray(); + IHDR.writeInt(img.width); + IHDR.writeInt(img.height); + IHDR.writeUnsignedInt(0x08060000);// 32bit RGBA + IHDR.writeByte(0); + writeChunk(png,0x49484452,IHDR); + // Build IDAT chunk + var IDAT:ByteArray=new ByteArray(); + for(i in 0...img.height){ + // no filter + IDAT.writeByte(0); + var p:Int; + var j:Int; + if(!img.transparent){ + for(j=0;j>>24))); + } + } + } + IDAT.compress(); + writeChunk(png,0x49444154,IDAT); + // Build IEND chunk + writeChunk(png,0x49454E44,null); + // return PNG + return png; + } + + private static var crcTable:Array; + private static var crcTableComputed:Bool=false; + + private static function writeChunk(png:ByteArray, + type:Int, data:ByteArray):Void { + if(!crcTableComputed){ + crcTableComputed=true; + crcTable=[]; + var c:Int; + for(n in 0...256){ + c=n; + for(k in 0...8){ + if(c & 1){ + c=uint(uint(0xedb88320)^ + uint(c>>>1)); + } else { + c=uint(c>>>1); + } + } + crcTable[n]=c; + } + } + var len:Int=0; + if(data !=null){ + len=data.length; + } + png.writeUnsignedInt(len); + var p:Int=png.position; + png.writeUnsignedInt(type); + if(data !=null){ + png.writeBytes(data); + } + var e:Int=png.position; + png.position=p; + c=0xffffffff; + for(var i:Int=0;i<(e-p);i++){ + c=uint(crcTable[ + (c ^ png.readUnsignedByte())& + uint(0xff)] ^ Int(c>>>8)); + } + c=uint(c^uint(0xffffffff)); + png.position=e; + png.writeUnsignedInt(c); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxAnim.hx b/intra/source/org/flixel/system/FlxAnim.hx new file mode 100644 index 0000000..0a447bd --- /dev/null +++ b/intra/source/org/flixel/system/FlxAnim.hx @@ -0,0 +1,52 @@ +package org.flixel.system; + +/** + * Just a helper structure for the FlxSprite animation system. + * + * @author Adam Atomic + */ +class FlxAnim +{ + /** + * String name of the animation(e.g. "walk") + */ + public var name:String; + /** + * Seconds between frames(basically the framerate) + */ + public var delay:Float; + /** + * A list of frames stored asuintobjects + */ + public var frames:Array; + /** + * Whether or not the animation is looped + */ + public var looped:Bool; + + /** + * Constructor + * + * @param Name What this animation should be called(e.g. "run") + * @param Frames An array of numbers indicating what frames to play in what order(e.g. 1, 2, 3) + * @param FrameRate The speed in frames per second that the animation should play at(e.g. 40) + * @param Looped Whether or not the animation is looped or just plays once + */ + public function new(Name:String, Frames:Array, FrameRate:Float=0, Looped:Bool=true) + { + name=Name; + delay=0; + if(FrameRate>0) + delay=1.0/FrameRate; + frames=Frames; + looped=Looped; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + frames=null; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxDebugger.hx b/intra/source/org/flixel/system/FlxDebugger.hx new file mode 100644 index 0000000..b4ff0b7 --- /dev/null +++ b/intra/source/org/flixel/system/FlxDebugger.hx @@ -0,0 +1,233 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.MouseEvent; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxG; +import org.flixel.system.debug.Log; +import org.flixel.system.debug.Perf; +import org.flixel.system.debug.VCR; +import org.flixel.system.debug.Vis; +import org.flixel.system.debug.Watch; + +/** + * Container for the new debugger overlay. + * Most of the functionality is in the debug folder widgets, + * but this class instantiates the widgets and handles their basic formatting and arrangement. + */ +class FlxDebugger extends Sprite +{ + /** + * Container for the performance monitor widget. + */ + public var perf:Perf; + /** + * Container for the trace output widget. + */ + public var log:Log; + /** + * Container for the watch window widget. + */ + public var watch:Watch; + /** + * Container for the record, stop and play buttons. + */ + public var vcr:VCR; + /** + * Container for the visual debug mode toggle. + */ + public var vis:Vis; + /** + * Whether the mouse is currently over one of the debugger windows or not. + */ + public var hasMouse:Bool; + + /** + * Internal, tracks what debugger window layout user has currently selected. + */ + private var _layout:Int; + /** + * Internal, stores width and height of the Flash Player window. + */ + private var _screen:Point; + /** + * Internal, used to space out windows from the edges. + */ + private var _gutter:Int; + + /** + * Instantiates the debugger overlay. + * + * @param Width The width of the screen. + * @param Height The height of the screen. + */ + public function new(Width:Float,Height:Float) + { + super(); + visible=false; + hasMouse=false; + _screen=new Point(Width,Height); + + addChild(new Bitmap(new BitmapData(Width,15,true,0x7f000000))); + + var txt:TextField=new TextField(); + txt.x=2; + txt.width=160; + txt.height=16; + txt.selectable=false; + txt.multiline=false; + txt.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + var str:String=FlxG.getLibraryName(); + if(FlxG.debug) + str +=" [debug]"; + else + str +=" [release]"; + txt.text=str; + addChild(txt); + + _gutter=8; + var screenBounds:Rectangle=new Rectangle(_gutter,15+_gutter/2,_screen.x-_gutter*2,_screen.y-_gutter*1.5-15); + + log=new Log("log",0,0,true,screenBounds); + addChild(log); + + watch=new Watch("watch",0,0,true,screenBounds); + addChild(watch); + + perf=new Perf("stats",0,0,false,screenBounds); + addChild(perf); + + vcr=new VCR(); + vcr.x=(Width - vcr.width/2)/2; + vcr.y=2; + addChild(vcr); + + vis=new Vis(); + vis.x=Width-vis.width - 4; + vis.y=2; + addChild(vis); + + setLayout(FlxG.DEBUGGER_STANDARD); + + //Should help with fake mouse focus type behavior + addEventListener(MouseEvent.MOUSE_OVER,onMouseOver); + addEventListener(MouseEvent.MOUSE_OUT,onMouseOut); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _screen=null; + removeChild(log); + log.destroy(); + log=null; + removeChild(watch); + watch.destroy(); + watch=null; + removeChild(perf); + perf.destroy(); + perf=null; + removeChild(vcr); + vcr.destroy(); + vcr=null; + removeChild(vis); + vis.destroy(); + vis=null; + + removeEventListener(MouseEvent.MOUSE_OVER,onMouseOver); + removeEventListener(MouseEvent.MOUSE_OUT,onMouseOut); + } + + /** + * Mouse handler that helps with fake "mouse focus" type behavior. + * + * @param E Flash mouse event. + */ + private function onMouseOver(E:MouseEvent=null):Void + { + hasMouse=true; + } + + /** + * Mouse handler that helps with fake "mouse focus" type behavior. + * + * @param E Flash mouse event. + */ + private function onMouseOut(E:MouseEvent=null):Void + { + hasMouse=false; + } + + /** + * Rearrange the debugger windows using one of the constants specified in FlxG. + * + * @param Layout The layout style for the debugger windows, e.g.FlxG.DEBUGGER_MICRO. + */ + public function setLayout(Layout:Int):Void + { + _layout=Layout; + resetLayout(); + } + + /** + * Forces the debugger windows to reset to the last specified layout. + * The default layout isFlxG.DEBUGGER_STANDARD. + */ + public function resetLayout():Void + { + switch(_layout) + { + case FlxG.DEBUGGER_MICRO: + log.resize(_screen.x/4,68); + log.reposition(0,_screen.y); + watch.resize(_screen.x/4,68); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_BIG: + log.resize((_screen.x-_gutter*3)/2,_screen.y/2); + log.reposition(0,_screen.y); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/2); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_TOP: + log.resize((_screen.x-_gutter*3)/2,_screen.y/4); + log.reposition(0,0); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/4); + watch.reposition(_screen.x,0); + perf.reposition(_screen.x,_screen.y); + break; + case FlxG.DEBUGGER_LEFT: + log.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + log.reposition(0,0); + watch.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + watch.reposition(0,_screen.y); + perf.reposition(_screen.x,0); + break; + case FlxG.DEBUGGER_RIGHT: + log.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + log.reposition(_screen.x,0); + watch.resize(_screen.x/3,(_screen.y-15-_gutter*2.5)/2); + watch.reposition(_screen.x,_screen.y); + perf.reposition(0,0); + break; + case FlxG.DEBUGGER_STANDARD: + default: + log.resize((_screen.x-_gutter*3)/2,_screen.y/4); + log.reposition(0,_screen.y); + watch.resize((_screen.x-_gutter*3)/2,_screen.y/4); + watch.reposition(_screen.x,_screen.y); + perf.reposition(_screen.x,0); + break; + } + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxList.hx b/intra/source/org/flixel/system/FlxList.hx new file mode 100644 index 0000000..84bf898 --- /dev/null +++ b/intra/source/org/flixel/system/FlxList.hx @@ -0,0 +1,48 @@ +package org.flixel.system; + +import org.flixel.FlxG; +import org.flixel.FlxObject; + +/** + * A miniature linked list class. + * Useful for optimizing time-critical or highly repetitive tasks! + * SeeFlxQuadTreefor how to use it, IF YOU DARE. + */ +class FlxList +{ + /** + * Stores a reference to aFlxObject. + */ + public var object:FlxObject; + /** + * Stores a reference to the next link in the list. + */ + public var next:FlxList; + + /** + * A pool to prevent repeatednewcalls. + */ + static public var listPool:DynamicPool=new DynamicPool(FlxList); + + /** + * Creates a new link, and setsobjectandnexttonull. + */ + public function new() + { + object=null; + next=null; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + object=null; + if(next !=null) + next.destroy(); + next=null; + + listPool.disposeObject(this); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxPreloader.hx b/intra/source/org/flixel/system/FlxPreloader.hx new file mode 100644 index 0000000..0bc6999 --- /dev/null +++ b/intra/source/org/flixel/system/FlxPreloader.hx @@ -0,0 +1,215 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.DisplayObject; +import flash.display.MovieClip; +import flash.display.Sprite; +import flash.display.StageAlign; +import flash.display.StageScaleMode; +import flash.events.Event; +import flash.events.MouseEvent; +import flash.net.URLRequest; +import flash.net.navigateToURL; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.getDefinitionByName; +import flash.utils.getTimer; + +import org.flixel.FlxG; + +/** + * This class handles the 8-bit style preloader. + */ +class FlxPreloader extends MovieClip +{ + //[Embed(source="../data/logo.png")] private var ImgLogo:Class; + //[Embed(source="../data/logo_corners.png")] private var ImgLogoCorners:Class; + //[Embed(source="../data/logo_light.png")] private var ImgLogoLight:Class; + + //[Embed(source="../../../res/title/intraisloading.png")] private var Is_loading:Class; + /** + * @private + */ + private var _init:Bool; + /** + * @private + */ + private var _buffer:Sprite; + /** + * @private + */ + private var _bmpBar:Bitmap; + private var _overlay:Bitmap; + /** + * Useful for storing "real" stage width if you're scaling your preloader graphics. + */ + private var _width:Int; + /** + * Useful for storing "real" stage height if you're scaling your preloader graphics. + */ + private var _height:Int; + + /** + * @private + */ + private var _min:Int; + + /** + * This should always be the name of your main project/document class(e.g. GravityHook). + */ + public var className:String; + /** + * Set this to your game's URL to use built-in site-locking. + */ + public var myURL:String; + /** + * Change this if you want the flixel logo to show for more or less time. Default value is 0 seconds. + */ + public var minDisplayTime:Float; + + /** + * Constructor + */ + public function new() + { + minDisplayTime=0.5; + + stop(); + stage.scaleMode=StageScaleMode.NO_SCALE; + stage.align=StageAlign.TOP_LEFT; + + //Check if we are on debug or release mode and set _DEBUG accordingly + try + { + throw new Dynamic("Setting global debug flag..."); + } + catch(E:Dynamic) + { + var re:RegExp=/\[.*:[0-9]+\]/; + FlxG.debug=re.test(E.getStackTrace()); + } + + var tmp:Bitmap; + if(!FlxG.debug &&(myURL !=null)&&(root.loaderInfo.url.indexOf(myURL)<0)) + if((myURL !=null)&&(root.loaderInfo.url.indexOf(myURL)<0)) + { + tmp=new Bitmap(new BitmapData(stage.stageWidth,stage.stageHeight,true,0xFFFFFFFF)); + addChild(tmp); + + var format:TextFormat=new TextFormat(); + format.color=0x000000; + format.size=16; + format.align="center"; + format.bold=true; + format.font="system"; + + var textField:TextField=new TextField(); + textField.width=tmp.width-16; + textField.height=tmp.height-16; + textField.y=8; + textField.multiline=true; + textField.wordWrap=true; + textField.embedFonts=true; + textField.defaultTextFormat=format; + textField.text="Hi there! It looks like somebody copied this game without my permission. Just click anywhere, or copy-paste this URL Into your browser.\n\n"+myURL+"\n\nto play the game at my site. Thanks, and have fun!"; + addChild(textField); + + textField.addEventListener(MouseEvent.CLICK,goToMyURL); + tmp.addEventListener(MouseEvent.CLICK,goToMyURL); + return; + } + this._init=false; + addEventListener(Event.ENTER_FRAME, onEnterFrame); + } + + private function goToMyURL(event:MouseEvent=null):Void + { + navigateToURL(new URLRequest("http://"+myURL)); + } + + private function onEnterFrame(event:Event):Void + { + if(!this._init) + { + if((stage.stageWidth<=0)||(stage.stageHeight<=0)) + return; + create(); + this._init=true; + } + graphics.clear(); + var time:Int=getTimer(); + if((framesLoaded>=totalFrames)&&(time>_min)) + { + removeEventListener(Event.ENTER_FRAME, onEnterFrame); + + nextFrame(); + var mainClass:Class=Class(getDefinitionByName(className)); + if(mainClass) + { + var app:Dynamic=new mainClass(); + Preloader.display=cast(app, DisplayObject); + addChild(app as DisplayObject); + } + destroy(); + } + else + { + var percent:Float=root.loaderInfo.bytesLoaded/root.loaderInfo.bytesTotal; + if((_min>0)&&(percent>time/_min)) + percent=time/_min; + update(percent); + } + } + + /** + * Override this to create your own preloader objects. + * Highly recommended you also override update()! + */ + private function create():Void + { + _min=0; + //if(!FlxG.debug) + if(1) + _min=minDisplayTime*1000; + _buffer=new Sprite(); + _buffer.scaleX=2; + _buffer.scaleY=2; + addChild(_buffer); + _width=stage.stageWidth/_buffer.scaleX; + _height=stage.stageHeight/_buffer.scaleY; + _buffer.addChild(new Bitmap(new BitmapData(_width,_height,false,0x000000))); + _bmpBar=new Bitmap(new BitmapData(1,7,false,0xffffff)); + _bmpBar.x=4; + _bmpBar.y=_height-80; + _buffer.addChild(_bmpBar); + var is_loading_thing:Bitmap=new Is_loading(); + is_loading_thing.scaleX=is_loading_thing.scaleY=0.5; + is_loading_thing.x=2; + is_loading_thing.y=80; + + _overlay=new Bitmap(new BitmapData(160, 180, true, 0xff000000)); + _overlay.alpha=0; + //_buffer.addChild(is_loading_thing); + _buffer.addChild(_overlay); + } + + private function destroy():Void + { + removeChild(_buffer); + _buffer=null; + _bmpBar=null; + } + + /** + * Override this function to manually update the preloader. + * + * @param Percent How much of the program has loaded. + */ + private function update(Percent:Float):Void + { + _bmpBar.scaleX=Percent*(_width-8); + _overlay.alpha=Percent; + + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxQuadTree.hx b/intra/source/org/flixel/system/FlxQuadTree.hx new file mode 100644 index 0000000..95a1fdc --- /dev/null +++ b/intra/source/org/flixel/system/FlxQuadTree.hx @@ -0,0 +1,612 @@ +package org.flixel.system; + +import org.flixel.FlxBasic; +import org.flixel.FlxGroup; +import org.flixel.FlxObject; +import org.flixel.FlxRect; + +/** + * A fairly generic quad tree structure for rapid overlap checks. + * FlxQuadTree is also configured for single or dual list operation. + * You can add items either to its A list or its B list. + * When you do an overlap check, you can compare the A list to itself, + * or the A list against the B list. Handy for different things! + */ +class FlxQuadTree extends FlxRect +{ + public function new(){ + + } + /** + * Flag for specifying that you want to add an object to the A list. + */ + static public static inline var A_LIST:Int=0; + /** + * Flag for specifying that you want to add an object to the B list. + */ + static public static inline var B_LIST:Int=1; + + /** + * Controls the granularity of the quad tree. Default is 6(decent performance on large and small worlds). + */ + static public var divisions:Int; + + /** + * Whether this branch of the tree can be subdivided or not. + */ + private var _canSubdivide:Bool; + + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _headA:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _tailA:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _headB:FlxList; + /** + * Refers to the Internal A and B linked lists, + * which are used to store objects in the leaves. + */ + private var _tailB:FlxList; + + /** + * Internal, governs and assists with the formation of the tree. + */ + static private var _min:Int; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _northWestTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _northEastTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _southEastTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _southWestTree:FlxQuadTree; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _leftEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _rightEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _topEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _bottomEdge:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _halfWidth:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _halfHeight:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _midpointX:Float; + /** + * Internal, governs and assists with the formation of the tree. + */ + private var _midpointY:Float; + + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _object:FlxObject; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectLeftEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectTopEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectRightEdge:Float; + /** + * Internal, used to reduce recursive method parameters during object placement and tree formation. + */ + static private var _objectBottomEdge:Float; + + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _list:Int; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _useBothLists:Bool; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _processingCallback:Function; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _notifyCallback:Function; + /** + * Internal, used during tree processing and overlap checks. + */ + static private var _iterator:FlxList; + + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullX:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullY:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullWidth:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _objectHullHeight:Float; + + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullX:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullY:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullWidth:Float; + /** + * Internal, helpers for comparing actual object-to-object overlap - seeoverlapNode(). + */ + static private var _checkObjectHullHeight:Float; + /** + * A pool to prevent repeatednewcalls. + */ + static public var quadTreePool:DynamicPool=new DynamicPool(FlxQuadTree); + + private var _listPool:DynamicPool; + /** + * Instantiate a new Quad Tree node. + * + * @param X The X-coordinate of the point in space. + * @param Y The Y-coordinate of the point in space. + * @param Width Desired width of this node. + * @param Height Desired height of this node. + * @param Parent The parent branch or node. Pass null to create a root. + */ + public function init(X:Float, Y:Float, Width:Float, Height:Float, Parent:FlxQuadTree=null):Void + { + _listPool=FlxList.listPool; + + make(X,Y,Width,Height); + _headA=_tailA=_listPool.getNew(); + _headB=_tailB=_listPool.getNew(); + + //Copy the parent's children(if there are any) + if(Parent !=null) + { + var iterator:FlxList; + var ot:FlxList; + if(Parent._headA.object !=null) + { + iterator=Parent._headA; + while(iterator !=null) + { + if(_tailA.object !=null) + { + ot=_tailA; + _tailA=_listPool.getNew(); + ot.next=_tailA; + } + _tailA.object=iterator.object; + iterator=iterator.next; + } + } + if(Parent._headB.object !=null) + { + iterator=Parent._headB; + while(iterator !=null) + { + if(_tailB.object !=null) + { + ot=_tailB; + _tailB=_listPool.getNew(); + ot.next=_tailB; + } + _tailB.object=iterator.object; + iterator=iterator.next; + } + } + } + else + _min=(width + height)/(2*divisions); + _canSubdivide=(width>_min)||(height>_min); + + //Set up comparison/sort helpers + _northWestTree=null; + _northEastTree=null; + _southEastTree=null; + _southWestTree=null; + _leftEdge=x; + _rightEdge=x+width; + _halfWidth=width/2; + _midpointX=_leftEdge+_halfWidth; + _topEdge=y; + _bottomEdge=y+height; + _halfHeight=height/2; + _midpointY=_topEdge+_halfHeight; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _headA.destroy(); + _headA=null; + //_tailA.destroy(); + _tailA=null; + _headB.destroy(); + _headB=null; + //_tailB.destroy(); + _tailB=null; + + if(_northWestTree !=null) + _northWestTree.destroy(); + _northWestTree=null; + if(_northEastTree !=null) + _northEastTree.destroy(); + _northEastTree=null; + if(_southEastTree !=null) + _southEastTree.destroy(); + _southEastTree=null; + if(_southWestTree !=null) + _southWestTree.destroy(); + _southWestTree=null; + + _object=null; + _processingCallback=null; + _notifyCallback=null; + + quadTreePool.disposeObject(this); + } + + /** + * Load objects and/or groups Into the quad tree, and register notify and processing callbacks. + * + * @param DynamicOrGroup1 Any object that is or extends FlxObject or FlxGroup. + * @param DynamicOrGroup2 Any object that is or extends FlxObject or FlxGroup. If null, the first parameter will be checked against itself. + * @param NotifyCallback A function with the formmyFunction(Object1:FlxObject,Object2:FlxObject):Voidthat is called whenever two objects are found to overlap in world space, and either no ProcessCallback is specified, or the ProcessCallback returns true. + * @param ProcessCallback A function with the formmyFunction(Object1:FlxObject,Object2:FlxObject):Boolthat is called whenever two objects are found to overlap in world space. The NotifyCallback is only called if this function returns true. See FlxObject.separate(). + */ + public function load(ObjectOrGroup1:FlxBasic, DynamicOrGroup2:FlxBasic=null, NotifyCallback:Function=null, ProcessCallback:Function=null):Void + { + add(ObjectOrGroup1, A_LIST); + if(ObjectOrGroup2 !=null) + { + add(ObjectOrGroup2, B_LIST); + _useBothLists=true; + } + else + _useBothLists=false; + _notifyCallback=NotifyCallback; + _processingCallback=ProcessCallback; + } + + /** + * Call this function to add an object to the root of the tree. + * This function will recursively add all group members, but + * not the groups themselves. + * + * @param ObjectOrGroup FlxObjects are just added, FlxGroups are recursed and their applicable members added accordingly. + * @param List Auintflag indicating the list to which you want to add the objects. Options areA_LISTandB_LIST. + */ + public function add(ObjectOrGroup:FlxBasic, List:Int):Void + { + _list=List; + if(Std.is(ObjectOrGroup, FlxGroup)) + { + var i:Int=0; + var basic:FlxBasic; + var members:Array=(ObjectOrGroup as FlxGroup).members; + var l:Int=(ObjectOrGroup as FlxGroup).length; + while(i=_objectLeftEdge)&&(_rightEdge<=_objectRightEdge)&&(_topEdge>=_objectTopEdge)&&(_bottomEdge<=_objectBottomEdge))) + { + addToList(); + return; + } + + //See if the selected object fits completely inside any of the quadrants + if((_objectLeftEdge>_leftEdge)&&(_objectRightEdge<_midpointX)) + { + if((_objectTopEdge>_topEdge)&&(_objectBottomEdge<_midpointY)) + { + if(_northWestTree==null) + { + _northWestTree=quadTreePool.getNew(); + _northWestTree.init(_leftEdge, _topEdge, _halfWidth, _halfHeight, this); + } + _northWestTree.addObject(); + return; + } + if((_objectTopEdge>_midpointY)&&(_objectBottomEdge<_bottomEdge)) + { + if(_southWestTree==null) + { + _southWestTree=quadTreePool.getNew(); + _southWestTree.init(_leftEdge, _midpointY, _halfWidth, _halfHeight, this); + } + _southWestTree.addObject(); + return; + } + } + if((_objectLeftEdge>_midpointX)&&(_objectRightEdge<_rightEdge)) + { + if((_objectTopEdge>_topEdge)&&(_objectBottomEdge<_midpointY)) + { + if(_northEastTree==null) + { + _northEastTree=quadTreePool.getNew(); + _northEastTree.init(_midpointX, _topEdge, _halfWidth, _halfHeight, this); + } + _northEastTree.addObject(); + return; + } + if((_objectTopEdge>_midpointY)&&(_objectBottomEdge<_bottomEdge)) + { + if(_southEastTree==null) + { + _southEastTree=quadTreePool.getNew(); + _southEastTree.init(_midpointX, _midpointY, _halfWidth, _halfHeight, this); + } + _southEastTree.addObject(); + return; + } + } + + //If it wasn't completely contained we have to check out the partial overlaps + if((_objectRightEdge>_leftEdge)&&(_objectLeftEdge<_midpointX)&&(_objectBottomEdge>_topEdge)&&(_objectTopEdge<_midpointY)) + { + if(_northWestTree==null) + { + _northWestTree=quadTreePool.getNew(); + _northWestTree.init(_leftEdge, _topEdge, _halfWidth, _halfHeight, this); + } + _northWestTree.addObject(); + } + if((_objectRightEdge>_midpointX)&&(_objectLeftEdge<_rightEdge)&&(_objectBottomEdge>_topEdge)&&(_objectTopEdge<_midpointY)) + { + if(_northEastTree==null) + { + _northEastTree=quadTreePool.getNew(); + _northEastTree.init(_midpointX, _topEdge, _halfWidth, _halfHeight, this); + } + _northEastTree.addObject(); + } + if((_objectRightEdge>_midpointX)&&(_objectLeftEdge<_rightEdge)&&(_objectBottomEdge>_midpointY)&&(_objectTopEdge<_bottomEdge)) + { + if(_southEastTree==null) + { + _southEastTree=quadTreePool.getNew(); + _southEastTree.init(_midpointX, _midpointY, _halfWidth, _halfHeight, this); + } + _southEastTree.addObject(); + } + if((_objectRightEdge>_leftEdge)&&(_objectLeftEdge<_midpointX)&&(_objectBottomEdge>_midpointY)&&(_objectTopEdge<_bottomEdge)) + { + if(_southWestTree==null) + { + _southWestTree=quadTreePool.getNew(); + _southWestTree.init(_leftEdge, _midpointY, _halfWidth, _halfHeight, this); + } + _southWestTree.addObject(); + } + } + + /** + * Internal function for recursively adding objects to leaf lists. + */ + private function addToList():Void + { + var ot:FlxList; + if(_list==A_LIST) + { + if(_tailA.object !=null) + { + ot=_tailA; + _tailA=_listPool.getNew(); + ot.next=_tailA; + } + _tailA.object=_object; + } + else + { + if(_tailB.object !=null) + { + ot=_tailB; + _tailB=_listPool.getNew(); + ot.next=_tailB; + } + _tailB.object=_object; + } + if(!_canSubdivide) + return; + if(_northWestTree !=null) + _northWestTree.addToList(); + if(_northEastTree !=null) + _northEastTree.addToList(); + if(_southEastTree !=null) + _southEastTree.addToList(); + if(_southWestTree !=null) + _southWestTree.addToList(); + } + + /** + *FlxQuadTree's other main function. Call this after adding objects + * usingFlxQuadTree.load()to compare the objects that you loaded. + * + * @return Whether or not any overlaps were found. + */ + public function execute():Bool + { + var overlapProcessed:Bool=false; + var iterator:FlxList; + + if(_headA.object !=null) + { + iterator=_headA; + while(iterator !=null) + { + _object=iterator.object; + if(_useBothLists) + _iterator=_headB; + else + _iterator=iterator.next; + if( _object.exists &&(_object.allowCollisions>0)&& + (_iterator !=null)&&(_iterator.object !=null)&& + _iterator.object.exists &&overlapNode()) + { + overlapProcessed=true; + } + iterator=iterator.next; + } + } + + //Advance through the tree by calling overlap on each child + if((_northWestTree !=null)&& _northWestTree.execute()) + overlapProcessed=true; + if((_northEastTree !=null)&& _northEastTree.execute()) + overlapProcessed=true; + if((_southEastTree !=null)&& _southEastTree.execute()) + overlapProcessed=true; + if((_southWestTree !=null)&& _southWestTree.execute()) + overlapProcessed=true; + + return overlapProcessed; + } + + /** + * An Internal function for comparing an object against the contents of a node. + * + * @return Whether or not any overlaps were found. + */ + private function overlapNode():Bool + { + //Walk the list and check for overlaps + var overlapProcessed:Bool=false; + var checkObject:FlxObject; + while(_iterator !=null) + { + if(!_object.exists ||(_object.allowCollisions<=0)) + break; + + checkObject=_iterator.object; + if((_object===checkObject)|| !checkObject.exists ||(checkObject.allowCollisions<=0)) + { + _iterator=_iterator.next; + continue; + } + + //calculate bulk hull for _object + _objectHullX=(_object.x<_object.last.x)?_object.x:_object.last.x; + _objectHullY=(_object.y<_object.last.y)?_object.y:_object.last.y; + _objectHullWidth=_object.x - _object.last.x; + _objectHullWidth=_object.width +((_objectHullWidth>0)?_objectHullWidth:-_objectHullWidth); + _objectHullHeight=_object.y - _object.last.y; + _objectHullHeight=_object.height +((_objectHullHeight>0)?_objectHullHeight:-_objectHullHeight); + + //calculate bulk hull for checkObject + _checkObjectHullX=(checkObject.x0)?_checkObjectHullWidth:-_checkObjectHullWidth); + _checkObjectHullHeight=checkObject.y - checkObject.last.y; + _checkObjectHullHeight=checkObject.height +((_checkObjectHullHeight>0)?_checkObjectHullHeight:-_checkObjectHullHeight); + + //check for Intersection of the two hulls + if( (_objectHullX + _objectHullWidth>_checkObjectHullX)&& + (_objectHullX<_checkObjectHullX + _checkObjectHullWidth)&& + (_objectHullY + _objectHullHeight>_checkObjectHullY)&& + (_objectHullY<_checkObjectHullY + _checkObjectHullHeight)) + { + //Execute callback functions if they exist + if((_processingCallback==null)|| _processingCallback(_object,checkObject)) + overlapProcessed=true; + if(overlapProcessed &&(_notifyCallback !=null)) + _notifyCallback(_object,checkObject); + } + _iterator=_iterator.next; + } + + return overlapProcessed; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxReplay.hx b/intra/source/org/flixel/system/FlxReplay.hx new file mode 100644 index 0000000..a074487 --- /dev/null +++ b/intra/source/org/flixel/system/FlxReplay.hx @@ -0,0 +1,201 @@ +package org.flixel.system; + +import org.flixel.FlxG; +import org.flixel.system.replay.FrameRecord; +import org.flixel.system.replay.MouseRecord; + +/** + * The replay object both records and replays game recordings, + * as well as handle saving and loading replays to and from files. + * Gameplay recordings are essentially a list of keyboard and mouse inputs, + * but since Flixel is fairly deterministic, we can use these to play back + * recordings of gameplay with a decent amount of fidelity. + * + * @author Adam Atomic + */ +class FlxReplay +{ + /** + * The random number generator seed value for this recording. + */ + public var seed:Float; + /** + * The current frame for this recording. + */ + public var frame:Int; + /** + * The number of frames in this recording. + */ + public var frameCount:Int; + /** + * Whether the replay has finished playing or not. + */ + public var finished:Bool; + + /** + * Internal container for all the frames in this replay. + */ + private var _frames:Array; + /** + * Internal tracker for max number of frames we can fit before growing the_framesagain. + */ + private var _capacity:Int; + /** + * Internal helper variable for keeping track of where we are in_framesduring recording or replay. + */ + private var _marker:Int; + + /** + * Instantiate a new replay object. Doesn't actually do much until you call create()or load(). + */ + public function new() + { + seed=0; + frame=0; + frameCount=0; + finished=false; + _frames=null; + _capacity=0; + _marker=0; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + if(_frames==null) + return; + var i:Int=frameCount-1; + while(i>=0) + (_frames[i--] as FrameRecord).destroy(); + _frames=null; + } + + /** + * Create a new gameplay recording. Requires the current random number generator seed. + * + * @param Seed The current seed from the random number generator. + */ + public function create(Seed:Float):Void + { + destroy(); + init(); + seed=Seed; + rewind(); + } + + /** + * Load replay data from aStringobject. + * Strings can come from embedded assets or external + * files loaded through the debugger overlay. + * + * @param FileContents AStringobject containing a gameplay recording. + */ + public function load(FileContents:String):Void + { + init(); + + var lines:Array=FileContents.split("\n"); + + seed=Std.parseFloat(lines[0]); + + var line:String; + var i:Int=1; + var l:Int=lines.length; + while(i3) + { + _frames[frameCount++]=new FrameRecord().load(line); + if(frameCount>=_capacity) + { + _capacity *=2; + _frames.length=_capacity; + } + } + } + + rewind(); + } + + /** + * Common initialization terms used by bothcreate()andload()to set up the replay object. + */ + private function init():Void + { + _capacity=100; + _frames=new Array(_capacity); + frameCount=0; + } + + /** + * Save the current recording data off to aStringobject. + * Basically goes through and callsFrameRecord.save()on each frame in the replay. + * + * return The gameplay recording in simple ASCII format. + */ + public function save():String + { + if(frameCount<=0) + return null; + var output:String=seed+"\n"; + var i:Int=0; + while(i=FlxG.keys.record(); + var mouseRecord:MouseRecord=FlxG.mouse.record(); + if((keysRecord==null)&&(mouseRecord==null)) + { + frame++; + return; + } + _frames[frameCount++]=new FrameRecord().create(frame++,keysRecord,mouseRecord); + if(frameCount>=_capacity) + { + _capacity *=2; + _frames.length=_capacity; + } + } + + /** + * Get the current frame record data and load it Into the input managers. + */ + public function playNextFrame():Void + { + FlxG.resetInput(); + + if(_marker>=frameCount) + { + finished=true; + return; + } + if((_frames[_marker] as FrameRecord).frame !=frame++) + return; + + var fr:FrameRecord=_frames[_marker++]; + if(fr.keys !=null) + FlxG.keys.playback(fr.keys); + if(fr.mouse !=null) + FlxG.mouse.playback(fr.mouse); + } + + /** + * Reset the replay back to the first frame. + */ + public function rewind():Void + { + _marker=0; + frame=0; + finished=false; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxTile.hx b/intra/source/org/flixel/system/FlxTile.hx new file mode 100644 index 0000000..283c7fa --- /dev/null +++ b/intra/source/org/flixel/system/FlxTile.hx @@ -0,0 +1,80 @@ +package org.flixel.system; + +import org.flixel.FlxObject; +import org.flixel.FlxTilemap; + +/** + * A simple helper object forFlxTilemapthat helps expand collision opportunities and control. + * You can useFlxTilemap.setTileProperties()to alter the collision properties and + * callback functions and filters for this object to do things like one-way tiles or whatever. + * + * @author Adam Atomic + */ +class FlxTile extends FlxObject +{ + /** + * This function is called whenever an object hits a tile of this type. + * This function should take the formmyFunction(Tile:FlxTile,Object:FlxObject):Void. + * Defaults to null, set throughFlxTilemap.setTileProperties(). + */ + public var callback:Function; + /** + * Each tile can store its own filter class for their callback functions. + * That is, the callback will only be triggered if an object with a class + * type matching the filter touched it. + * Defaults to null, set throughFlxTilemap.setTileProperties(). + */ + public var filter:Class; + /** + * A reference to the tilemap this tile object belongs to. + */ + public var tilemap:FlxTilemap; + /** + * The index of this tile type in the core map data. + * For example, if your map only has 16 kinds of tiles in it, + * this number is usually between 0 and 15. + */ + public var index:Int; + /** + * The current map index of this tile object at this moment. + * You can think of tile objects as moving around the tilemap helping with collisions. + * This value is only reliable and useful if used from the callback function. + */ + public var mapIndex:Int; + + /** + * Instantiate this new tile object. This is usually called fromFlxTilemap.loadMap(). + * + * @param Tilemap A reference to the tilemap object creating the tile. + * @param Index The actual core map data index for this tile type. + * @param Width The width of the tile. + * @param Height The height of the tile. + * @param Visible Whether the tile is visible or not. + * @param AllowCollisions The collision flags for the object. By default this value is ANY or NONE depending on the parameters sent to loadMap(). + */ + public function new(Tilemap:FlxTilemap, Index:Int, Width:Float, Height:Float, Visible:Bool, AllowCollisions:Int) + { + super(0, 0, Width, Height); + immovable=true; + moves=false; + callback=null; + filter=null; + + tilemap=Tilemap; + index=Index; + visible=Visible; + allowCollisions=AllowCollisions; + + mapIndex=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + super.destroy(); + callback=null; + tilemap=null; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxTilemapBuffer.hx b/intra/source/org/flixel/system/FlxTilemapBuffer.hx new file mode 100644 index 0000000..a07fc5b --- /dev/null +++ b/intra/source/org/flixel/system/FlxTilemapBuffer.hx @@ -0,0 +1,120 @@ +package org.flixel.system; + +import flash.display.BitmapData; +import flash.geom.Point; +import flash.geom.Rectangle; + +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxU; + +/** + * A helper object to keep tilemap drawing performance decent across the new multi-camera system. + * Pretty much don't even have to think about this class unless you are doing some crazy hacking. + * + * @author Adam Atomic + */ +class FlxTilemapBuffer +{ + /** + * The current X position of the buffer. + */ + public var x:Float; + /** + * The current Y position of the buffer. + */ + public var y:Float; + /** + * The width of the buffer(usually just a few tiles wider than the camera). + */ + public var width:Float; + /** + * The height of the buffer(usually just a few tiles taller than the camera). + */ + public var height:Float; + /** + * Whether the buffer needs to be redrawn. + */ + public var dirty:Bool; + /** + * How many rows of tiles fit in this buffer. + */ + public var rows:Int; + /** + * How many columns of tiles fit in this buffer. + */ + public var columns:Int; + + private var _pixels:BitmapData; + private var _flashRect:Rectangle; + + /** + * Instantiates a new camera-specific buffer for storing the visual tilemap data. + * + * @param TileWidth The width of the tiles in this tilemap. + * @param TileHeight The height of the tiles in this tilemap. + * @param WidthInTiles How many tiles wide the tilemap is. + * @param HeightInTiles How many tiles tall the tilemap is. + * @param Camera Which camera this buffer relates to. + */ + public function new(TileWidth:Float,TileHeight:Float,WidthInTiles:Int,HeightInTiles:Int,Camera:FlxCamera=null) + { + if(Camera==null) + Camera=FlxG.camera; + + columns=FlxU.ceil(Camera.width/TileWidth)+1; + if(columns>WidthInTiles) + columns=WidthInTiles; + rows=FlxU.ceil(Camera.height/TileHeight)+1; + if(rows>HeightInTiles) + rows=HeightInTiles; + + _pixels=new BitmapData(columns*TileWidth,rows*TileHeight,true,0); + width=_pixels.width; + height=_pixels.height; + _flashRect=new Rectangle(0,0,width,height); + dirty=true; + } + + + /** + * Clean up memory. + */ + public function destroy():Void + { + _pixels=null; + } + + /** + * Fill the buffer with the specified color. + * Default value is transparent. + * + * @param Color What color to fill with, in 0xAARRGGBB hex format. + */ + public function fill(Color:Int=0):Void + { + _pixels.fillRect(_flashRect,Color); + } + + /** + * Read-only, nab the actual bufferBitmapDataobject. + * + * @return The buffer bitmap data. + */ + public var pixels(get_pixels, null):BitmapData; + private function get_pixels():BitmapData + { + return _pixels; + } + + /** + * Just stamps this buffer onto the specified camera at the specified location. + * + * @param Camera Which camera to draw the buffer onto. + * @param FlashPoint Where to draw the buffer at in camera coordinates. + */ + public function draw(Camera:FlxCamera,FlashPoint:Point):Void + { + Camera.buffer.copyPixels(_pixels,_flashRect,FlashPoint,null,null,true); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/FlxWindow.hx b/intra/source/org/flixel/system/FlxWindow.hx new file mode 100644 index 0000000..9ac6e25 --- /dev/null +++ b/intra/source/org/flixel/system/FlxWindow.hx @@ -0,0 +1,327 @@ +package org.flixel.system; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.MouseEvent; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxU; + +/** + * A generic, Flash-based window class, created for use inFlxDebugger. + * + * @author Adam Atomic + */ +class FlxWindow extends Sprite +{ + //[Embed(source="../data/handle.png")] private var ImgHandle:Class; + + /** + * Minimum allowed X and Y dimensions for this window. + */ + public var minSize:Point; + /** + * Maximum allowed X and Y dimensions for this window. + */ + public var maxSize:Point; + + /** + * Width of the window. Using Sprite.width is super unreliable for some reason! + */ + private var _width:Int; + /** + * Height of the window. Using Sprite.height is super unreliable for some reason! + */ + private var _height:Int; + /** + * Controls where the window is allowed to be positioned. + */ + private var _bounds:Rectangle; + + /** + * Window display element. + */ + private var _background:Bitmap; + /** + * Window display element. + */ + private var _header:Bitmap; + /** + * Window display element. + */ + private var _shadow:Bitmap; + /** + * Window display element. + */ + private var _title:TextField; + /** + * Window display element. + */ + private var _handle:Bitmap; + + /** + * Helper for Interaction. + */ + private var _overHeader:Bool; + /** + * Helper for Interaction. + */ + private var _overHandle:Bool; + /** + * Helper for Interaction. + */ + private var _drag:Point; + /** + * Helper for Interaction. + */ + private var _dragging:Bool; + /** + * Helper for Interaction. + */ + private var _resizing:Bool; + /** + * Helper for Interaction. + */ + private var _resizable:Bool; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String,Width:Float,Height:Float,Resizable:Bool=true,Bounds:Rectangle=null,BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(); + _width=Width; + _height=Height; + _bounds=Bounds; + minSize=new Point(50,30); + if(_bounds !=null) + maxSize=new Point(_bounds.width,_bounds.height); + else + maxSize=new Point(Number.MAX_VALUE,Number.MAX_VALUE); + _drag=new Point(); + _resizable=Resizable; + + _shadow=new Bitmap(new BitmapData(1,2,true,0xff000000)); + addChild(_shadow); + _background=new Bitmap(new BitmapData(1,1,true,BGColor)); + _background.y=15; + addChild(_background); + _header=new Bitmap(new BitmapData(1,15,true,TopColor)); + addChild(_header); + + _title=new TextField(); + _title.x=2; + _title.height=16; + _title.selectable=false; + _title.multiline=false; + _title.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + _title.text=Title; + addChild(_title); + + if(_resizable) + { + _handle=new ImgHandle(); + addChild(_handle); + } + + if((_width !=0)||(_height !=0)) + updateSize(); + bound(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + minSize=null; + maxSize=null; + _bounds=null; + removeChild(_shadow); + _shadow=null; + removeChild(_background); + _background=null; + removeChild(_header); + _header=null; + removeChild(_title); + _title=null; + if(_handle !=null) + removeChild(_handle); + _handle=null; + _drag=null; + } + + /** + * Resize the window. Subject to pre-specified minimums, maximums, and bounding rectangles. + * + * @param Width How wide to make the window. + * @param Height How tall to make the window. + */ + public function resize(Width:Float,Height:Float):Void + { + _width=Width; + _height=Height; + updateSize(); + } + + /** + * Change the position of the window. Subject to pre-specified bounding rectangles. + * + * @param X Desired X position of top left corner of the window. + * @param Y Desired Y position of top left corner of the window. + */ + public function reposition(X:Float,Y:Float):Void + { + x=X; + y=Y; + bound(); + } + + //***EVENT HANDLERS***// + + /** + * Used to set up basic mouse listeners. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * Mouse movement handler. Figures out if mouse is over handle or header bar or what. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(_dragging)//user is moving the window around + { + _overHeader=true; + reposition(parent.mouseX - _drag.x, parent.mouseY - _drag.y); + } + else if(_resizing) + { + _overHandle=true; + resize(mouseX - _drag.x, mouseY - _drag.y); + } + else if((mouseX>=0)&&(mouseX<=_width)&&(mouseY>=0)&&(mouseY<=_height)) + { //not dragging, mouse is over the window + _overHeader=(mouseX<=_header.width)&&(mouseY<=_header.height); + if(_resizable) + _overHandle=(mouseX>=_width - _handle.width)&&(mouseY>=_height - _handle.height); + } + else + { //not dragging, mouse is NOT over window + _overHandle=_overHeader=false; + } + + updateGUI(); + } + + /** + * Figure out if window is being repositioned(clicked on header)or resized(clicked on handle). + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + if(_overHeader) + { + _dragging=true; + _drag.x=mouseX; + _drag.y=mouseY; + } + else if(_overHandle) + { + _resizing=true; + _drag.x=_width-mouseX; + _drag.y=_height-mouseY; + } + } + + /** + * User let go of header bar or handler(or nothing), so turn off drag and resize behaviors. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + _dragging=false; + _resizing=false; + } + + //***MISC GUI MGMT STUFF***// + + /** + * Keep the window within the pre-specified bounding rectangle. + */ + private function bound():Void + { + if(_bounds !=null) + { + x=FlxU.bound(x,_bounds.left,_bounds.right-_width); + y=FlxU.bound(y,_bounds.top,_bounds.bottom-_height); + } + } + + /** + * Update the Flash shapes to match the new size, and reposition the header, shadow, and handle accordingly. + */ + private function updateSize():Void + { + _width=FlxU.bound(_width,minSize.x,maxSize.x); + _height=FlxU.bound(_height,minSize.y,maxSize.y); + + _header.scaleX=_width; + _background.scaleX=_width; + _background.scaleY=_height-15; + _shadow.scaleX=_width; + _shadow.y=_height; + _title.width=_width-4; + if(_resizable) + { + _handle.x=_width-_handle.width; + _handle.y=_height-_handle.height; + } + } + + /** + * Figure out if the header or handle are highlighted. + */ + private function updateGUI():Void + { + if(_overHeader || _overHandle) + { + if(_title.alpha !=1.0) + _title.alpha=1.0; + } + else + { + if(_title.alpha !=0.65) + _title.alpha=0.65; + } + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/ObjectPool.hx b/intra/source/org/flixel/system/ObjectPool.hx new file mode 100644 index 0000000..c21e19b --- /dev/null +++ b/intra/source/org/flixel/system/ObjectPool.hx @@ -0,0 +1,32 @@ +package org.flixel.system +{ +/** + * ... + * @author moly + */ +internal class DynamicPool +{ + private var _objects:Array; + private var _objectClass:Class; + + public function DynamicPool(ObjectClass:Class) + { + _objectClass=ObjectClass; + _objects=new Array(); + } + + public function getNew():Dynamic + { + var object:Dynamic=null; + if(_objects.length>0) + object=_objects.pop(); + else + object=new _objectClass(); + return object; + } + + public function disposeObject(OldObject:Dynamic):Void + { + _objects.push(OldObject); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/debug/Log.hx b/intra/source/org/flixel/system/debug/Log.hx new file mode 100644 index 0000000..f6805a4 --- /dev/null +++ b/intra/source/org/flixel/system/debug/Log.hx @@ -0,0 +1,91 @@ +package org.flixel.system.debug; + +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; +import org.flixel.system.FlxWindow; + +/** + * A simple trace output window for use in the debugger overlay. + * + * @author Adam Atomic + */ +class Log extends FlxWindow +{ + static protected var MAX_LOG_LINES:Int=200; + + private var _text:TextField; + private var _lines:Array; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + + _text=new TextField(); + _text.x=2; + _text.y=15; + _text.multiline=true; + _text.wordWrap=true; + _text.selectable=true; + _text.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + addChild(_text); + + _lines=new Array(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_text); + _text=null; + _lines=null; + super.destroy(); + } + + /** + * Adds a new line to the log window. + * + * @param Text The line you want to add to the log window. + */ + public function add(Text:String):Void + { + if(_lines.length<=0) + _text.text=""; + _lines.push(Text); + if(_lines.length>MAX_LOG_LINES) + { + _lines.shift(); + var newText:String=""; + for(i in 0..._lines.length) + newText +=_lines[i]+"\n"; + _text.text=newText; + } + else + _text.appendText(Text+"\n"); + _text.scrollV=_text.height; + } + + /** + * Adjusts the width and height of the text field accordingly. + */ + override private function updateSize():Void + { + super.updateSize(); + + _text.width=_width-10; + _text.height=_height-15; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/debug/Perf.hx b/intra/source/org/flixel/system/debug/Perf.hx new file mode 100644 index 0000000..6ccdfe2 --- /dev/null +++ b/intra/source/org/flixel/system/debug/Perf.hx @@ -0,0 +1,209 @@ +package org.flixel.system.debug; + +import flash.geom.Rectangle; +import flash.system.System; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.getTimer; + +import org.flixel.FlxG; +import org.flixel.system.FlxWindow; + +/** + * A simple performance monitor widget, for use in the debugger overlay. + * + * @author Adam Atomic + */ +class Perf extends FlxWindow +{ + private var _text:TextField; + + private var _lastTime:Int; + private var _updateTimer:Int; + + private var _flixelUpdate:Array; + private var _flixelUpdateMarker:Int; + private var _flixelDraw:Array; + private var _flixelDrawMarker:Int; + private var _flash:Array; + private var _flashMarker:Int; + private var _activeObject:Array; + private var _objectMarker:Int; + private var _visibleObject:Array; + private var _visibleObjectMarker:Int; + + /** + * Creates flashPlayerFramerate new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with flashPlayerFramerate drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + resize(90,66); + + _lastTime=0; + _updateTimer=0; + + _text=new TextField(); + _text.width=_width; + _text.x=2; + _text.y=15; + _text.multiline=true; + _text.wordWrap=true; + _text.selectable=true; + _text.defaultTextFormat=new TextFormat("Courier",12,0xffffff); + addChild(_text); + + _flixelUpdate=new Array(32); + _flixelUpdateMarker=0; + _flixelDraw=new Array(32); + _flixelDrawMarker=0; + _flash=new Array(32); + _flashMarker=0; + _activeObject=new Array(32); + _objectMarker=0; + _visibleObject=new Array(32); + _visibleObjectMarker=0; + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_text); + _text=null; + _flixelUpdate=null; + _flixelDraw=null; + _flash=null; + _activeObject=null; + _visibleObject=null; + super.destroy(); + } + + /** + * Called each frame, but really only updates once every second or so, to save on performance. + * Takes all the data in the accumulators and parses it Into useful performance data. + */ + public function update():Void + { + var time:Int=getTimer(); + var elapsed:Int=time - _lastTime; + var updateEvery:Int=500; + if(elapsed>updateEvery) + elapsed=updateEvery; + _lastTime=time; + + _updateTimer +=elapsed; + if(_updateTimer>updateEvery) + { + var i:Int; + var output:String=""; + + var flashPlayerFramerate:Float=0; + i=0; + while(i<_flashMarker) + flashPlayerFramerate +=_flash[i++]; + flashPlayerFramerate /=_flashMarker; + output +=uint(1/(flashPlayerFramerate/1000))+ "/" + FlxG.flashFramerate + "fps\n"; + + output +=Std.parseFloat((System.totalMemory * 0.000000954).toFixed(2))+ "MB\n"; + + var updateTime:Int=0; + i=0; + while(i<_flixelUpdateMarker) + updateTime +=_flixelUpdate[i++]; + + var activeCount:Int=0; + var te:Int=0; + i=0; + while(i<_objectMarker) + { + activeCount +=_activeObject[i]; + visibleCount +=_visibleObject[i++]; + } + activeCount /=_objectMarker; + + output +="U:" + activeCount + " " + Int(updateTime/_flixelDrawMarker)+ "ms\n"; + + var drawTime:Int=0; + i=0; + while(i<_flixelDrawMarker) + drawTime +=_flixelDraw[i++]; + + var visibleCount:Int=0; + i=0; + while(i<_visibleObjectMarker) + visibleCount +=_visibleObject[i++]; + visibleCount /=_visibleObjectMarker; + + output +="D:" + visibleCount + " " + Int(drawTime/_flixelDrawMarker)+ "ms"; + + _text.text=output; + + _flixelUpdateMarker=0; + _flixelDrawMarker=0; + _flashMarker=0; + _objectMarker=0; + _visibleObjectMarker=0; + _updateTimer -=updateEvery; + } + } + + /** + * Keep track of how long updates take. + * + * @param Time How long this update took. + */ + public function flixelUpdate(Time:Int):Void + { + _flixelUpdate[_flixelUpdateMarker++]=Time; + } + + /** + * Keep track of how long renders take. + * + * @param Time How long this render took. + */ + public function flixelDraw(Time:Int):Void + { + _flixelDraw[_flixelDrawMarker++]=Time; + } + + /** + * Keep track of how long the Flash player and browser take. + * + * @param Time How long Flash/browser took. + */ + public function flash(Time:Int):Void + { + _flash[_flashMarker++]=Time; + } + + /** + * Keep track of how many objects were updated. + * + * @param Count How many objects were updated. + */ + public function activeObjects(Count:Int):Void + { + _activeObject[_objectMarker++]=Count; + } + + /** + * Keep track of how many objects were updated. + * + * @param Count How many objects were updated. + */ + public function visibleObjects(Count:Int):Void + { + _visibleObject[_visibleObjectMarker++]=Count; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/debug/VCR.hx b/intra/source/org/flixel/system/debug/VCR.hx new file mode 100644 index 0000000..c3fc70f --- /dev/null +++ b/intra/source/org/flixel/system/debug/VCR.hx @@ -0,0 +1,599 @@ +package org.flixel.system.debug; + +import flash.display.Bitmap; +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.IOErrorEvent; +import flash.events.MouseEvent; +import flash.net.FileFilter; +import flash.net.FileReference; +import flash.text.TextField; +import flash.text.TextFormat; +import flash.utils.ByteArray; + +import org.flixel.FlxG; +import org.flixel.FlxU; +import org.flixel.system.FlxReplay; +import org.flixel.system.replay.FrameRecord; +import org.flixel.system.replay.MouseRecord; + +/** + * This class contains the record, stop, play, and step 1 frame buttons seen on the top edge of the debugger overlay. + * + * @author Adam Atomic + */ +class VCR extends Sprite +{ + //[Embed(source="../../data/vcr/open.png")] private var ImgOpen:Class; + //[Embed(source="../../data/vcr/record_off.png")] private var ImgRecordOff:Class; + //[Embed(source="../../data/vcr/record_on.png")] private var ImgRecordOn:Class; + //[Embed(source="../../data/vcr/stop.png")] private var ImgStop:Class; + //[Embed(source="../../data/vcr/flixel.png")] private var ImgFlixel:Class; + //[Embed(source="../../data/vcr/restart.png")] private var ImgRestart:Class; + //[Embed(source="../../data/vcr/pause.png")] private var ImgPause:Class; + //[Embed(source="../../data/vcr/play.png")] private var ImgPlay:Class; + //[Embed(source="../../data/vcr/step.png")] private var ImgStep:Class; + + static protected var FILE_TYPES:Array=[new FileFilter("Flixel Game Recording", "*.fgr")]; + static protected var DEFAULT_FILE_NAME:String="replay.fgr"; + + /** + * Whether the debugger has been paused. + */ + public var paused:Bool; + /** + * Whether a "1 frame step forward" was requested. + */ + public var stepRequested:Bool; + + private var _open:Bitmap; + private var _recordOff:Bitmap; + private var _recordOn:Bitmap; + private var _stop:Bitmap; + private var _flixel:Bitmap; + private var _restart:Bitmap; + private var _pause:Bitmap; + private var _play:Bitmap; + private var _step:Bitmap; + + private var _overOpen:Bool; + private var _overRecord:Bool; + private var _overRestart:Bool; + private var _overPause:Bool; + private var _overStep:Bool; + + private var _pressingOpen:Bool; + private var _pressingRecord:Bool; + private var _pressingRestart:Bool; + private var _pressingPause:Bool; + private var _pressingStep:Bool; + + private var _file:FileReference; + + private var _runtimeDisplay:TextField; + private var _runtime:Int; + + /** + * Creates the "VCR" control panel for debugger pausing, stepping, and recording. + */ + public function new() + { + super(); + + var spacing:Int=7; + + _open=new ImgOpen(); + addChild(_open); + + _recordOff=new ImgRecordOff(); + _recordOff.x=_open.x + _open.width + spacing; + addChild(_recordOff); + + _recordOn=new ImgRecordOn(); + _recordOn.x=_recordOff.x; + _recordOn.visible=false; + addChild(_recordOn); + + _stop=new ImgStop(); + _stop.x=_recordOff.x; + _stop.visible=false; + addChild(_stop); + + _flixel=new ImgFlixel(); + _flixel.x=_recordOff.x + _recordOff.width + spacing; + addChild(_flixel); + + _restart=new ImgRestart(); + _restart.x=_flixel.x + _flixel.width + spacing; + addChild(_restart); + + _pause=new ImgPause(); + _pause.x=_restart.x + _restart.width + spacing; + addChild(_pause); + + _play=new ImgPlay(); + _play.x=_pause.x; + _play.visible=false; + addChild(_play); + + _step=new ImgStep(); + _step.x=_pause.x + _pause.width + spacing; + addChild(_step); + + _runtimeDisplay=new TextField(); + _runtimeDisplay.width=width; + _runtimeDisplay.x=width; + _runtimeDisplay.y=-2; + _runtimeDisplay.multiline=false; + _runtimeDisplay.wordWrap=false; + _runtimeDisplay.selectable=false; + _runtimeDisplay.defaultTextFormat=new TextFormat("Courier",12,0xffffff,null,null,null,null,null,"center"); + _runtimeDisplay.visible=false; + addChild(_runtimeDisplay); + _runtime=0; + + stepRequested=false; + _file=null; + + unpress(); + checkOver(); + updateGUI(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _file=null; + + removeChild(_open); + _open=null; + removeChild(_recordOff); + _recordOff=null; + removeChild(_recordOn); + _recordOn=null; + removeChild(_stop); + _stop=null; + removeChild(_flixel); + _flixel=null; + removeChild(_restart); + _restart=null; + removeChild(_pause); + _pause=null; + removeChild(_play); + _play=null; + removeChild(_step); + _step=null; + + parent.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * Usually called by FlxGame when a requested recording has begun. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function recording():Void + { + _stop.visible=false; + _recordOff.visible=false; + _recordOn.visible=true; + } + + /** + * Usually called by FlxGame when a replay has been stopped. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function stopped():Void + { + _stop.visible=false; + _recordOn.visible=false; + _recordOff.visible=true; + } + + /** + * Usually called by FlxGame when a requested replay has begun. + * Just updates the VCR GUI so the buttons are in the right state. + */ + public function playing():Void + { + _recordOff.visible=false; + _recordOn.visible=false; + _stop.visible=true; + } + + /** + * Just updates the VCR GUI so the runtime displays roughly the right thing. + */ + public function updateRuntime(Time:Int):Void + { + _runtime +=Time; + _runtimeDisplay.text=FlxU.formatTime(_runtime/1000,true); + if(!_runtimeDisplay.visible) + _runtimeDisplay.visible=true; + } + + //*** ACTUAL BUTTON BEHAVIORS ***// + + /** + * Called when the "open file" button is pressed. + * Opens the file dialog and registers event handlers for the file dialog. + */ + public function onOpen():Void + { + _file=new FileReference(); + _file.addEventListener(Event.SELECT, onOpenSelect); + _file.addEventListener(Event.CANCEL, onOpenCancel); + _file.browse(FILE_TYPES); + } + + /** + * Called when a file is picked from the file dialog. + * Attempts to load the file and registers file loading event handlers. + * + * @param E Flash event. + */ + private function onOpenSelect(E:Event=null):Void + { + _file.removeEventListener(Event.SELECT, onOpenSelect); + _file.removeEventListener(Event.CANCEL, onOpenCancel); + + _file.addEventListener(Event.COMPLETE, onOpenComplete); + _file.addEventListener(IOErrorEvent.IO_ERROR, onOpenError); + _file.load(); + } + + /** + * Called when a file is opened successfully. + * If there's stuff inside, then the contents are loaded Into a new replay. + * + * @param E Flash Event. + */ + private function onOpenComplete(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onOpenComplete); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onOpenError); + + //Turn the file Into a giant string + var fileContents:String=null; + var data:ByteArray=_file.data; + if(data !=null) + fileContents=data.readUTFBytes(data.bytesAvailable); + _file=null; + if((fileContents==null)||(fileContents.length<=0)) + { + FlxG.log("ERROR:Empty flixel gameplay record."); + return; + } + + FlxG.loadReplay(fileContents); + } + + /** + * Called if the open file dialog is canceled. + * + * @param E Flash Event. + */ + private function onOpenCancel(E:Event=null):Void + { + _file.removeEventListener(Event.SELECT, onOpenSelect); + _file.removeEventListener(Event.CANCEL, onOpenCancel); + _file=null; + } + + /** + * Called if there is a file open error. + * + * @param E Flash Event. + */ + private function onOpenError(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onOpenComplete); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onOpenError); + _file=null; + FlxG.log("ERROR:Unable to open flixel gameplay record."); + } + + /** + * Called when the user presses the white record button. + * If Alt is pressed, the current state is reset, and a new recording is requested. + * If Alt is NOT pressed, the game is reset, and a new recording is requested. + * + * @param StandardMode Whether to reset the whole game, or just thisFlxState. StandardMode==false is useful for recording demos or attract modes. + */ + public function onRecord(StandardMode:Bool=false):Void + { + if(_play.visible) + onPlay(); + FlxG.recordReplay(StandardMode); + } + + /** + * Called when the user presses the red record button. + * Stops the current recording, opens the save file dialog, and registers event handlers. + */ + public function stopRecording():Void + { + var data:String=FlxG.stopRecording(); + if((data !=null)&&(data.length>0)) + { + _file=new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL,onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, DEFAULT_FILE_NAME); + } + } + + /** + * Called when the file is saved successfully. + * + * @param E Flash Event. + */ + private function onSaveComplete(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + FlxG.log("FLIXEL:successfully saved flixel gameplay record."); + } + + /** + * Called when the save file dialog is cancelled. + * + * @param E Flash Event. + */ + private function onSaveCancel(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + } + + /** + * Called if there is an error while saving the gameplay recording. + * + * @param E Flash Event. + */ + private function onSaveError(E:Event=null):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL,onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file=null; + FlxG.log("ERROR:problem saving flixel gameplay record."); + } + + /** + * Called when the user presses the stop button. + * Stops the current replay. + */ + public function onStop():Void + { + FlxG.stopReplay(); + } + + /** + * Called when the user presses the Rewind-looking button. + * If Alt is pressed, the entire game is reset. + * If Alt is NOT pressed, only the current state is reset. + * The GUI is updated accordingly. + * + * @param StandardMode Whether to reset the current game(==true), or just the current state. Just resetting the current state can be very handy for debugging. + */ + public function onRestart(StandardMode:Bool=false):Void + { + if(FlxG.reloadReplay(StandardMode)) + { + _recordOff.visible=false; + _recordOn.visible=false; + _stop.visible=true; + } + } + + /** + * Called when the user presses the Pause button. + * This is different from user-defined pause behavior, or focus lost behavior. + * Does NOT pause music playback!! + */ + public function onPause():Void + { + paused=true; + _pause.visible=false; + _play.visible=true; + } + + /** + * Called when the user presses the Play button. + * This is different from user-defined unpause behavior, or focus gained behavior. + */ + public function onPlay():Void + { + paused=false; + _play.visible=false; + _pause.visible=true; + } + + /** + * Called when the user presses the fast-forward-looking button. + * Requests a 1-frame step forward in the game loop. + */ + public function onStep():Void + { + if(!paused) + onPause(); + stepRequested=true; + } + + //***EVENT HANDLERS***// + + /** + * Just sets up basic mouse listeners, a la FlxWindow. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + parent.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * If the mouse moves, check to see if any buttons should be highlighted. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(!checkOver()) + unpress(); + updateGUI(); + } + + /** + * If the mouse is pressed down, check to see if the user started pressing down a specific button. + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + unpress(); + if(_overOpen) + _pressingOpen=true; + if(_overRecord) + _pressingRecord=true; + if(_overRestart) + _pressingRestart=true; + if(_overPause) + _pressingPause=true; + if(_overStep) + _pressingStep=true; + } + + /** + * If the mouse is released, check to see if it was released over a button that was pressed. + * If it was, take the appropriate action based on button state and visibility. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + if(_overOpen && _pressingOpen) + onOpen(); + else if(_overRecord && _pressingRecord) + { + if(_stop.visible) + onStop(); + else if(_recordOn.visible) + stopRecording(); + else + onRecord(!E.altKey); + } + else if(_overRestart && _pressingRestart) + onRestart(!E.altKey); + else if(_overPause && _pressingPause) + { + if(_play.visible) + onPlay(); + else + onPause(); + } + else if(_overStep && _pressingStep) + onStep(); + + unpress(); + checkOver(); + updateGUI(); + } + + //***MISC GUI MGMT STUFF***// + + /** + * This function checks to see what button the mouse is currently over. + * Has some special behavior based on whether a recording is happening or not. + * + * @return Whether the mouse was over any buttons or not. + */ + private function checkOver():Bool + { + _overOpen=_overRecord=_overRestart=_overPause=_overStep=false; + if((mouseX<0)||(mouseX>width)||(mouseY<0)||(mouseY>15)) + return false; + if((mouseX>=_recordOff.x)&&(mouseX<=_recordOff.x + _recordOff.width)) + _overRecord=true; + if(!_recordOn.visible && !_overRecord) + { + if((mouseX>=_open.x)&&(mouseX<=_open.x + _open.width)) + _overOpen=true; + else if((mouseX>=_restart.x)&&(mouseX<=_restart.x + _restart.width)) + _overRestart=true; + else if((mouseX>=_pause.x)&&(mouseX<=_pause.x + _pause.width)) + _overPause=true; + else if((mouseX>=_step.x)&&(mouseX<=_step.x + _step.width)) + _overStep=true; + } + return true; + } + + /** + * Sets all the pressed state variables for the buttons to false. + */ + private function unpress():Void + { + _pressingOpen=false; + _pressingRecord=false; + _pressingRestart=false; + _pressingPause=false; + _pressingStep=false; + } + + /** + * Figures out what buttons to highlight based on the _overWhatever and _pressingWhatever variables. + */ + private function updateGUI():Void + { + if(_recordOn.visible) + { + _open.alpha=_restart.alpha=_pause.alpha=_step.alpha=0.35; + _recordOn.alpha=1.0; + return; + } + + if(_overOpen &&(_open.alpha !=1.0)) + _open.alpha=1.0; + else if(!_overOpen &&(_open.alpha !=0.8)) + _open.alpha=0.8; + + if(_overRecord &&(_recordOff.alpha !=1.0)) + _recordOff.alpha=_recordOn.alpha=_stop.alpha=1.0; + else if(!_overRecord &&(_recordOff.alpha !=0.8)) + _recordOff.alpha=_recordOn.alpha=_stop.alpha=0.8; + + if(_overRestart &&(_restart.alpha !=1.0)) + _restart.alpha=1.0; + else if(!_overRestart &&(_restart.alpha !=0.8)) + _restart.alpha=0.8; + + if(_overPause &&(_pause.alpha !=1.0)) + _pause.alpha=_play.alpha=1.0; + else if(!_overPause &&(_pause.alpha !=0.8)) + _pause.alpha=_play.alpha=0.8; + + if(_overStep &&(_step.alpha !=1.0)) + _step.alpha=1.0; + else if(!_overStep &&(_step.alpha !=0.8)) + _step.alpha=0.8; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/debug/Vis.hx b/intra/source/org/flixel/system/debug/Vis.hx new file mode 100644 index 0000000..ac852d5 --- /dev/null +++ b/intra/source/org/flixel/system/debug/Vis.hx @@ -0,0 +1,170 @@ +package org.flixel.system.debug; + +import flash.display.Bitmap; +import flash.display.Sprite; +import flash.events.Event; +import flash.events.MouseEvent; + +import org.flixel.FlxG; + +/** + * This control panel has all the visual debugger toggles in it, in the debugger overlay. + * Currently there is only one toggle that flips on all the visual debug settings. + * This panel is heavily based on the VCR panel. + * + * @author Adam Atomic + */ +class Vis extends Sprite +{ + //[Embed(source="../../data/vis/bounds.png")] private var ImgBounds:Class; + + private var _bounds:Bitmap; + private var _overBounds:Bool; + private var _pressingBounds:Bool; + + /** + * Instantiate the visual debugger panel. + */ + public function new() + { + super(); + + var spacing:Int=7; + + _bounds=new ImgBounds(); + addChild(_bounds); + + unpress(); + checkOver(); + updateGUI(); + + addEventListener(Event.ENTER_FRAME,init); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + removeChild(_bounds); + _bounds=null; + + parent.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + //***ACTUAL BUTTON BEHAVIORS***// + + /** + * Called when the bounding box toggle is pressed. + */ + public function onBounds():Void + { + FlxG.visualDebug=!FlxG.visualDebug; + } + + //***EVENT HANDLERS***// + + /** + * Just sets up basic mouse listeners, a la FlxWindow. + * + * @param E Flash event. + */ + private function init(E:Event=null):Void + { + if(root==null) + return; + removeEventListener(Event.ENTER_FRAME,init); + + parent.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); + parent.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); + parent.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + } + + /** + * If the mouse moves, check to see if any buttons should be highlighted. + * + * @param E Flash mouse event. + */ + private function onMouseMove(E:MouseEvent=null):Void + { + if(!checkOver()) + unpress(); + updateGUI(); + } + + /** + * If the mouse is pressed down, check to see if the user started pressing down a specific button. + * + * @param E Flash mouse event. + */ + private function onMouseDown(E:MouseEvent=null):Void + { + unpress(); + if(_overBounds) + _pressingBounds=true; + } + + /** + * If the mouse is released, check to see if it was released over a button that was pressed. + * If it was, take the appropriate action based on button state and visibility. + * + * @param E Flash mouse event. + */ + private function onMouseUp(E:MouseEvent=null):Void + { + if(_overBounds && _pressingBounds) + onBounds(); + unpress(); + checkOver(); + updateGUI(); + } + + //***MISC GUI MGMT STUFF***// + + /** + * This function checks to see what button the mouse is currently over. + * Has some special behavior based on whether a recording is happening or not. + * + * @return Whether the mouse was over any buttons or not. + */ + private function checkOver():Bool + { + _overBounds=false; + if((mouseX<0)||(mouseX>width)||(mouseY<0)||(mouseY>height)) + return false; + if((mouseX>_bounds.x)||(mouseX<_bounds.x + _bounds.width)) + _overBounds=true; + return true; + } + + /** + * Sets all the pressed state variables for the buttons to false. + */ + private function unpress():Void + { + _pressingBounds=false; + } + + /** + * Figures out what buttons to highlight based on the _overWhatever and _pressingWhatever variables. + */ + private function updateGUI():Void + { + if(FlxG.visualDebug) + { + if(_overBounds &&(_bounds.alpha !=1.0)) + _bounds.alpha=1.0; + else if(!_overBounds &&(_bounds.alpha !=0.9)) + _bounds.alpha=0.9; + } + else + { + if(_overBounds &&(_bounds.alpha !=0.6)) + _bounds.alpha=0.6; + else if(!_overBounds &&(_bounds.alpha !=0.5)) + _bounds.alpha=0.5; + } + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/debug/Watch.hx b/intra/source/org/flixel/system/debug/Watch.hx new file mode 100644 index 0000000..064ebf4 --- /dev/null +++ b/intra/source/org/flixel/system/debug/Watch.hx @@ -0,0 +1,213 @@ +package org.flixel.system.debug; + +import flash.display.Sprite; +import flash.geom.Rectangle; +import flash.text.TextField; +import flash.text.TextFormat; + +import org.flixel.FlxU; +import org.flixel.system.FlxWindow; + +/** + * A Visual Studio-style "watch" window, for use in the debugger overlay. + * Track the values of any public variable in real-time, and/or edit their values on the fly. + * + * @author Adam Atomic + */ +class Watch extends FlxWindow +{ + static protected var MAX_LOG_LINES:Int=1024; + static protected var LINE_HEIGHT:Int=15; + + /** + * Whether a watch entry is currently being edited or not. + */ + public var editing:Bool; + + private var _names:Sprite; + private var _values:Sprite; + private var _watching:Array; + + /** + * Creates a new window object. This Flash-based class is mainly(only?)used byFlxDebugger. + * + * @param Title The name of the window, displayed in the header bar. + * @param Width The initial width of the window. + * @param Height The initial height of the window. + * @param Resizable Whether you can change the size of the window with a drag handle. + * @param Bounds A rectangle indicating the valid screen area for the window. + * @param BGColor What color the window background should be, default is gray and transparent. + * @param TopColor What color the window header bar should be, default is black and transparent. + */ + public function new(Title:String, Width:Float, Height:Float, Resizable:Bool=true, Bounds:Rectangle=null, BGColor:Int=0x7f7f7f7f, TopColor:Int=0x7f000000) + { + super(Title, Width, Height, Resizable, Bounds, BGColor, TopColor); + + _names=new Sprite(); + _names.x=2; + _names.y=15; + addChild(_names); + + _values=new Sprite(); + _values.x=2; + _values.y=15; + addChild(_values); + + _watching=new Array(); + + editing=false; + + removeAll(); + } + + /** + * Clean up memory. + */ + override public function destroy():Void + { + removeChild(_names); + _names=null; + removeChild(_values); + _values=null; + var i:Int=0; + var l:Int=_watching.length; + while(iObjectcontaining the variable you want to track, e.g. this or Player.velocity. + * @param VariableName TheStringname of the variable you want to track, e.g. "width" or "x". + * @param DisplayName OptionalStringthat can be displayed in the watch window instead of the basic class-name information. + */ + public function add(AnyObject:Dynamic,VariableName:String,DisplayName:String=null):Void + { + //Don't add repeats + var watchEntry:WatchEntry; + var i:Int=0; + var l:Int=_watching.length; + while(iObjectcontaining the variable you want to remove, e.g. this or Player.velocity. + * @param VariableName TheStringname of the variable you want to remove, e.g. "width" or "x". If left null, this will remove all variables of that object. + */ + public function remove(AnyObject:Dynamic,VariableName:String=null):Void + { + //splice out the requested object + var watchEntry:WatchEntry; + var i:Int=_watching.length-1; + while(i>=0) + { + watchEntry=_watching[i]; + if((watchEntry.object==AnyObject)&&((VariableName==null)||(watchEntry.field==VariableName))) + { + _watching.splice(i,1); + _names.removeChild(watchEntry.nameDisplay); + _values.removeChild(watchEntry.valueDisplay); + watchEntry.destroy(); + } + i--; + } + watchEntry=null; + + //reset the display heights of the remaining objects + i=0; + var l:Int=_watching.length; + while(iObjectbeing watched. + */ + public var object:Dynamic; + /** + * The member variable of that object. + */ + public var field:String; + /** + * A custom display name for this object, if there is any. + */ + public var custom:String; + /** + * The FlashTextFieldobject used to display this entry's name. + */ + public var nameDisplay:TextField; + /** + * The FlashTextFieldobject used to display and edit this entry's value. + */ + public var valueDisplay:TextField; + /** + * Whether the entry is currently being edited or not. + */ + public var editing:Bool; + /** + * The value of the field before it was edited. + */ + public var oldValue:Dynamic; + + private var _whiteText:TextFormat; + private var _blackText:TextFormat; + + /** + * Creates a new watch entry in the watch window. + * + * @param Y The initial height in the Watch window. + * @param NameWidth The initial width of the name field. + * @param ValueWidth The initial width of the value field. + * @param Obj TheObjectcontaining the variable we want to watch. + * @param Field The variable name we want to watch. + * @param Custom A custom display name(optional). + */ + public function new(Y:Float,NameWidth:Float,ValueWidth:Float,Obj:Dynamic,Field:String,Custom:String=null) + { + editing=false; + + object=Obj; + field=Field; + custom=Custom; + + _whiteText=new TextFormat("Courier",12,0xffffff); + _blackText=new TextFormat("Courier",12,0); + + nameDisplay=new TextField(); + nameDisplay.y=Y; + nameDisplay.multiline=false; + nameDisplay.selectable=true; + nameDisplay.defaultTextFormat=_whiteText; + + valueDisplay=new TextField(); + valueDisplay.y=Y; + valueDisplay.height=15; + valueDisplay.multiline=false; + valueDisplay.selectable=true; + valueDisplay.doubleClickEnabled=true; + valueDisplay.addEventListener(KeyboardEvent.KEY_UP,onKeyUp); + valueDisplay.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); + valueDisplay.background=false; + valueDisplay.backgroundColor=0xffffff; + valueDisplay.defaultTextFormat=_whiteText; + + updateWidth(NameWidth,ValueWidth); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + object=null; + oldValue=null; + nameDisplay=null; + field=null; + custom=null; + valueDisplay.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); + valueDisplay.removeEventListener(KeyboardEvent.KEY_UP,onKeyUp); + valueDisplay=null; + } + + /** + * Set the watch window Y height of the FlashTextFieldobjects. + */ + public function setY(Y:Float):Void + { + nameDisplay.y=Y; + valueDisplay.y=Y; + } + + /** + * Adjust the width of the FlashTextFieldobjects. + */ + public function updateWidth(NameWidth:Float,ValueWidth:Float):Void + { + nameDisplay.width=NameWidth; + valueDisplay.width=ValueWidth; + if(custom !=null) + nameDisplay.text=custom; + else + { + nameDisplay.text=""; + if(NameWidth>120) + nameDisplay.appendText(FlxU.getClassName(object,(NameWidth<240))+ "."); + nameDisplay.appendText(field); + } + } + + /** + * Update the variable value on display with the current in-game value. + */ + public function updateValue():Bool + { + if(editing) + return false; + valueDisplay.text=object[field].toString(); + return true; + } + + /** + * A watch entry was clicked, so flip Into edit mode for that entry. + * + * @param FlashEvent Flash mouse event. + */ + public function onMouseUp(FlashEvent:MouseEvent):Void + { + editing=true; + oldValue=object[field]; + valueDisplay.type=TextFieldType.INPUT; + valueDisplay.setTextFormat(_blackText); + valueDisplay.background=true; + + } + + /** + * Check to see if Enter, Tab or Escape were just released. + * Enter or Tab submit the change, and Escape cancels it. + * + * @param FlashEvent Flash keyboard event. + */ + public function onKeyUp(FlashEvent:KeyboardEvent):Void + { + if((FlashEvent.keyCode==13)||(FlashEvent.keyCode==9)||(FlashEvent.keyCode==27))//enter or tab or escape + { + if(FlashEvent.keyCode==27) + cancel(); + else + submit(); + } + } + + /** + * Cancel the current edits and stop editing. + */ + public function cancel():Void + { + valueDisplay.text=oldValue.toString(); + doneEditing(); + } + + /** + * Submit the current edits and stop editing. + */ + public function submit():Void + { + object[field]=valueDisplay.text; + doneEditing(); + } + + /** + * Helper function, switches the text field back to display mode. + */ + private function doneEditing():Void + { + valueDisplay.type=TextFieldType.DYNAMIC; + valueDisplay.setTextFormat(_whiteText); + valueDisplay.defaultTextFormat=_whiteText; + valueDisplay.background=false; + editing=false; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/input/Input.hx b/intra/source/org/flixel/system/input/Input.hx new file mode 100644 index 0000000..ac82baa --- /dev/null +++ b/intra/source/org/flixel/system/input/Input.hx @@ -0,0 +1,189 @@ +package org.flixel.system.input; + +/** + * Basic input class that manages the fast-access Bools and detailed key-state tracking. + * Keyboard extends this with actual specific key data. + * + * @author Adam Atomic + */ +class Input +{ + /** + * @private + */ + public var _lookup:Dynamic; + /** + * @private + */ + public var _map:Array; + /** + * @private + */ + internal var _total:Int=258; + + /** + * Constructor + */ + public function new() + { + _lookup=new Dynamic(); + _map=new Array(_total); + } + + /** + * Updates the key states(for tracking just pressed, just released, etc). + */ + public function update():Void + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if(o==null)continue; + if((o.last==-1)&&(o.current==-1))o.current=0; + else if((o.last==2)&&(o.current==2))o.current=1; + o.last=o.current; + } + } + + /** + * Resets all the keys. + */ + public function reset():Void + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if(o==null)continue; + this[o.name]=false; + o.current=0; + o.last=0; + } + } + + /** + * Check to see if this key is pressed. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key is pressed + */ + public function pressed(Key:String):Bool { return this[Key];} + + /** + * Check to see if this key was just pressed. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key was just pressed + */ + public function justPressed(Key:String):Bool { return _map[_lookup[Key]].current==2;} + + /** + * Check to see if this key is just released. + * + * @param Key One of the key constants listed above(e.g. "LEFT" or "A"). + * + * @return Whether the key is just released. + */ + public function justReleased(Key:String):Bool { return _map[_lookup[Key]].current==-1;} + + /** + * If any keys are not "released"(0), + * this function will return an array indicating + * which keys are pressed and what state they are in. + * + * @return An array of key state data. Null if there is no data. + */ + public function record():Array + { + var data:Array=null; + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if((o==null)||(o.current==0)) + continue; + if(data==null) + data=new Array(); + data.push({code:i-1,value:o.current}); + } + return data; + } + + /** + * Part of the keystroke recording system. + * Takes data about key presses and sets it Into array. + * + * @param Record Array of data about key states. + */ + public function playback(Record:Array):Void + { + var i:Int=0; + var l:Int=Record.length; + var o:Dynamic; + var o2:Dynamic; + while(i0) + this[o2.name]=true; + } + } + + /** + * Look up the key code for any given string name of the key or button. + * + * @param KeyName TheStringname of the key. + * + * @return The key code for that key. + */ + public function getKeyCode(KeyName:String):Int + { + return _lookup[KeyName]; + } + + /** + * Check to see if any keys are pressed right now. + * + * @return Whether any keys are currently pressed. + */ + public function any():Bool + { + var i:Int=0; + while(i<_total) + { + var o:Dynamic=_map[i++]; + if((o !=null)&&(o.current>0)) + return true; + } + return false; + } + + /** + * An Internal helper function used to build the key array. + * + * @param KeyName String name of the key(e.g. "LEFT" or "A") + * @param KeyCode The numeric Flash code for this key. + */ + private function addKey(KeyName:String,KeyCode:Int):Void + { + _lookup[KeyName]=KeyCode; + _map[KeyCode]={ name:KeyName, current:0, last:0 }; + } + + public function getKeyName(KeyCode:Int):String { + return _map[KeyCode]["name"]; + } + /** + * Clean up memory. + */ + public function destroy():Void + { + _lookup=null; + _map=null; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/input/Keyboard.hx b/intra/source/org/flixel/system/input/Keyboard.hx new file mode 100644 index 0000000..dc9e9c1 --- /dev/null +++ b/intra/source/org/flixel/system/input/Keyboard.hx @@ -0,0 +1,210 @@ +package org.flixel.system.input; + +import flash.events.KeyboardEvent; + +/** + * Keeps track of what keys are pressed and how with handy booleans or strings. + * + * @author Adam Atomic + */ +class Keyboard extends Input +{ + public var ESCAPE:Bool; + public var F1:Bool; + public var F2:Bool; + public var F3:Bool; + public var F4:Bool; + public var F5:Bool; + public var F6:Bool; + public var F7:Bool; + public var F8:Bool; + public var F9:Bool; + public var F10:Bool; + public var F11:Bool; + public var F12:Bool; + public var ONE:Bool; + public var TWO:Bool; + public var THREE:Bool; + public var FOUR:Bool; + public var FIVE:Bool; + public var SIX:Bool; + public var SEVEN:Bool; + public var EIGHT:Bool; + public var NINE:Bool; + public var ZERO:Bool; + public var NUMPADONE:Bool; + public var NUMPADTWO:Bool; + public var NUMPADTHREE:Bool; + public var NUMPADFOUR:Bool; + public var NUMPADFIVE:Bool; + public var NUMPADSIX:Bool; + public var NUMPADSEVEN:Bool; + public var NUMPADEIGHT:Bool; + public var NUMPADNINE:Bool; + public var NUMPADZERO:Bool; + public var PAGEUP:Bool; + public var PAGEDOWN:Bool; + public var HOME:Bool; + public var END:Bool; + public var INSERT:Bool; + public var MINUS:Bool; + public var NUMPADMINUS:Bool; + public var PLUS:Bool; + public var NUMPADPLUS:Bool; + public var DELETE:Bool; + public var BACKSPACE:Bool; + public var TAB:Bool; + public var Q:Bool; + public var W:Bool; + public var E:Bool; + public var R:Bool; + public var T:Bool; + public var Y:Bool; + public var U:Bool; + public var I:Bool; + public var O:Bool; + public var P:Bool; + public var LBRACKET:Bool; + public var RBRACKET:Bool; + public var BACKSLASH:Bool; + public var CAPSLOCK:Bool; + public var A:Bool; + public var S:Bool; + public var D:Bool; + public var F:Bool; + public var G:Bool; + public var H:Bool; + public var J:Bool; + public var K:Bool; + public var L:Bool; + public var SEMICOLON:Bool; + public var QUOTE:Bool; + public var ENTER:Bool; + public var SHIFT:Bool; + public var Z:Bool; + public var X:Bool; + public var C:Bool; + public var V:Bool; + public var B:Bool; + public var N:Bool; + public var M:Bool; + public var COMMA:Bool; + public var PERIOD:Bool; + public var NUMPADPERIOD:Bool; + public var SLASH:Bool; + public var NUMPADSLASH:Bool; + public var CONTROL:Bool; + public var ALT:Bool; + public var SPACE:Bool; + public var UP:Bool; + public var DOWN:Bool; + public var LEFT:Bool; + public var RIGHT:Bool; + + public function new() + { + var i:Int; + + //LETTERS + i=65; + while(i<=90) + addKey(String.fromCharCode(i),i++); + + //NUMBERS + i=48; + addKey("ZERO",i++); + addKey("ONE",i++); + addKey("TWO",i++); + addKey("THREE",i++); + addKey("FOUR",i++); + addKey("FIVE",i++); + addKey("SIX",i++); + addKey("SEVEN",i++); + addKey("EIGHT",i++); + addKey("NINE",i++); + i=96; + addKey("NUMPADZERO",i++); + addKey("NUMPADONE",i++); + addKey("NUMPADTWO",i++); + addKey("NUMPADTHREE",i++); + addKey("NUMPADFOUR",i++); + addKey("NUMPADFIVE",i++); + addKey("NUMPADSIX",i++); + addKey("NUMPADSEVEN",i++); + addKey("NUMPADEIGHT",i++); + addKey("NUMPADNINE",i++); + addKey("PAGEUP", 33); + addKey("PAGEDOWN", 34); + addKey("HOME", 36); + addKey("END", 35); + addKey("INSERT", 45); + //FUNCTION KEYS + i=1; + while(i<=12) + addKey("F"+i,111+(i++)); + + //SPECIAL KEYS + PUNCTUATION + addKey("ESCAPE",27); + addKey("MINUS",189); + addKey("NUMPADMINUS",109); + addKey("PLUS",187); + addKey("NUMPADPLUS",107); + addKey("DELETE",46); + addKey("BACKSPACE",8); + addKey("LBRACKET",219); + addKey("RBRACKET",221); + addKey("BACKSLASH",220); + addKey("CAPSLOCK",20); + addKey("SEMICOLON",186); + addKey("QUOTE",222); + addKey("ENTER",13); + addKey("SHIFT",16); + addKey("COMMA",188); + addKey("PERIOD",190); + addKey("NUMPADPERIOD",110); + addKey("SLASH",191); + addKey("NUMPADSLASH",191); + addKey("CONTROL",17); + addKey("ALT",18); + addKey("SPACE",32); + addKey("UP",38); + addKey("DOWN",40); + addKey("LEFT",37); + addKey("RIGHT",39); + addKey("TAB",9); + } + + /** + * Event handler so FlxGame can toggle keys. + * + * @param FlashEvent AKeyboardEventobject. + */ + public function handleKeyDown(FlashEvent:KeyboardEvent):Void + { + var object:Dynamic=null; + object=_map[FlashEvent.keyCode]; + if(object==null){ + return; + } + if(object.current>0)object.current=1; + else object.current=2; + this[object.name]=true; + } + + /** + * Event handler so FlxGame can toggle keys. + * + * @param FlashEvent AKeyboardEventobject. + */ + public function handleKeyUp(FlashEvent:KeyboardEvent):Void + { + var object:Dynamic=null; + object=_map[FlashEvent.keyCode]; + if(object==null){ + return; + } + if(object.current>0)object.current=-1; + else object.current=0; + this[object.name]=false; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/input/Mouse.hx b/intra/source/org/flixel/system/input/Mouse.hx new file mode 100644 index 0000000..4488ebe --- /dev/null +++ b/intra/source/org/flixel/system/input/Mouse.hx @@ -0,0 +1,338 @@ +package org.flixel.system.input; + +import flash.display.Bitmap; +import flash.display.Sprite; +import flash.events.MouseEvent; + +import org.flixel.FlxCamera; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxU; +import org.flixel.system.replay.MouseRecord; + +/** + * This class helps contain and track the mouse pointer in your game. + * Automatically accounts for parallax scrolling, etc. + * + * @author Adam Atomic + */ +class Mouse extends FlxPoint +{ + //[Embed(source="../../data/cursor.png")] private var ImgDefaultCursor:Class; + + /** + * Current "delta" value of mouse wheel. If the wheel was just scrolled up, it will have a positive value. If it was just scrolled down, it will have a negative value. If it wasn't just scroll this frame, it will be 0. + */ + public var wheel:Int; + /** + * Current X position of the mouse pointer on the screen. + */ + public var screenX:Int; + /** + * Current Y position of the mouse pointer on the screen. + */ + public var screenY:Int; + + /** + * Helper variable for tracking whether the mouse was just pressed or just released. + */ + private var _current:Int; + /** + * Helper variable for tracking whether the mouse was just pressed or just released. + */ + private var _last:Int; + /** + * A display container for the mouse cursor. + * This container is a child of FlxGame and sits at the right "height". + */ + private var _cursorContainer:Sprite; + /** + * This is just a reference to the current cursor image, if there is one. + */ + private var _cursor:Bitmap; + /** + * Helper variables for recording purposes. + */ + private var _lastX:Int; + private var _lastY:Int; + private var _lastWheel:Int; + private var _point:FlxPoint; + private var _globalScreenPosition:FlxPoint; + + /** + * Constructor. + */ + public function new(CursorContainer:Sprite) + { + super(); + _cursorContainer=CursorContainer; + _lastX=screenX=0; + _lastY=screenY=0; + _lastWheel=wheel=0; + _current=0; + _last=0; + _cursor=null; + _point=new FlxPoint(); + _globalScreenPosition=new FlxPoint(); + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + _cursorContainer=null; + _cursor=null; + _point=null; + _globalScreenPosition=null; + } + + /** + * Either show an existing cursor or load a new one. + * + * @param Graphic The image you want to use for the cursor. + * @param Scale Change the size of the cursor. Default=1, or native size. 2=cast(2x, big), 0.5=half size, etc. + * @param XOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + * @param YOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + */ + public function show(Graphic:Class=null,Scale:Float=1,XOffset:Int=0,YOffset:Int=0):Void + { + _cursorContainer.visible=true; + if(Graphic !=null) + load(Graphic,Scale,XOffset,YOffset); + else if(_cursor==null) + load(); + } + + /** + * Hides the mouse cursor + */ + public function hide():Void + { + _cursorContainer.visible=false; + } + + /** + * Read only, check visibility of mouse cursor. + */ + public var visible(get_visible, null):Bool; + private function get_visible():Bool + { + return _cursorContainer.visible; + } + + /** + * Load a new mouse cursor graphic + * + * @param Graphic The image you want to use for the cursor. + * @param Scale Change the size of the cursor. + * @param XOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + * @param YOffset The number of pixels between the mouse's screen position and the graphic's top left corner. + */ + public function load(Graphic:Class=null,Scale:Float=1,XOffset:Int=0,YOffset:Int=0):Void + { + if(_cursor !=null) + _cursorContainer.removeChild(_cursor); + + if(Graphic==null) + Graphic=ImgDefaultCursor; + _cursor=new Graphic(); + _cursor.x=XOffset; + _cursor.y=YOffset; + _cursor.scaleX=Scale; + _cursor.scaleY=Scale; + + _cursorContainer.addChild(_cursor); + } + + /** + * Unload the current cursor graphic. If the current cursor is visible, + * then the default system cursor is loaded up to replace the old one. + */ + public function unload():Void + { + if(_cursor !=null) + { + if(_cursorContainer.visible) + load(); + else + { + _cursorContainer.removeChild(_cursor) + _cursor=null; + } + } + } + + /** + * Called by the Internal game loop to update the mouse pointer's position in the game world. + * Also updates the just pressed/just released flags. + * + * @param X The current X position of the mouse in the window. + * @param Y The current Y position of the mouse in the window. + * @param XScroll The amount the game world has scrolled horizontally. + * @param YScroll The amount the game world has scrolled vertically. + */ + public function update(X:Int,Y:Int):Void + { + _globalScreenPosition.x=X; + _globalScreenPosition.y=Y; + updateCursor(); + if((_last==-1)&&(_current==-1)) + _current=0; + else if((_last==2)&&(_current==2)) + _current=1; + _last=_current; + } + + /** + * Internal function for helping to update the mouse cursor and world coordinates. + */ + private function updateCursor():Void + { + //actually position the flixel mouse cursor graphic + _cursorContainer.x=_globalScreenPosition.x; + _cursorContainer.y=_globalScreenPosition.y; + + //update the x, y, screenX, and screenY variables based on the default camera. + //This is basically a combination of getWorldPosition()and getScreenPosition() + var camera:FlxCamera=FlxG.camera; + screenX=(_globalScreenPosition.x - camera.x)/camera.zoom; + screenY=(_globalScreenPosition.y - camera.y)/camera.zoom; + x=screenX + camera.scroll.x; + y=screenY + camera.scroll.y; + } + + /** + * Fetch the world position of the mouse on any given camera. + * NOTE:Mouse.x and Mouse.y also store the world position of the mouse cursor on the main camera. + * + * @param Camera If unspecified, first/main global camera is used instead. + * @param Point An existing point object to store the results(if you don't want a new one created). + * + * @return The mouse's location in world space. + */ + public function getWorldPosition(Camera:FlxCamera=null,Point:FlxPoint=null):FlxPoint + { + if(Camera==null) + Camera=FlxG.camera; + if(Point==null) + Point=new FlxPoint(); + getScreenPosition(Camera,_point); + Point.x=_point.x + Camera.scroll.x; + Point.y=_point.y + Camera.scroll.y; + return Point; + } + + /** + * Fetch the screen position of the mouse on any given camera. + * NOTE:Mouse.screenX and Mouse.screenY also store the screen position of the mouse cursor on the main camera. + * + * @param Camera If unspecified, first/main global camera is used instead. + * @param Point An existing point object to store the results(if you don't want a new one created). + * + * @return The mouse's location in screen space. + */ + public function getScreenPosition(Camera:FlxCamera=null,Point:FlxPoint=null):FlxPoint + { + if(Camera==null) + Camera=FlxG.camera; + if(Point==null) + Point=new FlxPoint(); + Point.x=(_globalScreenPosition.x - Camera.x)/Camera.zoom; + Point.y=(_globalScreenPosition.y - Camera.y)/Camera.zoom; + return Point; + } + + /** + * Resets the just pressed/just released flags and sets mouse to not pressed. + */ + public function reset():Void + { + _current=0; + _last=0; + } + + /** + * Check to see if the mouse is pressed. + * + * @return Whether the mouse is pressed. + */ + public function pressed():Bool { return _current>0;} + + /** + * Check to see if the mouse was just pressed. + * + * @return Whether the mouse was just pressed. + */ + public function justPressed():Bool { return _current==2;} + + /** + * Check to see if the mouse was just released. + * + * @return Whether the mouse was just released. + */ + public function justReleased():Bool { return _current==-1;} + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseDown(FlashEvent:MouseEvent):Void + { + if(_current>0)_current=1; + else _current=2; + } + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseUp(FlashEvent:MouseEvent):Void + { + if(_current>0)_current=-1; + else _current=0; + } + + /** + * Event handler so FlxGame can update the mouse. + * + * @param FlashEvent AMouseEventobject. + */ + public function handleMouseWheel(FlashEvent:MouseEvent):Void + { + wheel=FlashEvent.delta; + } + + /** + * If the mouse changed state or is pressed, return that info now + * + * @return An array of key state data. Null if there is no data. + */ + public function record():MouseRecord + { + if((_lastX==_globalScreenPosition.x)&&(_lastY==_globalScreenPosition.y)&&(_current==0)&&(_lastWheel==wheel)) + return null; + _lastX=_globalScreenPosition.x; + _lastY=_globalScreenPosition.y; + _lastWheel=wheel; + return new MouseRecord(_lastX,_lastY,_current,_lastWheel); + } + + /** + * Part of the keystroke recording system. + * Takes data about key presses and sets it Into array. + * + * @param KeyStates Array of data about key states. + */ + public function playback(Record:MouseRecord):Void + { + _current=Record.button; + wheel=Record.wheel; + _globalScreenPosition.x=Record.x; + _globalScreenPosition.y=Record.y; + updateCursor(); + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/replay/FrameRecord.hx b/intra/source/org/flixel/system/replay/FrameRecord.hx new file mode 100644 index 0000000..8653f2a --- /dev/null +++ b/intra/source/org/flixel/system/replay/FrameRecord.hx @@ -0,0 +1,142 @@ +package org.flixel.system.replay; + + +/** + * Helper class for the new replay system. Represents all the game inputs for one "frame" or "step" of the game loop. + * + * @author Adam Atomic + */ +class FrameRecord +{ + /** + * Which frame of the game loop this record is from or for. + */ + public var frame:Int; + /** + * An array of simple Integer pairs referring to what key is pressed, and what state its in. + */ + public var keys:Array; + /** + * A container for the 4 mouse state Integers. + */ + public var mouse:MouseRecord; + + /** + * Instantiate array new frame record. + */ + public function new() + { + frame=0; + keys=null; + mouse=null; + } + + /** + * Load this frame record with input data from the input managers. + * + * @param Frame What frame it is. + * @param Keys Keyboard data from the keyboard manager. + * @param Mouse Mouse data from the mouse manager. + * + * @return A reference to thisFrameRecordobject. + * + */ + public function create(Frame:Float,Keys:Array=null,Mouse:MouseRecord=null):FrameRecord + { + frame=Frame; + keys=Keys; + mouse=Mouse; + return this; + } + + /** + * Clean up memory. + */ + public function destroy():Void + { + keys=null; + mouse=null; + } + + /** + * Save the frame record data to array simple ASCII string. + * + * @return AStringobject containing the relevant frame record data. + */ + public function save():String + { + var output:String=frame+"k"; + + if(keys !=null) + { + var object:Dynamic; + var i:Int=0; + var l:Int=keys.length; + while(i0) + output +=","; + object=keys[i++]; + output +=object.code+":"+object.value; + } + } + + output +="m"; + if(mouse !=null) + output +=mouse.x + "," + mouse.y + "," + mouse.button + "," + mouse.wheel; + + return output; + } + + /** + * Load the frame record data from array simple ASCII string. + * + * @param Data AStringobject containing the relevant frame record data. + */ + public function load(Data:String):FrameRecord + { + var i:Int; + var l:Int; + + //get frame number + var array:Array=Data.split("k"); + frame=Std.int(array[0] as String); + + //split up keyboard and mouse data + array=(array[1] as String).split("m"); + var keyData:String=array[0]; + var mouseData:String=array[1]; + + //parse keyboard data + if(keyData.length>0) + { + //get keystroke data pairs + array=keyData.split(","); + + //go through each data pair and enter it Into this frame's key state + var keyPair:Array; + i=0; + l=array.length; + while(i0) + { + array=mouseData.split(","); + if(array.length>=4) + mouse=new MouseRecord(int(array[0] as String),int(array[1] as String),int(array[2] as String),int(array[3] as String)); + } + + return this; + } +} \ No newline at end of file diff --git a/intra/source/org/flixel/system/replay/MouseRecord.hx b/intra/source/org/flixel/system/replay/MouseRecord.hx new file mode 100644 index 0000000..bf5d1c6 --- /dev/null +++ b/intra/source/org/flixel/system/replay/MouseRecord.hx @@ -0,0 +1,42 @@ +package org.flixel.system.replay; + +/** + * A helper class for the frame records, part of the replay/demo/recording system. + * + * @author Adam Atomic + */ +class MouseRecord +{ + /** + * The main X value of the mouse in screen space. + */ + public var x:Int; + /** + * The main Y value of the mouse in screen space. + */ + public var y:Int; + /** + * The state of the left mouse button. + */ + public var button:Int; + /** + * The state of the mouse wheel. + */ + public var wheel:Int; + + /** + * Instantiate a new mouse input record. + * + * @param X The main X value of the mouse in screen space. + * @param Y The main Y value of the mouse in screen space. + * @param Button The state of the left mouse button. + * @param Wheel The state of the mouse wheel. + */ + public function new(X:Int,Y:Int,Button:Int,Wheel:Int) + { + x=X; + y=Y; + button=Button; + wheel=Wheel; + } +} \ No newline at end of file diff --git a/intra/source/states/ControlsState.hx b/intra/source/states/ControlsState.hx new file mode 100644 index 0000000..1e064e5 --- /dev/null +++ b/intra/source/states/ControlsState.hx @@ -0,0 +1,232 @@ +package states +{ +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxText; +import global.Registry; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import global.Keys; +import org.flixel.FlxG; +import flash.events.KeyboardEvent; +/** + * ... + * @author Seagaia + */ +class ControlsState extends PushableFlxState +{ + + //[Embed(source="../res/sprites/inventory/controls.png")] public static var S_CONTROLS:Class; + public var bg:FlxSprite=new FlxSprite(0, 0); + public var instruction:FlxBitmapFont; + + public var controls:FlxBitmapFont; + public var i:Int=0; + private var input:String; + private var recent_key_code:Int=1000; + public var updating:Bool=false; + private var filler:String=" \n"; + public var is_blank_world:Bool=false; + + public function new(){ + create(); + } + override public function create():Void { + + controls=EventScripts.init_bitmap_font(" ", "center", 8,16, null, "apple_white"); + instruction=EventScripts.init_bitmap_font(" ", "center", 22, 102, null, "apple_white"); + + //instruction.setText("Press " + Registry.controls[Keys.IDX_LEFT] + "\nto set controls.\n"+Registry.controls[Keys.IDX_PAUSE]+"\n to cancel.", true, 0, 0, "center", true); + instruction.setText(DH.lk("controls",0)+ " "+Registry.controls[Keys.IDX_LEFT] + "\n"+DH.lk("controls",1)+"\n"+Registry.controls[Keys.IDX_PAUSE]+"\n "+DH.lk("controls",2), true, 0, 0, "center", true); + instruction.x=25;instruction.y=102;instruction.scrollFactor=new FlxPoint(0, 0); + bg.scrollFactor=new FlxPoint(0, 0); + bg.x=16; + bg.y=16; + bg.loadGraphic(S_CONTROLS, false, false, 135, 125); + + add(bg); + + controls.setText(filler, true, 0, 0, "center", true); + controls.x=18;controls.y=16;controls.scrollFactor=new FlxPoint(0, 0); + instruction.color=controls.color=0xffffff; + instruction.drop_shadow=controls.drop_shadow=true; + FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + add(controls); + add(instruction); + } + + override public function destroy():Void { + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); + controls.destroy(); + controls=null; + instruction.destroy(); + instruction=null; + bg=null; + super.destroy(); + } + + public function change_text():Void { + remove(controls, true); + remove(instruction, true); + + controls=EventScripts.init_bitmap_font(" ", "center", 8,16, null, "apple_white"); + instruction=EventScripts.init_bitmap_font(" ", "center", 22, 102, null, "apple_white"); + + if(DH.language_type==DH.LANG_ko){ + instruction.setText(Registry.controls[Keys.IDX_LEFT] + "\n" + DH.lk("controls", 1)+ "\n" + Registry.controls[Keys.IDX_PAUSE] + "\n " + DH.lk("controls", 2), true, 0, 0, "center", true); + + } else { + instruction.setText(DH.lk("controls", 0)+ " " + Registry.controls[Keys.IDX_LEFT] + "\n" + DH.lk("controls", 1)+ "\n" + Registry.controls[Keys.IDX_PAUSE] + "\n " + DH.lk("controls", 2), true, 0, 0, "center", true); + } + + instruction.x=25;instruction.y=102;instruction.scrollFactor=new FlxPoint(0, 0); + + controls.setText(filler, true, 0, 0, "center", true); + controls.x=18;controls.y=16;controls.scrollFactor=new FlxPoint(0, 0); + + instruction.color=controls.color=0xffffff; + instruction.drop_shadow=controls.drop_shadow=true; + + add(controls); + add(instruction); + } + public function reportKeyDown(event:KeyboardEvent):Void { + recent_key_code=event.keyCode; + } + override public function update():Void { + + if(is_blank_world){ + controls.setText(filler+DH.lk("controls",3)+":" + Registry.controls[Keys.IDX_UP] + + "\n"+DH.lk("controls",4)+":" + Registry.controls[Keys.IDX_DOWN] + + "\n"+DH.lk("controls",5)+":" + Registry.controls[Keys.IDX_LEFT] + + "\n"+DH.lk("controls",6)+":" + Registry.controls[Keys.IDX_RIGHT], true, 0, 0, "center", true); + } else { + + var jump:String="???"; + if(Registry.inventory[Registry.IDX_JUMP]){ + jump=DH.lk("controls",7); + } + controls.setText(filler+DH.lk("controls",3)+":" + Registry.controls[Keys.IDX_UP] + + "\n"+DH.lk("controls",4)+":" + Registry.controls[Keys.IDX_DOWN] + + "\n"+DH.lk("controls",5)+":" + Registry.controls[Keys.IDX_LEFT] + + "\n"+DH.lk("controls",6)+":" + Registry.controls[Keys.IDX_RIGHT] + + "\n"+DH.lk("controls",8)+":" + Registry.controls[Keys.IDX_ACTION_1] + + "\n"+jump+":" + Registry.controls[Keys.IDX_ACTION_2] + + "\n"+DH.lk("controls",9)+":" + Registry.controls[Keys.IDX_PAUSE], true, 0, 0, "center", true); + } + + + if(recent_key_code !=1000){ + if(i !=0){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + input=FlxG.keys.getKeyName(recent_key_code); + recent_key_code=1000; + } + } + + if(i<3 && FlxG.keys.justPressed("ESCAPE")){ + updating=false; + return; + } + + if(Registry.keywatch.LEFT &&(i==0)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + i +=2; + //instruction.setText("Press key for\nUp", true, 0, 0, "center", true); + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",3), true, 0, 0, "center", true); + recent_key_code=1000; + updating=true; + return; + } + + switch(i){ + case 2: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",3), true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_UP, input))break; + Registry.controls[Keys.IDX_UP]=input; + i++; + } + break; + case 3: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",4), true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_DOWN, input))break; + Registry.controls[Keys.IDX_DOWN]=input; + i++; + } + break; + case 4: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",5), true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_LEFT, input))break; + Registry.controls[Keys.IDX_LEFT]=input; + i++; + } + break; + case 5: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",6),true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_RIGHT, input))break; + Registry.controls[Keys.IDX_RIGHT]=input; + i++; + if(is_blank_world)i=10; + } + break; + case 6: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",8), true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_ACTION_1, input))break; + Registry.controls[Keys.IDX_ACTION_1]=input; + i++; + } + break; + case 7: + + var jump_2:String="???"; + if(Registry.inventory[Registry.IDX_JUMP]){ + jump_2=DH.lk("controls", 7); + } + + instruction.setText(DH.lk("controls",0)+"\n"+jump_2+"\n", true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_ACTION_2, input))break; + Registry.controls[Keys.IDX_ACTION_2]=input; + i++; + } + break; + case 8: + i++; + break; + case 9: + instruction.setText(DH.lk("controls",0)+"\n"+DH.lk("controls",9), true, 0, 0, "center", true); + if(input !=""){ + if(is_valid(Keys.IDX_PAUSE, input))break; + Registry.controls[Keys.IDX_PAUSE]=input; + i++; + } + break; + case 10: + instruction.setText(DH.lk("controls",0)+" "+Registry.controls[Keys.IDX_PAUSE]+"\n "+DH.lk("controls",11),true, 0, 0, "center", true); + if(input !=""){ + i=0; + updating=false; + instruction.setText(DH.lk("controls",0)+" " + Registry.controls[Keys.IDX_LEFT] + "\n"+DH.lk("controls",12)+"\n" + +Registry.controls[Keys.IDX_PAUSE]+" "+DH.lk("controls",2), true, 0, 0, "left", true); + } + break; + } + input=""; + } + + public function is_valid(index:Int, input:String):Int { + if(index==0)return(input=="ESCAPE")? 1:0; + for(i in 0...index){ + if(input=="ESCAPE")return 1; + if(Registry.controls[i]==input)return 1; + } + + return 0; + } +} \ No newline at end of file diff --git a/intra/source/states/DialogueState.hx b/intra/source/states/DialogueState.hx new file mode 100644 index 0000000..7e8f28b --- /dev/null +++ b/intra/source/states/DialogueState.hx @@ -0,0 +1,423 @@ +package states +{ +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxObject; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +/** + * ... + * @author Seagaia + */ +class DialogueState extends PushableFlxState +{ + + public var dialogue_box:FlxSprite=new FlxSprite(0, 0); + public var dialogue:FlxBitmapFont; + public var dialogue_shadow:FlxBitmapFont; + public var is_finished:Bool=false; + private var next_char_timer_max:Float=0.022; + private var next_char_timer:Float=0.022; + private var chunked_dialogue:Bool=false; + private var cur_line_nr:Int=0; + private var cur_char_nr:Int=0; + private var nr_lines_in_buffer:Int=0; + private var lines:Array; + private var Max_Lines_In_Buffer:Int=3; + public static var Max_Line_Size:Int=21; + + private var s_writing:Int=0; + private var max_lines_since_last_wait:Int=3; + // Counter # of lines since the last time the player had a non-forced required input. + private var lines_since_last_wait:Int=0; + // Whether the first X lines were read. + private var did_initial_read:Bool=false; + // Whether a ^ was read, meaning the player needs to input to proceed + private var forced_input:Bool=false; + + private var s_bumping_up:Int=1; + private var bump_timer_max:Float=0.2; + private var bump_timer:Float=0.2; + private var nr_bumps:Int=0; + private var bump_state_ctr:Int=0; + private var s_waiting:Int=2; + + private var s_done:Int=3; + + private var state:Int=s_writing; + + private var base_y:Int;//y-coord of the text when displayed. + private var bumped_y:Int;//y-coord of text when moving up. + + public var blinky_box:FlxSprite=new FlxSprite(0, 0); + private var blinky_box_timer_max:Float=0.4; + private var blinky_box_timer:Float=0.4; + + private static var box_align:Int=FlxObject.DOWN; + + //[Embed(source="../res/sprites/menu/dialogue_box.png")] public static var menu_dialogue_box:Class; + //[Embed(source="../res/sprites/menu/menudialogue_box.png")] public static var real_menu_dialogue_Box:Class; + //[Embed(source="../res/sprites/menu/dialogue_blinky_box.png")] public static var menu_dialogue_blinky_box:Class; + + public function new() + { + create(); + } + + public function create_bitmap_text():Void { + var idx_1:Int=members.indexOf(dialogue); + var idx_2:Int=members.indexOf(dialogue_shadow); + dialogue=EventScripts.init_bitmap_font(" ", "left", dialogue_box.x + 4, dialogue_box.y + 7, null, "apple_white"); + dialogue_shadow=EventScripts.init_bitmap_font(" ", "left", dialogue_box.x + 4, dialogue_box.y + 7, null, "apple_white"); + if(idx_1 !=-1 && idx_2 !=-1){ + members[idx_1]=dialogue; + members[idx_2]=dialogue_shadow; + } + dialogue_shadow.customSpacingY=2; + dialogue.customSpacingY=2; + set_dialogue_box(); + } + override public function create():Void + { + dialogue_box.loadGraphic(menu_dialogue_box, false, false, 156, 44); + add(dialogue_box); + + create_bitmap_text(); + + add(dialogue_shadow); + add(dialogue); + + // Blinky box for dialogue + blinky_box.loadGraphic(menu_dialogue_blinky_box, true, false, 8, 8); + blinky_box.addAnimation("a", [0], 10, true); + blinky_box.play("a"); + + blinky_box.visible=false; + add(blinky_box); + + change_visibility(false); + + setAll("scrollFactor", new FlxPoint(0, 0)); + + set_box_position(FlxObject.DOWN); + + + } + + override public function draw():Void + { + super.draw(); + } + + public function set_dialogue_box():Void { + if(Registry.GAMESTATE !=null && Registry.GAMESTATE.state==Registry.GAMESTATE.S_PAUSED){ + dialogue.color=0xFFFFFF; + dialogue_shadow.color=0x000000; + dialogue_box.loadGraphic(real_menu_dialogue_Box, false, false, 156, 44); + } else if(Registry.CURRENT_MAP_NAME=="TRAIN" && Registry.GAMESTATE !=null){ + dialogue.color=0xffffff; + + dialogue_box.makeGraphic(156, 44, 0xff000000); + } else { + dialogue.color=0xFFFFFF; + dialogue_shadow.color=0x000000; + dialogue_box.loadGraphic(menu_dialogue_box, false, false, 156, 44); + } + } + + public static function set_dialogue_box_align(direction:Int):Void { + box_align=direction; + } + + override public function update():Void + { + if(!chunked_dialogue && !is_finished){ + set_box_position(box_align); + lines=get_chunks(Registry.cur_dialogue); + chunked_dialogue=true; + did_initial_read=false; + change_visibility(true); + blinky_box.visible=false; + + } + + switch(state){ + case s_writing: + next_char_timer -=FlxG.elapsed; + if(next_char_timer<0){ + next_char_timer=next_char_timer_max; + if(Registry.keywatch.ACTION_1 || Registry.keywatch.ACTION_2){ //impatient!! + next_char_timer /=2; + } + if(cur_line_nr==0 && cur_char_nr==0){ + dialogue.text=get_next_char(lines); + } else { + Registry.sound_data.play_sound_group(Registry.sound_data.dialogue_blip_group); + dialogue.text=dialogue.text + get_next_char(lines); + if(Registry.FUCK_IT_MODE_ON){ + for(asdf in 0...10){ + if(state !=s_writing)break; + dialogue.text=dialogue.text + get_next_char(lines); + } + + } + } + + } + break; + case s_bumping_up:// onnly enter this state with at least 2 or 3 lines. + //bump + //wait + //bump + //wait + if(bump_state_ctr==0){ + var chunks:Array=dialogue.text.split("\n"); + dialogue.text=" \n"; + for(i in 1...Max_Lines_In_Buffer){ + dialogue.text +=chunks[i]; + dialogue.text +="\n"; + } + dialogue.y=bumped_y; + bump_state_ctr=1; + } else { + bump_timer -=FlxG.elapsed; + if(bump_timer<0){ + bump_timer=bump_timer_max; + if(Registry.FUCK_IT_MODE_ON){ + bump_timer=0.01; + } + // Prevent empty string breaking FLxBitmapFont + dialogue.text=dialogue.text.substring(2); + dialogue.y=base_y; + state=s_writing; + bump_state_ctr=0; + } + } + break; + case s_waiting: + blinky_box_timer -=FlxG.elapsed; + if(blinky_box_timer<0){ + blinky_box_timer=blinky_box_timer_max; + blinky_box.visible=!blinky_box.visible; + } + if(Registry.keywatch.ACTION_1 || Registry.keywatch.ACTION_2){ + // When done + Registry.sound_data.dialogue_bloop.play(); + if(cur_line_nr==lines.length &&(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2)){ + is_finished=true; + chunked_dialogue=false; + cur_line_nr=cur_char_nr=0; + nr_lines_in_buffer=0; + blinky_box.visible=false; + state=s_done; + Registry.cur_dialogue=""; + change_visibility(false); + } else if(!forced_input && cur_line_nr !=lines.length){ + blinky_box.visible=false; + state=s_bumping_up; + } else if(forced_input){ + blinky_box.visible=false; + state=s_writing; + forced_input=false; + } + } + break; + case s_done: + break; + } + + dialogue_shadow.x=dialogue.x; + dialogue_shadow.y=dialogue.y + 1; + dialogue_shadow.text=dialogue.text; + + + super.update(); + } + + private function get_chunks(dialogue:String):Array { + var lines:Array=new Array(); + var line:String=""; + + // Split on [\n!?.] + var punc:Array=new Array("\n", ".", "!", "。","…","?","!", "?"); + + var punc_chunks:Array=new Array(); + // Break dialogue Into chunks by punctuation. Lone newlines become whitespace + for(pos in 0...dialogue.length){ + + + line +=dialogue.charAt(pos); + if(punc.indexOf(dialogue.charAt(pos))!=-1){ + if(dialogue.charAt(pos)=="\n"){ + line=line.substring(0, line.length -1); + if(line.length==0){ + line=" "; + } + } else { + if(dialogue.length - 1>pos){ + var next_char:String=dialogue.charAt(pos +1); + // Don't push this sentence chunk if the next character is in {.!?} , or + // if the next character is not whittespace. + if(punc.indexOf(next_char)!=-1 || next_char !=" "){ + continue;//skips the pushing of current sentence + // Double space=line break + } else if(next_char==" "){ + //Skip one of the two whitespaces, and then end up pushing the line anyways + pos++; + } + } + } + punc_chunks.push(line); + line=""; + } + + } + if(line !=""){ + punc_chunks.push(line); + } + line=""; + + + var cc:Array=new Array();// chunk chunks<_> + for(var chunk:String in punc_chunks){ + // If this chunk fits, just push it Into the list. + if(chunk.length<=Max_Line_Size){ + //Remove trailing whitespace if not a single character + var nr_forced_breaks:Int=0; + for(pos=0;pos1){ + chunk=chunk.substring(1); + } + lines.push(chunk); + continue; + } + /* Otherwise we gotta break it up */ + cc=chunk.split(" "); + var cur_len:Int=0; + for(var c:String in cc){ + //make a new line if the current word doesnt fit + if(line.length + c.length + 1>Max_Line_Size){ + if(line.length !=0){ + lines.push(line); + } + if(c.length>Max_Line_Size){ + var IntermedIdx:Int=0; + var Intermedstring:String=c; + while(intermedstring.length>Max_Line_Size){ + lines.push(c.substr(Max_Line_Size * IntermedIdx, Max_Line_Size)); + intermedIdx++; + intermedstring=c.substr(Max_Line_Size * IntermedIdx); + } + line=intermedstring; + } else { + line=c; + } + } else { + if(line.length==0){ + line +=c; + } else { + line +=" " + c; + } + } + } + lines.push(line); + line=""; + } + + return lines; + + } + + /* Return the next character in this line. + * if we reach the end, return a new line and increment + * the number of lines in the buffer, and change state + * if needed. */ + private function get_next_char(lines:Array):String { + var line:String=lines[cur_line_nr]; + if(line.charAt(cur_char_nr)=="^"){ + cur_char_nr++; + state=s_waiting; + forced_input=true; + return ""; + // wait for input + } + if(cur_char_nr>=line.length){ + cur_char_nr=0; + cur_line_nr++; + nr_lines_in_buffer++; + if(!did_initial_read){ + if(nr_lines_in_buffer==Max_Lines_In_Buffer){ + state=s_waiting; + did_initial_read=true; + } else if(cur_line_nr==lines.length){ + state=s_waiting; + blinky_box.visible=true; + blinky_box_timer=blinky_box_timer_max; + } + } else { + lines_since_last_wait++; + if(lines_since_last_wait==max_lines_since_last_wait || cur_line_nr==lines.length){ + lines_since_last_wait=0; + state=s_waiting; + blinky_box.visible=true; + blinky_box_timer=blinky_box_timer_max; + } else { + state=s_bumping_up; + } + } + // read, read, read, wait + // bump, read, bump, read, bump, read + // wait + // bump, read, bump, read + return "\n"; + } else { + return line.charAt(cur_char_nr++); + } + } + + private function set_box_position(position:Int):Void + { + if(position==FlxObject.DOWN){ + dialogue_box.y=180 - dialogue_box.height - 2; + } else if(position==FlxObject.UP){ + dialogue_box.y=22; + } + + dialogue_box.x=2; + + dialogue.x=dialogue_box.x + 4; + dialogue.y=dialogue_box.y + 7; + if(DH.isZH())dialogue.y=dialogue_box.y + 2; + base_y=dialogue.y; + bumped_y=dialogue.y - 5; + + blinky_box.x=dialogue_box.x + dialogue_box.width - 10; + blinky_box.y=dialogue_box.y + dialogue_box.height - 10; + } + + private function change_visibility(visible:Bool):Void { + dialogue_shadow.visible=dialogue.visible=dialogue_box.visible=blinky_box.visible=visible; + } + + override public function push(_parent:FlxState):Void + { + dialogue.text="."; + super.push(_parent); + } + + public function reset():Void { + state=s_writing; + is_finished=false; + DH.update_current_scene_on_chunk_finish(); + + } +} \ No newline at end of file diff --git a/intra/source/states/EndingState.hx b/intra/source/states/EndingState.hx new file mode 100644 index 0000000..6d478de --- /dev/null +++ b/intra/source/states/EndingState.hx @@ -0,0 +1,635 @@ +package states +{ +import entity.enemy.*; +import entity.enemy.bedroom.*; +import entity.enemy.etc.Chaser; +import entity.enemy.etc.Follower_Bro; +import entity.enemy.etc.Red_Walker; +import entity.enemy.etc.Sadbro; +import entity.enemy.etc.Space_Face; +import entity.enemy.redcave.*; +import entity.enemy.crowd.*; +import entity.enemy.apartment.*; +import entity.enemy.hotel.*; +import entity.enemy.circus.*; +import entity.enemy.suburb.Suburb_Killer; +import entity.enemy.suburb.Suburb_Walker; +import entity.gadget.Checkpoint; +import entity.interactive.Fisherman; +import entity.interactive.NPC; +import entity.interactive.npc.Forest_NPC; +import entity.interactive.npc.Mitra; +import entity.interactive.npc.Sage; +import entity.interactive.npc.Shadow_Briar; +import entity.interactive.npc.Space_NPC; +import entity.interactive.npc.Trade_NPC; +import entity.player.Player; +import flash.geom.Point; +import global.Keys; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import org.flixel.FlxText; +import org.flixel.plugin.photonstorm.FlxBitmapFont; + +class EndingState extends FlxState +{ + public function new(){ + + } + //[Embed(source="../res/sprites/npcs/easter/dev_npcs.png")] public static inline var embed_dev_npcs:Class; + private var state:Int=1; + private static inline var S_DONE:Int=2; + private static inline var S_DIALOGUE_DONE:Int=3; + public var text:FlxBitmapFont; + public var text2:FlxBitmapFont; + + private var sprites_1:FlxGroup=new FlxGroup(12); + private var sprites_2:FlxGroup=new FlxGroup(12); + + private var init_sprites:Array=new Array(30); + + private var positions_1:Array=new Array(new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point); + private var positions_2:Array=new Array(new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point, new Point); + + public var save_dialog_bg:FlxSprite; + public var save_dialog_text:FlxBitmapFont; + public var save_dialog_selector:FlxSprite; + public var s_ctr:Int=0; + public var ctr:Int=0; + + public var timer:Float=0; + public var timer_text:FlxText=new FlxText(0, 0, 200); + + private var filler:String="\n \n"; + + private var overlay:FlxSprite=new FlxSprite(); + private var bg:FlxSprite=new FlxSprite(); + private var stop_text:FlxBitmapFont; + + private var dimoverlay:FlxSprite; + + private var PG_SPRITES_START:Int=12; + // Array of the dialogue. These should be almsot as screen height, so that when + // They + private var text_ctr:Int=0; + private var dialogue:Array=new Array(); + + private var bg_ctr:Int=0; + + //[Embed(source="../res/sprites/ending/go.png")] public static inline var embed_go:Class; + //[Embed(source="../res/sprites/ending/screenies.png")] public static inline var embed_screenies:Class; + + + + override public function destroy():Void + { + + super.destroy(); + save_dialog_bg=save_dialog_selector=save_dialog_text=null; + overlay=null; + timer_text=null; + bg=null; + text=text2=null; + + } + override public function create():Void + { + // debug + //ctr=8; + dialogue=new Array(); + for(i in 0...24){ + dialogue.push(DH.lk("ending", i)); + } + // REMOVE ABOVE LATER + text=EventScripts.init_bitmap_font(Registry.C_FONT_APPLE_WHITE_STRING, "center", 1, 180, null, "apple_white"); + text2=EventScripts.init_bitmap_font(Registry.C_FONT_APPLE_WHITE_STRING, "center", 1, 360, null, "apple_white"); + if(DH.isZH()){ + filler="\n \n"; + } + //text.text="thanks for playing lol"; + text.text=dialogue[ctr] + filler; + ctr++; + text2.text=dialogue[ctr] + filler; + ctr++; + text.velocity.y=text2.velocity.y=-15;// -15 is good + text.drop_shadow=text2.drop_shadow=true; + + + dimoverlay=new FlxSprite(0, 0); + dimoverlay.makeGraphic(160, 180, 0xff000000); + dimoverlay.alpha=0.2; + + bg.loadGraphic(embed_go, false, false, 160, 480); + bg.x=0;bg.y=-bg.height + 180; + overlay.makeGraphic(160, 160, 0xff171717); + add(bg); + add(overlay); + + add(dimoverlay); + add(text); + add(text2) + //add(timer_text); + + + poopy_save_stuff(); + + + + add(save_dialog_bg); + add(save_dialog_text); + add(save_dialog_selector); + save_dialog_bg.visible=save_dialog_selector.visible=save_dialog_text.visible=false; + + for(i=0;i=PG_SPRITES_START){ + make_sprites(ctr, text); + } + + } else if(text2.y<-165 && ctr=PG_SPRITES_START){ + make_sprites(ctr, text2); + } + } + + if(stop_text !=null){ + if(stop_text.y<=0){ + stop_text.y=0; + stop_text.velocity.y=0; + state=S_DIALOGUE_DONE; + } + } + + // woot! + if(ctr>=PG_SPRITES_START){ + for(i in 0...sprites_1.maxSize){ + if(sprites_1.members[i]==null)continue; + sprites_1.members[i].x=positions_1[i].x + text.x; + sprites_1.members[i].y=positions_1[i].y + text.y; + } + for(i=0;i=0){ + bg.velocity.y=0; + bg.y=0; + } else { + bg.velocity.y=10; + } + break; + case 6: + text.color=0x000000; + text2.color=0x000000; + text.drop_shadow=text2.drop_shadow=false; + bg.x=overlay.x=0; + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.loadGraphic(embed_screenies, true, false, 160, 160); + overlay.y=10; + overlay.alpha=0; + overlay.frame=0; + bg.velocity.y=0; + } + bg.alpha -=fade_rate; + overlay.alpha +=fade_rate; + + break; + case 7: + text.color=0xffffff; + text2.color=0xffffff; + text.drop_shadow=text2.drop_shadow=true; + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.loadGraphic(embed_screenies, true, false, 160, 160); + bg.frame=1; + bg.y=10; + + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 8: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=2; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 9: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=3; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 10: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=4; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 11: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=5; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 12: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=6; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 13: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=7; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 14: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=8; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 15: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=9; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 16: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=10; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 17: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=11; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 18: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=12; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 19: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=13; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 20: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=14; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 21: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=15; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + break; + case 22: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=16; + } + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + break; + case 23: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + bg.frame=17; + } + bg.alpha +=fade_rate; + overlay.alpha -=fade_rate; + dimoverlay.alpha -=0.001; + break; + case 24: + if(!init_sprites[ctr-2]){ + init_sprites[ctr - 2]=true; + overlay.frame=18; + if(stop_text==text2){ + make_sprites(ctr, text2); + } else { + make_sprites(ctr, text); + } + } + init_sprites[ctr - 2]=true; + overlay.alpha +=fade_rate; + bg.alpha -=fade_rate; + + if(overlay.alpha>=1){ + stop_text.y=-100; + } + break; + } + + super.update(); + } + + private var fade_rate:Float=0.009; + private var new_ctr:Int=0; + private var bg_timer:Float=0; + private static var cur_m:Array; + private static var cur_p:Array; + private static var pos_ctr:Int; + private function make_sprites(pg:Int, _text:FlxBitmapFont):Void { + if(text==_text){ + cur_m=sprites_1.members; + sprites_1.setAll("exists", false); + cur_p=positions_1; + } else { + cur_m=sprites_2.members; + sprites_2.setAll("exists", false); + cur_p=positions_2; + } + + + pos_ctr=0; + if(pg==PG_SPRITES_START){ + mk(Slime.Slime_Sprite, 16, 16, [0, 1],5, 4, 20); + mk(Annoyer.S_ANNOYER_SPRITE, 16, 16, [0, 1, 2, 3, 4, 5], 8, 130, 46); + mk(Pew_Laser.PEW_LASER, 16, 16, [0], 2, 5, 66); + mk(Shieldy.SPRITE_SHIELDY, 16, 16, [1, 2, 1, 0, 1, 2, 1, 0, 16, 17, 18], 5, 130, 92); + mk(Pew_Laser.PEW_LASER_BULLET, 16, 8, [0, 1], 8, 5, 84); + mk(Sun_Guy.C_SUN_GUY, 16, 24, [0, 1, 2, 3, 4], 3, 11, 110); + mk(Sun_Guy.C_LIGHT_ORB, 16, 16, [0, 1, 2, 3, 4, 3, 2, 1], 6, 125, 120); + mk(Sun_Guy.C_SUN_GUY_WAVE, 128, 8, [3, 4, 5], 8, 8, 144); + } else if(pg==PG_SPRITES_START + 1){ + mk(Mover.mover_sprite, 16, 16, [0, 1], 4, 35, -4); + mk(On_Off_Laser.on_off_shooter_sprite, 16, 16, [0, 1, 2, 2, 1, 0], 2, 108, 30); + mk(Four_Shooter.four_shooter_sprite, 16, 16, [0, 1, 2, 2, 1, 0], 3, 4, 20); + mk(Slasher.slasher_sprite, 24, 24, [0, 1, 0, 1, 0, 1], 3, 115, 68); + mk(Red_Boss.red_boss_sprite, 32, 32, [0, 0, 1, 0, 0, 2], 3, 12, 110); + mk(Red_Boss.ripple_sprite, 48, 8, [0, 1], 12, 4, 138); + } else if(pg==PG_SPRITES_START + 2){ + mk(Dog.dog_sprite, 16, 16, [2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 2, 3], 4, 22, -3); + mk(Frog.frog_sprite, 16, 16, [0, 1, 0, 1, 3, 3], 2, 118, 20); + mk(Rotator.rotator_sprite, 16, 16, [0, 1], 10, 20, 42); + mk(Person.person_sprite, 16, 16, [0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 2, 3, 2, 3], 5, 120, 68); + mk(WallBoss.wall_sprite, 160, 32, [0, 1], 4, -1, 120); + mk(WallBoss.face_sprite, 64, 32, [0, 2, 0, 2,0,2, 1,1, 4,4], 5, -1 + 48, 120); + mk(WallBoss.r_hand_sprite, 32, 32, [0, 1, 2, 3], 1, 8, 150); + mk(WallBoss.l_hand_sprite, 32, 32, [0, 1, 2, 3], 1, 128, 150); + cur_m[7].scale.x=-1; + } else if(pg==PG_SPRITES_START + 3){ + mk(Rat.rat_sprite, 16, 16, [0, 1], 5, 16, 3); + mk(Gasguy.gas_guy_sprite, 16, 24, [0, 1],4, 122, 20); + mk(Gasguy.gas_guy_cloud_sprite, 24, 24, [0, 1], 3, 137, 34); + mk(Silverfish.silverfish_sprite, 16, 16, [4, 5], 6, 5, 46); + mk(Dash_Trap.dash_trap_sprite, 16, 16, [4, 5], 12, 137, 66); + mk(Spike_Roller.Spike_Roller_Sprite_H, 128, 16, [0, 1], 5, 5, 78); + mk(Splitboss.splitboss_sprite, 24, 32, [0, 1, 2, 1], 5, 70, 120); + } else if(pg==PG_SPRITES_START + 4){ + mk(Dustmaid.dustmaid_sprite, 16, 24, [0, 0, 0, 1, 2, 1, 2, 3, 4,3,4], 7, 5, -3); + mk(Burst_Plant.burst_plant_sprite, 16, 16, [0, 0, 1, 0, 1, 3, 3, 3,3,0], 8, 140, 25); + mk(Eye_Boss.eye_boss_water_sprite, 24, 24, [0, 1, 2, 3, 2, 1], 10, 5, 70); + mk(Eye_Boss.eye_boss_water_sprite, 24, 24, [4, 5, 4, 5, 6, 7, 6], 6, 120, 70); + } else if(pg==PG_SPRITES_START + 5){ + mk(Lion.lion_sprite, 32, 32, [10, 11, 10, 11, 10, 11, 12, 12], 4, 10, -5); + mk(Contort.contort_big_sprite, 16, 32, [0, 1, 2, 1], 9, 140, 20); + mk(Contort.contort_small_sprite, 16, 16, [0, 1], 9, 140, 50); + mk(Contort.contort_small_sprite, 16, 16, [2,3], 9, 118, 50); + mk(Contort.contort_small_sprite, 16, 16, [4, 5], 9, 126, 65); + mk(Fire_Pillar.fire_pillar_base_sprite, 16, 16, [0, 1], 8, 5, 54 + 32 - 4 - 12); + mk(Fire_Pillar.fire_pillar_sprite, 16, 32, [0, 0, 0, 0, 1, 2, 3, 4, 3, 4, 5, 6, 0], 9, 5, 54); + mk(Circus_Folks.both_sprite, 16, 32, [0, 1], 8, 65, 94); + } else if(pg==PG_SPRITES_START + 6){ + //follower + mk(Follower_Bro.sprite_follower, 16, 24, [1, 2, 1, 0], 4, 14, -5); + //edward + mk(Sadbro.sadman_sprite, 16, 16, [0, 1], 2, 120, 20); + //fisherman + mk(NPC.embed_beach_npcs, 16, 16, [10,11], 3, 6, 52); + //walker + mk(Red_Walker.sprite_redwalker, 32, 48, [0, 1, 2, 3, 4], 6, 130, 50); + // lobster + mk(NPC.embed_beach_npcs, 16, 16, [0], 2, 6, 80); + //hairs + //bombs + + }else if(pg==PG_SPRITES_START + 7){ + // Miao, Icky, Goldman, Shopguy, Rank + mk(Trade_NPC.embed_dame_trade_npc, 16, 16, [0,1], 4,140, 49); + mk(Trade_NPC.embed_dame_trade_npc, 16, 16, [10,11], 4,2, 15); + mk(Trade_NPC.embed_dame_trade_npc, 16, 16, [20,21], 4,124, 91); + mk(Trade_NPC.embed_dame_trade_npc, 16, 16, [50, 51], 4, 2, 45); + mk(Forest_NPC.embed_forest_npcs, 16, 16, [30,31], 4, 129, 15); + mk(Trade_NPC.embed_dame_trade_npc, 32, 32, [15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 17, 18, 18], 18, 2, 80); + }else if(pg==PG_SPRITES_START + 8){ + // James, Thorax, Rabbit, Golem + mk(Forest_NPC.embed_forest_npcs, 16, 16, [0, 1], 4, 4, 0); + mk(Forest_NPC.embed_forest_npcs, 16, 16, [10,10,11,10,10,12], 4, 130, 0); + mk(Forest_NPC.embed_forest_npcs, 16, 16, [20,21,20,22], 4, 4, 20); + mk(Forest_NPC.embed_forest_npcs, 16, 16, [30,31], 4, 130, 20); + mk(NPC.embed_cliff_npcs, 16, 16, [1,3,1,5,1,1,1,0,2,0,4,0,0,1,1], 4, 4, 40);// More ? + //folks + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [0,1],4, 3, 83); + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [9,10],4, 140, 80); + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [18,19],4, 3, 103); + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [27,28],4, 140, 103); + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [36,37],4, 3, 123); + mk(Suburb_Walker.embed_suburb_folk, 16, 16, [45,46],4, 140, 123); + }else if(pg==PG_SPRITES_START + 9){ + mk(Chaser.embed_chaser_sprite, 16, 32, [8,9], 4, 2, 4); + mk(Space_NPC.embed_space_npc, 32, 32, [10,11], 4, 120, 106); + mk(Space_NPC.embed_space_npc, 32, 32, [12,13], 4, 3, 106); + mk(Space_NPC.embed_space_npc, 16,16,[0,1], 4, 20, 40); + mk(Space_NPC.embed_space_npc, 16,16,[20,21], 4, 20, 70); + mk(Space_NPC.embed_space_npc, 16,16,[22,23], 4, 20, 70); + mk(Space_NPC.embed_space_npc, 16,16,[10,11], 4, 120, 40); + + //entities + } else if(pg==PG_SPRITES_START + 10){ + mk(Player.Player_Sprite, 16, 16, [1, 0, 1, 0], 6, 39, -5); + mk(Mitra.mitra_sprite, 16, 16, [0, 1, 0, 1], 6, 110, 17); + mk(Sage.sage_sprite, 16, 16, [0, 1], 6, 20, 44); + mk(Shadow_Briar.embed_briar, 16, 16, [0, 1], 6, 125, 67); + } else if(pg==PG_SPRITES_START + 11){ + //us??? + + mk(embed_dev_npcs, 16, 16, [0], 1, 6, 28); + mk(embed_dev_npcs, 16, 16, [10], 1, 140, 28); + + } + } + + // Set sprite ref at a[idx] to graphic, with width w, height h. + // Play the anim FRAMES at frame rate FR. + // Set its position relative to its accompanying text to posx,posy. + private function mk(graphic:Class, w:Int, h:Int, frames:Array, fr:Int,posx:Int,posy:Int):Void { + cur_m[pos_ctr].loadGraphic(graphic, true, false, w, h); + cur_m[pos_ctr].scale.x=1; + cur_m[pos_ctr].addAnimation("anim"+ctr.toString(), frames, fr, true); + cur_m[pos_ctr].play("anim"+ctr.toString()); + cur_m[pos_ctr].exists=true; + cur_p[pos_ctr].x=posx; + cur_p[pos_ctr].y=posy; + pos_ctr ++; + } + private function poopy_save_stuff():Void { + + save_dialog_bg=new FlxSprite; + save_dialog_bg.loadGraphic(Checkpoint.checkpoint_save_box_sprite, true, false, 80, 29); + save_dialog_bg.x=(160 - save_dialog_bg.width)/ 2; + save_dialog_bg.y=20 +(160 - save_dialog_bg.height)/ 2; + save_dialog_bg.scrollFactor=new FlxPoint(0, 0); + save_dialog_text=EventScripts.init_bitmap_font(DH.lk("checkpoint",0), "left", save_dialog_bg.x + 5, save_dialog_bg.y + 2, null, "apple_white"); + save_dialog_text.drop_shadow=true; + save_dialog_selector=new FlxSprite; + save_dialog_selector.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + save_dialog_selector.scrollFactor=new FlxPoint(0, 0); + save_dialog_selector.addAnimation("flash", [0, 1], 8); + save_dialog_selector.play("flash"); + save_dialog_selector.scale.x=-1; + + + save_dialog_selector.x=save_dialog_text.x + 4; + save_dialog_selector.y=save_dialog_text.y + 8; + if(DH.isZH())save_dialog_selector.y=save_dialog_text.y + 16; + } +} \ No newline at end of file diff --git a/intra/source/states/IntroScene.hx b/intra/source/states/IntroScene.hx new file mode 100644 index 0000000..15c1270 --- /dev/null +++ b/intra/source/states/IntroScene.hx @@ -0,0 +1,126 @@ +package states { +import entity.decoration.Light; +import global.Keys; +import global.Registry; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxG; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import org.flixel.plugin.photonstorm.FlxBitmapFont; + + +class IntroScene extends FlxState { + + + public var darkness:FlxSprite=new FlxSprite(0, 0); + public var dialogue_state:DialogueState=new DialogueState; + public var started_dialogue:Bool=false; + public var popped_dialogue:Bool=false; + public var c_sprite:FlxBitmapFont; + + public var light_timer:Float=2; + public function new(){ + + } + override public function create():Void { + + Registry.keywatch=new Keys(); + add(Registry.keywatch); + Registry.keywatch.visible=false; + darkness.makeGraphic(160, 180, 0xff000000); + + darkness.blend="multiply"; + add(darkness); + //Registry.sound_data.stop_current_song(); + + Registry.sound_data.start_song_from_title("BLANK"); + Registry.ENTRANCE_PLAYER_X=397 - 320; + Registry.ENTRANCE_PLAYER_Y=107; + Registry.CURRENT_MAP_NAME="BLANK"; + + c_sprite=EventScripts.init_bitmap_font(Registry.controls[Keys.IDX_ACTION_1], "center", 146, 165, null, "apple_white"); + c_sprite.color=0xff2222; + + } + + private var t_csprite:Float=0; + private var c_ctr:Int=0; + + override public function update():Void + { + light_timer -=FlxG.elapsed; + if(!started_dialogue && light_timer<1){ + started_dialogue=true; + // handle edge case when we restart a new game + // and the gamestate object isn'tnull + if(Registry.GAMESTATE !=null)Registry.GAMESTATE.dialogue_latency=-1; + + DH.set_scene_to_pos(DH.name_sage, DH.scene_sage_blank_intro, 0); + DH.start_dialogue(DH.name_sage, DH.scene_sage_blank_intro, "BLANK"); + //DH.dialogue_popup("Young...^Young...^are you there?^ Wake up!"); + dialogue_state.push(this as FlxState); + dialogue_state.blinky_box.exists=false; + add(c_sprite); + } else if(!started_dialogue){ + super.update(); + return; + } + + t_csprite +=FlxG.elapsed; + if(c_sprite.alive){ + if(t_csprite>0.6){ + t_csprite=0; + c_sprite.alive=c_sprite.visible=false; + } + } else { + if(t_csprite>0.6){ + t_csprite=0; + c_sprite.visible=true; + c_sprite.alive=true; + } + } + if(Registry.keywatch.JP_ACTION_1){ + c_ctr ++; + } + if(c_ctr>3){ + c_sprite.exists=false; + dialogue_state.blinky_box.exists=true; + } + + if(dialogue_state.is_finished){ + DH.update_current_scene_on_chunk_finish(); + if(!popped_dialogue){ + popped_dialogue=true; + light_timer=2; + c_sprite.visible=false; + dialogue_state.pop(this as FlxState); + } + if(light_timer<0.5){ + Registry.E_Blank_Fade=true; + FlxG.switchState(new PlayState); + } + } else { + if(FlxG.keys.any()){ // havent said to press anything yet + Registry.keywatch.JP_ACTION_1=true; + } + dialogue_state.update(); + } + super.update(); + } + + override public function draw():Void { + darkness.fill(0xff000000); + super.draw(); + } + + override public function destroy():Void + { + remove(Registry.keywatch, true); + dialogue_state.destroy(); + dialogue_state=null; + c_sprite=null; + darkness=null; + super.destroy(); + } +} \ No newline at end of file diff --git a/intra/source/states/MinimapState.hx b/intra/source/states/MinimapState.hx new file mode 100644 index 0000000..a80cb18 --- /dev/null +++ b/intra/source/states/MinimapState.hx @@ -0,0 +1,237 @@ +package states +{ +import data.CSV_Data; +import data.TileData; +import global.Registry; +import org.flixel.FlxG; +import org.flixel.FlxPoint; +import org.flixel.FlxSprite; +import org.flixel.FlxState; +import org.flixel.FlxTilemap; +import org.flixel.system.FlxTile; +/** + * ... + * @author Seagaia + */ +class MinimapState extends PushableFlxState +{ + + public var minimap:FlxTilemap; + private var blank_tile_index:Int=9; + + /* contants, screen width and height, used for centering the map */ + private var sw:Int=160; + private var sh:Int=180; + + public static var visited:Dynamic={ STREET:new Array(), BEDROOM:new Array(), REDCAVE:new Array(), CROWD:new Array(), APARTMENT:new Array(), CIRCUS:new Array(), HOTEL:new Array(), FIELDS:new Array(), CLIFF:new Array(), OVERWORLD:new Array(), BEACH:new Array(), REDSEA:new Array(), FOREST:new Array(), SUBURB:new Array(), TRAIN:new Array(), SPACE:new Array(), TERMINAL:new Array()}; + public static var minimap_strings:Array=new Array("","","","","","","","","","","","","","","",""); + + public static var minimap_areas:Array=new Array("STREET", "BEDROOM", "REDCAVE", "CROWD", "APARTMENT", "CIRCUS", "HOTEL","FIELDS","CLIFF","OVERWORLD","BEACH","REDSEA","FOREST","SUBURB","TRAIN","SPACE","TERMINAL"); + + public var is_finished:Bool=false; + + public var entrance:FlxSprite=new FlxSprite(); + public var player_marker:FlxSprite=new FlxSprite(); + public var player_marker_blink_timer:Float=0; + public var player_marker_blink_timer_max:Float=0.4; + public var has_map:Bool=false; + + public var nr_times_coords_set:Int=0; + public var invalid:Bool=false; + + public function new() + { + + trace("Initializing Minimap"); + minimap=new FlxTilemap(); + minimap.loadMap("0,2", TileData.Minimap_Tiles, 7, 7); + reset_minimap(); + + add(minimap); + add(entrance); + + add(player_marker); + + setAll("scrollFactor", new FlxPoint(0, 0)); + + } + public static function save_delete_routine():Void { + visited["STREET"]=new Array(); + visited["BEDROOM"]=new Array(); + visited["CROWD"]=new Array(); + visited["REDCAVE"]=new Array(); + visited["APARTMENT"]=new Array(); + visited["CIRCUS"]=new Array(); + visited["HOTEL"]=new Array(); + + visited["FOREST"]=new Array(); + visited["CLIFF"]=new Array(); + visited["BEACH"]=new Array(); + visited["REDSEA"]=new Array(); + visited["OVERWORLD"]=new Array(); + visited["FIELDS"]=new Array(); + + visited["SPACE"]=new Array(); + visited["TERMINAL"]=new Array(); + visited["SUBURB"]=new Array(); + visited["TRAIN"]=new Array(); + + MinimapState.minimap_strings=new Array("","","","","","","","","","","","","","","","",""); + } + + public function get_minimap():FlxTilemap { + if(has_map)return minimap; + return null; + } + private function reset_minimap():Void { + + nr_times_coords_set=0; + is_finished=false; + + + if(CSV_Data.minimap_csv.hasOwnProperty(Registry.CURRENT_MAP_NAME)){ + player_marker.makeGraphic(3, 3, 0xffff5949); + entrance.makeGraphic(3, 3, 0xff0d52af); + } + + + var idx:Int=minimap_areas.indexOf(Registry.CURRENT_MAP_NAME); + if(idx==-1){ + visible=false; + invalid=true; + has_map=false; + return; + } + visible=true; + + minimap.null_buffer(0);// Force a redraw? + minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7); + set_coords(minimap);// Set alignment of minimap + + var tmap:FlxTilemap=new FlxTilemap; + // If we have not yet initialized this according to the serialized + // minimap state, then mark all rooms as not visited + if(minimap_strings[idx]=="" || minimap_strings[idx]==null){ + for(i in 0...minimap.totalTiles){ + visited[Registry.CURRENT_MAP_NAME].push(0); + } + // Otherwise use a dirty hack to get the visited data + } else { + tmap.loadMap(minimap_strings[idx], TileData.Minimap_Tiles, 7, 7); + visited[Registry.CURRENT_MAP_NAME]=tmap.getData(); + } + + + + minimap.draw();// Maybe redraw?? + update_map();// Make rooms invisible if not visited yet + + set_marker_coords();// Set entrance/player spot etc + } + + + + override public function update():Void + { + + player_marker_blink_timer +=FlxG.elapsed; + if(player_marker_blink_timer>player_marker_blink_timer_max){ + player_marker.visible=!player_marker.visible; + player_marker_blink_timer=0; + } + + super.update(); + } + + public function stuff_for_pause_state():Void { + + if(CSV_Data.minimap_csv.hasOwnProperty(Registry.CURRENT_MAP_NAME)){ + // UPdate a room as visited + update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + // Reload the uncovered rooms + minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7) + // Redraw the map + update_map(); + // MOve markers + set_marker_coords(); + } + } + + override public function push(_parent:FlxState):Void + { + if(minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)!=-1){ + is_finished=false; + minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles, 7, 7) + update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + update_map(); + minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME],minimap.widthInTiles); + set_marker_coords(); + } + super.push(_parent); + } + + public function init_minimap():Void { + if(minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)!=-1){ + invalid=false; + is_finished=false; + has_map=true; + minimap.visible=player_marker.visible=entrance.visible=true; + player_marker.exists=true; + reset_minimap(); + minimap.loadMap(new CSV_Data.minimap_csv[Registry.CURRENT_MAP_NAME], TileData.Minimap_Tiles,7, 7) + update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME],minimap.widthInTiles); + update_map(); + set_marker_coords(); + } else { + has_map=false; + invalid=true; + minimap.visible=player_marker.visible=entrance.visible=false; + player_marker.exists=false; + } + } + + public function set_coords(map:FlxTilemap):Void { + + minimap.x=60 +(100 - map.width)/ 2; + minimap.y=Registry.HEADER_HEIGHT +(100 - map.height)/ 2; + + } + override public function destroy():Void + { + // Calls the level up, destroys all things added to this state + super.destroy(); + } + + public function update_visited_array(mapName:String, gx:Int, gy:Int):Void { + if(!invalid){ + if(minimap==null)return; + var idx:Int=gy * minimap.widthInTiles + gx; + trace("Updated!", gx, gy); + visited[mapName][idx]=1; + // Update the serialized map state + minimap_strings[minimap_areas.indexOf(Registry.CURRENT_MAP_NAME)]=FlxTilemap.arrayToCSV(visited[Registry.CURRENT_MAP_NAME], minimap.widthInTiles); + + } + } + + private function update_map():Void + { + for(var i:Int=0;i=10){ + playtime_text.text=Std.int(playtime_dat / 3600).toString()+ ":"; + } else { + playtime_text.text="0" + Std.int(playtime_dat / 3600).toString()+ ":"; + } + playtime_dat -=3600 * hrs; + + var mins:Int=Std.int(playtime_dat / 60); + if(mins>=10){ + playtime_text.text +=Std.int(playtime_dat / 60).toString()+ ":"; + } else { + playtime_text.text=playtime_text.text + "0" + Std.int(playtime_dat / 60).toString()+ ":"; + } + playtime_dat -=60 * mins; + + if(playtime_dat>=10){ + playtime_text.text +=playtime_dat.toString(); + } else { + playtime_text.text=playtime_text.text + "0"+ playtime_dat.toString(); + } + + if(Registry.GAMESTATE.load_dialogue){ + Registry.GAMESTATE.dialogue_state.push(this as FlxState); + Registry.GAMESTATE.load_dialogue=false; + state=s_dialogue; + return; + + } else if(state==s_dialogue){ + dialogue_logic(); + super.update(); + return; + } + + if(ctr_settings !=1 && ctr_settings !=5){ + if(state==s_browse){ + check_for_exit_with(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JUST_PRESSED_PAUSE); + } else { + check_for_exit_with(Registry.keywatch.JUST_PRESSED_PAUSE); + } + } + if(!init_parent){ + parent=Registry.GAMESTATE; + init_parent=true; + } + switch(state){ + case s_browse: + browse_logic(); + break; + case s_map: + map_logic(); + break; + case s_equip: + equip_logic(); + break; + case s_cards: + cards_logic(); + break; + case s_save: + save_logic(); + break; + case s_settings: + settings_logic(); + break; + case s_secretz: + secretz_logic(); + break; + case s_cheatz: + cheatz_logic(); + break; + } + + if(Registry.keywatch.JP_UP || Registry.keywatch.JP_DOWN || Registry.keywatch.JP_LEFT || Registry.keywatch.JP_RIGHT){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + } + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + } + + super.update(); + } + + + private function set_equip_vis(idx:Int):Void { + var equip_box:FlxSprite=equip_boxes.members[idx]; + + switch(idx){ + case 1://long + idx=Registry.IDX_LENGTHEN; + break; + case 2://widen + idx=Registry.IDX_WIDEN; + break; + case 3://stransform + idx=Registry.IDX_TRANSFORMER; + break; + } + if(!Registry.inventory[idx]){ + equip_box.visible=false; + } else { + equip_box.visible=true; + } + } + + public var secret_counter:Int=0; + public function browse_logic():Void { + + /* Pop up substates but don't do their logic */ + if(!current_substate_visible){ + + current_substate_visible=true; + + remove(base_group, true); + add(base_group); + remove(selectors, true); + add(selectors); + + selectors.setAll("visible", false); + + switch(base_index){ + case 0:// Minimap + if(minimap.has_map){ + minimap.stuff_for_pause_state(); + } + remove(minimap, true); + add(minimap); + remove(legend_cur_b, true); + add(legend_cur_b); + remove(legend_entrance_b, true); + add(legend_entrance_b); + remove(legend_cur, true); + add(legend_cur); + remove(legend_entrance, true); + add(legend_entrance); + remove(selectors, true);add(selectors); + text_1.visible=text_2.visible=true; + //text_1.text=":Current room\n\ + //:Door/Exit\n"; + text_1.text=":"+DH.lk("map",1)+"\n\ + :"+DH.lk("map",2)+"\n"; + + text_1.x=60; + text_1.y=115; + + text_2.multiLine=true; + text_2.autoUpperCase=false; + + text_3.visible=false; + text_3.text="Yes No"; + if(DH.isZH())text_3.text="是 否"; + + if(Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]==true && false==is_crowd_minidungeon()){ + if(false==Registry.is_dungeon(Registry.CURRENT_MAP_NAME)){ + + //text_2.text="Return to\nNexus"; + text_2.text=DH.lk("map", 4); + if(DH.isZH())text_2.text=text_2.text.replace("\n", ""); + if(minimap.has_map){ + text_2.x=text_1.x + 19; + text_3.x=text_1.x + 14; + text_2.y=135; + text_3.y=153; + + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=true; + } else { + //text_1.text="No map"; + text_1.text=DH.lk("map",3); + text_1.x=equip_boxes.members[0].x + equip_boxes.members[0].width + 4; + text_1.y=30; + text_2.x=60 + 19; + text_2.y=135; + text_3.x=79; + text_3.y=153; + text_2.text=DH.lk("map", 4); + + if(DH.isZH())text_2.text=text_2.text.replace("\n", ""); + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=false; + } + + } else { + // Return to entrance + text_2.text=DH.lk("map", 5); + if(DH.isZH())text_2.text=text_2.text.replace("\n", ""); + + text_2.x=text_1.x + 19; + text_3.x=text_1.x + 14; + text_2.y=135; + text_3.y=153; + + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=true; + } + if(DH.isZH())text_2.y +=3; + } else { + text_2.visible=false; + } + break; + case 1:// eqip + remove(equip_overlay, true);add(equip_overlay); + remove(equip_boxes, true);add(equip_boxes); + remove(key_icons, true);add(key_icons); + remove(equip_icon, true);add(equip_icon); + remove(selectors, true);add(selectors); + remove(trade_item, true);add(trade_item); + remove(jump_shoes, true);add(jump_shoes); + + jump_shoes.visible=(Registry.bound_item_2=="JUMP"); + set_trade_item(); + + set_key_graphics(); + + for(fuckme in 0...4){ + equip_boxes.members[fuckme].visible=false; + } + + if(Registry.inventory[Registry.IDX_BROOM]){ + equip_boxes.members[0].visible=true; + } + if(Registry.inventory[Registry.IDX_LENGTHEN]){ + equip_boxes.members[1].visible=true; + } + if(Registry.inventory[Registry.IDX_WIDEN]){ + equip_boxes.members[2].visible=true; + } + if(Registry.inventory[Registry.IDX_TRANSFORMER]){ + equip_boxes.members[3].visible=true; + } + + if(Registry.bound_item_1==Registry.item_names[Registry.IDX_TRANSFORMER]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24*3; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24*2; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24; + } else { + equip_icon.y=equip_boxes.members[0].y - 1; + } + if(!Registry.inventory[Registry.IDX_BROOM]){ + equip_icon.visible=false; + } else { + equip_icon.visible=true; + } + var normal_string:String=Registry.inventory[Registry.IDX_BROOM] ? DH.lk("items",1):"-";// Normal + var status_1:String=Registry.inventory[Registry.IDX_LENGTHEN] ? DH.lk("items",3):"-";//Extend + var status_2:String=Registry.inventory[Registry.IDX_WIDEN] ? DH.lk("items",4):"-";// WIden + var status_3:String=Registry.inventory[Registry.IDX_TRANSFORMER] ? DH.lk("items",2):"-";// Swap + + text_1.visible=true; + text_1.setText(normal_string + "\n\n\n" + status_1 + "\n\n\n" + status_2 + "\n\n\n" + status_3, true, 0, 0, "left", true); + if(DH.isZH())text_1.setText(normal_string+"\n\n"+status_1+"\n\n"+status_2+"\n\n"+status_3, true, 0, 0, "left", true); + text_1.x=equip_boxes.members[0].x + equip_boxes.members[0].width + 4; + text_1.y=30; + text_2.visible=text_3.visible=false; + break; + case 2://card + remove(cards, true);add(cards); + remove(selectors, true);add(selectors); + cards_cursor_idx=0; + cur_cards_pg=0; + set_card_images(); + text_1.visible=true; + text_1.setText("1/4", true, 0, 0, "center", true); + text_1.x=99; + text_1.y=158; + text_2.visible=true; + //text_2.setText(Registry.nr_growths.toString()+ " cards", true, 0, 0, "left", true); + if(DH.language_type==DH.LANG_ja){ + text_2.setText(Registry.nr_growths.toString()+DH.lk("cards",1), true, 0, 0, "left", true); + } else { + text_2.setText(Registry.nr_growths.toString()+ " "+DH.lk("cards",1), true, 0, 0, "left", true); + } + text_2.x=70; + text_2.y=148; + if(DH.isZH()){ + text_1.y -=4; + text_2.y -=4; + } + text_3.visible=false; + break; + case 3:// save + text_1.visible=true; + if(Intra.is_ios){ + //text_1.setText("Save\nSave and go\n to title\nGo to title", true, 0, 0, "left", true) + text_1.setText(DH.lk("save",0)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",4), true, 0, 0, "left", true) + } else { + //text_1.setText("Save\nSave and go\n to title\nSave and quit\nQuit game", true, 0, 0, "left", true); + text_1.setText(DH.lk("save",0)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",5)+"\n"+DH.lk("save",6), true, 0, 0, "left", true); + } + //text_1.text +="\n\n\n\nDeaths:" + Registry.death_count.toString(); + text_1.text +="\n\n\n\n"+DH.lk("save",7)+" " + Registry.death_count.toString(); + + text_1.x=69; + text_1.y=30; + text_2.visible=text_3.visible=false; + break; + case 4://settings + text_1.visible=text_3.visible=true; + //var autosave_state:String=Registry.autosave_on ? "On":"Off"; + var autosave_state:String=Registry.autosave_on ? DH.lk("config",4):DH.lk("config",5); + set_settings_text(true); + text_1.x=68; + text_1.y=30; + text_2.visible=false; + text_3.x=68; + text_3.y=120; + if(DH.isZH())text_3.y=125; + if(Intra.is_mobile)text_3.visible=false; + text_3.setText(DH.lk("config",16)+" " + Intra.scale_factor.toString()+ "x",true,0,0,"left",true); + + remove(volume_bar_bg, true);add(volume_bar_bg); + remove(volume_bar, true);add(volume_bar); + remove(volume_bar_overlay, true);add(volume_bar_overlay); + remove(window_config, true);add(window_config); + remove(window_words, true);add(window_words); + break; + case 5:// SECRETS!!! + text_1.visible=text_2.visible=text_3.visible=false; + remove(trophies, true);add(trophies); + remove(selectors, true);add(selectors); + break; + case 6:// CHEATS!!! + break; + } + } + + if(Registry.keywatch.JP_DOWN){ + if(base_index20 && base_index !=6){ + current_substate_visible=false; + if(base_index==4){ + menu_select_active.y +=32; + } else { + menu_select_active.y +=16; + } + menu_select_inactive.y=menu_select_active.y; + base_index=6; + } + } + } + return; + } else if(Registry.keywatch.JP_UP){ + if(base_index>0){ + current_substate_visible=false; + if(base_index==6 && false==Registry.GE_States[Registry.GE_HAVE_A_SECRET]){ + base_index=4; + menu_select_active.y -=32; + } else { + base_index--; + menu_select_active.y -=16; + } + menu_select_inactive.y=menu_select_active.y; + } + return; + } + + /* State change to submenus, also change cursor animations and positions */ + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_RIGHT){ + menu_select_active.visible=false; + menu_select_inactive.visible=true; + + switch(base_index){ + case 0: + + if(Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]==false || is_crowd_minidungeon()){ + menu_select_active.visible=true; + menu_select_inactive.visible=false; + break; + } + state=s_map; + selectors.members[1].scale.x=1; + selectors.members[2].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=70; + selectors.members[1].y=135; + if(DH.isZH()) selectors.members[1].y=142; + + selectors.members[1].play("enabled"); + map_cursor_idx=1; + break; + case 1: + // If no items, equip submenu is inacessible. + if(!equip_icon.visible){ + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } else { + state=s_equip; + equip_cursor_idx=0; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=80; + selectors.members[1].y=30; + selectors.members[1].play("enabled"); + } + break; + case 2: + + //selectors.members[1].visible=selectors.members[2].visible=true; + selectors.members[1].x=text_1.x - 7; + selectors.members[1].y=text_1.y; + selectors.members[2].x=text_1.x + text_1.width; + selectors.members[2].y=text_1.y; + if(DH.isZH())selectors.members[1].y +=4; + if(DH.isZH())selectors.members[2].y +=4; + selectors.members[1].play("enabled"); + selectors.members[2].play("enabled"); + selectors.members[1].scale.x=-1; + selectors.members[2].scale.x=1; + + + cards_cursor_idx=0; + state=s_cards; + card_pg_to_cards(); + break; + case 3: + state=s_save; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=text_1.x - 8; + selectors.members[1].y=text_1.y; + selectors.members[1].play("enabled"); + save_cursor_idx=0; + break; + case 4: + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=text_1.x - 7; + selectors.members[1].y=text_1.y; + selectors.members[1].play("enabled"); + settings_cursor_idx=0; + state=s_settings; + break; + case 5: + //secretsx + state=s_secretz; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=trophies.members[0].x - 7; + selectors.members[1].y=trophies.members[0].y + 4; + selectors.members[1].play("enabled"); + secretz_idx=0; + break; + case 6://cheatsz + state=s_cheatz; + break; + } + } + + + + } + + + + private function map_logic():Void { + + // Cancel + if(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JP_LEFT){ + // Return to browse, or + if(map_ctr==0){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + selectors.members[2].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + map_cursor_idx=1; + // Return to top-level of map submenu + } else if(!Registry.keywatch.JP_LEFT){ + selectors.members[2].visible=false; + selectors.members[1].play("enabled"); + map_cursor_idx=1; + map_ctr=0; + } + } + + // Select + if(Registry.keywatch.JP_ACTION_1){ + switch(map_ctr){ + // Go to yes/no context for return to entrance + case 0: + selectors.members[2].visible=true; + selectors.members[2].play("enabled"); + selectors.members[1].play("disabled"); + selectors.members[2].x=text_3.x - 6 + 45; + selectors.members[2].y=text_3.y; + text_3.visible=true; + map_ctr++; + + break; + // Eitehr go back, or switch maps + case 1: + if(map_cursor_idx==0){ + // switch state + Registry.cleanup_on_map_change(); + if(false==Registry.is_dungeon(Registry.CURRENT_MAP_NAME)){ // If not in a dungeon want 2 warp to nexus + if(Registry.CURRENT_MAP_NAME=="BLANK" || Registry.CURRENT_MAP_NAME=="DRAWER" || Registry.CURRENT_MAP_NAME=="NEXUS"){ + Registry.NEXT_MAP_NAME="NEXUS"; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["NEXUS"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["NEXUS"].y; + } else { + NPC.load_nexus_data(); + } + } else { + Registry.NEXT_MAP_NAME=Registry.CURRENT_MAP_NAME; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES[Registry.CURRENT_MAP_NAME].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES[Registry.CURRENT_MAP_NAME].y; + } + //FlxG.switchState(new PlayState); + Registry.BOI=false; + parent.SWITCH_MAPS=true; + Registry.sound_data.start_song_from_title(Registry.NEXT_MAP_NAME); + reset_counters(); + done=true; + } else { + selectors.members[1].play("enabled"); + selectors.members[2].visible=false; + map_cursor_idx=1; + map_ctr=0; + } + break; + } + } + + // Deal with/left right for yes/no context + if(map_ctr==1){ + if(Registry.keywatch.JP_RIGHT && map_cursor_idx<1){ + map_cursor_idx++; + selectors.members[2].x +=47; + } else if(Registry.keywatch.JP_LEFT && map_cursor_idx>0){ + map_cursor_idx--; + selectors.members[2].x -=47; + } + } + } + private function equip_logic():Void { + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && equip_cursor_idx<=10)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + if(Registry.keywatch.JP_DOWN){ + if(equip_cursor_idx<3){ + equip_cursor_idx++; + selectors.members[1].y +=24; + } else if(equip_cursor_idx==3){ + equip_cursor_idx=10; + + if(Registry.inventory[Registry.IDX_JUMP]){ + selectors.members[1].y=jump_shoes.y; + selectors.members[1].x=jump_shoes.x - 3; + } else if(Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX]){ + selectors.members[1].y=trade_item.y; + selectors.members[1].x=trade_item.x - 3; + equip_cursor_idx=11; + } else { + selectors.members[1].y=key_icons.members[0].y; + selectors.members[1].x=key_icons.members[0].x - 3; + equip_cursor_idx=12; + } + + } + } else if(Registry.keywatch.JP_UP){ + if(equip_cursor_idx>0){ + if(equip_cursor_idx>=10){ + selectors.members[1].y=102; + selectors.members[1].x=80; + equip_cursor_idx=3; + } else { + equip_cursor_idx--; + selectors.members[1].y -=24; + } + } + } + + if(Registry.keywatch.JP_RIGHT){ + if(equip_cursor_idx<14){ + if(equip_cursor_idx==10){ + if(!(Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX])){ + equip_cursor_idx=12; + } else { + equip_cursor_idx=11; + } + } else { + equip_cursor_idx++; + } + } + // oh my goddd + } else if(Registry.keywatch.JP_LEFT){ + if(equip_cursor_idx>10){ + if(equip_cursor_idx==11){ + if(Registry.inventory[Registry.IDX_JUMP]){ + equip_cursor_idx=10; + } + } else { + if(equip_cursor_idx==12){ + if((Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX])){ + equip_cursor_idx=11; + } else if(Registry.inventory[Registry.IDX_JUMP]){ + equip_cursor_idx=10; + } + } else { + equip_cursor_idx--; + } + } + } + } + + if(Registry.keywatch.JP_LEFT || Registry.keywatch.JP_RIGHT){ + if(equip_cursor_idx==10){ + selectors.members[1].y=jump_shoes.y; + selectors.members[1].x=jump_shoes.x - 3; + } else if(equip_cursor_idx==11){ + selectors.members[1].y=trade_item.y; + selectors.members[1].x=trade_item.x - 3; + } else if(equip_cursor_idx>11){ + selectors.members[1].y=key_icons.members[equip_cursor_idx - 12].y; + selectors.members[1].x=key_icons.members[equip_cursor_idx - 12].x - 3; + } + } + + if(Registry.keywatch.JP_ACTION_1){ + + switch(equip_cursor_idx){ + case 0: + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + set_passive_effect(Registry.IDX_BROOM); + + equip_icon.y=equip_boxes.members[0].y - 1; + break; + case 1: + if(Registry.inventory[Registry.IDX_LENGTHEN]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + if(Registry.bound_effect !=Registry.item_names[Registry.IDX_LENGTHEN]){ + set_passive_effect(Registry.IDX_LENGTHEN); + } + equip_icon.y=equip_boxes.members[0].y - 1 + 24; + } + break; + case 2: + if(Registry.inventory[Registry.IDX_WIDEN]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + if(Registry.bound_effect !=Registry.item_names[Registry.IDX_WIDEN]){ + set_passive_effect(Registry.IDX_WIDEN); + } + equip_icon.y=equip_boxes.members[0].y - 1 + 24*2; + } + break; + case 3: + if(Registry.inventory[Registry.IDX_TRANSFORMER]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_TRANSFORMER]; + set_passive_effect(Registry.IDX_BROOM);// Remove the passive effect + equip_icon.y=equip_boxes.members[0].y - 1 + 24*3; + } + break; + case 10: + //DH.dialogue_popup("A pair of spring-loaded shoes - press "+Registry.controls[Keys.IDX_ACTION_2]+" to jump!"); + DH.dialogue_popup(DH.lk("items",5)+" "+Registry.controls[Keys.IDX_ACTION_2]+" "+DH.lk("items",6)); + break; + case 11: + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + //DH.dialogue_popup("A pair of shoes for biking."); + DH.dialogue_popup(DH.lk("items",7)); + } else { + //DH.dialogue_popup("An empty cardboard box."); + DH.dialogue_popup(DH.lk("items",8)); + } + break; + case 12: + if(Registry.inventory[Registry.IDX_GREEN_KEY]) + //DH.dialogue_popup("A key found in the Temple of the Seeing One."); + DH.dialogue_popup(DH.lk("items",9)); + break; + case 13: + if(Registry.inventory[Registry.IDX_RED_KEY]) + //DH.dialogue_popup("A key found in a red, underground cave."); + DH.dialogue_popup(DH.lk("items",10)); + break; + case 14: + if(Registry.inventory[Registry.IDX_BLUE_KEY]) + //DH.dialogue_popup("A key found in a mountain cave."); + DH.dialogue_popup(DH.lk("items",11)); + break; + } + + if(equip_cursor_idx<4){ + if(Registry.bound_item_1=="TRANSFORMER" || Registry.bound_item_2=="TRANSFORMER"){ + Registry.E_Transformer_On=true; + } else { + Registry.E_Transformer_Off=true; + } + + + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + current_substate_visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + //set_placeholder_image(1); + } + + } + + // The locations of the cards, so we can map them to proper images when opening a chest. + // Dungeon x/y vals are the room, roamstates are the actual coordinates in DAME-coords(so no y-offset of 20) + public static var card_data:Dynamic={ + "BLANK":new Array({ id:44, x:5, y:1 }), + "DRAWER":new Array({id:36, x:2, y:1}, {id:37, x:4, y:7}), + "OVERWORLD":new Array({ id:0, x:1, y:9 } , {id:1, x:5, y:7}), + "BEDROOM":new Array({ id:2, x:3, y:0 }, { id:3, x:1, y:0 }, { id:4, x:2, y:3 }, { id:5, x:5, y:0 }), + "SUBURB":new Array({ id:6 , x:1, y:7 } , {id:42, x:2 , y:7}), + "APARTMENT":new Array({ id:7, x:8, y:7 }, { id:8, x:3, y:5 }, { id:9, x:0, y:0 }), + "FIELDS":new Array({ id:10, x:3, y:8}, {id:11, x:6, y:9}, {id:43, x:8, y:0}, {id:45,x:11,y:9}), + "WINDMILL":new Array({id:12, x:1, y:5}), + "FOREST":new Array({id:13, x:3, y:2}), + "CLIFF":new Array({ id:14, x:4, y:2 }, { id:15, x:2, y:7}), + "BEACH":new Array({ id:16, x:4, y:3 }), + "REDSEA":new Array({ id:17, x:2, y:2}, {id:47, x:0,y:6}), + "REDCAVE":new Array({ id:18, x:3 , y:1 } , { id:19, x:0, y:0 }, { id:20, x:6, y:1 }), + "TRAIN":new Array({ id:21, x:0 , y:0 } , {id:40, x:5, y:8}), // CELL + "CIRCUS":new Array({ id:23, x:0 , y:3 }, { id:22, x:3, y:6 } , { id:24, x:3, y:2 }, { id:25, x:7, y:0 }), + "CROWD":new Array({id:26, x:2 , y:2} , {id:27, x:8, y:2} , {id:28 , x:9, y:5 }), + "SPACE":new Array({ id:29, x:0, y:0} , {id:30, x:9,y:0}, {id:41, x:5, y:7}), + "HOTEL":new Array({ id:31, x:3, y:6 }, { id:32, x:1, y:8 }, { id:33, x:9, y:3 } , { id:34, x:8, y:11 } , {id:38, x:5, y:0}), + "TERMINAL":new Array({ id:35, x:4, y:2 }), + "DEBUG":new Array({ id:39, x:4, y:3 }), + "STREET":new Array({id:46, x:1, y:6}) + + }; + + private function cards_logic():Void { + + // Exit card select, or exit card submenu + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && cur_cards_pg==0 &&(cards_cursor_idx % 3==0))){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[3].visible=false; + selectors.members[1].visible=selectors.members[2].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + //cur_cards_pg=0; + //cards_cursor_idx=0; + } + + + + // Move about card select, or move between pages + if(selectors.members[3].visible){ //if card select + if((cards_cursor_idx % 12)>2 && Registry.keywatch.JP_UP){ + cards_cursor_idx -=3; + selectors.members[3].y -=29; + } else if((cards_cursor_idx % 12)<9 && Registry.keywatch.JP_DOWN){ + cards_cursor_idx +=3; + selectors.members[3].y +=29; + } else if(Registry.keywatch.JP_DOWN){ + selectors.members[3].visible=false; + selectors.members[1].visible=true; + selectors.members[2].visible=true; + selectors.members[1].play("enabled"); + selectors.members[2].play("enabled"); + } + + if((cards_cursor_idx % 3)<2 && Registry.keywatch.JP_RIGHT){ + cards_cursor_idx ++; + selectors.members[3].x +=30; + } else if((cards_cursor_idx % 3)>0 && Registry.keywatch.JP_LEFT){ + cards_cursor_idx --; + selectors.members[3].x -=30; + } else if((cards_cursor_idx % 3)==0 && Registry.keywatch.JP_LEFT){ + if(cur_cards_pg>0){ + cur_cards_pg --; + cards_cursor_idx +=2; + selectors.members[3].x +=60; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4"; + } else { + text_1.text="1/4"; + } + } + } else if((cards_cursor_idx % 3)==2 && Registry.keywatch.JP_RIGHT){ + if(cur_cards_pg<3){ + cur_cards_pg ++; + cards_cursor_idx -=2; + selectors.members[3].x -=60; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4" + } else { + text_1.text="4/4"; + } + } + } + } else { + if(cur_cards_pg<3 && Registry.keywatch.JP_RIGHT){ + cur_cards_pg++; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4" + } else { + text_1.text="4/4"; + } + //Load new sprites.... + } else if(cur_cards_pg>0 && Registry.keywatch.JP_LEFT){ + cur_cards_pg--; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4"; + } else { + text_1.text="1/4"; + } + //load new sprites... + } + if(Registry.keywatch.JP_UP){ + card_pg_to_cards(); + } + } + + // Go to card select or do something with a single card + if(Registry.keywatch.JP_ACTION_1){ + if(selectors.members[3].visible){ + var idx:Int=cards_cursor_idx + cur_cards_pg * 12; + if(Registry.card_states[idx]){ + DH.start_dialogue(DH.name_card, DH.scene_card_one, DH.area_etc, idx); + } + // Do something + } else { // Go to card select + card_pg_to_cards(); + } + } + } + private function save_logic():Void { + if(Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + var spacin:Int=8; + if(DH.isZH())spacin=12; + if(Registry.keywatch.JP_DOWN){ + if(save_cursor_idx<3){ + if(Intra.is_ios && save_cursor_idx==2){ + return; + } + save_cursor_idx++; + if(save_cursor_idx==2){ + selectors.members[1].y +=spacin*2; + } else { + selectors.members[1].y +=spacin; + } + } + } else if(Registry.keywatch.JP_UP){ + if(save_cursor_idx>0){ + save_cursor_idx--; + if(save_cursor_idx==1){ + selectors.members[1].y -=spacin*2; + } else { + selectors.members[1].y -=spacin; + } + } + } + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + switch(save_cursor_idx){ + case 0: + if(Save.save()){ + if(Intra.is_ios){ + text_1.setText(DH.lk("save",1)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",4), true, 0, 0, "left", true) + } else { + text_1.setText(DH.lk("save",1)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",5)+"\n"+DH.lk("save",6), true, 0, 0, "left", true); + } + text_1.text +="\n\n\n\n"+DH.lk("save",7)+" " + Registry.death_count.toString(); + } else { + if(Intra.is_ios){ + text_1.setText(DH.lk("save",2)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",4), true, 0, 0, "left", true) + } else { + text_1.setText(DH.lk("save",2)+"\n"+DH.lk("save",3)+"\n"+DH.lk("save",5)+"\n"+DH.lk("save",6), true, 0, 0, "left", true); + } + text_1.text +="\n\n\n\n"+DH.lk("save",7)+" " + Registry.death_count.toString(); + } + break; + case 1: + Registry.cleanup_on_map_change(); + Registry.sound_data.stop_current_song(); + Save.save(); + FlxG.switchState(new TitleState); + break; + case 2: + if(Intra.is_ios){ + Registry.cleanup_on_map_change(); + Registry.sound_data.stop_current_song(); + FlxG.switchState(new TitleState); + } else { + Save.save(); + if(Intra.IS_WINDOWS && Main.joy !=null){ + Main.joy.kill(); + } + //if(Intra.is_ios){ + //Intra.intraintra.dispatchEvent(new Event(Event.DEACTIVATE,true)); + //} else { + NativeApplication.nativeApplication.exit(); + } + break; + case 3: + if(Intra.IS_WINDOWS && Main.joy !=null){ + Main.joy.kill(); + } + NativeApplication.nativeApplication.exit(); + + break; + + } + } + + } + + private var entered_lang:String; + private function settings_logic():Void { + + if(ctr_settings==0){ + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && !selectors.members[2].visible)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + if(Registry.keywatch.JP_DOWN){ + if(settings_cursor_idx<6){ + settings_cursor_idx ++; + if(settings_cursor_idx==2){ + selectors.members[1].y +=24; + } else if(settings_cursor_idx==3){ + selectors.members[1].y +=32; + } else if(settings_cursor_idx==4){ + selectors.members[1].y +=16; + if(DH.isZH())selectors.members[1].y +=8; + //if(Intra.is_ios){ + //settings_cursor_idx=3; + //} else if(Intra.is_mobile){ + //settings_cursor_idx=6; + //selectors.members[1].y +=48; + //} + } else if(settings_cursor_idx==5){ + selectors.members[1].y +=16; + } else if(settings_cursor_idx==6){ + if(Intra.is_mobile){ + settings_cursor_idx --; + } else { + selectors.members[1].y +=8; + } + } else if(settings_cursor_idx==7){ + settings_cursor_idx=6; + } else { + selectors.members[1].y +=16; + } + } + } else if(Registry.keywatch.JP_UP){ + if(settings_cursor_idx>0){ + settings_cursor_idx --; + if(settings_cursor_idx==1){ + selectors.members[1].y -=24; + } else if(settings_cursor_idx==2){ + selectors.members[1].y -=32; + } else if(settings_cursor_idx==3){ + selectors.members[1].y -=16; + if(DH.isZH())selectors.members[1].y -=8; + } else if(settings_cursor_idx==4){ + selectors.members[1].y -=16; + } else if(settings_cursor_idx==5){ + selectors.members[1].y -=8; + } else { + selectors.members[1].y -=16; + } + } + } + + if(Registry.keywatch.JP_ACTION_1){ + if(settings_cursor_idx==0){ + // Goto controls + if(!Intra.is_mobile){ + ctr_settings=1; + controls_state.change_text(); + controls_state.push(this); + } else { + /* CONFIGURE UI */ + ctr_settings=1; + volume_bar.visible=false; + selectors.members[1].visible=false; + volume_bar_bg.visible=false; + volume_bar_overlay.visible=false; + + //text_1.text="Drag the\nbuttons\nuntil you're\nsatisfied.\n\nThen, tap\nthe menu\nto continue.\n\n"; + text_1.text=DH.lk("config",20); + //var gam:Intra=FlxG._game as Intra; + //gam.mobile_flip_x_c(); + } + } else if(settings_cursor_idx==1){ // goto volume + ctr_settings=2; + selectors.members[1].play("disabled"); + selectors.members[2].play("enabled"); + selectors.members[3].play("enabled"); + selectors.members[2].visible=selectors.members[3].visible=true; + selectors.members[2].scale.x=-1; + selectors.members[2].x=selectors.members[1].x;selectors.members[2].y=58; + selectors.members[3].x=138;selectors.members[3].y=58; + + } else if(settings_cursor_idx==2){ + Registry.autosave_on=!Registry.autosave_on; + set_settings_text(true); + + } else if(settings_cursor_idx==3){ // Change resize type + if(!Intra.is_mobile){ + Intra.force_scale=true; + } else { + resize_mobile(); + } + set_settings_text(); + + } else if(settings_cursor_idx==4){ // Change Integer scaling + if(Intra.is_mobile){ + // dpad + touch, dpad, touch + var Intra_ref:Intra=FlxG._game as Intra; + if(Intra.allow_dpad_move && Intra.allow_game_move){ + Intra.allow_dpad_move=true; + Intra.allow_game_move=false; + } else if(Intra.allow_dpad_move){ + //intra_ref.turn_on_touch_only_listeners(true); + Intra.allow_game_move=true; + Intra.allow_dpad_move=false; + } else if(Intra.allow_game_move){ + //intra_ref.turn_on_touch_only_listeners(false); + Intra.allow_dpad_move=true; + } + set_settings_text(); + } else { + ctr_settings=3; + selectors.members[1].play("disabled"); + selectors.members[2].play("enabled"); + selectors.members[3].play("enabled"); + selectors.members[1].visible=false; + selectors.members[2].visible=selectors.members[3].visible=true; + selectors.members[2].scale.x=-1; + selectors.members[2].x=selectors.members[1].x + 58;selectors.members[2].y=120; + selectors.members[3].x=147;selectors.members[3].y=120; + } + + } else if(settings_cursor_idx==5){ //window size config + //if(Intra.is_mobile){ + //var _gam:Intra=FlxG._game as Intra; + //_gam.mobile_flip_handedness(); + //} else if(false==Intra.is_web){ + //ctr_settings=4; + //Intra.scale_factor=3; + //Intra.force_scale=true; + //window_words.visible=window_config.visible=true; + //} + + ctr_settings=24; + entered_lang=DH.language_type; + selectors.members[1].play("disabled"); + selectors.members[2].play("enabled"); + selectors.members[3].play("enabled"); + selectors.members[1].visible=false; + selectors.members[2].visible=selectors.members[3].visible=true; + selectors.members[2].scale.x=-1; + selectors.members[2].x=selectors.members[1].x + 61;selectors.members[2].y=136; + selectors.members[3].x=153;selectors.members[3].y=136; + + if(DH.LANG_ja==DH.language_type || DH.language_type==DH.LANG_ko){ + selectors.members[2].x -=8 * 4; + selectors.members[3].x -=8 * 4; + } + if(DH.LANG_pt==DH.language_type || DH.language_type==DH.LANG_es){ + selectors.members[2].x -=8 * 2; + selectors.members[3].x -=8 * 2; + } + + } else if(settings_cursor_idx==6){ + if(Intra.is_air && !Intra.is_mobile){ + if(Intra.IS_WINDOWS && Main.joy.getTotal()>0){ + trace("JOYPAD DETECTED!"); + Keys.has_joypad=true; + Keys.init_joypad(); + Main.joy.exists=true; + + if(Registry.joy_grp==null){ + Registry.joy_grp=new Joypad_Config_Group(); + } + add(Registry.joy_grp); + ctr_settings=5; + } else if(Intra.IS_MAC && Main.mac_joy_manager !=null && Main.mac_joy_manager.numberOfJoysticks()>0 && Main.mac_joy_manager.joysticks[0] !=null){ + trace("JOYPAD DETECTED!"); + Keys.has_joypad=true; + Keys.init_joypad(); + Main.macmanexists=true; + if(Registry.joy_grp==null){ + Registry.joy_grp=new Joypad_Config_Group(); + } + add(Registry.joy_grp); + ctr_settings=5; + } else { + trace("NO JOYPAD DETECTED!"); + Registry.sound_data.player_hit_1.play(); + if(Intra.IS_WINDOWS){ + Main.joy.exists=false; + } else if(Intra.IS_MAC){ + Main.macmanexists=false; + } + } + + } else if(Intra.is_mobile && !Intra.is_ios){ + // Configure controller + Registry.sound_data.player_hit_1.play(); + } + } + } + } else if(ctr_settings==1){ //controls + + if(Intra.is_mobile){ + + if(MobileConfig.update()){ + ctr_settings=0; + set_settings_text(false); + volume_bar.visible=true; + selectors.members[1].visible=true; + volume_bar_bg.visible=true; + volume_bar_overlay.visible=true; + } + return; + } + + + controls_state.update(); + if(!controls_state.updating &&(Registry.keywatch.JUST_PRESSED_PAUSE || FlxG.keys.justPressed("ESCAPE"))){ + controls_state.pop(this); + ctr_settings=0; + text_info.text=Registry.controls[Keys.IDX_ACTION_1] + DH.lk("secrets",13)+ Registry.controls[Keys.IDX_ACTION_2] + DH.lk("secrets",14); + } + } else if(ctr_settings==2){ //volume + if(Registry.keywatch.JP_ACTION_2){ + selectors.members[1].play("enabled"); + ctr_settings=0; + selectors.members[2].visible=selectors.members[3].visible=false; + selectors.members[2].scale.x=1; + } + + if(Registry.keywatch.JP_LEFT){ + FlxG.volume>0 ? FlxG.volume -=0.1:1; + } else if(Registry.keywatch.JP_RIGHT){ + FlxG.volume<1 ? FlxG.volume +=0.1:1; + } + + + //text_2.setText(int(FlxG.volume * 10).toString()); + volume_bar.scale.x=Std.int(FlxG.volume * 30); + volume_bar.x=volume_bar_overlay.x + volume_bar.scale.x -1; + } else if(ctr_settings==3){ // Integer scaling + if(Registry.keywatch.JP_ACTION_2){ + selectors.members[1].play("enabled"); + ctr_settings=0; + selectors.members[1].visible=true + selectors.members[2].visible=selectors.members[3].visible=false; + selectors.members[2].scale.x=1; + } + + + text_3.setText(DH.lk("config",16)+ " "+Intra.scale_factor.toString()+ "x",true,0,0,"left",true); + + if(Registry.keywatch.JP_LEFT){ + if(Intra.scale_factor>1){ + Intra.scale_factor--; + Intra.scale_ctr=(Intra.scale_ctr - 1)% 3; + Intra.force_scale=true; + } + } else if(Registry.keywatch.JP_RIGHT){ + // See if we can scale further + var ratio:Float=(Intra.scale_factor + 1)/ 3; + if(FlxG._game.stage.fullScreenHeight=new Array(); + + private function secretz_logic():Void { + + if(Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + secretz_idx=0; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + selectors.members[1].visible=false; + } + + if(Registry.keywatch.JP_RIGHT &&(secretz_idx % 4)<3){ + selectors.members[1].x +=24; + secretz_idx ++; + } else if(Registry.keywatch.JP_LEFT &&(secretz_idx % 4)>0){ + selectors.members[1].x -=24; + secretz_idx --; + } + + if(Registry.keywatch.JP_DOWN && Std.int(secretz_idx / 4)<3){ + selectors.members[1].y +=20; + secretz_idx +=4; + } else if(Registry.keywatch.JP_UP && Std.int(secretz_idx / 4)>0){ + selectors.members[1].y -=20; + secretz_idx -=4; + } + + if(Registry.keywatch.JP_ACTION_1){ + if(trophies.members.length - 1>=secretz_idx && trophies.members[secretz_idx].visible){ + secretz_wordz=new Array(); + for(ij in 0...13){ + secretz_wordz.push(DH.lk("secrets", ij)); + } + + DH.dialogue_popup(secretz_wordz[secretz_idx]); + } + } + } + + private function set_passive_effect(selector_index:Int):Void + { + var p:Dynamic=parent; + if(selector_index==Registry.IDX_WIDEN){ + // bound_effect ripples over to the state of the broom + if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } else { + Registry.bound_effect=Registry.item_names[Registry.IDX_WIDEN]; + p.player.action_latency_max=Player.WATK_DELAY; + } + } else if(selector_index==Registry.IDX_LENGTHEN){ + // bound_effect ripples over to the state of the broom + if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } else { + Registry.bound_effect=Registry.item_names[Registry.IDX_LENGTHEN]; + p.player.action_latency_max=Player.LATK_DELAY; + } + } else if(selector_index==Registry.IDX_BROOM){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } + } + + private function set_card_images():Void + { + for(card_page_idx in 0...12){ + if(1==Registry.card_states[card_page_idx + cur_cards_pg * 12]){ + trace(card_page_idx + cur_cards_pg * 12); + cards.members[card_page_idx].frame=card_page_idx + cur_cards_pg * 12; + } else { + cards.members[card_page_idx].frame=49; + } + } + } + + private function set_key_graphics():Void + { + //not working + for(i in 0...3){ + var key:FlxSprite=key_icons.members[i]; + key.loadGraphic(NPC.key_green_embed, true, false, 16, 16); + switch(i){ + case 0:if(Registry.inventory[Registry.IDX_GREEN_KEY]){ + key.frame=0; + } else { + key.frame=1; + } + break; + case 1:if(Registry.inventory[Registry.IDX_RED_KEY]){ + key.frame=2; + } else { + key.frame=3; + } + break; + case 2:if(Registry.inventory[Registry.IDX_BLUE_KEY]){ + key.frame=4; + } else { + key.frame=5; + } + break; + } + } + } + + private function check_for_exit_with(condition:Bool):Void + { + if(condition){ + if(exit_latency<0){ + done=true; + exit_latency=0.5; + current_substate_visible=false; + Registry.GAMESTATE.player.no_jump_ticks=7; + reset_counters(); + menu_select_active.visible=true; + menu_select_inactive.visible=false; + window_words.visible=window_config.visible=false; + } + } else { + if(exit_latency>0){ + exit_latency -=FlxG.elapsed; + } + } + } + + private function reset_counters():Void { + + state=s_browse; + ctr_settings=0; + map_ctr=0; + map_cursor_idx=save_cursor_idx=settings_cursor_idx=equip_cursor_idx=equip_cursor_idx=0; + doing_window_config=false; + + } + + private function dialogue_logic():Void + { + Registry.GAMESTATE.dialogue_state.update(); + if(t_d>tm_d){ + if(Registry.GAMESTATE.dialogue_state.is_finished &&(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JP_ACTION_1)){ + t_d=0; + Registry.GAMESTATE.dialogue_state.reset(); + if(equip_cursor_idx>=10){ + state=s_equip; + } else if(base_index==5){ + state=s_secretz; + } else { + state=s_cards;// mayneed to change later + } + Registry.GAMESTATE.dialogue_state.pop(this as FlxState); + DH.dont_need_recently_finished(); + } + } else { + t_d +=FlxG.elapsed; + } + } + private function resize_mobile():Void { + switch(Intra.scale_ctr){ + case Intra.SCALE_TYPE_FIT: + Intra.scale_ctr=Intra.SCALE_TYPE_INT; + break; + case Intra.SCALE_TYPE_INT: + default: + Intra.scale_ctr=Intra.SCALE_TYPE_FIT; + break; + } + var i:Intra=FlxG._game as Intra; + i.resize_mobile_game(); + + } + private function get_resolution_string(is_init:Bool=false):String { + + if(Intra.is_mobile){ + switch(Intra.scale_ctr){ + case Intra.SCALE_TYPE_FIT: + res=DH.lk("config",15); + break; + case Intra.SCALE_TYPE_INT: + default: + res=DH.lk("config",14); + break; + } + return res; + } + if(is_init){ + Intra.scale_ctr--; + } + var res:String=DH.lk("config",13); + switch(Intra.scale_ctr){ + case 1: + res=DH.lk("config",14); + break; + case 2: + res=DH.lk("config",15); + break; + case 0: + res=DH.lk("config",13); + break; + } + if(is_init){ + Intra.scale_ctr++; + } + return res; + } + private function set_settings_text(is_init:Bool=false, enteredlang:String=""):Void { + if(enteredlang=="")enteredlang=DH.language_type; + var autosave_state:String=Registry.autosave_on ? DH.lk("config",4):DH.lk("config",5);//on off + var first:String=Intra.is_mobile ? DH.lk("config",7):DH.lk("config",1);//config ui / set keybinds + //var last:String=Intra.is_mobile ? " ":DH.lk("config",21);// " " / resize window + var last:String=Intra.is_mobile ? " ":" ";// " " / resize window + var res:String=Intra.is_mobile ? "\n"+DH.lk("config",6)+"\n ":"\n\n"+DH.lk("config",12)+"\n ";// change res/ resolution + var joypart:String=Intra.is_ios ? " ":DH.lk("config",22); + var langpart:String=DH.lk("config", 17)+" " + Std.string(DH.language_type); + if(DH.LANG_pt==DH.language_type){ + langpart=DH.lk("config", 17)+" " + "pt-BR"; + } + if(entered_lang==DH.LANG_zhs){ + langpart=DH.lk("config", 17)+ Std.string(DH.language_type); + langpart=langpart.replace(" ", ""); + } + + if(enteredlang==DH.LANG_ja){ + + langpart=DH.lk("config", 17)+" " + Std.string(DH.language_type); + } + + var movepart:String=""; + + if(Intra.allow_dpad_move && Intra.allow_game_move){ + //movepart="Touch+D-Pad"; + movepart=DH.lk("config",8); + } else if(Intra.allow_dpad_move){ + movepart=DH.lk("config",9); + } else if(Intra.allow_game_move){ + movepart=DH.lk("config",10); + } + + if(Intra.is_mobile){ + text_1.setText(first + "\n\n" + DH.lk("config", 2)+ "\n\n\n" + DH.lk("config", 3)+ "\n " + autosave_state + res + get_resolution_string(is_init)+ "\n" + DH.lk("config", 11)+ "\n" + movepart + "\n" + langpart, true, 0, 0, "left", true); + if(enteredlang==DH.LANG_zhs)text_1.setText(first + "\n" + DH.lk("config", 2)+ "\n\n" + DH.lk("config", 3)+ autosave_state + res + get_resolution_string(is_init)+ "\n" + DH.lk("config", 11)+ "\n" + movepart+"\n"+ langpart, true, 0, 0, "left", true); + } else { + if(is_init){ + text_1.setText(first + "\n\n" + DH.lk("config", 2)+ "\n\n\n" + DH.lk("config", 3)+ "\n " + autosave_state + res + get_resolution_string(true)+ "\n\n\n" + langpart + "\n" + joypart, true, 0, 0, "left", true); + if(enteredlang==DH.LANG_zhs)text_1.setText(first + "\n" + DH.lk("config", 2)+ "\n\n" + DH.lk("config", 3)+ autosave_state + res + get_resolution_string(true)+ "\n\n" + langpart + "\n" + joypart, true, 0, 0, "left", true); + } else { + text_1.setText(first+"\n\n"+DH.lk("config",2)+"\n\n\n"+DH.lk("config",3)+"\n " + autosave_state + res + get_resolution_string()+"\n\n\n"+langpart+"\n"+joypart+"\n"+last, true, 0, 0, "left", true); + if(enteredlang==DH.LANG_zhs)text_1.setText(first + "\n" + DH.lk("config", 2)+ "\n\n" + DH.lk("config", 3)+ autosave_state + res + get_resolution_string()+ "\n\n" + langpart + "\n" + joypart+"\n"+last, true, 0, 0, "left", true); + } + } + + + } + + private function set_trade_item():Void { + trade_item.visible=true; + if(Registry.inventory[Registry.IDX_BOX]){ + trade_item.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + trade_item.frame=31; + } else if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + trade_item.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + trade_item.frame=56; + } else { + trade_item.visible=false; + } + } + + private function set_trophy_vis(_trophies:FlxGroup, idx:Int):Void { + _trophies.members[idx].visible=false; + //_trophies.members[idx].visible=true; + switch(idx){ + case 0: + if(Registry.inventory[Registry.IDX_POO])_trophies.members[idx].visible=true; + break; + case 1: + if(Registry.inventory[Registry.IDX_SPAM])_trophies.members[idx].visible=true; + break; + case 2: + if(Registry.inventory[Registry.IDX_MISSINGNO])_trophies.members[idx].visible=true; + break; + case 3: + if(Registry.inventory[Registry.IDX_AUS_HEART])_trophies.members[idx].visible=true; + break; + case 4: + if(Registry.inventory[Registry.IDX_ELECTRIC])_trophies.members[idx].visible=true; + break; + case 5: + if(Registry.inventory[Registry.IDX_KITTY])_trophies.members[idx].visible=true; + break; + case 6: + if(Registry.inventory[Registry.IDX_MELOS])_trophies.members[idx].visible=true; + break; + case 7: + if(Registry.inventory[Registry.IDX_MARINA])_trophies.members[idx].visible=true; + break; + case 8: + if(Registry.inventory[Registry.IDX_BLACK])_trophies.members[idx].visible=true; + break; + case 9: + if(Registry.inventory[Registry.IDX_RED])_trophies.members[idx].visible=true; + break; + case 10: + if(Registry.inventory[Registry.IDX_GREEN])_trophies.members[idx].visible=true; + break; + case 11: + if(Registry.inventory[Registry.IDX_BLUE])_trophies.members[idx].visible=true; + break; + case 12: + if(Registry.inventory[Registry.IDX_WHITE])_trophies.members[idx].visible=true; + break; + + + } + } + + private function is_crowd_minidungeon():Bool { + return(Registry.CURRENT_MAP_NAME=="CROWD" && + ( + (Registry.CURRENT_GRID_X>=4 && Registry.CURRENT_GRID_X<=7 && Registry.CURRENT_GRID_Y==7)|| + (Registry.CURRENT_GRID_X==7 && Registry.CURRENT_GRID_Y==6) + ) + ); + } + private function card_pg_to_cards():Void + { + selectors.members[3].visible=true; + selectors.members[2].visible=false; + selectors.members[1].visible=false; + selectors.members[3].play("enabled"); + selectors.members[2].play("disabled"); + selectors.members[1].play("disabled"); + selectors.members[3].x=cards.members[0].x - 10 +((cards_cursor_idx % 3)* 30); + selectors.members[3].y=cards.members[0].y + 10 +(int(cards_cursor_idx / 3)* 29); + } + + // do this eventually + public function set_pausemenu_labels():Void + { + var idx:Int=-1; + var an_string:String=DH.lk("map", 0)+ "\n\n" + DH.lk("items", 0)+ "\n\n" + DH.lk("cards", 0)+ "\n\n" + DH.lk("save", 0)+ "\n\n" + DH.lk("config", 0); + if(DH.isZH())an_string=DH.lk("map", 0)+ "\n" + DH.lk("items", 0)+ "\n" + DH.lk("cards", 0)+ "\n" + DH.lk("save", 0)+ "\n" + DH.lk("config", 0); + if(Registry.GE_States[Registry.GE_HAVE_A_SECRET]){ + if(DH.isZH()){ + an_string +="\n???"; + } else { + an_string +="\n\n???"; + } + } + + if(text_categories !=null){ + idx=base_group.members.indexOf(text_categories); + } + text_categories=EventScripts.init_bitmap_font(an_string, "left", 10, 13 + Registry.HEADER_HEIGHT, null, "apple_white"); + if(DH.isZH()){ + text_categories.y -=3; + text_categories.customSpacingY +=4; + } + text_categories.color=0xffffff; + text_categories.drop_shadow=true; + if(idx !=-1){ + base_group.members[idx]=text_categories; + } + + idx=-1; + if(text_info !=null)idx=base_group.members.indexOf(text_info); + //text_info=EventScripts.init_bitmap_font(Registry.controls[Keys.IDX_ACTION_1] + ":Select " + Registry.controls[Keys.IDX_ACTION_2] + ":Back", "left", 2, 150 + Registry.HEADER_HEIGHT, null, "apple_white"); + text_info=EventScripts.init_bitmap_font(Registry.controls[Keys.IDX_ACTION_1] + DH.lk("secrets",13)+ Registry.controls[Keys.IDX_ACTION_2] + DH.lk("secrets",14), "left", 2, 150 + Registry.HEADER_HEIGHT, null, "apple_white"); + text_info.color=0x909ab1; + if(idx !=-1)base_group.members[idx]=text_info; + + //11323b + idx=-1; + if(text_1 !=null)idx=base_group.members.indexOf(text_1); + text_1=EventScripts.init_bitmap_font(" ", "left", 0, 0, null, "apple_white"); + if(idx !=-1)base_group.members[idx]=text_1; + + idx=-1; + if(text_2 !=null)idx=base_group.members.indexOf(text_2); + text_2=EventScripts.init_bitmap_font(" ", "left",0,0,null,"apple_white"); + if(idx !=-1)base_group.members[idx]=text_2; + + idx=-1; + if(text_3 !=null)idx=base_group.members.indexOf(text_3); + text_3=EventScripts.init_bitmap_font(" ", "left", 0, 0, null, "apple_white"); + if(idx !=-1)base_group.members[idx]=text_3; + + text_1.color=text_2.color=text_3.color=0xffffff; + text_1.drop_shadow=text_2.drop_shadow=text_3.drop_shadow=true; + } + +} \ No newline at end of file diff --git a/intra/source/states/PlayState.hx b/intra/source/states/PlayState.hx new file mode 100644 index 0000000..0b87ea1 --- /dev/null +++ b/intra/source/states/PlayState.hx @@ -0,0 +1,2074 @@ +package states +{ +import adobe.utils.CustomActions; +import data.*; +import entity.*; +import entity.decoration.*; +import entity.enemy.hotel.Eye_Boss; +import entity.gadget.*; +import entity.player.*; +import flash.display.BitmapData; +import flash.display.Shader; +import flash.filters.ShaderFilter; +import flash.geom.Point; +import flash.geom.Rectangle; +import flash.utils.ByteArray; +import flash.utils.getTimer; +import global.*; +import helper.*; +import org.flixel.*; +import org.flixel.plugin.photonstorm.*; +import states.*; + + + + +class PlayState extends FlxState { + + public function new(){ + + } + + private var BACK_TEXT_MOBILE:FlxBitmapFont; + // shaders + private var static_shader:Shader=new Shader(new Common_Sprites.static_shader); + private var static_shaderFilter:ShaderFilter; + + private var noScrollPt:FlxPoint; + private var keyWatch:Keys; + public var player:Player; + public var player_group:FlxGroup; + public var last_song_time:Float;// Hacky, used to check if the song has been "stuck" at the end and force a loop + private var t_last_song_pos_checked:Float=0; + private var ambience:FlxSound=new FlxSound(); + private var has_ambient_sound:Bool=false; + + + private var stateful_mapXML:XML; + public var stateful_gridXML:XML; + public var statefuls:Array;// The current statefuls being Interacted with + private var stateless_mapXML:XML; + private var stateless_gridXML:XML; + public var statelesses:Array; + public var anim_tiles_group:FlxGroup; + + /* movable flat gadgets - dust basically */ + public var Intra_bg_bg2_sprites:FlxGroup; + public var bg_sprites:FlxGroup; + public var fg_sprites:FlxGroup;//stuff from ceiling + public var otherObjects:Array;//Holds sub-sprites, like a lser of wall laser + private var oldObjects:Array;// A buffer that holds the next to be loaded.. + private var oldStateless:Array; + private var oldOthers:Array; + public var sortables:FlxGroup; + //BG anim_tiles BG2 flat_tiles sortables etc... + + /* BG */ + //[Embed(source="../res/sprites/decoration/BLANK_BG.png")] public static var BLANK_BG:Class; + public var bg:FlxSprite;//background sprite + public var has_bg:Bool=false; + public var map:FlxTilemap; + private var mapData:Array; + public var curMapBuf:FlxTilemap; + public var prevMapBuf:FlxTilemap; + public var map_bg_2:FlxTilemap;//on top of the bg map + public var map_fg:FlxTilemap;// on top of all sprites but below darkness + public var SWITCH_MAPS:Bool=false; + + + /* State vars and associated objects */ + public var state:Int; + public var S_NORMAL:Int=0; + public var S_TRANSITION:Int=1; + private var justTransitioned:Bool=false; + public static var dont_change_songs:Bool=false; + + public var S_PAUSED:Int=2; + public var pause_state:PauseState; + private var pause_timer:Float=0.2; + + private var S_PLAYER_DIED:Int=4; + private var death_fadein:FlxSprite; + private var death_text:FlxBitmapFont; + private var played_death_sound:Bool; + private var start_death_fade_out:Bool; + + private var S_JUST_ENTERED_MAP:Int=5; + + + private var S_DIRECT_CONTROLS:Int=6; + private var S_CUTSCENE:Int=7; + private var cutscene:Cutscene; + + public var S_DIALOGUE:Int=8; + public var load_dialogue:Bool=false; + public var dialogue_state:DialogueState; + public var dialogue_latency:Float=0.3; + + public var S_MINIMAP:Int=9; + + // reset sprites/arrays/etc before leavign + private var cleaned_up_before_exit:Bool; + + public var upperBorder:Int; + public var lowerBorder:Int; + public var rightBorder:Int; + public var leftBorder:Int; + public var Scroll_Increment:Int=4; + + public var debugText:FlxText; + + /* UI/Header entities */ + //[Embed(source="../res/sprites/inventory/header.png")] public static var Header:Class; + //[Embed(source="../res/sprites/menu/autosave_icon.png")] public static var autosave_icon_embed:Class; + public var header_group:FlxGroup; + public var header:FlxSprite; + public var mm_map:Miniminimap; + public var item_placeholder_1:FlxSprite; + public var item_placeholder_2:FlxSprite; + public var number_of_keys_text:FlxBitmapFont; + public var autosave_icon:FlxSprite; + + /* Various graphical effect entities */ + + public var darkness:FlxSprite; + public var darkness_timer:Float=1.5; + public var black_overlay:FlxSprite; + public var downscale:Int=1; + public var downsample_fade:ScreenFade; + public var upsample_fade:ScreenFade; + public var dec_over:FlxSprite; + public var has_decor_overlay:Bool; + public var made_overlay:Bool; + public var fg_solid:Bool=false; + public var before_fg_overlay:FlxSprite; + + private var ran_constructors:Bool=false; + private var ran_Add:Bool=false; + private var playtime_timer:Float=0; + + /** + * Allocate memory for everything. This should only be done ONCE + * over the entire life of the program. + */ + private function run_constructors():Void { + if(ran_constructors)return; + trace("RUNNING CONSTRUCTORS"); + if(Registry.keywatch==null){ + Registry.keywatch=new Keys(); + } + //BACK_TEXT_MOBILE=EventScripts.init_bitmap_font("Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", "center", 21, 22, null,"apple_white"); + BACK_TEXT_MOBILE=EventScripts.init_bitmap_font(DH.lk("title",17), "center", 21, 22, null,"apple_white"); + static_shaderFilter=new ShaderFilter(static_shader); + + noScrollPt=new FlxPoint(0, 0); + player_group=new FlxGroup(); + + statefuls=new Array();// The current statefuls being Interacted with + statelesses=new Array(); + anim_tiles_group=new FlxGroup(); + + /* movable flat gadgets - dust basically */ + intra_bg_bg2_sprites=new FlxGroup(); + bg_sprites=new FlxGroup(); + fg_sprites=new FlxGroup();//stuff from ceiling + otherObjects=new Array();//Holds sub-sprites, like a lser of wall laser + oldObjects=new Array();// A buffer that holds the next to be loaded.. + oldStateless=new Array(); + oldOthers=new Array(); + sortables=new FlxGroup(); + + before_fg_overlay=new FlxSprite(0, 0); + + darkness=new FlxSprite(0, Registry.HEADER_HEIGHT); + dec_over=new FlxSprite(0, 0); + dec_over.scrollFactor=noScrollPt; + player=new Player(Registry.ENTRANCE_PLAYER_X, Registry.ENTRANCE_PLAYER_Y, Registry.keywatch,darkness,this); + + bg=new FlxSprite(0, 0); + map=new FlxTilemap(); + mapData=new Array(); + curMapBuf=new FlxTilemap(); + prevMapBuf=new FlxTilemap(); + map_bg_2=new FlxTilemap(); + map_fg=new FlxTilemap(); + + + number_of_keys_text=EventScripts.init_bitmap_font("x" + Registry.get_nr_keys().toString(), "left", 37, 7, null, "apple_white"); + death_fadein=new FlxSprite(0, 0); + black_overlay=new FlxSprite(0, 0); + death_text=EventScripts.init_bitmap_font("Continue?", "center", 50, 60, null, "apple_white"); + + pause_state=new PauseState(); + + dialogue_state=new DialogueState(); + debugText=new FlxText(0, 0, 160); + downsample_fade=new ScreenFade(160, 180, this, ScreenFade.T_DS); + upsample_fade=new ScreenFade(160, 180, this, ScreenFade.T_US); + + header_group=new FlxGroup(); + header=new FlxSprite(0, 0); + mm_map=new Miniminimap(); + item_placeholder_1=new FlxSprite(10, 2); + item_placeholder_2=new FlxSprite(37, 2); + autosave_icon=EventScripts.init_autosave_icon(autosave_icon, autosave_icon_embed); + + FlxG.watch(Registry,"GRID_PUZZLES_DONE","puzct"); + FlxG.watch(Registry, "GRID_ENEMIES_DEAD", "enmct"); + + Registry.PLAYSTATE=this; + ran_constructors=true; + } + + // Called once per area. + public function init():Void { + Registry.PLAYSTATE=this; + + dialogue_state.set_dialogue_box(); + // Determine the decorative overlay if any, sits on top of all graphic + made_overlay=false; + GFX_STATIC_ALWAYS_ON=false; + if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + if(Registry.E_NEXT_MAP_NO_STATIC==true){ + GFX_STATIC_ALWAYS_ON=true; + Registry.E_NEXT_MAP_NO_STATIC=false; + } else { + GFX_STATIC_ALWAYS_ON=true; + player.broom.loadGraphic(Broom.Knife_Sprite, true, false, 16, 16); + } + } else if(Registry.CURRENT_MAP_NAME=="DRAWER"){ + if(false==in_death_room){ + GFX_STATIC_ALWAYS_ON=true; + } else { + DH.disable_menu(); + } + } else if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + player.broom.loadGraphic(Broom.Cell_Sprite, true, false, 16, 16); + } else { + player.broom.loadGraphic(Broom.Broom_Sprite,true,false,16,16); + } + + has_decor_overlay=false; + dec_over.exists=false; + dec_over.velocity.x=dec_over.velocity.y=0; + + // overlay before the FG(for forest) + + set_before_fg(); + state=S_JUST_ENTERED_MAP; + SWITCH_MAPS=false; + cleaned_up_before_exit=false; + played_death_sound=false; + start_death_fade_out=false; + has_bg=false; + fg_solid=false; + Registry.GFX_WAVE_EFFECT_ON=false; + number_of_keys_text.text="x" + Registry.get_nr_keys().toString(); + + /* Set some globals*/ + Registry.GAMESTATE=this; + + /* Flip some bools*/ + if(Registry.CURRENT_MAP_NAME=="BEDROOM"){ + Registry.GE_States[Registry.GE_Bedroom_Visited]=true; + } else if(Registry.CURRENT_MAP_NAME=="STREET"){ + Registry.GE_States[Registry.GE_ent_str]=true; + } else if(Registry.CURRENT_MAP_NAME=="REDCAVE"){ + + } else if(Registry.CURRENT_MAP_NAME=="CROWD"){ + } else { + if(Registry.GE_States[Registry.GE_Bedroom_Boss_Dead_Idx]){ + Registry.GE_States[Registry.GE_Left_BDR_After_Boss_Dead]=true; + } + + if(Registry.GE_States[Registry.GE_Redcave_Boss_Dead_Idx]){ + Registry.GE_States[Registry.GE_Left_RDC_After_Boss_Dead]=true; + trace("GE:Left Redcave after boss!"); + } + + if(Registry.GE_States[Registry.GE_Crowd_Boss_Dead_Idx]){ + trace("GE:Left Crowd after boss!"); + Registry.GE_States[Registry.GE_Left_CRD_After_Boss_Dead]=true; + } + } + + if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]=true; + } else if(Registry.CURRENT_MAP_NAME=="BLUE"){ + Registry.GE_States[Registry.GE_ENTERED_BLUE_ONCE]=true; + } + if(Registry.nr_growths<36 || Registry.GE_States[Registry.GE_ENTERED_BLUE_ONCE]==false){ + Registry.Nexus_Door_State[13]=false; + } + + + set_do_dark_fill(Registry.CURRENT_MAP_NAME); + set_darkness(Registry.CURRENT_MAP_NAME); + + /* set player data */ + trace("Instantiating player at(",Registry.CURRENT_MAP_NAME, Registry.ENTRANCE_PLAYER_X, Registry.ENTRANCE_PLAYER_Y, ")"); + player.x=Registry.ENTRANCE_PLAYER_X; + player.y=Registry.ENTRANCE_PLAYER_Y; + player.gridX=Registry.CURRENT_GRID_X=Std.int(player.x / 160); + player.gridY=Registry.CURRENT_GRID_Y=Std.int((player.y - Registry.HEADER_HEIGHT)/ 160); + player.grid_entrance_x=player.x; + player.grid_entrance_y=player.y; + player.reset_anodyne(); + + downsample_fade.reset(); + upsample_fade.reset(); + + + black_overlay.alpha=0; + start_death_fade_out=false; + played_death_sound=false; + death_text.visible=false; + death_fadein.visible=false; + death_fadein.alpha=0; + + last_song_time=0; + header.scrollFactor=noScrollPt; + } + // Essentially the "reset" function. Resets all thingies. + override public function create():Void { + run_constructors(); + init(); + noScrollPt.x=noScrollPt.y=0; + /* Add watcher for keypresses */ + keyWatch=Registry.keywatch; + + // New-s a CSV + pause_state.minimap.init_minimap(); + pause_state.minimap.stuff_for_pause_state(); + pause_state.minimap.update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + mm_map.switch_map(); + mm_map.switch_rooms(Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + + /* Load initial map data */ // No reset needed + TileData.setTileset(Registry.CURRENT_MAP_NAME); + // getMap new-s a CSV Dynamic + map.loadMap(CSV_Data.getMap(Registry.CURRENT_MAP_NAME), TileData.Tiles, 16, 16); + mapData=map.getData(); + map_bg_2.null_buffer(0); + map_fg.null_buffer(0); + map_bg_2.loadMap(CSV_Data.getMap(Registry.CURRENT_MAP_NAME, 2), TileData.Tiles, 16, 16); + map_bg_2.y=Registry.HEADER_HEIGHT; + map_fg.loadMap(CSV_Data.getMap(Registry.CURRENT_MAP_NAME, 3), TileData.Tiles, 16, 16); + map_fg.y=Registry.HEADER_HEIGHT; + TileData.set_tile_properties(map_bg_2); + if(Registry.CURRENT_MAP_NAME=="OVERWORLD"){ + TileData.set_tile_properties(map_fg); + fg_solid=true; + } + + /* Uses player, and left/right/etcborder to set new borders */ + updateScreenBorders(); + + /* UI stuff */ + header.loadGraphic(Header, false, false, 160, 20); + header.scrollFactor=noScrollPt; + number_of_keys_text.color=0x7ca3b1; + + + /* Init camera, player position */ + FlxG.camera.setBounds(0, 0, 160, 180, true); + FlxG.camera.bounds.x=player.gridX * 160; + FlxG.camera.bounds.y=player.gridY * 160; + + FlxG.worldBounds.copyFrom(FlxG.camera.bounds); + + /* Set debug text if necessary */ + debugText.text="Foo.";debugText.scrollFactor=noScrollPt; + + FlxG.debug=true; + + /* Modifies the cur/left/etcmapBufs */ + fillMapBuffers(true); + + /* Death screen entities */ + death_fadein.scrollFactor=noScrollPt; + if(Registry.CURRENT_MAP_NAME=="TRAIN"){ + death_text.color=0xffffff; + death_fadein.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, 0xff000000); + } else { + death_text.color=0x000000; + death_fadein.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, 0xffffffff); + } + death_fadein.alpha=0; + + + death_text.visible=false; + + /* Draw order */ + /* BG1, anim-tiles, BG2, bg_sprites, sortables(depth sorting here), above draw group, FG */ + set_bg(); + + initXML(); + reviveGridLocalSprites(); + Registry.reset_subgroups();// In case some leftover from previous state + loadStatelessSprites(); + loadStatefulSprites(); + + + //NEEDS TO STAY + for(id in 0...otherObjects.length){ + trace("otherObject constructor:", otherObjects[id]); + sortables.add(otherObjects[id]); + } + + /* Add to player group */ + player.foot_overlay.map=map; + player.foot_overlay.reset_anodyne(); + player.foot_overlay_bg_bg2.map=map; + player.foot_overlay_bg_bg2.reset_anodyne(); + if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + player.foot_overlay.exists=false; + } else { + player.foot_overlay_bg_bg2.exists=false; + } + + black_overlay.scrollFactor=noScrollPt; + black_overlay.makeGraphic(Registry.SCREEN_HEIGHT_IN_PIXELS, Registry.HEADER_HEIGHT + Registry.SCREEN_WIDTH_IN_PIXELS, 0xff000000); + black_overlay.alpha=1; + if(Registry.FUCK_IT_MODE_ON){ + black_overlay.alpha=0.02; + } + + /* Graphical effects */ + + Registry.EVENT_FADE_BEGUN=true; + // Decorative overlay + load_decoration_overlay_graphic(); + + /* Maybe play special sounds and songs */ + has_ambient_sound=false; + if(!dont_change_songs){ + Registry.sound_data.start_song_from_title(Registry.CURRENT_MAP_NAME); + if(Registry.CURRENT_MAP_NAME=="BEACH"){ + has_ambient_sound=true; + ambience=Registry.sound_data.waves; + Registry.sound_data.waves.play(); + + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + has_ambient_sound=true; + ambience=Registry.sound_data.rain; + Registry.sound_data.rain.play(); + } else { + Registry.sound_data.rain.stop(); + Registry.sound_data.waves.stop(); + + } + } + dont_change_songs=false; + + + + if(Registry.EVENT_TELEPORT_DOWN_SOUND){ + Registry.sound_data.teleport_down.play(); + Registry.EVENT_TELEPORT_DOWN_SOUND=false; + } + + /* Check for debug mode */ + if(Registry.FUCK_IT_MODE_ON){ + Scroll_Increment=160; + + } + + // Misc. + Eye_Boss.global_state=Eye_Boss.gs_new; + + if(!ran_Add){ + init_add(); + ran_Add=true; + } + + if(Registry.CURRENT_MAP_NAME=="FIELDS"){ + if(Registry.playtime<60 * 10){ + Achievements.unlock(Achievements.Fast_fields); + } + } + + } + + // Do all of the adding, only once in the lifetime of the program. + private function init_add():Void { + + add(keyWatch); + + header_group.add(header); + header_group.add(number_of_keys_text); + header_group.add(player.health_bar); + header_group.add(autosave_icon); + header_group.add(mm_map); + + add(bg); + add(prevMapBuf); + add(curMapBuf); + + add(anim_tiles_group); + add(player.reflection); + add(player.reflection_broom); + add(intra_bg_bg2_sprites); + add(map_bg_2); + add(bg_sprites); + + player.init_player_group(player_group, player, map); + sortables.add(player_group); + add(sortables); + + add(before_fg_overlay); + add(fg_sprites); + add(map_fg); + + add(dec_over); + add(darkness); + add(header_group); + add(death_fadein); + add(death_text); + add(black_overlay); + + //add(debugText); + debugText.text=Achievements.DEBUG_TEXT; + debugText.exists=true; + + BACK_TEXT_MOBILE.alpha=0; + add(BACK_TEXT_MOBILE); + } + + private var t_mobile_back:Float=0; + override public function update():Void { + number_of_keys_text.x=37; + if(DH.isZH())number_of_keys_text.x=35; + + if(Registry.MOBILE_ASK_TO_EXIT_WITH_BACK && state !=S_PAUSED && pause_timer<0){ + t_mobile_back=2; + Registry.MOBILE_ASK_TO_EXIT_WITH_BACK=false; + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=true; + } else if(state==S_PAUSED){ + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=false; + Registry.MOBILE_ASK_TO_EXIT_WITH_BACK=false; + } + if(t_mobile_back>0){ + BACK_TEXT_MOBILE.alpha=t_mobile_back / 2.0; + t_mobile_back -=FlxG.elapsed; + if(t_mobile_back<0){ + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=false; + } + } + + playtime_timer +=FlxG.elapsed; + if(playtime_timer>=1){ + playtime_timer -=1; + Registry.playtime +=1; + } + // Sometimes there's an issue where a song gets stuck even if I put the samples correctly + // So this checks every half second if the ms head has stopped moving, and if so, loops the song. + t_last_song_pos_checked +=FlxG.elapsed; + if(t_last_song_pos_checked>0.5){ + if(Registry.sound_data.current_song !=null && Registry.sound_data.current_song._channel !=null){ + if(last_song_time !=0 && Registry.sound_data.current_song._channel.position - last_song_time<5){ + Registry.sound_data.start_song_from_title(Registry.sound_data.current_song_name); + } + last_song_time=Registry.sound_data.current_song._channel.position; + } + t_last_song_pos_checked=0; + } + + // Test mode stuff + if(Intra.is_test){ + ugly_test_mode_functions(); + } + + + // Change alpha value of darkness overlay, maybe. + darkness_timer -=FlxG.elapsed; + + if(Registry.EVENT_CHANGE_DARKNESS_ALPHA){ + if(darkness.alpha>=Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET){ + if(EventScripts.send_alpha_to(darkness, Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET, -0.02)){ + Registry.EVENT_CHANGE_DARKNESS_ALPHA=false; + } + } else { + if(EventScripts.send_alpha_to(darkness, Registry.EVENT_CHANGE_DARKNESS_ALPHA_TARGET, 0.02)){ + Registry.EVENT_CHANGE_DARKNESS_ALPHA=false; + } + } + darkness.alpha=Std.int(Math.round(darkness.alpha * 100))/ 100; + //??? + + } + + if(Registry.E_FADE_AND_SWITCH){ + Registry.EVENT_CHANGE_VOLUME_SCALE=false; + if(!Registry.E_FADED){ + Registry.volume_scale -=0.027; + if(Registry.volume_scale<=0){ + Registry.volume_scale=0; + Registry.sound_data.start_song_from_title(Registry.E_FADE_AND_SWITCH_SONG); + Registry.E_FADED=true; + } + } else { + Registry.volume_scale +=0.027; + if(Registry.volume_scale>=1){ + Registry.volume_scale=1; + Registry.E_FADE_AND_SWITCH=false; + Registry.E_FADED=false; + } + } + } + + + // Makes the overlay, if it's a image tiled in a 2x2 pattern, + // repeat as it hits the edges, based on its width. should be larger than 160x160 to not appear awkward unless + // it's not obvious how it repeats. + update_decoration_overlay(); + + // Scale ambience + if(has_ambient_sound){ + ambience.volume=FlxG.volume * Registry.volume_scale; + if(Registry.CURRENT_MAP_NAME=="BEACH"){ + if(Registry.CURRENT_GRID_Y==2){ + ambience.volume *=0.55; + } else if(Registry.CURRENT_GRID_Y<2){ + ambience.volume *=0.21; + } + } + } + + + if(state==S_NORMAL){ + stateNormal(); + } else if(state==S_TRANSITION){ + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + stateTransition();doCollisions();super.update();return; + } else if(state==S_PAUSED){ + statePaused(); + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + return; + } else if(state==S_PLAYER_DIED){ + state_player_died(); + if(SWITCH_MAPS){ + state=S_NORMAL; + } + super.update(); + return; + } else if(state==S_JUST_ENTERED_MAP){ + black_overlay.alpha -=0.02; + player.dontMove=true; + if(Registry.FUCK_IT_MODE_ON){ + + Registry.EVENT_FADE_BEGUN=false; + Registry.EVENT_FADE_BEGUN=true; + } + if(black_overlay.alpha<=0 && Registry.EVENT_FADE_OVER){ + state=S_NORMAL;player.dontMove=false; + Registry.EVENT_FADE_BEGUN=Registry.EVENT_FADE_OVER=false; + } + super.update(); + return; + } else if(state==S_DIRECT_CONTROLS){ + stateControls(); + return; + } else if(state==S_CUTSCENE){ //update cutscene event or whatever + stateCutscene(); + return; + } else if(state==S_DIALOGUE){ + dialogue_state.update(); + if(dialogue_state.is_finished){ + + reset_dialogue_state_on_finish(); + } + } + + // Only actually transition once any dialogue is done + if(SWITCH_MAPS && DH.a_chunk_is_playing()==false){ + state=S_NORMAL; + transition_out(); + return; + } + + if(has_bg){ + if(bg.x<-160)bg.x=0; + if(Registry.CURRENT_MAP_NAME=="BLANK"){ + if(Math.random()<0.1)FlxG.shake(0.002, 0.1); + if(Math.random()<0.01)darkness.alpha=0.2; + darkness.alpha -=0.05; + } + if(Registry.CURRENT_MAP_NAME=="GO"){ + if(bg.y>20){ + bg.y=-140; + } + } + + if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + if(bg.y>20){ + bg.y=-140; + } + } + } + + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + checkEvents(); + doCollisions(); + super.update(); + Registry.E_Dialogue_Just_Finished=false; + } + + + + private function checkEvents():Void { + if(Registry.EVENT_OPEN_BROOM){ + //Registry.sound_data.start_song_from_title("STREET_2"); + Registry.EVENT_OPEN_BROOM=false; + } + + if(Registry.EVENT_OSCILLATE_DARKNESS_ALPHA){ + if(darkness_timer>0){ + EventScripts.send_alpha_to(darkness, 0, -0.003); + } else { + EventScripts.send_alpha_to(darkness, 1, 0.003); + if(darkness_timer<-3)darkness_timer=3; + } + } + + + if(Registry.EVENT_EXTEND_HEALTH){ + + HealthBar.upgrade_health(player); + //Add blocking event functionality here if you want... + Registry.EVENT_EXTEND_HEALTH=false; + } + + if(Registry.EVENT_CHANGE_VOLUME_SCALE){ + if(EventScripts.send_property_to(Registry, "volume_scale", Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET, 0.01)) + Registry.EVENT_CHANGE_VOLUME_SCALE=false; + } + + /* If this is thrown, reset the current cutscene(if it exists), + * then initialize the next cutscene's views/objects etc + * */ + if(Registry.E_Load_Cutscene){ + state=S_CUTSCENE; + Registry.E_Load_Cutscene=false; + cutscene=new Cutscene(this); + cutscene.push(this as FlxState); + + } + + + } + + /** These obviously aren't really collisions but updating state and checking fo shit */ + private function doCollisions():Void { + + FlxG.collide(curMapBuf, player); + FlxG.collide(map_bg_2, player); + if(fg_solid){ + FlxG.collide(map_fg, player); + } + + } + + + /** Functions associated with NORMAL STATE **/ + private function stateNormal():Void { + checkForTransition(); + + /* Only pause or enter controls if we're not in the middle of a transition */ + if(pause_timer<0 &&(Registry.keywatch.JUST_PRESSED_PAUSE || FlxG.keys.justPressed("ESCAPE"))&& state !=S_TRANSITION){ + + pause_timer=0.2; + if(FlxG.keys.justPressed("ESCAPE")&& Registry.disable_menu==false){ + if(false==in_death_room){ + state=S_DIRECT_CONTROLS; + pause_state.controls_state.change_text(); + pause_state.controls_state.push(this); + } + } else if(Registry.disable_menu==false){ + state=S_PAUSED; + pause_state.current_substate_visible=false; + add(pause_state); + //pause_state.push(this); + Registry.sound_data.play_sound_group(Registry.sound_data.pause_sound_group); + //pause_state.set_inventory_icons(pause_state.inventory_icon_array); + pause_timer=0.2; + } + } else { + pause_timer -=FlxG.elapsed; + } + + /* Check for player death */ + if(player.health_bar.cur_health<=0){ + player.play("die"); + player.ANIM_STATE=player.ANIM_DEAD; + player.alive=false; + //player.unraftify_safely(); + var pt:FlxPoint=player.getScreenXY(); + player.scrollFactor.x=player.scrollFactor.y=0; + player.x=pt.x; + player.y=pt.y; + Registry.sound_data.stop_current_song(); + player.velocity.x=player.velocity.y=0; + player.framePixels_y_push=0; + + remove(player, true); + add(player); + state=S_PLAYER_DIED; + } + + + if(dialogue_latency>0){ + dialogue_latency -=FlxG.elapsed; + } + if(load_dialogue){ + load_dialogue=false; + if(dialogue_latency<0){ //only load dialogue if latency over + state=S_DIALOGUE; + player.dontMove=true; + player.state=player.S_INTERACT; + dialogue_state.push(this as FlxState); + + } + } + + } + + /*Check for a transition. + * If we need to transition, "bump" the player to the next part, change the grid + * coordinates, and switch state to S_TRANSITION, where camera movement/sprite spawning/map buffering + * will be taken care of. */ + private function checkForTransition():Void { + if(player.xlowerBorder - 12){ + state=S_TRANSITION;player.gridY++;Registry.CURRENT_GRID_Y++; + player.y=lowerBorder; + } else if(player.x>rightBorder - 12){ + state=S_TRANSITION;player.gridX++;Registry.CURRENT_GRID_X++; + player.x=rightBorder; + } else { + + } + + //debugText.text +=" ub:" + upperBorder.toString()+ "leb:" + leftBorder.toString()+ "\n camx:" + FlxG.camera.bounds.x.toString()+ "camy:" + FlxG.camera.bounds.y.toString()+ + //"\n x:" + player.x.toFixed(2)+ " y:" + player.y.toFixed(2); + + if(state==S_TRANSITION){ + player.grid_entrance_x=player.x; + player.grid_entrance_y=player.y; + justTransitioned=true; + player.dontMove=true; + } + } + + /* Move the camera's active viewport during a screen transition. */ + private function updateCamera():Int { + + if(FlxG.camera.bounds.xupperBorder - Registry.HEADER_HEIGHT){ + FlxG.camera.bounds.y -=Scroll_Increment;return 1; + } else if(FlxG.camera.bounds.x>leftBorder){ + FlxG.camera.bounds.x -=Scroll_Increment;return 1; + } else { + FlxG.worldBounds.copyFrom(FlxG.camera.bounds);return 0; + } + } + + /** Functions associated with TRANSITION STATE **/ + /** + * Reset count of enemies killed and puzzles done on grid. + * Save the state of any stateful objects. Reset the state of stateless objects. + * Move the camera to the next screen, making sure to keep the draw order correct + * scanlines>player assets>everything else + * Load in the new sprites. + */ + private function stateTransition():Void { + player.invincible=true; + if(justTransitioned){ + Registry.destroy_destroyems();// Try not to put stuff in here + // Keep in mind you have to manually remove things you add to sortables, since sortables + // is stupidly a mix of things added through spritefactory, and inside of separate classes + Registry.GRID_ENEMIES_DEAD=0; + Registry.GRID_PUZZLES_DONE=0; + updateScreenBorders(); + clearOthers();//Move the fg/bg/sortables Into the oldOthers array. + fillMapBuffers(false); + clearStateless(); + Registry.reset_subgroups(); + loadStatelessSprites(); + clearStateful();// Update the XML as necessary + loadStatefulSprites(); + for(id in 0...otherObjects.length){ + sortables.add(otherObjects[id]); + } + //trace("Added ", id, " other objects to grid from XML"); + player.cleanup_on_grid_transition(); + fade_songs_screen_change(); + justTransitioned=false; + } + if(!updateCamera()){ // The order of these calls is very important. + player.invincible=false; + deleteOtherObjects();// Stop everything in oldOthers from drawing, and call destroy on them. + deletePrevStateless(); + deletePrevStateful(); + mm_map.switch_rooms(Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + player.broom.visible=false; + player.broom.frame=9; + player.broom._curAnim=null; + player.transformer.reset_next(); + player.dontMove=false;// Give player control + // update the minimap + pause_state.minimap.update_visited_array(Registry.CURRENT_MAP_NAME, Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y); + state=S_NORMAL; + } + } + + private function fade_songs_screen_change():Void { + switch(Registry.CURRENT_MAP_NAME){ + case "HAPPY": + var x:Int=Registry.CURRENT_GRID_X; + var y:Int=Registry.CURRENT_GRID_Y; + var b:Bool=Registry.E_FADE_AND_SWITCH; + if(x==2 && y==2 &&(b || Registry.sound_data.current_song_name=="HAPPY") + + ){ + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="HAPPYINIT"; + } else if(x==1 && y==2 &&(b || Registry.sound_data.current_song_name=="HAPPYINIT")&& Registry.GE_States[Registry.GE_Happy_Started]){ + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="HAPPY"; + } else if(x==4 && y==2 &&(b || Registry.sound_data.current_song_name=="HAPPY")){ + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="HAPPYINIT"; + } else if(x==4 && y==1 &&(b || Registry.sound_data.current_song_name=="HAPPYINIT")&& Registry.GE_States[Registry.GE_Happy_Started]){ + Registry.E_FADE_AND_SWITCH=true; + Registry.E_FADE_AND_SWITCH_SONG="HAPPY"; + } + break; + default: + } + } + /** Various functions with map drawing **/ + + private function fillMapBuffers(isInit:Bool):Void { + /* Entity map array - enemies, switches, locked doors, doors, etc. When drawing through this, everything will have an ID: + * 0 - no state - everything resets upon leaving/re-entering, or no state at all - Doors. + * 1 - partial state - should be stored to the local area array upon first entry, or checked to reload. stores + * things like position, alive/dead, on/off. resets upon area entry/re-entry + * 2 - global state - things like events, bosses, treasure boxes, NPCs. These should be serialized Into a save file + * upon saving, and stored in memory throughput a play session. These will need to be imported with XML and proper + * IDs. When entering a room, always check to see if we need to load from the global state rather than what's stored + * on the map/xml data struct or whatever. */ + + var nextMapData:Array=get_submap_from_map(player.gridX, player.gridY, true); + var prevMapData:Array=get_submap_from_map(curMapBuf.x / 160,(curMapBuf.y - Registry.HEADER_HEIGHT)/ 160, false); + if(isInit){ + curMapBuf.loadMap(FlxTilemap.arrayToCSV(nextMapData, Registry.SCREEN_WIDTH_IN_TILES), TileData.Tiles, 16, 16); + prevMapBuf.loadMap(FlxTilemap.arrayToCSV(nextMapData, Registry.SCREEN_WIDTH_IN_TILES), TileData.Tiles, 16, 16); + curMapBuf.x=player.gridX * Registry.SCREEN_WIDTH_IN_PIXELS; + curMapBuf.y=player.gridY * Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT; + prevMapBuf.y=curMapBuf.y; + + } else { + prevMapBuf.loadMap(FlxTilemap.arrayToCSV(prevMapData, Registry.SCREEN_WIDTH_IN_TILES), TileData.Tiles, 16, 16); + prevMapBuf.x=curMapBuf.x; + prevMapBuf.y=curMapBuf.y; + curMapBuf.loadMap(FlxTilemap.arrayToCSV(nextMapData, Registry.SCREEN_WIDTH_IN_TILES), TileData.Tiles, 16, 16); + curMapBuf.x=player.gridX * Registry.SCREEN_WIDTH_IN_PIXELS; + curMapBuf.y=player.gridY * Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT; + } + nextMapData=null; + prevMapData=null; + + //Set static tile properties + TileData.set_tile_properties(curMapBuf); + } + + public function ext_make_anims():Void { + get_submap_from_map(Registry.CURRENT_GRID_X, Registry.CURRENT_GRID_Y, true); + } + private function get_submap_from_map(gridX:Int, gridY:Int,make_anims:Bool):Array { + var submap:Array=new Array(); + var gridTileOffsetX:Int=gridX * Registry.SCREEN_WIDTH_IN_TILES + var gridTileOffsetY:Int=gridY * Registry.SCREEN_HEIGHT_IN_TILES; + var tileType:Int; + + var i:Int;var j:Int; + for(j=0;j0){ + o=oldStateless.pop(); + //trace(o); + sortables.remove(o, true); + if(o !=null)o.destroy(); + o=null; + nrKilled++; + } + } + + private function clearStateless():Void { + while(statelesses.length>0){ + oldStateless.push(statelesses.pop()); + } + stateless_gridXML=null; + } + + /** + * Load some sprites that generally have serialized state and + * place them Into statefuls::Array . Then, add them to sortables::FlxGroup . + */ + private function loadStatefulSprites():Void { + var grid:XML; + if(stateful_mapXML==null)return; + for(grid in stateful_mapXML.grid){ + if(grid.@grid_x==player.gridX.toString()&& grid.@grid_y==player.gridY.toString()){ + stateful_gridXML=grid;break; + } + } + if(stateful_gridXML==null)return;//No stateful sprites on this grid + var id:Int;//Stateful objects will have IDs set to index Into the XML + var nrStatefuls:Int=0; + for(id=0;id0){ + o=statefuls.pop(); + if(o !=null){ + oldObjects.push(o); + } + } + stateful_gridXML=null; + } + + /** + * Call destroy on all objects in oldObjects::Array and also removes them + * from sortables::FlxGroup . + */ + private function deletePrevStateful():Void { + var o:FlxBasic; + var nr:Int; + while(oldObjects.length>0){ + o=oldObjects.pop()as FlxBasic; + if(o !=null){ + nr++; + sortables.remove(o, true); + o.destroy(); + } + } + } + + /** + * Push some objects Into the bag to be deleted later + */ + private function clearOthers():Void { + while(otherObjects.length>0){ + oldOthers.push(otherObjects.pop()); + } + var o:Dynamic; + for(o in bg_sprites.members){ + oldOthers.push(o); + } + + for(o in fg_sprites.members){ + oldOthers.push(o); + } + + for(o in Intra_bg_bg2_sprites.members){ + //foot overlay in windmill goes here don't EVER fckign remov it fuck + if(o !=player.foot_overlay_bg_bg2){ + oldOthers.push(o); + } + } + for(o in anim_tiles_group.members){ + if(o !=null)oldOthers.push(o); + } + } + private function deleteOtherObjects():Void { + //trace("Removing ", oldOthers.length, " other objects"); + var o:Dynamic; + while(oldOthers.length>0){ + o=oldOthers.pop(); + if(o==null)continue; + sortables.remove(o, true); + bg_sprites.remove(o, true);//lol + fg_sprites.remove(o, true); + intra_bg_bg2_sprites.remove(o, true); + anim_tiles_group.remove(o, true); + o.destroy(); + } + } + /* Revive sprites with permanence level 1(MAP_LOCAL)when leaving a map */ + private function reviveGridLocalSprites():Void { + var grid:XML; + var id:Int; + if(stateful_mapXML !=null){ + for(grid in stateful_mapXML.grid){ + for(id=0;id0){ + dec_over.x -=dec_over.width / 2; + } + if(dec_over.y>Registry.HEADER_HEIGHT){ + dec_over.y -=dec_over.height / 2; + } else if(dec_over.y<-dec_over.height / 2 + Registry.HEADER_HEIGHT){ + dec_over.y +=dec_over.height / 2; + } + } + + } + + /** + * Called if the game is in Test_mode. + * Currently just lets you warp around the dungeons + */ + private function ugly_test_mode_functions():Void + { + if(FlxG.keys.D){ + if(FlxG.keys.justPressed("ONE")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="BEDROOM"; + Registry.inventory[Registry.IDX_JUMP]=false; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 6); + header_group.add(player.health_bar); + + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["BEDROOM"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["BEDROOM"].y; + } else if(FlxG.keys.justPressed("TWO")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="REDCAVE"; + Registry.inventory[Registry.IDX_JUMP]=false; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["REDCAVE"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["REDCAVE"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 7); + header_group.add(player.health_bar); + }else if(FlxG.keys.justPressed("THREE")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="CROWD"; + Registry.inventory[Registry.IDX_JUMP]=false; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["CROWD"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["CROWD"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 7); + header_group.add(player.health_bar); + }else if(FlxG.keys.justPressed("FOUR")){ + SWITCH_MAPS=true; + player.health_bar=new HealthBar(155, 2, 9); + Registry.NEXT_MAP_NAME="APARTMENT"; + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["APARTMENT"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["APARTMENT"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 9); + header_group.add(player.health_bar); + }else if(FlxG.keys.justPressed("FIVE")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="HOTEL"; + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["HOTEL"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["HOTEL"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 9); + header_group.add(player.health_bar); + }else if(FlxG.keys.justPressed("SIX")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="CIRCUS"; + Registry.inventory[Registry.IDX_JUMP]=true; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["CIRCUS"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["CIRCUS"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 9); + header_group.add(player.health_bar); + } else if(FlxG.keys.justPressed("SEVEN")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="STREET"; + Registry.inventory[Registry.IDX_BROOM]=false; + Registry.inventory[Registry.IDX_JUMP]=false; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["STREET"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["STREET"].y; + header_group.remove(player.health_bar, true); + player.health_bar=new HealthBar(155, 2, 6); + header_group.add(player.health_bar); + } else if(FlxG.keys.justPressed("EIGHT")){ + SWITCH_MAPS=true; + Registry.NEXT_MAP_NAME="DEBUG"; + Registry.ENTRANCE_PLAYER_X=10; + Registry.ENTRANCE_PLAYER_Y=10; + } + + Registry.inventory[Registry.IDX_BROOM]=true; + Registry.bound_item_1="BROOM"; + Registry.inventory[Registry.IDX_WIDEN]=true; + Registry.inventory[Registry.IDX_LENGTHEN]=true; + + if(Registry.inventory[Registry.IDX_JUMP]){ + Registry.bound_item_2="JUMP"; + } else { + Registry.bound_item_2=""; + } + } + } + + private function reset_dialogue_state_on_finish():Void + { + player.dontMove=false; + player.state=player.S_GROUND; + state=S_NORMAL; + dialogue_latency=0.3; + + + dialogue_state.reset(); + Registry.E_Dialogue_Just_Finished=true; + dialogue_state.pop(this as FlxState); + } + + private function set_bg():Void + { + has_bg=true; + bg.visible=true; + bg.scrollFactor=noScrollPt; + bg.velocity.x=bg.velocity.y=0; + bg.x=0; + bg.y=0; + if(Registry.CURRENT_MAP_NAME=="BLANK"){ + bg.loadGraphic(BLANK_BG, false, false, 320, 160); + bg.y=20; + bg.velocity.x=-20; + } else if(Registry.CURRENT_MAP_NAME=="SPACE"){ + bg.loadGraphic(Common_Sprites.space_bg, false, false, 320, 160); + bg.y=Registry.HEADER_HEIGHT; + bg.velocity.x=-15; + } else if(Registry.CURRENT_MAP_NAME=="GO"){ + bg.loadGraphic(Common_Sprites.briar_Bg, false, false, 160,320); + bg.y=Registry.HEADER_HEIGHT; + bg.velocity.y=15; + } else if(Registry.CURRENT_MAP_NAME=="NEXUS"){ + bg.loadGraphic(Common_Sprites.nexus_bg, false, false, 160, 320); + bg.y=Registry.HEADER_HEIGHT - 160; + bg.velocity.y=15; + bg.velocity.x=0; + } else { + has_bg=false; + bg.visible=false; + } + + } + + private function set_before_fg():Void + { + before_fg_overlay.visible=true; + before_fg_overlay.scrollFactor.x=before_fg_overlay.scrollFactor.y=0; + before_fg_overlay.y=20; + if(Registry.CURRENT_MAP_NAME=="FOREST"){ + before_fg_overlay.loadGraphic(Common_Sprites.forest_blend, false, false, 160, 160); + before_fg_overlay.blend="overlay"; + } else if(Registry.CURRENT_MAP_NAME=="HOTEL" && Registry.E_PLAY_ROOF){ + before_fg_overlay.loadGraphic(Common_Sprites.roof_blend, false, false, 160, 160); + before_fg_overlay.blend="hardlight"; + } else if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + before_fg_overlay.loadGraphic(Common_Sprites.suburbs_Blend, false, false, 160, 160); + before_fg_overlay.blend="overlay"; + } else { + before_fg_overlay.visible=false; + } + + } + + + public function stateCutscene():Void { + cutscene.update(); + keyWatch.update(); + if(cutscene.state==cutscene.s_done){ + cutscene.pop(this as FlxState); + cutscene.destroy(); + cutscene=null; + state=S_NORMAL; + } + } + + private var arrow:FlxSprite; + private var arrow_state:Int=0; + public var in_death_room:Bool=false; + + public function state_player_died():Void { + Registry.keywatch.update(); + + + + EventScripts.send_property_to(player, "x", 80, 0.5); + EventScripts.send_property_to(player, "y", 100, 0.5); + // Play the death noise(hit ground)and then show the death text. + // Also make the arrow show up. + if(player.frame==player.DEATH_FRAME && !played_death_sound){ + played_death_sound=true; + Registry.sound_data.player_hit_1.play(); + Registry.sound_data.GameOver.play(); + death_text.visible=true; + death_text.alpha=1; + death_text.setText("Continue?\n" + "Yes\nNo..", true, 0, 0, "center", true); + + if(arrow==null){ + arrow=new FlxSprite; + arrow.scrollFactor.x=arrow.scrollFactor.y=0; + arrow.loadGraphic(PauseState.arrows_sprite, true, false, 7, 7); + arrow.addAnimation("flash", [2, 3], 8); + add(arrow); + } + arrow.x=death_text.x + 4; + arrow.y=death_text.y + 8; + arrow.play("flash"); + arrow.visible=true; + remove(arrow, true); + add(arrow); + } + + death_fadein.visible=true; + if(death_fadein.alpha<1)death_fadein.alpha +=0.03; + if(death_fadein.alpha>0.7){ + death_text.visible=true; + + } + + if(arrow !=null){ + if(arrow.visible==true){ + if(arrow_state==0){ + if(Registry.keywatch.JP_DOWN){ + arrow_state=1; + arrow.y +=8; + } + } else { + if(Registry.keywatch.JP_UP){ + arrow_state=0; + arrow.y -=8; + } + } + } + } + + if(start_death_fade_out ||(played_death_sound && Registry.keywatch.JP_ACTION_1 && death_text.visible)){ + + start_death_fade_out=true; + black_overlay.alpha +=0.02; + player.alpha -=0.02; + death_text.alpha -=0.02; + if(black_overlay.alpha==1){ + Registry.sound_data.GameOver.stop(); + Registry.sound_data.GameOver=null; + Registry.sound_data.GameOver=new FlxSound(); + Registry.sound_data.GameOver.loadEmbedded(SoundData.GameOver_Song, false); + Registry.ENTRANCE_PLAYER_X=Registry.checkpoint.x; + Registry.ENTRANCE_PLAYER_Y=Registry.checkpoint.y; + Registry.CURRENT_MAP_NAME=Registry.checkpoint.area; + // When we die we want to make sure the song restarts + dont_change_songs=false; + Registry.E_OVERRIDE_SAME_MAP_SONG=true; + Registry.death_count++; + Registry.BOI=false; + Registry.CUR_HEALTH=Registry.MAX_HEALTH; + player.health_bar.modify_health(Registry.MAX_HEALTH); + if(arrow_state==1){ + Registry.CURRENT_MAP_NAME=Registry.NEXT_MAP_NAME="DRAWER"; + Registry.ENTRANCE_PLAYER_X=368; + Registry.ENTRANCE_PLAYER_Y=224 + 20; + player.start_in_slump=true; + in_death_room=true; + } else { + Registry.NEXT_MAP_NAME=Registry.checkpoint.area; + trace("(death)Loading checkpoint:", Registry.checkpoint.area, Registry.checkpoint.x, Registry.checkpoint.y); + } + header.scrollFactor=noScrollPt; + SWITCH_MAPS=true; + DH.enable_menu(); + remove(player, true); + remove(arrow, true); + arrow.visible=false; + } + + } + + } + /* + * last things before leaving the map(transitions, changing global map name) + * */ + public function transition_out():Void { + /* Mark all sprites to be cleaned up, reset any events set, + * reset grid state, determine beginning state of the transition */ + if(!cleaned_up_before_exit){ + cleaned_up_before_exit=true; + Registry.destroy_destroyems(); + reviveGridLocalSprites(); + clearOthers(); + clearStateful(); + clearStateless(); + Registry.reset_events(); + Registry.GRID_ENEMIES_DEAD=0; + Registry.GRID_PUZZLES_DONE=0; + + //trace(Registry.E_OVERRIDE_SAME_MAP_SONG, Registry.CURRENT_MAP_NAME, Registry.NEXT_MAP_NAME); + if(Registry.E_OVERRIDE_SAME_MAP_SONG || Registry.CURRENT_MAP_NAME !=Registry.NEXT_MAP_NAME){ + Registry.pillar_switch_state=false; + Registry.E_OVERRIDE_SAME_MAP_SONG=false; + } else { + dont_change_songs=true; + } + + if(Registry.E_Enter_Whirlpool_Down){ + + } else { + Registry.EVENT_FADE_BEGUN=true; + } + + if(Registry.FUCK_IT_MODE_ON){ + Registry.EVENT_FADE_OVER=true; + Registry.EVENT_FADE_BEGUN=false; + black_overlay.alpha=1; + } + } + /* Fade out the song and other sounds playing */ + + if(!dont_change_songs){ + Registry.sound_data.current_song.volume -=0.03; + if(Registry.sound_data.current_song.playing && Registry.sound_data.current_song.volume<0.05){ + Registry.sound_data.stop_current_song(); + } + + if(Registry.CURRENT_MAP_NAME=="BEACH"){ + Registry.sound_data.waves.stop(); + } else if(Registry.CURRENT_MAP_NAME=="WINDMILL"){ + Registry.sound_data.rain.stop(); + } + } + + /* Do door-specific stuff here(events, etc)*/ + if(Registry.CURRENT_MAP_NAME=="BLANK"){ + black_overlay.alpha +=0.01; + } else if(Registry.E_Enter_Whirlpool_Down){ + + super.update(); + player.play('whirl'); + if(player.framePixels_y_push !=15){ + player.framePixels_y_push++; + } + if(player.framePixels_y_push>=15){ + black_overlay.alpha +=0.015; + Registry.EVENT_FADE_BEGUN=true; + } + } else { + black_overlay.alpha +=0.02; + } + + /* Actually make the transition when the overlay is completely + * opaque and the downsampling is done */ + if(black_overlay.alpha>=0.99 && + (dont_change_songs || !Registry.sound_data.current_song.playing)&& + Registry.EVENT_FADE_OVER){ + + DH.reset_scenes_on_map_change(); + Registry.EVENT_FADE_OVER=Registry.EVENT_FADE_BEGUN=false; + + Registry.CURRENT_MAP_NAME=Registry.NEXT_MAP_NAME; + + Registry.set_is_playstate(Registry.CURRENT_MAP_NAME); + deleteOtherObjects(); + deletePrevStateful(); + deletePrevStateless(); + Registry.cleanup_on_map_change(); + create(); + } + } + + public function set_darkness(map:String):Void { + + var color:Int; + darkness.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS, 0xff000000); + darkness.blend="overlay"; + darkness.visible=true; + darkness.alpha=1; + darkness.y=20; + if(map=="DRAWER"){ + darkness.blend="multiply"; + if(in_death_room==false){ + darkness.alpha=1; + } else { + darkness.alpha=0.8; + } + } else if(map=="HAPPY"){ + darkness.loadGraphic(Common_Sprites.happy_blend, true, false, 160, 160); + darkness.blend="hardlight"; + if(Registry.GE_States[Registry.GE_Happy_Started]){ + darkness.alpha=1.0; + } else { + darkness.visible=false; + darkness.alpha=0; + } + // or "screen" or "lighten" etc + } else if(map=="REDSEA"){ + darkness.loadGraphic(Common_Sprites.redsea_blend, true, false, 160, 160); + darkness.blend="hardlight"; + } else if(map=="GO"){ + darkness.loadGraphic(Common_Sprites.go_blend, true, false, 160, 160); + darkness.blend="hardlight"; + } else if(map=="CLIFF"){ + darkness.loadGraphic(Common_Sprites.cliff_blend, false, false, 160, 160); + } else if(map=="APARTMENT"){ + darkness.loadGraphic(Common_Sprites.apartment_Blend, false, false, 160, 160); + } else if(map=="SPACE"){ + darkness.loadGraphic(Common_Sprites.space_blend, false, false, 160, 160); + } else if(map=="BEACH"){ + darkness.loadGraphic(Common_Sprites.beach_blend, false, false, 160, 160); + darkness.blend="hardlight"; + } else if(map=="HOTEL"){ + darkness.loadGraphic(Common_Sprites.hotel_blend, false, false, 160, 160); + } else if(map=="BLUE"){ + darkness.loadGraphic(Common_Sprites.blue_blend, false, false, 160, 160); + } else if(map=="CROWD"){ + darkness.loadGraphic(Common_Sprites.crowd_blend, false, false, 160, 160); + } else if(map=="GO"){ + darkness.loadGraphic(Common_Sprites.go_blend, false, false, 160, 160); + darkness.blend="hardlight"; + } else if(map=="REDCAVE"){ + darkness.loadGraphic(Common_Sprites.redcave_blend, false, false, 160, 160); + } else if(map=="WINDMILL"){ + darkness.loadGraphic(Common_Sprites.windmill2_Blend, false, false, 160, 160); + } else if(map=="NEXUS"){ + darkness.loadGraphic(Common_Sprites.nexus_Blend, false, false, 160, 160); + } else if(map=="TERMINAL"){ + darkness.loadGraphic(Common_Sprites.terminal_blend, false, false, 160, 160); + } else { + darkness.alpha=0; + //darkness.visible=false; + darkness.blend="multiply"; + } + + if(Registry.E_NEXT_MAP_DARKNESS_8==true){ + Registry.E_NEXT_MAP_DARKNESS_8=false; + darkness.alpha=0.91; + } + + + darkness.scrollFactor=noScrollPt; + + } + + override public function destroy():Void { + + if(!Registry.E_DESTROY_PLAYSTATE){ + trace("Not destryoing playstate"); + return; + } + trace("destroying playstate"); + Registry.E_DESTROY_PLAYSTATE=false; + + remove(Registry.keywatch, true); + + for(i in 0...members.length){ + if(members[i] !=null)members[i]=null; + } + mapData=null; + if(!dont_change_songs){ + Registry.sound_data.current_song=null; + + } + /* Need to null all of the non-added references and destroy their children*/ + statelesses=null; + statefuls=null; + pause_state.destroy(); + pause_state=null; + if(cutscene !=null){ + cutscene.destroy(); + cutscene=null; + } + dialogue_state.destroy(); + dialogue_state=null; + oldObjects=otherObjects=oldOthers=oldStateless=null; + downsample_fade.destroy(); + upsample_fade.destroy(); + upsample_fade=downsample_fade=null; + noScrollPt=null; + dec_over=null; + before_fg_overlay=null; + number_of_keys_text=null; + + FlxG.clearBitmapCache(); + + super.destroy(); + } + + public static var GFX_DISCO:Int=0; + private static var GFX_DISCO_ON:Bool=false; + private static var GFX_DISCO_CTR:Int=0; + private static var GFX_DISCO_A:Int=0; + + public static var GFX_STATIC_ALWAYS_ON:Bool=false; + private static var GFX_STATIC_ON:Bool=false; + public static var GFX_STATIC:Int=1; + + private static var GFX_GLITCH_ALWAYS_ON:Bool=false; + + public static function turn_on_effect(effect:Int):Void { + switch(effect){ + case GFX_DISCO: + GFX_DISCO_ON=true; + break; + case GFX_STATIC: + GFX_STATIC_ON=true; + break; + } + } + + // For static shader + //private static var shades:Array=new Array(0x000000, 0x202020, 0x404040, 0x606060, 0x808080, 0xa0a0a0, 0xc0c0c0, 0xe0e0e0, 0xffffff); + private static var shades:Array=new Array(); + + private static var lookup:Array=new Array(); + private static var lookup_init:Bool=false; + private static var lookup1:Array=new Array(); + private static var lookup3:Array=new Array(); + private static var lookup5:Array=new Array(); + private static var lookup7:Array=new Array(); + private static var lookup_qe:Array=new Array(); + private static var poop:Int=0; + private static var lookupa:Array; + private static var nr_shades:Int=25; + private static var bm:BitmapData=new BitmapData(160, 180, true); + + + // For glitch shader + + private static var glitch_min:Point=new Point(16, 16);// Min w, h of a part + private static var glitch_max:Point=new Point(32, 32); // max + private static var glitch_r:Rectangle=new Rectangle; + private static var glitch_dest:Point=new Point; + private static var glitch_iters:Int=50;// How many transformations should happen. + private static var glitch_f:Float=0;// frame counter, +1 per draw call + private static var glitch_fm:Float=1;// glitch_f decremented by this when greater + private static var glitch_rf:Float=0;// + private static var glitch_rfm:Float=10;// How often the glitched things change + private static var glitch_data:Array=new Array(new Array(glitch_iters), new Array(glitch_iters), new Array(glitch_iters), new Array(glitch_iters), new Array(glitch_iters), new Array(glitch_iters));// x, y, w, h + + + private var redo_darknes:Bool=false; + private var do_dark_fill:Bool=false; + + private function set_do_dark_fill(map:String):Void { + if(Registry.CURRENT_MAP_NAME !="BLANK" && Registry.CURRENT_MAP_NAME !="OVERWORLD" && Registry.CURRENT_MAP_NAME !="FIELDS" && Registry.CURRENT_MAP_NAME !="TRAIN" && Registry.CURRENT_MAP_NAME !="BEDROOM" && Registry.CURRENT_MAP_NAME !="SUBURB" && Registry.CURRENT_MAP_NAME !="DRAWER" && Registry.CURRENT_MAP_NAME !="CIRCUS"){ + do_dark_fill=false; + } else { + if(Registry.CURRENT_MAP_NAME=="CIRCUS"){ + darkness.alpha=0; + } + do_dark_fill=true; + } + } + override public function draw():Void { + + + if(false==do_dark_fill){ + if(redo_darknes){ + redo_darknes=false; + + set_darkness(Registry.CURRENT_MAP_NAME); + } + } else { + darkness.fill(0xff000000); + redo_darknes=true; + } + + + + /* Sort by y value */ + sortables.sort("y_bottom", ASCENDING); + + super.draw(); + + if(true==GFX_DISCO_ON){ + GFX_DISCO_CTR +=1; + if(GFX_DISCO_CTR>14){ + GFX_DISCO_CTR=0; + GFX_DISCO_A=Std.int(8 * Math.random()); + } + + FlxG.camera.buffer.lock(); + for(i in 0...180){ + for(j in 0...160){ + //FlxG.camera.buffer.setPixel32(j, i, FlxG.camera.buffer.getPixel32(j, i)/ GFX_DISCO_A); + } + } + FlxG.camera.buffer.unlock(); + GFX_DISCO_ON=false; + } + + //state for static effect + + if(!lookup_init){ + //FlxG.camera.getContainerSprite().filters=[static_shaderFilter]; + lookup_init=true; + var d:Int=0; + for(i=0;i>16); + } + } + + if(Registry.CURRENT_GRID_X>=map.widthInTiles / 10 || Registry.CURRENT_GRID_X<0 || Registry.CURRENT_GRID_Y<0 || Registry.CURRENT_GRID_Y>=map.heightInTiles / 10){ + GFX_GLITCH_ALWAYS_ON=true; + } else { + GFX_GLITCH_ALWAYS_ON=false; + } + if(GFX_GLITCH_ALWAYS_ON){ + glitch_rf +=1; + FlxG.camera.buffer.lock(); + for(i=0;i=glitch_rfm){ + glitch_data[2][i]=Math.max(glitch_min.x, Std.int(Math.random()* glitch_max.x)); + glitch_data[3][i]=Math.max(glitch_min.y, Std.int(Math.random()* glitch_max.y)); + glitch_data[0][i]=Std.int(160 * Math.random()); + glitch_data[1][i]=Std.int(180 * Math.random()); + glitch_data[4][i]=Std.int(160 * Math.random()); + glitch_data[5][i]=Std.int(180 * Math.random()); + } + glitch_r.width=glitch_data[2][i]; + glitch_r.height=glitch_data[3][i]; + glitch_r.x=glitch_data[0][i]; + glitch_r.y=glitch_data[1][i]; + glitch_dest.x=glitch_data[4][i]; + glitch_dest.y=glitch_data[5][i]; + FlxG.camera.buffer.copyPixels(FlxG.camera.buffer, glitch_r, glitch_dest); + } + if(glitch_rf>glitch_rfm){ + glitch_rf -=glitch_rfm; + } + FlxG.camera.buffer.unlock(); + + } + + + + + if(GFX_STATIC_ON || GFX_STATIC_ALWAYS_ON){ + + if(!Intra.is_mobile){ + FlxG.camera.buffer.applyFilter(FlxG.camera.buffer, FlxG.camera.buffer.rect, FlxG.camera.buffer.rect.topLeft, static_shaderFilter); + if(Registry.CURRENT_MAP_NAME=="SUBURB"){ + before_fg_overlay.draw(); + + } + } + /*var gray:Int=0; + var r:Int=0; + var g:Int=0; + var b:Int=0; + var qe:Int=0; + var old:Int=0; + + if(poop>15)poop=0; + if(poop==0){ + lookupa=lookup7; + } else if(poop==5){ + lookupa=lookup3; + } else if(poop==10){ + lookupa=lookup5; + } + poop +=1; + + // If it's mobile then the static effect is likely too slow, so just do grayscaling. + if(Intra.is_mobile){ + if(poop % 2==0){ + FlxG.camera.buffer.lock(); + for(i=0;i<180;i++){ // dont want out of bounds? + for(j=0;j<160;j++){ + old=FlxG.camera.buffer.getPixel(j, i); + r=(old & 0x00ff0000)>>16; + g=(old & 0x0000ff00)>>8; + b=(old & 0x000000ff); + gray=(r + g + b)/ 3; + FlxG.camera.buffer.setPixel(j, i, lookup[gray]); + } + } + FlxG.camera.buffer.unlock(); + bm.copyPixels(FlxG.camera.buffer, bm.rect, bm.rect.topLeft); + } else { + FlxG.camera.buffer.copyPixels(bm, bm.rect, bm.rect.topLeft); + } + } else { + if(poop % 3==0){ + FlxG.camera.buffer.lock(); + for(i=0;i<180;i++){ // dont want out of bounds? + for(j=0;j<160;j++){ + old=FlxG.camera.buffer.getPixel(j, i); + r=(old & 0x00ff0000)>>16; + g=(old & 0x0000ff00)>>8; + b=(old & 0x000000ff); + gray=(r + g + b)/ 3; + qe=lookup_qe[gray]; + FlxG.camera.buffer.setPixel(j, i, lookup[gray]); + old=FlxG.camera.buffer.getPixel(j, i+1); + FlxG.camera.buffer.setPixel(j , i + 1, old + lookupa[qe]); + } + } + FlxG.camera.buffer.unlock(); + bm.copyPixels(FlxG.camera.buffer, bm.rect, bm.rect.topLeft); + } else { + FlxG.camera.buffer.copyPixels(bm, bm.rect, bm.rect.topLeft); + } + } + if(state==S_DIALOGUE){ + dialogue_state.dialogue.draw(); + }*/ + } + GFX_STATIC_ON=false; + // End static effect + + if(Registry.EVENT_FADE_BEGUN && state==S_NORMAL){ + if(downsample_fade.do_effect()==ScreenFade.DONE){ + Registry.EVENT_FADE_OVER=true; + } + } else if(Registry.EVENT_FADE_BEGUN && state==S_JUST_ENTERED_MAP){ + if(upsample_fade.do_effect()==ScreenFade.DONE){ + Registry.EVENT_FADE_OVER=true; + + } + } + /** HOrizontal wavy effect **/ + if(Registry.GFX_WAVE_EFFECT_ON){ + if(last_time==0){ + last_time=getTimer(); + } + if(getTimer()- last_time>60){ + Registry.GFX_WAVE_EFFECT_ON=false; + last_time=0; + } else { + last_time=getTimer(); + } + Registry.GFX_WAVE_TABLE_INDEX=0; + Registry.GFX_WAVE_EFFECT_START=(Registry.GFX_WAVE_EFFECT_START + 3)% 180; + Registry.GFX_BUFFER.copyPixels(FlxG.camera.buffer, FlxG.camera.buffer.rect, FlxG.camera.buffer.rect.topLeft); + FlxG.camera.buffer.lock() + for(i=0;i<180;i++){ + for(j=0;j<160;j++){ + + FlxG.camera.buffer.setPixel32(j , Registry.GFX_WAVE_EFFECT_START, + Registry.GFX_BUFFER.getPixel32(Math.min(Math.max(j + Registry.GFX_WAVE_TABLE[Registry.GFX_WAVE_TABLE_INDEX],0),159), + + Registry.GFX_WAVE_EFFECT_START)); + } + Registry.GFX_WAVE_TABLE_ROLLOVER=(Registry.GFX_WAVE_TABLE_ROLLOVER + 1)% 15; + if(Registry.GFX_WAVE_TABLE_ROLLOVER==0){ + Registry.GFX_WAVE_TABLE_INDEX++; + if(Registry.GFX_WAVE_TABLE_INDEX + 1>Registry.GFX_WAVE_TABLE.length)Registry.GFX_WAVE_TABLE_INDEX=0; + } + Registry.GFX_WAVE_EFFECT_START=(Registry.GFX_WAVE_EFFECT_START + 1)% 180; + } + FlxG.camera.buffer.unlock(); + } + + } + + private var last_time:Int=0; +} \ No newline at end of file diff --git a/intra/source/states/PushableFlxState.hx b/intra/source/states/PushableFlxState.hx new file mode 100644 index 0000000..247c85a --- /dev/null +++ b/intra/source/states/PushableFlxState.hx @@ -0,0 +1,48 @@ +package states +{ +import org.flixel.FlxGroup; +import org.flixel.FlxState; + +/* A totally needless abstraction. oh well */ +class PushableFlxState extends FlxState +{ + public var parent:Dynamic; + override public function create():Void { + + } + + public function new(){ + + } + /** + * Pushes all of this state's ADDED OBJETS onto its parents draw group + * @param _parent The FlxState that is being drawn. + */ + public function push(_parent:FlxState):Void { + parent=_parent; + for(i in 0...members.length){ + if(members[i] !=null){ + _parent.add(members[i]); + } + } + } + /** + * Removes this state's ADDED OBJECTS from its parents draw group + * If you allocate memory that isn't added, don't forget to null it! + * @param FlxState The FlxState that is being drawn. + */ + public function pop(parent:FlxState):Void { + for(i in 0...members.length){ + if(members[i] !=null){ + parent.remove(members[i], true); + + } + } + } + + override public function destroy():Void { + super.destroy(); + parent=null; + } + +} \ No newline at end of file diff --git a/intra/source/states/RoamState.hx b/intra/source/states/RoamState.hx new file mode 100644 index 0000000..5310e04 --- /dev/null +++ b/intra/source/states/RoamState.hx @@ -0,0 +1,616 @@ +package states +{ +import data.CSV_Data; +import data.SoundData; +import data.TileData; +import entity.player.Foot_Overlay; +import entity.player.Player; +import global.*; +import helper.Cutscene; +import helper.DH; +import helper.EventScripts; +import helper.ScreenFade; +import helper.SpriteFactory; +import org.flixel.*; +import org.flixel.plugin.photonstorm.FlxBitmapFont; + + +class RoamState extends FlxState +{ + + + private var keywatch:Keys; + private var stateful_mapXML:XML; + private var stateless_mapXML:XML; + public var map:FlxTilemap; + public var map_bg_2:FlxTilemap=new FlxTilemap(); + public var map_fg:FlxTilemap=new FlxTilemap(); + public var curMapBuf:FlxTilemap;//probably deprecated + public var player:Player; + public var player_group:FlxGroup=new FlxGroup(); + public var entities:Array=new Array(); + public var anim_tiles_group:FlxGroup=new FlxGroup(); + public var statelesses:Array;//deprecated + public var sortables:FlxGroup=new FlxGroup(); + public var bg_sprites:FlxGroup=new FlxGroup(); + public var fg_sprites:FlxGroup=new FlxGroup();//stuff from ceiling + + + public var state:Int=5; + + public var S_EXITING:Int=-1; + public var SWITCH_MAPS:Bool=false; + private var cleaned_up_before_exit:Bool=false; + + public var S_NORMAL:Int=0; + public var S_TRANSITION:Int=1; + public var S_PAUSED:Int=2; + public var pause_state:PauseState=new PauseState(); + public var pause_timer:Float=0.2; + + + public var S_OPEN_TREASURE:Int=3; + public var S_PLAYER_DIED:Int=4; + private var death_fadein:FlxSprite; + private var death_text:FlxBitmapFont; + private var played_death_sound:Bool=false; + private var start_death_fade_out:Bool=false; + + public var S_JUST_ENTERED_MAP:Int=5; + public var S_DIRECT_CONTROLS:Int=6; + + + private var S_CUTSCENE:Int=7; + private var cutscene:Cutscene; + + public var S_DIALOGUE:Int=8; + public var load_dialogue:Bool=false; + public var dialogue_state:DialogueState=new DialogueState(); + public var dialogue_latency:Float=0.3; + + //header ccrap + //[Embed(source="../res/sprites/menu/autosave_icon.png")] public static var autosave_icon_embed:Class; + public var header_group:FlxGroup=new FlxGroup(); + public var header:FlxSprite=new FlxSprite(0, 0); + public var number_of_keys_text:FlxBitmapFont; + public var autosave_icon:FlxSprite; + + // graphical overlay stuff + public var darkness:FlxSprite=new FlxSprite(0, 0); + private var downsample_fade:ScreenFade; + private var upsample_fade:ScreenFade; + private var black_overlay:FlxSprite=new FlxSprite(0, 0); + + // misc + public var noScrollPt:FlxPoint=new FlxPoint(0, 0); + + public function new(){ + + } + + override public function create():Void + { + trace("Creating roamstate"); + + // Add the keywatch + if(Registry.keywatch==null){ + Registry.keywatch=new Keys(); + } + + keywatch=Registry.keywatch; + Registry.GAMESTATE=this; + + // Load the background if needed. + + //Determine the proper CSV and tileset to use. + //Load a tilemap and add it. + var csv:String=CSV_Data.getMap(Registry.CURRENT_MAP_NAME); + map=new FlxTilemap(); + TileData.setTileset(Registry.CURRENT_MAP_NAME) + map.loadMap(csv, TileData.Tiles, 16, 16); + map.y +=Registry.HEADER_HEIGHT; + TileData.set_tile_properties(map); + make_anim_tiles(map, anim_tiles_group); + add(map); + + map_bg_2.loadMap(CSV_Data.getMap(Registry.CURRENT_MAP_NAME, 2), TileData.Tiles, 16, 16); + map_bg_2.y +=Registry.HEADER_HEIGHT; + TileData.set_tile_properties(map_bg_2); + + map_fg.loadMap(CSV_Data.getMap(Registry.CURRENT_MAP_NAME, 3), TileData.Tiles, 16, 16) + map_fg.y +=Registry.HEADER_HEIGHT; + + // Make darkness + darkness=new FlxSprite(0, Registry.HEADER_HEIGHT); + darkness.scrollFactor=noScrollPt; + set_darkness(darkness); + + + // Find the entrance and make the player there. Done before + // sprite init because sprites use the player ref. + player=new Player(0, 0, keywatch, darkness, this); + player.foot_overlay=new Foot_Overlay(player); + player.foot_overlay.map=map; + player.x=Registry.ENTRANCE_PLAYER_X; + player.y=Registry.ENTRANCE_PLAYER_Y; + + //Grab the relevant chunk of XML. + initXML(); + //Instantiate and add all sprites to sortables here. + + Registry.reset_subgroups();//clear from prev state + load_entities(0, 0, true); + + + add(anim_tiles_group); + add(map_bg_2); + add(bg_sprites); + + statelesses=entities; + curMapBuf=map;//for now... + + // Draw player on top of everything. + player.init_player_group(player_group, player, map); + sortables.add(player_group); + add(sortables); + add(fg_sprites); + + //Add fg + add(map_fg); + + + // Make the header + header.loadGraphic(PlayState.Header, false, false, 160, 20); + header.scrollFactor=noScrollPt; + number_of_keys_text=EventScripts.init_bitmap_font("x" + Registry.get_nr_keys().toString(), "left", 42,7, null, "apple_white"); + + autosave_icon=EventScripts.init_autosave_icon(autosave_icon, autosave_icon_embed); + + header_group.add(autosave_icon); + header_group.add(header); + header_group.add(number_of_keys_text); + header_group.add(player.health_bar); + add(header_group); + + //Death entities + + death_fadein=new FlxSprite(0, 0);death_fadein.scrollFactor=noScrollPt; + death_fadein.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, 0xffffffff); + death_fadein.alpha=0; + + death_text=EventScripts.init_bitmap_font("Keep exploring?", "center", 0, 60, null, "apple_black"); + death_text.visible=false; + + add(death_fadein); + add(death_text); + + // Add the darkness + add(darkness); + + // add screen fade effects + + downsample_fade=new ScreenFade(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, this as FlxState, ScreenFade.T_DS); + upsample_fade=new ScreenFade(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, this as FlxState, ScreenFade.T_US); + black_overlay.makeGraphic(Registry.SCREEN_WIDTH_IN_PIXELS, Registry.SCREEN_HEIGHT_IN_PIXELS + Registry.HEADER_HEIGHT, 0xff000000); + black_overlay.alpha=1; + black_overlay.scrollFactor=noScrollPt; + add(black_overlay); + + // Add the death overlay objects. + + + // Play song. + if(Registry.sound_data==null){ + Registry.sound_data=new SoundData(); + } + Registry.sound_data.start_song_from_title(Registry.CURRENT_MAP_NAME); + + // Make the camera follow the player + + FlxG.camera.follow(player); + FlxG.camera.setBounds(0, 0,map.width,map.height + 20, true); + FlxG.camera.deadzone=new FlxRect(50, 80, 160 - 100, 160 - 120); + + } + + override public function update():Void + { + /* First, the bare minimum. */ + if(SWITCH_MAPS)state=S_EXITING; + + // State if-then. + if(state==S_NORMAL){ + FlxG.collide(curMapBuf, player); + FlxG.collide(map_bg_2, player); + keywatch.update(); + state_normal(); + + } else if(state==S_PAUSED){ + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + keywatch.update(); + pause_state.update(); + if(pause_state.done){ + pause_state.done=false; + state=S_NORMAL; + remove(pause_state, true); + } + return; + + + + } else if(state==S_DIRECT_CONTROLS){ + pause_state.controls_state.update(); + keywatch.update(); + if(!pause_state.controls_state.updating &&(Registry.keywatch.JUST_PRESSED_PAUSE || FlxG.keys.justPressed("ESCAPE"))){ + state=S_NORMAL; + pause_state.controls_state.pop(this); + } + } else if(state==S_EXITING){ + state_exiting(); + return; + } else if(state==S_JUST_ENTERED_MAP){ + state_just_entered_map(); + return; + } else if(state==S_DIALOGUE){ + player.state=player.S_INTERACT; + keywatch.update(); + dialogue_state.update(); + if(dialogue_state.is_finished){ + player.state=player.S_GROUND; + player.dontMove=false; + dialogue_state.is_finished=false; + state=S_NORMAL; + dialogue_latency=0.3; + dialogue_state.reset(); + Registry.E_Dialogue_Just_Finished=true; + dialogue_state.pop(this as FlxState); + } + } else if(state==S_OPEN_TREASURE){ + state_open_treasure(); + return; + } else if(state==S_PLAYER_DIED){ + state_player_died(); + } else if(state==S_CUTSCENE){ + + } + + + Registry.sound_data.current_song.volume=FlxG.volume * Registry.volume_scale; + check_events(); + // Check entity's distances from player to determine if need to update + // - exists vs. not + + // When enemies refactored, will call update. + super.update(); + } + + private function check_events():Void { + if(Registry.EVENT_CHANGE_VOLUME_SCALE){ + if(EventScripts.send_property_to(Registry, "volume_scale", Registry.EVENT_CHANGE_VOLUME_SCALE_TARGET, 0.01)) + Registry.EVENT_CHANGE_VOLUME_SCALE=false; + } + + + if(Registry.E_Load_Cutscene){ + state=S_CUTSCENE; + Registry.E_Load_Cutscene=false; + cutscene=new Cutscene(this); + cutscene.push(this as FlxState); + + } + + } + + private function state_normal():Void + { + /* Only pause or enter controls if we're not in the middle of a transition */ + if(pause_timer<0 &&(keywatch.JUST_PRESSED_PAUSE || FlxG.keys.justPressed("ESCAPE"))){ + + Registry.sound_data.play_sound_group(Registry.sound_data.pause_sound_group); + pause_timer=0.2; + if(FlxG.keys.justPressed("ESCAPE")){ + state=S_DIRECT_CONTROLS; + pause_state.controls_state.push(this); + } else { + state=S_PAUSED; + add(pause_state); + pause_timer=0.2; + } + } else { + pause_timer -=FlxG.elapsed; + } + //triggered by an npc or whatever + if(dialogue_latency>0){ + dialogue_latency -=FlxG.elapsed; + } + if(load_dialogue){ + load_dialogue=false; + if(dialogue_latency<0){ + state=S_DIALOGUE; + player.dontMove=true; + dialogue_state.push(this as FlxState); + + } + } + + if(player.health_bar.cur_health<=0){ + player.play("die"); + player.ANIM_STATE=player.ANIM_DEAD; + player.alive=false; + var pt:FlxPoint=player.getScreenXY(); + player.scrollFactor=noScrollPt; + player.x=pt.x; + player.y=pt.y; + Registry.sound_data.stop_current_song(); + player.velocity.x=player.velocity.y=0; + + remove(player, true); + add(player); + state=S_PLAYER_DIED; + } + } + + private function state_exiting():Void { + /* Mark all sprites to be cleaned up, reset any events set, + * reset grid state, determine beginning state of the transition */ + if(!cleaned_up_before_exit){ + Registry.reset_events(); + for(i in 0...entities.length){ + entities.pop(); + } + + cleaned_up_before_exit=true; + player.dontMove=true; + + if(Registry.E_Enter_Whirlpool_Down){ + + } else { + Registry.EVENT_FADE_BEGUN=true; + } + + if(Registry.FUCK_IT_MODE_ON){ + Registry.EVENT_FADE_OVER=true; + Registry.EVENT_FADE_BEGUN=false; + // black_overlay.alpha=1; + } + } + /* Fade out the song and other sounds playing */ + Registry.sound_data.current_song.volume -=0.03; + if(Registry.sound_data.current_song.playing && Registry.sound_data.current_song.volume<0.05){ + Registry.sound_data.stop_current_song(); + if(Registry.CURRENT_MAP_NAME=="BEACH"){ + Registry.sound_data.waves.stop(); + } + } + + /* Do door-specific stuff here(events, etc)*/ + if(Registry.CURRENT_MAP_NAME=="BLANK"){ + black_overlay.alpha +=0.01; + } else if(Registry.E_Enter_Whirlpool_Down){ + + super.update(); + player.play('whirl'); + if(player.framePixels_y_push !=15){ + player.framePixels_y_push++; + } + if(player.framePixels_y_push>=15){ + black_overlay.alpha +=0.015; + Registry.EVENT_FADE_BEGUN=true; + } + } else { + black_overlay.alpha +=0.02; + } + + /* Actually make the transition when the overlay is completely + * opaque and the downsampling is done */ + if(black_overlay.alpha>=0.99 && !Registry.sound_data.current_song.playing && Registry.EVENT_FADE_OVER){ + Registry.EVENT_FADE_OVER=Registry.EVENT_FADE_BEGUN=false; + + DH.reset_scenes_on_map_change(); + Registry.CURRENT_MAP_NAME=Registry.NEXT_MAP_NAME; + Registry.set_is_playstate(Registry.CURRENT_MAP_NAME); + if(Registry.is_playstate){ + //FlxG.switchState(Registry.PLAYSTATE); + FlxG.switchState(new PlayState); + } else { + FlxG.switchState(new RoamState); + } + } + + + } + + private function state_just_entered_map():Void { + Registry.EVENT_FADE_BEGUN=true; + black_overlay.alpha -=0.02; + player.dontMove=true; + if(Registry.FUCK_IT_MODE_ON){ + Registry.EVENT_FADE_BEGUN=false; + Registry.EVENT_FADE_OVER=true; + } + if(black_overlay.alpha<=0 && Registry.EVENT_FADE_OVER){ + state=S_NORMAL;player.dontMove=false; + Registry.EVENT_FADE_BEGUN=Registry.EVENT_FADE_OVER=false; + } + + super.update(); + } + + + public function state_player_died():Void { + Registry.keywatch.update(); + + + + EventScripts.send_property_to(player, "x", 80, 0.5); + EventScripts.send_property_to(player, "y", 100, 0.5); + if(player.frame==player.DEATH_FRAME && !played_death_sound){ + played_death_sound=true; + Registry.sound_data.player_hit_1.play(); + Registry.sound_data.GameOver.play(); + death_text.visible=true; + + death_text.setText("Keep exploring?\n" + "Press " + Registry.controls[Keys.IDX_ACTION_1], true, 0, 0, "center", true); + } + death_fadein.visible=true; + if(death_fadein.alpha<1)death_fadein.alpha +=0.03; + if(death_fadein.alpha>0.7){ + death_text.visible=true; + + } + if(start_death_fade_out ||(played_death_sound && Registry.keywatch.JP_ACTION_1 && death_text.visible)){ + + start_death_fade_out=true; + black_overlay.alpha +=0.02; + player.alpha -=0.02; + death_text.alpha -=0.02; + if(black_overlay.alpha==1){ + Registry.sound_data.GameOver.stop(); + Registry.sound_data.GameOver=new FlxSound(); + Registry.sound_data.GameOver.loadEmbedded(SoundData.GameOver_Song, false); + Registry.ENTRANCE_PLAYER_X=Registry.checkpoint.x; + Registry.ENTRANCE_PLAYER_Y=Registry.checkpoint.y; + Registry.CURRENT_MAP_NAME=Registry.checkpoint.area; + Registry.CUR_HEALTH=Registry.MAX_HEALTH; + player.health_bar.modify_health(Registry.MAX_HEALTH); + Registry.set_is_playstate(Registry.CURRENT_MAP_NAME); + if(Registry.is_playstate){ + //FlxG.switchState(Registry.PLAYSTATE); + FlxG.switchState(new PlayState); + } else { + FlxG.switchState(new RoamState); + } + } + + } + + } + + private function state_open_treasure():Void { + Registry.keywatch.update();// o_O + state=S_NORMAL; + } + + private function initXML():Void { + var map:XML; + for(map in Registry.statefulXML.map){ + if(map.@name==Registry.CURRENT_MAP_NAME){ + stateful_mapXML=map;break; + } + } + for(map in Registry.statelessXML.map){ + if(map.@name==Registry.CURRENT_MAP_NAME){ + stateless_mapXML=map;break; + } + } + } + + private function load_entities(gx:Int, gy:Int, load_all:Bool=false):Void { + if(stateless_mapXML !=null){ + add_from_xml(stateless_mapXML.grid,gx,gy,load_all); + } + + if(stateful_mapXML !=null){ + add_from_xml(stateful_mapXML.grid,gx,gy,load_all); + } + } + + private function add_from_xml(xml:XMLList,gx:Int,gy:Int,load_all:Bool=false):Void + { + var prev_len:Int=entities.length; + for(var grid:XML in xml){ + if(load_all ||(parseInt(grid.@grid_x)==gx && parseInt(grid.@grid_y)==gy)){ + for(var i:Int=0;i=new Array(); + private var name_array_nrs:Array=new Array(); + private var name_array_visibilities:Array=new Array(); + private var name_timer_max:Float=0.04; + private var name_timer:Float=name_timer_max; + private var downscale:Int=2; + + private var transition_out:Bool=false; + + private var controls_state:ControlsState=new ControlsState(); + + private var rect_fade:FlxSprite; + + private static var do_joypad_config:Bool=true; + + private var do_window_config:Bool=false; + private var window_config:FlxSprite; + private var window_words:FlxBitmapFont; + + //[Embed(source="../res/title/titlepicture.png")] public var S_TITLE_PICTURE:Class; + //[Embed(source="../res/title/selector.png")] public static var S_SELECTOR:Class; + //[Embed(source="../res/sprites/screen_config.png")] public static var embed_screen_config:Class; + + private var did_init_fadein:Bool=false; + + private var mobile_message:FlxBitmapFont; + public function new(){ + + } + override public function create():Void { + name=DH.lk("title", 3); + name="Melos Han-Tani\nMarina Kittaka"; + if(Intra.is_release)version="Demo"; + //BACK_TEXT_MOBILE=EventScripts.init_bitmap_font("Press BACK again\nto exit.\nUnsaved progress\nwill be lost.", "center", 21, 16, null,"apple_white"); + BACK_TEXT_MOBILE=EventScripts.init_bitmap_font(DH.lk("title",17), "center", 21, 16, null,"apple_white"); + rect_fade=new FlxSprite(0, 0); + rect_fade.scrollFactor.x=rect_fade.scrollFactor.y=0; + rect_fade.makeGraphic(160, 180, 0xff000000); + + + bg.loadGraphic(S_TITLE_PICTURE, false, false, 160, 180); + add(bg); + + Registry.sound_data=new SoundData(); + + Registry.sound_data.start_song_from_title("TITLE"); + if(Intra.is_mobile){ + Registry.sound_data.current_song.volume=0; + //mobile_message=EventScripts.init_bitmap_font("NOTE\n\nIf you have input\nlag during gameplay,\nreturn to your\nhome screen and\nre-enter Anodyne.\n\nPRESS C TO CONTINUE", "center", 9, 20, null, "apple_white"); + mobile_message=EventScripts.init_bitmap_font(DH.lk("title",16), "center", 9, 20, null, "apple_white"); + } + + btn=new FlxSprite(FlxG.width - 80, FlxG.height - 40); + btn.loadGraphic(Button.S_BUTTON, true, false, 16, 16); + btn.frame=2; + + + selector=new FlxSprite(); + selector.loadGraphic(PauseState.arrows_sprite, true, false, 7,7); + selector.addAnimation("enabled", [2,3], 6); + selector.play("enabled"); + + //ad_text=EventScripts.init_bitmap_font("Press 'G' to vote for\nAnodyne on\n Steam Greenlight.\nPress 'B' to purchase\n the full version!", "left", 2, 106, null, "apple_white"); + ad_text=EventScripts.init_bitmap_font("Yeah no", "left", 2, 106, null, "apple_white"); + //mac_text=EventScripts.init_bitmap_font("Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to yes in\n", "left", 8, 8, null,"apple_white"); + mac_text=EventScripts.init_bitmap_font(DH.lk("title",15), "left", 8, 8, null,"apple_white"); + mac_text.visible=false; + name_fade.makeGraphic(160, 180, 0xff000000); + add(name_fade); + + name_buffer=EventScripts.init_bitmap_font(" ", "center", 38, 88, null, "apple_white"); + name_buffer.setText(name, true, 0, 0, "center", true); + name_buffer.color=0x758d91; + name_buffer.customSpacingY=2; + name_buffer.text=" "; + for(i in 0...name.length){ + name_array.push(name.charAt(i)); + name_array_nrs.push(i); + name_array_visibilities.push(false); + if(i==13){ + name_buffer.text +="\n"; + } else { + name_buffer.text +=" "; + } + } + name_buffer.x=80 - name_buffer.width/2; + name_buffer.y=90; + other_fade.makeGraphic(160, 180, 0xff000000); + + + if(Save.load()){ + //text.setText(filler + "Continue\nNew Game", true, 0, 0, "left", true); + text=EventScripts.init_bitmap_font(" ", "left", 41, 41, null, "apple_white"); + if(DH.isZH())text=EventScripts.init_bitmap_font(" ", "left", 41, 28, null, "apple_white"); + text.setText(filler + DH.lk("title", 8)+ "\n" + DH.lk("title", 9)+ "\nBuy Anodyne 2", true, 0, 0, "left", true); + if(DH.isZH())text.setText(filler + DH.lk("title",8)+"\n"+DH.lk("title",9)+"\nAnodyne 2", true, 0, 0, "left", true); + + selector.x=text.x - selector.width - 1; + selector.y=text.y + 8; + if(DH.isZH())selector.y +=8; + + loaded=true; + + // Grab steam achievements if we didnt connet last time + Achievements.set_steam_achievements(); + } else { + selector.visible=false; + //text.setText(filler + "Press C\n"+"to start", true, 0, 0, "left", true); + text=EventScripts.init_bitmap_font(" ", "left", 42, 41, null, "apple_white"); + text.setText(filler + DH.lk("title", 5)+ " " + Registry.controls[Keys.IDX_ACTION_1] + "\n" + DH.lk("title", 6)+ "\nPress X to\nbuy Anodyne 2 ", true, 0, 0, "left", true); + if(DH.isZH())text.setText(filler + DH.lk("title",5)+" "+Registry.controls[Keys.IDX_ACTION_1]+"\n"+DH.lk("title",6)+"\nX=Buy\nAnodyne 2", true, 0, 0, "left", true); + loaded=false; + Registry.controls=Registry.default_controls; + + } + + + text.color=0x758d91; + version=DH.lk("title", 7)+ " 1.55S"; + version_text=EventScripts.init_bitmap_font(version, "left", 2, 156, null, "apple_white"); + version_text.visible=false; + + if(Intra.is_ouya){ + Registry.controls=new Array("UP","DOWN","LEFT","RIGHT","ENTER","T","Z","Y"); + } + keywatch.x=2000; + add(keywatch); + rect_fade.y=-180; + add(rect_fade); + Registry.keywatch=keywatch; + + + + + black_overlay=new FlxSprite(0, 0); + black_overlay.makeGraphic(160, 180, 0xff000000); + + scrolly_background=new FlxSprite(0, 0, embed_title_bg); + scrolly_background2=new FlxSprite(0, -320, embed_title_bg); + + dark_blend=new FlxSprite(0, 0, embed_overlay_dark); + dark_blend.blend="overlay"; + + glow_blend=new FlxSprite(0, 0, embed_overlay_glow); + glow_blend.blend="overlay"; + glow_blend.visible=false; + + door_glow=new FlxSprite(0, 0, embed_door_glow); + door_glow.visible=false; + door_spin_1=new FlxSprite(0, 0, embed_spin_glow1); + door_spin_2=new FlxSprite(0, 0, embed_spin_glow2); + door_spin_1.visible=door_spin_2.visible=false; + + press_enter_sprite=new FlxSprite(0, 0, embed_press_enter); + press_enter_sprite.visible=false; + + wordmark=new FlxSprite(16, 16, embed_wordmark); + wordmark.visible=false; + wordmark_white=new FlxSprite(16, 16, embed_wordmark_white); + wordmark_white.visible=false; + + nexus_image=new FlxSprite(0, 180, embed_nexus_image); + + + downsample_fade=new ScreenFade(160, 180, this, ScreenFade.T_DS); + + add(scrolly_background); + add(scrolly_background2); + add(nexus_image); + add(door_glow); + add(door_spin_1); + add(door_spin_2); + + add(name_buffer); + add(wordmark); + add(wordmark_white); + add(dark_blend); + add(glow_blend); + add(press_enter_sprite); + add(black_overlay); + + add(text); + add(selector); + add(version_text); + if(Intra.is_release){ + add(ad_text); + } + add(mac_text); + if(Intra.is_mobile){ + add(mobile_message); + add(btn); + } + + status_text=EventScripts.init_bitmap_font(" ", "left", 4, 76,null,"apple_white"); + if(loaded){ + var playtime_dat:Int=0; + playtime_dat=Registry.playtime; + var hrs:Int=Std.int(playtime_dat / 3600); + + if(hrs>=10){ + status_text.text=Std.int(playtime_dat / 3600).toString()+ ":"; + } else { + status_text.text="0" + Std.int(playtime_dat / 3600).toString()+ ":"; + } + playtime_dat -=3600 * hrs; + + var mins:Int=Std.int(playtime_dat / 60); + if(mins>=10){ + status_text.text +=Std.int(playtime_dat / 60).toString()+ ":"; + } else { + status_text.text=status_text.text + "0" + Std.int(playtime_dat / 60).toString()+ ":"; + } + playtime_dat -=60 * mins; + + if(playtime_dat>=10){ + status_text.text +=playtime_dat.toString(); + } else { + status_text.text=status_text.text + "0"+ playtime_dat.toString(); + } + + //status_text.text +="\n" + Registry.death_count.toString()+ " deaths\n" + Registry.nr_growths.toString()+ " cards"; + if(DH.language_type==DH.LANG_ja){ + status_text.text +="\n死亡" + Registry.death_count.toString()+"回\nカード" + Registry.nr_growths.toString()+ "枚"; + + } else { + status_text.text +="\n" + Registry.death_count.toString()+" " + DH.lk("title", 13)+ " \n" + Registry.nr_growths.toString()+ " " + DH.lk("title", 14); + } + } + + var hby:Int=80; + if(DH.isZH())hby=92; + if(loaded){ + health_bar=new HealthBar(150, hby, Registry.MAX_HEALTH); + } else { + health_bar=new HealthBar(150,hby, 6); + health_bar.exists=false; + } + t_briar=new FlxSprite;t_briar.exists=false; + t_young=new FlxSprite;t_young.exists=false; + + if(Registry.GE_States[Registry.GE_BRIAR_BOSS_DEAD]){ + t_briar.x=2; + t_briar.y=2; + t_briar.loadGraphic(Shadow_Briar.embed_briar, true, false, 16, 16); + t_briar.exists=true;t_briar.visible=false; + add(t_briar); + } + if(Registry.nr_growths>48){ + t_young.x=160 - 2 - 16; + t_young.y=2; + t_young.loadGraphic(Player.Player_Sprite, true, false, 16, 16); + t_young.exists=true;t_young.visible=false; + add(t_young); + } + + health_bar.visible=status_text.visible=ad_text.visible=version_text.visible=text.visible=selector.visible=false; + add(status_text);add(health_bar); + + + add(other_fade); + other_fade.alpha=0; + + // Only bother with this when not on the computer + if(!Intra.did_window_config && !Intra.is_mobile){ + //window_words=EventScripts.init_bitmap_font("Please use the\narrow keys to resize\nthe window until\nyou cannot see\nany black around\n the borders.\n\nPress "+Registry.controls[Keys.IDX_ACTION_1]+"\nwhen done.", "center", 10, 10, null, "apple_white"); + window_words=EventScripts.init_bitmap_font(DH.lk("title",0)+" "+Registry.controls[Keys.IDX_ACTION_1]+" "+DH.lk("title",1), "center", 10, 10, null, "apple_white"); + + window_config=new FlxSprite(-3,-3); + window_config.loadGraphic(embed_screen_config, false, false, 166, 186); + add(window_config); + add(window_words); + Intra.force_window(3); + do_window_config=true; + // Otherwise do a Left or Right hand config + } else if(Intra.is_mobile){ + + } + + DEBUGTEXT=EventScripts.init_bitmap_font(Achievements.DEBUG_TEXT, "left", 0, 0, null, "apple_white"); + DEBUGTEXT.visible=true; + //add(DEBUGTEXT); + DEBUGTEXT.text +=Main.debugstring; + + BACK_TEXT_MOBILE.alpha=0; + add(BACK_TEXT_MOBILE); + } + + public function name_fade_state():Void { + other_fade.alpha -=0.008; + name_timer -=FlxG.elapsed; + if(name_timer<0){ + name_buffer.text=" "; + name_timer=name_timer_max; + var idx:Int=Std.int(Math.random()* name_array_nrs.length); + name_array_visibilities[13]=true; + name_array_visibilities[name_array_nrs[idx]]=true; + name_array_nrs.splice(idx, 1); + for(i in 0...name.length){ + if(name_array_visibilities[i]){ + name_buffer.text +=name_array[i]; + } else { + name_buffer.text +=" "; + } + } + } + + if(name_array_nrs.length==0){ + state=S_NAME_BLUR; + } + return; + } + public function name_blur_state():Void { + + other_fade.alpha -=0.008; + name_buffer.alpha -=0.006; + name_timer -=FlxG.elapsed; + name_timer_max=0.1; + if(name_timer<0 && name_buffer.alpha<0.64){ + name_timer=name_timer_max; + name_buffer.pixels.applyFilter(name_buffer.framePixels, name_buffer.framePixels.rect, name_buffer.framePixels.rect.topLeft, new BlurFilter(2,2, 1)); + } + + name_buffer.dirty=true; + if(name_buffer.alpha<0.2){ + name_fade.alpha -=0.03; + if(name_fade.alpha<0.03){ + state=S_NEXUS_SCROLL; + if(loaded){ + //state=S_CONTINUE; + } else { + //state=S_NEW; + } + } + } + } + + override public function draw():Void + { + + super.draw(); + downsample_fade.rate=15; + if(state==S_NEXUS_SCROLL && ctr==2){ + black_overlay.alpha +=0.006; + if(downsample_fade.do_effect()==ScreenFade.DONE){ + black_overlay.alpha +=0.01; + if(black_overlay.alpha==1){ + t_young.visible=t_briar.visible=health_bar.visible=status_text.visible=ad_text.visible=version_text.visible=text.visible=selector.visible=true; + if(loaded){ + state=S_CONTINUE; + } else { + selector.visible=false; + state=S_NEW; + } + } + } + } + } + + private var reeeeeesize:Bool=false;// Force the game to be windowed if we need to do manual window resize + private var window_during_joyconfig:Bool=false;// Force the game to be windowed if we need to do manual window resize + private var window_to_joyconfig_delay:Float=0; + private var window_to_joyconfig_happened:Bool=false; + private static var do_prevent_mac_joy_error:Bool=false; + private var mac_selector_state:Int=0; + private var mac_timeout:Float=10; + public static var restart_on_mobile_enter:Bool=false; + public static var mobile_message_done:Bool=false; + + private var t_mobile_back:Float=0; + override public function update():Void { + + if(Registry.MOBILE_ASK_TO_EXIT_WITH_BACK){ + t_mobile_back=2; + Registry.MOBILE_ASK_TO_EXIT_WITH_BACK=false; + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=true; + } + if(t_mobile_back>0){ + BACK_TEXT_MOBILE.alpha=t_mobile_back / 2.0; + t_mobile_back -=FlxG.elapsed; + if(t_mobile_back<0){ + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=false; + } + } + + if(Intra.is_mobile){ + + + + if(did_init_fadein==false){ + Registry.sound_data.current_song.volume +=0.0025; + if(Registry.sound_data.current_song.volume==1){ + Registry.sound_data.current_song.play(); + did_init_fadein=true; + } + } + + } + if(restart_on_mobile_enter){ + restart_on_mobile_enter=false; + Registry.sound_data.start_song_from_title("TITLE"); + } + + + if(Intra.is_mobile){ + if(mobile_message_done==false){ + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2){ + mobile_message_done=true; + mobile_message.visible=false; + btn.visible=false; + } + Registry.keywatch.update(); + return; + } + } + + if(FlxG.keys.THREE && FlxG.keys.D && FlxG.keys.justPressed("T")){ + DEBUGTEXT.visible=!DEBUGTEXT.visible; + } + //if(Intra.is_release){ + //if(FlxG.keys.justPressed("G")){ + //Achievements.unlock(Achievements.Greenlit); + //FlxU.openURL("http://steamcommunity.com/sharedfiles/filedetails/?id=92921739"); + //} + // + //if(FlxG.keys.justPressed("B")){ + //Achievements.unlock(Achievements.Website); + //FlxU.openURL("http://www.anodynegame.com"); + //} + //} + if(Achievements.IS_STEAM){ + //DEBUGTEXT.text=Achievements.DEBUG_TEXT; + } + + if(Intra.is_ouya){ + //DEBUGTEXT.text=Main.debugstring; + } else if(Intra.is_mobile && !Intra.is_ios){ + //DEBUGTEXT.text=Main.debugstring; + } + + if(do_window_config){ + if(reeeeeesize==false){ + reeeeeesize=true; + trace("Windowing for window config."); + Intra.force_window(3); + } + window_config_logic(keywatch); + if(keywatch.JP_ACTION_1 || keywatch.JP_ACTION_2){ + do_window_config=false; + remove(window_config, true); + remove(window_words, true); + trace("Exiting window config, fullscreening."); + Intra.scale_factor=FlxG.stage.fullScreenHeight / 180; + Intra.force_scale=true; + Intra.scale_ctr=Intra.SCALE_TYPE_INT; + window_to_joyconfig_delay=1; + reeeeeesize=false; + } + super.update(); + return; + } + + // prevent bad controllers from crashing the extension(and thus the game) + if(!do_prevent_mac_joy_error && Intra.IS_MAC && Main.fixedjoy){ + + mac_text.visible=true; + //mac_text.text="Anodyne supports\nmost controllers.\n\nWill you use one?\n\nYes No\n\nIf so, connect it now.\n\nMove with arrow keys\n\nSelect with\nC, SPACE, or ENTER\n\nDefaulting to YES in\n" + mac_timeout.toFixed(2); + mac_text.text=DH.lk("title",15)+ mac_timeout.toFixed(2); + mac_timeout -=FlxG.elapsed; + + selector.visible=true; + + if(mac_selector_state==0){ + selector.x=mac_text.x + 32; + selector.y=mac_text.y + 40; + if(Registry.keywatch.JP_LEFT){ + mac_selector_state=1; + } else if(FlxG.keys.justPressed("C")|| FlxG.keys.justPressed("SPACE")|| FlxG.keys.justPressed("ENTER")){ + do_prevent_mac_joy_error=true; + mac_text.visible=false; + window_to_joyconfig_delay=1; + selector.visible=false; + } + } else { // yes + selector.x=mac_text.x - 6 ; + selector.y=mac_text.y + 40; + + if(Registry.keywatch.JP_RIGHT){ + mac_selector_state=0; + } else if(FlxG.keys.justPressed("C")|| FlxG.keys.justPressed("SPACE")|| FlxG.keys.justPressed("ENTER")){ + do_prevent_mac_joy_error=true; + Main.mac_joy_manager=new MacJoystickManager(); + Main.macmanexists=true; + mac_text.visible=false; + window_to_joyconfig_delay=1; + selector.visible=false; + } + } + + if(mac_timeout<0){ + do_prevent_mac_joy_error=true; + Main.mac_joy_manager=new MacJoystickManager(); + Main.macmanexists=true; + mac_text.visible=false; + window_to_joyconfig_delay=1; + selector.visible=false; + + } + + super.update(); + return; + } + + if(Keys.has_joypad){ + if(do_joypad_config){ + + if(window_to_joyconfig_delay>0){ + window_to_joyconfig_happened=true; + window_to_joyconfig_delay -=FlxG.elapsed; + super.update(); + return; + } + + // If we did the window config then we shouldn't fullscreen + if(false==reeeeeesize){ + trace("Windowing for joypad config."); + reeeeeesize=true; + Intra.force_window(3); + } + + if(Registry.joy_grp==null){ + Registry.joy_grp=new Joypad_Config_Group(); + add(Registry.joy_grp); + } + + if(Registry.joy_grp.is_done()){ + trace("Title joypad config done"); + do_joypad_config=false; + remove(Registry.joy_grp, true); + window_to_joyconfig_delay=1; + if(window_to_joyconfig_happened){ + trace("Fullscreening from joypad config"); + Intra.scale_factor=FlxG.stage.fullScreenHeight / 180; + Intra.force_scale=true; + Intra.scale_ctr=Intra.SCALE_TYPE_INT; + } else { + Save.load(); + // Prevent zerooing out the array from loading a game that + // has no joy bindings, if we set joy bindings previously + if(Joypad_Config_Group.REAL_JOYBINDS !=null){ + Registry.joybinds=Joypad_Config_Group.REAL_JOYBINDS; + } + } + + } + super.update(); + return; + } + } + + + if(scrolly_background.y<=-320){ + scrolly_background.y=180; + } + if(scrolly_background2.y<=-320){ + scrolly_background2.y=180; + } + if(state==S_BEGIN){ + switch(ctr){ + case 0: + scrolly_background.velocity.y=scrolly_background2.velocity.y=-30; + black_overlay.alpha -=0.0079; + if(black_overlay.alpha==0){ + ctr=0; + state=S_NAME_FADE; + } + break; + } + + if(window_to_joyconfig_delay<0){ + do_skip(); + } else { + window_to_joyconfig_delay -=FlxG.elapsed; + } + super.update(); + return; + } else if(state==S_NEXUS_SCROLL){ + switch(ctr){ + case 0: + nexus_image.velocity.y=-20; + + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2){ + nexus_image.y=180 - nexus_image.height; + } + if(nexus_image.y + nexus_image.height<=180){ + nexus_image.y=180 - nexus_image.height; + nexus_image.velocity.y=0; + FlxG.flash(0xffffffff, 1.5); + glow_blend.visible=true; + dark_blend.visible=false; + + door_glow.visible=true; + + door_glow.x=(160 - 64)/ 2; + door_glow.y=nexus_image.y + 17; + + door_spin_1.visible=true; + door_spin_1.x=door_spin_2.x=door_glow.x; + door_spin_1.y=nexus_image.y; + door_spin_1.blend="screen"; + door_spin_2.angularVelocity=-90; + + door_spin_2.visible=true; + door_spin_2.y=nexus_image.y; + door_spin_2.blend="screen"; + door_spin_1.angularVelocity=90; + + wordmark.visible=wordmark_white.visible=true; + + press_enter_sprite.visible=true; + + press_enter_sprite.x=(160 - press_enter_sprite.width)/ 2; + press_enter_sprite.y=160; + + name_timer=0; + + ctr++; + } + break; + //17 + case 1: + wordmark_white.alpha -=0.0033; + + name_timer +=FlxG.elapsed; + if(press_enter_sprite.visible){ + if(name_timer>1){ + name_timer=0; + press_enter_sprite.visible=false; + } + } else { + if(name_timer>0.75){ + name_timer=0; + press_enter_sprite.visible=true; + } + } + + if(glow_blend.alive){ + glow_blend.alpha -=0.001; + if(glow_blend.alpha<=0.7){ + glow_blend.alive=false; + } + } else { + glow_blend.alpha +=0.001; + if(glow_blend.alpha>=1){ + glow_blend.alive=true; + } + } + + if(door_spin_1.alive){ + door_spin_1.alpha -=0.003; + if(door_spin_1.alpha<=0.5){ + door_spin_1.alive=false; + } + } else { + door_spin_1.alpha +=0.003; + if(door_spin_1.alpha>=1){ + door_spin_1.alive=true; + } + } + + if(door_spin_2.alive){ + door_spin_2.alpha -=0.0015; + if(door_spin_2.alpha<=0.7){ + door_spin_2.alive=false; + } + } else { + door_spin_2.alpha +=0.0015; + if(door_spin_2.alpha>=1){ + door_spin_2.alive=true; + } + } + + if(FlxG.keys.justPressed("ENTER")|| Registry.keywatch.JUST_PRESSED_PAUSE || Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2){ + ctr++; + downsample_fade.timer_max=0.03; + } + break; + case 2: + + selector.x=text.x - selector.width - 1; + selector.y=text.y +(text.characterHeight+text.customSpacingY); + black_overlay.alpha +=0.002; + break; + } + super.update(); + return; + } + + + if(transition_out){ + other_fade.alpha +=0.012; + if(other_fade.alpha>=1){ + + if(state==S_CONTINUE){ + Registry.CURRENT_MAP_NAME=Registry.checkpoint.area; + Registry.set_is_playstate(Registry.CURRENT_MAP_NAME); + Registry.ENTRANCE_PLAYER_X=Registry.checkpoint.x; + Registry.ENTRANCE_PLAYER_Y=Registry.checkpoint.y; + + if(Registry.is_playstate){ + FlxG.switchState(new PlayState); + Registry.MOBILE_OKAY_TO_EXIT_WITH_BACK=false; + } else { + FlxG.switchState(new RoamState); + } + } else { + FlxG.switchState(new IntroScene); + Registry.MAX_HEALTH=Registry.CUR_HEALTH=6; + Registry.CURRENT_MAP_NAME="BLANK"; + Registry.checkpoint.x=Registry.ENTRANCE_PLAYER_X=23; + Registry.checkpoint.y=Registry.ENTRANCE_PLAYER_Y=130; + Registry.checkpoint.area="BLANK"; + } + } + super.update(); + return; + } + + if(state==S_NAME_FADE){ + do_skip(); + name_fade_state(); + super.update(); + return; + } else if(state==S_NAME_BLUR){ + do_skip(); + name_blur_state(); + super.update(); + return; + + } + + if(keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + } + + if(keywatch.JP_DOWN || keywatch.JP_UP){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + } + + switch(state){ + case S_CONTROLS: + keywatch.update(); + controls_state.update(); + if(FlxG.keys.justPressed("ESCAPE")||(keywatch.JUST_PRESSED_PAUSE && !controls_state.updating)){ + controls_state.updating=false; + controls_state.pop(this as FlxState); + if(loaded){ + state=S_CONTINUE; + } else { + state=S_NEW; + } + } + return; + + case S_NEW: + if(keywatch.JP_ACTION_1 || FlxG.keys.justPressed("ENTER")){ + transition_out=true; + rect_fade.velocity.y=80; + } + if(keywatch.JP_ACTION_2){ + navigateToURL(new URLRequest("https://store.steampowered.com/app/877810/Anodyne_2_Return_to_Dust/")); + } + /* Check for ESC input to bring up controls */ + if(FlxG.keys.justPressed("ESCAPE")){ + state=S_CONTROLS; + controls_state.change_text(); + controls_state.push(this as FlxState); + } + break; + case S_CONTINUE: + var lineHeightCont:Int=text.characterHeight + text.customSpacingY; + if(keywatch.JP_DOWN){ + + //some_stupid_shit(downscale); + downscale++; + if(selector.ytext.y + lineHeightCont) + selector.y -=lineHeightCont; + } + if(keywatch.JP_ACTION_1 || FlxG.keys.justPressed("ENTER")){ + if(selector.y==text.y + lineHeightCont){ + + rect_fade.velocity.y=80; + transition_out=true; + } else if(selector.y==text.y + 2*lineHeightCont){ + state=S_DELETE; + //text.text=filler+"Are you sure?\nNo\nYes"; + text.text=filler + DH.lk("title", 10); + + } else { + navigateToURL(new URLRequest("https://store.steampowered.com/app/877810/Anodyne_2_Return_to_Dust/")); + } + } + + /* Check for ESC input to bring up controls */ + if(FlxG.keys.justPressed("ESCAPE")){ + state=S_CONTROLS; + controls_state.push(this as FlxState); + } + break; + case S_DELETE: + + var lineHeightDel:Int=text.characterHeight + text.customSpacingY; + if(keywatch.JP_DOWN){ + if(selector.ytext.y + 2*lineHeightDel) + selector.y -=lineHeightDel; + } + + if(keywatch.JP_ACTION_1 || FlxG.keys.justPressed("ENTER")){ + selector.x=text.x - selector.width - 1; + if(selector.y==text.y + 2*lineHeightDel){ + state=S_CONTINUE; + selector.x=text.x - selector.width - 1; + //text.setText(filler + "Continue\nNew Game", true, 0, 0, "left", true); + text.setText(filler + DH.lk("title", 8)+ "\n" + DH.lk("title", 9)+ "\nBuy Anodyne 2", true, 0, 0, "left", true); + if(DH.isZH())text.setText(filler + DH.lk("title",8)+"\n"+DH.lk("title",9)+"\nAnodyne 2", true, 0, 0, "left", true); + selector.y -=lineHeightDel; + } else { + selector.y -=lineHeightDel; + if(text.text==filler+DH.lk("title",11)){ + selector.x=text.x - selector.width - 1; + //text.text=filler+"No going back!\nForget it\nI know" + text.text=filler + DH.lk("title", 12); + } else if(text.text==filler + DH.lk("title", 12)){ + Registry.embed2saveXML();//Reset this current session's XML. + Registry.controls=Registry.default_controls; + Save.delete_save(); + status_text.visible=false; + health_bar.visible=false; + t_young.visible=t_briar.visible=false; + //text.setText(filler + "Press C" + "\nto start", true, 0, 0, "left", true); + text.setText(filler + DH.lk("title",5)+" "+Registry.controls[Keys.IDX_ACTION_1]+"\n"+DH.lk("title",6), true, 0, 0, "left", true); + state=S_NEW; + selector.visible=false; + + //FlxG.switchState(new FirstRoomState); + } else { + text.text=filler+DH.lk("title",11); + + } + } + } + break; + + } + super.update(); + //Add a glitch effect to the words, or a blur effect. Make it blink too. + //Particles in the background? + } + + override public function destroy():Void { + remove(keywatch, true); + bg=null; + controls_state.destroy(); + controls_state=null; + keywatch=null; + name_buffer=null; + name_fade=null; + other_fade=null; + rect_fade=null; + version_text=null; + selector=null; + text=null; + + black_overlay=null; + downsample_fade=null; + scrolly_background=null; + nexus_image=null; + door_glow=null; + door_spin_1=null; + door_spin_2=null; + press_enter_sprite=null; + wordmark=null; + wordmark_white=null; + + health_bar=null; + mac_text=null; + status_text=null; + DEBUGTEXT=null; + BACK_TEXT_MOBILE=null; + + super.destroy(); + } + + /** + * Based on keypresses, + * change the size of the windowed windwos + */ + public static function window_config_logic(_keywatch:Keys):Void + { + if(_keywatch.JP_DOWN){ + if(Intra.frame_y_px<50){ + Intra.frame_y_px++; + } + } else if(_keywatch.JP_UP){ + if(Intra.frame_y_px>0){ + Intra.frame_y_px--; + } + } + + if(_keywatch.JP_RIGHT){ + if(Intra.frame_x_px<50){ + Intra.frame_x_px++; + } + } else if(_keywatch.JP_LEFT){ + if(Intra.frame_x_px>0){ + Intra.frame_x_px--; + } + } + + if(_keywatch.JP_RIGHT || _keywatch.JP_LEFT || _keywatch.JP_DOWN || _keywatch.JP_UP){ + NativeApplication.nativeApplication.activeWindow.width=480 + Intra.frame_x_px; + NativeApplication.nativeApplication.activeWindow.height=540 + Intra.frame_y_px; + } + + } + + private function do_skip():Void + { + if(FlxG.keys.justPressed("ENTER")|| Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_ACTION_2){ + state=S_NEXUS_SCROLL; + ctr=0; + wordmark_white.alpha=1; + nexus_image.y=180 - nexus_image.height; + name_buffer.visible=false; + dark_blend.visible=false; + glow_blend.visible=true; + black_overlay.alpha=0; + } + } +} \ No newline at end of file diff --git a/intra/source/states/noairPauseState.hx b/intra/source/states/noairPauseState.hx new file mode 100644 index 0000000..ef6a156 --- /dev/null +++ b/intra/source/states/noairPauseState.hx @@ -0,0 +1,1798 @@ +package states +{ +import data.SoundData; +import entity.gadget.Treasure; +import entity.interactive.NPC; +import entity.interactive.npc.Trade_NPC; +import flash.desktop.NativeApplication; +import helper.Achievements; +//import flash.desktop.NativeApplication; +import helper.DH; +import helper.EventScripts; +import org.flixel.FlxBasic; +import org.flixel.FlxGroup; +import org.flixel.FlxPoint; +import org.flixel.FlxSound; +import org.flixel.FlxSprite; +import org.flixel.FlxG; +import entity.*; +import entity.player.*; +import global.Registry; +import global.Keys; +import org.flixel.FlxState; +import org.flixel.plugin.photonstorm.FlxBitmapFont; +import org.flixel.system.FlxAnim; + +class PauseState extends PushableFlxState +{ + + + + /* Position of these two are set in PlayState */ + + + + /** NEW!!!!!!! **/ + + + private var no_scroll_point:FlxPoint=new FlxPoint(0, 0); + public var current_substate_visible:Bool=false; + private var init_parent:Bool=false; + + public var state:Int=0; + private var s_browse:Int=0; + private var s_map:Int=1;// Probably not used. + private var s_equip:Int=2; + private var s_cards:Int=3; + private var s_save:Int=4; + private var s_settings:Int=5; + private var s_dialogue:Int=6; + private var s_cheatz:Int=7; + private var s_secretz:Int=8; + public var done:Bool=false; + public var exit_latency:Float=0.5; + + private var load_dialogue:Bool=false; + private var t_d:Float=0; + private var tm_d:Float=0.2; + + private var text_1:FlxBitmapFont; + private var text_2:FlxBitmapFont; + private var text_3:FlxBitmapFont; + + private var base_group:FlxGroup=new FlxGroup; + private var base_menu:FlxSprite; + private var text_categories:FlxBitmapFont; + private var text_info:FlxBitmapFont; + private var base_index:Int=0; + private var max_base_index:Int=4; + private var menu_select_inactive:FlxSprite; + private var menu_select_active:FlxSprite; + + //[Embed(source="../res/sprites/menu/arrows.png")] public static var arrows_sprite:Class; + //[Embed(source="../res/sprites/menu/menu_select_active.png")] public static var men_sel_act:Class; + //[Embed(source="../res/sprites/menu/menu_select_inactive.png")] public static var men_sel_inact:Class; + //[Embed(source="../res/sprites/menu/menu_bg.png")] public static var menu_bg_sprite:Class; + + + + private var selectors:FlxGroup=new FlxGroup(4); + + public var minimap:MinimapState; + private var map_cursor_idx:Int=0; + private var map_ctr:Int=0; + + private var legend_entrance:FlxSprite; + private var legend_cur:FlxSprite; + private var legend_entrance_b:FlxSprite; + private var legend_cur_b:FlxSprite; + + //[Embed(source="../res/sprites/menu/equipped_icon.png")] public static var equipped_icon:Class; + //[Embed(source="../res/sprites/menu/none_icon.png")] public static var none_icon_sprite:Class; + //[Embed(source="../res/sprites/menu/long_icon.png")] public static var long_icon_sprite:Class; + //[Embed(source="../res/sprites/menu/wide_icon.png")] public static var wide_icon_sprite:Class; + //[Embed(source="../res/sprites/menu/transformer_icon.png")] public static var transformer_icon_sprite:Class; + + + private var equip_overlay:FlxSprite; + private var equip_boxes:FlxGroup=new FlxGroup(4); + private var equip_cursor_idx:Int=0; + private var equip_icon:FlxSprite; + private var key_icons:FlxGroup=new FlxGroup(3); + private var trade_item:FlxSprite; + private var jump_shoes:FlxSprite; + + + //[Embed(source="../res/sprites/menu/card_empty.png")] public static var card_empty_sprite:Class; + //[Embed(source="../res/sprites/menu/card_1.png")] public static var card_1_sprite:Class; + //[Embed(source="../res/sprites/menu/card_sheet.png")] public static var card_sheet_embed:Class; + + private var cards:FlxGroup=new FlxGroup(12); + private var cur_cards_pg:Int=0; + private var cards_cursor_idx:Int=0; + + private var save_cursor_idx:Int=0; + + //[Embed(source="../res/sprites/menu/volume_bar.png")] public static var volume_bar_embed:Class; + + private var volume_bar:FlxSprite; + private var volume_bar_overlay:FlxSprite=new FlxSprite; + private var volume_bar_bg:FlxSprite; + private var doing_window_config:Bool=false; + public var controls_state:ControlsState=new ControlsState; + private var window_config:FlxSprite; + private var window_words:FlxBitmapFont; + private var settings_cursor_idx:Int=0; + private var ctr_settings:Int=0; + + private var trophies:FlxGroup; + + private var playtime_text:FlxBitmapFont; + + + + + public function new() + { + create(); + } + + override public function add(Object:FlxBasic):FlxBasic + { + if(Registry.GAMESTATE !=null){ + Registry.GAMESTATE.dialogue_state.set_dialogue_box(); + } + + if(Registry.GE_States[Registry.GE_HAVE_A_SECRET]){ + text_categories.text="Map\n\nItems\n\nCards\n\nSave\n\nConfig\n\n???"; + } + if(trophies !=null){ + for(i in 0...trophies.length){ + set_trophy_vis(trophies, i); + } + } + text_info.text=Registry.controls[Keys.IDX_ACTION_1] + ":Select " + Registry.controls[Keys.IDX_ACTION_2] + ":Back"; + return super.add(Object); + } + + override public function draw():Void + { + + + super.draw(); + } + override public function destroy():Void + { + if(minimap !=null)minimap.destroy(); + minimap=null; + + if(controls_state !=null)controls_state.destroy(); + controls_state=null; + + /** NEW **/ + + /* Call destroy on and null all added Flixel objects */ + /* Pushable flxstates have all of their added objects removed from here*/ + super.destroy(); + + /* Remove refs */ + playtime_text=null; + text_categories=null; + text_info=null; + text_1=null; + text_2=null; + text_3=null; + window_words=null; + window_config=null; + base_menu=null; + legend_entrance=legend_cur=null; + selectors=null; + equip_overlay=null; + equip_boxes=null; + key_icons=null; + trade_item=null; + jump_shoes=null; + cards=null; + legend_cur_b=legend_entrance_b=null; + volume_bar_bg=null; + + volume_bar=null; + volume_bar_overlay=null; + + base_group=null; + + trophies=null; + } + + override public function create():Void { + /* Begin new logic */ + var i:Int=0; + current_substate_visible=false; + /* COMMON OBJECTS */ + base_menu=new FlxSprite(0, Registry.HEADER_HEIGHT); + base_menu.loadGraphic(menu_bg_sprite); + base_menu.scrollFactor.x=base_menu.scrollFactor.y=0; + + text_categories=EventScripts.init_bitmap_font("Map\n\nItems\n\nCards\n\nSave\n\nConfig", "left", 10, 13 + Registry.HEADER_HEIGHT, null, "apple_white"); + text_categories.color=0xffffff; + text_categories.drop_shadow=true; + + + + text_info=EventScripts.init_bitmap_font(Registry.controls[Keys.IDX_ACTION_1] + ":Select " + Registry.controls[Keys.IDX_ACTION_2] + ":Back", "left", 2, 150 + Registry.HEADER_HEIGHT, null, "apple_white"); + text_info.color=0x909ab1; + + //11323b + text_1=EventScripts.init_bitmap_font(" ", "left",0,0,null,"apple_white"); + text_2=EventScripts.init_bitmap_font(" ", "left",0,0,null,"apple_white"); + text_3=EventScripts.init_bitmap_font(" ", "left", 0, 0, null, "apple_white"); + text_1.color=text_2.color=text_3.color=0xffffff; + text_1.drop_shadow=text_2.drop_shadow=text_3.drop_shadow=true; + + menu_select_inactive=new FlxSprite(0, 30); + menu_select_active=new FlxSprite(0, 30); + menu_select_active.scrollFactor=menu_select_inactive.scrollFactor=no_scroll_point; + menu_select_active.addAnimation("flash", [0, 1], 4); + menu_select_active.play("flash"); + menu_select_inactive.loadGraphic(men_sel_act, true, false, 61, 15); + + menu_select_active.loadGraphic(men_sel_act, true, false, 61,15); + menu_select_inactive.visible=false; + menu_select_inactive.frame=2; + + var selector:FlxSprite; + for(i=0;i=10){ + playtime_text.text=Std.int(playtime_dat / 3600).toString()+ ":"; + } else { + playtime_text.text="0" + Std.int(playtime_dat / 3600).toString()+ ":"; + } + playtime_dat -=3600 * hrs; + + var mins:Int=Std.int(playtime_dat / 60); + if(mins>=10){ + playtime_text.text +=Std.int(playtime_dat / 60).toString()+ ":"; + } else { + playtime_text.text=playtime_text.text + "0" + Std.int(playtime_dat / 60).toString()+ ":"; + } + playtime_dat -=60 * mins; + + if(playtime_dat>=10){ + playtime_text.text +=playtime_dat.toString(); + } else { + playtime_text.text=playtime_text.text + "0"+ playtime_dat.toString(); + } + + if(Registry.GAMESTATE.load_dialogue){ + Registry.GAMESTATE.dialogue_state.push(this as FlxState); + Registry.GAMESTATE.load_dialogue=false; + state=s_dialogue; + return; + + } else if(state==s_dialogue){ + dialogue_logic(); + super.update(); + return; + } + + if(ctr_settings !=1){ + if(state==s_browse){ + check_for_exit_with(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JUST_PRESSED_PAUSE); + } else { + check_for_exit_with(Registry.keywatch.JUST_PRESSED_PAUSE); + } + } + if(!init_parent){ + parent=Registry.GAMESTATE; + init_parent=true; + } + switch(state){ + case s_browse: + browse_logic(); + break; + case s_map: + map_logic(); + break; + case s_equip: + equip_logic(); + break; + case s_cards: + cards_logic(); + break; + case s_save: + save_logic(); + break; + case s_settings: + settings_logic(); + break; + case s_secretz: + secretz_logic(); + break; + case s_cheatz: + cheatz_logic(); + break; + } + + if(Registry.keywatch.JP_UP || Registry.keywatch.JP_DOWN || Registry.keywatch.JP_LEFT || Registry.keywatch.JP_RIGHT){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_move_group); + } + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + } + + super.update(); + } + + + private function set_equip_vis(idx:Int):Void { + var equip_box:FlxSprite=equip_boxes.members[idx]; + + switch(idx){ + case 1://long + idx=Registry.IDX_LENGTHEN; + break; + case 2://widen + idx=Registry.IDX_WIDEN; + break; + case 3://stransform + idx=Registry.IDX_TRANSFORMER; + break; + } + if(!Registry.inventory[idx]){ + equip_box.visible=false; + } else { + equip_box.visible=true; + } + } + + public var secret_counter:Int=0; + public function browse_logic():Void { + + /* Pop up substates but don't do their logic */ + if(!current_substate_visible){ + + current_substate_visible=true; + + remove(base_group, true); + add(base_group); + remove(selectors, true); + add(selectors); + + selectors.setAll("visible", false); + + switch(base_index){ + case 0:// Minimap + if(minimap.has_map){ + minimap.stuff_for_pause_state(); + } + remove(minimap, true); + add(minimap); + remove(legend_cur_b, true); + add(legend_cur_b); + remove(legend_entrance_b, true); + add(legend_entrance_b); + remove(legend_cur, true); + add(legend_cur); + remove(legend_entrance, true); + add(legend_entrance); + remove(selectors, true);add(selectors); + text_1.visible=text_2.visible=true; + text_1.text=":Current room\n\ + :Door/Exit\n"; + text_1.x=60; + text_1.y=115; + + text_2.multiLine=true; + text_2.autoUpperCase=false; + + text_3.visible=false; + text_3.text="Yes No"; + if(Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]==true && false==is_crowd_minidungeon()){ + if(false==Registry.is_dungeon(Registry.CURRENT_MAP_NAME)){ + + text_2.text="Return to\nNexus"; + if(minimap.has_map){ + text_2.x=text_1.x + 19; + text_3.x=text_1.x + 14; + text_2.y=135; + text_3.y=153; + + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=true; + } else { + text_1.text="No map"; + text_1.x=equip_boxes.members[0].x + equip_boxes.members[0].width + 4; + text_1.y=30; + text_2.x=60 + 19; + text_2.y=135; + text_3.x=79; + text_3.y=153; + text_2.text="Return to\nNexus"; + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=false; + } + + } else { + text_2.text="Return to\nentrance" + text_2.x=text_1.x + 19; + text_3.x=text_1.x + 14; + text_2.y=135; + text_3.y=153; + + legend_cur_b.visible=legend_entrance_b.visible=legend_cur.visible=legend_entrance.visible=true; + } + } else { + text_2.visible=false; + } + break; + case 1:// eqip + remove(equip_overlay, true);add(equip_overlay); + remove(equip_boxes, true);add(equip_boxes); + remove(key_icons, true);add(key_icons); + remove(equip_icon, true);add(equip_icon); + remove(selectors, true);add(selectors); + remove(trade_item, true);add(trade_item); + remove(jump_shoes, true);add(jump_shoes); + + jump_shoes.visible=(Registry.bound_item_2=="JUMP"); + set_trade_item(); + + set_key_graphics(); + + for(fuckme in 0...4){ + equip_boxes.members[fuckme].visible=false; + } + + if(Registry.inventory[Registry.IDX_BROOM]){ + equip_boxes.members[0].visible=true; + } + if(Registry.inventory[Registry.IDX_LENGTHEN]){ + equip_boxes.members[1].visible=true; + } + if(Registry.inventory[Registry.IDX_WIDEN]){ + equip_boxes.members[2].visible=true; + } + if(Registry.inventory[Registry.IDX_TRANSFORMER]){ + equip_boxes.members[3].visible=true; + } + + if(Registry.bound_item_1==Registry.item_names[Registry.IDX_TRANSFORMER]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24*3; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24*2; + } else if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + equip_icon.y=equip_boxes.members[0].y - 1 + 24; + } else { + equip_icon.y=equip_boxes.members[0].y - 1; + } + if(!Registry.inventory[Registry.IDX_BROOM]){ + equip_icon.visible=false; + } else { + equip_icon.visible=true; + } + var normal_string:String=Registry.inventory[Registry.IDX_BROOM] ? "Normal":"-"; + var status_1:String=Registry.inventory[Registry.IDX_LENGTHEN] ? "Extend":"-"; + var status_2:String=Registry.inventory[Registry.IDX_WIDEN] ? "Widen":"-"; + var status_3:String=Registry.inventory[Registry.IDX_TRANSFORMER] ? "Swap":"-"; + + text_1.visible=true; + text_1.setText(normal_string+"\n\n\n"+status_1+"\n\n\n"+status_2+"\n\n\n"+status_3, true, 0, 0, "left", true); + text_1.x=equip_boxes.members[0].x + equip_boxes.members[0].width + 4; + text_1.y=30; + text_2.visible=text_3.visible=false; + break; + case 2://card + remove(cards, true);add(cards); + remove(selectors, true);add(selectors); + set_card_images(); + text_1.visible=true; + text_1.setText("1/4", true, 0, 0, "center", true); + text_1.x=99; + text_1.y=158; + text_2.visible=true; + text_2.setText(Registry.nr_growths.toString()+ " cards", true, 0, 0, "left", true); + text_2.x=70; + text_2.y=148; + text_3.visible=false; + cards_cursor_idx=0; + cur_cards_pg=0; + break; + case 3:// save + text_1.visible=true; + text_1.setText("Save\nSave and go\n to title\nSave and quit\nQuit game", true, 0, 0, "left", true); + text_1.text +="\n\n\n\nDeaths:" + Registry.death_count.toString(); + + text_1.x=69; + text_1.y=30; + text_2.visible=text_3.visible=false; + break; + case 4://settings + text_1.visible=text_3.visible=true; + var autosave_state:String=Registry.autosave_on ? "On":"Off"; + set_settings_text(true); + text_1.x=68; + text_1.y=30; + text_2.visible=false; + text_3.x=68; + text_3.y=120; + if(Intra.is_mobile)text_3.visible=false; + text_3.setText("Scaling:" + Intra.scale_factor.toString()+ "x",true,0,0,"left",true); + + remove(volume_bar_bg, true);add(volume_bar_bg); + remove(volume_bar, true);add(volume_bar); + remove(volume_bar_overlay, true);add(volume_bar_overlay); + remove(window_config, true);add(window_config); + remove(window_words, true);add(window_words); + break; + case 5:// SECRETS!!! + text_1.visible=text_2.visible=text_3.visible=false; + remove(trophies, true);add(trophies); + remove(selectors, true);add(selectors); + break; + case 6:// CHEATS!!! + break; + } + } + + if(Registry.keywatch.JP_DOWN){ + if(base_index20 && base_index !=6){ + current_substate_visible=false; + if(base_index==4){ + menu_select_active.y +=32; + } else { + menu_select_active.y +=16; + } + menu_select_inactive.y=menu_select_active.y; + base_index=6; + } + } + } + } else if(Registry.keywatch.JP_UP){ + if(base_index>0){ + current_substate_visible=false; + if(base_index==6 && false==Registry.GE_States[Registry.GE_HAVE_A_SECRET]){ + base_index=4; + menu_select_active.y -=32; + } else { + base_index--; + menu_select_active.y -=16; + } + menu_select_inactive.y=menu_select_active.y; + } + } + + /* State change to submenus, also change cursor animations and positions */ + if(Registry.keywatch.JP_ACTION_1 || Registry.keywatch.JP_RIGHT){ + menu_select_active.visible=false; + menu_select_inactive.visible=true; + + switch(base_index){ + case 0: + + if(Registry.GE_States[Registry.GE_ENTERED_NEXUS_ONCE]==false || is_crowd_minidungeon()){ + menu_select_active.visible=true; + menu_select_inactive.visible=false; + break; + } + state=s_map; + selectors.members[1].scale.x=1; + selectors.members[2].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=70; + selectors.members[1].y=135; + selectors.members[1].play("enabled"); + map_cursor_idx=1; + break; + case 1: + // If no items, equip submenu is inacessible. + if(!equip_icon.visible){ + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } else { + state=s_equip; + equip_cursor_idx=0; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=80; + selectors.members[1].y=30; + selectors.members[1].play("enabled"); + } + break; + case 2: + + //selectors.members[1].visible=selectors.members[2].visible=true; + selectors.members[1].x=text_1.x - 7; + selectors.members[1].y=text_1.y; + selectors.members[2].x=text_1.x + text_1.width; + selectors.members[2].y=text_1.y; + selectors.members[1].play("enabled"); + selectors.members[2].play("enabled"); + selectors.members[1].scale.x=-1; + selectors.members[2].scale.x=1; + + + cards_cursor_idx=0; + state=s_cards; + card_pg_to_cards(); + break; + case 3: + state=s_save; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=text_1.x - 8; + selectors.members[1].y=text_1.y; + selectors.members[1].play("enabled"); + save_cursor_idx=0; + break; + case 4: + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=text_1.x - 7; + selectors.members[1].y=text_1.y; + selectors.members[1].play("enabled"); + settings_cursor_idx=0; + state=s_settings; + break; + case 5: + //secretsx + state=s_secretz; + selectors.members[1].scale.x=1; + selectors.members[1].visible=true; + selectors.members[1].x=trophies.members[0].x - 7; + selectors.members[1].y=trophies.members[0].y + 4; + selectors.members[1].play("enabled"); + secretz_idx=0; + break; + case 6://cheatsz + state=s_cheatz; + break; + } + } + + + + } + + + + private function map_logic():Void { + + // Cancel + if(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JP_LEFT){ + // Return to browse, or + if(map_ctr==0){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + selectors.members[2].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + map_cursor_idx=1; + // Return to top-level of map submenu + } else if(!Registry.keywatch.JP_LEFT){ + selectors.members[2].visible=false; + selectors.members[1].play("enabled"); + map_cursor_idx=1; + map_ctr=0; + } + } + + // Select + if(Registry.keywatch.JP_ACTION_1){ + switch(map_ctr){ + // Go to yes/no context for return to entrance + case 0: + selectors.members[2].visible=true; + selectors.members[2].play("enabled"); + selectors.members[1].play("disabled"); + selectors.members[2].x=text_3.x - 6 + 45; + selectors.members[2].y=text_3.y; + text_3.visible=true; + map_ctr++; + + break; + // Eitehr go back, or switch maps + case 1: + if(map_cursor_idx==0){ + // switch state + Registry.cleanup_on_map_change(); + if(false==Registry.is_dungeon(Registry.CURRENT_MAP_NAME)){ // If not in a dungeon want 2 warp to nexus + if(Registry.CURRENT_MAP_NAME=="BLANK" || Registry.CURRENT_MAP_NAME=="DRAWER" || Registry.CURRENT_MAP_NAME=="NEXUS"){ + Registry.NEXT_MAP_NAME="NEXUS"; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES["NEXUS"].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES["NEXUS"].y; + } else { + NPC.load_nexus_data(); + } + } else { + Registry.NEXT_MAP_NAME=Registry.CURRENT_MAP_NAME; + Registry.ENTRANCE_PLAYER_X=Registry.DUNGEON_ENTRANCES[Registry.CURRENT_MAP_NAME].x; + Registry.ENTRANCE_PLAYER_Y=Registry.DUNGEON_ENTRANCES[Registry.CURRENT_MAP_NAME].y; + } + //FlxG.switchState(new PlayState); + Registry.BOI=false; + parent.SWITCH_MAPS=true; + Registry.sound_data.start_song_from_title(Registry.NEXT_MAP_NAME); + reset_counters(); + done=true; + } else { + selectors.members[1].play("enabled"); + selectors.members[2].visible=false; + map_cursor_idx=1; + map_ctr=0; + } + break; + } + } + + // Deal with/left right for yes/no context + if(map_ctr==1){ + if(Registry.keywatch.JP_RIGHT && map_cursor_idx<1){ + map_cursor_idx++; + selectors.members[2].x +=47; + } else if(Registry.keywatch.JP_LEFT && map_cursor_idx>0){ + map_cursor_idx--; + selectors.members[2].x -=47; + } + } + } + private function equip_logic():Void { + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && equip_cursor_idx<=10)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + if(Registry.keywatch.JP_DOWN){ + if(equip_cursor_idx<3){ + equip_cursor_idx++; + selectors.members[1].y +=24; + } else if(equip_cursor_idx==3){ + equip_cursor_idx=10; + + if(Registry.inventory[Registry.IDX_JUMP]){ + selectors.members[1].y=jump_shoes.y; + selectors.members[1].x=jump_shoes.x - 3; + } else if(Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX]){ + selectors.members[1].y=trade_item.y; + selectors.members[1].x=trade_item.x - 3; + equip_cursor_idx=11; + } else { + selectors.members[1].y=key_icons.members[0].y; + selectors.members[1].x=key_icons.members[0].x - 3; + equip_cursor_idx=12; + } + + } + } else if(Registry.keywatch.JP_UP){ + if(equip_cursor_idx>0){ + if(equip_cursor_idx>=10){ + selectors.members[1].y=102; + selectors.members[1].x=80; + equip_cursor_idx=3; + } else { + equip_cursor_idx--; + selectors.members[1].y -=24; + } + } + } + + if(Registry.keywatch.JP_RIGHT){ + if(equip_cursor_idx<14){ + if(equip_cursor_idx==10){ + if(!(Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX])){ + equip_cursor_idx=12; + } else { + equip_cursor_idx=11; + } + } else { + equip_cursor_idx++; + } + } + // oh my goddd + } else if(Registry.keywatch.JP_LEFT){ + if(equip_cursor_idx>10){ + if(equip_cursor_idx==11){ + if(Registry.inventory[Registry.IDX_JUMP]){ + equip_cursor_idx=10; + } + } else { + if(equip_cursor_idx==12){ + if((Registry.inventory[Registry.IDX_BIKE_SHOES] || Registry.inventory[Registry.IDX_BOX])){ + equip_cursor_idx=11; + } else if(Registry.inventory[Registry.IDX_JUMP]){ + equip_cursor_idx=10; + } + } else { + equip_cursor_idx--; + } + } + } + } + + if(Registry.keywatch.JP_LEFT || Registry.keywatch.JP_RIGHT){ + if(equip_cursor_idx==10){ + selectors.members[1].y=jump_shoes.y; + selectors.members[1].x=jump_shoes.x - 3; + } else if(equip_cursor_idx==11){ + selectors.members[1].y=trade_item.y; + selectors.members[1].x=trade_item.x - 3; + } else if(equip_cursor_idx>11){ + selectors.members[1].y=key_icons.members[equip_cursor_idx - 12].y; + selectors.members[1].x=key_icons.members[equip_cursor_idx - 12].x - 3; + } + } + + if(Registry.keywatch.JP_ACTION_1){ + + switch(equip_cursor_idx){ + case 0: + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + set_passive_effect(Registry.IDX_BROOM); + + equip_icon.y=equip_boxes.members[0].y - 1; + break; + case 1: + if(Registry.inventory[Registry.IDX_LENGTHEN]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + if(Registry.bound_effect !=Registry.item_names[Registry.IDX_LENGTHEN]){ + set_passive_effect(Registry.IDX_LENGTHEN); + } + equip_icon.y=equip_boxes.members[0].y - 1 + 24; + } + break; + case 2: + if(Registry.inventory[Registry.IDX_WIDEN]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_BROOM]; + if(Registry.bound_effect !=Registry.item_names[Registry.IDX_WIDEN]){ + set_passive_effect(Registry.IDX_WIDEN); + } + equip_icon.y=equip_boxes.members[0].y - 1 + 24*2; + } + break; + case 3: + if(Registry.inventory[Registry.IDX_TRANSFORMER]){ + Registry.bound_item_1=Registry.item_names[Registry.IDX_TRANSFORMER]; + set_passive_effect(Registry.IDX_BROOM);// Remove the passive effect + equip_icon.y=equip_boxes.members[0].y - 1 + 24*3; + } + break; + case 10: + DH.dialogue_popup("A pair of spring-loaded shoes - press "+Registry.controls[Keys.IDX_ACTION_2]+" to jump!"); + break; + case 11: + if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + DH.dialogue_popup("A pair of shoes for biking."); + } else { + DH.dialogue_popup("An empty cardboard box."); + } + break; + case 12: + if(Registry.inventory[Registry.IDX_GREEN_KEY]) + DH.dialogue_popup("A key found in the Temple of the Seeing One."); + break; + case 13: + if(Registry.inventory[Registry.IDX_RED_KEY]) + DH.dialogue_popup("A key found in a red, underground cave."); + break; + case 14: + if(Registry.inventory[Registry.IDX_BLUE_KEY]) + DH.dialogue_popup("A key found in a mountain cave."); + break; + } + + if(equip_cursor_idx<4){ + if(Registry.bound_item_1=="TRANSFORMER" || Registry.bound_item_2=="TRANSFORMER"){ + Registry.E_Transformer_On=true; + } else { + Registry.E_Transformer_Off=true; + } + + + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + current_substate_visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + //set_placeholder_image(1); + } + + } + + // The locations of the cards, so we can map them to proper images when opening a chest. + // Dungeon x/y vals are the room, roamstates are the actual coordinates in DAME-coords(so no y-offset of 20) + public static var card_data:Dynamic={ + "BLANK":new Array({ id:44, x:5, y:1 }), + "DRAWER":new Array({id:36, x:2, y:1}, {id:37, x:4, y:7}), + "OVERWORLD":new Array({ id:0, x:1, y:9 } , {id:1, x:5, y:7}), + "BEDROOM":new Array({ id:2, x:3, y:0 }, { id:3, x:1, y:0 }, { id:4, x:2, y:3 }, { id:5, x:5, y:0 }), + "SUBURB":new Array({ id:6 , x:1, y:7 } , {id:42, x:2 , y:7}), + "APARTMENT":new Array({ id:7, x:8, y:7 }, { id:8, x:3, y:5 }, { id:9, x:0, y:0 }), + "FIELDS":new Array({ id:10, x:3, y:8}, {id:11, x:6, y:9}, {id:43, x:8, y:0}, {id:45,x:11,y:9}), + "WINDMILL":new Array({id:12, x:1, y:5}), + "FOREST":new Array({id:13, x:3, y:2}), + "CLIFF":new Array({ id:14, x:4, y:2 }, { id:15, x:2, y:7}), + "BEACH":new Array({ id:16, x:4, y:3 }), + "REDSEA":new Array({ id:17, x:2, y:2}, {id:47, x:0,y:6}), + "REDCAVE":new Array({ id:18, x:3 , y:1 } , { id:19, x:0, y:0 }, { id:20, x:6, y:1 }), + "TRAIN":new Array({ id:21, x:0 , y:0 } , {id:40, x:5, y:8}), // CELL + "CIRCUS":new Array({ id:23, x:0 , y:3 }, { id:22, x:3, y:6 } , { id:24, x:3, y:2 }, { id:25, x:7, y:0 }), + "CROWD":new Array({id:26, x:2 , y:2} , {id:27, x:8, y:2} , {id:28 , x:9, y:5 }), + "SPACE":new Array({ id:29, x:0, y:0} , {id:30, x:9,y:0}, {id:41, x:5, y:7}), + "HOTEL":new Array({ id:31, x:3, y:6 }, { id:32, x:1, y:8 }, { id:33, x:9, y:3 } , { id:34, x:8, y:11 } , {id:38, x:5, y:0}), + "TERMINAL":new Array({ id:35, x:4, y:2 }), + "DEBUG":new Array({ id:39, x:4, y:3 }), + "STREET":new Array({id:46, x:1, y:6}) + + }; + + private function cards_logic():Void { + + // Exit card select, or exit card submenu + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && cur_cards_pg==0 &&(cards_cursor_idx % 3==0))){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[3].visible=false; + selectors.members[1].visible=selectors.members[2].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + //cur_cards_pg=0; + //cards_cursor_idx=0; + } + + + + // Move about card select, or move between pages + if(selectors.members[3].visible){ //if card select + if((cards_cursor_idx % 12)>2 && Registry.keywatch.JP_UP){ + cards_cursor_idx -=3; + selectors.members[3].y -=29; + } else if((cards_cursor_idx % 12)<9 && Registry.keywatch.JP_DOWN){ + cards_cursor_idx +=3; + selectors.members[3].y +=29; + } else if(Registry.keywatch.JP_DOWN){ + selectors.members[3].visible=false; + selectors.members[1].visible=true; + selectors.members[2].visible=true; + selectors.members[1].play("enabled"); + selectors.members[2].play("enabled"); + } + + if((cards_cursor_idx % 3)<2 && Registry.keywatch.JP_RIGHT){ + cards_cursor_idx ++; + selectors.members[3].x +=30; + } else if((cards_cursor_idx % 3)>0 && Registry.keywatch.JP_LEFT){ + cards_cursor_idx --; + selectors.members[3].x -=30; + } else if((cards_cursor_idx % 3)==0 && Registry.keywatch.JP_LEFT){ + if(cur_cards_pg>0){ + cur_cards_pg --; + cards_cursor_idx +=2; + selectors.members[3].x +=60; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4"; + } else { + text_1.text="1/4"; + } + } + } else if((cards_cursor_idx % 3)==2 && Registry.keywatch.JP_RIGHT){ + if(cur_cards_pg<3){ + cur_cards_pg ++; + cards_cursor_idx -=2; + selectors.members[3].x -=60; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4" + } else { + text_1.text="4/4"; + } + } + } + } else { + if(cur_cards_pg<3 && Registry.keywatch.JP_RIGHT){ + cur_cards_pg++; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4" + } else { + text_1.text="4/4"; + } + //Load new sprites.... + } else if(cur_cards_pg>0 && Registry.keywatch.JP_LEFT){ + cur_cards_pg--; + set_card_images(); + if(cur_cards_pg==1){ + text_1.text="2/4"; + } else if(cur_cards_pg==2){ + text_1.text="3/4"; + } else { + text_1.text="1/4"; + } + //load new sprites... + } + if(Registry.keywatch.JP_UP){ + card_pg_to_cards(); + } + } + + // Go to card select or do something with a single card + if(Registry.keywatch.JP_ACTION_1){ + if(selectors.members[3].visible){ + var idx:Int=cards_cursor_idx + cur_cards_pg * 12; + if(Registry.card_states[idx]){ + DH.start_dialogue(DH.name_card, DH.scene_card_one, DH.area_etc, idx); + } + // Do something + } else { // Go to card select + card_pg_to_cards(); + } + } + } + private function save_logic():Void { + if(Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + + if(Registry.keywatch.JP_DOWN){ + if(save_cursor_idx<3){ + save_cursor_idx++; + if(save_cursor_idx==2){ + selectors.members[1].y +=16; + } else { + selectors.members[1].y +=8; + } + } + } else if(Registry.keywatch.JP_UP){ + if(save_cursor_idx>0){ + save_cursor_idx--; + if(save_cursor_idx==1){ + selectors.members[1].y -=16; + } else { + selectors.members[1].y -=8; + } + } + } + + if(Registry.keywatch.JP_ACTION_1){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + switch(save_cursor_idx){ + case 0: + if(Save.save()){ + text_1.text="Saved!\nSave and go\n to title\nSave and quit\nQuit game"; + text_1.text +="\n\n\n\nDeaths:" + Registry.death_count.toString(); + } else { + text_1.text="ERROR\nSave and go\n to title\nSave and quit\nQuit game"; + text_1.text +="\n\n\n\nDeaths:" + Registry.death_count.toString(); + } + break; + case 1: + Registry.cleanup_on_map_change(); + Registry.sound_data.stop_current_song(); + Save.save(); + FlxG.switchState(new TitleState); + break; + case 2: + Save.save(); + //NativeApplication.nativeApplication.exit(); + break; + case 3: + //NativeApplication.nativeApplication.exit(); + break; + + } + } + + } + + private function settings_logic():Void { + + if(ctr_settings==0){ + if(Registry.keywatch.JP_ACTION_2 ||(Registry.keywatch.JP_LEFT && !selectors.members[2].visible)){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + selectors.members[1].visible=false; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + } + if(Registry.keywatch.JP_DOWN){ + if(settings_cursor_idx<5){ + settings_cursor_idx ++; + if(settings_cursor_idx==2){ + selectors.members[1].y +=24; + } else if(settings_cursor_idx==3){ + selectors.members[1].y +=32; + if(Intra.is_mobile){ + selectors.members[1].y +=32; + settings_cursor_idx=5; + } + } else { + selectors.members[1].y +=16; + } + } + } else if(Registry.keywatch.JP_UP){ + if(settings_cursor_idx>0){ + settings_cursor_idx --; + if(settings_cursor_idx==1){ + selectors.members[1].y -=24; + } else if(settings_cursor_idx==2){ + selectors.members[1].y -=32; + } else if(settings_cursor_idx==4 && Intra.is_mobile){ + selectors.members[1].y -=64; + settings_cursor_idx=2; + } else { + selectors.members[1].y -=16; + } + } + } + + if(Registry.keywatch.JP_ACTION_1){ + if(settings_cursor_idx==0){ + // Goto controls + if(!Intra.is_mobile){ + ctr_settings=1; + controls_state.push(this); + // If mobile, just flip X/C functions + } else { + var gam:Intra=FlxG._game as Intra; + gam.mobile_flip_x_c(); + } + } else if(settings_cursor_idx==1){ // goto volume + ctr_settings=2; + selectors.members[1].play("disabled"); + selectors.members[2].play("enabled"); + selectors.members[3].play("enabled"); + selectors.members[2].visible=selectors.members[3].visible=true; + selectors.members[2].scale.x=-1; + selectors.members[2].x=selectors.members[1].x;selectors.members[2].y=58; + selectors.members[3].x=138;selectors.members[3].y=58; + + } else if(settings_cursor_idx==2){ + Registry.autosave_on=!Registry.autosave_on; + set_settings_text(true); + + } else if(settings_cursor_idx==3){ // Change resize type + Intra.force_scale=true; + set_settings_text(); + + } else if(settings_cursor_idx==4){ // Change Integer scaling + ctr_settings=3; + selectors.members[1].play("disabled"); + selectors.members[2].play("enabled"); + selectors.members[3].play("enabled"); + selectors.members[1].visible=false; + selectors.members[2].visible=selectors.members[3].visible=true; + selectors.members[2].scale.x=-1; + selectors.members[2].x=selectors.members[1].x + 58;selectors.members[2].y=120; + selectors.members[3].x=147;selectors.members[3].y=120; + + } else if(settings_cursor_idx==5){ //window size config + if(Intra.is_mobile){ + var _gam:Intra=FlxG._game as Intra; + _gam.mobile_flip_handedness(); + } else if(false==Intra.is_web){ + ctr_settings=4; + Intra.scale_factor=3; + Intra.force_scale=true; + window_words.visible=window_config.visible=true; + } + } + } + } else if(ctr_settings==1){ //controls + controls_state.update(); + if(!controls_state.updating &&(Registry.keywatch.JUST_PRESSED_PAUSE || FlxG.keys.justPressed("ESCAPE"))){ + controls_state.pop(this); + ctr_settings=0; + text_info.text=Registry.controls[Keys.IDX_ACTION_1] + ":Select " + Registry.controls[Keys.IDX_ACTION_2] + ":Back"; + } + } else if(ctr_settings==2){ //volume + if(Registry.keywatch.JP_ACTION_2){ + selectors.members[1].play("enabled"); + ctr_settings=0; + selectors.members[2].visible=selectors.members[3].visible=false; + selectors.members[2].scale.x=1; + } + + if(Registry.keywatch.JP_LEFT){ + FlxG.volume>0 ? FlxG.volume -=0.1:1; + } else if(Registry.keywatch.JP_RIGHT){ + FlxG.volume<1 ? FlxG.volume +=0.1:1; + } + + + //text_2.setText(int(FlxG.volume * 10).toString()); + volume_bar.scale.x=Std.int(FlxG.volume * 30); + volume_bar.x=volume_bar_overlay.x + volume_bar.scale.x -1; + } else if(ctr_settings==3){ // Integer scaling + if(Registry.keywatch.JP_ACTION_2){ + selectors.members[1].play("enabled"); + ctr_settings=0; + selectors.members[1].visible=true + selectors.members[2].visible=selectors.members[3].visible=false; + selectors.members[2].scale.x=1; + } + + + text_3.setText("Scaling:" + Intra.scale_factor.toString()+ "x",true,0,0,"left",true); + + if(Registry.keywatch.JP_LEFT){ + if(Intra.scale_factor>1){ + Intra.scale_factor--; + Intra.scale_ctr=(Intra.scale_ctr - 1)% 3; + Intra.force_scale=true; + } + } else if(Registry.keywatch.JP_RIGHT){ + // See if we can scale further + var ratio:Float=(Intra.scale_factor + 1)/ 3; + if(FlxG._game.stage.fullScreenHeight=new Array( + "You’re rolling in it!", + "Once the property of a famous Bubble Mage.", + "If your graphics become scrambled, look at the pokedex entry of an official Pokemon.", + "This heart has no name.", + "Please visit the electric monsters' world.", + "A kitty statue. Cute, but useless.", + "Oh my!!!!", + "Oh no!!!!", + "It's black.", + "It's red.", + "It's green.", + "It's blue.", + "It's white." + ); + private function secretz_logic():Void { + if(Registry.keywatch.JP_ACTION_2){ + Registry.sound_data.play_sound_group(Registry.sound_data.menu_select_group); + state=s_browse; + secretz_idx=0; + menu_select_active.visible=true; + menu_select_inactive.visible=false; + selectors.members[1].visible=false; + } + + if(Registry.keywatch.JP_RIGHT &&(secretz_idx % 4)<3){ + selectors.members[1].x +=24; + secretz_idx ++; + } else if(Registry.keywatch.JP_LEFT &&(secretz_idx % 4)>0){ + selectors.members[1].x -=24; + secretz_idx --; + } + + if(Registry.keywatch.JP_DOWN && Std.int(secretz_idx / 4)<3){ + selectors.members[1].y +=20; + secretz_idx +=4; + } else if(Registry.keywatch.JP_UP && Std.int(secretz_idx / 4)>0){ + selectors.members[1].y -=20; + secretz_idx -=4; + } + + if(Registry.keywatch.JP_ACTION_1){ + if(trophies.members.length - 1>=secretz_idx && trophies.members[secretz_idx].visible){ + DH.dialogue_popup(secretz_wordz[secretz_idx]); + } + } + } + + private function set_passive_effect(selector_index:Int):Void + { + var p:Dynamic=parent; + if(selector_index==Registry.IDX_WIDEN){ + // bound_effect ripples over to the state of the broom + if(Registry.bound_effect==Registry.item_names[Registry.IDX_WIDEN]){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } else { + Registry.bound_effect=Registry.item_names[Registry.IDX_WIDEN]; + p.player.action_latency_max=Player.WATK_DELAY; + } + } else if(selector_index==Registry.IDX_LENGTHEN){ + // bound_effect ripples over to the state of the broom + if(Registry.bound_effect==Registry.item_names[Registry.IDX_LENGTHEN]){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } else { + Registry.bound_effect=Registry.item_names[Registry.IDX_LENGTHEN]; + p.player.action_latency_max=Player.LATK_DELAY; + } + } else if(selector_index==Registry.IDX_BROOM){ + Registry.bound_effect="none";//de-equip the effect + p.player.action_latency_max=Player.ATK_DELAY; + } + } + + private function set_card_images():Void + { + for(card_page_idx in 0...12){ + if(1==Registry.card_states[card_page_idx + cur_cards_pg * 12]){ + trace(card_page_idx + cur_cards_pg * 12); + cards.members[card_page_idx].frame=card_page_idx + cur_cards_pg * 12; + } else { + cards.members[card_page_idx].frame=49; + } + } + } + + private function set_key_graphics():Void + { + //not working + for(i in 0...3){ + var key:FlxSprite=key_icons.members[i]; + key.loadGraphic(NPC.key_green_embed, true, false, 16, 16); + switch(i){ + case 0:if(Registry.inventory[Registry.IDX_GREEN_KEY]){ + key.frame=0; + } else { + key.frame=1; + } + break; + case 1:if(Registry.inventory[Registry.IDX_RED_KEY]){ + key.frame=2; + } else { + key.frame=3; + } + break; + case 2:if(Registry.inventory[Registry.IDX_BLUE_KEY]){ + key.frame=4; + } else { + key.frame=5; + } + break; + } + } + } + + private function check_for_exit_with(condition:Bool):Void + { + if(condition){ + if(exit_latency<0){ + done=true; + exit_latency=0.5; + current_substate_visible=false; + Registry.GAMESTATE.player.no_jump_ticks=7; + reset_counters(); + menu_select_active.visible=true; + menu_select_inactive.visible=false; + window_words.visible=window_config.visible=false; + } + } else { + if(exit_latency>0){ + exit_latency -=FlxG.elapsed; + } + } + } + + private function reset_counters():Void { + + state=s_browse; + ctr_settings=0; + map_ctr=0; + map_cursor_idx=save_cursor_idx=settings_cursor_idx=equip_cursor_idx=equip_cursor_idx=0; + doing_window_config=false; + + } + + private function dialogue_logic():Void + { + Registry.GAMESTATE.dialogue_state.update(); + if(t_d>tm_d){ + if(Registry.GAMESTATE.dialogue_state.is_finished &&(Registry.keywatch.JP_ACTION_2 || Registry.keywatch.JP_ACTION_1)){ + t_d=0; + Registry.GAMESTATE.dialogue_state.reset(); + if(equip_cursor_idx>=10){ + state=s_equip; + } else if(base_index==5){ + state=s_secretz; + } else { + state=s_cards;// mayneed to change later + } + Registry.GAMESTATE.dialogue_state.pop(this as FlxState); + DH.dont_need_recently_finished(); + } + } else { + t_d +=FlxG.elapsed; + } + } + + private function get_resolution_string(is_init:Bool=false):String { + + if(Intra.is_mobile)return " "; + if(is_init){ + Intra.scale_ctr--; + } + var res:String="Windowed"; + switch(Intra.scale_ctr){ + case 1: + res="Int. Scaled"; + break; + case 2: + res="Fit Scaled"; + break; + case 0: + res="Windowed"; + break; + } + if(is_init){ + Intra.scale_ctr++; + } + return res; + } + private function set_settings_text(is_init:Bool=false):Void { + var autosave_state:String=Registry.autosave_on ? "On":"Off"; + var first:String=Intra.is_mobile ? "Flip actions":"Set controls"; + var last:String=Intra.is_mobile ? "Flip controls":"Resize window"; + var res:String=Intra.is_mobile ? "\n\n\n":"\n\nResolution:\n "; + if(is_init){ + text_1.setText(first+"\n\nSet volume\n\n\nAutosave at\ncheckpoints:\n " + autosave_state + res + get_resolution_string(true)+"\n\n\n"+last, true, 0, 0, "left", true); + } else { + text_1.setText(first+"\n\nSet volume\n\n\nAutosave at\ncheckpoints:\n " + autosave_state + res + get_resolution_string()+"\n\n\n"+last, true, 0, 0, "left", true); + } + } + + private function set_trade_item():Void { + trade_item.visible=true; + if(Registry.inventory[Registry.IDX_BOX]){ + trade_item.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + trade_item.frame=31; + } else if(Registry.inventory[Registry.IDX_BIKE_SHOES]){ + trade_item.loadGraphic(Trade_NPC.embed_dame_trade_npc, true, false, 16, 16); + trade_item.frame=56; + } else { + trade_item.visible=false; + } + } + + private function set_trophy_vis(_trophies:FlxGroup, idx:Int):Void { + _trophies.members[idx].visible=false; + //_trophies.members[idx].visible=true; + switch(idx){ + case 0: + if(Registry.inventory[Registry.IDX_POO])_trophies.members[idx].visible=true; + break; + case 1: + if(Registry.inventory[Registry.IDX_SPAM])_trophies.members[idx].visible=true; + break; + case 2: + if(Registry.inventory[Registry.IDX_MISSINGNO])_trophies.members[idx].visible=true; + break; + case 3: + if(Registry.inventory[Registry.IDX_AUS_HEART])_trophies.members[idx].visible=true; + break; + case 4: + if(Registry.inventory[Registry.IDX_ELECTRIC])_trophies.members[idx].visible=true; + break; + case 5: + if(Registry.inventory[Registry.IDX_KITTY])_trophies.members[idx].visible=true; + break; + case 6: + if(Registry.inventory[Registry.IDX_MELOS])_trophies.members[idx].visible=true; + break; + case 7: + if(Registry.inventory[Registry.IDX_MARINA])_trophies.members[idx].visible=true; + break; + case 8: + if(Registry.inventory[Registry.IDX_BLACK])_trophies.members[idx].visible=true; + break; + case 9: + if(Registry.inventory[Registry.IDX_RED])_trophies.members[idx].visible=true; + break; + case 10: + if(Registry.inventory[Registry.IDX_GREEN])_trophies.members[idx].visible=true; + break; + case 11: + if(Registry.inventory[Registry.IDX_BLUE])_trophies.members[idx].visible=true; + break; + case 12: + if(Registry.inventory[Registry.IDX_WHITE])_trophies.members[idx].visible=true; + break; + + + } + } + + private function is_crowd_minidungeon():Bool { + return(Registry.CURRENT_MAP_NAME=="CROWD" && + ( + (Registry.CURRENT_GRID_X>=4 && Registry.CURRENT_GRID_X<=7 && Registry.CURRENT_GRID_Y==7)|| + (Registry.CURRENT_GRID_X==7 && Registry.CURRENT_GRID_Y==6) + ) + ); + } + private function card_pg_to_cards():Void + { + selectors.members[3].visible=true; + selectors.members[2].visible=false; + selectors.members[1].visible=false; + selectors.members[3].play("enabled"); + selectors.members[2].play("disabled"); + selectors.members[1].play("disabled"); + selectors.members[3].x=cards.members[0].x - 10 +((cards_cursor_idx % 3)* 30); + selectors.members[3].y=cards.members[0].y + 10 +(int(cards_cursor_idx / 3)* 29); + } +} \ No newline at end of file diff --git a/intra/source/xml/Intra.xml b/intra/source/xml/Intra.xml new file mode 100644 index 0000000..cf830da --- /dev/null +++ b/intra/source/xml/Intra.xml @@ -0,0 +1,3210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +