0% found this document useful (0 votes)
4 views12 pages

Game Utility and State Management Code

js

Uploaded by

abc154154154
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views12 pages

Game Utility and State Management Code

js

Uploaded by

abc154154154
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

/* ============================================================

UTILITY MODULE
============================================================ */

const Util = {
rand(min, max) {
return [Link]([Link]() * (max - min + 1)) + min;
},
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
},
logger: {
info(msg) { [Link]("[INFO]", msg); },
warn(msg) { [Link]("[WARN]", msg); },
error(msg) { [Link]("[ERROR]", msg); }
},
math: {
clamp(x, min, max) { return [Link](min, [Link](max, x)); },
distance(a, b) { return [Link]((a.x - b.x) ** 2 + (a.y - b.y) ** 2); }
}
};

/* ============================================================
EVENT BUS
============================================================ */

class EventBus {
constructor() { [Link] = {}; }

subscribe(type, callback) {
if (![Link][type]) [Link][type] = [];
[Link][type].push(callback);
}

emit(type, data) {
if ([Link][type]) {
for (const cb of [Link][type]) cb(data);
}
}
}

const eventBus = new EventBus();

/* ============================================================
STATE MACHINE
============================================================ */

class State {
enter() {}
update() {}
exit() {}
}

class MainMenuState extends State {


enter() { [Link]("Entering MainMenu"); }
update() { [Link]("MainMenu running..."); }
}

class CombatState extends State {


update() { [Link]("Combat happening..."); }
}

class StateMachine {
constructor() { [Link] = null; }

change(state) {
if ([Link]) [Link]();
[Link] = state;
[Link]();
}

update() {
if ([Link]) [Link]();
}
}

/* ============================================================
ITEM SYSTEM
============================================================ */

class Item {
constructor(id, desc) {
[Link] = id;
[Link] = desc;
}
}

class Inventory {
constructor() {
[Link] = [];
}
add(item) {
[Link](item);
[Link]("Added item: " + [Link]);
}
list() {
return [Link](i => `${[Link]}: ${[Link]}`);
}
}

/* ============================================================
SKILL SYSTEM
============================================================ */

class Skill {
constructor(name, damage) {
[Link] = name;
[Link] = damage;
}
}

class SkillSet {
constructor() {
[Link] = [];
}
add(skill) {
[Link](skill);
}
getRandom() {
return [Link][[Link](0, [Link] - 1)];
}
}

/* ============================================================
ENTITY BASE
============================================================ */

class Entity {
constructor(name, hp) {
[Link] = name;
[Link] = hp;
[Link] = hp;
this.x = 0;
this.y = 0;
}

distanceTo(e) {
return [Link](this, e);
}

move(dx, dy) {
this.x += dx;
this.y += dy;
}
serialize() {
return [Link]({
name: [Link],
hp: [Link],
maxHp: [Link],
x: this.x,
y: this.y
});
}
}

/* ============================================================
PLAYER + NPC + MONSTER
============================================================ */

class Player extends Entity {


constructor(name) {
super(name, 100);
[Link] = 1;
[Link] = new Inventory();
[Link] = new SkillSet();
[Link](new Skill("Slash", 10));
[Link](new Skill("Fireball", 30));
}

attack(target) {
const s = [Link]();
[Link] -= [Link];
[Link]("hit", { from: [Link], to: [Link], dmg: [Link] });
}
}

class Monster extends Entity {


constructor(name, hp) {
super(name, hp);
[Link] = false;
}

update() {
if ([Link] < [Link] / 2 && ![Link]) {
[Link] = true;
[Link]([Link] + " has entered FRENZY mode!");
}
}
}

class NPC extends Entity {


talk() {
[Link]([Link] + " says: Hello traveler.");
}
}

/* ============================================================
PATHFINDING A* + BFS
============================================================ */

function bfs(start, goal, grid) {


let q = [start];
let parent = {};
parent[start.x + "," + start.y] = null;

while ([Link]) {
const cur = [Link]();
if (cur.x === goal.x && cur.y === goal.y) break;

for (const d of [[1,0],[-1,0],[0,1],[0,-1]]) {


const nx = cur.x + d[0], ny = cur.y + d[1];
if (grid[nx] && grid[nx][ny] && !(nx + "," + ny in parent)) {
parent[nx + "," + ny] = cur;
[Link]({x:nx,y:ny});
}
}
}

const path = [];


let cur = goal;
while (cur && parent[cur.x + "," + cur.y] !== null) {
[Link](cur);
cur = parent[cur.x + "," + cur.y];
}
[Link]();
return path;
}

/* ============================================================
BEHAVIOR TREE AI (simplified)
============================================================ */

class BehaviorNode {
run(entity) {}
}

class Selector extends BehaviorNode {


constructor(children = []) {
super();
[Link] = children;
}
run(entity) {
for (const c of [Link]) {
if ([Link](entity)) return true;
}
return false;
}
}

class Action_HealSelf extends BehaviorNode {


run(entity) {
if ([Link] < [Link] * 0.3) {
[Link] += 5;
[Link]([Link] + " heals itself.");
return true;
}
return false;
}
}

class Action_Roam extends BehaviorNode {


run(entity) {
[Link]([Link](-1,1), [Link](-1,1));
return true;
}
}

/* ============================================================
MAP GENERATOR (NOISE-LIKE)
============================================================ */

class MapGenerator {
static generate(width, height) {
const map = [];
for (let i=0; i<height; i++) {
const row = [];
for (let j=0; j<width; j++) {
const noise = [Link](1, 100);
[Link](noise > 20 ? 1 : 0); // 1 walkable, 0 block
}
[Link](row);
}
return map;
}
}

/* ============================================================
NETWORK MOCK (like WebSocket)
============================================================ */

class NetConnection {
constructor(url) {
[Link] = url;
[Link] = false;
}

async connect() {
[Link]("Connecting to " + [Link]);
await [Link](300);
[Link] = true;
[Link]("Connected.");
}

send(data) {
if (![Link]) return [Link]("Connection closed!");
[Link]("Sent packet: " + [Link](data));
}
}

/* ============================================================
ASYNC JOB MANAGER
============================================================ */

class JobManager {
constructor() {
[Link] = [];
}
add(job) {
[Link](job);
[Link]("Job added.");
}
async runAll() {
for (const job of [Link]) {
await job();
}
}
}

const jobManager = new JobManager();

/* ============================================================
SCENE MANAGER
============================================================ */

class Scene {
enter() {}
update() {}
}

class CityScene extends Scene {


enter() {
[Link]("Entered City Scene.");
}
update() {
[Link]("City is bustling...");
}
}

class DungeonScene extends Scene {


update() {
[Link]("Exploring dungeon...");
}
}

/* ============================================================
MAIN GAME LOOP
============================================================ */

(async function main() {

[Link]("Initializing game...");

[Link]("hit", e => {
[Link](`${[Link]} dealt ${[Link]} to ${[Link]}`);
});

const player = new Player("Hero");


const monster = new Monster("Goblin", 60);
const npc = new NPC("OldMan");

[Link](new Item("potion", "Heals 50 HP"));


[Link](new Item("ether", "Restore MP"));

const grid = [Link](20, 20);


const path = bfs({x:0,y:0}, {x:5,y:5}, grid);
[Link]("Path length: " + [Link]);

[Link]();

[Link](monster);

[Link]();
const ai = new Selector([
new Action_HealSelf(),
new Action_Roam()
]);

[Link](monster);

const net = new NetConnection("[Link]


await [Link]();
[Link]({type:"login", user:"Hero"});

[Link](async () => {
[Link]("Running job 1...");
await [Link](200);
});

[Link](async () => {
[Link]("Running job 2...");
await [Link](150);
});

await [Link]();

const fsm = new StateMachine();


[Link](new MainMenuState());
[Link]();
[Link](new CombatState());
[Link]();

const scene = new CityScene();


[Link]();
[Link]();

[Link]("Player JSON:", [Link]());

})();

const grid = [Link](20, 20);


const path = bfs({x:0,y:0}, {x:5,y:5}, grid);
[Link]("Path length: " + [Link]);

[Link]();

[Link](monster);

[Link]();
const ai = new Selector([
new Action_HealSelf(),
new Action_Roam()
]);

[Link](monster);

const net = new NetConnection("[Link]


await [Link]();
[Link]({type:"login", user:"Hero"});

[Link](async () => {
[Link]("Running job 1...");
await [Link](200);
});

[Link](async () => {
[Link]("Running job 2...");
await [Link](150);
});

await [Link]();

const fsm = new StateMachine();


[Link](new MainMenuState());
[Link]();
[Link](new CombatState());
[Link]();

const scene = new CityScene();


[Link]();
[Link]();

[Link]("Player JSON:", [Link]());

})();

const grid = [Link](20, 20);


const path = bfs({x:0,y:0}, {x:5,y:5}, grid);
[Link]("Path length: " + [Link]);

[Link]();

[Link](monster);

[Link]();
const ai = new Selector([
new Action_HealSelf(),
new Action_Roam()
]);

[Link](monster);

const net = new NetConnection("[Link]


await [Link]();
[Link]({type:"login", user:"Hero"});

[Link](async () => {
[Link]("Running job 1...");
await [Link](200);
});

[Link](async () => {
[Link]("Running job 2...");
await [Link](150);
});

await [Link]();

const fsm = new StateMachine();


[Link](new MainMenuState());
[Link]();
[Link](new CombatState());
[Link]();

const scene = new CityScene();


[Link]();
[Link]();

[Link]("Player JSON:", [Link]());

})();

const grid = [Link](20, 20);


const path = bfs({x:0,y:0}, {x:5,y:5}, grid);
[Link]("Path length: " + [Link]);

[Link]();

[Link](monster);
[Link]();

const ai = new Selector([


new Action_HealSelf(),
new Action_Roam()
]);

[Link](monster);

const net = new NetConnection("[Link]


await [Link]();
[Link]({type:"login", user:"Hero"});

[Link](async () => {
[Link]("Running job 1...");
await [Link](200);
});

[Link](async () => {
[Link]("Running job 2...");
await [Link](150);
});

await [Link]();

const fsm = new StateMachine();


[Link](new MainMenuState());
[Link]();
[Link](new CombatState());
[Link]();

const scene = new CityScene();


[Link]();
[Link]();

[Link]("Player JSON:", [Link]());

})();

You might also like