public static ElementBase CreateElment(GameDef.GameObj e, int v, int h, int rt = -1) { switch (e) { case GameDef.GameObj.Fire: return(new FireElement(v, h, rt)); case GameDef.GameObj.Water: return(new WaterElement(v, h, rt)); case GameDef.GameObj.FlowWater: return(new FlowWaterElement(v, h, rt)); case GameDef.GameObj.Wood: return(new WoodElement(v, h, rt, Tools.rand.Next(3, 7), Tools.rand.Next(5, 10))); case GameDef.GameObj.Glod: return(new GlodElement(v, h, rt)); case GameDef.GameObj.Obsidian: return(new ObsidianElement(v, h, rt)); case GameDef.GameObj.Log: var ne = new WoodElement(v, h, rt, 15, 1000); ne.type = GameDef.GameObj.Log; //TODO临时基于木元素实现的耐烧木头,后期要改掉 return(ne); //TODO } return(new FireElement(0, 0)); }
// tool method //check /* * X * X o X * X */ protected bool isAdjacency(GameDef.GameObj elementType) { var map = gsm.stage.running_stage_map; var stage = gsm.stage; //up if (stage.isValidPos(pos_v + 1, pos_h) && map[pos_v + 1, pos_h] == elementType) { return(true); } //down if (stage.isValidPos(pos_v - 1, pos_h) && map[pos_v - 1, pos_h] == elementType) { return(true); } //right if (stage.isValidPos(pos_v, pos_h + 1) && map[pos_v, pos_h + 1] == elementType) { return(true); } //left if (stage.isValidPos(pos_v, pos_h - 1) && map[pos_v, pos_h - 1] == elementType) { return(true); } return(false); }
public bool isSpecifyGameObjAt(GameDef.GameObj obj, int v, int h) { if (!isValidPos(v, h)) { return(false); } return(running_stage_map[v, h] == obj); }
// 只设置关卡的元素地图还有玩家,其他特殊条件在各自的关卡类中实现 public static void LoadStageCommonDataFromFile(Stage stage) { System.IO.StreamReader file = new System.IO.StreamReader(stage.filePath); string line; //get map size line = file.ReadLine(); string[] size = line.Split(" "); int map_v_size = Int32.Parse(size[0]); int map_h_size = Int32.Parse(size[1]); int v_idx = 0; int h_idx = 0; stage.h_size = map_h_size; stage.v_size = map_v_size; stage.running_stage_map = new GameDef.GameObj[map_v_size + 1, map_h_size + 1]; stage.orignal_stage_map = new GameDef.GameObj[map_v_size + 1, map_h_size + 1]; stage.elements_map = new ElementBase[map_v_size + 1, map_h_size + 1]; stage.activateElement = new List <ElementBase>(); stage.goalDict = new Dictionary <int, bool>(); while ((line = file.ReadLine()) != null) { foreach (char c in line) { GameDef.GameObj obj = GameDef.GameObj.Air; if (GameDef.GlobalData.char2GameObjDict.ContainsKey(c)) { obj = GameDef.GlobalData.char2GameObjDict[c]; } //player 和 goal不往地图上写 if (obj == GameDef.GameObj.Player) { stage.player = new Player(h_idx, v_idx); } else if (obj == GameDef.GameObj.Goal) { stage.goalDict[Tools.PackCoords(v: v_idx, h: h_idx)] = false; } else { stage.running_stage_map[v_idx, h_idx] = obj; } stage.orignal_stage_map[v_idx, h_idx] = obj; h_idx++; } h_idx = 0; v_idx++; } stage.InitialCommon(); }
//check /* * X X X * X o X * X X X */ protected bool isNear(GameDef.GameObj elementType) { var map = gsm.stage.running_stage_map; var stage = gsm.stage; for (int r = this.pos_v - 1; r < this.pos_v + 3; r++) { for (int c = this.pos_h; c < this.pos_h + 3; c++) { if (stage.isValidPos(r, c) && map[r, c] == elementType) { return(true); } } } return(false); }
protected int getNearElementNum(GameDef.GameObj elementType) { var map = gsm.stage.running_stage_map; var stage = gsm.stage; int num = 0; for (int r = this.pos_v - 1; r <= this.pos_v + 1; r++) { for (int c = this.pos_h - 1; c <= this.pos_h + 1; c++) { if (stage.isValidPos(r, c) && map[r, c] == elementType) { num++; continue; } } } return(num); }
// tool method area public bool GenerateNewElement(GameDef.GameObj e, int v, int h, int rt = -1) { if (!Tools.isElment(e) || !isValidPos(v, h)) { Debug.WriteLine("[Stage] invaild element or pos!"); return(false); } // 只能覆盖空气或者火 if (!isAirAt(v, h) && !isFire(v, h)) { return(false); } // 先清理原位置的 this.RemoveElement(v, h); this.running_stage_map[v, h] = e; this.elements_map[v, h] = ElementFactory.CreateElment(e, v, h, rt); this.activateElement.Add(this.elements_map[v, h]); Debug.WriteLine("[Stage] generate new {0} element at ({1}, {2})", this.elements_map[v, h].name, v, h); return(true); }
private void AddPoint(GameDef.GameObj obj) { //TODO }
public static bool isElment(GameDef.GameObj o) { return(o > GameDef.GameObj.ElementStart && o < GameDef.GameObj.ElementEnd); }