Last active
August 26, 2017 20:35
-
-
Save Sunjammer/639d32037134da9d57bbb93a07a48f16 to your computer and use it in GitHub Desktop.
CroissantScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8" ?> | |
<data> | |
<level name="Let's fly a Croissant!"> | |
<setup> <!-- Level pre-init, setting up background graphics in this case --> | |
<background> | |
<texture>assets/data/backgrounds/bg_space2.png</texture> | |
<blendmode>NORMAL</blendmode> | |
<distortion>10</distortion> <!-- a sine*sine vertex distortion effect measured in pixels --> | |
<scale>1.28</scale> | |
<scrolling> <!-- Constant scroll rate --> | |
<x>0.02</x> | |
<y>0</y> | |
</scrolling> | |
</background> | |
<foreground> | |
<texture>assets/data/backgrounds/cloud2.png</texture> | |
<blendmode>ADD</blendmode> | |
<distortion>0</distortion> | |
<scale>1.0</scale> | |
<scrolling> | |
<x>0.1</x> | |
<y>0</y> | |
</scrolling> | |
</foreground> | |
</setup> | |
<!-- Variables available to the whole level --> | |
<variables> | |
<random type="float">0</random> | |
<challengecomplete type="bool">false</challengecomplete> | |
<nextblockname type="string">foo</nextblockname> | |
<playermovearea type="float">0</playermovearea> | |
<prevx type="float">0</prevx> | |
<prevy type="float">0</prevy> | |
<grazetime type="float">0</grazetime> | |
<flag type="bool">false</flag> | |
<count type="int">0</count> | |
<painmessages type="int">0</painmessages> | |
<playerstate type="dynamic"></playerstate> | |
</variables> | |
<!-- Listen for and respond to events from the engine here --> | |
<callbacks> | |
<onplayerhit> | |
count++; | |
game.camera.rumble(15,1); | |
var rand = Math.random(); | |
if(painmessages == 0) | |
{ | |
if(rand>0.5) {spawnText("Oof!");} else {spawnText("Argh!");} | |
painmessages++; | |
} | |
</onplayerhit> | |
</callbacks> | |
<onstart> | |
playerstate = player.getPlayerState(); | |
player.clearPlayerState(); | |
random = Math.random(); | |
player.invincible = true; | |
goto("start"); | |
</onstart> | |
<onupdate interval="1"></onupdate> | |
<oncomplete> | |
player.restorePlayerState(playerState); | |
</oncomplete> | |
<!-- Blocks are level states --> | |
<blocks> | |
<block id="start"> | |
<!-- Block begin --> | |
<onstart> | |
player.transform.x = -120; | |
</onstart> | |
<!-- Block gameloop, default does nothing --> | |
<onupdate interval="1">default</onupdate> | |
<!-- Runs when the block is exited or runs out of events --> | |
<oncomplete> | |
<!-- When the timeline has played, check if the player has played before and step accordingly --> | |
if(playCount == 0) { goto("intro1"); } else { goto("intro2"); } | |
</oncomplete> | |
<!-- block event timeline in seconds --> | |
<events> | |
<event time="0.5" type="weaponcontrol"> | |
<command>stopfiring</command> | |
</event> | |
<event time="0.1" type="script"> | |
movePlayer(200,400,1.5,"out",true,true); | |
player.barrelRoll(); | |
</event> | |
<event time="0.2" type="music"> | |
<song>assets/data/audio/music/acid.mp3</song> | |
<transition>cut</transition> | |
</event> | |
</events> | |
</block> | |
<!-- The player is new --> | |
<block id="intro1"> | |
<onstart></onstart> | |
<onupdate interval="0.1">default</onupdate> | |
<oncomplete>goto("intro3");</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>It's time to learn the art of\self defense.</message> | |
<message>When they come for you, you\must be ready.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- The player has done the tutorial before --> | |
<block id="intro2"> | |
<onstart></onstart> | |
<onupdate interval="0.1">default</onupdate> | |
<oncomplete>goto("intro3");</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Ah, you return!\Good, school's never out for\the wise croissant.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="intro3"> | |
<onstart>random = Math.random()</onstart> | |
<onupdate interval="0.1">default</onupdate> | |
<!-- A default oncomplete just goes to the next block in sequence --> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue" condition="random <= 0.25"> | |
<from>C. FIGHTER</from> | |
<message>Yes uncle Toast.</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0" type="dialogue" condition="random < 0.5 && random > 0.25"> | |
<from>C. FIGHTER</from> | |
<message>I worry that my technique\is not yet truly awesome.</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0" type="dialogue" condition="random >= 0.5 && random < 0.75"> | |
<from>C. FIGHTER</from> | |
<message>I've meditated on my abilities.\They are a bit ****.</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0" type="dialogue" condition="random >= 0.75"> | |
<from>C. FIGHTER</from> | |
<message>My knowledge center is parched.\</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- Movement --> | |
<block id="movements"> | |
<onstart> | |
flag = false; | |
challengecomplete = false; | |
prevx = player.transform.x; | |
prevy = player.transform.y; | |
</onstart> | |
<onupdate interval="0.1"> | |
var diffx = player.transform.x-prevx; | |
var diffy = player.transform.y-prevy; | |
playermovearea += Math.sqrt(diffx*diffx+diffy*diffy); | |
if(playermovearea>3000&&flag!=true){ | |
flag = true; | |
spawnText("Wohoo!"); | |
} | |
challengecomplete = playermovearea>6000; | |
if(challengecomplete && remainingEvents==0) exitBlock(); | |
</onupdate> | |
<oncomplete> | |
nextblockname = "bullets"; | |
goto("challengecomplete"); | |
</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Touch the screen and drag to\move. You can drag from\anywhere you like.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- bullets and hitboxes --> | |
<block id="bullets"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Let's talk bullets.\Bullets are nasty buggers</message> | |
<message>To stay alive, you must\dodge them. Dodge these!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="bullets_challenge"> | |
<onstart>count = 0; player.invincible = true;</onstart> | |
<onupdate interval="0.25"> | |
if(isScreenSafe() && remainingEvents==0) exitBlock(); | |
if(painmessages != 0) {painmessages--;} | |
</onupdate> | |
<oncomplete> | |
if(count==0){ | |
nextblockname = "grazing"; | |
goto("challengecomplete"); | |
}else{ | |
goto("challengefailed"); | |
} | |
</oncomplete> | |
<events> | |
<event time="0" type="spawnenemy"> | |
<id>bulletsource_dodge</id> | |
<x>960</x> | |
<y>400</y> | |
</event> | |
</events> | |
</block> | |
<!-- grazing --> | |
<block id="grazing"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Did you notice the aura?</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.1" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>That red-then-yellow round\thing that appeared?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.2" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Yes my boy. The *AURA*</message> | |
<message>When you are in imminent\danger, your aura grows.</message> | |
<message>When it turns yellow, you are\in the danger zone.</message> | |
<message>One might say you are *ZONED*</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.3" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>*ZONED* you say...\What happens when I'm Zoned?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.4" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Something... Wonderful.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>5</writespeed> | |
</event> | |
<event time="0.5" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>...ok?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>8</writespeed> | |
</event> | |
<event time="0.6" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>I'm going to throw some\more skeets at you.</message> | |
<message>Try staying in the zone\for at least 5 seconds.\Don't get hit!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="grazing_challenge"> | |
<onstart> | |
count = 0; | |
player.maxZoneTime = 0; | |
challengecomplete = false; | |
</onstart> | |
<onupdate interval="1"> | |
if(player.zoneTime>0){ | |
spawnText(Math.floor(player.zoneTime)); | |
} | |
if(isScreenSafe() && remainingEvents==0) exitBlock(); | |
</onupdate> | |
<oncomplete> | |
if(count==0 && player.maxZoneTime>=5){ | |
nextblockname = "shooting"; | |
goto("challengecomplete"); | |
}else{ | |
goto("challengefailed"); | |
} | |
</oncomplete> | |
<events> | |
<event time="0" type="spawnenemy"> | |
<id>bulletsource_graze</id> | |
<x>960</x> | |
<y>400</y> | |
</event> | |
</events> | |
</block> | |
<!-- shooting --> | |
<block id="shooting"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>Whew! That's a lot of work!\Is it really worth it?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.1" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Patience boy!\All in due time!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>5</loudness> | |
<writespeed>2</writespeed> | |
</event> | |
<event time="0.2" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>Fine fine. What's next?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.3" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Blowing things to bits!</message> | |
<message>Catch!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="powerups_challenge"> | |
<onstart></onstart> | |
<onupdate interval="0.2"> | |
if(player.weaponManager.weapon!=null){ | |
exitBlock(); | |
} | |
</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="script"> | |
gameWorld.spawnExplosion(650,400,1); | |
gameWorld.spawnPowerup(650,400,"peanuts",0,0).transform.vx = 0; | |
</event> | |
</events> | |
</block> | |
<block id="shooting2"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>Got it! Now what?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.35" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Weapons armed!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.38" type="script"> | |
game.camera.rumble(20,1); | |
player.invincible = true; | |
</event> | |
<event time="0.38" type="weaponcontrol"> | |
<command>beginfiring</command> | |
</event> | |
<event time="0.4" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>Whoa!</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.5" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>The old rat-a-tat tat of\rapid-fire peanuts.\Saved my life a hundred times!</message> | |
<message>Time to clean out the old shed!\Wax on wax off!\Don't hurt yourself now!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="shooting_challenge"> | |
<onstart>count = 0;</onstart> | |
<onupdate interval="1">if(isScreenSafe() && remainingEvents==0) exitBlock();</onupdate> | |
<oncomplete> | |
if(count==0){ | |
nextblockname = "alldone"; | |
goto("challengecomplete"); | |
}else{ | |
goto("failshooting"); | |
} | |
</oncomplete> | |
<events> | |
<event time="0.1" type="spawnenemy" multiplier="30" multidelay="0.3"> | |
<id>mushrooms</id> | |
<x>980</x> | |
<y>400</y> | |
<pathname>mandelbrot.txt</pathname> | |
<pathspeed>1.25</pathspeed> | |
</event> | |
</events> | |
</block> | |
<block id="shooting2"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>goto("alldone");</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Good riddance. That old\junk has been making my\horse collection look bad.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.1" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>And these peanuts, they\just keep doing this?\Just shooting forever?</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.2" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Of course! What good is a\weapon that doesn't fire?</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.3" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>Of course.. Silly me.</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- Book-keeping --> | |
<block id="challengefailed"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>prevBlock();</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>NOPE!\Try that again.</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="challengecomplete"> | |
<onstart>increaseScore(1);</onstart> | |
<onupdate interval="1">if(remainingEvents==0) exitBlock();</onupdate> | |
<oncomplete>goto(nextblockname);</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Well done!\A point for you!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<block id="failshooting"> | |
<onstart></onstart> | |
<onupdate interval="1">if(remainingEvents==0) exitBlock();</onupdate> | |
<oncomplete>goto("alldone");</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Poor show old boy, good thing\those were fake mushrooms or\you'd be crumbs!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>2</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
<event time="0.3" type="dialogue"> | |
<from>C. FIGHTER</from> | |
<message>I know I know.\I'll get the hang of it.</message> | |
<colour>0</colour> | |
<avatar>avatar-croissant.png</avatar> | |
<loudness>0</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- Wrap up --> | |
<block id="alldone"> | |
<onstart></onstart> | |
<onupdate interval="1">default</onupdate> | |
<oncomplete>default</oncomplete> | |
<events> | |
<event time="0" type="dialogue"> | |
<from>UNCLE TOAST BREADINGTON</from> | |
<message>Now go out there and practise\what you've learned!</message> | |
<colour>1</colour> | |
<avatar>avatar-toast.png</avatar> | |
<loudness>3</loudness> | |
<writespeed>1</writespeed> | |
</event> | |
</events> | |
</block> | |
<!-- player leaves screen --> | |
<block id="outro"> | |
<onstart></onstart> | |
<onupdate interval="1">if(blockTime>1.9) exitLevel();</onupdate> | |
<oncomplete>exitLevel();</oncomplete> | |
<events> | |
<event time="0" type="music"> | |
<song></song> | |
<transition>fade</transition> | |
</event> | |
<event time="0.5" type="weaponcontrol"> | |
<command>stopfiring</command> | |
</event> | |
<event time="0.7" type="script"> | |
movePlayer(1600,400,1.5,"in",true,false); | |
</event> | |
<event time="1.0" type="script"> | |
player.barrelRoll(); | |
</event> | |
</events> | |
</block> | |
</blocks> | |
</level> | |
<manifest> | |
<item type="enemy"> | |
<id>bulletsource_dodge</id> | |
<asset>assets/data/gts/enemies.gts</asset> | |
<seqname>bulletsource</seqname> | |
<classname>com.slakinov.games.croissant.entities.tutorial.TutorialBulletSource</classname> | |
<hp>100000000</hp> | |
<points>0</points> | |
<variantframes>1</variantframes> | |
<explodestyle>mushrooms</explodestyle> | |
<firing>assets/data/definitions/firing/tutorialblast1.xml</firing> | |
</item> | |
<item type="enemy"> | |
<id>bulletsource_graze</id> | |
<asset>assets/data/gts/enemies.gts</asset> | |
<seqname>bulletsource</seqname> | |
<classname>com.slakinov.games.croissant.entities.tutorial.TutorialBulletSource</classname> | |
<hp>100000000</hp> | |
<points>0</points> | |
<variantframes>1</variantframes> | |
<explodestyle>mushrooms</explodestyle> | |
<firing>assets/data/definitions/firing/tutorialblast2.xml</firing> | |
</item> | |
<item type="enemy"> | |
<id>mushrooms</id> | |
<asset>assets/data/gts/enemies.gts</asset> | |
<seqname>mushrooms</seqname> | |
<classname>com.slakinov.games.croissant.entities.EnemyEntity</classname> | |
<hp>5</hp> | |
<points>1</points> | |
<firing>none</firing> | |
<variantframes>4</variantframes> | |
<explodestyle>mushrooms</explodestyle> | |
</item> | |
</manifest> | |
<ensembles> | |
</ensembles> | |
<preloadlist> | |
</preloadlist> | |
</data> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment