Skip to content

Commit 54bebc2

Browse files
authored
Merge pull request #378 from Jameskmonger/remove-combat
refactor: delete old combat code 👋 Bye broken combat
2 parents b3a749e + 8ae343e commit 54bebc2

File tree

16 files changed

+6
-896
lines changed

16 files changed

+6
-896
lines changed

src/engine/world/actor/actor.ts

Lines changed: 2 additions & 201 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@ import { DefensiveBonuses, OffensiveBonuses, SkillBonuses } from '@engine/config
77
import { Position, DirectionData, directionFromIndex, WorldInstance, activeWorld } from '@engine/world';
88
import { Item, ItemContainer } from '@engine/world/items';
99
import { ActionCancelType, ActionPipeline } from '@engine/action';
10-
import { soundIds } from '@engine/world/config';
1110

1211
import { WalkingQueue } from './walking-queue';
13-
import { Animation, DamageType, Graphic, UpdateFlags } from './update-flags';
14-
import { Skill, Skills } from './skills';
12+
import { Animation, Graphic, UpdateFlags } from './update-flags';
13+
import { Skills } from './skills';
1514
import { Pathfinding } from './pathfinding';
16-
import { Attack, AttackDamageType } from './player/attack';
17-
import { Behavior } from './behaviors';
18-
import { Effect, EffectType } from './effect';
1915
import { ActorMetadata } from './metadata';
2016

2117

@@ -52,15 +48,6 @@ export abstract class Actor {
5248

5349
public pathfinding: Pathfinding = new Pathfinding(this);
5450
public lastMovementPosition: Position;
55-
// #region Behaviors and Combat flags/checks
56-
public inCombat: boolean = false;
57-
public meleeDistance: number = 1;
58-
public Behaviors: Behavior[] = [];
59-
public isDead: boolean = false;
60-
public combatTargets: Actor[] = [];
61-
public hitPoints = this.skills.hitpoints.level * 4;
62-
public maxHitPoints = this.skills.hitpoints.level * 4;
63-
public effects: Effect[] = []; //spells, effects, prayers, etc
6451

6552
protected randomMovementInterval;
6653
protected _instance: WorldInstance = null;
@@ -75,7 +62,6 @@ export abstract class Actor {
7562
private _walkDirection: number;
7663
private _runDirection: number;
7764
private _faceDirection: number;
78-
private _damageType = AttackDamageType.Crush;
7965
private _bonuses: { offensive: OffensiveBonuses, defensive: DefensiveBonuses, skill: SkillBonuses };
8066

8167
protected constructor(actorType: ActorType) {
@@ -100,159 +86,6 @@ export abstract class Actor {
10086
};
10187
}
10288

103-
public get highestCombatSkill(): Skill {
104-
const attack = this.skills.getLevel('attack');
105-
const magic = this.skills.getLevel('magic');
106-
const ranged = this.skills.getLevel('ranged');
107-
108-
if (ranged > magic && ranged > ranged) return ranged;
109-
else if (magic > attack && magic > ranged) return magic;
110-
else return attack;
111-
}
112-
113-
//https://oldschool.runescape.wiki/w/Attack_range#:~:text=All%20combat%20magic%20spells%20have,also%20allow%20longrange%20attack%20style
114-
// range should be within 10 tiles for magic
115-
// range should be within 7 for magic staff
116-
// https://www.theoatrix.net/post/how-defence-works-in-osrs
117-
// https://oldschool.runescape.wiki/w/Damage_per_second/Magic
118-
// https://oldschool.runescape.wiki/w/Successful_hit
119-
// https://oldschool.runescape.wiki/w/Combat_level#:~:text=Calculating%20combat%20level,-Simply&text=Add%20your%20Strength%20and%20Attack,have%20your%20melee%20combat%20level.&text=Multiply%20this%20by%200.325%20and,have%20your%20magic%20combat%20level
120-
// https://oldschool.runescape.wiki/w/Damage_per_second/Melee#:~:text=1%20Step%20one%3A%20Calculate%20the%20effective%20strength%20level%3B,1.7%20Step%20seven%3A%20Calculate%20the%20melee%20damage%20output
121-
public getAttackRoll(defender): Attack {
122-
123-
//the amount of damage is random from 0 to Max
124-
//stance modifiers
125-
const _stance_defense = 3;
126-
const _stance_accurate = 0;
127-
const _stance_controlled = 1;
128-
129-
// base level
130-
// ToDo: calculate prayer effects
131-
// round decimal result calulcation up
132-
// add 8
133-
// ToDo: add void bonues (effects)
134-
// round result down
135-
let equipmentBonus = this.bonuses.offensive.crush ?? 0;
136-
if (equipmentBonus <= 0) {
137-
equipmentBonus = 1;
138-
}
139-
/*
140-
* To calculate your maximum hit:
141-
142-
Effective strength level
143-
Multiply by(Equipment Melee Strength + 64)
144-
Add 320
145-
Divide by 640
146-
Round down to nearest integer
147-
Multiply by gear bonus
148-
Round down to nearest integer
149-
*/
150-
const stanceModifier = _stance_accurate;
151-
const strengthLevel = (this.skills.attack.level + stanceModifier + 8);
152-
let attackCalc = strengthLevel * (equipmentBonus + 64) + 320;
153-
attackCalc = Math.round(attackCalc / 640);
154-
//console.log(`strengthLevel = ${strengthLevel} \r\n attackCalc = ${attackCalc} \r\n equipmentBonus = ${equipmentBonus}`);
155-
const maximumHit = Math.round(attackCalc * equipmentBonus);
156-
157-
/*
158-
To calculate your effective attack level:
159-
160-
(Attack level + Attack level boost) * prayer bonus
161-
Round down to nearest integer
162-
+ 3 if using the accurate attack style, +1 if using controlled
163-
+ 8
164-
Multiply by 1.1 if wearing void
165-
Round down to nearest integer
166-
*/
167-
const attackLevel = this.skills.attack.level;
168-
let effectiveAttackLevel = attackLevel;
169-
170-
//Prayer/Effect bonus - calculate ALL the good and bad effects at once! (prayers, and magic effects, etc.)
171-
this.effects.filter(a => a.EffectType === EffectType.Attack).forEach((effect) => {
172-
effectiveAttackLevel += (attackLevel * effect.Modifier);
173-
});
174-
effectiveAttackLevel = Math.round(effectiveAttackLevel) + stanceModifier;
175-
176-
/*
177-
* Calculate the Attack roll
178-
Effective attack level * (Equipment Attack bonus + 64)
179-
Multiply by gear bonus
180-
Round down to nearest integer
181-
* */
182-
let attack = new Attack();
183-
attack.damageType = this.damageType ?? AttackDamageType.Crush;
184-
attack.attackRoll = Math.round(effectiveAttackLevel * (equipmentBonus + 64));
185-
attack = defender.getDefenseRoll(attack);
186-
attack.maximumHit = maximumHit;
187-
if (attack.attackRoll >= attack.defenseRoll) attack.hitChance = 1 - ((attack.defenseRoll + 2) / (2 * (attack.attackRoll + 1)))
188-
if (attack.attackRoll < attack.defenseRoll) attack.hitChance = attack.attackRoll / (2 * attack.defenseRoll + 1);
189-
190-
attack.damage = Math.round((maximumHit * attack.hitChance) / 2);
191-
return attack;
192-
}
193-
194-
public getDefenseRoll(attack: Attack): Attack {
195-
//attack need to know the damage roll, which is the item bonuses the weapon damage type etc.
196-
197-
198-
//stance modifiers
199-
const _stance_defense = 3;
200-
const _stance_accurate = 0;
201-
const _stance_controlled = 1;
202-
203-
// base level
204-
// calculate prayer effects
205-
// round decimal result calculation up
206-
// add 8
207-
// ToDo: add void bonuses (effects)
208-
// round result down
209-
210-
const equipmentBonus: number = this.bonuses.defensive.crush ?? 0; //object prototyping to find property by name (JS style =/)
211-
212-
const stanceModifier: number = _stance_accurate;
213-
214-
215-
attack.defenseRoll = (this.skills.defence.level + stanceModifier + 8) * (equipmentBonus + 64);
216-
//Prayer/Effect bonus - calculate ALL the good and bad effects at once! (prayers, and magic effects, etc.)
217-
this.effects.filter(a => a.EffectType === EffectType.BoostDefence || a.EffectType === EffectType.LowerDefence).forEach((effect) => {
218-
attack.defenseRoll += (this.skills.defence.level * effect.Modifier);
219-
});
220-
attack.defenseRoll = Math.round(attack.defenseRoll);
221-
return attack;
222-
//+ stance modifier
223-
}
224-
// #endregion
225-
226-
public damage(amount: number, damageType: DamageType = DamageType.DAMAGE) {
227-
const armorReduction = 0;
228-
const spellDamageReduction = 0;
229-
const poisonReistance = 0;
230-
amount -= armorReduction;
231-
this.hitPoints -= amount;
232-
this.skills.setHitpoints(this.hitPoints);
233-
this.updateFlags.addDamage(amount, amount === 0 ? DamageType.NO_DAMAGE : damageType,
234-
this.hitPoints, this.maxHitPoints);
235-
//this actor should respond when hit
236-
activeWorld.playLocationSound(this.position, soundIds.npc.human.noArmorHitPlayer,5)
237-
this.playAnimation(this.getBlockAnimation());
238-
}
239-
240-
241-
242-
//public damage(amount: number, damageType: DamageType = DamageType.DAMAGE): 'alive' | 'dead' {
243-
// let remainingHitpoints: number = this.skills.hitpoints.level - amount;
244-
// const maximumHitpoints: number = this.skills.hitpoints.levelForExp;
245-
// if(remainingHitpoints < 0) {
246-
// remainingHitpoints = 0;
247-
// }
248-
249-
// this.skills.setHitpoints(remainingHitpoints);
250-
// this.updateFlags.addDamage(amount, amount === 0 ? DamageType.NO_DAMAGE : damageType,
251-
// remainingHitpoints, maximumHitpoints);
252-
253-
// return remainingHitpoints === 0 ? 'dead' : 'alive';
254-
//}
255-
25689
/**
25790
* Waits for the actor to reach the specified position before resolving it's promise.
25891
* The promise will be rejected if the actor's walking queue changes or their movement is otherwise canceled.
@@ -401,28 +234,6 @@ export abstract class Actor {
401234
return true;
402235
}
403236

404-
public tail(target: Actor): void {
405-
this.face(target, false, false, false);
406-
407-
if(this.metadata.tailing && this.metadata.tailing.equals(target)) {
408-
return;
409-
}
410-
411-
this.metadata.tailing = target;
412-
413-
this.moveTo(target);
414-
const subscription = target.walkingQueue.movementEvent.subscribe(async () => this.moveTo(target));
415-
416-
this.actionsCancelled.pipe(
417-
filter(type => type !== 'pathing-movement'),
418-
take(1)
419-
).subscribe(() => {
420-
subscription.unsubscribe();
421-
this.face(null);
422-
delete this.metadata.tailing;
423-
});
424-
}
425-
426237
public face(face: Position | Actor | null, clearWalkingQueue: boolean = true, autoClear: boolean = true, clearedByWalking: boolean = true): void {
427238
if(face === null) {
428239
this.clearFaceActor();
@@ -628,8 +439,6 @@ export abstract class Actor {
628439
return true;
629440
}
630441

631-
public abstract getAttackAnimation(): number;
632-
public abstract getBlockAnimation(): number;
633442
public abstract equals(actor: Actor): boolean;
634443

635444
public get position(): Position {
@@ -684,14 +493,6 @@ export abstract class Actor {
684493
this._faceDirection = value;
685494
}
686495

687-
public get damageType() {
688-
return this._damageType;
689-
}
690-
691-
public set damageType(value) {
692-
this._damageType = value;
693-
}
694-
695496
public get busy(): boolean {
696497
return this._busy;
697498
}

src/engine/world/actor/behaviors/auto-attack.behavior.ts

Lines changed: 0 additions & 80 deletions
This file was deleted.

src/engine/world/actor/behaviors/behavior.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/engine/world/actor/behaviors/index.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)