1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2025-01-08 18:09:45 +01:00
VVVVVV/mobile_version/src/includes/logic.as
Terry Cavanagh 72d018ea04 Update mobile version to mobile v2.2.1
The android version just got a much needed update to fix some resolution issues on devices with cutouts.

It turns out the mobile source was actually pretty out of date, like 3 versions out of date! This commit brings it up to date.

All the changes have just been about keeping the game running on modern devices, though. The biggest change was adding the Starling library to the project, which made the game GPU powered and sped the whole thing up.
2022-12-02 18:19:58 +01:00

1372 lines
45 KiB
ActionScript

public function titlelogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, obj:entityclass, help:helpclass, music:musicclass):void {
//Misc
//map.updatetowerglow();
dwgfx.mobile_changebutton(dwgfx.BUTTON_BLANK);
if(game.menustart && !game.showloadingnotice) {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_GAMECENTER);
}else {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
}
dwgfx.mobile_hidearrows();
help.updateglow();
map.bypos -= 2;
map.bscroll = -2;
//if (map.ypos <= 0) { map.ypos = 0; map.bypos = 0; map.bscroll = 0; }
//if (map.ypos >= 5368) { map.ypos = 5368; map.bypos = map.ypos / 2; } //700-29 * 8 = 5368
if (game.menucountdown > 0) {
game.menucountdown--;
if (game.menucountdown == 0) {
if (game.menudest == "mainmenu"){ music.play(6);
}else if (game.menudest == "gameover2") { music.playef(11, 10);
}else if (game.menudest == "timetrialcomplete3") { music.playef(3, 10);
}
game.createmenu(game.menudest);
}
}
}
public function maplogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
//Misc
if (dwgfx.resumegamemode) {
dwgfx.mobile_changebutton(dwgfx.BUTTON_MENU);
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_showarrows(game.controlstyle);
}else {
if (game.gamestate == game.TELEPORTERMODE) {
dwgfx.mobile_changebutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
}else{
dwgfx.mobile_changebutton(dwgfx.BUTTON_BACK);
if (game.menupage == 0 || game.menupage >= 30) {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_CONTROLS);
}else {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
}
}
dwgfx.mobile_hidearrows();
}
help.updateglow();
}
public function gamecompletelogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
//Misc
dwgfx.mobile_changebutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_hidearrows();
map.updatetowerglow();
help.updateglow();
dwgfx.crewframe = 0;
map.tdrawback = true;
game.creditposition--;
if (game.creditposition <= -1650) {
game.creditposition = -1650;
map.bscroll = 0;
}else {
map.bypos += 1; map.bscroll = +1;
}
if (dwgfx.fademode == 1) {
//Fix some graphical things
dwgfx.showcutscenebars = false;
dwgfx.cutscenebarspos = 0;
//Return to game
game.gamestate = 7; dwgfx.fademode = 4;
}
}
public function gamecompletelogic2(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
dwgfx.mobile_changebutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_hidearrows();
//Misc
map.updatetowerglow();
help.updateglow();
game.creditposdelay--;
if (game.creditposdelay <= 0) {
game.creditposdelay = 1;
game.creditposx++;
if (game.creditposx > 40) {
game.creditposy++;
game.creditposx = 0;
if (game.creditposy > 30) game.creditposy = 30;
}
}
/*
game.creditposition--;
if (game.creditposition <= -1650) {
game.creditposition = -1650;
map.bscroll = 0;
}else {
map.bypos += 1; map.bscroll = +1;
}
*/
if (dwgfx.fademode == 1) {
//Fix some graphical things
dwgfx.showcutscenebars = false;
dwgfx.cutscenebarspos = 0;
//Fix the save thingy
game.deletequick();
game.savetele(map,obj,music,help);
game.telegotoship();
//Return to game
map.colstate = 10;
game.gamestate = 1; dwgfx.fademode = 4;
music.playef(18, 10);
game.createmenu("gamecompletecontinue");
map.nexttowercolour();
}
}
public function towerlogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
//Logic for the tower level
dwgfx.mobile_changebutton(dwgfx.BUTTON_MENU);
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
dwgfx.mobile_showarrows(game.controlstyle);
map.updatetowerglow();
help.updateglow();
if(!game.completestop){
if (map.cameramode == 0) {
//do nothing!
//a trigger will set this off in the game
map.cameramode = 1;
map.bscroll = 0;
}else if (map.cameramode == 1) {
//move normally
i = obj.getplayer();
if(map.scrolldir==0){
map.ypos -= 2;
map.bypos -= 1;
map.bscroll = -1;
}else {
map.ypos += 2;
map.bypos += 1;
map.bscroll = 1;
}
}else if (map.cameramode == 2) {
//do nothing, but cycle colours (for taking damage)
map.bscroll = 0;
}else if (map.cameramode == 4) {
i = obj.getplayer();
map.cameraseek = map.ypos - (obj.entities[i].yp - 120);
map.cameraseek = map.cameraseek / 10;
map.cameraseekframe = 10;
map.cameramode = 5;
map.bscroll = map.cameraseek/2;
}else if (map.cameramode == 5) {
//actually do it
if (map.spikeleveltop > 0) map.spikeleveltop-=2;
if (map.spikelevelbottom > 0) map.spikelevelbottom-=2;
if (map.cameraseekframe > 0) {
i = obj.getplayer();
map.ypos -= map.cameraseek;
if (map.cameraseek > 0) {
if (map.ypos < obj.entities[i].yp - 120) {
map.ypos = obj.entities[i].yp - 120;
}
}else {
if (map.ypos > obj.entities[i].yp - 120) {
map.ypos = obj.entities[i].yp - 120;
}
}
map.cameraseekframe--;
map.bypos = map.ypos / 2;
}else {
i = obj.getplayer();
map.ypos = obj.entities[i].yp - 120;
map.bypos = map.ypos / 2;
map.cameramode = 0;
map.colsuperstate = 0;
}
}
}else {
map.bscroll = 0;
}
if (map.ypos <= 0) { map.ypos = 0; map.bypos = 0; map.bscroll = 0; }
if (map.minitowermode) {
if (map.ypos >= 568) {
map.ypos = 568; map.bypos = map.ypos / 2; map.bscroll = 0;
} //100-29 * 8 = 568
}else{
if (map.ypos >= 5368) { map.ypos = 5368; map.bypos = map.ypos / 2; } //700-29 * 8 = 5368
}
if (game.lifeseq > 0) {
if (map.cameramode == 2) {
map.cameraseekframe = 20;
map.cameramode = 4;
map.resumedelay = 4;
}
if (map.cameraseekframe <= 0) {
if (map.resumedelay <= 0) {
game.lifesequence(obj);
if (game.lifeseq == 0) map.cameramode = 1;
}else {
map.resumedelay--;
}
}
}
if (game.deathseq != -1) {
map.colsuperstate = 1;
map.cameramode = 2;
game.deathsequence(map, obj, music);
game.deathseq--;
if (game.deathseq <= 0) {
if (game.nodeathmode) {
game.deathseq = 1;
game.gethardestroom(map);
//start depressing sequence here...
if (game.gameoverdelay <= -10 && dwgfx.fademode==0) dwgfx.fademode = 2;
if (dwgfx.fademode == 1) script.resetgametomenu(key, dwgfx, game, map, obj, help, music);
}else{
if (game.currentroomdeaths > game.hardestroomdeaths) {
game.hardestroomdeaths = game.currentroomdeaths;
game.hardestroom = map.roomname;
}
game.gravitycontrol = game.savegc;
dwgfx.textboxremove();
map.resetplayer(dwgfx, game, obj, music);
}
}
}else{
//State machine for game logic
game.updatestate(dwgfx, map, obj, help, music);
//Time trial stuff
if (game.intimetrial) {
if (game.timetrialcountdown > 0) {
game.hascontrol = true;
game.timetrialcountdown--;
if (game.timetrialcountdown > 30) {
game.hascontrol = false;
}
if(game.timetrialcountdown == 120) music.playef(21, 10);
if(game.timetrialcountdown == 90) music.playef(21, 10);
if(game.timetrialcountdown == 60) music.playef(21, 10);
if (game.timetrialcountdown == 30) {
switch(game.timetriallevel) {
case 0: music.play(1); break;
case 1: music.play(3); break;
case 2: music.play(2); break;
case 3: music.play(1); break;
case 4: music.play(12); break;
case 5: music.play(15); break;
}
music.playef(22, 10);
}
}
//Have we lost the par?
if (!game.timetrialparlost) {
if ((game.minutes * 60) + game.seconds > game.timetrialpar) {
game.timetrialparlost = true;
i = obj.getplayer();
if (i > -1) {
obj.entities[i].tile = 144;
}
music.playef(2, 10);
}
}
}
//Update entities
if(!game.completestop){
for (i = obj.nentity - 1; i >= 0; i--) {
//Remove old platform
//if (obj.entities[i].isplatform) obj.removeblockat(obj.entities[i].xp, obj.entities[i].yp);
obj.updateentities(i, help, game, music); // Behavioral logic
obj.updateentitylogic(i, game); // Basic Physics
obj.entitymapcollision(i, map); // Collisions with walls
//Create new platform
//if (obj.entities[i].isplatform) obj.movingplatformfix(i, map);
}
obj.entitycollisioncheck(dwgfx, game, map, music); // Check ent v ent collisions, update states
//special for tower: is the player touching any spike blocks?
i = obj.getplayer();
if(obj.checktowerspikes(i, map) && dwgfx.fademode==0){
game.deathseq = 30;
}
//Right so! Screenwraping for tower:
if (map.minitowermode) {
if (map.scrolldir == 1) {
//This is minitower 1!
i = obj.getplayer();
if (game.door_left > -2 && obj.entities[i].xp < -14)
{ obj.entities[i].xp += 320; map.gotoroom(48, 52, dwgfx, game, obj, music); }
if (game.door_right > -2 && obj.entities[i].xp >= 308)
{ obj.entities[i].xp -= 320; obj.entities[i].yp -= (71*8); map.gotoroom(game.roomx + 1, game.roomy+1, dwgfx, game, obj, music);}
}else {
//This is minitower 2!
i = obj.getplayer();
if (game.door_left > -2 && obj.entities[i].xp < -14)
{ if (obj.entities[i].yp > 300) {
obj.entities[i].xp += 320; obj.entities[i].yp -= (71 * 8); map.gotoroom(50, 54, dwgfx, game, obj, music);
}else
{ obj.entities[i].xp += 320; map.gotoroom(50, 53, dwgfx, game, obj, music); }
}
if (game.door_right > -2 && obj.entities[i].xp >= 308)
{ obj.entities[i].xp -= 320; map.gotoroom(52, 53, dwgfx, game, obj, music); }
}
}else {
//Always wrap except for the very top and very bottom of the tower
if(map.ypos>=500 && map.ypos <=5000){
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].xp <= -10) {
obj.entities[i].xp += 320;
}else {
if (obj.entities[i].xp > 310) {
obj.entities[i].xp -= 320;
}
}
}
}else {
//Do not wrap! Instead, go to the correct room
i = obj.getplayer();
if (game.door_left > -2 && obj.entities[i].xp < -14)
{ obj.entities[i].xp += 320; obj.entities[i].yp -= (671 * 8); map.gotoroom(108, 109, dwgfx, game, obj, music); }
if (game.door_right > -2 && obj.entities[i].xp >= 308)
{ obj.entities[i].xp -= 320; map.gotoroom(110, 104, dwgfx, game, obj, music);}
}
}
if(game.lifeseq==0){
i = obj.getplayer();
if(!map.invincibility){
if (obj.entities[i].yp-map.ypos <= 0) {
game.deathseq = 30;
}else if (obj.entities[i].yp-map.ypos >= 208) {
game.deathseq = 30;
}
}else {
if (obj.entities[i].yp-map.ypos <= 0) {
map.ypos-=10; map.bypos = map.ypos / 2; map.bscroll = 0;
}else if (obj.entities[i].yp-map.ypos >= 208) {
map.ypos+=2; map.bypos = map.ypos / 2; map.bscroll = 0;
}
}
if (obj.entities[i].yp - map.ypos <= 40) {
map.spikeleveltop++;
if (map.spikeleveltop >= 8) map.spikeleveltop = 8;
}else {
if (map.spikeleveltop > 0) map.spikeleveltop--;
}
if (obj.entities[i].yp - map.ypos >= 164) {
map.spikelevelbottom++;
if (map.spikelevelbottom >= 8) map.spikelevelbottom = 8;
}else {
if (map.spikelevelbottom > 0) map.spikelevelbottom--;
}
}
}
//now! let's clean up removed entities
obj.cleanup();
//Looping around, room change conditions!
}
if (game.teleport_to_new_area) script.teleport(dwgfx, game, map, obj, help, music);
}
public function gamelogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
if (game.autoquicksave) {
game.autoquicksave = false;
if(!game.intimetrial && !game.nodeathmode && !game.insecretlab && !game.inintermission){
if(map.custommodeforreal){
game.customsavequick(editor.ListOfMetaData[game.playcustomlevel].file_num, map, obj, music, help);
}else{
game.savequick(map, obj, music, help);
}
}
}
//Misc
help.updateglow();
if (game.alarmon) {
game.alarmdelay--;
if (game.alarmdelay <= 0) {
music.playef(19);
game.alarmdelay = 20;
}
}
if (obj.nearelephant) {
obj.upset++;
if (obj.upset == 300) {
obj.upsetmode = true;
//change player to sad
i = obj.getplayer();
obj.entities[i].tile = 144;
music.playef(2, 10);
}
if (obj.upset > 301) obj.upset = 301;
}else if (obj.upsetmode) {
obj.upset--;
if (obj.upset <= 0) {
obj.upset = 0;
obj.upsetmode = false;
//change player to happy
i = obj.getplayer();
obj.entities[i].tile = 0;
}
}else {
obj.upset = 0;
}
game.lifesequence(obj);
if (game.deathseq != -1) {
for (i = 0; i < obj.nentity; i++) {
if (game.roomx == 111 && game.roomy == 107) {
if (obj.entities[i].type == 1) {
if (obj.entities[i].xp < 152) {
obj.entities[i].xp = 152;
obj.entities[i].newxp = 152;
}
}
}
if (obj.entities[i].type == 2 && obj.entities[i].state == 3) {
//Ok! super magical exception for the room with the intention death for the shiny trinket
//fix this when the maps are finalised
if (game.roomx != 111 && game.roomy != 107) {
obj.entities[i].state = 4;
}else {
obj.entities[i].state = 4;
map.settile(18, 9, 59);
}
}else if (obj.entities[i].type == 2 && obj.entities[i].state == 2) {
//ok, unfortunate case where the disappearing platform hasn't fully disappeared. Accept a little
//graphical uglyness to avoid breaking the room!
while (obj.entities[i].state == 2) obj.updateentities(i, help, game, music);
obj.entities[i].state = 4;
}else if (map.finallevel && map.finalstretch && obj.entities[i].type == 2) {
//for the final level. probably something 99% of players won't see.
while (obj.entities[i].state == 2) obj.updateentities(i, help, game, music);
obj.entities[i].state = 4;
}else if (obj.entities[i].type == 23 && game.swnmode && game.deathseq<15) {
//if playing SWN, get the enemies offscreen.
obj.entities[i].xp += obj.entities[i].vx*5;
obj.entities[i].yp += obj.entities[i].vy*5;
}
}
if (game.swnmode) {
//if playing SWN game a, push the clock back to the nearest 10 second interval
if (game.swngame == 0) {
game.swnpenalty();
}else if (game.swngame == 1) {
game.swnstate = 0; game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0; game.swndelay = 0;
if (game.swntimer >= game.swnrecord) {
if (game.swnmessage == 0) {
music.playef(25, 10);
game.scores.reportScore(game.swntimer);
}
game.swnmessage = 1;
game.swnrecord = game.swntimer;
}
}
}
game.deathsequence(map, obj, music);
game.deathseq--;
if (game.deathseq <= 0) {
if (game.nodeathmode) {
game.deathseq = 1;
game.gethardestroom(map);
//start depressing sequence here...
if (game.gameoverdelay <= -10 && dwgfx.fademode==0) dwgfx.fademode = 2;
if (dwgfx.fademode == 1) script.resetgametomenu(key, dwgfx, game, map, obj, help, music);
}else {
if (game.swnmode) {
//if playing SWN game b, reset the clock
if (game.swngame == 1) {
game.swntimer = 0;
game.swnmessage = 0;
game.swnrank = 0;
}
}
game.gethardestroom(map);
game.activetele = false;
game.hascontrol = true;
game.gravitycontrol = game.savegc;
dwgfx.textboxremove();
map.resetplayer(dwgfx, game, obj, music);
}
}
}else {
//Update colour thingy
if (map.finalmode) {
if (map.final_colormode) {
if (map.final_colorframe > 0) {
map.final_colorframedelay--;
if (map.final_colorframedelay <= 0) {
if (map.final_colorframe == 1) {
map.final_colorframedelay = 40;
temp = 1+int(Math.random() * 6);
if (temp == map.final_mapcol) temp = (temp + 1) % 6;
if (temp == 0) temp = 6;
map.changefinalcol(temp, obj,game);
}else if (map.final_colorframe == 2) {
map.final_colorframedelay = 15;
temp = 1+int(Math.random() * 6);
if (temp == map.final_mapcol) temp = (temp + 1) % 6;
if (temp == 0) temp = 6;
map.changefinalcol(temp, obj,game);
}
}
}
}
}
//State machine for game logic
game.updatestate(dwgfx, map, obj, help, music);
if (game.startscript) {
script.load(game.newscript);
game.startscript = false;
}
//Intermission 1 Logic
//Player can't walk off a screen with SCM on it until they've left
if (game.supercrewmate) {
if (game.roomx == 41 + game.scmprogress) { //he's in the same room
i = obj.getplayer();
if (obj.entities[i].ax > 0 && obj.entities[i].xp > 280) {
obj.entities[i].ax = 0;
obj.entities[i].dir = 0;
}
}
}
//SWN Minigame Logic
if (game.swnmode) { //which game?
if(game.swngame==0){ //intermission, survive 60 seconds game
game.swntimer -= 1;
if (game.swntimer <= 0) {
music.niceplay(8);
game.swngame = 5;
}else {
obj.generateswnwave(game, help, 0);
}
}else if(game.swngame==1){ //super gravitron game
game.swntimer += 1;
if (game.swntimer > game.swnrecord) game.swnrecord = game.swntimer;
if (game.swntimer >= 150 && game.swnrank == 0) {
game.swnrank = 1;
if (game.swnbestrank < 1) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav5);
game.swnbestrank = 1; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}else if (game.swntimer >= 300 && game.swnrank == 1) {
game.swnrank = 2;
if (game.swnbestrank < 2) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav10);
game.swnbestrank = 2; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}else if (game.swntimer >= 450 && game.swnrank == 2) {
game.swnrank = 3;
if (game.swnbestrank < 3) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav15);
game.swnbestrank = 3; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}else if (game.swntimer >= 600 && game.swnrank == 3) {
game.swnrank = 4;
if (game.swnbestrank < 4) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav20);
game.swnbestrank = 4; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}else if (game.swntimer >= 900 && game.swnrank == 4) {
game.swnrank = 5;
if (game.swnbestrank < 5) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav30);
game.swnbestrank = 5; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}else if (game.swntimer >= 1800 && game.swnrank == 5) {
game.swnrank = 6;
if (game.swnbestrank < 6) {
game.scores.reportAchievement(game.scores.vvvvvvsupgrav60);
game.swnbestrank = 6; game.swnmessage = 2 + 30; music.playef(26, 10);
}
}
obj.generateswnwave(game, help, 1);
game.swncoldelay--;
if(game.swncoldelay<=0){
game.swncolstate = (game.swncolstate+1)%6;
game.swncoldelay = 30;
dwgfx.rcol = game.swncolstate;
obj.swnenemiescol(game.swncolstate);
}
}else if (game.swngame == 2) { //introduce game a
game.swndelay--;
if (game.swndelay <= 0) {
game.swngame = 0;
game.swndelay = 0;
game.swntimer = (60 * 30) - 1;
//game.swntimer = 15;
}
}else if (game.swngame == 3) { //extend line
obj.entities[obj.getlineat(84 - 32)].w += 24;
if (obj.entities[obj.getlineat(84 - 32)].w > 332) {
obj.entities[obj.getlineat(84 - 32)].w = 332;
game.swngame = 2;
}
}else if (game.swngame == 4) { //create top line
game.swngame = 3;
obj.createentity(game, -8, 84 - 32, 11, 8); // (horizontal gravity line)
music.niceplay(2);
game.swndeaths = game.deathcounts;
}else if (game.swngame == 5) { //remove line
obj.entities[obj.getlineat(148 + 32)].xp += 24;
if (obj.entities[obj.getlineat(148 + 32)].xp > 320) {
obj.entities[obj.getlineat(148 + 32)].active = false;
game.swnmode = false;
game.swngame = 6;
}
}else if (game.swngame == 6) { //Init the super gravitron
game.swngame = 7;
music.niceplay(3);
}else if (game.swngame == 7) { //introduce game b
game.swndelay--;
if (game.swndelay <= 0) {
game.swngame = 1;
game.swndelay = 0;
game.swntimer = 0;
game.swncolstate = 3; game.swncoldelay = 30;
}
}
}
//Time trial stuff
if (game.intimetrial) {
if (game.timetrialcountdown > 0) {
game.hascontrol = true;
game.timetrialcountdown--;
if (game.timetrialcountdown > 30) {
game.hascontrol = false;
}
if(game.timetrialcountdown == 120) music.playef(21, 10);
if(game.timetrialcountdown == 90) music.playef(21, 10);
if(game.timetrialcountdown == 60) music.playef(21, 10);
if (game.timetrialcountdown == 30) {
switch(game.timetriallevel) {
case 0: music.play(1); break;
case 1: music.play(3); break;
case 2: music.play(2); break;
case 3: music.play(1); break;
case 4: music.play(12); break;
case 5: music.play(15); break; //Play cool remix for final level!
}
music.playef(22, 10);
}
}
//Have we lost the par?
if (!game.timetrialparlost) {
if ((game.minutes * 60) + game.seconds > game.timetrialpar) {
game.timetrialparlost = true;
i = obj.getplayer();
if (i > -1) {
obj.entities[i].tile = 144;
}
music.playef(2, 10);
}
}
}
//Update entities
//Ok, moving platform fuckers
if (!game.completestop) {
if(obj.vertplatforms){
for (i = obj.nentity - 1; i >= 0; i--) {
if (obj.entities[i].isplatform) {
if(obj.entities[i].vx==0) {
obj.removeblockat(obj.entities[i].xp, obj.entities[i].yp);
obj.updateentities(i, help, game, music); // Behavioral logic
obj.updateentitylogic(i, game); // Basic Physics
obj.entitymapcollision(i, map); // Collisions with walls
obj.createblock(0, obj.entities[i].xp, obj.entities[i].yp, obj.entities[i].w, obj.entities[i].h);
if (game.supercrewmate) {
obj.movingplatformfix(i, map);
obj.scmmovingplatformfix(i, map);
}else {
obj.movingplatformfix(i, map);
}
}
}
}
}
if(obj.horplatforms){
for (i = obj.nentity - 1; i >= 0; i--) {
if (obj.entities[i].isplatform) {
if(obj.entities[i].vy==0) {
obj.removeblockat(obj.entities[i].xp, obj.entities[i].yp);
obj.updateentities(i, help, game, music); // Behavioral logic
obj.updateentitylogic(i, game); // Basic Physics
obj.entitymapcollision(i, map); // Collisions with walls
obj.hormovingplatformfix(i, map);
}
}
}
//is the player standing on a moving platform?
i = obj.getplayer(); j = obj.entitycollideplatformfloor(map, i);
if (j > -1000) { obj.entities[i].newxp = obj.entities[i].xp + j; obj.entitymapcollision(i, map);
}else {
j = obj.entitycollideplatformroof(map, i);
if (j > -1000) { obj.entities[i].newxp = obj.entities[i].xp + j; obj.entitymapcollision(i, map); }
}
}
for (i = obj.nentity - 1; i >= 0; i--) {
if (!obj.entities[i].isplatform) {
obj.updateentities(i, help, game, music); // Behavioral logic
obj.updateentitylogic(i, game); // Basic Physics
obj.entitymapcollision(i, map); // Collisions with walls
}
}
obj.entitycollisioncheck(dwgfx, game, map, music); // Check ent v ent collisions, update states
}
/*
game.test = true;
game.teststring = String(help.booltoint(game.disablekludge_1)) + "-";
game.teststring += String(help.booltoint(game.disablekludge_2)) + "-";
game.teststring += String(help.booltoint(game.disablekludge_3)) + "-";
game.teststring += String(help.booltoint(game.disablekludge_4));
game.teststring += " nblocks=" + String(obj.nblocks);
*/
//now! let's clean up removed entities
obj.cleanup();
//Using warplines?
if (obj.customwarpmode) {
//Rewritten system for mobile update: basically, the new logic is to
//check if the player is leaving the map, and if so do a special check against
//warp lines for collision
obj.customwarpmodehon = false;
obj.customwarpmodevon = false;
i = obj.getplayer();
if ((game.door_down > -2 && obj.entities[i].yp >= 226-16) ||
(game.door_up > -2 && obj.entities[i].yp < -2+16) ||
(game.door_left > -2 && obj.entities[i].xp < -14+16) ||
(game.door_right > -2 && obj.entities[i].xp >= 308-16)){
//Player is leaving room
obj.customwarplinecheck(i);
}
if(obj.customwarpmodehon){ map.warpy=true;
}else{ map.warpy=false; }
if(obj.customwarpmodevon){ map.warpx=true;
}else{ map.warpx=false; }
}
//Finally: Are we changing room?
if (map.warpx && map.warpy) {
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type < 50) { //Don't warp warp lines
if (obj.entities[i].size < 12) { //Don't wrap SWN enemies
if (obj.entities[i].xp <= -10) {
obj.entities[i].xp += 320;
}else {
if (obj.entities[i].xp > 310) {
obj.entities[i].xp -= 320;
}
}
}
}
}
for (i = 0; i < obj.nentity; i++) {
if(obj.entities[i].type<50){ //Don't warp warp lines
if (obj.entities[i].size < 12) { //Don't wrap SWN enemies
if (obj.entities[i].yp <= -12) {
obj.entities[i].yp += 232;
}else {
if (obj.entities[i].yp > 226) {
obj.entities[i].yp -= 232;
}
}
}
}
}
}else if (map.warpx) {
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type < 50) { //Don't warp warp lines
if (obj.entities[i].size < 12) { //Don't wrap SWN enemies
if (game.roomx == 118 && game.roomy == 102 && obj.entities[i].rule==1 && !map.custommode) {
//ascii snakes
if (obj.entities[i].xp <= -80) {
obj.entities[i].xp += 400;
}else {
if (obj.entities[i].xp > 320) {
obj.entities[i].xp -= 400;
}
}
}else{
if (obj.entities[i].xp <= -10) {
obj.entities[i].xp += 320;
}else {
if (obj.entities[i].xp > 310) {
obj.entities[i].xp -= 320;
}
}
}
}
}
}
i = obj.getplayer();
if (game.door_down > -2 && obj.entities[i].yp >= 238)
{ obj.entities[i].yp -= 240; map.gotoroom(game.roomx, game.roomy + 1, dwgfx, game, obj, music); }
if (game.door_up > -2 && obj.entities[i].yp < -2)
{ obj.entities[i].yp += 240; map.gotoroom(game.roomx, game.roomy - 1, dwgfx, game, obj, music);}
}else if (map.warpy) {
for (i = 0; i < obj.nentity; i++) {
if(obj.entities[i].type<50){ //Don't warp warp lines
if (obj.entities[i].yp <= -12) {
obj.entities[i].yp += 232;
}else {
if (obj.entities[i].yp > 226) {
obj.entities[i].yp -= 232;
}
}
}
}
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type < 50) { //Don't warp warp lines
if(obj.entities[i].rule!=0){
if (obj.entities[i].xp <= -30) {
obj.entities[i].xp += 350;
}else {
if (obj.entities[i].xp > 320) {
obj.entities[i].xp -= 350;
}
}
}
}
}
i = obj.getplayer();
if (game.door_left > -2 && obj.entities[i].xp < -14)
{ obj.entities[i].xp += 320; map.gotoroom(game.roomx - 1, game.roomy, dwgfx, game, obj, music);}
if (game.door_right > -2 && obj.entities[i].xp >= 308)
{ obj.entities[i].xp -= 320; map.gotoroom(game.roomx + 1, game.roomy, dwgfx, game, obj, music); }
}else {
//Normal! Just change room
i = obj.getplayer();
if (game.door_down > -2 && obj.entities[i].yp >= 238)
{ obj.entities[i].yp -= 240; map.gotoroom(game.roomx, game.roomy + 1, dwgfx, game, obj, music); }
if (game.door_up > -2 && obj.entities[i].yp < -2)
{ obj.entities[i].yp += 240; map.gotoroom(game.roomx, game.roomy - 1, dwgfx, game, obj, music);}
if (game.door_left > -2 && obj.entities[i].xp < -14)
{ obj.entities[i].xp += 320; map.gotoroom(game.roomx - 1, game.roomy, dwgfx, game, obj, music);}
if (game.door_right > -2 && obj.entities[i].xp >= 308)
{ obj.entities[i].xp -= 320; map.gotoroom(game.roomx + 1, game.roomy, dwgfx, game, obj, music); }
}
//Warp tokens
if (map.custommode){
if (game.teleport){
var edi:int=obj.entities[game.edteleportent].behave;
var edj:int=obj.entities[game.edteleportent].para;
var edi2:int, edj2:int;
edi2 = (edi-(edi%40))/40;
edj2 = (edj - (edj % 30)) / 30;
map.warpto(100 + edi2, 100 + edj2, obj.getplayer(), edi % 40, (edj % 30) + 2, dwgfx, game, obj, music);
game.teleport = false;
if (game.teleport == false){
game.flashlight = 6;
game.screenshake = 25;
}
}
}else{
if (game.teleport) {
if (game.roomx == 117 && game.roomy == 102) {
i = obj.getplayer();
obj.entities[i].yp = 225; map.gotoroom(119, 100, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 119 && game.roomy == 100) {
i = obj.getplayer();
obj.entities[i].yp = 225; map.gotoroom(119, 103, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 119 && game.roomy == 103) {
i = obj.getplayer();
obj.entities[i].xp = 0; map.gotoroom(116, 103, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 116 && game.roomy == 103) {
i = obj.getplayer();
obj.entities[i].yp = 225; map.gotoroom(116, 100, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 116 && game.roomy == 100) {
i = obj.getplayer();
obj.entities[i].xp = 0; map.gotoroom(114, 102, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 114 && game.roomy == 102) {
i = obj.getplayer();
obj.entities[i].yp = 225; map.gotoroom(113, 100, dwgfx, game, obj, music);
game.teleport = false;
}else if (game.roomx == 116 && game.roomy == 104) {
//pre warp zone here
map.warpto(107, 101, obj.getplayer(), 14, 16, dwgfx, game, obj, music);
}else if (game.roomx == 107 && game.roomy == 101) {
map.warpto(105, 119, obj.getplayer(), 5, 26, dwgfx, game, obj, music);
}else if (game.roomx == 105 && game.roomy == 118) {
map.warpto(101, 111, obj.getplayer(), 34, 6, dwgfx, game, obj, music);
}else if (game.roomx == 101 && game.roomy == 111) {
//There are lots of warp tokens in this room, so we have to distinguish!
switch(game.teleportxpos) {
case 1: map.warpto(108, 108, obj.getplayer(), 4, 27, dwgfx, game, obj, music); break;
case 2: map.warpto(101, 111, obj.getplayer(), 12, 27, dwgfx, game, obj, music); break;
case 3: map.warpto(119, 111, obj.getplayer(), 31, 7, dwgfx, game, obj, music); break;
case 4: map.warpto(114, 117, obj.getplayer(), 19, 16, dwgfx, game, obj, music); break;
}
}else if (game.roomx == 108 && game.roomy == 106) {
map.warpto(119, 111, obj.getplayer(), 4, 27, dwgfx, game, obj, music);
}else if (game.roomx == 100 && game.roomy == 111) {
map.warpto(101, 111, obj.getplayer(), 24, 6, dwgfx, game, obj, music);
}else if (game.roomx == 119 && game.roomy == 107) {
//Secret lab, to super gravitron
map.warpto(119, 108, obj.getplayer(), 19, 10, dwgfx, game, obj, music);
}
if (game.teleport == false) {
game.flashlight = 6; game.screenshake = 25;
}
}
}
}
if (game.roomchange) {
//We've changed room? Let's bring our companion along!
game.roomchange = false;
if (game.companion > 0) {
i = obj.getplayer();
//ok, we'll presume our companion has been destroyed in the room change. So:
switch(game.companion) {
case 6:
obj.createentity(game, obj.entities[i].xp, 121, 15,1); //Y=121, the floor in that particular place!
j = obj.getcompanion(6);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
break;
case 7:
if (game.roomy <= 105) { //don't jump after him!
if (game.roomx == 110) {
obj.createentity(game, 320, 86, 16, 1); //Y=86, the ROOF in that particular place!
}else{
obj.createentity(game, obj.entities[i].xp, 86, 16, 1); //Y=86, the ROOF in that particular place!
}
j = obj.getcompanion(7);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}
break;
case 8:
if (game.roomy >= 104) { //don't jump after him!
if (game.roomx == 102) {
obj.createentity(game, 310, 177, 17, 1);
j = obj.getcompanion(8);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}else{
obj.createentity(game, obj.entities[i].xp, 177, 17, 1);
j = obj.getcompanion(8);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}
}
break;
case 9:
if (!map.towermode) { //don't go back into the tower!
if (game.roomx == 110 && obj.entities[i].xp<20) {
obj.createentity(game, 100, 185, 18, 15, 0, 1);
}else{
obj.createentity(game, obj.entities[i].xp, 185, 18, 15, 0, 1);
}
j = obj.getcompanion(9);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}
break;
case 10:
//intermission 2, choose colour based on lastsaved
if (game.roomy == 51) {
if (obj.flags[59] == 0) {
obj.createentity(game, 225, 169, 18, dwgfx.crewcolour(game.lastsaved), 0, 10);
j = obj.getcompanion(10);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}
}else if (game.roomy >= 52) {
if (obj.flags[59] == 1) {
obj.createentity(game, 160, 177, 18, dwgfx.crewcolour(game.lastsaved), 0, 18, 1);
j = obj.getcompanion(10);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}else {
obj.flags[59] = 1;
obj.createentity(game, obj.entities[i].xp, -20, 18, dwgfx.crewcolour(game.lastsaved), 0, 10, 0);
j = obj.getcompanion(10);
obj.entities[j].vx = obj.entities[i].vx;
obj.entities[j].dir = obj.entities[i].dir;
}
}
break;
case 11:
//Intermission 1: We're using the SuperCrewMate instead!
//obj.createentity(game, obj.entities[i].xp, obj.entities[i].yp, 24, dwgfx.crewcolour(game.lastsaved));
if(game.roomx-41==game.scmprogress){
switch(game.scmprogress) {
case 0: obj.createentity(game, 76, 161, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 1: obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 2: obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 3:
if (game.scmmoveme) {
obj.createentity(game, obj.entities[obj.getplayer()].xp, 185, 24, dwgfx.crewcolour(game.lastsaved), 2);
game.scmmoveme = false;
}else{
obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved), 2);
}
break;
case 4: obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 5: obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 6: obj.createentity(game, 10, 185, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 7: obj.createentity(game, 10, 41, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 8: obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 9: obj.createentity(game, 10, 169, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 10: obj.createentity(game, 10, 129, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 11: obj.createentity(game, 10, 129, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 12: obj.createentity(game, 10, 65, 24, dwgfx.crewcolour(game.lastsaved), 2); break;
case 13: obj.createentity(game, 10, 177, 24, dwgfx.crewcolour(game.lastsaved)); break;
}
}
if (game.scmmoveme) {
obj.entities[obj.getscm()].xp = obj.entities[obj.getplayer()].xp;
game.scmmoveme = false;
}
break;
}
}
}
game.activeactivity = obj.checkactivity();
if (game.hascontrol && !script.running && !dwgfx.showcutscenebars) {
if (game.readytotele > 0) {
dwgfx.mobile_changebutton(dwgfx.BUTTON_TELEPORT);
}else{
if (game.activeactivity > -1) {
if (obj.blocks[game.activeactivity].b == 20) {
dwgfx.mobile_changebutton(dwgfx.BUTTON_USE);
}else {
dwgfx.mobile_changebutton(dwgfx.BUTTON_TALK);
}
}else{
dwgfx.mobile_changebutton(dwgfx.BUTTON_MENU);
}
}
}else {
dwgfx.mobile_changebutton(dwgfx.BUTTON_BLANK);
}
if (game.insecretlab) {
if (device.deviceresolution == device.IPAD) {
if(obj.trophytext>0){
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
}else {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_GAMECENTER);
}
}else{
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_GAMECENTER);
}
}else {
dwgfx.mobile_changeleftbutton(dwgfx.BUTTON_BLANK);
}
dwgfx.mobile_showarrows(game.controlstyle);
if (game.activetele) {
i = obj.getplayer(); obj.settemprect(i);
if (game.teleblock.intersects(obj.temprect)){
game.readytotele += 25;
if (game.readytotele >= 255) game.readytotele = 255;
}else {
game.readytotele -= 50;
if (game.readytotele < 0) game.readytotele = 0;
}
}else {
if (game.readytotele > 0){
game.readytotele -= 50;
if (game.readytotele < 0) game.readytotele = 0;
}
}
if (game.teleport_to_new_area) script.teleport(dwgfx, game, map, obj, help, music);
}
public function controltutoriallogic(key:KeyPoll, dwgfx:dwgraphicsclass, game:gameclass, map:mapclass,
obj:entityclass, help:helpclass, music:musicclass):void {
game.press_right = false;
game.press_left = false;
game.press_action = false;
game.press_map = false;
//Misc
help.updateglow();
if (game.controllerp2 > 0) {
game.controllerp2--;
}
switch(game.controltutorialstate) {
case 0:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 10) {
game.controltutorialstatedelay = 0;
game.controltutorialstate = 1;
}
break;
case 1:
game.controllerp1+=5;
if (game.controllerp1 >= 100) {
game.controllerp1 = 100;
game.controltutorialstatedelay = 0;
game.controltutorialstate = 2;
}
break;
case 2:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 30) {
game.controltutorialstatedelay = 0;
game.controltutorialstate = 3;
}
break;
case 3:
game.press_right = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 60) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 4:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 30) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 5:
game.press_left = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 60) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 6:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 30) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 7:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 5) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 8:
game.jumppressed = 5; game.jumpheld = true;
game.controllerp2 = 10;
game.controltutorialstate++;
break;
case 9:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 45) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 10:
game.jumppressed = 5; game.jumpheld = true;
game.controllerp2 = 10;
game.controltutorialstate++;
break;
case 11:
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 45) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
//Case 14 on is loopable
case 12:
game.press_right = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay > 28) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 13:
game.press_left = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay == 30) {
game.jumppressed = 5; game.jumpheld = true;
game.controllerp2 = 10;
}
if (game.controltutorialstatedelay > 45) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 14:
game.press_right = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay == 30) {
if(Math.random()*100>50){
game.jumppressed = 5; game.jumpheld = true;
game.controllerp2 = 10;
}
}
if (game.controltutorialstatedelay > 45) {
game.controltutorialstatedelay = 0;
game.controltutorialstate++;
}
break;
case 15:
game.press_left = true;
game.controltutorialstatedelay++;
if (game.controltutorialstatedelay == 30) {
if(Math.random()*100>50){
game.jumppressed = 5; game.jumpheld = true;
game.controllerp2 = 10;
}
}
if (game.controltutorialstatedelay > 45) {
game.controltutorialstatedelay = 0;
game.controltutorialstate = 14;
}
break;
}
//Entity type 0 is player controled
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].rule == 0) {
if (game.press_left) {game.tapleft++; game.controllerp3++;
}else { if (game.tapleft <= 4 && game.tapleft > 0) {if (obj.entities[i].vx < 0) obj.entities[i].vx = 0;}game.tapleft = 0; }
if (game.press_right) {game.tapright++; game.controllerp3++;
}else { if (game.tapright <= 4 && game.tapright > 0) {if (obj.entities[i].vx > 0) obj.entities[i].vx = 0;}game.tapright = 0;}
if(game.press_left){
//obj.entities[i].vx = -4;
if(game.controllerp3>=8){
obj.entities[i].ax = -3;
obj.entities[i].dir = 0;
}
}else if (game.press_right){
//obj.entities[i].vx = 4;
if(game.controllerp3>=8){
obj.entities[i].ax = 3;
obj.entities[i].dir = 1;
}
}else{
//obj.entities[i].vx = 0;
game.controllerp3 = 0;
}
if (game.jumppressed > 0) {
game.jumppressed--;
if (obj.entities[i].onground>0 && game.gravitycontrol == 0) {
game.gravitycontrol = 1;
obj.entities[i].vy = -4; obj.entities[i].ay = -3;
music.playef(0, 10);
game.jumppressed = 0;
game.totalflips++;
}
if (obj.entities[i].onroof>0 && game.gravitycontrol == 1) {
game.gravitycontrol = 0;
obj.entities[i].vy = 4; obj.entities[i].ay = 3;
music.playef(1, 10);
game.jumppressed = 0;
game.totalflips++;
}
}
}
}
for (i = obj.nentity - 1; i >= 0; i--) {
if (!obj.entities[i].isplatform) {
obj.updateentities(i, help, game, music); // Behavioral logic
obj.updateentitylogic(i, game); // Basic Physics
obj.entitymapcollision(i, map); // Collisions with walls
}
}
obj.entitycollisioncheck(dwgfx, game, map, music); // Check ent v ent collisions, update states
//warp around x axis!
for (i = 0; i < obj.nentity; i++) {
if (obj.entities[i].type < 50) { //Don't warp warp lines
if (obj.entities[i].size < 12) { //Don't wrap SWN enemies
if (obj.entities[i].xp <= -10) {
obj.entities[i].xp += 320;
}else {
if (obj.entities[i].xp > 310) {
obj.entities[i].xp -= 320;
}
}
}
}
}
}