Skip to content

Instantly share code, notes, and snippets.

@Sunjammer
Last active August 26, 2017 20:35
Show Gist options
  • Save Sunjammer/639d32037134da9d57bbb93a07a48f16 to your computer and use it in GitHub Desktop.
Save Sunjammer/639d32037134da9d57bbb93a07a48f16 to your computer and use it in GitHub Desktop.
CroissantScript
<?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