1
0
mirror of https://github.com/AlexKrunch/AnonIB-3D.git synced 2024-12-03 02:49:14 -05:00
AnonIB-3D/src_php/php/Models/Game/Level.php
2019-08-17 10:21:07 +02:00

362 lines
11 KiB
PHP

<?php
class Level {
public $name;
public $key;
public $theme = "medieval";
public $x;
public $y;
public $width;
public $height;
public $data;
public $door_key_n;
public $door_key_e;
public $door_key_s;
public $door_key_w;
public $is_safe = false;
public $is_chan = false;
public $is_secret = false;
public $level_data;
/*
public $TILE_GROUND = 0;
public $TILE_WALL = 1;
public $TILE_WALL_DRAWABLE = 2;
public $TILE_DOOR = 3;*/
function __construct( $name, $width, $height, $is_chan, $is_secret) {
$this-> name = $name;
$this-> width = $width;
$this-> height = $height;
$this-> is_chan = $is_chan;
$this-> is_secret = $is_secret;
$this-> key = $name;
}
public function setKeyForDir($key_,$dir_){
switch($dir_){
case 0:
$this -> door_key_n = $key_;
break;
case 1:
$this -> door_key_e = $key_;
break;
case 2:
$this -> door_key_s = $key_;
break;
case 3:
$this -> door_key_w = $key_;
break;
}
}
public function getNumDoors(){
$num = 0;
if(isset($this -> door_key_n)) $num ++;
if(isset($this -> door_key_e)) $num ++;
if(isset($this -> door_key_s)) $num ++;
if(isset($this -> door_key_w)) $num ++;
return $num;
}
public function getDoorCoordKey($key_){
$x = 0;
$y = 0;
//test N
if($key_ == $this -> door_key_n){
for($x = 0 ; $x < $this->width ; $x++ ){
$tile = $this -> pickTile($this->width, $this->height,new Coord($x , $y));
if($tile == Tile::getValueForName("gate")) return new Coord($x,$y);
}
} else if($key_ == $this -> door_key_e){
$x = $this->width - 1;
for($y = 0 ; $y < $this->height ; $y++ ){
$tile = $this -> pickTile( $this->width, $this->height, new Coord($x , $y));
if($tile == Tile::getValueForName("gate")) return new Coord($x,$y);
}
} else if($key_ == $this -> door_key_s){
$y = $this->height - 1;
for($x = 0 ; $x < $this->width ; $x++ ){
$tile = $this -> pickTile($this->width, $this->height,new Coord($x , $y));
if($tile == Tile::getValueForName("gate")) return new Coord($x,$y);
}
}else if($key_ == $this -> door_key_w){
for($y = 0 ; $y < $this->height ; $y++ ){
$tile = $this -> pickTile($this->width, $this->height,new Coord($x , $y));
if($tile == Tile::getValueForName("gate")) return new Coord($x,$y);
}
}
return null;
}
public function placePlayerForKey($key_){
$coord = $this -> getDoorCoordKey($key_);
if($coord->y == 0) {
return new Coord($coord->x , $coord->y+1);
} else if($coord->x == $this->width-1) {
return new Coord($coord->x-1 , $coord->y);
}else if($coord->y == $this->height-1) {
return new Coord($coord->x , $coord->y-1);
}else if($coord->x == 0) {
return new Coord($coord->x+1 , $coord->y);
}
return new Coord(1 , 1);
}
public function initLevelData(){
//New version: all the level are the same
$this->level_data =
[
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,
1,0,0,1,0,0,0,0,0,1,0,4,0,0,1,0,0,1,
1,0,0,1,0,0,13,0,0,1,0,1,0,0,1,0,0,1,
1,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,1,
1,0,0,1,0,0,0,0,0,1,3,1,0,0,1,0,0,1,
1,0,0,1,1,1,4,1,1,1,1,1,0,0,1,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,
14,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
];
$this-> width = 18;
$this-> height = 15;
/*
//Create a middle room
//Middle room looks cool everywhere
$this->fillgrid(Tile::getValueForName("ground"), $this->width, $this->height);
//Place wall
$this->makeWallForLevel();
//place gates
$coord = new Coord(0,0);
if(isset( $this -> door_key_n)){
$coord ->y = 0;
$coord ->x = rand(1, $this->width-2);
$this->placeToLevel(Tile::getValueForName("gate"), $this->width, $this->height, $coord);
}
if(isset( $this -> door_key_e)){
$coord ->y = rand(1, $this->height-2);
$coord ->x = $this->width-1;
$this->placeToLevel(Tile::getValueForName("gate"), $this->width, $this->height, $coord);
}
if(isset( $this -> door_key_s)){
$coord ->y = $this->height-1;
$coord ->x = rand(1, $this->width-2);
$this->placeToLevel(Tile::getValueForName("gate"), $this->width, $this->height, $coord);
}
if(isset( $this -> door_key_w)){
$coord ->y = rand(1, $this->height-2);
$coord ->x = 0;
$this->placeToLevel(Tile::getValueForName("gate"), $this->width, $this->height, $coord);
}*/
//Display the level
$this -> displayLevelData();
}
function makeWallForLevel(){
//North wall
$y = 0;
for ($x = 0 ; $x <= $this-> width ; $x++){
$coord = new Coord($x,$y);
$this->placeToLevel(Tile::getValueForName("wall"), $this->width, $this->height, $coord);
}
//South wall
$y = $this->height-1;
for ($x = 0 ; $x < $this-> width ; $x++){
$coord = new Coord($x,$y);
$this->placeToLevel(Tile::getValueForName("wall"), $this->width, $this->height, $coord);
}
//West
$x = 0;
for ($y = 0 ; $y < $this-> height ; $y++){
$coord = new Coord($x,$y);
$this->placeToLevel(Tile::getValueForName("wall"), $this->width, $this->height, $coord);
}
//Est
$x = $this->width-1;
for ($y = 0 ; $y < $this-> height ; $y++){
$coord = new Coord($x,$y);
$this->placeToLevel(Tile::getValueForName("wall"), $this->width, $this->height, $coord);
}
}
public function displayLevelData(){
echo "# MAP ".$this->name." num tiles:".count($this->level_data)."<br/>";
$x = 0;
$y = 0;
foreach($this->level_data as $data){
//echo "x:".$x."y:".$y."<br/>";
/*
if(!isset( $data ) || $data == Tile::getValueForName("wall") ){
echo "#";
} else if($data == Tile::getValueForName("ground")) {
echo ".";
} else if($data == Tile::getValueForName("door")) {
//echo "x:".$x."y:".$y."<br/>";
echo "D";
}*/
echo Tile::getDisplayForVal($data);
$x ++;
if($x >= $this -> width){
$x = 0;
$y ++;
echo "<br/>";
}
}
}
//Level Data management
function fillgrid($defaultTile_, $width_, $height_){
$this->level_data = array();
for ($i = 0; $i < $height_*$width_; $i++) {
array_push( $this->level_data ,$defaultTile_);
}
}
function placeToLevel($data, $width_, $height_, $coord){
$this->level_data [ ( $coord->y *$width_) + $coord->x] = $data;
}
function pickTile($width_, $height_, $coord){
return $this->level_data [ ( $coord->y *$width_)+ $coord->x];
}
//Fill a data base row
public function fillRow($row_){
echo "Write level: ".$this-> name."; for key".$this-> key." with ".count($this-> level_data)." data";
$row_ -> key = $this-> key;
$row_ -> name = $this-> name;
$row_ -> theme = $this-> theme;
/*
$row_ -> x = $this-> x;
$row_ -> y = $this-> y;
*/
$row_ -> width = $this-> width;
$row_ -> height = $this-> height;
if(isset( $this-> door_key_n))$row_ -> door_key_n = $this-> door_key_n;
if(isset( $this-> door_key_e)) $row_ -> door_key_e = $this-> door_key_e;
if(isset( $this-> door_key_s)) $row_ -> door_key_s = $this-> door_key_s;
if(isset( $this-> door_key_w)) $row_ -> door_key_w = $this-> door_key_w;
$dataString = "";
foreach( $this-> level_data as $data ){
$dataString = $dataString.$data.",";
}
$dataString = $dataString .substr(0, strlen($dataString) - 1);
$row_ -> level_data = $dataString;
$row_ -> is_safe = $this-> is_safe;
$row_ -> is_chan = $this-> is_chan;
$row_ -> is_secret = $this-> is_secret;
//var_dump( $row_);
return $row_;
}
//Get Ground tiles
public function getEmptyCoord(){
$coords = array();
$x = 0;
$y = 0;
foreach( $this-> level_data as $data ){
if((int) $data == Tile::getValueForName("ground")){
$coord = new Coord($x,$y);
array_push($coords,$coord);
}
$x ++;
if($x >= $this-> width){
$y ++;
$x = 0;
}
}
return $coords[rand( 0, count( $coords )-1)];
}
//Fill a data base row
public static function parseRow($row_){
$level = new Level("",0,0,false, false);
$level -> key = $row_ -> key;
$level -> name = $row_ -> name;
$level -> theme = $row_ -> theme;
$level -> is_secret = $row_ -> is_secret;
$level -> x = $row_ -> x;
$level -> y = $row_ -> y;
$level -> width = $row_ -> width;
$level -> height = $row_ -> height;
if(isset( $row_-> door_key_n)) $level -> door_key_n = $row_-> door_key_n;
if(isset( $row_-> door_key_e)) $level -> door_key_e = $row_-> door_key_e;
if(isset( $row_-> door_key_s)) $level -> door_key_s = $row_-> door_key_s;
if(isset( $row_-> door_key_w)) $level -> door_key_w = $row_-> door_key_w;
//parse the data
$level -> level_data = explode(",",$row_ -> level_data);
$level -> is_safe = $row_-> is_safe;
$level -> is_chan = $row_-> is_chan;
return $level ;
}
//Fill a data base row
public static function getDim($num){
$minTile = 4;
if($num < $minTile ) $num = $minTile;
$width = rand ( $minTile , $num - $minTile );
$height = $num - $width;
return new Coord( $width, $height);
}
}