public static void afterLoadingMap(StaticGod god) { // ##### TEST ###### var player = god.scene.FindEntity(EntityNames.player); var tiled = god.tiled; var actors = tiled.GetObjectGroup("actors"); if (actors == null) { return; } var actor = actors.Objects[0]; var pos = actor.tilePos(tiled); var actorEntity = god.scene.CreateEntity("script-test"); actorEntity.SetParent(god.scene.FindEntity(EntityNames.tiled)); var factory = EntityFactory .begin(actorEntity, god.posUtil) .body(pos, Dir9.S, true, true) .viewWodi8(Content.Chips.Wodi8.Cook_a) .script(RlHooks.testScript(player, actorEntity, "aaaaa\nbbbb\ncccccc\nddddddddddddd:")); god.gameCx.entities.Add(actorEntity); }
public void genDungeon(StaticGod god) { this.gen = new KarceroTiledGenerator(); // this.gen.genWithDefaultConfig(god.tiled.Width - 1, god.tiled.Height - 1); // TODO: remove the margin this.gen.genWithDefaultConfig(god.tiled.Width - 1, god.tiled.Height - 1); // this.gen.genWithDefaultConfig(god.tiled.Width, god.tiled.Height); this.gen.copyToTiled(god.tiled); }
public static void init(StaticGod god) { string initialStage = Content.Stages.@Static; god.ctrlCx = ControlContext.create(new VInput()); RlSceneSetup.loadTiledMap(god, initialStage); setup(god); RlHooks.afterInit(god); }
public override void OnStart() { base.OnStart(); this.god = new StaticGod(); god.scene = this; RlSceneSetup.init(god); #if DEBUG RlInspectorSpawn.spawn(god); #endif }
public void newFloor(StaticGod god) { KarceroDunGen.clearEnemies(god); getPlayer(god).get <FovComp>().fovFow.clearAll(); this.genDungeon(god); this.genEnemies(god); this.genStair(god); this.placePlayer(god); // FIXME: do not be dependent on RotEntityList or provide a safe way (god.gameCx.entities as RotEntityList).setIndex(0); }
public void genStair(StaticGod god) { var posUtil = god.posUtil; var entities = god.gameCx.entities; var stairGen = EntityFactory.begin(god.scene, EntityNames.stair, posUtil); stairGen.entity.SetParent(god.scene.FindEntity(EntityNames.tiled)); entities.Add(stairGen .body(gen.randomPosInRoom(god.gameCx), Dir9.random(), false, false) .viewWodi8(Content.Chips.Wodi8.Cook_a) .add(new Stair(Stair.Kind.Downstair)) .entity ); }
/// <summary> Delete entities without player tag </summary> public static void clearEnemies(StaticGod god) { var entities = god.gameCx.entities; for (int i = 0; i < entities.Count; i++) { var entity = entities[i]; if (entity.has <Player>()) { continue; } entities.Remove(entity); i--; entity.Destroy(); } }
public static void afterInit(StaticGod god) { var gen = new KarceroDunGen(); god.rules.add(new Rules.StairRule(gen, god)); // This should be called after actors are set up so that components work gen.newFloor(god); var e = god.scene.CreateEntity(EntityNames.debugDungeon); e.add(new DebugDungeonComp() { gen = gen, god = god }); // EpUiTestScene.testEpUi(god.scene); }
public void genEnemies(StaticGod god) { var posUtil = god.posUtil; var entities = god.gameCx.entities; int N = Nez.Random.Range(3, 7); for (int i = 0; i < N; i++) { var enemyGen = EntityFactory.begin(god.scene, $"actor_{i}", posUtil); enemyGen.entity.SetParent(god.scene.FindEntity(EntityNames.tiled)); entities.Add(enemyGen .body(gen.randomPosInRoom(god.gameCx), Dir9.random(), true, false) .actor(new Beh.RandomWalk(enemyGen.entity), 3) .viewWodi8(Content.Chips.Pochi.Animals.Usagi02) .performance(50, 10, 5) .entity ); continue; } }
// FIXME: the hacks void placePlayer(StaticGod god) { // HACK: tag var player = getPlayer(god); var pos = gen.randomPosInsideRoom(god.gameCx); // HACK: or invoke event player.get <Body>().setPos(pos); player.get <CharaView>().forceUpdatePos(); var playerFov = player.get <FovComp>(); playerFov.refresh(); Rules.PlayerFovRule.updateEntityVisiblitiesAll(god.scene, playerFov.fovFow); // HACK to update camera // TODO: move camera at once var camera = god.scene.FindEntity(EntityNames.camera)?.get <FollowCamera>(); if (camera != null) { (camera.setEntity(player) as IUpdatable).Update(); } }
static void setup(StaticGod god) { god.rules = new RlRuleStorage(god.gameCx); god.view = new RlViewPlatform( new RlViewServices(god.ctrlCx, god.gameCx, god.posUtil) ); RlPluginSetter.initRules(god.rules, god.ctrlCx, god.posUtil, god.scene); RlPluginSetter.initViews(god.view); { // create controls var cradle = god.ctrlCx.cradle; cradle.addAndPush(new TickControl(god.gameState, god.gameCx, god.view)); cradle.add(new AnimationControl()); cradle.add(new PlayerControl(god.gameCx)); } { // script control var cradle = god.ctrlCx.cradle; var scripter = cradle.add(new ScriptControl()); RlPluginSetter.initScriptViews(scripter, god.ctrlCx, god.posUtil); } }
// public Entity downStair; Entity getPlayer(StaticGod god) => god.scene.FindEntity(EntityNames.player);
/// <summary> Loads a tiled map and updates contexts dependent on it </summary> public static void loadTiledMap(StaticGod god, string path) { // dispose all the entities except the player if (god.gameCx != null) { for (int i = 0; i < god.gameCx.entities.Count; i++) { var e = god.gameCx.entities[i]; if (e == null) { Nez.Debug.Log("Null found as an entity in the roguelike world when clearing it"); god.gameCx.entities.RemoveAt(i); continue; } if (e.has <Player>()) { continue; } god.gameCx.entities.RemoveAt(i); i--; e.Destroy(); } } // dispose the previous tiled map if there is one var tiledEntity = god.scene.FindEntity(EntityNames.tiled); if (tiledEntity == null) { tiledEntity = god.scene.CreateEntity(EntityNames.tiled); } else { tiledEntity.rm <TiledMapRenderer>(); } { // load tiled map & update contexts god.tiled = god.scene.Content.LoadTiledMap(path); var tiledComp = tiledEntity // .add(new TiledMapRenderer(tiled, collisionLayerName: "collision")) .add(new TiledMapRenderer(god.tiled)) .zCx(layer: Layers.Stage, depth: Depths.Stage); // restore all contexts god.posUtil = new PosUtil(god.tiled, god.scene.Camera); god.gameCx = new RlGameContext(new TiledRlStage(god.tiled), new RotEntityList()); god.gameState = new RlGameState(god.gameCx.evHub, god.gameCx.entities as iRlActorIterator); god.rules?.replCtx(god.gameCx); god.view?.replCtx(god.gameCx, god.posUtil); } // FIXME: player is always created when loading a map var player = EntityFactory.genPlayer(god.scene, god.gameCx.stage as TiledRlStage, god.posUtil, god.tiled).entity; player.SetParent(tiledEntity); god.gameCx.entities.Add(player); setupFollowCamera(god.scene, player, god.tiled); RlSceneSetup.centeriszeTiledIfNeeded(god.tiled, tiledEntity); RlHooks.afterLoadingMap(god); }