Browse Source
Merge branch 'master' of https://github.com/binaryatrocity/discworld-tintin
pull/1/head
Merge branch 'master' of https://github.com/binaryatrocity/discworld-tintin
pull/1/head
webbykat
6 years ago
17 changed files with 737 additions and 6 deletions
-
2.gitignore
-
7commands.txt
-
4config.tin
-
9mdt
-
55mdtconfig.json
-
15src/actions.tin
-
1src/aliases.tin
-
4src/combat.tin
-
16src/deadletter.tin
-
16src/gmcp.tin
-
332src/mdtparse.py
-
24src/missiontimers.tin
-
116src/missiontimers/letters.tin
-
56src/missiontimers/sausage_lite.tin
-
79src/missiontimers/sausages.tin
-
0src/spottimers.tin
-
7src/tpamonitor.tin
@ -0,0 +1,2 @@ |
|||
logs/*.log |
|||
logs/active/*.log |
@ -0,0 +1,7 @@ |
|||
minimap: |
|||
clear && watch -c -n 0.25 -t 'clear && cat logs/minimap.log' |
|||
|
|||
timers: |
|||
clear && watch -t -n 5 cat xptimers.log |
|||
|
|||
|
@ -0,0 +1,9 @@ |
|||
#!/bin/sh |
|||
|
|||
# clear && watch --color -t -n 0.4 'python src/mdtparse.py logs/mapdoortext.log | tail -n `tput lines`' |
|||
clear && while true; do |
|||
output=$(python src/mdtparse.py logs/mapdoortext.log | tail -n `tput lines`); |
|||
clear; |
|||
echo "$output"; |
|||
sleep 0.3; |
|||
done |
@ -0,0 +1,55 @@ |
|||
{ |
|||
"default_npc_value": 1, |
|||
"bonus_player_value": -1, |
|||
"minimum_room_value": 1, |
|||
"show_hidden_room_count": false, |
|||
"custom_matches": [ |
|||
["string/regex, colour, point, is_regex"], |
|||
|
|||
["zero out these entries so they do not weigh room values"], |
|||
[".*rats{0,1}$", "", 0, true], |
|||
[".*cats{0,1}$", "", 0, true], |
|||
[".*dogs{0,1}$", "", 0, true], |
|||
[".*pigeons{0,1}$", "", 0, true], |
|||
["skeleton warrior", "", 0, false], |
|||
[" truffle pig", "", 0, false], |
|||
["giant fruitbat", "", 0, false], |
|||
["fireflies", "", 0, false], |
|||
["small blue light", "", 0, false], |
|||
[" cloud", "", 0, false], |
|||
["tortoise", "", 0, false], |
|||
["cockroach", "", 0, false], |
|||
|
|||
["Bes Pelargic Highlights"], |
|||
["student", "", 3, false], |
|||
["imperial guard", "orange", 5, false], |
|||
["^(.+?) (tang|sung|mcsweeney|fang|hong) bodyguards{0,1}$", "orange", 4, true], |
|||
["^(.+?) (tang|sung|mcsweeney|fang|hong) noblem(en|an)$", "orange", 3, true], |
|||
["^(.+?) (tang|sung|mcsweeney|fang|hong) captain$", "orange", 3, true], |
|||
|
|||
["Djelibeybi Highlights"], |
|||
["^(.+?) pries(t|ts|tess|tesses)$", "", 0, true], |
|||
["ceremonial guard", "orange", 5, false], |
|||
["palace guard", "orange", 2, false], |
|||
["soldier", "", 2, false], |
|||
["recruit", "", 2, false], |
|||
["d'reg", "", 2, false], |
|||
|
|||
["Ephebe Highlights"], |
|||
["hoplite", "orange", 4, false], |
|||
["citadel guard", "orange", 4, false], |
|||
["philosopher", "", 2, false], |
|||
["lad(y|ies)", "", 2, true], |
|||
|
|||
["Sto Plains Highlights"], |
|||
["knight", "orange", 4, false], |
|||
["little old ladies", "orange", 2, false], |
|||
["hunter grflx", "", 3, false], |
|||
["grflx mentor", "", 3, false], |
|||
["grflx adolescent", "", 2, false], |
|||
["grflx worker", "", 3, false], |
|||
["grflx workleader", "", 3, false], |
|||
|
|||
["Valid colours: orange, "] |
|||
] |
|||
} |
@ -0,0 +1,332 @@ |
|||
#!/usr/bin/env python |
|||
|
|||
import os |
|||
import re |
|||
import sys |
|||
import math |
|||
import json |
|||
|
|||
|
|||
class MapDoorText: |
|||
number_map = { |
|||
"a ": 1, |
|||
"an ": 1, |
|||
"the ": 1, |
|||
"one ": 1, |
|||
"two ": 2, |
|||
"three ": 3, |
|||
"four ": 4, |
|||
"five ": 5, |
|||
"six ": 6, |
|||
"seven ": 7, |
|||
"eight ": 8, |
|||
"nine ": 9, |
|||
"ten ": 10, |
|||
"eleven ": 11, |
|||
"twelve ": 12, |
|||
"thirteen ": 13, |
|||
"fourteen ": 14, |
|||
"fifteen ": 15, |
|||
"sixteen ": 16, |
|||
"seventeen ": 17, |
|||
"eighteen ": 18, |
|||
"nineteen ": 19, |
|||
"twenty ": 20, |
|||
"twenty-one ": 21, |
|||
"twenty-two ": 22, |
|||
"twenty-three ": 23, |
|||
"twenty-four ": 24, |
|||
"twenty-five ": 25, |
|||
"twenty-six ": 26, |
|||
"twenty-seven ": 27, |
|||
"twenty-eight ": 28, |
|||
"twenty-nine ": 29, |
|||
"thirty ": 30, |
|||
} |
|||
|
|||
direction_map = { |
|||
"north": "n", |
|||
"northeast": "ne", |
|||
"east": "e", |
|||
"southeast": "se", |
|||
"south": "s", |
|||
"southwest": "sw", |
|||
"west": "w", |
|||
"northwest": "nw", |
|||
"n": "n", |
|||
"ne": "ne", |
|||
"e": "e", |
|||
"se": "se", |
|||
"s": "s", |
|||
"sw": "sw", |
|||
"w": "w", |
|||
"nw": "nw", |
|||
} |
|||
colour_map = { |
|||
# http://terminal-color-builder.mudasobwa.ru/ |
|||
"orange": "\033[01;38;05;214m", |
|||
"reset": "\033[00;39;49m" |
|||
} |
|||
|
|||
def __init__(self): |
|||
self.return_value = [] |
|||
self.custom_matches = [] |
|||
|
|||
# Load the JSON configuration file |
|||
with open('mdtconfig.json', 'r') as config_file: |
|||
config = json.load(config_file) |
|||
|
|||
# Strip comments from custom matches |
|||
for match in config['custom_matches']: |
|||
if len(match) > 1: |
|||
self.custom_matches.append(match) |
|||
|
|||
self.default_npc_value = config['default_npc_value'] |
|||
self.bonus_player_value = config['bonus_player_value'] |
|||
self.minimum_room_value = config['minimum_room_value'] |
|||
self.show_hidden_room_count = config['show_hidden_room_count'] |
|||
|
|||
@staticmethod |
|||
def explode(div, mdt): |
|||
if div == '': |
|||
return False |
|||
pos, fragments = 0, [] |
|||
for m in re.finditer(div, mdt): |
|||
fragments.append(mdt[pos:m.start()]) |
|||
pos = m.end() |
|||
fragments.append(mdt[pos:]) |
|||
return fragments |
|||
|
|||
def parse_mdt(self, mdt_line): |
|||
# Make lower case, do initial replacements |
|||
mdt_line = mdt_line.lower() |
|||
mdt_line = mdt_line.replace(" are ", " is ") |
|||
mdt_line = mdt_line.replace(" black and white ", " black white ") |
|||
mdt_line = mdt_line.replace(" brown and white ", " brown white ") |
|||
mdt_line = mdt_line.replace("the limit of your vision is ", "the limit of your vision:") |
|||
mdt_line = mdt_line.replace(" and ", ", ") |
|||
mdt_line = mdt_line.replace(" is ", ", ") |
|||
mdt_table = self.explode(', ', mdt_line) |
|||
|
|||
data = { |
|||
'last_direction': '', |
|||
'last_enemy_line': '', |
|||
'last_count': 0, |
|||
'last_was_dir': 0, |
|||
'enemies_by_square': [], |
|||
'ignoring_exits': False, |
|||
'entity_table': [], |
|||
'room_id': 1, |
|||
'room_value': 0, |
|||
'longest_direction': 0, |
|||
'nothing': True, |
|||
'next_color': '' |
|||
} |
|||
exit_strings = ['doors ', 'a door ', 'exits ', 'an exit ', 'a hard to see through exit '] |
|||
|
|||
for entry in mdt_table: |
|||
if entry != "" and ' of a ' not in entry: |
|||
if entry.startswith(tuple(exit_strings)): |
|||
# print('Special exit, ignore this line? next line is processed...') |
|||
data['ignoring_exits'] = True |
|||
elif entry.startswith('the limit of your vision:'): |
|||
if data['last_count'] > 0: |
|||
this_square = [data['last_count'], data['last_direction'], data['room_id'], int(math.floor(data['room_value']))] |
|||
data['enemies_by_square'].append(this_square) |
|||
data['nothing'] = False |
|||
data['next_color'] = '' |
|||
data['room_id'] = data['room_id'] + 1 |
|||
data['room_value'] = 0 |
|||
data['last_direction'] = '' |
|||
data['last_enemy_line'] = '' |
|||
data['last_count'] = 0 |
|||
data['last_was_dir'] = 0 |
|||
else: |
|||
# find the quantity first |
|||
quantity = 1 |
|||
for nm_key in self.number_map: |
|||
if entry.startswith(nm_key): |
|||
quantity = self.number_map[nm_key] |
|||
entry = entry[len(nm_key):] |
|||
break |
|||
|
|||
is_direction = 0 |
|||
this_direction = '' |
|||
|
|||
if entry.startswith("northeast"): |
|||
is_direction = 1 |
|||
this_direction = "northeast" |
|||
elif entry.startswith("northwest"): |
|||
is_direction = 1 |
|||
this_direction = "northwest" |
|||
elif entry.startswith("southeast"): |
|||
is_direction = 1 |
|||
this_direction = "southeast" |
|||
elif entry.startswith("southwest"): |
|||
is_direction = 1 |
|||
this_direction = "southwest" |
|||
elif entry.startswith("north"): |
|||
is_direction = 1 |
|||
this_direction = "north" |
|||
elif entry.startswith("east"): |
|||
is_direction = 1 |
|||
this_direction = "east" |
|||
elif entry.startswith("south"): |
|||
is_direction = 1 |
|||
this_direction = "south" |
|||
elif entry.startswith("west"): |
|||
is_direction = 1 |
|||
this_direction = "west" |
|||
|
|||
if is_direction == 1: |
|||
if not data['ignoring_exits']: |
|||
# print('[handling direction, not exits]') |
|||
data['last_was_dir'] = 1 |
|||
|
|||
if data['last_direction'] != '': |
|||
data['last_direction'] = '{}, '.format(data['last_direction']) |
|||
|
|||
data['last_direction'] = '{}{} {}'.format( |
|||
data['last_direction'], quantity, self.direction_map[this_direction] |
|||
) |
|||
else: |
|||
# print('[ignoring exits direction line]') |
|||
pass |
|||
else: |
|||
data['ignoring_exits'] = False |
|||
if data['last_was_dir'] == 1: |
|||
# reset count |
|||
if data['last_count'] > 0: |
|||
this_square = [data['last_count'], data['last_direction'], data['room_id'], int(math.floor(data['room_value']))] |
|||
data['enemies_by_square'].append(this_square) |
|||
data['nothing'] = False |
|||
data['next_color'] = '' |
|||
data['room_id'] = data['room_id'] + 1 |
|||
data['room_value'] = 0 |
|||
data['last_direction'] = '' |
|||
data['last_enemy_line'] = '' |
|||
data['last_count'] = 0 |
|||
data['last_was_dir'] = 0 |
|||
|
|||
data['next_color'] = '' |
|||
add_player_value = False |
|||
|
|||
# Special GMCP MDT colour codes |
|||
if entry[0:6] == 'u001b[': |
|||
# u001b[38;5;37mRuhsbaaru001b[39;49mu001b[0m |
|||
here = entry.index('m') |
|||
data['next_color'] = entry[7:here] |
|||
# entry = entry[here + 1:-20] |
|||
# entry = entry.replace('u001b', '') |
|||
entry = entry.replace('u001b', '\033') |
|||
|
|||
# Might be a second colour code for PK |
|||
if entry[0:6] == 'u001b[': |
|||
here = entry.index('m') |
|||
data['next_color'] = entry[7:here] |
|||
entry = entry[here + 1:-20] |
|||
add_player_value = True |
|||
|
|||
this_value = self.default_npc_value |
|||
|
|||
for custom_match in self.custom_matches: |
|||
if custom_match[3]: |
|||
# This is a regex match |
|||
rexp = re.compile(custom_match[0]) |
|||
if rexp.match(entry): |
|||
if custom_match[1] and custom_match[1] in self.colour_map: |
|||
entry = '{}{}{}'.format( |
|||
self.colour_map[custom_match[1]], |
|||
entry, |
|||
self.colour_map['reset'] |
|||
) |
|||
this_value = custom_match[2] |
|||
else: |
|||
# This is a regular string match |
|||
if custom_match[0] in entry: |
|||
if custom_match[1] and custom_match[1] in self.colour_map: |
|||
entry = '{}{}{}'.format( |
|||
self.colour_map[custom_match[1]], |
|||
entry, |
|||
self.colour_map['reset'] |
|||
) |
|||
this_value = custom_match[2] |
|||
|
|||
if add_player_value == True: |
|||
this_value = this_value + self.bonus_player_value |
|||
|
|||
data['room_value'] = data['room_value'] + (this_value * quantity) |
|||
|
|||
if quantity > 1: |
|||
entry = '{} {}'.format(quantity, entry) |
|||
data['entity_table'].append([data['room_id'], entry, data['next_color']]) |
|||
|
|||
data['last_count'] = data['last_count'] + quantity |
|||
if data['last_enemy_line'] != '': |
|||
data['last_enemy_line'] = '{}, '.format(data['last_enemy_line']) |
|||
data['last_enemy_line'] = '{}{}'.format(data['last_enemy_line'], entry) |
|||
|
|||
if data['nothing']: |
|||
self.return_value.append('Nothing seen, try elsewhere!') |
|||
else: |
|||
done_here = False |
|||
rooms_ignored = 0 |
|||
|
|||
data['enemies_by_square'].sort(key=lambda square: square[3]) |
|||
|
|||
# Grab shortest |
|||
for square in data['enemies_by_square']: |
|||
# Only show if this room meets the minimum value |
|||
if square[3] >= self.minimum_room_value and len(square[1]) > data['longest_direction']: |
|||
data['longest_direction'] = len(square[1]) |
|||
|
|||
for square in data['enemies_by_square']: |
|||
# Only show if this room meets the minimum value |
|||
if square[3] >= self.minimum_room_value: |
|||
done_here = False |
|||
fstring = '{{:<{}}} [{{}}] '.format(data['longest_direction']) |
|||
output = fstring.format(square[1], square[3]) |
|||
for entity in data['entity_table']: |
|||
if entity[0] == square[2]: |
|||
if done_here: |
|||
output = '{}, '.format(output) |
|||
output = '{}{}'.format(output, entity[1]) |
|||
done_here = True |
|||
if square[0] < 2: |
|||
output = '{} [{} thing]'.format(output, square[0]) |
|||
else: |
|||
output = '{} [{} things]'.format(output, square[0]) |
|||
self.return_value.append(output) |
|||
else: |
|||
rooms_ignored = rooms_ignored + 1 |
|||
|
|||
square = None |
|||
|
|||
for entity in data['entity_table']: |
|||
entity = None |
|||
|
|||
if rooms_ignored > 0 and self.show_hidden_room_count: |
|||
output = '({} rooms below your value limit of {})'.format(rooms_ignored, self.minimum_room_value) |
|||
self.return_value.append(output) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
if len(sys.argv) < 2: |
|||
print('[error] No input provided.') |
|||
sys.exit() |
|||
|
|||
argument, mdt_line = sys.argv.pop(1), None |
|||
|
|||
# Is this a file passed to us? |
|||
if os.path.exists(argument): |
|||
with open(argument, 'r') as f: |
|||
mdt_line = f.readline() |
|||
|
|||
else: |
|||
mdt_line = argument |
|||
|
|||
mdt = MapDoorText() |
|||
mdt.parse_mdt(mdt_line) |
|||
|
|||
for line in mdt.return_value: |
|||
print(line) |
@ -0,0 +1,24 @@ |
|||
#CLASS {missiontimers} {kill}; |
|||
#CLASS {missiontimers} {open}; |
|||
|
|||
#NOP ==[ Load Sausage Mission stuff ]== |
|||
#READ {src/missiontimers/sausage_lite.tin}; |
|||
|
|||
#ALIAS {missions} { |
|||
#if {&missions} { #echo {Mission Timers:}; } { #return; }; |
|||
|
|||
#if {&missions[sausage]} { |
|||
#foreach {$missions[sausage][active_list][%*]} {player} { |
|||
#showme {\t$player is cooling down on sausage missions.}; |
|||
}; |
|||
|
|||
#foreach {$missions[sausage][retry_list][%*]} {player} { |
|||
#showme {\t$player is not able to request a new sausage mission.}; |
|||
}; |
|||
}; |
|||
}; |
|||
|
|||
#nop "#event {RECEIVED OUTPUT} {%0}" catches all the things.... one event trigger |
|||
#nop and process a bunch of stuff? |
|||
|
|||
#CLASS {missiontimers} {close}; |
@ -0,0 +1,116 @@ |
|||
#CLASS {missiontimers_letters} {kill}; |
|||
#CLASS {missiontimers_letters} {open}; |
|||
|
|||
#NOP [1 = Local, 2= Far Away, 3 = Distant Lands, 4 = Difficult Customer] |
|||
#VAR {dead_letter_rewards} { |
|||
{4 Ankh-Morpork dollars}{1} |
|||
{8 Ankh-Morpork dollars}{2} |
|||
{3 Djelian talents and 5 Djelian tooni}{3} |
|||
{4 Lancre crowns and 2 Lancre shillings}{3} |
|||
{7 Ephebian decadrachmae and 2 Ephebian stater}{3} |
|||
{2 Ankh-Morpork ten-dollars}{3} |
|||
{2 Genuan forins and 5 Genuan livres}{3} |
|||
{1 Klatchian ten dinar and 2 Klatchian two dinar coins}{3} |
|||
{1 Agatean Empire ten-rhinu and 5 Agatean Empire rhinu}{3} |
|||
{7 Lancre crowns and 5 Lancre shillings}{4} |
|||
{2 Agatean Empire ten-rhinu and 5 Agatean Empire rhinu}{4} |
|||
{6 Djelian talents and 5 Djelian tooni}{4} |
|||
{4 Genuan forins and 3 Genuan livres}{4} |
|||
{3 Ankh-Morpork ten-dollars and 2 Ankh-Morpork dollars}{4} |
|||
{1 Ephebian mina and 5 Ephebian decadrachmae}{4} |
|||
{1 Agatean Empire fifty-rhinu and 2 Agatean Empire ten-rhinu}{5} |
|||
{9 Ankh-Morpork ten-dollars}{5} |
|||
{1 Lancre sovereign and 1 Lancre tencrown}{5} |
|||
{3 Ephebian minae and 5 Ephebian decadrachmae}{5} |
|||
{1 Genuan ducat and 2 Genuan forins}{5} |
|||
} |
|||
|
|||
#var {missions[letter][active_list]} {}; |
|||
#var {missions[letter][retry_list]} {}; |
|||
|
|||
#ALIAS {/letter_returned} { |
|||
#list {missions[letter][retry_list]} {find} {$GMCP[charinfo][name]} {letter_current}; |
|||
#if {$letter_current == 0} { |
|||
#list {missions[letter][retry_list]} {add} {$GMCP[charinfo][name]}; |
|||
#line sub variable { |
|||
#delay {600} { |
|||
#nop Print message |
|||
#format {letter_retry_line} {%c[MH] %c*%c %s%c can now request a new letter from Frank.} {bold blue} {bold yellow} {bold green}{$GMCP[charinfo][name]} {bold blue}; |
|||
#echo {$letter_retry_line}; |
|||
#unvar {letter_retry_line}; |
|||
|
|||
#nop Remove player from state list |
|||
#list {missions[letter][retry_list]} {find} {$GMCP[charinfo][name]} {letter_current_inner}; |
|||
#list {missions[letter][retry_list]} {delete} {$letter_current_inner}; |
|||
}; |
|||
}; |
|||
}; |
|||
#unvar {letter_current}; |
|||
}; |
|||
|
|||
#ALIAS {return letter} { |
|||
#send {return letter}; |
|||
/letter_returned; |
|||
}; |
|||
|
|||
#ACTION {^You offer to give a letter to Frank} { |
|||
/letter_returned; |
|||
}; |
|||
|
|||
#ACTION {^You have been awarded %d experience points and given %+} { |
|||
#nop You have been awarded 60407 experience points and given 2 Agatean Empire ten-rhinu and 5 Agatean Empire rhinu. |
|||
|
|||
-- Last difficulty completion seen for future salute trigger |
|||
local iLastDifficultyCompleted = 0 |
|||
|
|||
-- Detected a reward string, record a difficulty level in preperation for the salute line |
|||
function QuowMissionReward (sName, sLine, wildcards) |
|||
sCashValue = wildcards[1] |
|||
if (sQuowRewards[sCashValue] ~= nil) then |
|||
iLastDifficultyCompleted = sQuowRewards[sCashValue] |
|||
else |
|||
-- See if we were waiting for an Ozzie pottery timer? |
|||
if (IsTimer("StoPotteryWaiting_" .. sCurrentCharacter) == 0) then |
|||
AddTimer ("StoLatPottery_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
elseif (IsTimer("OCPennieMission_" .. sCurrentCharacter) == 0) then |
|||
AddTimer ("OCPennieLaced_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
end |
|||
end |
|||
end |
|||
} |
|||
|
|||
<trigger |
|||
enabled="y" |
|||
keep_evaluating="n" |
|||
match="^(?:> )?You have been awarded [0-9]{1,7} experience points and given (.+?)\.$" |
|||
regexp="y" |
|||
script="QuowMissionReward" |
|||
name="QuowMissionReward" |
|||
sequence="40" |
|||
> |
|||
</trigger> |
|||
|
|||
|
|||
|
|||
#ACTION {^You salute smartly as you deliver a letter} { |
|||
-- Saw a successful delivery mission, start a timer if we have a known difficulty completion value |
|||
function QuowLetterSuccess (sName, sLine, wildcards) |
|||
if (bNotificationTimers ~= true) then |
|||
return |
|||
end |
|||
if (iLastDifficultyCompleted == 1) then |
|||
AddTimer ("DeadLetterLocal_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
elseif (iLastDifficultyCompleted == 2) then |
|||
AddTimer ("DeadLetterCloseby_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
elseif (iLastDifficultyCompleted == 3) then |
|||
AddTimer ("DeadLetterFaraway_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
elseif (iLastDifficultyCompleted == 4) then |
|||
AddTimer ("DeadLetterDistant_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
elseif (iLastDifficultyCompleted == 5) then |
|||
AddTimer ("DeadLetterDifficult_" .. sCurrentCharacter, 1, 0, 0, "", 1061, "QuowMissionNotify") |
|||
end |
|||
iLastDifficultyCompleted = 0 |
|||
end |
|||
}; |
|||
|
|||
#CLASS {missiontimers_letters} {close}; |
@ -0,0 +1,56 @@ |
|||
#CLASS {missiontimers_sausages} {kill}; |
|||
#CLASS {missiontimers_sausages} {open}; |
|||
|
|||
#var {missions[sausage][active_list]} {}; |
|||
#var {missions[sausage][retry_list]} {}; |
|||
|
|||
#nop You have four hours to deliver 150 fresh - line to start it all? |
|||
#ACTION {^You have four hours to deliver %d fresh} { |
|||
|
|||
#action {^Sam Slager says to%+you: I'll have to take care of this one later} { |
|||
#nop [A mission started, start checking for resignations]; |
|||
#nop Are we already waiting on a timer for this character? |
|||
#list {missions[sausage][retry_list]} {find} {$GMCP[charinfo][name]} {sausage_current}; |
|||
#if {$sausage_current == 0} { |
|||
#list {missions[sausage][retry_list]} {add} {$GMCP[charinfo][name]}; |
|||
#line sub variable { |
|||
#delay {600} { |
|||
#nop Print message |
|||
#format {sausage_retry_line} {%c[MH] %c*%c %s%c can now try a new sausage mission from Sam Slager.} {bold blue} {bold yellow} {bold green}{$GMCP[charinfo][name]} {bold blue}; |
|||
#echo {$sausage_retry_line}; |
|||
#unvar {sausage_retry_line}; |
|||
|
|||
#nop Remove player from state list |
|||
#list {missions[sausage][retry_list]} {find} {$GMCP[charinfo][name]} {sausage_current_inner}; |
|||
#list {missions[sausage][retry_list]} {delete} {$sausage_current_inner}; |
|||
}; |
|||
}; |
|||
}; |
|||
#unvar {sausage_current}; |
|||
}; |
|||
|
|||
#action {^Sam Slager says to%+you: Thank you, that's all} { |
|||
#nop [A mission started, start checking for completions]; |
|||
#nop Are we already waiting on a timer for this character? |
|||
|
|||
#list {missions[sausage][active_list]} {find} {$GMCP[charinfo][name]} {sausage_current}; |
|||
#if {$sausage_current == 0} { |
|||
#list {missions[sausage][active_list]} {add} {$GMCP[charinfo][name]}; |
|||
#line sub variable { |
|||
#delay {3600} { |
|||
#nop Print message |
|||
#format {sausage_timer_line} {%c[MH] %c*%c %s can get full XP for a sausage mission.} {bold blue} {bold yellow} {bold blue} {$GMCP[charinfo][name]}; |
|||
#echo {$sausage_timer_line}; |
|||
#unvar {sausage_timer_line}; |
|||
|
|||
#nop Remove player from state list |
|||
#list {missions[sausage][active_list]} {find} {$GMCP[charinfo][name]} {sausage_current_inner}; |
|||
#list {missions[sausage][active_list]} {delete} {$sausage_current_inner}; |
|||
}; |
|||
}; |
|||
}; |
|||
#unvar {sausage_current}; |
|||
}; |
|||
}; |
|||
|
|||
#CLASS {missiontimers_sausages} {close}; |
@ -0,0 +1,79 @@ |
|||
#CLASS {missiontimers_sausages} {kill}; |
|||
#CLASS {missiontimers_sausages} {open}; |
|||
|
|||
#NOP ======================= |
|||
#NOP ===== VARIABLES ===== |
|||
#NOP ======================= |
|||
#VARIABLE {missions[sausage]} { |
|||
{current_difficulty}{1} |
|||
{current_primer}{1} |
|||
} |
|||
|
|||
#NOP ======================= |
|||
#NOP ===== Aliases ===== |
|||
#NOP ======================= |
|||
#ALIAS {/sausage_mission_start} { |
|||
#unaction {^You have four hours to deliver %1 fresh %2 sausages to Sam Slager.$}; |
|||
#var {missions[sausage][current_difficulty]} {$missions[sausage][current_primer]}; |
|||
|
|||
#nop [A mission started, start checking for resignations] |
|||
#action {^Sam Slager says to %1 I'll have to take care of this one later.$} { |
|||
#unaction {^You have four hours to deliver %1 fresh %2 sausages to Sam Slager.$}; |
|||
#unaction {^Sam Slager says to %1 I'll have to take care of this one later.$}; |
|||
#unaction {^Sam Slager gives you %1{dollar|pence}%3$}; |
|||
|
|||
#line sub variable { |
|||
#delay {600} { |
|||
#format {sausage_retry_line} {%c[MH] %c*%c %s%c can now try a new sausage mission from Sam Slager.} {bold blue} {bold yellow} {bold green}{$GMCP[charinfo][name]} {bold blue}; |
|||
#echo {$sausage_retry_line}; |
|||
#unvar {sausage_retry_line}; |
|||
}; |
|||
}; |
|||
}; |
|||
|
|||
#nop [A mission started, start checking for completions] |
|||
#action {^Sam Slager gives you %1{dollar|pence}%3$} { |
|||
#unaction {^You have four hours to deliver %1 fresh %2 sausages to Sam Slager.$}; |
|||
#unaction {^Sam Slager says to %1 I'll have to take care of this one later.$}; |
|||
#unaction {^Sam Slager gives you %1{dollar|pence}%3$}; |
|||
|
|||
#if {$missions[sausage][current_difficulty]} { |
|||
#format {delayname} {sausage_easy_%s} {$GMCP[charinfo][name]}; |
|||
#line sub variable { |
|||
#delay {$delayname} { |
|||
#format {sausage_timer_line} {%c[MH] %c*%c %s last finished an unspiced sausage mission.} {bold blue} {bold yellow} {bold blue} {$GMCP[charinfo][name]}; |
|||
#echo {$sausage_timer_line}; |
|||
#unvar {sausage_timer_line}; |
|||
} {3600}; |
|||
}; |
|||
#unvar {delayname}; |
|||
}; |
|||
#else { |
|||
#line sub variable { |
|||
#format {delayname} {sausage_hard_%s} {$GMCP[charinfo][name]}; |
|||
#delay {$delayname} { |
|||
#format {sausage_timer_line} {%c[MH] %c*%c %s last finished a spiced sausage mission.} {bold blue} {bold yellow} {bold blue} {$GMCP[charinfo][name]}; |
|||
#echo {$sausage_timer_line}; |
|||
#unvar {sausage_timer_line}; |
|||
} {3600}; |
|||
}; |
|||
#unvar {delayname}; |
|||
}; |
|||
}; |
|||
}; |
|||
|
|||
#NOP ======================= |
|||
#NOP ===== Actions ===== |
|||
#NOP ======================= |
|||
|
|||
#NOP ==[Sausage Missions]== |
|||
#ACTION {^Sam Slager asks you: So, you want to try filling a sausage order? You'll have four hours to hunt %1, gather spices to mix into the ground meat, make %2 sausages from it, and deliver them to me. Are you up to it?$} { |
|||
#var {missions[sausage][current_primer]} {2}; |
|||
#action {^You have four hours to deliver %1 fresh %2 sausages to Sam Slager.$} { /sausage_mission_start; }; |
|||
}; |
|||
#ACTION {^Sam Slager asks you: So, you want to try filling a sausage order? You'll have four hours to hunt %1, make %2 sausages from it, and deliver them to me. Are you up to it?$} { |
|||
#var {missions[sausage][current_primer]} {1}; |
|||
#action {^You have four hours to deliver %1 fresh %2 sausages to Sam Slager.$} { /sausage_mission_start; }; |
|||
}; |
|||
|
|||
#CLASS {missiontimers_sausages} {close}; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue