Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $mazestart=_maze_start.getid();
- $mazeend=_maze_end.getid();
- $mazecalcbegin=getsimtime();
- $mazepiece=-1;
- $mazeoverflow=0;
- $mazepathA=new SimGroup();
- $mazepathB=new SimGroup();
- $mazepathC=new SimGroup();
- $mazesolution="A";
- $mazeafterstart=-1;
- $mazepart=0;
- $mazecalculating=0;
- function bp(%text,%time){
- %time=%time || 3;
- %bp="<color:ffff00><just:center>" @ %text;
- for(%i=0;%i<ClientGroup.getCount();%i++){
- %client=ClientGroup.getObject(%i);
- %client.bottomPrint(%bp,%time,1);
- }
- }
- function pyth(%a,%b){
- %x1=getword(%a,0);
- %y1=getword(%a,1);
- %z1=getword(%a,2);
- %x2=getword(%b,0);
- %y2=getword(%b,1);
- %z2=getword(%b,2);
- return msqrt(mpow(%x2-%x1,2)+mpow(%y2-%y1,2)+mpow(%z2-%z1,2));
- }
- function newMazePart(%x,%y,%back,%brick,%dirfromback){
- %part=new ScriptObject(MazePart);
- %part.x=%x;
- %part.y=%y;
- %part.brick=%brick;
- if(!isObject(%brick))
- error("ERROR: newMazePart; %brick is not an object!");
- if(!%x)
- error("ERROR: newMazePart; %x is 0!");
- if(!%y)
- error("ERROR: newMazePart; %y is 0!");
- %part.back=%back;
- if(%dirfromback$="up")
- %part.back.up=%part;
- else if(%dirfromback$="down")
- %part.back.down=%part;
- else if(%dirfromback$="left")
- %part.back.left=%part;
- else if(%dirfromback$="right")
- %part.back.right=%part;
- else
- error("something went wrong in newmazepart: %dirfromback is not a direction");
- //return %part;
- }
- function getDirToBrick(%pa,%pb )
- {
- %x1=getWord(%pa,0);
- %x2=getWord(%pb,0);
- %y1=getWord(%pa,1);
- %y2=getWord(%pb,1);
- if(%x2-%x1>0)
- return "right";
- else if(%x2-%x1<0)
- return "left";
- else if(%y2-%y1>0)
- return "up";
- else if(%y2-%y1<0)
- return "down";
- }
- function maze::calculateStart()
- {
- $mazepart=0;
- _maze_bot.spawnHoleBot();
- $mazestart=_maze_start.getid();
- $mazeend=_maze_end.getid();
- $mazepiece=-1;
- $mazeoverflow=0;
- $mazecalcbegin=getsimtime();
- $mazepathA=new SimGroup();
- $mazepathB=new SimGroup();
- $mazepathC=new SimGroup();
- $mazesolution="A";
- $mazeafterstart=-1;
- $mazecalculating=1;
- bp("Finding starting point");
- %stop=0;
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %ray=containerRayCast(_maze_start.position,%section.position,$TypeMasks::FxBrickObjectType);
- %ray=getWord(%ray,0);
- if(isObject(%ray)&&%ray==%section&&!%stop&&pyth(%section.position,_maze_start.position)==3.5){
- %stop=1;
- %foo=new ScriptObject(MazePart);
- %foo.brick=$mazestart;
- %x2=getWord($mazestart.position,0);
- %y2=getWord($mazestart.position,1);
- %dir=getDirToBrick(%section.position,$mazestart.position);
- $mazestart=%section;
- bp("Found.");
- %a=newMazePart(%x,%y,%foo,%section,%dir);
- $mazepiece=%a;
- $mazeafterstart=%a;
- maze::calculateEnd();
- %section.setcolorfx(4);
- }
- }
- }
- }
- }
- function maze::calculateEnd()
- {
- %stop=0;
- bp("Finding ending point");
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %section.setcolorfx(3);
- %ray=containerRayCast(_maze_end.position,%section.position,$TypeMasks::FxBrickObjectType);
- %ray=getWord(%ray,0);
- if(isObject(%ray)&&%ray==%section&&!%stop&&pyth(%section.position,_maze_end.position)==3.5){
- %stop=1;
- $mazeend=%section;
- bp("Found.<br>Start:" SPC $mazestart.getname() SPC "End:" SPC $mazeend.getname());
- calculatePart();
- %section.setColorFx(4);
- }
- %section.schedule(1000,0,setcolorfx,0);
- }
- }
- }
- }
- function stopfx(%this){
- if($mazecalculating)
- %this.setColorFx(3);
- }
- function isHere(%x,%y){
- for(%i=0;%i<$mazepath[$mazesolution].getCount();%i++){
- %obj=$mazepath[$mazesolution].getObject(%i);
- if(%obj.x==%x && %obj.y == %y)
- return 1;
- }
- return 0;
- }
- function calculatePart(){
- $mazeoverflow++;
- if($mazeoverflow>2500){
- //echo("BUFFER OVERFLOW\nSTOPPING CALCULATION");
- bp("BUFFER OVERFLOW!<br>This means it took too long to calculate the maze solution. It might have gotten stuck in an infinite loop!",6);
- return;
- }
- bp("Analyzing maze...");
- %part=$mazepiece;
- %posx=getword(%part.brick.position,0);
- %posy=getword(%part.brick.position,1);
- %posz=getword(%part.brick.position,2);
- %x=%part.x;
- %y=%part.y;
- %back=%part.back;
- %brick=%part.brick;
- %brick.setColorFx(3);
- %ways=0;
- //echo("working piece" SPC %x SPC %y);
- //echo(%posx SPC %posy SPC %posz);
- // echo(containerRayCast(%back.position,%posx+1000 SPC %posy SPC %posz,$TypeMasks:FxBrickObjectType));
- switch$($mazesolution){
- case "A":
- if(%x+1<=9){
- if (getword(containerRayCast(%brick.position,%posx+1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x+1 @ "_" @ %y).getid()){
- %nx=%x+1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.right.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go right");
- %ways++;
- }
- }
- }
- }
- if(%x-1>0){
- if (getword(containerRayCast(%brick.position,%posx-1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x-1 @ "_" @ %y).getid()){
- %nx=%x-1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.left.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go left");
- %ways++;
- }
- }
- }
- }
- if(%y+1<=9){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy+1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y+1).getid()){
- %nx=%x;
- %ny=%y+1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %x @ "_" @ %y+1).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.up.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go up");
- %ways++;
- }
- }
- }
- }
- if(%y-1>0){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy-1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y-1).getid()){
- %nx=%x;
- %ny=%y-1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.down.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go down");
- %ways++;
- }
- }
- }
- }
- case "B":
- if(%x-1>0){
- if (getword(containerRayCast(%brick.position,%posx-1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x-1 @ "_" @ %y).getid()){
- %nx=%x-1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.left.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go left");
- %ways++;
- }
- }
- }
- }
- if(%x+1<=9){
- if (getword(containerRayCast(%brick.position,%posx+1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x+1 @ "_" @ %y).getid()){
- %nx=%x+1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.right.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go right");
- %ways++;
- }
- }
- }
- }
- if(%y+1<=9){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy+1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y+1).getid()){
- %nx=%x;
- %ny=%y+1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %x @ "_" @ %y+1).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.up.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go up");
- %ways++;
- }
- }
- }
- }
- if(%y-1>0){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy-1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y-1).getid()){
- %nx=%x;
- %ny=%y-1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.down.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go down");
- %ways++;
- }
- }
- }
- }
- case "C":
- if(%y+1<=9){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy+1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y+1).getid()){
- %nx=%x;
- %ny=%y+1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %x @ "_" @ %y+1).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.up.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go up");
- %ways++;
- }
- }
- }
- }
- if(%x+1<=9){
- if (getword(containerRayCast(%brick.position,%posx+1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x+1 @ "_" @ %y).getid()){
- %nx=%x+1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.right.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go right");
- %ways++;
- }
- }
- }
- }
- if(%x-1>0){
- if (getword(containerRayCast(%brick.position,%posx-1000 SPC %posy SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x-1 @ "_" @ %y).getid()){
- %nx=%x-1;
- %ny=%y;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.left.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go left");
- %ways++;
- }
- }
- }
- }
- if(%y-1>0){
- if (getword(containerRayCast(%brick.position,%posx SPC %posy-1000 SPC %posz,$TypeMasks::FxBrickObjectType),0)==("_maze_" @ %x @ "_" @ %y-1).getid()){
- %nx=%x;
- %ny=%y-1;
- if(!(%nx>9||%nx<1||%ny>9||%ny<1)){
- %newbrick=("_maze_" @ %nx @ "_" @ %ny).getid();
- if(!(%back.x==%nx&&%back.y==%ny)&&!%part.down.used&&!isHere(%nx,%ny)){
- %newpart=newMazePart(%nx,%ny,%part,%newbrick,getDirToBrick(%brick.position,%newbrick.position));
- $mazepiece=%newpart;
- //echo("can go down");
- %ways++;
- }
- }
- }
- }
- }
- if(getword(containerRayCast(%brick.position,_maze_end.position,$TypeMasks::FxBrickObjectType),0)==_maze_end.getid() && pyth(%brick.position,_maze_end.position)==3.5){
- //echo("found ending");
- %p1=new ScriptObject(){
- x=%x;
- y=%y;
- };
- $mazepath[$mazesolution].add(%p1);
- %p2=new ScriptObject(){
- ending=1;
- };
- $mazepath[$mazesolution].add(%p2);
- %time=getsimtime();
- if ($mazesolution$="C"){
- $mazecalculating=0;
- bp("Found ending!<br>Moves:<br>A:" SPC $mazepathA.getCount() @ "; B:" SPC $mazepathB.getCount() @ "; C:" SPC $mazepathC.getCount());
- %ma=$mazepathA.getCount();
- %mb=$mazepathB.getCount();
- %mc=$mazepathC.getCount();
- if(%ma<%mb&&%ma<%mc)
- $mazesolution="A";
- else if(%mb<%ma&&%mb<%mc)
- $mazesolution="B";
- else if(%mc<%ma&&%mc<%mb)
- $mazesolution="C";
- else
- $mazesolution="A";
- schedule(3000,0,calculateTime,%time);
- schedule(6000,0,workMaze);
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %section.setcolorfx(0);
- }
- }
- }
- for(%i=0;%i<$mazepath[$mazesolution].getCount();%i++){
- %obj=$mazepath[$mazesolution].getObject(%i);
- if(isObject(%obj)){
- if(%obj.ending){
- //_maze_end.setColorFx(3);
- }else{
- ("_maze_" @ %obj.x @ "_" @ %obj.y).setColorFx(3);
- }
- }
- }
- }else{
- //echo("finished solution" SPC $mazesolution);
- bp("Finished solution" SPC $mazesolution SPC "with" SPC $mazepath[$mazesolution].getCount() SPC "moves");
- $mazepiece=$mazeafterstart;
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %section.setcolorfx(3);
- }
- }
- }
- $mazestart.setColorFx(4);
- $mazeend.setColorFx(4);
- switch$($mazesolution){
- case "A":
- $mazesolution="B";
- case "B":
- $mazesolution="C";
- }
- schedule(1000,0,calculatePart);
- }
- return;
- }
- %brick.setColorFx(0);
- //echo("ways" SPC %ways);
- //echo(">>>COUNT" SPC $mazepath[$mazesolution].getCount() SPC "<<<");
- if(%ways==0&&%part.back.back.brick==_maze_start.getid()){
- //echo("DONE!");
- bp("Could not find a possible solution to the maze!");
- $mazepart=0;
- stopAllFx();
- schedule(1000,0,stopAllFx);
- return;
- }
- if(%ways==0){
- //echo("dead end");
- %part.used=1;
- $mazepiece=%part.back;
- %part.brick.setColorFx(2);
- schedule(50,0,stopfx,%part.brick);
- //echo("going back");
- $mazepath[$mazesolution].remove($mazepath[$mazesolution].getObject($mazepath[$mazesolution].getCount()-1));
- }else{
- %pobj=new ScriptObject();
- %pobj.x=%x;
- %pobj.y=%y;
- $mazepath[$mazesolution].add(%pobj);
- //echo("going" SPC getDirToBrick(%brick.position,$mazepiece.brick.position));
- }
- if($mazepiece!=%part)
- //schedule(50,0,calculatePart);
- calculatePart();
- }
- function stopAllFx(){
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %section.setcolorfx(0);
- }
- }
- }
- }
- package maze{
- function fxDTSBrick::onBotReachBrick(%this,%bot){
- if(%bot.spawnBrick.getId()==_maze_bot.getId() && $mazepart>=1){
- workMaze();
- }
- return parent::onBotReachBrick(%this,%bot);
- }
- };
- deactivatepackage(maze);
- activatepackage(maze);
- function workMaze(){
- %part=$mazepart++;
- %obj=$mazepath[$mazesolution].getobject(%part);
- if(isObject(%obj)){
- if(!%obj.ending){
- _maze_bot.hbot.gotobrick("maze_" @ %obj.x @ "_" @ %obj.y);
- %obj2=$mazepath[$mazesolution].getObject(%part-1);
- if(isObject(%obj2))
- ("_maze_" @ %obj2.x @ "_" @ %obj2.y).getId().setColorFx(0);
- //schedule(750,0,workMaze,%part++);
- }else{
- _maze_bot.hbot.gotobrick("maze_end");
- schedule(750,0,bp,"Finished! Maze solved!");
- for(%x=1;%x<=9;%x++){
- for(%y=1;%y<=9;%y++){
- %section="_maze_" @ %x @ "_" @ %y;
- %section=%section.getid();
- if(isObject(%section)){
- %section.setcolorfx(0);
- }
- }
- }
- }
- }
- }
- function calculateTime(%time)
- {
- bp("Time it took to calculate:<br>" @ (%time-$mazecalcbegin)/1000 @ " seconds." NL "Using solution" SPC $mazesolution @ ".");
- }
- //calculateStart();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement