Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14,727 changes: 14,716 additions & 11 deletions package-lock.json

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import React, { Component } from 'react';
import { render } from 'react-dom';
import { Cleric, Mage, Thief, Warrior } from './workshop/Characters';
import { GameTick, CombatPhase } from './off-limits/Game';
import './style.css';
import { CombatUI } from './off-limits/CombatUI';
import { LootUI } from './off-limits/LootUI';
import { MenuUI } from './off-limits/MenuUI';
import { equip, ICharacter } from './off-limits/ICharacter';
import { GetItemsInTreasureChests } from './workshop/Weapons';
import { IItem } from './off-limits/IWeapons';
import Warrior from './workshop/characters/Warrior';
import Cleric from './workshop/characters/Cleric';
import Mage from './workshop/characters/Mage';
import Thief from './workshop/characters/Thief';
import { GetItemsInTreasureChests } from './workshop/systems/Loot';

interface AppProps {}
export interface AppState {
Expand Down
24 changes: 0 additions & 24 deletions src/workshop/BaseCharacter.tsx

This file was deleted.

123 changes: 0 additions & 123 deletions src/workshop/Characters.tsx

This file was deleted.

56 changes: 0 additions & 56 deletions src/workshop/Weapons.tsx

This file was deleted.

115 changes: 115 additions & 0 deletions src/workshop/characters/Character.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import { CharacterClassName, ICharacter, ICharacterActionDecision } from "../../off-limits/ICharacter";
import { IWeapon, IItem, isRangedWeapon, IRangedWeapon, isEnchantedItem, isMeleeWeapon, isConsumable, IEnchantedItem } from "../../off-limits/IWeapons";

export abstract class Character implements ICharacter {
className: CharacterClassName;
name: string = '';
health: number = 5;
position: number = 10;
weapons: IWeapon[] = [];
key: number;
item?: IItem;

constructor(className: CharacterClassName, key: number) {
this.className = className;
this.key = key;
}

classname(): CharacterClassName {
return this.className;
}

move() {
const bestWeapon = this.getBestUseableWeapon();

if(bestWeapon.index <= -1) {
this.position = 10;
} else {
const weapon = this.weapons[bestWeapon.index];

if(isMeleeWeapon(weapon))
this.position = weapon.meleeRange;

if(isRangedWeapon(weapon))
this.position = 10;
}
}

chooseAction(): ICharacterActionDecision {
const bestWeapon = this.getBestUseableWeapon();

//Verify my current HP pool and check if I can heal
if(this.item) {
if(isConsumable(this.item)) {
return {
use: this.item
}
}

if(isEnchantedItem(this.item)) {
if(this.health <= 3 && this.item.partyHealthBonus) {
return {
use: this.item
}
} else if(this.item.fireDamage) {
//Must check if we have a weapon and if it can do more or less damage than our item

if(bestWeapon.index <= -1) { // there is no weapon
return {
use: this.item
}
} else {
if(this.item.fireDamage > bestWeapon.damage) {
return {
use: this.item
}
} else {
return {
attack: this.weapons[bestWeapon.index]
}
}
}
}
}
}

if(this.health <= 3 && this.canHeal(this.weapons[bestWeapon.index]))
return {
use: this.weapons[bestWeapon.index]
}

return {
attack: this.weapons[bestWeapon.index]
}
}

canHeal(weapon: any): weapon is IEnchantedItem {
return weapon.partyHealthBonus && weapon.partyHealthBonus > 0;
}

getASCIIStatus(): string {
return this.health <= 0 ? "X" : this.className?.substring(0, 1);
}

getBestUseableWeapon(): { damage: number, index: number } {
let damage = 0;
let index = -1;

for (let i = 0; i < this.weapons.length; i++) {
const weapon = this.weapons[i];
let cWeaponDamage = 0;
if(isRangedWeapon(weapon) && weapon.projectiles.length > 0) {
cWeaponDamage = weapon.damage + weapon.projectiles[0].damage;
} else {
cWeaponDamage = weapon.damage;
}

if(cWeaponDamage > damage) {
damage = cWeaponDamage;
index = i;
}
}

return { damage, index };
}
}
10 changes: 10 additions & 0 deletions src/workshop/characters/Cleric.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { equip } from "../../off-limits/ICharacter";
import { ClericStartItem } from "../systems/Loot";
import { Character } from "./Character";

export default class Cleric extends Character {
constructor(public name: string, public key: number) {
super('Cleric', key);
equip(ClericStartItem, this);
}
}
10 changes: 10 additions & 0 deletions src/workshop/characters/Mage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { equip } from "../../off-limits/ICharacter";
import { MageStartItem } from "../systems/Loot";
import { Character } from "./Character";

export default class Mage extends Character {
constructor(public name: string, public key: number) {
super('Mage', key);
equip(MageStartItem, this);
}
}
10 changes: 10 additions & 0 deletions src/workshop/characters/Thief.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { equip } from "../../off-limits/ICharacter";
import { ThiefStartItem } from "../systems/Loot";
import { Character } from "./Character";

export default class Thief extends Character {
constructor(public name: string, public key: number) {
super('Thief', key);
equip(ThiefStartItem, this);
}
}
10 changes: 10 additions & 0 deletions src/workshop/characters/Warrior.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { equip } from "../../off-limits/ICharacter";
import { WarriorStartItem } from "../systems/Loot";
import { Character } from "./Character";

export default class Warrior extends Character {
constructor(public name: string, public key: number) {
super('Warrior', key);
equip(WarriorStartItem, this);
}
}
Loading