Skip to content

Commit

Permalink
Add /tracker command
Browse files Browse the repository at this point in the history
  • Loading branch information
joemcbride committed Mar 12, 2019
1 parent 37a78b9 commit 33030aa
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 38 deletions.
6 changes: 6 additions & 0 deletions src/Outlander.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@
F9C651C820C64CB300746661 /* Clock.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C651C620C64CB300746661 /* Clock.swift */; };
F9C651CA20CBA1F800746661 /* TestXmlCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C651C920CBA1F800746661 /* TestXmlCommandHandler.swift */; };
F9C651CB20CBA1F800746661 /* TestXmlCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C651C920CBA1F800746661 /* TestXmlCommandHandler.swift */; };
F9C7A8AF22379BAD0049C62F /* TrackerCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C7A8AE22379BAD0049C62F /* TrackerCommandHandler.swift */; };
F9C7A8B022379BAD0049C62F /* TrackerCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C7A8AE22379BAD0049C62F /* TrackerCommandHandler.swift */; };
F9CAB0B41AD727DB001296BE /* AuthBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9CAB0B31AD727DB001296BE /* AuthBuilder.swift */; };
F9CAB0B51AD727DB001296BE /* AuthBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9CAB0B31AD727DB001296BE /* AuthBuilder.swift */; };
F9CB31101903238B004587A5 /* SkillExp.m in Sources */ = {isa = PBXBuildFile; fileRef = F9CB310F1903238B004587A5 /* SkillExp.m */; };
Expand Down Expand Up @@ -836,6 +838,7 @@
F9C29109189AB86000F70224 /* Vitals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Vitals.m; sourceTree = "<group>"; };
F9C651C620C64CB300746661 /* Clock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Clock.swift; sourceTree = "<group>"; };
F9C651C920CBA1F800746661 /* TestXmlCommandHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestXmlCommandHandler.swift; sourceTree = "<group>"; };
F9C7A8AE22379BAD0049C62F /* TrackerCommandHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TrackerCommandHandler.swift; path = Scripting/TrackerCommandHandler.swift; sourceTree = "<group>"; };
F9CAB0B31AD727DB001296BE /* AuthBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthBuilder.swift; sourceTree = "<group>"; };
F9CB310E1903238B004587A5 /* SkillExp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkillExp.h; sourceTree = "<group>"; };
F9CB310F1903238B004587A5 /* SkillExp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SkillExp.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1069,6 +1072,7 @@
F931A37420C1B261000DCE53 /* LogCommandHandler.swift */,
F9C651C920CBA1F800746661 /* TestXmlCommandHandler.swift */,
F92C1D6220C386170076BF19 /* SendQueue.swift */,
F9C7A8AE22379BAD0049C62F /* TrackerCommandHandler.swift */,
);
name = Scripting;
sourceTree = "<group>";
Expand Down Expand Up @@ -1705,6 +1709,7 @@
F97A5CA21895E06400E2C318 /* MyView.m in Sources */,
F9316D261AD9E1D400880149 /* Actor.swift in Sources */,
F96ECDB619343F5B00787CB9 /* ScriptLoader.m in Sources */,
F9C7A8AF22379BAD0049C62F /* TrackerCommandHandler.swift in Sources */,
F94A3FC91948AE0500D6B35D /* GosubToken.m in Sources */,
F9B6CD8C1E7903DA0085195F /* ClassesLoader.swift in Sources */,
F97CD5891ACD27D3007E5804 /* MapZone.swift in Sources */,
Expand Down Expand Up @@ -2020,6 +2025,7 @@
F9ACB141192ECFC3006D3548 /* VariableReplacer.m in Sources */,
F90CEC131ACEEEC300204243 /* MapArc.swift in Sources */,
F91761321E328DB90091A617 /* PresetLoaderTester.swift in Sources */,
F9C7A8B022379BAD0049C62F /* TrackerCommandHandler.swift in Sources */,
F94E78E71E37DFF60095CBF8 /* PresetCommandHandler.swift in Sources */,
F9B9BFF21ABD726000CB44B6 /* StormFrontTokenizerTester.swift in Sources */,
F9818D5B1908CE4800137896 /* ExpTrackerTester.m in Sources */,
Expand Down
5 changes: 4 additions & 1 deletion src/Outlander/ExpTracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@

@interface ExpTracker : NSObject

@property (nonatomic, copy) NSString *orderBy;
@property (nonatomic, strong) NSDate *startOfTracking;

-(void)reset;
-(void) update:(SkillExp *)exp;
-(NSArray *) skills;
-(NSArray *) skillsWithExp;
-(NSArray *) skillsWithMindState;
-(NSArray *) skillsWithExpOrMindState;

@end
66 changes: 60 additions & 6 deletions src/Outlander/ExpTracker.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,22 @@ -(instancetype)init {

_skills = [[TSMutableDictionary alloc] initWithName:@"exp_tracker"];

_skillsetSort = @[@"Shield_Usage", @"Light_Armor", @"Chain_Armor", @"Brigandine", @"Plate_Armor", @"Defending", @"Parry_Ability", @"Small_Edged", @"Large_Edged", @"Twohanded_Edged", @"Small_Blunt", @"Large_Blunt", @"Twohanded_Blunt", @"Slings", @"Bow", @"Crossbow", @"Staves", @"Polearms", @"Light_Thrown", @"Heavy_Thrown", @"Brawling", @"Offhand_Weapon", @"Melee_Mastery", @"Missile_Mastery", @"Expertise", @"Elemental_Magic", @"Holy_Magic", @"Inner_Fire", @"Inner_Magic", @"Life_Magic", @"Attunement", @"Arcana", @"Targeted_Magic", @"Augmentation", @"Debilitation", @"Utility", @"Warding", @"Sorcery", @"Theurgy", @"Astrology", @"Summoning", @"Conviction", @"Evasion", @"Athletics", @"Perception", @"Stealth", @"Locksmithing", @"Thievery", @"First_Aid", @"Outdoorsmanship", @"Skinning", @"Scouting", @"Backstab", @"Thantology", @"Forging", @"Engineering", @"Outfitting", @"Alchemy", @"Enchanting", @"Scholarship", @"Mechanical_Lore", @"Appraisal", @"Performance", @"Tactics", @"Bardic_Lore", @"Empathy", @"Trading"];
_skillsetSort = @[@"Shield_Usage", @"Light_Armor", @"Chain_Armor", @"Brigandine", @"Plate_Armor", @"Defending", @"Parry_Ability", @"Small_Edged", @"Large_Edged", @"Twohanded_Edged", @"Small_Blunt", @"Large_Blunt", @"Twohanded_Blunt", @"Slings", @"Bow", @"Crossbow", @"Staves", @"Polearms", @"Light_Thrown", @"Heavy_Thrown", @"Brawling", @"Offhand_Weapon", @"Melee_Mastery", @"Missile_Mastery", @"Expertise", @"Elemental_Magic", @"Holy_Magic", @"Inner_Fire", @"Inner_Magic", @"Life_Magic", @"Arcane_Magic", @"Attunement", @"Arcana", @"Targeted_Magic", @"Augmentation", @"Debilitation", @"Utility", @"Warding", @"Sorcery", @"Theurgy", @"Astrology", @"Summoning", @"Conviction", @"Evasion", @"Athletics", @"Perception", @"Stealth", @"Locksmithing", @"Thievery", @"First_Aid", @"Outdoorsmanship", @"Skinning", @"Scouting", @"Backstab", @"Thantology", @"Forging", @"Engineering", @"Outfitting", @"Alchemy", @"Enchanting", @"Scholarship", @"Mechanical_Lore", @"Appraisal", @"Performance", @"Tactics", @"Bardic_Lore", @"Empathy", @"Trading"];

_orderBy = @"skillset";

return self;
}

-(void)reset {
[_skills.allItems enumerateObjectsUsingBlock:^(SkillExp * _Nonnull skill, NSUInteger idx, BOOL * _Nonnull stop) {
skill.originalRanks = skill.ranks;
skill.isNew = NO;
}];

self.startOfTracking = [NSDate date];
}

-(void) update:(SkillExp *)exp {

if(exp == nil) return;
Expand Down Expand Up @@ -52,14 +63,42 @@ -(void) update:(SkillExp *)exp {
}

-(NSArray *) skills {
return _skills.allItems;
return [self orderBy: _skills.allItems];
}

-(NSArray *) skillsWithExp {
-(NSArray *) skillsWithExpOrMindState {
NSArray *array = [_skills.allItems.rac_sequence filter:^BOOL(SkillExp *item) {
return item.mindState.rateId > 0 || item.earnedRanks > 0;
}].array;

return [self orderBy:array];
}

-(NSArray *) skillsWithMindState {
NSArray *array = [_skills.allItems.rac_sequence filter:^BOOL(SkillExp *item) {
return item.mindState.rateId > 0;
}].array;

return [self orderBy:array];
}

-(NSArray *)orderBy:(NSArray *)array {
if ([[_orderBy lowercaseString] isEqualToString:@"name"]) {
return [self orderByName:array ascending:YES];
}

if ([[_orderBy lowercaseString] isEqualToString:@"name desc"]) {
return [self orderByName:array ascending:NO];
}

if ([[_orderBy lowercaseString] isEqualToString:@"rank"]) {
return [self orderByRank:array];
}

if ([[_orderBy lowercaseString] isEqualToString:@"rank desc"]) {
return [self orderByRankDesc:array];
}

return [self orderBySkillset:array];
}

Expand All @@ -81,10 +120,25 @@ -(NSArray *)orderBySkillset:(NSArray *)array {
}];
}

-(NSArray *)orderByRankDesc:(NSArray *)array {
return [array sortedArrayUsingComparator:^NSComparisonResult(SkillExp *obj1, SkillExp *obj2) {

if (obj1.ranks.doubleValue > obj2.ranks.doubleValue) {
return -1;
}

if (obj1.ranks.doubleValue < obj2.ranks.doubleValue) {
return 1;
}

return 0;
}];
}

-(NSArray *)orderByRank:(NSArray *)array {
return [array sortedArrayUsingComparator:^NSComparisonResult(SkillExp *obj1, SkillExp *obj2) {

if (obj1.ranks.doubleValue < obj1.ranks.doubleValue) {
if (obj1.ranks.doubleValue < obj2.ranks.doubleValue) {
return -1;
}

Expand All @@ -96,8 +150,8 @@ -(NSArray *)orderByRank:(NSArray *)array {
}];
}

-(NSArray *)orderByName:(NSArray *)array {
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
-(NSArray *)orderByName:(NSArray *)array ascending:(BOOL) ascending {
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:ascending];
return [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
}
@end
1 change: 1 addition & 0 deletions src/Outlander/GameCommandProcessor.m
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ -(id)initWith:(GameContext *)context and:(VariableReplacer *)replacer {
[_handlers addObject:[PlayCommandHandler newInstance:[[LocalFileSystem alloc] init]]];
[_handlers addObject:[BugCommandHandler newInstance]];
[_handlers addObject:[TestXmlCommandHandler newInstance]];
[_handlers addObject:[TrackerCommandHandler newInstance]];

[context.events subscribe:self token:@"OL:command"];
[context.events subscribe:self token:@"OL:echo"];
Expand Down
17 changes: 11 additions & 6 deletions src/Outlander/PresetLoader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ class PresetLoader : NSObject {
self.context.presets[item.name] = item
}
}

if self.context.presets["exptracker"] == nil {
self.add("exptracker", "#66FFFF")
}
}

func save() {
Expand Down Expand Up @@ -108,19 +112,20 @@ class PresetLoader : NSObject {
}

func setupDefaults() {
self.add("automapper", "#99FFFF")
self.add("chatter", "#99FFFF")
self.add("automapper", "#66FFFF")
self.add("chatter", "#66FFFF")
self.add("creatures", "#FFFF00")
self.add("roomdesc", "#cccccc")
self.add("roomname", "#0000FF")
self.add("scriptecho", "#99FFFF")
self.add("scriptecho", "#66FFFF")
self.add("scripterror", "#efefef", "#ff3300")
self.add("scriptinfo", "#0066cc")
self.add("scriptinput", "#acff2f")
self.add("sendinput", "#acff2f")
self.add("speech", "#99FFFF")
self.add("thought", "#99FFFF")
self.add("whisper", "#99FFFF")
self.add("speech", "#66FFFF")
self.add("thought", "#66FFFF")
self.add("whisper", "#66FFFF")
self.add("exptracker", "#66FFFF")
}

func add(name:String, _ color:String, _ backgroundColor:String? = nil) {
Expand Down
45 changes: 45 additions & 0 deletions src/Outlander/Scripting/TrackerCommandHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//
// TrackerCommandHandler.swift
// Outlander
//
// Created by Joseph McBride on 3/12/19.
// Copyright © 2019 Joe McBride. All rights reserved.
//

import Foundation

@objc
class TrackerCommandHandler : NSObject, CommandHandler {

class func newInstance() -> TrackerCommandHandler {
return TrackerCommandHandler()
}

func canHandle(command: String) -> Bool {
return command.lowercaseString.hasPrefix("/tracker")
}

func handle(command: String, withContext: GameContext) {

let text = command
.substringFromIndex(command.startIndex.advancedBy(8))
.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

if text.characters.count == 0 {
withContext.events.echoText("\nExperience Tracker", mono: true, preset: "default")
withContext.events.echoText("Available commands:", mono: true, preset: "default")
withContext.events.echoText(" orderby: order skills by skillset, name, name desc, ranks, ranks desc.", mono: true, preset: "default")
withContext.events.echoText(" report: display a report of skills with field experience or earned ranks.", mono: true, preset: "default")
withContext.events.echoText(" reset: resets the tracking data.", mono: true, preset: "default")
withContext.events.echoText(" update: refreshes the experience window.", mono: true, preset: "default")
withContext.events.echoText("", mono: true, preset: "default")

} else {

var commands = text.componentsSeparatedByString(" ")
let cmd = commands.removeFirst()
let value = commands.joinWithSeparator(" ")
withContext.events.publish("OL:tracker", data: ["command":cmd, "value": value])
}
}
}
1 change: 1 addition & 0 deletions src/Outlander/SkillExp.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@
@property (nonatomic, strong) NSDecimalNumber *ranks;
@property (nonatomic, strong) NSDecimalNumber *originalRanks;
@property (nonatomic, assign) BOOL isNew;
@property (nonatomic, readonly) double earnedRanks;

@end
6 changes: 5 additions & 1 deletion src/Outlander/SkillExp.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,13 @@ - (instancetype)init {
return self;
}

-(double)earnedRanks {
return _ranks.doubleValue - _originalRanks.doubleValue;
}

- (NSString *)description {
NSString *mindstate = [NSString stringWithFormat:@"(%@/34)", @(self.mindState.rateId)];
double diff = _ranks.doubleValue - _originalRanks.doubleValue;
double diff = [self earnedRanks];
NSString *sign = diff > 0 ? @"+" : @"-";
if (diff == 0.0) {
sign = @" ";
Expand Down
Loading

0 comments on commit 33030aa

Please sign in to comment.