diff --git a/raw/classes_setup.py b/raw/classes_setup.py deleted file mode 100644 index 7c51206..0000000 --- a/raw/classes_setup.py +++ /dev/null @@ -1,130 +0,0 @@ -import os -import fnmatch -import itertools -import csv - -wfile = 'inorganic_dfhack_classes.txt' -wf = open(wfile,'w') -wfile2 = 'dfhack_input.txt' -wf2 = open(wfile2,'w') -wfile3 = 'reaction_classes.txt' -wf3 = open(wfile3,'w') -wfile4 = 'permitted_reactions.txt' -wf4 = open(wfile4,'w') -wf.write('inorganic_dfhack_classes\n') -wf.write('\n[OBJECT:INORGANIC]\n') -wf3.write('reaction_class.txt\n') -wf3.write('\n[OBJECT:REACTION]\n') - -files = ['objects/classes.txt'] -totdat = [[]]*len(files) -for i in range(len(files)): - f = open(files[i]) - dat = [] - for row in f: - dat.append(row) - totdat[i] = dat -f.close() - -ddtot = [[]]*len(totdat) -for j in range(len(totdat)): - d = [] - for i in range(len(totdat[j])): - if totdat[j][i].count('[CLASS:') >= 1: - y = totdat[j][i].partition('[CLASS:')[2].partition(']')[0] - d.append([y,i]) - dd = [] - if len(d) >= 1: - for i in range(len(d)-1): - dd.append([d[i][0], d[i][1], d[i+1][1]]) - dd.append([d[-1][0], d[-1][1], len(totdat[j])]) - ddtot[j] = dd - -creature = [] -for i in range(len(ddtot)): - for j in range(len(ddtot[i])): - creature.append([ddtot[i][j][0]]) - x = ddtot[i][j][1] - y = ddtot[i][j][2] - z = len(''.join(totdat[i][x+1:y]).split('[')) - for k in range(z-1): - val = ''.join(totdat[i][x+1:y]).split('[')[k+1].split(']')[0] - creature[-1].append(val) - -files = ['objects/spells.txt'] -totdat = [[]]*len(files) -for i in range(len(files)): - f = open(files[i]) - dat = [] - for row in f: - dat.append(row) - totdat[i] = dat -f.close() - -ddtot = [[]]*len(totdat) -for j in range(len(totdat)): - d = [] - for i in range(len(totdat[j])): - if totdat[j][i].count('[SPELL:') >= 1: - y = totdat[j][i].partition('[SPELL:')[2].partition(']')[0] - d.append([y,i]) - dd = [] - if len(d) >= 1: - for i in range(len(d)-1): - dd.append([d[i][0], d[i][1], d[i+1][1]]) - dd.append([d[-1][0], d[-1][1], len(totdat[j])]) - ddtot[j] = dd - -spell = [] -for i in range(len(ddtot)): - for j in range(len(ddtot[i])): - spell.append([ddtot[i][j][0]]) - x = ddtot[i][j][1] - y = ddtot[i][j][2] - z = len(''.join(totdat[i][x+1:y]).split('[')) - for k in range(z-1): - val = ''.join(totdat[i][x+1:y]).split('[')[k+1].split(']')[0] - spell[-1].append(val) - -wf.write('\n[INORGANIC:DFHACK_CLASS_SPELLS]\n') -wf.write('\t[USE_MATERIAL_TEMPLATE:STONE_TEMPLATE]\n') -for i in range(len(spell)): - wf.write('\t[SYNDROME]\n') - wf.write('\t\t[SYN_NAME:'+spell[i][0]+']\n') - wf.write('\t\t[CE_CAN_DO_INTERACTION:START:0]\n') - wf2.write('modtools/reaction-trigger -reaction LEARN_'+spell[i][0]+' -command [ class-learn-spell -unit \\WORKER_ID -spell '+spell[i][0]+' ]\n') - wf3.write('\n[REACTION:LEARN_'+spell[i][0]+']\n') - wf3.write('\t[NAME:learn spell - #YOUR_SPELL_NAME_HERE#]\n') - wf3.write('\t[BUILDING:#YOUR_BUILDING_HERE#:NONE]\n') - wf4.write('[PERMITTED_REACTION:LEARN_'+spell[i][0]+']\n') - for j in range(1,len(spell[i])): - wf.write('\t\t\t['+spell[i][j]+']\n') - -wf.write('\n##############################################################\n') -wf3.write('\n##############################################################\n') -wf.write('\n[INORGANIC:DFHACK_CLASS_NAMES]\n') -wf.write('\t[USE_MATERIAL_TEMPLATE:STONE_TEMPLATE]\n') -for i in range(len(creature)): - wf.write('\t[SYNDROME]\n') - wf.write('\t\t[SYN_NAME:'+creature[i][0]+']\n') - if creature[i][1].count(':') == 1: - name = creature[i][1].split(':')[1].partition(']')[0] - wf.write('\t\t[CE_DISPLAY_NAME:NAME:'+name+':'+name+'s:'+name+':START:0]\n') - if creature[i][1].count(':') == 2: - name = creature[i][1].split(':')[1] - plural = creature[i][1].split(':')[2].partition(']')[0] - wf.write('\t\t[CE_DISPLAY_NAME:NAME:'+name+':'+plural+':'+name+':START:0]\n') - if creature[i][1].count(':') == 3: - name = creature[i][1].split(':')[1] - plural = creature[i][1].split(':')[2] - adjective = creature[i][1].split(':')[3].partition(']')[0] - wf.write('\t\t[CE_DISPLAY_NAME:NAME:'+name+':'+plural+':'+adjective+':START:0]\n') - wf2.write('modtools/reaction-trigger -reaction CHANGE_CLASS_'+creature[i][0]+' -command [ class-change-class -unit \\WORKER_ID -class '+creature[i][0]+' ]\n') - wf3.write('\n[REACTION:CHANGE_CLASS_'+creature[i][0]+']\n') - wf3.write('\t[NAME:change class - '+creature[i][1].split(':')[1]+']\n') - wf3.write('\t[BUILDING:#YOUR_BUILDING_HERE#:NONE]\n') - wf4.write('[PERMITTED_REACTION:CHANGE_CLASS_'+creature[i][0]+']\n') -wf.close() -wf2.close() -wf3.close() -wf4.close() diff --git a/raw/dfhack_input.txt b/raw/dfhack_input.txt deleted file mode 100644 index 0516702..0000000 --- a/raw/dfhack_input.txt +++ /dev/null @@ -1,310 +0,0 @@ -modtools/reaction-trigger -reaction LEARN_FRAYMOTIF -command [ class-learn-spell -unit \WORKER_ID -spell FRAYMOTIF ] -modtools/reaction-trigger -reaction LEARN_CAN_GO_GOD_TIER -command [ class-learn-spell -unit \WORKER_ID -spell CAN_GO_GOD_TIER ] -modtools/reaction-trigger -reaction LEARN_WINDY_BULLET_I -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_BULLET_I ] -modtools/reaction-trigger -reaction LEARN_WINDY_BULLET_II -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_BULLET_II ] -modtools/reaction-trigger -reaction LEARN_WINDY_BULLET_III -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_BULLET_III ] -modtools/reaction-trigger -reaction LEARN_WINDY_BULLET_IV -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_BULLET_IV ] -modtools/reaction-trigger -reaction LEARN_WINDY_BULLET_V -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_BULLET_V ] -modtools/reaction-trigger -reaction LEARN_WINDY_DELAY_I -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_DELAY_I ] -modtools/reaction-trigger -reaction LEARN_WINDY_DELAY_II -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_DELAY_II ] -modtools/reaction-trigger -reaction LEARN_WINDY_DELAY_III -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_DELAY_III ] -modtools/reaction-trigger -reaction LEARN_WINDY_DELAY_IV -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_DELAY_IV ] -modtools/reaction-trigger -reaction LEARN_WINDY_HASTE_I -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_HASTE_I ] -modtools/reaction-trigger -reaction LEARN_WINDY_HASTE_II -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_HASTE_II ] -modtools/reaction-trigger -reaction LEARN_WINDY_HASTE_III -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_HASTE_III ] -modtools/reaction-trigger -reaction LEARN_WINDY_HASTE_IV -command [ class-learn-spell -unit \WORKER_ID -spell WINDY_HASTE_IV ] -modtools/reaction-trigger -reaction LEARN_BREATH_EXPLODE_A_BODY_I -command [ class-learn-spell -unit \WORKER_ID -spell BREATH_EXPLODE_A_BODY_I ] -modtools/reaction-trigger -reaction LEARN_BREATH_RENDER_BREATHLESS_I -command [ class-learn-spell -unit \WORKER_ID -spell BREATH_RENDER_BREATHLESS_I ] -modtools/reaction-trigger -reaction LEARN_BREATH_EXPLODE_A_BODY_II -command [ class-learn-spell -unit \WORKER_ID -spell BREATH_EXPLODE_A_BODY_II ] -modtools/reaction-trigger -reaction LEARN_BREATH_RENDER_BREATHLESS_II -command [ class-learn-spell -unit \WORKER_ID -spell BREATH_RENDER_BREATHLESS_II ] -modtools/reaction-trigger -reaction LEARN_BREATH_RENDER_BREATHLESS_II -command [ class-learn-spell -unit \WORKER_ID -spell BREATH_RENDER_BREATHLESS_II ] -modtools/reaction-trigger -reaction LEARN_PREVENT_SUFFOCATION -command [ class-learn-spell -unit \WORKER_ID -spell PREVENT_SUFFOCATION ] -modtools/reaction-trigger -reaction LEARN_DECREASE_LUCK_I -command [ class-learn-spell -unit \WORKER_ID -spell DECREASE_LUCK_I ] -modtools/reaction-trigger -reaction LEARN_DECREASE_LUCK_II -command [ class-learn-spell -unit \WORKER_ID -spell DECREASE_LUCK_II ] -modtools/reaction-trigger -reaction LEARN_DECREASE_LUCK_III -command [ class-learn-spell -unit \WORKER_ID -spell DECREASE_LUCK_III ] -modtools/reaction-trigger -reaction LEARN_DECREASE_LUCK_IV -command [ class-learn-spell -unit \WORKER_ID -spell DECREASE_LUCK_IV ] -modtools/reaction-trigger -reaction LEARN_INCREASE_LUCK_I -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_LUCK_I ] -modtools/reaction-trigger -reaction LEARN_INCREASE_LUCK_II -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_LUCK_II ] -modtools/reaction-trigger -reaction LEARN_INCREASE_LUCK_III -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_LUCK_III ] -modtools/reaction-trigger -reaction LEARN_INCREASE_LUCK_IV -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_LUCK_IV ] -modtools/reaction-trigger -reaction LEARN_TEMPORARY_BLIND_I -command [ class-learn-spell -unit \WORKER_ID -spell TEMPORARY_BLIND_I ] -modtools/reaction-trigger -reaction LEARN_TEMPORARY_BLIND_II -command [ class-learn-spell -unit \WORKER_ID -spell TEMPORARY_BLIND_II ] -modtools/reaction-trigger -reaction LEARN_TEMPORARY_BLIND_III -command [ class-learn-spell -unit \WORKER_ID -spell TEMPORARY_BLIND_III ] -modtools/reaction-trigger -reaction LEARN_PERMANENT_BLIND_I -command [ class-learn-spell -unit \WORKER_ID -spell PERMANENT_BLIND_I ] -modtools/reaction-trigger -reaction LEARN_PERMANENT_BLIND_II -command [ class-learn-spell -unit \WORKER_ID -spell PERMANENT_BLIND_II ] -modtools/reaction-trigger -reaction LEARN_PERMANENT_BLIND_III -command [ class-learn-spell -unit \WORKER_ID -spell PERMANENT_BLIND_III ] -modtools/reaction-trigger -reaction LEARN_LIGHT_SEE_CREATURES -command [ class-learn-spell -unit \WORKER_ID -spell LIGHT_SEE_CREATURES ] -modtools/reaction-trigger -reaction LEARN_GIVE_VISION -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_VISION ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_I -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_I ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_I -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_I ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_II -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_II ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_III -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_III ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_IV -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_IV ] -modtools/reaction-trigger -reaction LEARN_TIME_SLOW_DOWN_ENEMY_V -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SLOW_DOWN_ENEMY_V ] -modtools/reaction-trigger -reaction LEARN_TIME_SPEED_UP_FRIEND_I -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SPEED_UP_FRIEND_I ] -modtools/reaction-trigger -reaction LEARN_TIME_SPEED_UP_FRIEND_II -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SPEED_UP_FRIEND_II ] -modtools/reaction-trigger -reaction LEARN_TIME_SPEED_UP_FRIEND_III -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SPEED_UP_FRIEND_III ] -modtools/reaction-trigger -reaction LEARN_TIME_SPEED_UP_SELF -command [ class-learn-spell -unit \WORKER_ID -spell TIME_SPEED_UP_SELF ] -modtools/reaction-trigger -reaction LEARN_TIME_INCREASE_LUCK_SELF -command [ class-learn-spell -unit \WORKER_ID -spell TIME_INCREASE_LUCK_SELF ] -modtools/reaction-trigger -reaction LEARN_TIME_AGE_ENEMIES_I -command [ class-learn-spell -unit \WORKER_ID -spell TIME_AGE_ENEMIES_I ] -modtools/reaction-trigger -reaction LEARN_TIME_AGE_ENEMIES_II -command [ class-learn-spell -unit \WORKER_ID -spell TIME_AGE_ENEMIES_II ] -modtools/reaction-trigger -reaction LEARN_TIME_AGE_ENEMIES_III -command [ class-learn-spell -unit \WORKER_ID -spell TIME_AGE_ENEMIES_III ] -modtools/reaction-trigger -reaction LEARN_TIME_AGE_ENEMIES_PAGE -command [ class-learn-spell -unit \WORKER_ID -spell TIME_AGE_ENEMIES_PAGE ] -modtools/reaction-trigger -reaction LEARN_TIME_AGE_DOWN -command [ class-learn-spell -unit \WORKER_ID -spell TIME_AGE_DOWN ] -modtools/reaction-trigger -reaction LEARN_SHRINK_I -command [ class-learn-spell -unit \WORKER_ID -spell SHRINK_I ] -modtools/reaction-trigger -reaction LEARN_SHRINK_II -command [ class-learn-spell -unit \WORKER_ID -spell SHRINK_II ] -modtools/reaction-trigger -reaction LEARN_SHRINK_III -command [ class-learn-spell -unit \WORKER_ID -spell SHRINK_III ] -modtools/reaction-trigger -reaction LEARN_SHRINK_IV -command [ class-learn-spell -unit \WORKER_ID -spell SHRINK_IV ] -modtools/reaction-trigger -reaction LEARN_GROW_I -command [ class-learn-spell -unit \WORKER_ID -spell GROW_I ] -modtools/reaction-trigger -reaction LEARN_GROW_II -command [ class-learn-spell -unit \WORKER_ID -spell GROW_II ] -modtools/reaction-trigger -reaction LEARN_GROW_III -command [ class-learn-spell -unit \WORKER_ID -spell GROW_III ] -modtools/reaction-trigger -reaction LEARN_REPLACE_ARMS_WITH_SPACE -command [ class-learn-spell -unit \WORKER_ID -spell REPLACE_ARMS_WITH_SPACE ] -modtools/reaction-trigger -reaction LEARN_REPLACE_LEGS_WITH_SPACE -command [ class-learn-spell -unit \WORKER_ID -spell REPLACE_LEGS_WITH_SPACE ] -modtools/reaction-trigger -reaction LEARN_TELEPORT -command [ class-learn-spell -unit \WORKER_ID -spell TELEPORT ] -modtools/reaction-trigger -reaction LEARN_REPLACE_HEAD_WITH_SPACE -command [ class-learn-spell -unit \WORKER_ID -spell REPLACE_HEAD_WITH_SPACE ] -modtools/reaction-trigger -reaction LEARN_AUTOREVIVE_SELF_ONCE -command [ class-learn-spell -unit \WORKER_ID -spell AUTOREVIVE_SELF_ONCE ] -modtools/reaction-trigger -reaction LEARN_HEAL_MILD_I -command [ class-learn-spell -unit \WORKER_ID -spell HEAL_MILD_I ] -modtools/reaction-trigger -reaction LEARN_HEAL_MILD_II -command [ class-learn-spell -unit \WORKER_ID -spell HEAL_MILD_II ] -modtools/reaction-trigger -reaction LEARN_HEAL_MILD_III -command [ class-learn-spell -unit \WORKER_ID -spell HEAL_MILD_III ] -modtools/reaction-trigger -reaction LEARN_HEAL_FULL_I -command [ class-learn-spell -unit \WORKER_ID -spell HEAL_FULL_I ] -modtools/reaction-trigger -reaction LEARN_HEAL_FULL:II -command [ class-learn-spell -unit \WORKER_ID -spell HEAL_FULL:II ] -modtools/reaction-trigger -reaction LEARN_DEUNDEAD_FRIENDS -command [ class-learn-spell -unit \WORKER_ID -spell DEUNDEAD_FRIENDS ] -modtools/reaction-trigger -reaction LEARN_DEUNDEAD_ENEMIES -command [ class-learn-spell -unit \WORKER_ID -spell DEUNDEAD_ENEMIES ] -modtools/reaction-trigger -reaction LEARN_DESTROY_LIFE_I -command [ class-learn-spell -unit \WORKER_ID -spell DESTROY_LIFE_I ] -modtools/reaction-trigger -reaction LEARN_DESTROY_LIFE_II -command [ class-learn-spell -unit \WORKER_ID -spell DESTROY_LIFE_II ] -modtools/reaction-trigger -reaction LEARN_DESTROY_LIFE_III -command [ class-learn-spell -unit \WORKER_ID -spell DESTROY_LIFE_III ] -modtools/reaction-trigger -reaction LEARN_DESTROY_LIFE_IV -command [ class-learn-spell -unit \WORKER_ID -spell DESTROY_LIFE_IV ] -modtools/reaction-trigger -reaction LEARN_DESTROY_LIFE_V -command [ class-learn-spell -unit \WORKER_ID -spell DESTROY_LIFE_V ] -modtools/reaction-trigger -reaction LEARN_AUTOREVIVE_OTHERS_ONCE -command [ class-learn-spell -unit \WORKER_ID -spell AUTOREVIVE_OTHERS_ONCE ] -modtools/reaction-trigger -reaction LEARN_GIVE_FRIENDS_HOPE_I -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_FRIENDS_HOPE_I ] -modtools/reaction-trigger -reaction LEARN_GIVE_FRIENDS_HOPE_II -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_FRIENDS_HOPE_II ] -modtools/reaction-trigger -reaction LEARN_GIVE_FRIENDS_HOPE_III -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_FRIENDS_HOPE_III ] -modtools/reaction-trigger -reaction LEARN_GIVE_FRIENDS_HOPE_IV -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_FRIENDS_HOPE_IV ] -modtools/reaction-trigger -reaction LEARN_GIVE_ENEMIES_HOPELESSNESS_I -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_ENEMIES_HOPELESSNESS_I ] -modtools/reaction-trigger -reaction LEARN_GIVE_ENEMIES_HOPELESSNESS_II -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_ENEMIES_HOPELESSNESS_II ] -modtools/reaction-trigger -reaction LEARN_GIVE_ENEMIES_HOPELESSNESS_III -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_ENEMIES_HOPELESSNESS_III ] -modtools/reaction-trigger -reaction LEARN_GIVE_ENEMIES_HOPELESSNESS_IV -command [ class-learn-spell -unit \WORKER_ID -spell GIVE_ENEMIES_HOPELESSNESS_IV ] -modtools/reaction-trigger -reaction LEARN_SHOOT_WITH_HOPE_I -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_WITH_HOPE_I ] -modtools/reaction-trigger -reaction LEARN_SHOOT_WITH_HOPE_II -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_WITH_HOPE_II ] -modtools/reaction-trigger -reaction LEARN_SHOOT_WITH_HOPE_III -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_WITH_HOPE_III ] -modtools/reaction-trigger -reaction LEARN_SHOOT_WITH_HOPE_IV -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_WITH_HOPE_IV ] -modtools/reaction-trigger -reaction LEARN_HIDE -command [ class-learn-spell -unit \WORKER_ID -spell HIDE ] -modtools/reaction-trigger -reaction LEARN_REDUCE_FORCE_SELF_I -command [ class-learn-spell -unit \WORKER_ID -spell REDUCE_FORCE_SELF_I ] -modtools/reaction-trigger -reaction LEARN_REDUCE_FORCE_SELF_II -command [ class-learn-spell -unit \WORKER_ID -spell REDUCE_FORCE_SELF_II ] -modtools/reaction-trigger -reaction LEARN_REDUCE_FORCE_SELF_III -command [ class-learn-spell -unit \WORKER_ID -spell REDUCE_FORCE_SELF_III ] -modtools/reaction-trigger -reaction LEARN_REDUCE_FORCE_SELF_IV -command [ class-learn-spell -unit \WORKER_ID -spell REDUCE_FORCE_SELF_IV ] -modtools/reaction-trigger -reaction LEARN_REDUCE_FORCE_SELF_V -command [ class-learn-spell -unit \WORKER_ID -spell REDUCE_FORCE_SELF_V ] -modtools/reaction-trigger -reaction LEARN_MAKE_ENEMIES_DISAPPEAR_I -command [ class-learn-spell -unit \WORKER_ID -spell MAKE_ENEMIES_DISAPPEAR_I ] -modtools/reaction-trigger -reaction LEARN_MAKE_ENEMIES_DISAPPEAR_II -command [ class-learn-spell -unit \WORKER_ID -spell MAKE_ENEMIES_DISAPPEAR_II ] -modtools/reaction-trigger -reaction LEARN_MAKE_ENEMIES_DISAPPEAR_III -command [ class-learn-spell -unit \WORKER_ID -spell MAKE_ENEMIES_DISAPPEAR_III ] -modtools/reaction-trigger -reaction LEARN_EUSTRESS_SELF -command [ class-learn-spell -unit \WORKER_ID -spell EUSTRESS_SELF ] -modtools/reaction-trigger -reaction LEARN_ENJOY_I -command [ class-learn-spell -unit \WORKER_ID -spell ENJOY_I ] -modtools/reaction-trigger -reaction LEARN_ENJOY_II -command [ class-learn-spell -unit \WORKER_ID -spell ENJOY_II ] -modtools/reaction-trigger -reaction LEARN_ENJOY_III -command [ class-learn-spell -unit \WORKER_ID -spell ENJOY_III ] -modtools/reaction-trigger -reaction LEARN_ENJOY_IV -command [ class-learn-spell -unit \WORKER_ID -spell ENJOY_IV ] -modtools/reaction-trigger -reaction LEARN_DESKILL_I -command [ class-learn-spell -unit \WORKER_ID -spell DESKILL_I ] -modtools/reaction-trigger -reaction LEARN_DESKILL_II -command [ class-learn-spell -unit \WORKER_ID -spell DESKILL_II ] -modtools/reaction-trigger -reaction LEARN_AGONY_I -command [ class-learn-spell -unit \WORKER_ID -spell AGONY_I ] -modtools/reaction-trigger -reaction LEARN_AGONY_II -command [ class-learn-spell -unit \WORKER_ID -spell AGONY_II ] -modtools/reaction-trigger -reaction LEARN_AGONY_III -command [ class-learn-spell -unit \WORKER_ID -spell AGONY_III ] -modtools/reaction-trigger -reaction LEARN_AGONY_IV -command [ class-learn-spell -unit \WORKER_ID -spell AGONY_IV ] -modtools/reaction-trigger -reaction LEARN_AGONY_V -command [ class-learn-spell -unit \WORKER_ID -spell AGONY_V ] -modtools/reaction-trigger -reaction LEARN_DEATTRIBUTE_I -command [ class-learn-spell -unit \WORKER_ID -spell DEATTRIBUTE_I ] -modtools/reaction-trigger -reaction LEARN_DEATTRIBUTE_II -command [ class-learn-spell -unit \WORKER_ID -spell DEATTRIBUTE_II ] -modtools/reaction-trigger -reaction LEARN_INSANITY_I -command [ class-learn-spell -unit \WORKER_ID -spell INSANITY_I ] -modtools/reaction-trigger -reaction LEARN_INSANITY_II -command [ class-learn-spell -unit \WORKER_ID -spell INSANITY_II ] -modtools/reaction-trigger -reaction LEARN_TEAR_OUT_SOUL -command [ class-learn-spell -unit \WORKER_ID -spell TEAR_OUT_SOUL ] -modtools/reaction-trigger -reaction LEARN_UNINSANE -command [ class-learn-spell -unit \WORKER_ID -spell UNINSANE ] -modtools/reaction-trigger -reaction LEARN_SHOOT_BLOOD_I -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_BLOOD_I ] -modtools/reaction-trigger -reaction LEARN_SHOOT_BLOOD_II -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_BLOOD_II ] -modtools/reaction-trigger -reaction LEARN_SHOOT_BLOOD_III -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_BLOOD_III ] -modtools/reaction-trigger -reaction LEARN_SHOOT_BLOOD_IV -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_BLOOD_IV ] -modtools/reaction-trigger -reaction LEARN_SHOOT_BLOOD_V -command [ class-learn-spell -unit \WORKER_ID -spell SHOOT_BLOOD_V ] -modtools/reaction-trigger -reaction LEARN_REMOVE_BLOOD_I -command [ class-learn-spell -unit \WORKER_ID -spell REMOVE_BLOOD_I ] -modtools/reaction-trigger -reaction LEARN_REMOVE_BLOOD_II -command [ class-learn-spell -unit \WORKER_ID -spell REMOVE_BLOOD_II ] -modtools/reaction-trigger -reaction LEARN_REMOVE_BLOOD_III -command [ class-learn-spell -unit \WORKER_ID -spell REMOVE_BLOOD_III ] -modtools/reaction-trigger -reaction LEARN_REMOVE_BLOOD_IV -command [ class-learn-spell -unit \WORKER_ID -spell REMOVE_BLOOD_IV ] -modtools/reaction-trigger -reaction LEARN_CARING_I -command [ class-learn-spell -unit \WORKER_ID -spell CARING_I ] -modtools/reaction-trigger -reaction LEARN_CARING_II -command [ class-learn-spell -unit \WORKER_ID -spell CARING_II ] -modtools/reaction-trigger -reaction LEARN_CARING_III -command [ class-learn-spell -unit \WORKER_ID -spell CARING_III ] -modtools/reaction-trigger -reaction LEARN_CARING_IV -command [ class-learn-spell -unit \WORKER_ID -spell CARING_IV ] -modtools/reaction-trigger -reaction LEARN_CARING_V -command [ class-learn-spell -unit \WORKER_ID -spell CARING_V ] -modtools/reaction-trigger -reaction LEARN_HATRED_I -command [ class-learn-spell -unit \WORKER_ID -spell HATRED_I ] -modtools/reaction-trigger -reaction LEARN_HATRED_II -command [ class-learn-spell -unit \WORKER_ID -spell HATRED_II ] -modtools/reaction-trigger -reaction LEARN_HATRED_III -command [ class-learn-spell -unit \WORKER_ID -spell HATRED_III ] -modtools/reaction-trigger -reaction LEARN_HATRED_IV -command [ class-learn-spell -unit \WORKER_ID -spell HATRED_IV ] -modtools/reaction-trigger -reaction LEARN_HATRED_V -command [ class-learn-spell -unit \WORKER_ID -spell HATRED_V ] -modtools/reaction-trigger -reaction LEARN_STAVE_DOOM_I -command [ class-learn-spell -unit \WORKER_ID -spell STAVE_DOOM_I ] -modtools/reaction-trigger -reaction LEARN_STAVE_DOOM_II -command [ class-learn-spell -unit \WORKER_ID -spell STAVE_DOOM_II ] -modtools/reaction-trigger -reaction LEARN_DETECT_LORD_ENGLISH -command [ class-learn-spell -unit \WORKER_ID -spell DETECT_LORD_ENGLISH ] -modtools/reaction-trigger -reaction LEARN_DOOM_ENEMIES_I -command [ class-learn-spell -unit \WORKER_ID -spell DOOM_ENEMIES_I ] -modtools/reaction-trigger -reaction LEARN_DOOM_ENEMIES_II -command [ class-learn-spell -unit \WORKER_ID -spell DOOM_ENEMIES_II ] -modtools/reaction-trigger -reaction LEARN_DOOM_ENEMIES_III -command [ class-learn-spell -unit \WORKER_ID -spell DOOM_ENEMIES_III ] -modtools/reaction-trigger -reaction LEARN_DOOM_ENEMIES_IV -command [ class-learn-spell -unit \WORKER_ID -spell DOOM_ENEMIES_IV ] -modtools/reaction-trigger -reaction LEARN_DOOM_ENEMIES_V -command [ class-learn-spell -unit \WORKER_ID -spell DOOM_ENEMIES_V ] -modtools/reaction-trigger -reaction LEARN_INCREASE_FORCE_ENEMY_I -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_FORCE_ENEMY_I ] -modtools/reaction-trigger -reaction LEARN_INCREASE_FORCE_ENEMY_II -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_FORCE_ENEMY_II ] -modtools/reaction-trigger -reaction LEARN_INCREASE_FORCE_ENEMY_III -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_FORCE_ENEMY_III ] -modtools/reaction-trigger -reaction LEARN_INCREASE_FORCE_ENEMY_IV -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_FORCE_ENEMY_IV ] -modtools/reaction-trigger -reaction LEARN_INCREASE_FORCE_ENEMY_V -command [ class-learn-spell -unit \WORKER_ID -spell INCREASE_FORCE_ENEMY_V ] -modtools/reaction-trigger -reaction LEARN_EUSTRESS_I -command [ class-learn-spell -unit \WORKER_ID -spell EUSTRESS_I ] -modtools/reaction-trigger -reaction LEARN_EUSTRESS_II -command [ class-learn-spell -unit \WORKER_ID -spell EUSTRESS_II ] -modtools/reaction-trigger -reaction LEARN_EUSTRESS_III -command [ class-learn-spell -unit \WORKER_ID -spell EUSTRESS_III ] -modtools/reaction-trigger -reaction LEARN_DISTRESS_I -command [ class-learn-spell -unit \WORKER_ID -spell DISTRESS_I ] -modtools/reaction-trigger -reaction LEARN_DISTRESS_II -command [ class-learn-spell -unit \WORKER_ID -spell DISTRESS_II ] -modtools/reaction-trigger -reaction LEARN_DISTRESS_III -command [ class-learn-spell -unit \WORKER_ID -spell DISTRESS_III ] -modtools/reaction-trigger -reaction LEARN_DISTRESS_IV -command [ class-learn-spell -unit \WORKER_ID -spell DISTRESS_IV ] -modtools/reaction-trigger -reaction LEARN_BLISS_I -command [ class-learn-spell -unit \WORKER_ID -spell BLISS_I ] -modtools/reaction-trigger -reaction LEARN_BLISS_II -command [ class-learn-spell -unit \WORKER_ID -spell BLISS_II ] -modtools/reaction-trigger -reaction LEARN_BLISS_III -command [ class-learn-spell -unit \WORKER_ID -spell BLISS_III ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_I -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_I ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_II -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_II ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_III -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_III ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_IV -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_IV ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_V -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_V ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_VI -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_VI ] -modtools/reaction-trigger -reaction LEARN_ENRAGE_VII -command [ class-learn-spell -unit \WORKER_ID -spell ENRAGE_VII ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class SEER_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class MAID_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class BARD_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_BREATH -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_BREATH ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class SEER_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class MAID_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class BARD_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_LIGHT -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_LIGHT ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_TIME -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_TIME -command [ class-change-class -unit \WORKER_ID -class SEER_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_TIME -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_TIME -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_TIME -command [ class-change-class -unit \WORKER_ID -class MAID_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_TIME -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_TIME -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_TIME -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_TIME -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_TIME -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_TIME -command [ class-change-class -unit \WORKER_ID -class BARD_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_TIME -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_TIME ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class SEER_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class MAID_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class BARD_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_SPACE -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_SPACE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class SEER_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class MAID_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class BARD_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_LIFE -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_LIFE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class SEER_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class MAID_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class BARD_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_HOPE -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_HOPE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_VOID -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_VOID -command [ class-change-class -unit \WORKER_ID -class SEER_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_VOID -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_VOID -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_VOID -command [ class-change-class -unit \WORKER_ID -class MAID_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_VOID -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_VOID -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_VOID -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_VOID -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_VOID -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_VOID -command [ class-change-class -unit \WORKER_ID -class BARD_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_VOID -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_VOID ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_HEART -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_HEART -command [ class-change-class -unit \WORKER_ID -class SEER_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_HEART -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_HEART -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_HEART -command [ class-change-class -unit \WORKER_ID -class MAID_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_HEART -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_HEART -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_HEART -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_HEART -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_HEART -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_HEART -command [ class-change-class -unit \WORKER_ID -class BARD_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_HEART -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_HEART ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class SEER_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class MAID_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class BARD_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_BLOOD -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_BLOOD ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class SEER_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class MAID_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class BARD_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_DOOM -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_DOOM ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_MIND -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_MIND -command [ class-change-class -unit \WORKER_ID -class SEER_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_MIND -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_MIND -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_MIND -command [ class-change-class -unit \WORKER_ID -class MAID_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_MIND -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_MIND -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_MIND -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_MIND -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_MIND -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_MIND -command [ class-change-class -unit \WORKER_ID -class BARD_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_MIND -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_MIND ] -modtools/reaction-trigger -reaction CHANGE_CLASS_HEIR_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class HEIR_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SEER_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class SEER_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_KNIGHT_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class KNIGHT_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_WITCH_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class WITCH_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAID_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class MAID_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PAGE_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class PAGE_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_PRINCE_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class PRINCE_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_ROGUE_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class ROGUE_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_THIEF_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class THIEF_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_SYLPH_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class SYLPH_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_BARD_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class BARD_OF_RAGE ] -modtools/reaction-trigger -reaction CHANGE_CLASS_MAGE_OF_RAGE -command [ class-change-class -unit \WORKER_ID -class MAGE_OF_RAGE ] diff --git a/raw/fortbent_onload.txt b/raw/fortbent_onload.txt index bae7b8e..2d8c3bc 100644 --- a/raw/fortbent_onload.txt +++ b/raw/fortbent_onload.txt @@ -18,8 +18,6 @@ modtools/reaction-trigger -reactionName ALCHEMIZE_TROLL_ADV -command [ fortbent/ fortbent/grist -base/roses-init -classSystem - fortbent/heroic_just fortbent/claspect_assign diff --git a/raw/init.d/fortbent.lua b/raw/init.d/fortbent.lua index 7a51031..8ea809d 100644 --- a/raw/init.d/fortbent.lua +++ b/raw/init.d/fortbent.lua @@ -305,12 +305,54 @@ eventful.onReport.lord_english_appear=function(reportId) end end end +local putnamSkills=dfhack.script_environment('modtools/putnam_skills') -local stateEvents={} +eventful.onUnitAttack.addSburbExperience=function(attackerId,defenderId,woundId) + local wound + for k,v in ipairs(df.unit.find(defenderId).body.wounds) do + if woundId==v.id then wound=v end + end + putnamSkills.addExperienceToAllSkillsWithLevelCriterion(df.unit.find(attackerId),math.floor(math.sqrt(wound.contact_area)+0.5)+1,'sburb') + putnamSkills.addExperienceToAllSkillsWithLevelCriterion(df.unit.find(defenderId),1,'sburb') +end + +eventful.onUnitDeath.addSburbExperience=function(unit_id) + local deadUnit=df.unit.find(unit_id) + local expValue=(deadUnit.body.blood_max/500) + expValue=expValue+deadUnit.body.physical_attrs.STRENGTH.value/1000 + expValue=expValue+deadUnit.body.physical_attrs.AGILITY.value/1000 + expValue=expValue+deadUnit.body.physical_attrs.TOUGHNESS.value/1000 + expValue=expValue+deadUnit.body.physical_attrs.ENDURANCE.value/1000 + expValue=expValue+deadUnit.status.current_soul.mental_attrs.WILLPOWER.value/1500 + expValue=expValue+deadUnit.status.current_soul.mental_attrs.SPATIAL_SENSE.value/1000 + expValue=expValue+deadUnit.status.current_soul.mental_attrs.KINESTHETIC_SENSE.value/1000 + expValue=expValue+deadUnit.status.current_soul.mental_attrs.FOCUS.value/2000 + if df.incident.find(deadUnit.counters.death_id) then + local killerId=df.incident.find(deadUnit.counters.death_id).killer + if df.unit.find(killerId) then + putnamSkills.addExperienceToAllSkillsWithLevelCriterion(df.unit.find(killerId),expValue,'sburb') + end + end +end + +eventful.onItemCreated.addSburbExperience=function(item_id) + local item=df.item.find(item_id) + if pcall(function() tostring(item.maker) end) and df.unit.find(item.maker) then + putnamSkills.addExperienceToAllSkillsWithLevelCriterion(df.unit.find(item.maker),(item.quality+1)^2,'sburb') + end +end -stateEvents[SC_MAP_LOADED]=function() eventful.enableEvent(eventful.eventType.INTERACTION,5) eventful.enableEvent(eventful.eventType.REPORT,5) end +local stateEvents={} -stateEvents[SC_WORLD_LOADED]=stateEvents[SC_MAP_LOADED] +stateEvents[SC_MAP_LOADED]=function() + eventful.enableEvent(eventful.eventType.INTERACTION,1) + eventful.enableEvent(eventful.eventType.REPORT,1) + eventful.enableEvent(eventful.eventType.UNIT_ATTACK,5) + eventful.enableEvent(eventful.eventType.UNIT_DEATH,10) + eventful.enableEvent(eventful.eventType.ITEM_CREATED,5) + dfhack.script_environment('modtools/persist_timeout').onLoad() + dfhack.run_command('fortbent/classes') +end function onStateChange(op) local stateChangeFunc=stateEvents[op] diff --git a/raw/inorganic_dfhack_classes.txt b/raw/inorganic_dfhack_classes.txt deleted file mode 100644 index 373c3ac..0000000 --- a/raw/inorganic_dfhack_classes.txt +++ /dev/null @@ -1,2223 +0,0 @@ -inorganic_dfhack_classes - -[OBJECT:INORGANIC] - -[INORGANIC:DFHACK_CLASS_SPELLS] - [USE_MATERIAL_TEMPLATE:STONE_TEMPLATE] - [SYNDROME] - [SYN_NAME:FRAYMOTIF] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Fraymotif!] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:uses a fraymotif:uses a fraymotif:uses a fraymotif] - [CDI:TARGET_VERB:gets hit by a fraymotif:gets hit by a fraymotif] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:6000] - [SYNDROME] - [SYN_NAME:CAN_GO_GOD_TIER] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Use this so you can go god tier!] - [CDI:INTERACTION:CAN_GO_GOD_TIER] - [CDI:TARGET:A:SELF_ONLY] - [CDI:TARGET_RANGE:A:1] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:337000] - [SYNDROME] - [SYN_NAME:WINDY_BULLET_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot a windy bullet (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:WIND:SOLID_GLOB] - [CDI:VERB:shoot a gust of wind:shoots a gust of wind:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:WINDY_BULLET_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot a windy bullet (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:WIND:SOLID_GLOB] - [CDI:VERB:shoot a gust of wind:shoots a gust of wind:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:WINDY_BULLET_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot a windy bullet (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:WIND:SOLID_GLOB] - [CDI:VERB:shoot a gust of wind:shoots a gust of wind:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:WINDY_BULLET_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot a windy bullet (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:WIND:SOLID_GLOB] - [CDI:VERB:shoot a gust of wind:shoots a gust of wind:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:2] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:WINDY_BULLET_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot a windy bullet (tier 5)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:WIND:SOLID_GLOB] - [CDI:VERB:shoot a gust of wind:shoots a gust of wind:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:4] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:WINDY_DELAY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DELAY_WITH_BREATH] - [CDI:ADV_NAME:Slow someone down with breath (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind attempting to block your path:slows down due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:WINDY_DELAY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DELAY_WITH_BREATH] - [CDI:ADV_NAME:Slow someone down with breath (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind attempting to block your path:slows down due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:WINDY_DELAY_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DELAY_WITH_BREATH] - [CDI:ADV_NAME:Slow someone down with breath (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind attempting to block your path:slows down due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:WAIT_PERIOD:300] - [SYNDROME] - [SYN_NAME:WINDY_DELAY_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DELAY_WITH_BREATH] - [CDI:ADV_NAME:Slow someone down with breath (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind attempting to block your path:slows down due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:WAIT_PERIOD:300] - [SYNDROME] - [SYN_NAME:WINDY_HASTE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:HASTE_WITH_BREATH] - [CDI:ADV_NAME:Speed someone up with breath (tier 1)] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind at your back:speeds up due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:WINDY_HASTE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:HASTE_WITH_BREATH] - [CDI:ADV_NAME:Speed someone up with breath (tier 2)] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind at your back:speeds up due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:WINDY_HASTE_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:HASTE_WITH_BREATH] - [CDI:ADV_NAME:Speed someone up with breath (tier 3)] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind at your back:speeds up due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:WAIT_PERIOD:300] - [SYNDROME] - [SYN_NAME:WINDY_HASTE_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:HASTE_WITH_BREATH] - [CDI:ADV_NAME:Speed someone up with breath (tier 4)] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:make a pushing gesture:makes a pushing gesture:n/a] - [CDI:TARGET_VERB:feel a gust of wind at your back:speeds up due to a sudden gust of wind] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:WAIT_PERIOD:200] - [SYNDROME] - [SYN_NAME:BREATH_EXPLODE_A_BODY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Explode a body (tier 1)] - [CDI:INTERACTION:PRINCE_DESTROY_WITH_BREATH] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:BREATH_RENDER_BREATHLESS_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_DESTROY_BREATH] - [CDI:ADV_NAME:Destroy Breath (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET_VERB:suddenly feel breathless:looks unable to breath] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:BREATH_EXPLODE_A_BODY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Explode a body (tier 2)] - [CDI:INTERACTION:PRINCE_DESTROY_WITH_BREATH] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:BREATH_RENDER_BREATHLESS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_DESTROY_BREATH] - [CDI:ADV_NAME:Destroy Breath (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET_VERB:suddenly feel breathless:looks unable to breath] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:BREATH_RENDER_BREATHLESS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_DESTROY_BREATH] - [CDI:ADV_NAME:Destroy Breath (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET_VERB:suddenly feel breathless:looks unable to breath] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:PREVENT_SUFFOCATION] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PREVENT_SUFFOCATION_BREATH] - [CDI:ADV_NAME:Prevent suffocation] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:WAIT_PERIOD:50] - [SYNDROME] - [SYN_NAME:DECREASE_LUCK_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_DECREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (luck reduction):gestures (luck reduction):NA] - [CDI:TARGET_VERB:feel like the world is against you:looks aghast] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:DECREASE_LUCK_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_DECREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (luck reduction):gestures (luck reduction):NA] - [CDI:TARGET_VERB:feel like the world is against you:looks aghast] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:DECREASE_LUCK_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_DECREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture (luck reduction):gestures (luck reduction):NA] - [CDI:TARGET_VERB:feel like the world is against you:looks aghast] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:DECREASE_LUCK_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_DECREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:VERB:gesture (luck reduction):gestures (luck reduction):NA] - [CDI:TARGET_VERB:feel like the world is against you:looks aghast] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:501] - [SYNDROME] - [SYN_NAME:INCREASE_LUCK_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_INCREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:INCREASE_LUCK_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_INCREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:INCREASE_LUCK_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_INCREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:INCREASE_LUCK_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LUCK_INCREASE_TROLL_WITCH_OF_LIGHT] - [CDI:ADV_NAME:Decrease your enemies' luck (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:501] - [SYNDROME] - [SYN_NAME:TEMPORARY_BLIND_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DESTROY_LIGHT_TEMPORARY] - [CDI:ADV_NAME:Destroy your enemies' eyesight (temporary)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (temporary blindness):gestures (temporary blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TEMPORARY_BLIND_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DESTROY_LIGHT_TEMPORARY] - [CDI:ADV_NAME:Destroy your enemies' eyesight (temporary)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture (temporary blindness):gestures (temporary blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TEMPORARY_BLIND_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DESTROY_LIGHT_TEMPORARY] - [CDI:ADV_NAME:Destroy your enemies' eyesight (temporary)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:VERB:gesture (temporary blindness):gestures (temporary blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:PERMANENT_BLIND_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIGHT_DESTROY_LIGHT] - [CDI:ADV_NAME:Destroy your enemies' eyesight (permanent)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (permanent blindness):gestures (permanent blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:PERMANENT_BLIND_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIGHT_DESTROY_LIGHT] - [CDI:ADV_NAME:Destroy your enemies' eyesight (permanent)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture (permanent blindness):gestures (permanent blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:PERMANENT_BLIND_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIGHT_DESTROY_LIGHT] - [CDI:ADV_NAME:Destroy your enemies' eyesight (permanent)] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:VERB:gesture (permanent blindness):gestures (permanent blindness):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:LIGHT_SEE_CREATURES] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:LIGHT_SEE_CREATURES] - [CDI:ADV_NAME:use this on yourself so you can see stuff through walls] - [CDI:TARGET:A:SELF_ONLY] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:100000] - [SYNDROME] - [SYN_NAME:GIVE_VISION] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:ADD_EXTRAVISION_TROLL] - [CDI:ADV_NAME:use this on yourself so you can see stuff through walls] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_I] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (time slow):gestures (time slow):NA] - [CDI:TARGET_VERB:can't see:can't see] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_I] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (time slow):gestures (time slow):NA] - [CDI:TARGET_VERB:see everything speed up around you:appears to slow down somewhat] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_I] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (time slow):gestures (time slow):NA] - [CDI:TARGET_VERB:see everything speed up around you:appears to slow down somewhat] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_I] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture (time slow):gestures (time slow):NA] - [CDI:TARGET_VERB:see everything speed up around you:appears to slow down somewhat] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_II] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (time stop):gestures (time stop):NA] - [CDI:TARGET_VERB:see everything speed up around you:appears to slow down a lot] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_SLOW_DOWN_ENEMY_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SLOW_DOWN_ENEMY_II] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture (time stop):gestures (time stop):NA] - [CDI:TARGET_VERB:see everything speed up around you:appears to slow down a lot] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_SPEED_UP_FRIEND_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SPEED_UP_FRIEND_I] - [CDI:ADV_NAME:Slow down enemies] - [CDI:USAGE_HINT:GREETING] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_SPEED_UP_FRIEND_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SPEED_UP_FRIEND_I] - [CDI:ADV_NAME:Speed up friends] - [CDI:USAGE_HINT:GREETING] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:TIME_SPEED_UP_FRIEND_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SPEED_UP_FRIEND_I] - [CDI:ADV_NAME:Speed up friends] - [CDI:USAGE_HINT:GREETING] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:TIME_SPEED_UP_SELF] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_SPEED_UP_SELF] - [CDI:ADV_NAME:Speed up yourself] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET:A:SELF_ONLY] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:TIME_INCREASE_LUCK_SELF] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:TIME_INCREASE_LUCK_SELF] - [CDI:TARGET:A:SELF_ONLY] - [CDI:TARGET_RANGE:A:1] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:10001] - [SYNDROME] - [SYN_NAME:TIME_AGE_ENEMIES_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Age up an enemy] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (age up):gestures (age up):NA] - [CDI:TARGET_VERB:ageup:ageup] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:TIME_AGE_ENEMIES_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Age up an enemy] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (age up):gestures (age up):NA] - [CDI:TARGET_VERB:ageup:ageup] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:TIME_AGE_ENEMIES_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Age up an enemy] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (age up):gestures (age up):NA] - [CDI:TARGET_VERB:ageup:ageup] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:TIME_AGE_ENEMIES_PAGE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Age up an enemy] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (age up):gestures (age up):NA] - [CDI:TARGET_VERB:ageup:ageup] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1250] - [SYNDROME] - [SYN_NAME:TIME_AGE_DOWN] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Age down a friend] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:TARGET_VERB:agedown:agedown] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHRINK_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_SHRINK] - [CDI:ADV_NAME:Shrink (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (shrink):gestures (shrink):NA] - [CDI:TARGET_VERB:shrink:shrinks] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1500] - [SYNDROME] - [SYN_NAME:SHRINK_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_SHRINK] - [CDI:ADV_NAME:Shrink (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (shrink):gestures (shrink):NA] - [CDI:TARGET_VERB:shrink:shrinks] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:1500] - [SYNDROME] - [SYN_NAME:SHRINK_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_SHRINK] - [CDI:ADV_NAME:Shrink (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (shrink):gestures (shrink):NA] - [CDI:TARGET_VERB:shrink:shrinks] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:WAIT_PERIOD:1500] - [SYNDROME] - [SYN_NAME:SHRINK_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_SHRINK] - [CDI:ADV_NAME:Shrink (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (shrink):gestures (shrink):NA] - [CDI:TARGET_VERB:shrink:shrinks] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:8] - [CDI:WAIT_PERIOD:1500] - [SYNDROME] - [SYN_NAME:GROW_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_GROW] - [CDI:ADV_NAME:grow (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (grow):gestures (grow):NA] - [CDI:TARGET:A:SELF_ONLY] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:3000] - [SYNDROME] - [SYN_NAME:GROW_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_GROW] - [CDI:ADV_NAME:grow (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (grow):gestures (grow):NA] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:GROW_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:WITCH_OF_SPACE_GROW] - [CDI:ADV_NAME:grow (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (grow):gestures (grow):NA] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:REPLACE_ARMS_WITH_SPACE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:MAGE_OF_SPACE_CREATE_SPACE_ARMS] - [CDI:ADV_NAME:Create space (in place of enemy's arms)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (space creation):gestures (space creation):NA] - [CDI:TARGET_VERB:suddenly feel like your arms are not there:loses all arms] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:REPLACE_LEGS_WITH_SPACE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:MAGE_OF_SPACE_CREATE_SPACE_ARMS] - [CDI:ADV_NAME:Create space (in place of enemy's legs)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (space creation):gestures (space creation):NA] - [CDI:TARGET_VERB:suddenly feel like your legs are not there:loses all legs] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:TELEPORT] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:teleport] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:teleport:teleports:NA] - [CDI:TARGET:A:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:5] - [SYNDROME] - [SYN_NAME:REPLACE_HEAD_WITH_SPACE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:ADV_NAME:Create space (in place of enemy's head)] - [CDI:USAGE_HINT:ATTACK] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:gesture (space creation):gestures (space creation):NA] - [CDI:TARGET_VERB:die:dies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:100] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:AUTOREVIVE_SELF_ONCE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Auto-life (1)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:SELF_ONLY] - [CDI:WAIT_PERIOD:337000] - [CDI:TARGET_VERB:newlife:newlife] - [SYNDROME] - [SYN_NAME:HEAL_MILD_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:heal someone] - [CDI:INTERACTION:RECOVER_TROLL] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:use heal I:uses heal I:NA] - [CDI:TARGET_VERB:feel like you're recovering faster:is recovering faster] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:HEAL_MILD_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:heal someone] - [CDI:INTERACTION:RECOVER_TROLL] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:use heal II:uses heal II:NA] - [CDI:TARGET_VERB:feel like you're recovering faster:is recovering faster] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:HEAL_MILD_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:heal someone] - [CDI:INTERACTION:RECOVER_TROLL] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:use heal III:uses heal III:NA] - [CDI:TARGET_VERB:feel like you're recovering faster:is recovering faster] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:HEAL_FULL_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:heal someone (full)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:heal someone:heals someone:NA] - [CDI:TARGET_VERB:heal:heals] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:HEAL_FULL:II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:heal someone (full)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:USAGE_HINT:GREETING] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:VERB:heal someone:heals someone:NA] - [CDI:TARGET_VERB:heal:heals] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:DEUNDEAD_FRIENDS] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Deundead your friends] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:INTERACTION:HEIR_OF_LIFE_DEUNDEAD_FRIENDS] - [CDI:USAGE_HINT:GREETING] - [CDI:TARGET_RANGE:A:20] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:10] - [SYNDROME] - [SYN_NAME:DEUNDEAD_ENEMIES] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:KNIGHT_OF_LIFE_DEUNDEAD_ENEMIES] - [CDI:ADV_NAME:Turn undead] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET_RANGE:A:20] - [CDI:MAX_TARGET_NUMBER:A:5] - [CDI:FREE_ACTION] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:DESTROY_LIFE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIFE_DESTROY_LIFE] - [CDI:ADV_NAME:Destroy life] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET_RANGE:20] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:DESTROY_LIFE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIFE_DESTROY_LIFE] - [CDI:ADV_NAME:Destroy life] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:TARGET_RANGE:20] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:DESTROY_LIFE_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIFE_DESTROY_LIFE] - [CDI:ADV_NAME:Destroy life] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:TARGET_RANGE:20] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:DESTROY_LIFE_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIFE_DESTROY_LIFE] - [CDI:ADV_NAME:Destroy life] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:8] - [CDI:TARGET_RANGE:20] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:DESTROY_LIFE_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:PRINCE_OF_LIFE_DESTROY_LIFE] - [CDI:ADV_NAME:Destroy life] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:TARGET_RANGE:20] - [CDI:WAIT_PERIOD:10000] - [SYNDROME] - [SYN_NAME:AUTOREVIVE_OTHERS_ONCE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Auto-life (others)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:10] - [CDI:FREE_ACTION] - [CDI:TARGET_VERB:newlife:newlife] - [SYNDROME] - [SYN_NAME:GIVE_FRIENDS_HOPE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give someone hope!] - [CDI:INTERACTION:HOPEFILL_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:GIVE_FRIENDS_HOPE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give someone hope!] - [CDI:INTERACTION:HOPEFILL_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:GIVE_FRIENDS_HOPE_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give someone hope!] - [CDI:INTERACTION:HOPEFILL_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:GIVE_FRIENDS_HOPE_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give someone hope!] - [CDI:INTERACTION:HOPEFILL_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:750] - [SYNDROME] - [SYN_NAME:GIVE_ENEMIES_HOPELESSNESS_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Take someone's hope!] - [CDI:INTERACTION:HOPELESS_I_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:WAIT_PERIOD:1000] - [CDI:TARGET_VERB:hopeless_I:hopeless_I] - [SYNDROME] - [SYN_NAME:GIVE_ENEMIES_HOPELESSNESS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Take someone's hope!] - [CDI:INTERACTION:HOPELESS_II_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:WAIT_PERIOD:1000] - [CDI:TARGET_VERB:hopeless_II:hopeless_II] - [SYNDROME] - [SYN_NAME:GIVE_ENEMIES_HOPELESSNESS_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Take someone's hope!] - [CDI:INTERACTION:HOPELESS_III_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:WAIT_PERIOD:1000] - [CDI:TARGET_VERB:hopeless_III:hopeless_III] - [SYNDROME] - [SYN_NAME:GIVE_ENEMIES_HOPELESSNESS_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Take someone's hope!] - [CDI:INTERACTION:HOPELESS_IV_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:TARGET_VERB:hopeless_IV:hopeless_IV] - [SYNDROME] - [SYN_NAME:SHOOT_WITH_HOPE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with WWHITE SCIENCE (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:HOPE_BEAM:SOLID_GLOB] - [CDI:VERB:shoot a shot of hope:shoots a shot of hope:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_WITH_HOPE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with WWHITE SCIENCE (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:HOPE_BEAM:SOLID_GLOB] - [CDI:VERB:shoot a shot of hope:shoots a shot of hope:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:2] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_WITH_HOPE_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with WWHITE SCIENCE (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:HOPE_BEAM:SOLID_GLOB] - [CDI:VERB:shoot a shot of hope:shoots a shot of hope:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:3] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_WITH_HOPE_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with WWHITE SCIENCE (tier 4)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:INORGANIC:HOPE_BEAM:SOLID_GLOB] - [CDI:VERB:shoot a shot of hope:shoots a shot of hope:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:8] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:HIDE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:HIDE_TROLL] - [CDI:ADV_NAME:Turn yourself sorta invisible] - [CDI:TARGET:A:SELF_ONLY] - [CDI:TARGET_RANGE:A:1] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:USAGE_HINT:FLEEING] - [CDI:WAIT_PERIOD:200] - [SYNDROME] - [SYN_NAME:REDUCE_FORCE_SELF_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:VOID_STRENGTHEN_I] - [CDI:ADV_NAME:strengthen yourself] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET:C:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:3000] - [SYNDROME] - [SYN_NAME:REDUCE_FORCE_SELF_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:VOID_STRENGTHEN_I] - [CDI:ADV_NAME:strengthen yourself] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET:C:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:REDUCE_FORCE_SELF_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:VOID_STRENGTHEN_II] - [CDI:ADV_NAME:strengthen yourself] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET:C:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:3000] - [SYNDROME] - [SYN_NAME:REDUCE_FORCE_SELF_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:VOID_STRENGTHEN_II] - [CDI:ADV_NAME:more difficult to hit] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET:C:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:2000] - [SYNDROME] - [SYN_NAME:REDUCE_FORCE_SELF_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:VOID_STRENGTHEN_II] - [CDI:ADV_NAME:strengthen yourself] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET:C:SELF_ONLY] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1001] - [SYNDROME] - [SYN_NAME:MAKE_ENEMIES_DISAPPEAR_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone void] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture:gestures] - [CDI:TARGET_VERB:superdie:superdie] - [SYNDROME] - [SYN_NAME:MAKE_ENEMIES_DISAPPEAR_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone void] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:7500] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture:gestures] - [CDI:TARGET_VERB:superdie:superdie] - [SYNDROME] - [SYN_NAME:MAKE_ENEMIES_DISAPPEAR_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone void] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture:gestures] - [CDI:TARGET_VERB:superdie:superdie] - [SYNDROME] - [SYN_NAME:EUSTRESS_SELF] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Eustress self] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:SELF_ONLY] - [CDI:WAIT_PERIOD:1000] - [CDI:TARGET_VERB:eustress:eustress] - [SYNDROME] - [SYN_NAME:ENJOY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others joy] - [CDI:INTERACTION:ENJOY_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:8400] - [SYNDROME] - [SYN_NAME:ENJOY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others joy] - [CDI:INTERACTION:ENJOY_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:4200] - [SYNDROME] - [SYN_NAME:ENJOY_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others joy] - [CDI:INTERACTION:ENJOY2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:8400] - [SYNDROME] - [SYN_NAME:ENJOY_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others joy] - [CDI:INTERACTION:ENJOY2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:4200] - [SYNDROME] - [SYN_NAME:DESKILL_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Deskill (I)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET_VERB:deskill:deskill] - [SYNDROME] - [SYN_NAME:DESKILL_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Deskill (II)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET_VERB:deskill:deskill] - [SYNDROME] - [SYN_NAME:AGONY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Agony (I)] - [CDI:INTERACTION:AGONY_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:MAX_TARGET_NUMBER:A:4] - [SYNDROME] - [SYN_NAME:AGONY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Agony (II)] - [CDI:INTERACTION:AGONY_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:AGONY_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Agony (III)] - [CDI:INTERACTION:AGONY_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:AGONY_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Agony (IV)] - [CDI:INTERACTION:AGONY2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [CDI:MAX_TARGET_NUMBER:A:4] - [SYNDROME] - [SYN_NAME:AGONY_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Agony (V)] - [CDI:INTERACTION:AGONY2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:MAX_TARGET_NUMBER:A:2] - [SYNDROME] - [SYN_NAME:DEATTRIBUTE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Deattribute (I)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET_VERB:deattribute:deattribute] - [SYNDROME] - [SYN_NAME:DEATTRIBUTE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Deattribute (II)] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:TARGET_VERB:deattribute:deattribute] - [SYNDROME] - [SYN_NAME:INSANITY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone insane] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture:gestures:NA] - [CDI:TARGET_VERB:insane:insane] - [SYNDROME] - [SYN_NAME:INSANITY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone insane] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:gesture:gestures:NA] - [CDI:TARGET_VERB:insane:insane] - [SYNDROME] - [SYN_NAME:TEAR_OUT_SOUL] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Tear out someone's soul] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:make a pulling gesture:makes a pulling gesture:NA] - [CDI:TARGET_VERB:superdie:superdie] - [SYNDROME] - [SYN_NAME:UNINSANE] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Make someone uninsane] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:1200] - [CDI:TARGET_VERB:uninsane:uninsane] - [SYNDROME] - [SYN_NAME:SHOOT_BLOOD_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with your blood (ew) (tier 1)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:LOCAL_CREATURE_MAT:BLOOD:LIQUID_GLOB] - [CDI:VERB:shoot a shot of blood:shoots a shot of blood:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_BLOOD_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with your blood (ew) (tier 2)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:LOCAL_CREATURE_MAT:BLOOD:LIQUID_GLOB] - [CDI:VERB:shoot a shot of blood:shoots a shot of blood:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:2] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_BLOOD_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with your blood (ew) (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:LOCAL_CREATURE_MAT:BLOOD:LIQUID_GLOB] - [CDI:VERB:shoot a shot of blood:shoots a shot of blood:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:4] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:SHOOT_BLOOD_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with your blood (ew) (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:LOCAL_CREATURE_MAT:BLOOD:LIQUID_GLOB] - [CDI:VERB:shoot a shot of blood:shoots a shot of blood:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:1] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:SHOOT_BLOOD_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Shoot with your blood (ew) (tier 3)] - [CDI:USAGE_HINT:ATTACK] - [CDI:INTERACTION:MATERIAL_EMISSION] - [CDI:BP_REQUIRED:BY_CATEGORY:HEAD] - [CDI:MATERIAL:LOCAL_CREATURE_MAT:BLOOD:LIQUID_GLOB] - [CDI:VERB:shoot a shot of blood:shoots a shot of blood:NA] - [CDI:TARGET:C:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:C:20] - [CDI:MAX_TARGET_NUMBER:C:2] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:REMOVE_BLOOD_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Remove someone's blood] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:3000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (bloodloss):gestures (bloodloss):NA] - [CDI:TARGET_VERB:bloodloss:bloodloss] - [SYNDROME] - [SYN_NAME:REMOVE_BLOOD_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Remove someone's blood] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (bloodloss):gestures (bloodloss):NA] - [CDI:TARGET_VERB:bloodloss:bloodloss] - [SYNDROME] - [SYN_NAME:REMOVE_BLOOD_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Remove someone's blood] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (bloodloss):gestures (bloodloss):NA] - [CDI:TARGET_VERB:bloodloss:bloodloss] - [SYNDROME] - [SYN_NAME:REMOVE_BLOOD_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Remove someone's blood] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:200] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:gesture (bloodloss):gestures (bloodloss):NA] - [CDI:TARGET_VERB:bloodloss:bloodloss] - [SYNDROME] - [SYN_NAME:CARING_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others caring] - [CDI:INTERACTION:CARING_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:8400] - [SYNDROME] - [SYN_NAME:CARING_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others caring] - [CDI:INTERACTION:CARING_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:4200] - [SYNDROME] - [SYN_NAME:CARING_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others caring] - [CDI:INTERACTION:CARING2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:8400] - [SYNDROME] - [SYN_NAME:CARING_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others caring] - [CDI:INTERACTION:CARING2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:4200] - [SYNDROME] - [SYN_NAME:CARING_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others caring] - [CDI:INTERACTION:CARING2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:1200] - [SYNDROME] - [SYN_NAME:HATRED_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Hatred (I)] - [CDI:INTERACTION:HATRED_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:MAX_TARGET_NUMBER:A:4] - [SYNDROME] - [SYN_NAME:HATRED_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Hatred (II)] - [CDI:INTERACTION:HATRED_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:HATRED_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Hatred (III)] - [CDI:INTERACTION:HATRED_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:HATRED_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Hatred (IV)] - [CDI:INTERACTION:HATRED2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [CDI:MAX_TARGET_NUMBER:A:4] - [SYNDROME] - [SYN_NAME:HATRED_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Hatred (V)] - [CDI:INTERACTION:HATRED2_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:MAX_TARGET_NUMBER:A:2] - [SYNDROME] - [SYN_NAME:STAVE_DOOM_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Stave Doom] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:33600] - [CDI:TARGET_VERB:doomstave:doomstave] - [SYNDROME] - [SYN_NAME:STAVE_DOOM_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Stave Doom] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:16800] - [CDI:TARGET_VERB:doomstave:doomstave] - [SYNDROME] - [SYN_NAME:DETECT_LORD_ENGLISH] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Detect Lord English] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:SELF_ONLY] - [CDI:WAIT_PERIOD:8400] - [CDI:TARGET_VERB:LECheck:LECheck] - [SYNDROME] - [SYN_NAME:DOOM_ENEMIES_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Doom enemies] - [CDI:INTERACTION:DOOM_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:VERB:say DOOM:says DOOM:NA] - [CDI:TARGET_VERB:feel completely awful:begins breaking out in blisters] - [SYNDROME] - [SYN_NAME:DOOM_ENEMIES_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Doom enemies] - [CDI:INTERACTION:DOOM_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:VERB:say DOOM:says DOOM:NA] - [CDI:TARGET_VERB:feel completely awful:begins breaking out in blisters] - [SYNDROME] - [SYN_NAME:DOOM_ENEMIES_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Doom enemies] - [CDI:INTERACTION:DOOM_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:VERB:say DOOM:says DOOM:NA] - [CDI:TARGET_VERB:feel completely awful:begins breaking out in blisters] - [SYNDROME] - [SYN_NAME:DOOM_ENEMIES_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Doom enemies] - [CDI:INTERACTION:DOOM_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:MAX_TARGET_NUMBER:A:8] - [CDI:VERB:say DOOM:says DOOM:NA] - [CDI:TARGET_VERB:feel completely awful:begins breaking out in blisters] - [SYNDROME] - [SYN_NAME:DOOM_ENEMIES_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Doom enemies] - [CDI:INTERACTION:DOOM_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:10000] - [CDI:VERB:say DOOM:says DOOM:NA] - [CDI:TARGET_VERB:feel completely awful:begins breaking out in blisters] - [SYNDROME] - [SYN_NAME:INCREASE_FORCE_ENEMY_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DOOM_WEAKEN] - [CDI:ADV_NAME:weaken enemies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:1] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:INCREASE_FORCE_ENEMY_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DOOM_WEAKEN] - [CDI:ADV_NAME:weaken enemies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:2] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:INCREASE_FORCE_ENEMY_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DOOM_WEAKEN] - [CDI:ADV_NAME:weaken enemies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:4] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:INCREASE_FORCE_ENEMY_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DOOM_WEAKEN] - [CDI:ADV_NAME:weaken enemies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:MAX_TARGET_NUMBER:A:8] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:INCREASE_FORCE_ENEMY_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:INTERACTION:DOOM_WEAKEN] - [CDI:ADV_NAME:weaken enemies] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:TARGET_RANGE:A:15] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:5000] - [SYNDROME] - [SYN_NAME:EUSTRESS_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others eustress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:1000] - [CDI:TARGET_VERB:eustress:eustress] - [SYNDROME] - [SYN_NAME:EUSTRESS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others eustress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:333] - [CDI:TARGET_VERB:eustress:eustress] - [SYNDROME] - [SYN_NAME:EUSTRESS_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others eustress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:100] - [CDI:TARGET_VERB:eustress:eustress] - [SYNDROME] - [SYN_NAME:DISTRESS_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others distress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [CDI:TARGET_VERB:distress:distress] - [SYNDROME] - [SYN_NAME:DISTRESS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others distress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [CDI:TARGET_VERB:distress:distress] - [SYNDROME] - [SYN_NAME:DISTRESS_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others distress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:50] - [CDI:TARGET_VERB:distress:distress] - [SYNDROME] - [SYN_NAME:DISTRESS_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others distress] - [CDI:INTERACTION:DONOTHING_INTERACTION_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [CDI:TARGET_VERB:distress_2:distress_2] - [SYNDROME] - [SYN_NAME:BLISS_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others bliss] - [CDI:INTERACTION:BLISS_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:16800] - [SYNDROME] - [SYN_NAME:BLISS_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others bliss] - [CDI:INTERACTION:BLISS_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:8400] - [SYNDROME] - [SYN_NAME:BLISS_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Give others bliss] - [CDI:INTERACTION:BLISS_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:GREETING] - [CDI:WAIT_PERIOD:4200] - [SYNDROME] - [SYN_NAME:ENRAGE_I] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage I] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:ENRAGE_II] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage II] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:ENRAGE_III] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage III] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:1000] - [SYNDROME] - [SYN_NAME:ENRAGE_IV] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage IV] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:ENRAGE_V] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage V] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:500] - [SYNDROME] - [SYN_NAME:ENRAGE_VI] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage VI] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:100] - [SYNDROME] - [SYN_NAME:ENRAGE_VII] - [CE_CAN_DO_INTERACTION:START:0] - [CDI:ADV_NAME:Rage VII] - [CDI:INTERACTION:ENRAGE_TROLL] - [CDI:TARGET:A:LINE_OF_SIGHT] - [CDI:USAGE_HINT:ATTACK] - [CDI:WAIT_PERIOD:50] - -############################################################## - -[INORGANIC:DFHACK_CLASS_NAMES] - [USE_MATERIAL_TEMPLATE:STONE_TEMPLATE] - [SYNDROME] - [SYN_NAME:HEIR_OF_BREATH] - [CE_DISPLAY_NAME:NAME:heir of breath:heirs of breath:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_BREATH] - [CE_DISPLAY_NAME:NAME:seer of breath:seers of breath:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_BREATH] - [CE_DISPLAY_NAME:NAME:knight of breath:knights of breath:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_BREATH] - [CE_DISPLAY_NAME:NAME:witch of breath:witches of breath:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_BREATH] - [CE_DISPLAY_NAME:NAME:maid of breath:maids of breath:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_BREATH] - [CE_DISPLAY_NAME:NAME:page of breath:pages of breath:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_BREATH] - [CE_DISPLAY_NAME:NAME:prince of breath:princes of breath:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_BREATH] - [CE_DISPLAY_NAME:NAME:rogue of breath:rogues of breath:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_BREATH] - [CE_DISPLAY_NAME:NAME:thief of breath:thieves of breath:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_BREATH] - [CE_DISPLAY_NAME:NAME:sylph of breath:sylphs of breath:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_BREATH] - [CE_DISPLAY_NAME:NAME:bard of breath:bards of breath:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_BREATH] - [CE_DISPLAY_NAME:NAME:mage of breath:mages of breath:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:heir of light:heirs of light:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:seer of light:seers of light:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:knight of light:knights of light:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:witch of light:witches of light:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:maid of light:maids of light:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:page of light:pages of light:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:prince of light:princes of light:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:rogue of light:rogues of light:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:thief of light:thieves of light:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:sylph of light:sylphs of light:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:bard of light:bards of light:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_LIGHT] - [CE_DISPLAY_NAME:NAME:mage of light:mages of light:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_TIME] - [CE_DISPLAY_NAME:NAME:heir of time:heirs of time:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_TIME] - [CE_DISPLAY_NAME:NAME:seer of time:seers of time:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_TIME] - [CE_DISPLAY_NAME:NAME:knight of time:knights of time:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_TIME] - [CE_DISPLAY_NAME:NAME:witch of time:witches of time:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_TIME] - [CE_DISPLAY_NAME:NAME:maid of time:maids of time:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_TIME] - [CE_DISPLAY_NAME:NAME:page of time:pages of time:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_TIME] - [CE_DISPLAY_NAME:NAME:prince of time:princes of time:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_TIME] - [CE_DISPLAY_NAME:NAME:rogue of time:rogues of time:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_TIME] - [CE_DISPLAY_NAME:NAME:thief of time:thieves of time:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_TIME] - [CE_DISPLAY_NAME:NAME:sylph of time:sylphs of time:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_TIME] - [CE_DISPLAY_NAME:NAME:bard of time:bards of time:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_TIME] - [CE_DISPLAY_NAME:NAME:mage of time:mages of time:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_SPACE] - [CE_DISPLAY_NAME:NAME:heir of space:heirs of space:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_SPACE] - [CE_DISPLAY_NAME:NAME:seer of space:seers of space:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_SPACE] - [CE_DISPLAY_NAME:NAME:knight of space:knights of space:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_SPACE] - [CE_DISPLAY_NAME:NAME:witch of space:witches of space:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_SPACE] - [CE_DISPLAY_NAME:NAME:maid of space:maids of space:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_SPACE] - [CE_DISPLAY_NAME:NAME:page of space:pages of space:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_SPACE] - [CE_DISPLAY_NAME:NAME:prince of space:princes of space:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_SPACE] - [CE_DISPLAY_NAME:NAME:rogues of space:rogues of space:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_SPACE] - [CE_DISPLAY_NAME:NAME:thief of space:thieves of space:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_SPACE] - [CE_DISPLAY_NAME:NAME:sylph of space:sylphs of space:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_SPACE] - [CE_DISPLAY_NAME:NAME:bard of space:bards of space:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_SPACE] - [CE_DISPLAY_NAME:NAME:mage of space:mages of space:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_LIFE] - [CE_DISPLAY_NAME:NAME:heir of life:heirs of life:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_LIFE] - [CE_DISPLAY_NAME:NAME:seer of life:seers of life:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_LIFE] - [CE_DISPLAY_NAME:NAME:knight of life:knights of life:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_LIFE] - [CE_DISPLAY_NAME:NAME:witch of life:witches of life:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_LIFE] - [CE_DISPLAY_NAME:NAME:maid of life:maids of life:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_LIFE] - [CE_DISPLAY_NAME:NAME:page of life:pages of life:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_LIFE] - [CE_DISPLAY_NAME:NAME:prince of life:princes of life:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_LIFE] - [CE_DISPLAY_NAME:NAME:rogue of life:rogues of life:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_LIFE] - [CE_DISPLAY_NAME:NAME:thief of life:thieves of life:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_LIFE] - [CE_DISPLAY_NAME:NAME:sylph of life:sylphs of life:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_LIFE] - [CE_DISPLAY_NAME:NAME:bard of life:bards of life:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_LIFE] - [CE_DISPLAY_NAME:NAME:mage of life:mages of life:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_HOPE] - [CE_DISPLAY_NAME:NAME:heir of hope:heirs of hope:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_HOPE] - [CE_DISPLAY_NAME:NAME:seer of hope:seers of hope:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_HOPE] - [CE_DISPLAY_NAME:NAME:knight of hope:knights of hope:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_HOPE] - [CE_DISPLAY_NAME:NAME:witch of hope:witches of hope:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_HOPE] - [CE_DISPLAY_NAME:NAME:maid of hope:maids of hope:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_HOPE] - [CE_DISPLAY_NAME:NAME:page of hope:pages of hope:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_HOPE] - [CE_DISPLAY_NAME:NAME:prince of hope:princes of hope:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_HOPE] - [CE_DISPLAY_NAME:NAME:rogue of hope:rogues of hope:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_HOPE] - [CE_DISPLAY_NAME:NAME:thief of hope:thieves of hope:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_HOPE] - [CE_DISPLAY_NAME:NAME:sylph of hope:sylphs of hope:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_HOPE] - [CE_DISPLAY_NAME:NAME:bard of hope:bards of hope:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_HOPE] - [CE_DISPLAY_NAME:NAME:mage of hope:mages of hope:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_VOID] - [CE_DISPLAY_NAME:NAME:heir of void:heirs of void:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_VOID] - [CE_DISPLAY_NAME:NAME:seer of void:seers of void:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_VOID] - [CE_DISPLAY_NAME:NAME:knight of void:knights of void:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_VOID] - [CE_DISPLAY_NAME:NAME:witch of void:witches of void:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_VOID] - [CE_DISPLAY_NAME:NAME:maid of void:maids of void:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_VOID] - [CE_DISPLAY_NAME:NAME:page of void:pages of void:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_VOID] - [CE_DISPLAY_NAME:NAME:prince of void:princes of void:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_VOID] - [CE_DISPLAY_NAME:NAME:rogue of void:rogues of void:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_VOID] - [CE_DISPLAY_NAME:NAME:thief of void:thieves of void:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_VOID] - [CE_DISPLAY_NAME:NAME:sylph of void:sylphs of void:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_VOID] - [CE_DISPLAY_NAME:NAME:bard of void:bards of void:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_VOID] - [CE_DISPLAY_NAME:NAME:mage of void:mages of void:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_HEART] - [CE_DISPLAY_NAME:NAME:heir of heart:heirs of heart:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_HEART] - [CE_DISPLAY_NAME:NAME:seer of heart:seers of heart:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_HEART] - [CE_DISPLAY_NAME:NAME:knight of heart:knights of heart:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_HEART] - [CE_DISPLAY_NAME:NAME:witch of heart:witches of heart:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_HEART] - [CE_DISPLAY_NAME:NAME:maid of heart:maids of heart:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_HEART] - [CE_DISPLAY_NAME:NAME:page of heart:pages of heart:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_HEART] - [CE_DISPLAY_NAME:NAME:prince of heart:princes of heart:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_HEART] - [CE_DISPLAY_NAME:NAME:rogue of heart:rogues of heart:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_HEART] - [CE_DISPLAY_NAME:NAME:thief of heart:thieves of heart:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_HEART] - [CE_DISPLAY_NAME:NAME:sylph of heart:sylphs of heart:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_HEART] - [CE_DISPLAY_NAME:NAME:bard of heart:bards of heart:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_HEART] - [CE_DISPLAY_NAME:NAME:mage of heart:mages of heart:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:heir of blood:heirs of blood:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:seer of blood:seers of blood:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:knight of blood:knights of blood:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:witch of blood:witches of blood:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:maid of blood:maids of blood:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:page of blood:pages of blood:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:prince of blood:princes of blood:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:rogue of blood:rogues of blood:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:thief of blood:thieves of blood:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:sylph of blood:sylphs of blood:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:bard of blood:bards of blood:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_BLOOD] - [CE_DISPLAY_NAME:NAME:mage of blood:mages of blood:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_DOOM] - [CE_DISPLAY_NAME:NAME:heir of doom:heirs of doom:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_DOOM] - [CE_DISPLAY_NAME:NAME:seer of doom:seers of doom:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_DOOM] - [CE_DISPLAY_NAME:NAME:knight of doom:knights of doom:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_DOOM] - [CE_DISPLAY_NAME:NAME:witch of doom:witches of doom:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_DOOM] - [CE_DISPLAY_NAME:NAME:maid of doom:maids of doom:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_DOOM] - [CE_DISPLAY_NAME:NAME:page of doom:pages of doom:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_DOOM] - [CE_DISPLAY_NAME:NAME:prince of doom:princes of doom:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_DOOM] - [CE_DISPLAY_NAME:NAME:rogue of doom:rogues of doom:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_DOOM] - [CE_DISPLAY_NAME:NAME:thief of doom:thieves of doom:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_DOOM] - [CE_DISPLAY_NAME:NAME:sylph of doom:sylphs of doom:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_DOOM] - [CE_DISPLAY_NAME:NAME:bard of doom:bards of doom:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_DOOM] - [CE_DISPLAY_NAME:NAME:mage of doom:mages of doom:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_MIND] - [CE_DISPLAY_NAME:NAME:heir of mind:heirs of mind:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_MIND] - [CE_DISPLAY_NAME:NAME:seer of mind:seers of mind:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_MIND] - [CE_DISPLAY_NAME:NAME:knight of mind:knights of mind:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_MIND] - [CE_DISPLAY_NAME:NAME:witch of mind:witches of mind:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_MIND] - [CE_DISPLAY_NAME:NAME:maid of mind:maids of mind:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_MIND] - [CE_DISPLAY_NAME:NAME:page of mind:pages of mind:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_MIND] - [CE_DISPLAY_NAME:NAME:prince of mind:princes of mind:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_MIND] - [CE_DISPLAY_NAME:NAME:rogue of mind:rogues of mind:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_MIND] - [CE_DISPLAY_NAME:NAME:thief of mind:thieves of mind:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_MIND] - [CE_DISPLAY_NAME:NAME:sylph of mind:sylphs of mind:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_MIND] - [CE_DISPLAY_NAME:NAME:bard of mind:bards of mind:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_MIND] - [CE_DISPLAY_NAME:NAME:mage of mind:mages of mind:mage:START:0] - [SYNDROME] - [SYN_NAME:HEIR_OF_RAGE] - [CE_DISPLAY_NAME:NAME:heir of rage:heirs of rage:heir:START:0] - [SYNDROME] - [SYN_NAME:SEER_OF_RAGE] - [CE_DISPLAY_NAME:NAME:seer of rage:seers of rage:seer:START:0] - [SYNDROME] - [SYN_NAME:KNIGHT_OF_RAGE] - [CE_DISPLAY_NAME:NAME:knight of rage:knights of rage:knight:START:0] - [SYNDROME] - [SYN_NAME:WITCH_OF_RAGE] - [CE_DISPLAY_NAME:NAME:witch of rage:witches of rage:witch:START:0] - [SYNDROME] - [SYN_NAME:MAID_OF_RAGE] - [CE_DISPLAY_NAME:NAME:maid of rage:maids of rage:maid:START:0] - [SYNDROME] - [SYN_NAME:PAGE_OF_RAGE] - [CE_DISPLAY_NAME:NAME:page of rage:pages of rage:page:START:0] - [SYNDROME] - [SYN_NAME:PRINCE_OF_RAGE] - [CE_DISPLAY_NAME:NAME:prince of rage:princes of rage:prince:START:0] - [SYNDROME] - [SYN_NAME:ROGUE_OF_RAGE] - [CE_DISPLAY_NAME:NAME:rogue of rage:rogues of rage:rogue:START:0] - [SYNDROME] - [SYN_NAME:THIEF_OF_RAGE] - [CE_DISPLAY_NAME:NAME:thief of rage:thieves of rage:thief:START:0] - [SYNDROME] - [SYN_NAME:SYLPH_OF_RAGE] - [CE_DISPLAY_NAME:NAME:sylph of rage:sylphs of rage:sylph:START:0] - [SYNDROME] - [SYN_NAME:BARD_OF_RAGE] - [CE_DISPLAY_NAME:NAME:bard of rage:bards of rage:bard:START:0] - [SYNDROME] - [SYN_NAME:MAGE_OF_RAGE] - [CE_DISPLAY_NAME:NAME:mage of rage:mages of rage:mage:START:0] diff --git a/raw/objects/classes.txt b/raw/objects/classes.txt deleted file mode 100644 index b447011..0000000 --- a/raw/objects/classes.txt +++ /dev/null @@ -1,3692 +0,0 @@ - --breath -[CLASS:HEIR_OF_BREATH] - [NAME:heir of breath:heirs of breath:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_BULLET_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_II:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:9] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_BREATH] - [NAME:seer of breath:seers of breath:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:INTUITION:0:500:750:1000:1000:2000:2000:3000:3000:4000:10000] - [BONUS_MENT:FOCUS:0:500:750:1000:2000:2000:3000:3000:4000:4000:10000] - [SPELL:WINDY_BULLET_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_BREATH] - [NAME:knight of breath:knights of breath:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_BULLET_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:9] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_BREATH] - [NAME:witch of breath:witches of breath:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_BULLET_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_BREATH] - [NAME:maid of breath:maids of breath:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_DELAY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_I:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_I:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_BREATH] - [NAME:page of breath:pages of breath:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_DELAY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_I:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_I:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_I:10] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_BREATH] - [NAME:prince of breath:princes of breath:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_BULLET_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:4] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_I:8] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_II:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_BREATH] - [NAME:rogue of breath:rogues of breath:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_DELAY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_III:7] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:8] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_BREATH] - [NAME:thief of breath:thieves of breath:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_DELAY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_I:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_II:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:7] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_BREATH] - [NAME:sylph of breath:sylphs of breath:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:PREVENT_SUFFOCATION:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [BONUS_MENT:FOCUS:0:1000:2000:2000:2000:2000:2000:2000:5000:5000:10000] - -[CLASS:BARD_OF_BREATH] - [NAME:bard of breath:bards of breath:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:WINDY_DELAY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_DELAY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_III:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_HASTE_III:7] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_I:8] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_EXPLODE_A_BODY_I:9] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_BREATH] - [NAME:mage of breath:mages of breath:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:INTUITION:0:500:750:1000:1000:2000:2000:3000:3000:4000:5000] - [BONUS_MENT:FOCUS:0:500:750:1000:2000:2000:3000:3000:4000:4000:5000] - [SPELL:WINDY_BULLET_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:WINDY_BULLET_V:10] - [SPELL_AUTO_LEARN] - [SPELL:BREATH_RENDER_BREATHLESS_II:10] - [SPELL_AUTO_LEARN] - - --light - -[CLASS:HEIR_OF_LIGHT] - [NAME:heir of light:heirs of light:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:0:0:0:0:0:0:0:0:0:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:0:0:0:0:0:0:0:20:20] - [SPELL:INCREASE_LUCK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_LIGHT] - [NAME:seer of light:seers of light:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:500:750:1000:2000:2000:2000:4000:5000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:5:7:9:12:15:20:20:20] - [SPELL:TEMPORARY_BLIND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_LIGHT] - [NAME:knight of light:knights of light:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_LUCK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_LIGHT] - [NAME:witch of light:witches of light:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TEMPORARY_BLIND_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_III:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_LIGHT] - [NAME:maid of light:maids of light:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:0:0:0:0:0:0:0:0:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:0:0:0:0:0:0:20:20:20] - [SPELL:INCREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_III:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_III:9] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_LIGHT] - [NAME:page of light:pages of light:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_LUCK_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:7] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_III:10] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_LIGHT] - [NAME:prince of light:princes of light:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:LIGHT_SEE_CREATURES:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_I:6] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_II:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_III:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_III:9] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_LIGHT] - [NAME:rogue of light:rogues of light:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:0:0:0:0:0:0:0:10000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:0:0:0:0:0:0:15:15:15] - [SPELL:INCREASE_LUCK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_LIGHT] - [NAME:thief of light:thieves of light:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DECREASE_LUCK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_I:8] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_LIGHT] - [NAME:sylph of light:sylphs of light:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_VISION:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [BONUS_MENT:ANALYTICAL_ABILITY:0:1000:2000:2000:2000:2000:2000:2000:5000:5000:10000] - -[CLASS:BARD_OF_LIGHT] - [NAME:bard of light:bards of light:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:LIGHT_SEE_CREATURES:1] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_III:5] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_I:6] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_II:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_III:8] - [SPELL_AUTO_LEARN] - [SPELL:PERMANENT_BLIND_III:9] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_LIGHT] - [NAME:mage of light:mages of light:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:5:7:9:12:15:20:20:20] - [SPELL:DECREASE_LUCK_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DECREASE_LUCK_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TEMPORARY_BLIND_II:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_LUCK_IV:10] - [SPELL_AUTO_LEARN] - - --time - -[CLASS:HEIR_OF_TIME] - [NAME:heir of time:heirs of time:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:0:0:1:1:1:3:5:8:8:8:8] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:1:1:1:3:5:8:8:8:8] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:3] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_TIME] - [NAME:seer of time:seers of time:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:0:1:2:4:6:8:10:12:15:20:20:20] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:3:5:7:9:10:12:14:15:15:15] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_TIME] - [NAME:knight of time:knights of time:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_PHYS:AGILITY:0:1000:2000:4000:5000:10000:10000:20000:40000:100000:100000] - [BONUS_SKILL:MELEE_COMBAT:0:0:0:0:0:2:5:5:5:5:10] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:7] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_TIME] - [NAME:witch of time:witches of time:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_I:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:3] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_III:7] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_TIME] - [NAME:maid of time:maids of time:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_PHYS:AGILITY:0:1000:2000:4000:5000:10000:10000:20000:40000:100000:100000] - [BONUS_SKILL:DODGING:0:0:0:0:0:2:5:5:5:5:10] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_TIME] - [NAME:page of time:pages of time:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_II:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:8] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_III:8] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:10] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_PAGE:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_TIME] - [NAME:prince of time:princes of time:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:3] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:7] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_III:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_SELF:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_TIME] - [NAME:rogue of time:rogues of time:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:0:0:1:1:1:3:5:8:8:8:8] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:1:1:1:3:5:8:8:8:8] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_INCREASE_LUCK_SELF:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_TIME] - [NAME:thief of time:thieves of time:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:0:0:1:1:1:3:5:8:8:8:8] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:1:1:1:3:5:8:8:8:8] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_INCREASE_LUCK_SELF:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_FRIEND_II:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_SELF:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_TIME] - [NAME:sylph of time:sylphs of time:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_DOWN:8] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:AGILITY:0:1000:2000:2000:2000:2000:2000:2000:5000:5000:10000] - -[CLASS:BARD_OF_TIME] - [NAME:bard of time:bards of time:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:2] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_III:3] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_I:4] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_SELF:7] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_V:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_III:9] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_TIME] - [NAME:mage of time:mages of time:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:0:1:2:4:6:8:8:8:9:10:15] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:3:5:7:9:9:10:12:12:12] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SPEED_UP_SELF:8] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_II:9] - [SPELL_AUTO_LEARN] - [SPELL:TIME_SLOW_DOWN_ENEMY_IV:10] - [SPELL_AUTO_LEARN] - - --space - -[CLASS:HEIR_OF_SPACE] - [NAME:heir of space:heirs of space:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:GROW_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:3] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:4] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:8] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_SPACE] - [NAME:seer of space:seers of space:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:SPATIAL_SENSE:0:1000:3000:3000:3000:10000:10000:10000:10000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:2:3:4:8:10:12:14:16:18] - [BONUS_SKILL:DODGING:0:1:2:3:4:5:5:10:15:20:20] - [SPELL:SHRINK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:8] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_SPACE] - [NAME:knight of space:knights of space:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GROW_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:3] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:5] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:SHRINK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_LEGS_WITH_SPACE:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_SPACE] - [NAME:witch of space:witches of space:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GROW_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:3] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:SHRINK_II:4] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:SHRINK_III:7] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_LEGS_WITH_SPACE:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_SPACE] - [NAME:maid of space:maids of space:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GROW_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:3] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:4] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:7] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_SPACE] - [NAME:page of space:pages of space:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GROW_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:4] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:6] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:8] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:8] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_SPACE] - [NAME:prince of space:princes of space:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GROW_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:3] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:4] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:7] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_SPACE] - [NAME:rogues of space:rogues of space:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:SHRINK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:GROW_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:4] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:7] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_SPACE] - [NAME:thief of space:thieves of space:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:SHRINK_I:1] - [SPELL_AUTO_LEARN] - [SPELL:GROW_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:3] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:4] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_I] - [SPELL:TELEPORT:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:GROW_II] - [SPELL:REPLACE_LEGS_WITH_SPACE:7] - [SPELL_AUTO_LEARN] - [SPELL:GROW_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_SPACE] - [NAME:sylph of space:sylphs of space:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:SURGERY:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:SUTURE:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:DIAGNOSE:5:5:5:5:5:5:5:5:5:5:5] - [BONUS_SKILL:DRESS_WOUNDS:0:1:3:5:7:9:11:13:15:17:20] - [BONUS_SKILL:SET_BONE:0:1:3:5:7:9:11:13:15:17:20] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_SPACE] - [NAME:bard of space:bards of space:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:SPATIAL_SENSE:0:1000:2000:3000:4000:5000:6000:6000:6000:6000:6000] - [BONUS_MENT:KINESTHETIC_SENSE:0:1000:2000:3000:4000:5000:6000:6000:6000:6000:6000] - [BONUS_SKILL:MELEE_COMBAT:0:1:2:3:4:5:6:7:8:9:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_LEGS_WITH_SPACE:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_SPACE] - [NAME:mage of space:mages of space:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:SPATIAL_SENSE:0:1000:3000:3000:3000:10000:10000:10000:10000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:2:3:4:8:10:12:14:16:18] - [SPELL:TELEPORT:2] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GROW_II:8] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_LEGS_WITH_SPACE:9] - [SPELL_AUTO_LEARN] - [SPELL:SHRINK_III:10] - [SPELL_AUTO_LEARN] - - --life - -[CLASS:HEIR_OF_LIFE] - [NAME:heir of life:heirs of life:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:TOUGHNESS:0:1000:1000:2000:3000:3000:5000:7000:8000:9000:10000] - -[CLASS:SEER_OF_LIFE] - [NAME:seer of life:seers of life:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:PLANT:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:HERBALISM:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:MILK:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:ANIMALTRAIN:0:1:3:5:7:9:11:13:15:17:20] - [BONUS_SKILL:BUTCHER:0:1:3:5:7:9:11:13:15:17:20] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - - -[CLASS:KNIGHT_OF_LIFE] - [NAME:knight of life:knights of life:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:STRENGTH:0:1000:1000:2000:3000:3000:5000:7000:8000:9000:10000] - -[CLASS:WITCH_OF_LIFE] - [NAME:witch of life:witches of life:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:1] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:2] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:4] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:7] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_III:8] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_LIFE] - [NAME:maid of life:maids of life:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:2] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:STRENGTH:0:1000:1000:2000:3000:3000:5000:7000:8000:9000:10000] - -[CLASS:PAGE_OF_LIFE] - [NAME:page of life:pages of life:page] - [EXP:10:15:20:25:30:100:150:200:250:350] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:2] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:8] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:8] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_III:9] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:10] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_V:10] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:AUTOREVIVE_OTHERS_ONCE:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_LIFE] - [NAME:prince of life:princes of life:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_IV:10] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:STRENGTH:0:0:0:0:0:0:0:2000:2000:2000:2000] - -[CLASS:ROGUE_OF_LIFE] - [NAME:rogue of life:rogues of life:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:1] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:5] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [PSELL:REMOVE_BLOOD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:8] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_II:9] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_LIFE] - [NAME:thief of life:thieves of life:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:1] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:5] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [PSELL:REMOVE_BLOOD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:8] - [SPELL_AUTO_LEARN] - [SPELL:DESTROY_LIFE_II:9] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_LIFE] - [NAME:sylph of life:sylphs of life:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [SPELL:AUTOREVIVE_OTHERS_ONCE:10] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:RECUPERATION:0:1000:2000:2000:2000:2000:2000:5000:10000:10000:10000] - -[CLASS:BARD_OF_LIFE] - [NAME:bard of life:bards of life:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AUTOREVIVE_SELF_ONCE:0] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_PHYS:STRENGTH:1:500:1000:1500:2500:4000:6000:9000:12500:16500:24000] - [BONUS_PHYS:ENDURANCE:1:500:1000:1500:2500:4000:6000:9000:12500:16500:24000] - -[CLASS:MAGE_OF_LIFE] - [NAME:mage of life:mages of life:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:PLANT:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:HERBALISM:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:MILK:1:2:2:2:2:3:5:8:13:20:20] - [BONUS_SKILL:BUTCHER:0:1:3:5:7:9:11:13:15:17:20] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - - --hope -[CLASS:HEIR_OF_HOPE] - [NAME:heir of hope:heirs of hope:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:3000:3000:3000:3000:3000:3000:3000:3000:3000] - [SPELL:SHOOT_WITH_HOPE_I:3] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:5] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:9] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_HOPE] - [NAME:seer of hope:seers of hope:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:2000:3000:4000:5000:6000:7000:8000:9000:10000] - [BONUS_MENT:CREATIVITY:0:1000:2000:3000:4000:5000:6000:7000:8000:9000:10000] - [BONUS_PHYS:ENDURANCE:0:1000:1000:4000:4000:7000:7000:10000:10000:13000:13000] - [SPELL:GIVE_FRIENDS_HOPE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:8] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_HOPE] - [NAME:knight of hope:knights of hope:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:1000:4000:4000:7000:7000:10000:10000:13000:13000] - [BONUS_PHYS:ENDURANCE:0:1000:1000:4000:4000:7000:7000:10000:10000:13000:13000] - [SPELL:SHOOT_WITH_HOPE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:7] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_HOPE] - [NAME:witch of hope:witches of hope:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:SHOOT_WITH_HOPE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:7] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_HOPE] - [NAME:maid of hope:maids of hope:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:3000:3000:3000:3000:3000:3000:3000:3000:3000] - [SPELL:SHOOT_WITH_HOPE_I:3] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:5] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:9] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_HOPE] - [NAME:page of hope:pages of hope:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GIVE_FRIENDS_HOPE_I:0] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_I:3] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:9] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_IV:10] - [SPELL_AUTO_LEARN] - [BONUS_MENT:WILLPOWER:1:3:9:27:81:243:729:2187:6561:19683:59049] - -[CLASS:PRINCE_OF_HOPE] - [NAME:prince of hope:princes of hope:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:1000:1000:1000:1000:1000:1000:1000:1000:1000] - [SPELL:SHOOT_WITH_HOPE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:7] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_HOPE] - [NAME:rogue of hope:rogues of hope:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_I:1] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:3] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_HOPE] - [NAME:thief of hope:thieves of hope:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:3] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:6] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:9] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_HOPE] - [NAME:sylph of hope:sylphs of hope:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:GIVE_FRIENDS_HOPE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:8] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_HOPE] - [NAME:bard of hope:bards of hope:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_MENT:WILLPOWER:1:500:1000:1500:2500:4000:6000:9000:12500:16500:24000] - [BONUS_PHYS:ENDURANCE:1:500:1000:1500:2500:4000:6000:9000:12500:16500:24000] - [BONUS_SKILL:PERSUASION:1:3:4:5:6:7:8:9:10:12:15] - -[CLASS:MAGE_OF_HOPE] - [NAME:mage of hope:mages of hope:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:WILLPOWER:0:1000:2000:3000:4000:5000:6000:7000:8000:9000:10000] - [BONUS_MENT:CREATIVITY:0:1000:2000:3000:4000:5000:6000:7000:8000:9000:10000] - [SPELL:GIVE_ENEMIES_HOPELESSNESS_II:4] - [SPELL_AUTO_LEARN] - [SPELL:GIVE_FRIENDS_HOPE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_III:8] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_WITH_HOPE_IV:10] - [SPELL_AUTO_LEARN] - - --void - -[CLASS:HEIR_OF_VOID] - [NAME:heir of void:heirs of void:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:MELEE_COMBAT:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_PHYS:STRENGTH:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - -[CLASS:SEER_OF_VOID] - [NAME:seer of void:seers of void:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:LIGHT_SEE_CREATURES:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:4:5:7:9:11:13:15] - -[CLASS:KNIGHT_OF_VOID] - [NAME:knight of void:knights of void:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:MELEE_COMBAT:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_PHYS:STRENGTH:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - -[CLASS:WITCH_OF_VOID] - [NAME:witch of void:witches of void:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:2] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:3] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:MAKE_ENEMIES_DISAPPEAR_I:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:MAKE_ENEMIES_DISAPPEAR_II:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:9] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [BONUS_SKILL:MAGIC_NATURE:0:0:0:0:0:0:0:0:0:0:15] - - -[CLASS:MAID_OF_VOID] - [NAME:maid of void:maids of void:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:3] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:MELEE_COMBAT:0:0:2:2:5:8:8:8:10:10:13] - [BONUS_PHYS:STRENGTH:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - -[CLASS:PAGE_OF_VOID] - [NAME:page of void:pages of void:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:0] - [SPELL_AUTO_LEARN] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:2] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:MAKE_ENEMIES_DISAPPEAR_I:7] - [SPELL_AUTO_LEARN] - [SPELL:MAKE_ENEMIES_DISAPPEAR_II:8] - [SPELL_AUTO_LEARN] - [SPELL:MAKE_ENEMIES_DISAPPEAR_III:9] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_HEAD_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_ARMS_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - [SPELL:REPLACE_LEGS_WITH_SPACE:10] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_ENEMIES_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_VOID] - [NAME:prince of void:princes of void:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:MELEE_COMBAT:0:3:5:6:7:8:10:12:14:16:18] - [BONUS_PHYS:STRENGTH:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_PHYS:TOUGHNESS:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_PHYS:ENDURANCE:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_SKILL:MAGIC_NATURE:0:0:0:0:0:0:5:5:15:15:15] - -[CLASS:ROGUE_OF_VOID] - [NAME:rogue of void:rogues of void:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:MAGIC_NATURE:0:0:0:0:0:0:5:5:15:15:15] - -[CLASS:THIEF_OF_VOID] - [NAME:thief of void:thieves of void:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:TELEPORT:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:MAGIC_NATURE:0:0:0:0:0:0:5:5:15:15:15] - -[CLASS:SYLPH_OF_VOID] - [NAME:sylph of void:sylphs of void:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DIAGNOSE:5:6:7:8:9:10:11:12:13:15:15] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:MAGIC_NATURE:0:0:0:0:0:0:5:5:15:15:15] - -[CLASS:BARD_OF_VOID] - [NAME:bard of void:bards of void:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:MELEE_COMBAT:0:3:5:6:7:8:10:12:14:16:18] - [BONUS_PHYS:STRENGTH:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_PHYS:TOUGHNESS:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_PHYS:ENDURANCE:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_PHYS:AGILITY:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - -[CLASS:MAGE_OF_VOID] - [NAME:mage of void:mages of void:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HIDE:1] - [SPELL_AUTO_LEARN] - [SPELL:LIGHT_SEE_CREATURES:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:6:9:12:12:12:12:12:15] - [BONUS_SKILL:SNEAK:0:0:3:3:6:9:9:9:12:12:15] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:4:5:7:9:11:13:15] - - --heart - -[CLASS:HEIR_OF_HEART] - [NAME:heir of heart:heirs of heart:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DISCIPLINE:3:3:3:5:7:7:7:9:11:13:15] - -[CLASS:SEER_OF_HEART] - [NAME:seer of heart:seers of heart:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:9] - [SPELL_AUTO_LEARN] - [BONUS_MENT:SOCIAL_AWARENESS:0:500:500:800:1000:1000:1000:3000:5000:5000:5000] - [BONUS_MENT:EMPATHY:0:500:500:800:1000:1000:1000:3000:5000:5000:5000] - -[CLASS:KNIGHT_OF_HEART] - [NAME:knight of heart:knights of heart:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:7] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:8] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DISCIPLINE:1:3:3:3:3:3:3:3:3:8:8] - -[CLASS:WITCH_OF_HEART] - [NAME:witch of heart:witches of heart:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:7] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:8] - [SPELL_AUTO_LEARN] - [SPELL:TEAR_OUT_SOUL:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_HEART] - [NAME:maid of heart:maids of heart:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:8] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DISCIPLINE:3:3:3:5:7:7:7:9:11:13:15] - -[CLASS:PAGE_OF_HEART] - [NAME:page of heart:pages of heart:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:8] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:8] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:TEAR_OUT_SOUL:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_HEART] - [NAME:prince of heart:princes of heart:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AGONY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:2] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:TEAR_OUT_SOUL:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_HEART] - [NAME:rogue of heart:rogues of heart:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:4] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_HEART] - [NAME:thief of heart:thieves of heart:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_II:4] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:ENJOY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_HEART] - [NAME:sylph of heart:sylphs of heart:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:CONSOLE:0:1:2:3:4:5:7:9:11:13:15] - [BONUS_MENT:SOCIAL_AWARENESS:0:1000:2000:3000:4000:5000:7000:9000:11000:13000:15000] - [BONUS_MENT:EMPATHY:1000:2000:3000:4000:5000:6000:8000:10000:12000:14000:16000] - [BONUS_SKILL:PACIFY:0:1:2:3:4:5:7:9:11:13:15] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:UNINSANE:6] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_HEART] - [NAME:bard of heart:bards of heart:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:AGONY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:2] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:9] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_HEART] - [NAME:mage of heart:mages of heart:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENJOY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:9] - [SPELL_AUTO_LEARN] - [BONUS_MENT:SOCIAL_AWARENESS:0:500:500:800:1000:1000:1000:2500:4000:4000:4000] - [BONUS_MENT:EMPATHY:0:500:500:800:1000:1000:1000:2500:4000:4000:4000] - - --blood -[CLASS:HEIR_OF_BLOOD] - [NAME:heir of blood:heirs of blood:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:REDUCE_FORCE_SELF_I:1] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:3] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:8] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:SHOOT_BLOOD_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - -[CLASS:SEER_OF_BLOOD] - [NAME:seer of blood:seers of blood:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:EMPATHY:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_MENT:SOCIAL_AWARENESS:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_SKILL:LEADERSHIP:0:1:3:5:7:9:12:14:16:18:20] - [BONUS_SKILL:WRITING:0:1:3:5:7:9:12:14:16:18:20] - [BONUS_SKILL:PROSE:0:1:3:5:7:9:12:14:16:18:20] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_BLOOD] - [NAME:knight of blood:knights of blood:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:REDUCE_FORCE_SELF_I:1] - [SPELL_AUTO_LEARN] - [SPELL:CARING_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:3] - [SPELL_AUTO_LEARN] - [SPELL:CARING_II:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_III:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:CARING_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:9] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [SPELL:CARING_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_BLOOD] - [NAME:witch of blood:witches of blood:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:SHOOT_BLOOD_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:SHOOT_BLOOD_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_V:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - -[CLASS:MAID_OF_BLOOD] - [NAME:maid of blood:maids of blood:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:REDUCE_FORCE_SELF_I:1] - [SPELL_AUTO_LEARN] - [SPELL:CARING_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:3] - [SPELL_AUTO_LEARN] - [SPELL:CARING_II:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:8] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:CARING_V:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - -[CLASS:PAGE_OF_BLOOD] - [NAME:page of blood:pages of blood:page] - [EXP:10:15:20:25:30:100:150:200:250:325] - [LEVELS:10] - [SPELL:REDUCE_FORCE_SELF_I:1] - [SPELL_AUTO_LEARN] - [SPELL:CARING_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:CARING_II:5] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_III:6] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_II:7] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:7] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_III:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:8] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:REMOVE_BLOOD_II:8] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:CARING_V:9] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_III:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [SPELL:HATRED_V:10] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:TEAR_OUT_SOUL:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_BLOOD] - [NAME:prince of blood:princes of blood:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:SHOOT_BLOOD_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:SHOOT_BLOOD_V:9] - [SPELL_AUTO_LEARN] - [SPELL:REMOVE_BLOOD_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_BLOOD] - [NAME:rogue of blood:rogues of blood:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HATRED_I:1] - [SPELL_AUTO_LEARN] - [SPELL:CARING_I:2] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_II:3] - [SPELL_AUTO_LEARN] - [SPELL:CARING_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CARING_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:CARING_V:9] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_BLOOD] - [NAME:thief of blood:thieves of blood:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HATRED_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:2] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:HATRED_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:9] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [SPELL:HATRED_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_BLOOD] - [NAME:sylph of blood:sylphs of blood:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HEAL_MILD_I:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - [BONUS_MENT:EMPATHY:0:1000:2000:2000:2000:2000:2000:5000:10000:10000:10000] - [BONUS_SKILL:PACIFY:0:1000:2000:2000:2000:2000:2000:5000:10000:10000:10000] - -[CLASS:BARD_OF_BLOOD] - [NAME:bard of blood:bards of blood:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:HATRED_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:2] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HATRED_III:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:HATRED_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:9] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL:HATRED_V:10] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_BLOOD] - [NAME:mage of blood:mages of blood:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:EMPATHY:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_MENT:SOCIAL_AWARENESS:0:1000:3000:5000:7000:9000:12000:14000:16000:18000:20000] - [BONUS_SKILL:LEADERSHIP:0:1:3:5:7:9:12:14:16:18:20] - [SPELL:CARING_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - - --doom -[CLASS:HEIR_OF_DOOM] - [NAME:heir of doom:heirs of doom:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:STAVE_DOOM_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:8] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_DOOM] - [NAME:seer of doom:seers of doom:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DETECT_LORD_ENGLISH:1] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:5:7:9:12:14:16:18:20] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:3:5:7:9:12:14:16:18:20] - [BONUS_MENT:KINESTHETIC_SENSE:0:0:1500:2500:3500:4500:6000:7000:8000:9000:10000] - -[CLASS:KNIGHT_OF_DOOM] - [NAME:knight of doom:knights of doom:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_DOOM] - [NAME:witch of doom:witches of doom:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_I:1] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_DOOM] - [NAME:maid of doom:maids of doom:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_V:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_DOOM] - [NAME:page of doom:pages of doom:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:4] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:5] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:6] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_I:7] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:8] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:8] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:8] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:9] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_V:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_IV:10] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_V:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_DOOM] - [NAME:prince of doom:princes of doom:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:4] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_V:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_DOOM] - [NAME:rogue of doom:rogues of doom:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:STAVE_DOOM_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:8] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_DOOM] - [NAME:thief of doom:thieves of doom:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:REDUCE_FORCE_SELF_I:1] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_II:7] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_III:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_V:9] - [SPELL_AUTO_LEARN] - [SPELL:DOOM_ENEMIES_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_DOOM] - [NAME:sylph of doom:sylphs of doom:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:STAVE_DOOM_I:1] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:2] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:3] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_II:4] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_III:5] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:TIME_AGE_DOWN:7] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_FULL_II:9] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_DOOM] - [NAME:bard of doom:bards of doom:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:INCREASE_FORCE_ENEMY_I:1] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_FRIENDS:2] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_II:3] - [SPELL_AUTO_LEARN] - [SPELL:DEUNDEAD_ENEMIES:4] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_III:5] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_IV:7] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:INCREASE_FORCE_ENEMY_V:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - -[CLASS:MAGE_OF_DOOM] - [NAME:mage of doom:mages of doom:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DETECT_LORD_ENGLISH:1] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_I:3] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:STAVE_DOOM_II:5] - [SPELL_AUTO_LEARN] - [BONUS_SKILL:DODGING:0:0:3:5:6:8:11:13:15:17:19] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:0:3:5:6:8:11:13:15:17:19] - [BONUS_MENT:KINESTHETIC_SENSE:0:0:1500:2500:3000:4000:5500:6500:7500:8500:9500] - - --mind -[CLASS:HEIR_OF_MIND] - [NAME:heir of mind:heirs of mind:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:5] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_MIND] - [NAME:seer of mind:seers of mind:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:500:750:1000:2000:2000:2000:4000:5000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:5:7:9:12:15:20:20] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - -[CLASS:KNIGHT_OF_MIND] - [NAME:knight of mind:knights of mind:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:DODGING:1:1:3:5:5:7:7:7:7:7:7] - [BONUS_SKILL:SITUATIONAL_AWARENESS:1:1:3:5:5:7:7:7:7:7:7] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:8] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:9] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_MIND] - [NAME:witch of mind:witches of mind:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:4] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_II:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_MIND] - [NAME:maid of mind:maids of mind:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [BONUS_MENT:ANALYTICAL_ABILITY:0:0:1000:1000:1000:1000:1000:1000:5000:5000:5000] - [SPELL:EUSTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:5] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_MIND] - [NAME:page of mind:pages of mind:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:EUSTRESS_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:5] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:9] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_III:10] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - [SPELL:UNINSANE:10] - [SPELL_AUTO_LEARN] - [SPELL:AGONY_V:10] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:10] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_MIND] - [NAME:prince of mind:princes of mind:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:SITUATIONAL_AWARENESS:1:1:3:5:5:7:7:7:7:10:10] - [BONUS_SKILL:DODGING:1:1:3:5:5:7:7:7:7:10:10] - [BONUS_SKILL:MELEE_COMBAT:1:1:3:5:5:7:7:7:7:10:10] - [BONUS_MENT:WILLPOWER:0:1000:3000:5000:5000:7000:7000:7000:7000:10000:10000] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:4] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:8] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_MIND] - [NAME:rogue of mind:rogues of mind:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DEATTRIBUTE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_SELF:2] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_I:4] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:5] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_II:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:7] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:8] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_III:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_MIND] - [NAME:thief of mind:thieves of mind:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DEATTRIBUTE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:EUSTRESS_SELF:2] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:6] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:7] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:8] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:SYLPH_OF_MIND] - [NAME:sylph of mind:sylphs of mind:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:CONSOLE:0:1:2:3:4:5:7:9:11:13:15] - [BONUS_MENT:SOCIAL_AWARENESS:0:1000:2000:3000:4000:5000:7000:9000:11000:13000:15000] - [BONUS_MENT:ANALYTICAL_ABILITY:1000:2000:3000:4000:5000:6000:8000:10000:12000:14000:16000] - [BONUS_SKILL:PACIFY:0:1:2:3:4:5:7:9:11:13:15] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:UNINSANE:6] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_MIND] - [NAME:bard of mind:bards of mind:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:DEATTRIBUTE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:2] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_II:4] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_I:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_III:6] - [SPELL_AUTO_LEARN] - [SPELL:DESKILL_II:7] - [SPELL_AUTO_LEARN] - [SPELL:DEATTRIBUTE_II:8] - [SPELL_AUTO_LEARN] - [SPELL:DISTRESS_IV:9] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_MIND] - [NAME:mage of mind:mages of mind:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_MENT:ANALYTICAL_ABILITY:0:500:750:1000:2000:2000:2000:4000:5000:10000:10000] - [BONUS_SKILL:SITUATIONAL_AWARENESS:0:1:2:3:5:7:9:12:15:15:15] - [SPELL:TIME_INCREASE_LUCK_SELF:1] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_I:10] - [SPELL_AUTO_LEARN] - - --rage - -[CLASS:HEIR_OF_RAGE] - [NAME:heir of rage:heirs of rage:heir] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:SEER_OF_RAGE] - [NAME:seer of rage:seers of rage:seer] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:3] - [SPELL_AUTO_LEARN] - [BONUS_MENT:FOCUS:0:2000:3000:4000:5000:6000:8000:10000:12000:14000:16000] - [BONUS_MENT:WILLPOWER:0:2000:3000:4000:5000:6000:8000:10000:12000:14000:16000] - -[CLASS:KNIGHT_OF_RAGE] - [NAME:knight of rage:knights of rage:knight] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:9] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:WITCH_OF_RAGE] - [NAME:witch of rage:witches of rage:witch] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAID_OF_RAGE] - [NAME:maid of rage:maids of rage:maid] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:PAGE_OF_RAGE] - [NAME:page of rage:pages of rage:page] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:3] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:8] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:10] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - [SPELL:INSANITY_II:10] - [SPELL_AUTO_LEARN] - -[CLASS:PRINCE_OF_RAGE] - [NAME:prince of rage:princes of rage:prince] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:ROGUE_OF_RAGE] - [NAME:rogue of rage:rogues of rage:rogue] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:BLISS_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_I:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:5] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:THIEF_OF_RAGE] - [NAME:thief of rage:thieves of rage:thief] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:BLISS_I:1] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_I:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:3] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_II:4] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_III:5] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_I] - [SPELL:INCREASE_FORCE_ENEMY_I:6] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_IV:7] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_II] - [SPELL:INCREASE_FORCE_ENEMY_III:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:REDUCE_FORCE_SELF_V:10] - [SPELL_AUTO_LEARN] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_III] - [SPELL_UPGRADE:REDUCE_FORCE_SELF_IV] - -[CLASS:SYLPH_OF_RAGE] - [NAME:sylph of rage:sylphs of rage:sylph] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [BONUS_SKILL:CONSOLE:0:1:2:3:4:5:7:9:11:13:15] - [BONUS_MENT:WILLPOWER:0:1000:2000:3000:4000:5000:7000:9000:11000:13000:15000] - [BONUS_MENT:FOCUS:1000:2000:3000:4000:5000:6000:8000:10000:12000:14000:16000] - [BONUS_SKILL:PACIFY:0:1:2:3:4:5:7:9:11:13:15] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:HEAL_MILD_I:0] - [SPELL_AUTO_LEARN] - [SPELL:UNINSANE:6] - [SPELL_AUTO_LEARN] - -[CLASS:BARD_OF_RAGE] - [NAME:bard of rage:bards of rage:bard] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:ENRAGE_I:1] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_II:2] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_I:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_III:4] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_IV:5] - [SPELL_AUTO_LEARN] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:6] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_II:7] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VI:8] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:9] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_VII:10] - [SPELL_AUTO_LEARN] - -[CLASS:MAGE_OF_RAGE] - [NAME:mage of rage:mages of rage:mage] - [EXP:10:15:20:25:30:100:150:200:250:300] - [LEVELS:10] - [SPELL:CAN_GO_GOD_TIER:6] - [SPELL_AUTO_LEARN] - [SPELL:FRAYMOTIF:6] - [SPELL_AUTO_LEARN] - [SPELL:DETECT_LORD_ENGLISH:3] - [SPELL_AUTO_LEARN] - [SPELL:ENRAGE_V:9] - [SPELL_AUTO_LEARN] - [SPELL:BLISS_III:10] - [SPELL_AUTO_LEARN] - [BONUS_MENT:FOCUS:0:2000:3000:4000:5000:6000:8000:10000:10000:10000:10000] - [BONUS_MENT:WILLPOWER:0:2000:3000:4000:5000:6000:8000:10000:10000:10000:10000] \ No newline at end of file diff --git a/raw/permitted_reactions.txt b/raw/permitted_reactions.txt deleted file mode 100644 index 17973d6..0000000 --- a/raw/permitted_reactions.txt +++ /dev/null @@ -1,310 +0,0 @@ -[PERMITTED_REACTION:LEARN_FRAYMOTIF] -[PERMITTED_REACTION:LEARN_CAN_GO_GOD_TIER] -[PERMITTED_REACTION:LEARN_WINDY_BULLET_I] -[PERMITTED_REACTION:LEARN_WINDY_BULLET_II] -[PERMITTED_REACTION:LEARN_WINDY_BULLET_III] -[PERMITTED_REACTION:LEARN_WINDY_BULLET_IV] -[PERMITTED_REACTION:LEARN_WINDY_BULLET_V] -[PERMITTED_REACTION:LEARN_WINDY_DELAY_I] -[PERMITTED_REACTION:LEARN_WINDY_DELAY_II] -[PERMITTED_REACTION:LEARN_WINDY_DELAY_III] -[PERMITTED_REACTION:LEARN_WINDY_DELAY_IV] -[PERMITTED_REACTION:LEARN_WINDY_HASTE_I] -[PERMITTED_REACTION:LEARN_WINDY_HASTE_II] -[PERMITTED_REACTION:LEARN_WINDY_HASTE_III] -[PERMITTED_REACTION:LEARN_WINDY_HASTE_IV] -[PERMITTED_REACTION:LEARN_BREATH_EXPLODE_A_BODY_I] -[PERMITTED_REACTION:LEARN_BREATH_RENDER_BREATHLESS_I] -[PERMITTED_REACTION:LEARN_BREATH_EXPLODE_A_BODY_II] -[PERMITTED_REACTION:LEARN_BREATH_RENDER_BREATHLESS_II] -[PERMITTED_REACTION:LEARN_BREATH_RENDER_BREATHLESS_II] -[PERMITTED_REACTION:LEARN_PREVENT_SUFFOCATION] -[PERMITTED_REACTION:LEARN_DECREASE_LUCK_I] -[PERMITTED_REACTION:LEARN_DECREASE_LUCK_II] -[PERMITTED_REACTION:LEARN_DECREASE_LUCK_III] -[PERMITTED_REACTION:LEARN_DECREASE_LUCK_IV] -[PERMITTED_REACTION:LEARN_INCREASE_LUCK_I] -[PERMITTED_REACTION:LEARN_INCREASE_LUCK_II] -[PERMITTED_REACTION:LEARN_INCREASE_LUCK_III] -[PERMITTED_REACTION:LEARN_INCREASE_LUCK_IV] -[PERMITTED_REACTION:LEARN_TEMPORARY_BLIND_I] -[PERMITTED_REACTION:LEARN_TEMPORARY_BLIND_II] -[PERMITTED_REACTION:LEARN_TEMPORARY_BLIND_III] -[PERMITTED_REACTION:LEARN_PERMANENT_BLIND_I] -[PERMITTED_REACTION:LEARN_PERMANENT_BLIND_II] -[PERMITTED_REACTION:LEARN_PERMANENT_BLIND_III] -[PERMITTED_REACTION:LEARN_LIGHT_SEE_CREATURES] -[PERMITTED_REACTION:LEARN_GIVE_VISION] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_I] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_I] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_II] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_III] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_IV] -[PERMITTED_REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_V] -[PERMITTED_REACTION:LEARN_TIME_SPEED_UP_FRIEND_I] -[PERMITTED_REACTION:LEARN_TIME_SPEED_UP_FRIEND_II] -[PERMITTED_REACTION:LEARN_TIME_SPEED_UP_FRIEND_III] -[PERMITTED_REACTION:LEARN_TIME_SPEED_UP_SELF] -[PERMITTED_REACTION:LEARN_TIME_INCREASE_LUCK_SELF] -[PERMITTED_REACTION:LEARN_TIME_AGE_ENEMIES_I] -[PERMITTED_REACTION:LEARN_TIME_AGE_ENEMIES_II] -[PERMITTED_REACTION:LEARN_TIME_AGE_ENEMIES_III] -[PERMITTED_REACTION:LEARN_TIME_AGE_ENEMIES_PAGE] -[PERMITTED_REACTION:LEARN_TIME_AGE_DOWN] -[PERMITTED_REACTION:LEARN_SHRINK_I] -[PERMITTED_REACTION:LEARN_SHRINK_II] -[PERMITTED_REACTION:LEARN_SHRINK_III] -[PERMITTED_REACTION:LEARN_SHRINK_IV] -[PERMITTED_REACTION:LEARN_GROW_I] -[PERMITTED_REACTION:LEARN_GROW_II] -[PERMITTED_REACTION:LEARN_GROW_III] -[PERMITTED_REACTION:LEARN_REPLACE_ARMS_WITH_SPACE] -[PERMITTED_REACTION:LEARN_REPLACE_LEGS_WITH_SPACE] -[PERMITTED_REACTION:LEARN_TELEPORT] -[PERMITTED_REACTION:LEARN_REPLACE_HEAD_WITH_SPACE] -[PERMITTED_REACTION:LEARN_AUTOREVIVE_SELF_ONCE] -[PERMITTED_REACTION:LEARN_HEAL_MILD_I] -[PERMITTED_REACTION:LEARN_HEAL_MILD_II] -[PERMITTED_REACTION:LEARN_HEAL_MILD_III] -[PERMITTED_REACTION:LEARN_HEAL_FULL_I] -[PERMITTED_REACTION:LEARN_HEAL_FULL:II] -[PERMITTED_REACTION:LEARN_DEUNDEAD_FRIENDS] -[PERMITTED_REACTION:LEARN_DEUNDEAD_ENEMIES] -[PERMITTED_REACTION:LEARN_DESTROY_LIFE_I] -[PERMITTED_REACTION:LEARN_DESTROY_LIFE_II] -[PERMITTED_REACTION:LEARN_DESTROY_LIFE_III] -[PERMITTED_REACTION:LEARN_DESTROY_LIFE_IV] -[PERMITTED_REACTION:LEARN_DESTROY_LIFE_V] -[PERMITTED_REACTION:LEARN_AUTOREVIVE_OTHERS_ONCE] -[PERMITTED_REACTION:LEARN_GIVE_FRIENDS_HOPE_I] -[PERMITTED_REACTION:LEARN_GIVE_FRIENDS_HOPE_II] -[PERMITTED_REACTION:LEARN_GIVE_FRIENDS_HOPE_III] -[PERMITTED_REACTION:LEARN_GIVE_FRIENDS_HOPE_IV] -[PERMITTED_REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_I] -[PERMITTED_REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_II] -[PERMITTED_REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_III] -[PERMITTED_REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_IV] -[PERMITTED_REACTION:LEARN_SHOOT_WITH_HOPE_I] -[PERMITTED_REACTION:LEARN_SHOOT_WITH_HOPE_II] -[PERMITTED_REACTION:LEARN_SHOOT_WITH_HOPE_III] -[PERMITTED_REACTION:LEARN_SHOOT_WITH_HOPE_IV] -[PERMITTED_REACTION:LEARN_HIDE] -[PERMITTED_REACTION:LEARN_REDUCE_FORCE_SELF_I] -[PERMITTED_REACTION:LEARN_REDUCE_FORCE_SELF_II] -[PERMITTED_REACTION:LEARN_REDUCE_FORCE_SELF_III] -[PERMITTED_REACTION:LEARN_REDUCE_FORCE_SELF_IV] -[PERMITTED_REACTION:LEARN_REDUCE_FORCE_SELF_V] -[PERMITTED_REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_I] -[PERMITTED_REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_II] -[PERMITTED_REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_III] -[PERMITTED_REACTION:LEARN_EUSTRESS_SELF] -[PERMITTED_REACTION:LEARN_ENJOY_I] -[PERMITTED_REACTION:LEARN_ENJOY_II] -[PERMITTED_REACTION:LEARN_ENJOY_III] -[PERMITTED_REACTION:LEARN_ENJOY_IV] -[PERMITTED_REACTION:LEARN_DESKILL_I] -[PERMITTED_REACTION:LEARN_DESKILL_II] -[PERMITTED_REACTION:LEARN_AGONY_I] -[PERMITTED_REACTION:LEARN_AGONY_II] -[PERMITTED_REACTION:LEARN_AGONY_III] -[PERMITTED_REACTION:LEARN_AGONY_IV] -[PERMITTED_REACTION:LEARN_AGONY_V] -[PERMITTED_REACTION:LEARN_DEATTRIBUTE_I] -[PERMITTED_REACTION:LEARN_DEATTRIBUTE_II] -[PERMITTED_REACTION:LEARN_INSANITY_I] -[PERMITTED_REACTION:LEARN_INSANITY_II] -[PERMITTED_REACTION:LEARN_TEAR_OUT_SOUL] -[PERMITTED_REACTION:LEARN_UNINSANE] -[PERMITTED_REACTION:LEARN_SHOOT_BLOOD_I] -[PERMITTED_REACTION:LEARN_SHOOT_BLOOD_II] -[PERMITTED_REACTION:LEARN_SHOOT_BLOOD_III] -[PERMITTED_REACTION:LEARN_SHOOT_BLOOD_IV] -[PERMITTED_REACTION:LEARN_SHOOT_BLOOD_V] -[PERMITTED_REACTION:LEARN_REMOVE_BLOOD_I] -[PERMITTED_REACTION:LEARN_REMOVE_BLOOD_II] -[PERMITTED_REACTION:LEARN_REMOVE_BLOOD_III] -[PERMITTED_REACTION:LEARN_REMOVE_BLOOD_IV] -[PERMITTED_REACTION:LEARN_CARING_I] -[PERMITTED_REACTION:LEARN_CARING_II] -[PERMITTED_REACTION:LEARN_CARING_III] -[PERMITTED_REACTION:LEARN_CARING_IV] -[PERMITTED_REACTION:LEARN_CARING_V] -[PERMITTED_REACTION:LEARN_HATRED_I] -[PERMITTED_REACTION:LEARN_HATRED_II] -[PERMITTED_REACTION:LEARN_HATRED_III] -[PERMITTED_REACTION:LEARN_HATRED_IV] -[PERMITTED_REACTION:LEARN_HATRED_V] -[PERMITTED_REACTION:LEARN_STAVE_DOOM_I] -[PERMITTED_REACTION:LEARN_STAVE_DOOM_II] -[PERMITTED_REACTION:LEARN_DETECT_LORD_ENGLISH] -[PERMITTED_REACTION:LEARN_DOOM_ENEMIES_I] -[PERMITTED_REACTION:LEARN_DOOM_ENEMIES_II] -[PERMITTED_REACTION:LEARN_DOOM_ENEMIES_III] -[PERMITTED_REACTION:LEARN_DOOM_ENEMIES_IV] -[PERMITTED_REACTION:LEARN_DOOM_ENEMIES_V] -[PERMITTED_REACTION:LEARN_INCREASE_FORCE_ENEMY_I] -[PERMITTED_REACTION:LEARN_INCREASE_FORCE_ENEMY_II] -[PERMITTED_REACTION:LEARN_INCREASE_FORCE_ENEMY_III] -[PERMITTED_REACTION:LEARN_INCREASE_FORCE_ENEMY_IV] -[PERMITTED_REACTION:LEARN_INCREASE_FORCE_ENEMY_V] -[PERMITTED_REACTION:LEARN_EUSTRESS_I] -[PERMITTED_REACTION:LEARN_EUSTRESS_II] -[PERMITTED_REACTION:LEARN_EUSTRESS_III] -[PERMITTED_REACTION:LEARN_DISTRESS_I] -[PERMITTED_REACTION:LEARN_DISTRESS_II] -[PERMITTED_REACTION:LEARN_DISTRESS_III] -[PERMITTED_REACTION:LEARN_DISTRESS_IV] -[PERMITTED_REACTION:LEARN_BLISS_I] -[PERMITTED_REACTION:LEARN_BLISS_II] -[PERMITTED_REACTION:LEARN_BLISS_III] -[PERMITTED_REACTION:LEARN_ENRAGE_I] -[PERMITTED_REACTION:LEARN_ENRAGE_II] -[PERMITTED_REACTION:LEARN_ENRAGE_III] -[PERMITTED_REACTION:LEARN_ENRAGE_IV] -[PERMITTED_REACTION:LEARN_ENRAGE_V] -[PERMITTED_REACTION:LEARN_ENRAGE_VI] -[PERMITTED_REACTION:LEARN_ENRAGE_VII] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_BREATH] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_LIGHT] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_TIME] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_SPACE] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_LIFE] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_HOPE] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_VOID] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_HEART] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_BLOOD] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_DOOM] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_MIND] -[PERMITTED_REACTION:CHANGE_CLASS_HEIR_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_SEER_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_KNIGHT_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_WITCH_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_MAID_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_PAGE_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_PRINCE_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_ROGUE_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_THIEF_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_SYLPH_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_BARD_OF_RAGE] -[PERMITTED_REACTION:CHANGE_CLASS_MAGE_OF_RAGE] diff --git a/raw/reaction_classes.txt b/raw/reaction_classes.txt deleted file mode 100644 index 73eaed4..0000000 --- a/raw/reaction_classes.txt +++ /dev/null @@ -1,1245 +0,0 @@ -reaction_class.txt - -[OBJECT:REACTION] - -[REACTION:LEARN_FRAYMOTIF] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CAN_GO_GOD_TIER] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_BULLET_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_BULLET_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_BULLET_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_BULLET_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_BULLET_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_DELAY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_DELAY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_DELAY_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_DELAY_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_HASTE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_HASTE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_HASTE_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_WINDY_HASTE_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BREATH_EXPLODE_A_BODY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BREATH_RENDER_BREATHLESS_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BREATH_EXPLODE_A_BODY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BREATH_RENDER_BREATHLESS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BREATH_RENDER_BREATHLESS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_PREVENT_SUFFOCATION] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DECREASE_LUCK_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DECREASE_LUCK_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DECREASE_LUCK_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DECREASE_LUCK_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_LUCK_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_LUCK_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_LUCK_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_LUCK_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TEMPORARY_BLIND_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TEMPORARY_BLIND_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TEMPORARY_BLIND_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_PERMANENT_BLIND_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_PERMANENT_BLIND_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_PERMANENT_BLIND_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_LIGHT_SEE_CREATURES] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_VISION] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SLOW_DOWN_ENEMY_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SPEED_UP_FRIEND_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SPEED_UP_FRIEND_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SPEED_UP_FRIEND_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_SPEED_UP_SELF] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_INCREASE_LUCK_SELF] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_AGE_ENEMIES_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_AGE_ENEMIES_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_AGE_ENEMIES_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_AGE_ENEMIES_PAGE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TIME_AGE_DOWN] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHRINK_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHRINK_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHRINK_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHRINK_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GROW_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GROW_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GROW_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REPLACE_ARMS_WITH_SPACE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REPLACE_LEGS_WITH_SPACE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TELEPORT] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REPLACE_HEAD_WITH_SPACE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AUTOREVIVE_SELF_ONCE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HEAL_MILD_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HEAL_MILD_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HEAL_MILD_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HEAL_FULL_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HEAL_FULL:II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DEUNDEAD_FRIENDS] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DEUNDEAD_ENEMIES] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESTROY_LIFE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESTROY_LIFE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESTROY_LIFE_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESTROY_LIFE_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESTROY_LIFE_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AUTOREVIVE_OTHERS_ONCE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_FRIENDS_HOPE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_FRIENDS_HOPE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_FRIENDS_HOPE_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_FRIENDS_HOPE_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_GIVE_ENEMIES_HOPELESSNESS_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_WITH_HOPE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_WITH_HOPE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_WITH_HOPE_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_WITH_HOPE_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HIDE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REDUCE_FORCE_SELF_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REDUCE_FORCE_SELF_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REDUCE_FORCE_SELF_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REDUCE_FORCE_SELF_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REDUCE_FORCE_SELF_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_MAKE_ENEMIES_DISAPPEAR_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_EUSTRESS_SELF] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENJOY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENJOY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENJOY_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENJOY_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESKILL_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DESKILL_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AGONY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AGONY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AGONY_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AGONY_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_AGONY_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DEATTRIBUTE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DEATTRIBUTE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INSANITY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INSANITY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_TEAR_OUT_SOUL] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_UNINSANE] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_BLOOD_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_BLOOD_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_BLOOD_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_BLOOD_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_SHOOT_BLOOD_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REMOVE_BLOOD_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REMOVE_BLOOD_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REMOVE_BLOOD_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_REMOVE_BLOOD_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CARING_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CARING_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CARING_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CARING_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_CARING_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HATRED_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HATRED_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HATRED_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HATRED_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_HATRED_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_STAVE_DOOM_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_STAVE_DOOM_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DETECT_LORD_ENGLISH] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DOOM_ENEMIES_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DOOM_ENEMIES_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DOOM_ENEMIES_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DOOM_ENEMIES_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DOOM_ENEMIES_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_FORCE_ENEMY_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_FORCE_ENEMY_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_FORCE_ENEMY_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_FORCE_ENEMY_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_INCREASE_FORCE_ENEMY_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_EUSTRESS_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_EUSTRESS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_EUSTRESS_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DISTRESS_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DISTRESS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DISTRESS_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_DISTRESS_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BLISS_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BLISS_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_BLISS_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_I] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_II] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_III] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_IV] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_V] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_VI] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:LEARN_ENRAGE_VII] - [NAME:learn spell - #YOUR_SPELL_NAME_HERE#] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -############################################################## - -[REACTION:CHANGE_CLASS_HEIR_OF_BREATH] - [NAME:change class - heir of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_BREATH] - [NAME:change class - seer of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_BREATH] - [NAME:change class - knight of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_BREATH] - [NAME:change class - witch of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_BREATH] - [NAME:change class - maid of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_BREATH] - [NAME:change class - page of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_BREATH] - [NAME:change class - prince of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_BREATH] - [NAME:change class - rogue of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_BREATH] - [NAME:change class - thief of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_BREATH] - [NAME:change class - sylph of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_BREATH] - [NAME:change class - bard of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_BREATH] - [NAME:change class - mage of breath] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_LIGHT] - [NAME:change class - heir of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_LIGHT] - [NAME:change class - seer of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_LIGHT] - [NAME:change class - knight of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_LIGHT] - [NAME:change class - witch of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_LIGHT] - [NAME:change class - maid of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_LIGHT] - [NAME:change class - page of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_LIGHT] - [NAME:change class - prince of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_LIGHT] - [NAME:change class - rogue of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_LIGHT] - [NAME:change class - thief of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_LIGHT] - [NAME:change class - sylph of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_LIGHT] - [NAME:change class - bard of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_LIGHT] - [NAME:change class - mage of light] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_TIME] - [NAME:change class - heir of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_TIME] - [NAME:change class - seer of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_TIME] - [NAME:change class - knight of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_TIME] - [NAME:change class - witch of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_TIME] - [NAME:change class - maid of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_TIME] - [NAME:change class - page of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_TIME] - [NAME:change class - prince of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_TIME] - [NAME:change class - rogue of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_TIME] - [NAME:change class - thief of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_TIME] - [NAME:change class - sylph of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_TIME] - [NAME:change class - bard of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_TIME] - [NAME:change class - mage of time] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_SPACE] - [NAME:change class - heir of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_SPACE] - [NAME:change class - seer of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_SPACE] - [NAME:change class - knight of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_SPACE] - [NAME:change class - witch of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_SPACE] - [NAME:change class - maid of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_SPACE] - [NAME:change class - page of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_SPACE] - [NAME:change class - prince of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_SPACE] - [NAME:change class - rogues of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_SPACE] - [NAME:change class - thief of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_SPACE] - [NAME:change class - sylph of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_SPACE] - [NAME:change class - bard of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_SPACE] - [NAME:change class - mage of space] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_LIFE] - [NAME:change class - heir of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_LIFE] - [NAME:change class - seer of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_LIFE] - [NAME:change class - knight of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_LIFE] - [NAME:change class - witch of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_LIFE] - [NAME:change class - maid of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_LIFE] - [NAME:change class - page of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_LIFE] - [NAME:change class - prince of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_LIFE] - [NAME:change class - rogue of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_LIFE] - [NAME:change class - thief of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_LIFE] - [NAME:change class - sylph of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_LIFE] - [NAME:change class - bard of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_LIFE] - [NAME:change class - mage of life] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_HOPE] - [NAME:change class - heir of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_HOPE] - [NAME:change class - seer of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_HOPE] - [NAME:change class - knight of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_HOPE] - [NAME:change class - witch of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_HOPE] - [NAME:change class - maid of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_HOPE] - [NAME:change class - page of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_HOPE] - [NAME:change class - prince of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_HOPE] - [NAME:change class - rogue of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_HOPE] - [NAME:change class - thief of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_HOPE] - [NAME:change class - sylph of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_HOPE] - [NAME:change class - bard of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_HOPE] - [NAME:change class - mage of hope] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_VOID] - [NAME:change class - heir of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_VOID] - [NAME:change class - seer of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_VOID] - [NAME:change class - knight of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_VOID] - [NAME:change class - witch of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_VOID] - [NAME:change class - maid of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_VOID] - [NAME:change class - page of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_VOID] - [NAME:change class - prince of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_VOID] - [NAME:change class - rogue of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_VOID] - [NAME:change class - thief of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_VOID] - [NAME:change class - sylph of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_VOID] - [NAME:change class - bard of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_VOID] - [NAME:change class - mage of void] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_HEART] - [NAME:change class - heir of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_HEART] - [NAME:change class - seer of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_HEART] - [NAME:change class - knight of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_HEART] - [NAME:change class - witch of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_HEART] - [NAME:change class - maid of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_HEART] - [NAME:change class - page of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_HEART] - [NAME:change class - prince of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_HEART] - [NAME:change class - rogue of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_HEART] - [NAME:change class - thief of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_HEART] - [NAME:change class - sylph of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_HEART] - [NAME:change class - bard of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_HEART] - [NAME:change class - mage of heart] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_BLOOD] - [NAME:change class - heir of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_BLOOD] - [NAME:change class - seer of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_BLOOD] - [NAME:change class - knight of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_BLOOD] - [NAME:change class - witch of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_BLOOD] - [NAME:change class - maid of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_BLOOD] - [NAME:change class - page of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_BLOOD] - [NAME:change class - prince of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_BLOOD] - [NAME:change class - rogue of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_BLOOD] - [NAME:change class - thief of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_BLOOD] - [NAME:change class - sylph of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_BLOOD] - [NAME:change class - bard of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_BLOOD] - [NAME:change class - mage of blood] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_DOOM] - [NAME:change class - heir of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_DOOM] - [NAME:change class - seer of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_DOOM] - [NAME:change class - knight of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_DOOM] - [NAME:change class - witch of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_DOOM] - [NAME:change class - maid of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_DOOM] - [NAME:change class - page of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_DOOM] - [NAME:change class - prince of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_DOOM] - [NAME:change class - rogue of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_DOOM] - [NAME:change class - thief of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_DOOM] - [NAME:change class - sylph of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_DOOM] - [NAME:change class - bard of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_DOOM] - [NAME:change class - mage of doom] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_MIND] - [NAME:change class - heir of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_MIND] - [NAME:change class - seer of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_MIND] - [NAME:change class - knight of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_MIND] - [NAME:change class - witch of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_MIND] - [NAME:change class - maid of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_MIND] - [NAME:change class - page of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_MIND] - [NAME:change class - prince of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_MIND] - [NAME:change class - rogue of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_MIND] - [NAME:change class - thief of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_MIND] - [NAME:change class - sylph of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_MIND] - [NAME:change class - bard of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_MIND] - [NAME:change class - mage of mind] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_HEIR_OF_RAGE] - [NAME:change class - heir of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SEER_OF_RAGE] - [NAME:change class - seer of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_KNIGHT_OF_RAGE] - [NAME:change class - knight of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_WITCH_OF_RAGE] - [NAME:change class - witch of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAID_OF_RAGE] - [NAME:change class - maid of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PAGE_OF_RAGE] - [NAME:change class - page of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_PRINCE_OF_RAGE] - [NAME:change class - prince of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_ROGUE_OF_RAGE] - [NAME:change class - rogue of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_THIEF_OF_RAGE] - [NAME:change class - thief of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_SYLPH_OF_RAGE] - [NAME:change class - sylph of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_BARD_OF_RAGE] - [NAME:change class - bard of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] - -[REACTION:CHANGE_CLASS_MAGE_OF_RAGE] - [NAME:change class - mage of rage] - [BUILDING:#YOUR_BUILDING_HERE#:NONE] diff --git a/raw/scripts/base/on-death.lua b/raw/scripts/base/on-death.lua deleted file mode 100644 index 1ce8c91..0000000 --- a/raw/scripts/base/on-death.lua +++ /dev/null @@ -1,116 +0,0 @@ ---base/classes.lua v1.0 -experience_radius = -1 - -local roses = dfhack.script_environment('base/roses-table').loadRosesTable() -local utils = require 'utils' -local split = utils.split_string -local events = require "plugins.eventful" -events.enableEvent(events.eventType.UNIT_DEATH,10) - -function expCheck(unit,unitTarget,radius) - - local xmin = unitTarget.pos.x - radius - local xmax = unitTarget.pos.x + radius - local ymin = unitTarget.pos.y - radius - local ymax = unitTarget.pos.y + radius - local zmin = unitTarget.pos.z - radius - local zmax = unitTarget.pos.z + radius - - if (unit.pos.x >= xmin and unit.pos.x <= xmax and unit.pos.y >= ymin and unit.pos.y <= ymax and unit.pos.z >= zmin and unit.pos.z <= zmax) then - if unit.civ_id == unitTarget.civ_id then return true end - end - - return false -end - -events.onUnitDeath.mainFunction=function(target_id) - if not roses then - return - end - - target = df.unit.find(target_id) - target_civ = target.civ_id - target_race = target.race - target_caste = target.caste - target_creature_name = df.creature_raw.find(target_race).creature_id - target_caste_name = df.creature_raw.find(target_race).caste[target_caste].caste_id - - killer_id = tonumber(target.relationship_ids.LastAttacker) - if killer_id >= 0 then - killer = df.unit.find(killer_id) - killer_civ = killer.civ_id - killer_race = killer.race - killer_caste = killer.caste - killer_creature_name = df.creature_raw.find(killer_race).creature_id - killer_caste_name = df.creature_raw.find(killer_race).caste[killer_caste].caste_id - end - --- GeneralTable Checks - if roses.GlobalTable then - killTable = roses.GlobalTable.Kills - if killer_id >= 0 then - killTable[killer_creature_name] = killTable[killer_creature_name] or {} - killTable.Total = killTable.Total and tostring(killTable.Total + 1) or '1' - killTable[killer_creature_name][killer_caste_name] = killTable[killer_creature_name][killer_caste_name] or '0' - killTable[killer_creature_name][killer_caste_name] = tostring(killTable[killer_creature_name][killer_caste_name] + 1) - end - deathTable = roses.GlobalTable.Deaths - deathTable.Total = deathTable.Total and tostring(deathTable.Total + 1) or '1' - deathTable[target_creature_name] = deathTable[target_creature_name] or {} - deathTable[target_creature_name][target_caste_name] = deathTable[target_creature_name][target_caste_name] or '0' - deathTable[target_creature_name][target_caste_name] = tostring(deathTable[target_creature_name][target_caste_name] + 1) - end - --- EntityTable Checks - if roses.EntityTable then - if killer_id >= 0 and killer_civ>=0 then - if not roses.EntityTable[tostring(killer_civ)] then dfhack.script_environment('functions/tables').makeEntityTable(tostring(killer_civ)) end - killTable = roses.EntityTable[tostring(killer_civ)].Kills - killTable.Total = killTable.Total and tostring(killTable.Total + 1) or '1' - killTable[killer_creature_name] = killTable[killer_creature_name] or {} - killTable[killer_creature_name][killer_caste_name] = killTable[killer_creature_name][killer_caste_name] or '0' - killTable[killer_creature_name][killer_caste_name] = tostring(killTable[killer_creature_name][killer_caste_name] + 1) - end - if target_civ>=0 then - if not roses.EntityTable[tostring(target_civ)] then dfhack.script_environment('functions/tables').makeEntityTable(tostring(target_civ)) end - deathTable = roses.EntityTable[tostring(target_civ)].Deaths - deathTable.Total = deathTable.Total and tostring(deathTable.Total + 1) or '1' - deathTable[target_creature_name] = deathTable[target_creature_name] or {} - deathTable[target_creature_name][target_caste_name] = deathTable[target_creature_name][target_caste_name] or '0' - deathTable[target_creature_name][target_caste_name] = tostring(deathTable[target_creature_name][target_caste_name] + 1) - end - end - --- ClassTable Checks - if roses.ClassTable and killer_id >= 0 then - experience = 1 - experience_list = {} - for _,unitclass in ipairs(df.creature_raw.find(target_race).caste[target_caste].creature_class) do - if split(unitclass.value,'_')[1] == 'EXPERIENCE' then - experience = split(unitclass.value,'_')[2] - break - end - end - if experience_radius == -1 then - experience_list = {killer_id} - else - for i,unit in ipairs(df.global.world.units.active) do - if expCheck(unit,killer,experience_radius) then experience_list[i] = unit.id end - end - end - - for _,unit_id in ipairs(experience_list) do - dfhack.script_environment('functions/class').addExperience(unit_id,experience,true) - end - end - --- UnitTable Checks - if roses.UnitTable then - if killer_id >= 0 then - if not roses.UnitTable[tostring(killer_id)] then dfhack.script_environment('functions/tables').makeUnitTable(tostring(killer_id)) end - roses.UnitTable[tostring(killer_id)].Stats.Kills = tostring(roses.UnitTable[tostring(killer_id)].Stats.Kills + 1) - end ---[[ if not roses.UnitTable[tostring(target_id)] then dfhack.script_environment('functions/tables').makeUnitTable(tostring(target_id)) end - roses.UnitTable[tostring(target_id)].Stats.Deaths = tostring(roses.UnitTable[tostring(target_id)].Stats.Deaths + 1)]] - end -end \ No newline at end of file diff --git a/raw/scripts/base/on-time.lua b/raw/scripts/base/on-time.lua deleted file mode 100644 index 976854c..0000000 --- a/raw/scripts/base/on-time.lua +++ /dev/null @@ -1,112 +0,0 @@ ---base/civilizations.lua v1.0 - -local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - -if not roses then - return -end - -yearly = {} -season = {} -monthly = {} -weekly = {} -daily = {} - --- CivilizationTable Checks -if roses.CivilizationTable and roses.EntityTable then - for _,id in pairs(roses.EntityTable) do - entityTable = roses.EntityTable[id] - if entityTable.Civilization then - method = entityTable.Civilization.CurrentMethod - if method == 'YEARLY' then - yearly[id] = 'CIVILZATION' - elseif method == 'SEASON' then - season[id] = 'CIVILZATION' - elseif method == 'MONTHLY' then - monthly[id] = 'CIVILZATION' - elseif method == 'WEEKLY' then - weekly[id] = 'CIVILZATION' - elseif method == 'DAILY' then - daily[id] = 'CIVILZATION' - else - season[id] = id - end - end - end -end - --- EventTable Checks -if roses.EventTable then - for _,id in pairs(roses.EventTable) do - event = roses.EventTable[id] - method = event.Check - if method == 'YEARLY' then - yearly[id] = 'EVENT' - elseif method == 'SEASON' then - season[id] = 'EVENT' - elseif method == 'MONTHLY' then - monthly[id] = 'EVENT' - elseif method == 'WEEKLY' then - weekly[id] = 'EVENT' - elseif method == 'DAILY' then - daily[id] = 'EVENT' - else - season[id] = id - end - end -end - -for id,Type in pairs(yearly) do - curtick = df.global.cur_year_tick - ticks = 1200*28*3*4-curtick - if ticks <= 0 then ticks = 1200*28*3*4 end - if Type == 'CIVILIZATION' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/civilization').checkEntity(id,'YEARLY',true)) - elseif TYPE == 'EVENT' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/event').checkEvent(id,'YEARLY',true)) - end -end - -for id,Type in pairs(season) do - curtick = df.global.cur_season_tick*10 - ticks = 1200*28*3-curtick - if ticks <= 0 then ticks = 1200*28*3 end - if Type == 'CIVILIZATION' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/civilization').checkEntity(id,'SEASON',true)) - elseif TYPE == 'EVENT' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/event').checkEvent(id,'SEASON',true)) - end -end - -for id,Type in pairs(monthly) do - curtick = df.global.cur_year_tick - moy = curtick/(1200*28) - ticks = math.ceil(moy)*1200*28 - curtick - if Type == 'CIVILIZATION' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/civilization').checkEntity(id,'MONTHLY',true)) - elseif TYPE == 'EVENT' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/event').checkEvent(id,'MONTHLY',true)) - end -end - -for id,Type in pairs(weekly) do - curtick = df.global.cur_year_tick - woy = curtick/(1200*7) - ticks = math.ceil(woy)*1200*7 - curtick - if Type == 'CIVILIZATION' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/civilization').checkEntity(id,'WEEKLY',true)) - elseif TYPE == 'EVENT' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/event').checkEvent(id,'WEEKLY',true)) - end -end - -for id,Type in pairs(daily) do - curtick = df.global.cur_year_tick - doy = curtick/1200 - ticks = math.ceil(doy)*1200 - curtick - if Type == 'CIVILIZATION' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/civilization').checkEntity(id,'DAILY',true)) - elseif TYPE == 'EVENT' then - dfhack.timeout(ticks+1,'ticks',dfhack.script_environment('functions/event').checkEvent(id,'DAILY',true)) - end -end \ No newline at end of file diff --git a/raw/scripts/base/persist-delay.lua b/raw/scripts/base/persist-delay.lua deleted file mode 100644 index 477aab9..0000000 --- a/raw/scripts/base/persist-delay.lua +++ /dev/null @@ -1,36 +0,0 @@ -local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - -local delayTable = roses.CommandDelay -for _,i in pairs(delayTable) do - local delay = delayTable[i] - local currentTick = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick - if currentTick >= tonumber(delay.Tick) then - delay = nil - else - local ticks = delay.Tick-currentTick - dfhack.timeout(ticks,'ticks', - function () - dfhack.run_command(delay.Script) - end - ) - end -end - -local delayTable = roses.EnvironmentDelay -for _,i in pairs(delayTable) do - local delay = delayTable[i] - local currentTick = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick - if currentTick >= tonumber(delay.Tick) then - delay = nil - else - local ticks = delay.Tick-currentTick - local environment = delay.Environment - local functions = delay.Function - local arguments = delay.Arguments - dfhack.timeout(ticks,'ticks', - function () - dfhack.script_environment(environment)[functions](table.unpack(arguments)) - end - ) - end -end \ No newline at end of file diff --git a/raw/scripts/base/roses-init.lua b/raw/scripts/base/roses-init.lua deleted file mode 100644 index 23b2f3f..0000000 --- a/raw/scripts/base/roses-init.lua +++ /dev/null @@ -1,86 +0,0 @@ ---MUST BE LOADED IN DFHACK.INIT - -local utils = require 'utils' -local split = utils.split_string - -validArgs = validArgs or utils.invert({ - 'help', - 'all', - 'classSystem', - 'civilizationSystem', - 'eventSystem', - 'persistentDelay', - 'globalTracking', - 'forceReload' -}) -local args = utils.processArgs({...}, validArgs) - -roses = dfhack.script_environment('base/roses-table').loadRosesTable() -roses.UnitTable = roses.UnitTable or {} -roses.EntityTable = roses.EntityTable or {} -roses.CommandDelay = roses.CommandDelay or {} -roses.EnvironmentDelay = roses.EnvironmentDelay or {} -roses.CounterTable = roses.CounterTable or {} -roses.SpellTable = roses.SpellTable or {} -if not roses.GlobalTable then dfhack.script_environment('functions/tables').makeGlobalTable() end - -local function civilizationNotAlreadyLoaded() - return (not roses.CivilizationTable) or #roses.CivilizationTable < 1 -end -local function classNotAlreadyLoaded() - return (not roses.ClassTable) or #roses.ClassTable < 1 -end -local function eventNotAlreadyLoaded() - return (not roses.EventTable) or #roses.EventTable < 1 -end - -if args.all or args.classSystem then - systemCheck = false - if classNotAlreadyLoaded() or args.forceReload then - systemCheck = dfhack.script_environment('functions/tables').makeClassTable() - elseif not classNotAlreadyLoaded() then - systemCheck = true - end - if systemCheck then - print('Class System successfully loaded') - end -end - -if args.all or args.civilizationSystem then - systemCheck = false - if civilizationNotAlreadyLoaded() or args.forceReload then - systemCheck = dfhack.script_environment('functions/tables').makeCivilizationTable() - elseif not civilizationNotAlreadyLoaded() then - systemCheck = true - end - if systemCheck then - print('Civilization System successfully loaded') - end -end - -if args.all or args.eventSystem then - systemCheck = false - if eventNotAlreadyLoaded() or args.forceReload then - systemCheck = dfhack.script_environment('functions/tables').makeEventTable() - elseif not eventNotAlreadyLoaded() then - systemCheck = true - end - if systemCheck then - print('Event System successfully loaded') - end -end - -if args.all or args.persistentDelay then - print('') - print('Creating persistent function calls') - dfhack.run_command('base/persist-delay') -end - -if args.all or args.globalTracking then - print('') - print('Loading Global Tracking System') - dfhack.run_command('base/global-tracking') -end - -dfhack.run_command('base/on-death') -dfhack.run_command('base/on-time') \ No newline at end of file diff --git a/raw/scripts/base/roses-table.lua b/raw/scripts/base/roses-table.lua deleted file mode 100644 index 472a4f6..0000000 --- a/raw/scripts/base/roses-table.lua +++ /dev/null @@ -1,75 +0,0 @@ -roses = roses or false - -local json=require('json') - -local json_file_names={ -'SpellTable', -'GlobalTable', -'EnvironmentDelay', -'CommandDelay', -'ClassTable', -'CounterTable', -'EntityTable', -} -function saveRosesTable(savePath) - savePath=savePath or dfhack.getSavePath() - if not roses or not savePath then return false end - local rosesFilePath=savePath..'/roses' - dfhack.filesystem.mkdir(rosesFilePath) - for k,v in pairs(json_file_names) do - if roses[v] then - json.encode_file(roses[v],rosesFilePath..'/'..v..'.json') - end - end - dfhack.filesystem.mkdir(rosesFilePath..'/UnitTable') - for k,v in pairs(roses.UnitTable) do - json.encode_file(v,rosesFilePath..'/UnitTable/'..k..'.json') - end -end - -function loadRosesTable() - if roses then return roses end - local savePath=dfhack.getSavePath() - if not savePath then return false end - local rosesFilePath=savePath..'/roses' - local rosesFileExists=false - for k,v in pairs(json_file_names) do - rosesFileExists=rosesFileExists or dfhack.filesystem.isfile(rosesFilePath..'/'..v..'.json') - end - if not rosesFileExists then - roses={} - roses.savePath=savePath - roses.UnitTable={} - saveRosesTable() - return roses - end - roses={} - roses.savePath=savePath - for k,v in pairs(json_file_names) do - if dfhack.filesystem.isfile(rosesFilePath..'/'..v..'.json') then - roses[v]=json.decode_file(rosesFilePath..'/'..v..'.json') - end - end - roses.UnitTable={} - for k,v in ipairs(dfhack.filesystem.listdir(rosesFilePath..'/UnitTable')) do - if v:sub(-4)=='json' then - roses.UnitTable[v:sub(0,-6)]=json.decode_file(rosesFilePath..'/UnitTable/'..v) - end - end - return roses -end - -dfhack.onStateChange.rosesFileIO=function(code) - if code==SC_WORLD_UNLOADED then - saveRosesTable(roses.savePath) - roses=false - end -end - -local function saveOnAutosave() - if df.global.ui.main.autosave_request then - saveRosesTable() - end -end - -require('repeat-util').scheduleUnlessAlreadyScheduled('rosesQuickAndAutoSave',1,'ticks',saveOnAutosave) \ No newline at end of file diff --git a/raw/scripts/building/subtype-change.lua b/raw/scripts/building/subtype-change.lua deleted file mode 100644 index 1ae008f..0000000 --- a/raw/scripts/building/subtype-change.lua +++ /dev/null @@ -1,78 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'building', - 'unit', - 'item', - 'reagent', - 'type', - 'dur', - 'label', -}) - -local args = utils.processArgs({...}, validArgs) - -if args.help then -print( -[[building/subtype-change.lua - arguments: - -help - print this help message - -building id - specify the building to be removed - -unit id - specify the unit to use as location to find the building - -item ids - table of item ids to be added to the building - -reagent codes - table of reagent codes, used in conjunction with -label and -item - -label code - specific reagent code of item to be added to building - -type TOKEN - building to change the other into - -dur # - length of time in in-game ticks for the change to last, any items added will be removed - -examples - building/subtype-change -building \\BUILDING_ID -type NEW_BUILDING_ID -item [ \\INPUT_ITEMS ] -dur 1000 - building/subtpye-change -building \\BUILDING_ID -type NEW_BUILDING_ID -label add -item [ \\INPUT_ITEMS ] -reagent [ \\INPUT_REAGENTS ] -]]) -return -end - -if args.building then - building = df.building.find(tonumber(args.building)) -elseif args.unit then - building = dfhack.buildings.findAtTile(df.unit.find(tonumber(args.unit)).pos) -else - print('No unit or building declaration') - return -end -if not building then print('No valid building') return end - -if building.custom_type < 0 then print('Changing vanilla buildings not currently supported') return end -if not args.type then print('No specified subtype chosen') return end - -dur = args.dur or 0 - -check = dfhack.script_environment('functions/building').changeSubtype(building,args.type,dur) - -if check then - if args.item and not args.label then - for _,item in ipairs(args.item) do - dfhack.script_environment('functions/building').addItem(building,item,dur) - end - end - if args.label then - if args.item and args.reagent then - for i,code in ipairs(args.reagent) do - if code == args.label then - dfhack.script_environment('functions/building').addItem(building,args.item[i],dur) - end - end - else - print('When using a label, must provide both items and reagents') - return - end - end -end diff --git a/raw/scripts/civilizations/level-up.lua b/raw/scripts/civilizations/level-up.lua deleted file mode 100644 index bb4724d..0000000 --- a/raw/scripts/civilizations/level-up.lua +++ /dev/null @@ -1,23 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'civ', - 'unit', - 'amount', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -if args.unit then - args.civ = df.unit.find(tonumber(args.unit)).civ_id -end -civid = tonumber(args.civ) -if args.amount then - amount = tonumber(args.amount) -else - amount = 1 -end - -dfhack.script_environment('functions/civilization').changeLevel(civid,amount,args.verbose) - diff --git a/raw/scripts/civilizations/noble-change.lua b/raw/scripts/civilizations/noble-change.lua deleted file mode 100644 index 9990154..0000000 --- a/raw/scripts/civilizations/noble-change.lua +++ /dev/null @@ -1,24 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'civ', - 'position', - 'remove', - 'add', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -civid = tonumber(args.civ) -position = args.position -direction = 0 -if args.remove then direction = -1 end -if args.add then direction = 1 end -if args.add and args.removes then return end -if direction == 0 then - print('No valid command, use -remove or -add') - return -end - -dfhack.script_environment('functions/entity').changeNoble(civid,position,direction,args.verbose) \ No newline at end of file diff --git a/raw/scripts/classes/add-experience.lua b/raw/scripts/classes/add-experience.lua deleted file mode 100644 index 8e05db2..0000000 --- a/raw/scripts/classes/add-experience.lua +++ /dev/null @@ -1,27 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'amount', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit declared') - return -end - -if args.amount and tonumber(args.amount) then - amount = tonumber(args.amount) -else - amount = 0 -end - -verbose = false -if args.verbose then verbose = true end - -dfhack.script_environment('functions/class').addExperience(unit,amount,verbose) \ No newline at end of file diff --git a/raw/scripts/classes/change-class.lua b/raw/scripts/classes/change-class.lua deleted file mode 100644 index c3f8d00..0000000 --- a/raw/scripts/classes/change-class.lua +++ /dev/null @@ -1,39 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'class', - 'override', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit declared') - return -end - -if args.class then - class = args.class -else - print('No class declared') - return -end - -verbose = false -if args.verbose then verbose = true end - -if args.override then - yes = true -else - yes = dfhack.script_environment('functions/class').checkRequirementsClass(unit,class,verbose) -end -if yes then - success = dfhack.script_environment('functions/class').changeClass(unit,class,verbose) - if success then - -- Erase items used for reaction - end -end \ No newline at end of file diff --git a/raw/scripts/classes/learn-skill.lua b/raw/scripts/classes/learn-skill.lua deleted file mode 100644 index a5ffd60..0000000 --- a/raw/scripts/classes/learn-skill.lua +++ /dev/null @@ -1,39 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'spell', - 'override', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit declared') - return -end - -if args.spell then - spell = args.spell -else - print('No spell declared') - return -end - -verbose = false -if args.verbose then verbose = true end - -if args.override then - yes = true -else - yes = dfhack.script_environment('functions/class').checkRequirementsSpell(unit,spell,verbose) -end -if yes then - success = dfhack.script_environment('functions/class').changeSpell(unit,spell,'add',verbose) - if success then - -- Erase items used for reaction - end -end \ No newline at end of file diff --git a/raw/scripts/classes/level-up.lua b/raw/scripts/classes/level-up.lua deleted file mode 100644 index 1851f42..0000000 --- a/raw/scripts/classes/level-up.lua +++ /dev/null @@ -1,27 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'verbose', - 'amount', -}) -local args = utils.processArgs({...}, validArgs) - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit declared') - return -end - -if args.amount then - amount = tonumber(args.amount) -else - amount = 1 -end - -verbose = false -if args.verbose then verbose = true end - -dfhack.script_environment('functions/class').changeLevel(unit,amount,verbose) \ No newline at end of file diff --git a/raw/scripts/entity/resource-change.lua b/raw/scripts/entity/resource-change.lua deleted file mode 100644 index 8acd223..0000000 --- a/raw/scripts/entity/resource-change.lua +++ /dev/null @@ -1,31 +0,0 @@ -local utils = require 'utils' -local split = utils.split_string - -validArgs = validArgs or utils.invert({ - 'help', - 'civ', - 'type', - 'obj', - 'remove', - 'add', - 'verbose' -}) -local args = utils.processArgs({...}, validArgs) - -civid = tonumber(args.civ) -civ = df.global.world.entities.all[civid] -resources = civ.resources -mtype = string.upper(split(args.type,':')[1]) -stype = string.upper(split(args.type,':')[2]) -mobj = string.upper(split(args.obj,':')[1]) -sobj = string.upper(split(args.obj,':')[2]) -direction = 0 -if args.remove then direction == -1 end -if args.add then directino == 1 end -if args.add and args.removes then return end -if direction == 0 then - print('No valid command, use -remove or -add') - return -end - -dfhack.script_environment('functions/entity').changeResources(civ,mtype,stype,mobj,sobj,direction,args.verbose) \ No newline at end of file diff --git a/raw/scripts/events/read-file.lua b/raw/scripts/events/read-file.lua deleted file mode 100644 index 33496b6..0000000 --- a/raw/scripts/events/read-file.lua +++ /dev/null @@ -1,197 +0,0 @@ -function tchelper(first, rest) - return first:upper()..rest:lower() -end - -function readFile(path) - local utils = require 'utils' - local split = utils.split_string - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.EventTable = roses.EventTable or {} - local iofile = io.open(path,"r") - local totdat = {} - local count = 1 - while true do - local line = iofile:read("*line") - if line == nil then break end - totdat[count] = line - count = count + 1 - end - iofile:close() - - d = {} - events = roses.EventTable - count = 1 - for i,x in ipairs(totdat) do - if split(x,':')[1] == '[EVENT' then - d[count] = {split(split(x,':')[2],']')[1],i,0} - count = count + 1 - end - end - for i,x in ipairs(d) do - eventToken = x[1] - startLine = x[2]+1 - if i == #d then - endLine = #totdat - else - endLine = d[i+1][2]-1 - end - events[eventToken]={} - events[eventToken]['Effect'] = {} - events[eventToken]['Required'] = {} - events[eventToken]['Delay'] = {} - numberOfEffects = 0 - for j = startLine,endLine,1 do - splits = split(totdat[j],':') - for k = 1, #splits, 1 do - splits[k] = split(splits[k],']')[1] - end - test = splits[1]:gsub("%s+","") - if test == '[NAME' then - events[eventToken]['Name'] = splits[2] - elseif test == '[CHECK' then - events[eventToken]['Check'] = splits[2] - elseif test == '[CHANCE' then - events[eventToken]['Chance'] = splits[2] - elseif test == '[DELAY' then - events[eventToken]['Delay'][splits[2]] = splits[3] - elseif test == '[REQUIREMENT' then - if splits[2] == 'COUNTER' then - events[eventToken]['Required']['Counter'] = events[eventToken]['Required']['Counter'] or {} - events[eventToken]['Required']['Counter'][splits[3]] = splits[4] - elseif splits[2] == 'TIME' then - events[eventToken]['Required']['Time'] = {} - events[eventToken]['Required']['Time']['1'] = splits[3] - elseif splits[2] == 'POPULATION' then - events[eventToken]['Required']['Population'] = {} - events[eventToken]['Required']['Population']['1'] = splits[3] - elseif splits[2] == 'WEALTH' then - events[eventToken]['Required']['Wealth'] = events[eventToken]['Required']['Wealth'] or {} - events[eventToken]['Required']['Wealth'][splits[3]] = splits[4] - elseif splits[2] == 'BUILDING' then - events[eventToken]['Required']['Building'] = events[eventToken]['Required']['Building'] or {} - events[eventToken]['Required']['Building'][splits[3]] = splits[4] - elseif splits[2] == 'SKILL' then - events[eventToken]['Required']['Skill'] = events[eventToken]['Required']['Skill'] or {} - events[eventToken]['Required']['Skill'][splits[3]] = splits[4] - elseif splits[2] == 'CLASS' then - events[eventToken]['Required']['Class'] = events[eventToken]['Required']['Class'] or {} - events[eventToken]['Required']['Class'][splits[3]] = splits[4] - elseif splits[2] == 'KILLS' then - events[eventToken]['Required']['Kills'] = events[eventToken]['Required']['Kills'] or {} - events[eventToken]['Required']['Kills'][splits[3]] = splits[4] - elseif splits[2] == 'DEATHS' then - events[eventToken]['Required']['Deaths'] = events[eventToken]['Required']['Deaths'] or {} - events[eventToken]['Required']['Deaths'][splits[3]] = splits[4] - elseif splits[2] == 'TRADES' then - events[eventToken]['Required']['Trades'] = events[eventToken]['Required']['Trades'] or {} - events[eventToken]['Required']['Trades'][splits[3]] = splits[4] - elseif splits[2] == 'SIEGES' then - events[eventToken]['Required']['Sieges'] = events[eventToken]['Required']['Sieges'] or {} - events[eventToken]['Required']['Sieges'][splits[3]] = splits[4] - end - elseif test == '[EFFECT' then - number = splits[2] - numberOfEffects = numberOfEffects + 1 - events[eventToken]['Effect'][number] = {} - effect = events[eventToken]['Effect'][number] - effect['Arguments'] = '0' - effect['Argument'] = {} - effect['Required'] = {} - effect['Script'] = {} - effect['Delay'] = {} - effect['Scripts'] = '0' - elseif test == '[EFFECT_NAME' then - effect['Name'] = splits[2] - elseif test == '[EFFECT_CHANCE' then - effect['Chance'] = splits[2] - elseif test == '[EFFECT_CONTINGENT_ON' then - effect['Contingent'] = splits[2] - elseif test == '[EFFECT_DELAY' then - effect['Delay'][splits[2]] = splits[3] - elseif test == '[EFFECT_REQUIREMENT' then - if splits[2] == 'COUNTER' then - effect['Required']['Counter'] = effect['Required']['Counter'] or {} - effect['Required']['Counter'][splits[3]] = splits[4] - elseif splits[2] == 'TIME' then - effect['Required']['Time'] = {} - effect['Required']['Time']['1'] = splits[3] - elseif splits[2] == 'POPULATION' then - effect['Required']['Population'] = {} - effect['Required']['Population']['1'] = splits[3] - elseif splits[2] == 'WEALTH' then - effect['Required']['Wealth'] = effect['Required']['Wealth'] or {} - effect['Required']['Wealth'][splits[3]] = splits[4] - elseif splits[2] == 'BUILDING' then - effect['Required']['Building'] = effect['Required']['Building'] or {} - effect['Required']['Building'][splits[3]] = splits[4] - elseif splits[2] == 'SKILL' then - effect['Required']['Skill'] = effect['Required']['Skill'] or {} - effect['Required']['Skill'][splits[3]] = splits[4] - elseif splits[2] == 'CLASS' then - effect['Required']['Class'] = effect['Required']['Class'] or {} - effect['Required']['Class'][splits[3]] = splits[4] - elseif splits[2] == 'KILLS' then - effect['Required']['Kills'] = effect['Required']['Kills'] or {} - effect['Required']['Kills'][splits[3]] = splits[4] - elseif splits[2] == 'DEATHS' then - effect['Required']['Deaths'] = effect['Required']['Deaths'] or {} - effect['Required']['Deaths'][splits[3]] = splits[4] - elseif splits[2] == 'TRADES' then - effect['Required']['Trades'] = effect['Required']['Trades'] or {} - effect['Required']['Trades'][splits[3]] = splits[4] - elseif splits[2] == 'SIEGES' then - effect['Required']['Sieges'] = effect['Required']['Sieges'] or {} - effect['Required']['Sieges'][splits[3]] = splits[4] - end - elseif test == '[EFFECT_UNIT' then - effect['Unit'] = {} - local temptable = {select(2,table.unpack(splits))} - strint = '1' - for _,v in pairs(temptable) do - effect['Unit'][strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_LOCATION' then - effect['Location'] = {} - local temptable = {select(2,table.unpack(splits))} - strint = '1' - for _,v in pairs(temptable) do - effect['Location'][strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_BUILDING' then - effect['Building'] = {} - local temptable = {select(2,table.unpack(splits))} - strint = '1' - for _,v in pairs(temptable) do - effect['Building'][strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_ITEM' then - effect['Item'] = {} - local temptable = {select(2,table.unpack(splits))} - strint = '1' - for _,v in pairs(temptable) do - effect['Item'][strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_ARGUMENT' then - argnumber = splits[2] - effect['Arguments'] = tostring(effect['Arguments'] + 1) - effect['Argument'][argnumber] = {} - argument = effect['Argument'][argnumber] - elseif test == '[ARGUMENT_WEIGHTING' then - argument['Weighting'] = splits[2] - elseif test == '[ARGUMENT_EQUATION' then - argument['Equation'] = splits[2] - elseif test == '[ARGUMENT_VARIABLE' then - argument['Variable'] = splits[2] - elseif test == '[EFFECT_SCRIPT' then - effect['Scripts'] = tostring(effect['Scripts'] + 1) - effect['Script'][effect['Scripts']] = splits[2] - end - end - events[eventToken]['Effects'] = tostring(numberOfEffects) - end - return events -end \ No newline at end of file diff --git a/raw/scripts/events/requirements-check.lua b/raw/scripts/events/requirements-check.lua deleted file mode 100644 index 072ecae..0000000 --- a/raw/scripts/events/requirements-check.lua +++ /dev/null @@ -1,189 +0,0 @@ -function checkRequirements(event,effect) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - yes = true - if effect == 0 then - check = event['Required'] - else - check = event['Effect'][tostring(effect)]['Required'] - end --- check counters - if check['Counter'] and yes then - for _,i in pairs(check['Counter']) do - local x = check['Counter'][i] - if roses.GlobalTable.Counters[i] then - if tonumber(roses.GlobalTable.Counters[i]) >= tonumber(x) then - yes = true - else - yes = false - break - end - else - yes = false - break - end - end - end --- check time - if check['Time'] and yes then - local x = check['Time']['1'] - local time_played = df.global.ui.fortress_age - if time_played >= tonumber(x) then - yes = true - else - yes = false - end - end --- check wealth - if check['Wealth'] and yes then - for _,i in pairs(check['Wealth']) do - local x = check['Wealth'][i] - if df.global.ui.tasks.wealth[string.lower(i)] then - if df.global.ui.tasks.wealth[string.lower(i)] >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end - end --- check population - if check['Population'] and yes then - local x = check['Population']['1'] - local population = df.global.ui.tasks.population - if population >= tonumber(x) then - yes = true - else - yes = false - end - end --- check building - if check['Building'] and yes then - for _,i in pairs(check['Building']) do - local x = check['Building'][i] - local n = 0 - for _,y in ipairs(df.global.world.buildings.all) do - if df.building_furnacest:is_instance(y) or df.building_workshopst:is_instance(y) then - local ctype = x.custom_type - if ctype >= 0 then - if df.global.world.raws.buildings.all[ctype].code == i then - n = n+1 - end - end - end - end - if n >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end --- check class - if check['Class'] and yes then - local unitTable = roses.UnitTable - for _,i in pairs(check['Class']) do - local x = check['Class'][i] - local n = 0 - for _,y in ipairs(df.global.world.units.active) do - if dfhack.units.isCitizen(y) then - if unitTable[tostring(y.id)] then - if unitTable[tostring(y.id)]['Classes']['Current']['Name'] == i then - n = n + 1 - end - end - end - end - if n >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end --- check skill - if check['Skill'] and yes then - for _,i in pairs(check['Skill']) do - local x = check['Skill'][i] - local n = 0 - for _,y in ipairs(df.global.world.units.active) do - if dfhack.units.isCitizen(y) then - local currentSkill = dfhack.units.getEffectiveSkill(y,i) - if currentSkill >= tonumber(x) then - n = 1 - break - end - end - end - if n == 1 then - yes = true - else - yes = false - break - end - end - end --- check kills - if check['Kills'] and yes then - local kills = roses.GlobalTable.Kills - for _,i in pairs(check['Kills']) do - local x = check['Kills'][i] - if kills[i] then - if kills[i] >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end - end --- check deaths - if check['Deaths'] and yes then - local deaths = roses.GlobalTable.Deaths - for _,i in pairs(check['Deaths']) do - local x = check['Deaths'][i] - if deaths[i]['All'] then - if deaths[i]['All'] >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end - end --- check trades - if check['Trades'] and yes then - local trades = roses.GlobalTable.Trades - for _,i in pairs(check['Trades']) do - local x = check['Trades'][i] - if trades[i] then - if trades[i] >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end - end --- check sieges - if check['Sieges'] and yes then - local sieges = roses.GlobalTable.Sieges - for _,i in pairs(check['Sieges']) do - local x = check['Sieges'][i] - if sieges[i] then - if sieges[i] >= tonumber(x) then - yes = true - else - yes = false - break - end - end - end - end - return yes -end \ No newline at end of file diff --git a/raw/scripts/events/trigger.lua b/raw/scripts/events/trigger.lua deleted file mode 100644 index 0cf94e3..0000000 --- a/raw/scripts/events/trigger.lua +++ /dev/null @@ -1,39 +0,0 @@ -local utils = require 'utils' -local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - -validArgs = validArgs or utils.invert({ - 'help', - 'event', - 'force', - 'verbose', - 'forceAll' -}) -local args = utils.processArgs({...}, validArgs) - -force = false -verbose = false -forceAll = false -if args.force then force = true end -if args.verbose then verbose = true end -if args.forceAll then - force = true - forceAll = true -end - -triggered = {} -eventTable = roses.EventTable -event = args.event -if not eventTable[event] then - print('Not a valid event') - return -end -if dfhack.script_environment('functions/event').checkRequirements(event,0,verbose) or force then - triggered[0] = true - for _,i in pairs(eventTable[event].Effect) do - if dfhack.script_environment('functions/event').checkRequirements(event,tonumber(i),verbose) or forceAll then - triggered[tonumber(i)] = true - contingency = tonumber(eventTable[event].Effect[i].Contingent) or 0 - if triggered[contingency] then dfhack.script_environment('functions/event').triggerEvent(event,tonumber(i),verbose) end - end - end -end \ No newline at end of file diff --git a/raw/scripts/flow/random-plan.lua b/raw/scripts/flow/random-plan.lua deleted file mode 100644 index 3a44359..0000000 --- a/raw/scripts/flow/random-plan.lua +++ /dev/null @@ -1,169 +0,0 @@ ---flow/random-plan.lua v1.0 - -local utils = require 'utils' - -flowtypes = { -miasma = 0, -mist = 1, -mist2 = 2, -dust = 3, -lavamist = 4, -smoke = 5, -dragonfire = 6, -firebreath = 7, -web = 8, -undirectedgas = 9, -undirectedvapor = 10, -oceanwave = 11, -seafoam = 12 -} - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'location', - 'liquid', - 'flow', - 'density', - 'radius', - 'number', - 'inorganic', - 'static', - 'liquid', - 'depth', - 'offset', - 'origin', - 'plan', - 'fill', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then - print([[flow/random-plan.lua - Spawns flows/liquid with more options than built-in function following an externel txt file - arguments: - -help - print this help message - REQUIRED: - -plan filename - filename of plan to use for spawn - -unit id \ - id of the unit to use for position to spawn liquid | - -location [ # # # ] | Must have one and only one of these arguments, if both, ignore -location - x,y,z coordinates for spawn / - FOR FLOWS: - -flow TYPE - specify the flow type - valid types: - miasma - mist - mist2 - dust - lavamist - smoke - dragonfire - firebreath - web - undirectedgas - undirectedvapor - oceanwave - seafoam - -inorganic INORGANIC_TOKEN - specify the material of the flow, if applicable - examples: - IRON - RUBY - etc... - -density # - specify how dense each flow is - DEFAULT 1 - -static - sets the flow as static so that it doesn't expand - FOR LIQUIDS: - -liquid TYPE - specify the liquid type - valid types: - water - magma - -depth # - specify the depth of the liquid spawned - DEFAULT 7 - FOR BOTH: - -offset [ # # # ] - sets the x y z offset from the desired location to spawn around - DEFAULT [ 0 0 0 ] - -number # - specify the number of flows/liquids that are spawned randomly in the plan - if 0, will fill the entire plan with a flow at each location - DEFAULT 0 - -origin id or location - for use in certain file plans - examples: - flow/random-plan -plan 5x5_X.txt -unit \\UNIT_ID -flow web -inorganic STEEL -density 50 -static -origin [ \\LOCATION ] - flow/random-plan -plan spiral.txt -location [ \\LOCATION ] -liquid magma -depth 4 -number 10 - ]]) - return -end - -if not args.plan then - print('No plan file specified') - return -end - -if args.unit and tonumber(args.unit) then - target = df.unit.find(tonumber(args.unit)).pos -elseif args.location then - target = args.location -else - print('No unit or location selected') - return -end -offset = args.offset or {0,0,0} -number = args.number or 0 -depth = args.depth or 7 - -if args.origin and tonumber(args.origin) then - origin = df.unit.find(tonumber(args.origin)).pos -elseif args.origin then - origin = args.origin -end - -path = dfhack.getDFPath()..'/raw/files/'..args.plan -positions = dfhack.script_environment('functions/map').getPositionPlan(path,target,origin) - -if args.flow then - stype = args.flow - density = tonumber(args.density) or 1 - itype = args.inorganic or 0 - local snum = flowtypes[stype] - local inum = 0 - if itype ~= 0 then - inum = dfhack.matinfo.find(itype).index - end - if number == 0 then - for i,pos in ipairs(positions) do - dfhack.script_environment('functions/map').spawnFlow(pos,offset,snum,inum,density,args.static) - end - else - local rand = dfhack.random.new() - for i = 1, number, 1 do - j = rand:random(#positions) - dfhack.script_environment('functions/map').spawnFlow(positions[j],offset,snum,inum,density,args.static) - end - end -elseif args.liquid then - if args.liquid == magma then magma = true end - if number == 0 then - for i,pos in ipairs(positions) do - dfhack.script_environment('functions/map').spawnLiquid(pos,offset,depth,magma,nil,nil) - end - else - local rand = dfhack.random.new() - for i = 1, number, 1 do - j = rand:random(#positions) - dfhack.script_environment('functions/map').spawnLiquid(positions[j],offset,depth,magma,nil,nil) - end - end -else - print('Neither a flow or liquid specified, aborting.') -end \ No newline at end of file diff --git a/raw/scripts/flow/random-pos.lua b/raw/scripts/flow/random-pos.lua deleted file mode 100644 index 48f1d11..0000000 --- a/raw/scripts/flow/random-pos.lua +++ /dev/null @@ -1,160 +0,0 @@ ---flow/random-pos.lua v1.0 - -local utils = require 'utils' - -flowtypes = { -miasma = 0, -mist = 1, -mist2 = 2, -dust = 3, -lavamist = 4, -smoke = 5, -dragonfire = 6, -firebreath = 7, -web = 8, -undirectedgas = 9, -undirectedvapor = 10, -oceanwave = 11, -seafoam = 12 -} - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'location', - 'liquid', - 'flow', - 'density', - 'radius', - 'number', - 'inorganic', - 'static', - 'liquid', - 'depth', - 'circle', - 'taper', - 'offset' -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then - print([[flow/random-pos.lua - Spawns flows/liquid with more options than built-in function - arguments: - -help - print this help message - REQUIRED: - -unit id \ - id of the unit to use for position to spawn liquid | - -location [ # # # ] | Must have one and only one of these arguments, if both, ignore -location - x,y,z coordinates for spawn / - FOR FLOWS: - -flow TYPE - specify the flow type - valid types: - miasma - mist - mist2 - dust - lavamist - smoke - dragonfire - firebreath - web - undirectedgas - undirectedvapor - oceanwave - seafoam - -inorganic INORGANIC_TOKEN - specify the material of the flow, if applicable - examples: - IRON - RUBY - etc... - -radius [ # # # ] - specify the radius in x y z where the flows are spawned randomly about the unit - DEFAULT [ 0 0 0 ] - -density # - specify how dense each flow is - DEFAULT 1 - -static - sets the flow as static so that it doesn't expand - FOR LIQUIDS: - -liquid TYPE - specify the liquid type - valid types: - water - magma - -depth # - specify the depth of the liquid spawned - DEFAULT 7 - -radius [ # # # ] - sets the size of the liquid spawned in x y z coordinates - DEFAULT [ 0 0 0 ] - -circle - specify whether to spawn as a circle - -taper - specify whether to decrease depth as you move away from the center of the spawned liquid - FOR BOTH: - -offset [ # # # ] - sets the x y z offset from the desired location to spawn around - DEFAULT [ 0 0 0 ] - -number # - specify the number of flows/liquids that are spawned randomly in the radius - if 0 then the entire area is covered - DEFAULT 0 - examples: - flow/random-pos -unit \\UNIT_ID -flow firebreath -density 25 -radius [ 10 10 0 ] -number 3 - flow/random-pos -unit \\UNIT_ID -flow web -inorganic STEEL -density 10 -number 1 - flow/random-pos -location [ \\LOCATION ] -liquid magma -depth 7 -radius [ 3 3 0 ] -offset [ 0 0 1 ] -circle -taper - ]]) - return -end - -if args.unit and tonumber(args.unit) then - pos = df.unit.find(tonumber(args.unit)).pos -elseif args.location then - pos = args.location -else - print('No unit or location selected') - return -end -radius = args.radius or {0,0,0} -offset = args.offset or {0,0,0} -number = tonumber(args.number) or 0 -location = {} -location.x = pos.x + offset[1] or pos[1] + offset[1] -location.y = pos.y + offset[2] or pos[2] + offset[2] -location.z = pos.z + offset[3] or pos[3] + offset[3] -if args.flow then - stype = args.flow - density = tonumber(args.density) or 1 - itype = args.inorganic or 0 - local snum = flowtypes[stype] - local inum = 0 - if itype ~= 0 then - inum = dfhack.matinfo.find(itype).index - end - if number == 0 then - edges = dfhack.script_environment('functions/map').getEdgesPosition(location,radius) - dfhack.script_environment('functions/map').spawnFlow(edges,{0,0,0},snum,inum,density,args.static) - else - for i = 1, number, 1 do - pos = dfhack.script_environment('functions/map').getPositionLocationRandom(location,radius) - dfhack.script_environment('functions/map').spawnFlow(pos,{0,0,0},snum,inum,density,args.static) - end - end -elseif args.liquid then - if args.liquid == magma then magma = true end - if number == 0 then - edges = dfhack.script_environment('functions/map').getEdgesPosition(location,radius) - dfhack.script_environment('functions/map').spawnLiquid(edges,{0,0,0},depth,magma,args.circle,args.taper) - else - for i = 1, number, 1 do - pos = dfhack.script_environment('functions/map').getPositionLocationRandom(location,radius) - dfhack.script_environment('functions/map').spawnLiquid(pos,{0,0,0},depth,magma,nil,nil) - end - end -else - print('Neither a flow or liquid specified, aborting.') -end diff --git a/raw/scripts/flow/random-surface.lua b/raw/scripts/flow/random-surface.lua deleted file mode 100644 index a35051c..0000000 --- a/raw/scripts/flow/random-surface.lua +++ /dev/null @@ -1,151 +0,0 @@ ---flow/random-surface.lua v1.0 - -local utils = require 'utils' - -flowtypes = { -miasma = 0, -mist = 1, -mist2 = 2, -dust = 3, -lavamist = 4, -smoke = 5, -dragonfire = 6, -firebreath = 7, -web = 8, -undirectedgas = 9, -undirectedvapor = 10, -oceanwave = 11, -seafoam = 12 -} - -validArgs = validArgs or utils.invert({ - 'help', - 'flow', - 'dur', - 'density', - 'frequency', - 'number', - 'inorganic', - 'liquid', - 'static', - 'circle', - 'radius', - 'depth', - 'taper', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[flow/random-surface.lua - Create a number of flows/liquids spawned randomly on the surface every frequency for a set duration - arguments: - -help - print this help message - FOR FLOWS: - -flow TYPE - specify the flow type - valid types: - miasma - mist - mist2 - dust - lavamist - smoke - dragonfire - firebreath - web - undirectedgas - undirectedvapor - oceanwave - seafoam - -inorganic INORGANIC_TOKEN - specify the material of the flow, if applicable - examples: - IRON - RUBY - etc... - -density # - specify how dense each flow is - DEFAULT 1 - -static - sets the flow as static so that it doesn't expand - FOR LIQUIDS: - -liquid TYPE - specify the liquid type - valid types: - water - magma - -depth # - specify the depth of the liquid spawned - DEFAULT 7 - -radius [ # # # ] - sets the size of the liquid spawned in x y z coordinates - DEFAULT [ 0 0 0 ] - -circle - specify whether to spawn as a circle - -taper - specify whether to decrease depth as you move away from the center of the spawned liquid - FOR BOTH: - -dur # - specify how long the 'weather' effect lasts in in-game ticks - DEFAULT 1 - -frequency # - specify how often the flows are spawned - DEFAULT 100 - -number # - specify the number of flows that are spawned at each frequency - DEFAULT 1 - examples: - flow/random-surface -flow firebreath -density 25 -frequency 200 -number 50 -dur 7200 - flow/random-surface -flow web -inorganic GOLD -density 50 -frequency 500 -number 100 -dur 1000 - flow/random-surface -liquid magma -depth 1 -radius [ 1 1 0 ] -circle -number 50 -frequency 500 -dur 5000 - ]]) - return -end - -frequency = tonumber(args.frequency) or 100 -number = tonumber(args.number) or 1 -duration = tonumber(args.dur) or 1 - -if args.flow then - local stype = args.flow - local density = tonumber(args.density) or 1 - local itype = args.inorganic or 0 - local snum = flowtypes[stype] - local inum = 0 - if itype ~= 0 then - inum = dfhack.matinfo.find(itype).index - end - for i = 1, number, 1 do - pos = dfhack.script_environment('functions/map').getPositionRandom() - pos = dfhack.script_environment('functions/map').getPositionSurface(pos) - flow = dfhack.maps.spawnFlow(pos,snum,0,inum,density) - if args.static then flow.expanding = false end - end - if duration-frequency > 0 then - script = 'special/customweather -flow '..stype..' -number '..tostring(number)..' -frequency '..tostring(frequency)..' -density '..tostring(density) - script = script..' -dur '..tostring(duration-frequency) - if itype ~= 0 then script = script..' -inorganic '..itype end - dfhack.script_environment('persist-delay').commandDelay(frequency,script) - end -elseif args.liquid then - radius = args.radius or {0,0,0} - depth = tonumber(args.depth) or 7 - offset = {0,0,0} - if args.liquid == magma then magma = true end - for i = 1, number, 1 do - pos = dfhack.script_environment('functions/map').getPositionRandom() - pos = dfhack.script_environment('functions/map').getPositionSurface(pos) - edges = dfhack.script_environment('functions/map').getEdgesPosition(pos,radius) - dfhack.script_environment('functions/map').spawnLiquid(edges,offset,depth,magma,args.circle,args.taper) - end - if duration-frequency > 0 then - script = 'special/customweather -liquid '..args.liquid..' -number '..tostring(number)..' -frequency '..tostring(frequency)..' -depth '..tostring(depth)..' -radius [ '..table.unpack(radius)..' ]' - script = script..' -dur '..tostring(duration-frequency) - if args.circle then script = script.. ' -circle' end - if args.taper then script = script..' -taper' end - dfhack.script_environment('persist-delay').commandDelay(frequency,script) - end -else - print('Neither a flow or liquid specified, aborting.') -end \ No newline at end of file diff --git a/raw/scripts/fortbent/claspect_assign.lua b/raw/scripts/fortbent/claspect_assign.lua index d608969..2e9cd4a 100644 --- a/raw/scripts/fortbent/claspect_assign.lua +++ b/raw/scripts/fortbent/claspect_assign.lua @@ -1,43 +1,37 @@ -- Assigns claspects based on personality, attributes etc. -aspects={ - "BREATH", --1 - "LIGHT", - "TIME", - "SPACE", - "LIFE", - "HOPE", - "VOID", - "HEART", - "BLOOD", - "DOOM", - "MIND", - "RAGE"} - + +local putnamSkills=dfhack.script_environment('modtools/putnam_skills') + +local aspects=dfhack.script_environment('fortbent/claspects').aspects + +local classes=dfhack.script_environment('fortbent/claspects').classes + syndromeUtil=require('syndrome-util') rng=dfhack.random.new() function assignClaspect(unit,aspect,class) - return pcall(function() - dfhack.run_script('classes/change-class','-unit',unit.id,'-class',class..'_OF_'..aspect) - if unit.hist_figure_id then - local hist_figure=df.historical_figure.find(unit.hist_figure_id) - if hist_figure and hist_figure.info and hist_figure.info.kills then - for k,v in pairs(hist_figure.info.kills.killed_count) do - pcall(function() dfhack.run_script('classes/add-experience','-unit',unit.id,'-amount',v) end) - end + putnamSkills.assignSkillToUnit(unit,class..' of '..aspect) + if unit.hist_figure_id then + local hist_figure=df.historical_figure.find(unit.hist_figure_id) + if hist_figure and hist_figure.info and hist_figure.info.kills then + for k,v in pairs(hist_figure.info.kills.killed_count) do + local caste=df.creature_raw.find(hist_figure_info.kills.killed_race[k]).caste[hist_figure_info.kills.killed_caste[k]] + local bodySizeInfo=caste.body_size_1 + local bodySize=bodySizeInfo[#bodySizeInfo-1]/500 + local strength=caste.attributes.phys_att_range.STRENGTH[3]/1000 + local agility=caste.attributes.phys_att_range.AGILITY[3]/1000 + local toughness=caste.attributes.phys_att_range.TOUGHNESS[3]/1000 + local endurance=caste.attributes.phys_att_range.ENDURANCE[3]/1000 + local willpower=caste.attributes.ment_att_range.WILLPOWER[3]/1500 + local spatial_sense=caste.attributes.ment_att_range.SPATIAL_SENSE[3]/1000 + local kinesthetic_sense=caste.attributes.ment_att_range.KINESTHETIC_SENSE[3]/1000 + local focus=caste.attributes.ment_att_range.FOCUS[3]/2000 + putnamSkills.addExperienceToAllSkillsWithLevelCriterion(unit,v*(bodySize+strength+agility+toughness+endurance+willpower+spatial_sense+kinesthetic_sense+focus),'sburb') end end - end) -end - -function unitAlreadyHasClaspect(unit) - for k,c_syn in ipairs(unit.syndromes.active) do - for kk,syn_class in ipairs(df.syndrome.find(c_syn.type).syn_class) do - if syn_class.value=='IS_SBURBED' then return true end - end - end - return false + end + return unit,class..' of '..aspect end debugScript=false @@ -59,7 +53,7 @@ function creatureIsSburbable(unit) end function unitDoesntNeedClaspect(unit) - return not creatureIsSburbable(unit) or unitAlreadyHasClaspect(unit) + return not creatureIsSburbable(unit) or putnamSkills.getSkillsFromUnit(unit) end function round(num) @@ -74,20 +68,20 @@ function getClass(unit) local passive=50-active local male_lean=unit.sex==0 and 0 or 20 local female_lean=unit.sex==1 and 20 or 0 - local male_exclusive=unit.sex==0 and 0 or 1 - local female_exclusive=unit.sex==1 and 0 or 1 - class_pers.HEIR=passive+round(traits.PERSEVERENCE/2)+male_lean --Equius demands things insistently and John follows instructions even when he thinks they're dumb. - class_pers.SEER=passive+round(traits.CURIOUS/2)+female_lean - class_pers.KNIGHT=active+round(traits.BRAVERY/2)+male_lean --Based more on the archetype of knight than the knights we've seen (Latula, Karkat, Dave) - class_pers.WITCH=(active+round(traits.CHEER_PROPENSITY/2)+20)*female_exclusive --Damara was a happy girl before Meenah broke her, Jade and Feferi need no introduction. - class_pers.MAID=(active+round(traits.GREGARIOUSNESS/2)+20)*female_exclusive --yeah this one's a bit of a stretch but whatever - class_pers.PAGE=passive+math.abs(50-traits.CONFIDENCE)+male_lean --50-trait means that it'll weigh it both if they're confident and underconfident. - class_pers.PRINCE=(active+math.abs(50-traits.VIOLENT)+20)*male_exclusive --destroy, violent, meh - class_pers.ROGUE=passive+round(traits.FRIENDLINESS/2)+female_lean --rufioh, nepeta, roxy; yeah, friendliness is a constant there - class_pers.THIEF=active+round(traits.GREED/2)+female_lean - class_pers.SYLPH=passive+round(traits.ALTRUISM/2)+female_lean - class_pers.BARD=(passive+round(traits.CRUELTY/2)+20)*male_exclusive --okay that might be a bit inappropriate, but you gotta work with what you have... - class_pers.MAGE=active+round(traits.ABSTRACT_INCLINED/2)+male_lean + local male_exclusive=unit.sex==0 and 0.5 or 1 + local female_exclusive=unit.sex==1 and 0.5 or 1 + class_pers.Heir=passive+round(traits.PERSEVERENCE/2)+male_lean --Equius demands things insistently and John follows instructions even when he thinks they're dumb. + class_pers.Seer=passive+round(traits.CURIOUS/2)+female_lean + class_pers.Knight=active+round(traits.BRAVERY/2)+male_lean --Based more on the archetype of knight than the knights we've seen (Latula, Karkat, Dave) + class_pers.Witch=(active+round(traits.CHEER_PROPENSITY/2)+20)*female_exclusive --Damara was a happy girl before Meenah broke her, Jade and Feferi need no introduction. + class_pers.Maid=(active+round(traits.GREGARIOUSNESS/2)+20)*female_exclusive --yeah this one's a bit of a stretch but whatever + class_pers.Page=passive+math.abs(50-traits.CONFIDENCE)+male_lean --50-trait means that it'll weigh it both if they're confident and underconfident. + class_pers.Prince=(active+math.abs(50-traits.VIOLENT)+20)*male_exclusive --destroy, violent, meh + class_pers.Rogue=passive+round(traits.FRIENDLINESS/2)+female_lean --rufioh, nepeta, roxy; yeah, friendliness is a constant there + class_pers.Thief=active+round(traits.GREED/2)+female_lean + class_pers.Sylph=passive+round(traits.ALTRUISM/2)+female_lean + class_pers.Bard=(passive+round(traits.CRUELTY/2)+20)*male_exclusive --okay that might be a bit inappropriate, but you gotta work with what you have... + class_pers.Mage=active+round(traits.ABSTRACT_INCLINED/2)+male_lean --wow look at that I actually managed 6 active and 6 passive classes local total_weight=0 for k,v in pairs(class_pers) do @@ -110,7 +104,6 @@ function makeClaspect(unit,unitidx) local creatureAspect = rng:random(12)+1 local aspect=aspects[creatureAspect] local class=getClass(unit) - aspect=type(aspect)=='string' and aspect or type(aspect)=='table' and aspect.text or 'LIGHT' --light default local worked,err=assignClaspect(unit,aspect,class) if worked then return creatureAspect @@ -142,4 +135,4 @@ function assignAllClaspects() end end -require('repeat-util').scheduleUnlessAlreadyScheduled('Claspect Assignment',28,'days',assignAllClaspects) \ No newline at end of file +require('repeat-util').scheduleUnlessAlreadyScheduled('Claspect Assignment',100,'ticks',assignAllClaspects) \ No newline at end of file diff --git a/raw/scripts/fortbent/claspects.lua b/raw/scripts/fortbent/claspects.lua index a7ddf6d..3c48ea4 100644 --- a/raw/scripts/fortbent/claspects.lua +++ b/raw/scripts/fortbent/claspects.lua @@ -3,30 +3,30 @@ -- You can use lua files as data files! aspects={ - "BREATH", --1 - "LIGHT", - "TIME", - "SPACE", - "LIFE", - "HOPE", - "VOID", - "HEART", - "BLOOD", - "DOOM", - "MIND", - "RAGE"} + "Breath", --1 + "Light", + "Time", + "Space", + "Life", + "Hope", + "Void", + "Heart", + "Blood", + "Doom", + "Mind", + "Rage"} classes={ - "HEIR", --1 - "SEER", - "KNIGHT", - "WITCH", - "MAID", - "PAGE", - "PRINCE", - "ROGUE", - "THIEF", - "SYLPH", - "BARD", - "MAGE"} \ No newline at end of file + "Heir", --1 + "Seer", + "Knight", + "Witch", + "Maid", + "Page", + "Prince", + "Rogue", + "Thief", + "Sylph", + "Bard", + "Mage"} \ No newline at end of file diff --git a/raw/scripts/fortbent/classes.lua b/raw/scripts/fortbent/classes.lua new file mode 100644 index 0000000..47011ca --- /dev/null +++ b/raw/scripts/fortbent/classes.lua @@ -0,0 +1,2210 @@ +local claspectNames=dfhack.script_environment('fortbent/claspects') + +local claspects={} + +for k,aspect in ipairs(claspectNames.aspects) do + for kk,class in ipairs(claspectNames.classes) do + local claspectString=class..' of '..aspect + claspects[claspectString]={ + name=claspectString, + syndromes={{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}}, + skills={{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}}, + attributes={{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}} + } + local claspect=claspects[claspectString] + table.insert(claspect.syndromes[6],'FRAYMOTIF') + table.insert(claspect.syndromes[10],'CAN_GO_GOD_TIER') + claspect.levelUpThresholds={100,300,500,700,900,1100,1300,1500,1700,1900,2100,2300,2500,2700,2900} --believe it or not, 1-indexed shit is helpful here + claspect.experienceCriteria={'sburb'} + end + claspects['Page of '..aspect].levelUpThresholds={100,200,400,700,1100,1600,2200,2900,3700,4800,5800,6900,8100,9400,10800} +end + +--jesus christ how horrifying +table.insert(claspects['Heir of Breath'].syndromes[1],'WINDY_BULLET_I') +table.insert(claspects['Heir of Breath'].syndromes[2],'WINDY_BULLET_II') +table.insert(claspects['Heir of Breath'].syndromes[3],'WINDY_BULLET_III') +table.insert(claspects['Heir of Breath'].syndromes[4],'WINDY_BULLET_IV') +table.insert(claspects['Heir of Breath'].syndromes[5],'WINDY_DELAY_I') +table.insert(claspects['Heir of Breath'].syndromes[6],'WINDY_BULLET_V') +table.insert(claspects['Heir of Breath'].syndromes[7],'WINDY_DELAY_II') +table.insert(claspects['Heir of Breath'].syndromes[8],'WINDY_HASTE_II') +table.insert(claspects['Heir of Breath'].syndromes[9],'WINDY_DELAY_III') +table.insert(claspects['Heir of Breath'].syndromes[10],'WINDY_HASTE_III') +table.insert(claspects['Seer of Breath'].attributes[2],{name='INTUITION', bonus=500}) +table.insert(claspects['Seer of Breath'].attributes[3],{name='INTUITION', bonus=250}) +table.insert(claspects['Seer of Breath'].attributes[4],{name='INTUITION', bonus=250}) +table.insert(claspects['Seer of Breath'].attributes[6],{name='INTUITION', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[8],{name='INTUITION', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[10],{name='INTUITION', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[11],{name='INTUITION', bonus=6000}) +table.insert(claspects['Seer of Breath'].attributes[2],{name='FOCUS', bonus=500}) +table.insert(claspects['Seer of Breath'].attributes[3],{name='FOCUS', bonus=250}) +table.insert(claspects['Seer of Breath'].attributes[4],{name='FOCUS', bonus=250}) +table.insert(claspects['Seer of Breath'].attributes[5],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[7],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[9],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Breath'].attributes[11],{name='FOCUS', bonus=6000}) +table.insert(claspects['Seer of Breath'].syndromes[6],'WINDY_BULLET_II') +table.insert(claspects['Seer of Breath'].syndromes[8],'WINDY_BULLET_IV') +table.insert(claspects['Seer of Breath'].syndromes[10],'WINDY_BULLET_V') +table.insert(claspects['Knight of Breath'].syndromes[1],'WINDY_BULLET_I') +table.insert(claspects['Knight of Breath'].syndromes[2],'WINDY_BULLET_II') +table.insert(claspects['Knight of Breath'].syndromes[3],'WINDY_BULLET_III') +table.insert(claspects['Knight of Breath'].syndromes[4],'WINDY_BULLET_IV') +table.insert(claspects['Knight of Breath'].syndromes[5],'WINDY_DELAY_I') +table.insert(claspects['Knight of Breath'].syndromes[6],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Knight of Breath'].syndromes[7],'WINDY_BULLET_V') +table.insert(claspects['Knight of Breath'].syndromes[8],'WINDY_DELAY_II') +table.insert(claspects['Knight of Breath'].syndromes[9],'WINDY_DELAY_III') +table.insert(claspects['Knight of Breath'].syndromes[10],'WINDY_DELAY_IV') +table.insert(claspects['Witch of Breath'].syndromes[1],'WINDY_BULLET_I') +table.insert(claspects['Witch of Breath'].syndromes[2],'WINDY_BULLET_II') +table.insert(claspects['Witch of Breath'].syndromes[3],'WINDY_BULLET_III') +table.insert(claspects['Witch of Breath'].syndromes[4],'WINDY_BULLET_IV') +table.insert(claspects['Witch of Breath'].syndromes[5],'WINDY_DELAY_I') +table.insert(claspects['Witch of Breath'].syndromes[6],'WINDY_BULLET_V') +table.insert(claspects['Witch of Breath'].syndromes[7],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Witch of Breath'].syndromes[8],'WINDY_DELAY_III') +table.insert(claspects['Witch of Breath'].syndromes[9],'WINDY_DELAY_IV') +table.insert(claspects['Witch of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Maid of Breath'].syndromes[1],'WINDY_DELAY_I') +table.insert(claspects['Maid of Breath'].syndromes[2],'WINDY_DELAY_II') +table.insert(claspects['Maid of Breath'].syndromes[3],'WINDY_BULLET_I') +table.insert(claspects['Maid of Breath'].syndromes[4],'WINDY_BULLET_II') +table.insert(claspects['Maid of Breath'].syndromes[5],'WINDY_DELAY_III') +table.insert(claspects['Maid of Breath'].syndromes[6],'WINDY_BULLET_III') +table.insert(claspects['Maid of Breath'].syndromes[7],'WINDY_BULLET_IV') +table.insert(claspects['Maid of Breath'].syndromes[8],'WINDY_DELAY_IV') +table.insert(claspects['Maid of Breath'].syndromes[9],'WINDY_BULLET_V') +table.insert(claspects['Maid of Breath'].syndromes[10],'BREATH_EXPLODE_A_BODY_I') +table.insert(claspects['Page of Breath'].syndromes[1],'WINDY_DELAY_I') +table.insert(claspects['Page of Breath'].syndromes[3],'WINDY_BULLET_I') +table.insert(claspects['Page of Breath'].syndromes[5],'WINDY_DELAY_II') +table.insert(claspects['Page of Breath'].syndromes[6],'WINDY_BULLET_II') +table.insert(claspects['Page of Breath'].syndromes[6],'WINDY_DELAY_III') +table.insert(claspects['Page of Breath'].syndromes[7],'WINDY_BULLET_III') +table.insert(claspects['Page of Breath'].syndromes[8],'WINDY_HASTE_IV') +table.insert(claspects['Page of Breath'].syndromes[8],'WINDY_BULLET_IV') +table.insert(claspects['Page of Breath'].syndromes[8],'BREATH_EXPLODE_A_BODY_I') +table.insert(claspects['Page of Breath'].syndromes[9],'WINDY_BULLET_V') +table.insert(claspects['Page of Breath'].syndromes[9],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Page of Breath'].syndromes[10],'BREATH_EXPLODE_A_BODY_I') +table.insert(claspects['Page of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Prince of Breath'].syndromes[1],'WINDY_BULLET_I') +table.insert(claspects['Prince of Breath'].syndromes[2],'WINDY_BULLET_II') +table.insert(claspects['Prince of Breath'].syndromes[3],'WINDY_BULLET_III') +table.insert(claspects['Prince of Breath'].syndromes[4],'WINDY_BULLET_IV') +table.insert(claspects['Prince of Breath'].syndromes[5],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Prince of Breath'].syndromes[6],'WINDY_BULLET_V') +table.insert(claspects['Prince of Breath'].syndromes[7],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Prince of Breath'].syndromes[8],'BREATH_EXPLODE_A_BODY_I') +table.insert(claspects['Prince of Breath'].syndromes[9],'BREATH_EXPLODE_A_BODY_II') +table.insert(claspects['Prince of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_III') +table.insert(claspects['Rogue of Breath'].syndromes[1],'WINDY_DELAY_I') +table.insert(claspects['Rogue of Breath'].syndromes[2],'WINDY_HASTE_I') +table.insert(claspects['Rogue of Breath'].syndromes[3],'WINDY_DELAY_II') +table.insert(claspects['Rogue of Breath'].syndromes[4],'WINDY_HASTE_II') +table.insert(claspects['Rogue of Breath'].syndromes[5],'WINDY_DELAY_III') +table.insert(claspects['Rogue of Breath'].syndromes[6],'WINDY_BULLET_III') +table.insert(claspects['Rogue of Breath'].syndromes[7],'WINDY_HASTE_III') +table.insert(claspects['Rogue of Breath'].syndromes[8],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Rogue of Breath'].syndromes[9],'TELEPORT') +table.insert(claspects['Rogue of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Thief of Breath'].syndromes[1],'WINDY_DELAY_I') +table.insert(claspects['Thief of Breath'].syndromes[2],'WINDY_BULLET_I') +table.insert(claspects['Thief of Breath'].syndromes[3],'WINDY_DELAY_II') +table.insert(claspects['Thief of Breath'].syndromes[4],'WINDY_BULLET_II') +table.insert(claspects['Thief of Breath'].syndromes[5],'WINDY_DELAY_III') +table.insert(claspects['Thief of Breath'].syndromes[6],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Thief of Breath'].syndromes[7],'WINDY_BULLET_III') +table.insert(claspects['Thief of Breath'].syndromes[8],'WINDY_BULLET_IV') +table.insert(claspects['Thief of Breath'].syndromes[9],'WINDY_BULLET_V') +table.insert(claspects['Thief of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Sylph of Breath'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Breath'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Breath'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Breath'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Breath'].syndromes[7],'PREVENT_SUFFOCATION') +table.insert(claspects['Sylph of Breath'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Sylph of Breath'].attributes[2],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Breath'].attributes[3],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Breath'].attributes[9],{name='FOCUS', bonus=3000}) +table.insert(claspects['Sylph of Breath'].attributes[11],{name='FOCUS', bonus=5000}) +table.insert(claspects['Bard of Breath'].syndromes[1],'WINDY_DELAY_I') +table.insert(claspects['Bard of Breath'].syndromes[2],'WINDY_HASTE_I') +table.insert(claspects['Bard of Breath'].syndromes[3],'WINDY_DELAY_II') +table.insert(claspects['Bard of Breath'].syndromes[4],'WINDY_HASTE_II') +table.insert(claspects['Bard of Breath'].syndromes[5],'WINDY_DELAY_III') +table.insert(claspects['Bard of Breath'].syndromes[6],'WINDY_BULLET_III') +table.insert(claspects['Bard of Breath'].syndromes[7],'WINDY_HASTE_III') +table.insert(claspects['Bard of Breath'].syndromes[8],'BREATH_RENDER_BREATHLESS_I') +table.insert(claspects['Bard of Breath'].syndromes[9],'BREATH_EXPLODE_A_BODY_I') +table.insert(claspects['Bard of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Mage of Breath'].attributes[2],{name='INTUITION', bonus=500}) +table.insert(claspects['Mage of Breath'].attributes[3],{name='INTUITION', bonus=250}) +table.insert(claspects['Mage of Breath'].attributes[4],{name='INTUITION', bonus=250}) +table.insert(claspects['Mage of Breath'].attributes[6],{name='INTUITION', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[8],{name='INTUITION', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[10],{name='INTUITION', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[11],{name='INTUITION', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[2],{name='FOCUS', bonus=500}) +table.insert(claspects['Mage of Breath'].attributes[3],{name='FOCUS', bonus=250}) +table.insert(claspects['Mage of Breath'].attributes[4],{name='FOCUS', bonus=250}) +table.insert(claspects['Mage of Breath'].attributes[5],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[7],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[9],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Breath'].attributes[11],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Breath'].syndromes[6],'WINDY_BULLET_II') +table.insert(claspects['Mage of Breath'].syndromes[8],'WINDY_BULLET_IV') +table.insert(claspects['Mage of Breath'].syndromes[10],'WINDY_BULLET_V') +table.insert(claspects['Mage of Breath'].syndromes[10],'BREATH_RENDER_BREATHLESS_II') +table.insert(claspects['Heir of Light'].attributes[11],{name='ANALYTICAL_ABILITY', bonus=10000}) +table.insert(claspects['Heir of Light'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=2400}) +table.insert(claspects['Heir of Light'].syndromes[1],'INCREASE_LUCK_I') +table.insert(claspects['Heir of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Heir of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Heir of Light'].syndromes[4],'TEMPORARY_BLIND_I') +table.insert(claspects['Heir of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Heir of Light'].syndromes[6],'INCREASE_LUCK_II') +table.insert(claspects['Heir of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Heir of Light'].syndromes[8],'TEMPORARY_BLIND_II') +table.insert(claspects['Heir of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Seer of Light'].attributes[2],{name='ANALYTICAL_ABILITY', bonus=500}) +table.insert(claspects['Seer of Light'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Seer of Light'].attributes[4],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Seer of Light'].attributes[5],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Seer of Light'].attributes[8],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Seer of Light'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Seer of Light'].attributes[10],{name='ANALYTICAL_ABILITY', bonus=5000}) +table.insert(claspects['Seer of Light'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Light'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Light'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Light'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Light'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Light'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Light'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Light'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Light'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=900}) +table.insert(claspects['Seer of Light'].syndromes[5],'TEMPORARY_BLIND_I') +table.insert(claspects['Seer of Light'].syndromes[6],'INCREASE_LUCK_II') +table.insert(claspects['Seer of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Seer of Light'].syndromes[8],'TEMPORARY_BLIND_II') +table.insert(claspects['Seer of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Knight of Light'].syndromes[1],'INCREASE_LUCK_I') +table.insert(claspects['Knight of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Knight of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Knight of Light'].syndromes[4],'TEMPORARY_BLIND_I') +table.insert(claspects['Knight of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Knight of Light'].syndromes[6],'INCREASE_LUCK_II') +table.insert(claspects['Knight of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Knight of Light'].syndromes[8],'TEMPORARY_BLIND_II') +table.insert(claspects['Knight of Light'].syndromes[9],'PERMANENT_BLIND_II') +table.insert(claspects['Knight of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Witch of Light'].syndromes[1],'TEMPORARY_BLIND_I') +table.insert(claspects['Witch of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Witch of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Witch of Light'].syndromes[4],'TEMPORARY_BLIND_II') +table.insert(claspects['Witch of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Witch of Light'].syndromes[6],'INCREASE_LUCK_II') +table.insert(claspects['Witch of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Witch of Light'].syndromes[8],'TEMPORARY_BLIND_III') +table.insert(claspects['Witch of Light'].syndromes[9],'PERMANENT_BLIND_II') +table.insert(claspects['Witch of Light'].syndromes[10],'PERMANENT_BLIND_III') +table.insert(claspects['Maid of Light'].attributes[10],{name='ANALYTICAL_ABILITY', bonus=10000}) +table.insert(claspects['Maid of Light'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=2400}) +table.insert(claspects['Maid of Light'].syndromes[2],'INCREASE_LUCK_I') +table.insert(claspects['Maid of Light'].syndromes[1],'DECREASE_LUCK_I') +table.insert(claspects['Maid of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Maid of Light'].syndromes[4],'TEMPORARY_BLIND_I') +table.insert(claspects['Maid of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Maid of Light'].syndromes[6],'PERMANENT_BLIND_I') +table.insert(claspects['Maid of Light'].syndromes[7],'TEMPORARY_BLIND_II') +table.insert(claspects['Maid of Light'].syndromes[8],'TEMPORARY_BLIND_III') +table.insert(claspects['Maid of Light'].syndromes[9],'PERMANENT_BLIND_III') +table.insert(claspects['Maid of Light'].syndromes[10],'DECREASE_LUCK_IV') +table.insert(claspects['Page of Light'].syndromes[3],'INCREASE_LUCK_I') +table.insert(claspects['Page of Light'].syndromes[3],'DECREASE_LUCK_I') +table.insert(claspects['Page of Light'].syndromes[4],'DECREASE_LUCK_II') +table.insert(claspects['Page of Light'].syndromes[5],'TEMPORARY_BLIND_I') +table.insert(claspects['Page of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Page of Light'].syndromes[7],'INCREASE_LUCK_II') +table.insert(claspects['Page of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Page of Light'].syndromes[8],'TEMPORARY_BLIND_II') +table.insert(claspects['Page of Light'].syndromes[9],'PERMANENT_BLIND_II') +table.insert(claspects['Page of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Page of Light'].syndromes[10],'PERMANENT_BLIND_III') +table.insert(claspects['Page of Light'].syndromes[10],'DECREASE_LUCK_IV') +table.insert(claspects['Page of Light'].syndromes[10],'TEMPORARY_BLIND_III') +table.insert(claspects['Prince of Light'].syndromes[1],'LIGHT_SEE_CREATURES') +table.insert(claspects['Prince of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Prince of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Prince of Light'].syndromes[4],'TEMPORARY_BLIND_I') +table.insert(claspects['Prince of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Prince of Light'].syndromes[6],'TEMPORARY_BLIND_II') +table.insert(claspects['Prince of Light'].syndromes[6],'PERMANENT_BLIND_I') +table.insert(claspects['Prince of Light'].syndromes[7],'PERMANENT_BLIND_II') +table.insert(claspects['Prince of Light'].syndromes[8],'TEMPORARY_BLIND_III') +table.insert(claspects['Prince of Light'].syndromes[9],'PERMANENT_BLIND_III') +table.insert(claspects['Prince of Light'].syndromes[10],'DECREASE_LUCK_IV') +table.insert(claspects['Rogue of Light'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=10000}) +table.insert(claspects['Rogue of Light'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=1900}) +table.insert(claspects['Rogue of Light'].syndromes[1],'INCREASE_LUCK_I') +table.insert(claspects['Rogue of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Rogue of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Rogue of Light'].syndromes[4],'INCREASE_LUCK_II') +table.insert(claspects['Rogue of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Rogue of Light'].syndromes[6],'INCREASE_LUCK_III') +table.insert(claspects['Rogue of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Rogue of Light'].syndromes[9],'DECREASE_LUCK_IV') +table.insert(claspects['Rogue of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Thief of Light'].syndromes[1],'DECREASE_LUCK_I') +table.insert(claspects['Thief of Light'].syndromes[2],'INCREASE_LUCK_I') +table.insert(claspects['Thief of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Thief of Light'].syndromes[4],'INCREASE_LUCK_II') +table.insert(claspects['Thief of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Thief of Light'].syndromes[6],'INCREASE_LUCK_III') +table.insert(claspects['Thief of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Thief of Light'].syndromes[8],'PERMANENT_BLIND_I') +table.insert(claspects['Thief of Light'].syndromes[9],'DECREASE_LUCK_IV') +table.insert(claspects['Thief of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Sylph of Light'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Light'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Light'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Light'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Light'].syndromes[7],'GIVE_VISION') +table.insert(claspects['Sylph of Light'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Sylph of Light'].attributes[2],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Light'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Light'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=3000}) +table.insert(claspects['Sylph of Light'].attributes[11],{name='ANALYTICAL_ABILITY', bonus=5000}) +table.insert(claspects['Bard of Light'].syndromes[1],'LIGHT_SEE_CREATURES') +table.insert(claspects['Bard of Light'].syndromes[2],'DECREASE_LUCK_I') +table.insert(claspects['Bard of Light'].syndromes[3],'DECREASE_LUCK_II') +table.insert(claspects['Bard of Light'].syndromes[4],'TEMPORARY_BLIND_I') +table.insert(claspects['Bard of Light'].syndromes[5],'DECREASE_LUCK_III') +table.insert(claspects['Bard of Light'].syndromes[6],'TEMPORARY_BLIND_II') +table.insert(claspects['Bard of Light'].syndromes[6],'PERMANENT_BLIND_I') +table.insert(claspects['Bard of Light'].syndromes[7],'PERMANENT_BLIND_II') +table.insert(claspects['Bard of Light'].syndromes[8],'TEMPORARY_BLIND_III') +table.insert(claspects['Bard of Light'].syndromes[9],'PERMANENT_BLIND_III') +table.insert(claspects['Bard of Light'].syndromes[10],'DECREASE_LUCK_IV') +table.insert(claspects['Mage of Light'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Light'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Light'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Light'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Light'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Light'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Light'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Light'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Light'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=900}) +table.insert(claspects['Mage of Light'].syndromes[3],'DECREASE_LUCK_I') +table.insert(claspects['Mage of Light'].syndromes[4],'DECREASE_LUCK_II') +table.insert(claspects['Mage of Light'].syndromes[5],'TEMPORARY_BLIND_I') +table.insert(claspects['Mage of Light'].syndromes[6],'INCREASE_LUCK_II') +table.insert(claspects['Mage of Light'].syndromes[7],'INCREASE_LUCK_III') +table.insert(claspects['Mage of Light'].syndromes[8],'TEMPORARY_BLIND_II') +table.insert(claspects['Mage of Light'].syndromes[10],'INCREASE_LUCK_IV') +table.insert(claspects['Heir of Time'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Heir of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Heir of Time'].skills[7],{name='DODGING', bonus=600}) +table.insert(claspects['Heir of Time'].skills[8],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Time'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Heir of Time'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Heir of Time'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Heir of Time'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Heir of Time'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Heir of Time'].syndromes[3],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Heir of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Heir of Time'].syndromes[5],'TIME_SPEED_UP_FRIEND_I') +table.insert(claspects['Heir of Time'].syndromes[9],'TIME_SPEED_UP_FRIEND_II') +table.insert(claspects['Heir of Time'].syndromes[10],'TIME_SPEED_UP_FRIEND_III') +table.insert(claspects['Seer of Time'].skills[2],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Time'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Time'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Time'].skills[5],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Time'].skills[7],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Time'].skills[8],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Time'].skills[9],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Time'].skills[10],{name='DODGING', bonus=900}) +table.insert(claspects['Seer of Time'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Time'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Time'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Time'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Time'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Seer of Time'].syndromes[5],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Seer of Time'].syndromes[9],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Seer of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Knight of Time'].attributes[2],{name='AGILITY', bonus=1000}) +table.insert(claspects['Knight of Time'].attributes[3],{name='AGILITY', bonus=1000}) +table.insert(claspects['Knight of Time'].attributes[4],{name='AGILITY', bonus=2000}) +table.insert(claspects['Knight of Time'].attributes[5],{name='AGILITY', bonus=1000}) +table.insert(claspects['Knight of Time'].attributes[6],{name='AGILITY', bonus=5000}) +table.insert(claspects['Knight of Time'].attributes[8],{name='AGILITY', bonus=10000}) +table.insert(claspects['Knight of Time'].attributes[9],{name='AGILITY', bonus=20000}) +table.insert(claspects['Knight of Time'].attributes[10],{name='AGILITY', bonus=60000}) +table.insert(claspects['Knight of Time'].skills[6],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Knight of Time'].skills[7],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Time'].skills[11],{name='MELEE_COMBAT', bonus=900}) +table.insert(claspects['Knight of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Knight of Time'].syndromes[5],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Knight of Time'].syndromes[6],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Knight of Time'].syndromes[7],'TELEPORT') +table.insert(claspects['Knight of Time'].syndromes[9],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Knight of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Witch of Time'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Witch of Time'].syndromes[2],'TIME_SPEED_UP_FRIEND_I') +table.insert(claspects['Witch of Time'].syndromes[3],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Witch of Time'].syndromes[4],'TIME_SPEED_UP_FRIEND_II') +table.insert(claspects['Witch of Time'].syndromes[5],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Witch of Time'].syndromes[6],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Witch of Time'].syndromes[7],'TIME_SPEED_UP_FRIEND_III') +table.insert(claspects['Witch of Time'].syndromes[8],'TELEPORT') +table.insert(claspects['Witch of Time'].syndromes[9],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Witch of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Maid of Time'].attributes[2],{name='AGILITY', bonus=1000}) +table.insert(claspects['Maid of Time'].attributes[3],{name='AGILITY', bonus=1000}) +table.insert(claspects['Maid of Time'].attributes[4],{name='AGILITY', bonus=2000}) +table.insert(claspects['Maid of Time'].attributes[5],{name='AGILITY', bonus=1000}) +table.insert(claspects['Maid of Time'].attributes[6],{name='AGILITY', bonus=5000}) +table.insert(claspects['Maid of Time'].attributes[8],{name='AGILITY', bonus=10000}) +table.insert(claspects['Maid of Time'].attributes[9],{name='AGILITY', bonus=20000}) +table.insert(claspects['Maid of Time'].attributes[10],{name='AGILITY', bonus=60000}) +table.insert(claspects['Maid of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Maid of Time'].skills[7],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Time'].skills[11],{name='DODGING', bonus=900}) +table.insert(claspects['Maid of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Maid of Time'].syndromes[5],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Maid of Time'].syndromes[6],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Maid of Time'].syndromes[9],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Maid of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Page of Time'].syndromes[2],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Page of Time'].syndromes[4],'TIME_SPEED_UP_FRIEND_I') +table.insert(claspects['Page of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Page of Time'].syndromes[6],'TIME_SPEED_UP_FRIEND_II') +table.insert(claspects['Page of Time'].syndromes[6],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Page of Time'].syndromes[8],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Page of Time'].syndromes[8],'TIME_SPEED_UP_FRIEND_III') +table.insert(claspects['Page of Time'].syndromes[8],'TELEPORT') +table.insert(claspects['Page of Time'].syndromes[8],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Page of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Page of Time'].syndromes[10],'TIME_AGE_ENEMIES_PAGE') +table.insert(claspects['Prince of Time'].syndromes[1],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Prince of Time'].syndromes[2],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Prince of Time'].syndromes[3],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Prince of Time'].syndromes[4],'TIME_AGE_ENEMIES_I') +table.insert(claspects['Prince of Time'].syndromes[5],'TIME_AGE_ENEMIES_II') +table.insert(claspects['Prince of Time'].syndromes[7],'TELEPORT') +table.insert(claspects['Prince of Time'].syndromes[7],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Prince of Time'].syndromes[8],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Prince of Time'].syndromes[9],'TIME_AGE_ENEMIES_III') +table.insert(claspects['Prince of Time'].syndromes[10],'TIME_SPEED_UP_SELF') +table.insert(claspects['Rogue of Time'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Rogue of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Rogue of Time'].skills[7],{name='DODGING', bonus=600}) +table.insert(claspects['Rogue of Time'].skills[8],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Time'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Rogue of Time'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Rogue of Time'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Rogue of Time'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Rogue of Time'].syndromes[1],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Rogue of Time'].syndromes[2],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Rogue of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Rogue of Time'].syndromes[5],'TIME_SPEED_UP_FRIEND_I') +table.insert(claspects['Rogue of Time'].syndromes[9],'TIME_SPEED_UP_FRIEND_II') +table.insert(claspects['Rogue of Time'].syndromes[10],'TIME_SPEED_UP_FRIEND_III') +table.insert(claspects['Thief of Time'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Thief of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Thief of Time'].skills[7],{name='DODGING', bonus=600}) +table.insert(claspects['Thief of Time'].skills[8],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Time'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Thief of Time'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Thief of Time'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Thief of Time'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Thief of Time'].syndromes[1],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Thief of Time'].syndromes[2],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Thief of Time'].syndromes[4],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Thief of Time'].syndromes[5],'TIME_SPEED_UP_FRIEND_I') +table.insert(claspects['Thief of Time'].syndromes[9],'TIME_SPEED_UP_FRIEND_II') +table.insert(claspects['Thief of Time'].syndromes[10],'TIME_SPEED_UP_SELF') +table.insert(claspects['Sylph of Time'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Time'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Time'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Time'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Time'].syndromes[8],'TIME_AGE_DOWN') +table.insert(claspects['Sylph of Time'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Sylph of Time'].attributes[2],{name='AGILITY', bonus=1000}) +table.insert(claspects['Sylph of Time'].attributes[3],{name='AGILITY', bonus=1000}) +table.insert(claspects['Sylph of Time'].attributes[9],{name='AGILITY', bonus=3000}) +table.insert(claspects['Sylph of Time'].attributes[11],{name='AGILITY', bonus=5000}) +table.insert(claspects['Bard of Time'].syndromes[1],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Bard of Time'].syndromes[2],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Bard of Time'].syndromes[3],'TIME_SLOW_DOWN_ENEMY_III') +table.insert(claspects['Bard of Time'].syndromes[4],'TIME_AGE_ENEMIES_I') +table.insert(claspects['Bard of Time'].syndromes[5],'TIME_AGE_ENEMIES_II') +table.insert(claspects['Bard of Time'].syndromes[7],'TIME_SPEED_UP_SELF') +table.insert(claspects['Bard of Time'].syndromes[7],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Bard of Time'].syndromes[8],'TIME_SLOW_DOWN_ENEMY_V') +table.insert(claspects['Bard of Time'].syndromes[9],'TIME_AGE_ENEMIES_III') +table.insert(claspects['Bard of Time'].syndromes[10],'TELEPORT') +table.insert(claspects['Mage of Time'].skills[2],{name='DODGING', bonus=500}) +table.insert(claspects['Mage of Time'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Mage of Time'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Time'].skills[5],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Time'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Time'].skills[9],{name='DODGING', bonus=500}) +table.insert(claspects['Mage of Time'].skills[10],{name='DODGING', bonus=500}) +table.insert(claspects['Mage of Time'].skills[11],{name='DODGING', bonus=900}) +table.insert(claspects['Mage of Time'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Time'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Time'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Time'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Time'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Time'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Time'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Time'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Mage of Time'].syndromes[5],'TIME_SLOW_DOWN_ENEMY_I') +table.insert(claspects['Mage of Time'].syndromes[8],'TIME_SPEED_UP_SELF') +table.insert(claspects['Mage of Time'].syndromes[9],'TIME_SLOW_DOWN_ENEMY_II') +table.insert(claspects['Mage of Time'].syndromes[10],'TIME_SLOW_DOWN_ENEMY_IV') +table.insert(claspects['Heir of Space'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Heir of Space'].syndromes[2],'GROW_I') +table.insert(claspects['Heir of Space'].syndromes[3],'SHRINK_I') +table.insert(claspects['Heir of Space'].syndromes[4],'GROW_II') +table.insert(claspects['Heir of Space'].syndromes[5],'TELEPORT') +table.insert(claspects['Heir of Space'].syndromes[6],'SHRINK_II') +table.insert(claspects['Heir of Space'].syndromes[7],'GROW_III') +table.insert(claspects['Heir of Space'].syndromes[8],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Heir of Space'].syndromes[9],'SHRINK_III') +table.insert(claspects['Heir of Space'].syndromes[10],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Seer of Space'].attributes[2],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Seer of Space'].attributes[3],{name='SPATIAL_SENSE', bonus=2000}) +table.insert(claspects['Seer of Space'].attributes[6],{name='SPATIAL_SENSE', bonus=7000}) +table.insert(claspects['Seer of Space'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Space'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Space'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=800}) +table.insert(claspects['Seer of Space'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Space'].skills[2],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Space'].skills[3],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Space'].skills[4],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Space'].skills[5],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Space'].skills[6],{name='DODGING', bonus=500}) +table.insert(claspects['Seer of Space'].skills[8],{name='DODGING', bonus=900}) +table.insert(claspects['Seer of Space'].skills[9],{name='DODGING', bonus=900}) +table.insert(claspects['Seer of Space'].skills[10],{name='DODGING', bonus=900}) +table.insert(claspects['Seer of Space'].syndromes[6],'SHRINK_II') +table.insert(claspects['Seer of Space'].syndromes[8],'GROW_II') +table.insert(claspects['Seer of Space'].syndromes[10],'SHRINK_III') +table.insert(claspects['Knight of Space'].syndromes[1],'GROW_I') +table.insert(claspects['Knight of Space'].syndromes[2],'SHRINK_I') +table.insert(claspects['Knight of Space'].syndromes[3],'GROW_II') +table.insert(claspects['Knight of Space'].syndromes[4],'TELEPORT') +table.insert(claspects['Knight of Space'].syndromes[5],'SHRINK_II') +table.insert(claspects['Knight of Space'].syndromes[6],'GROW_III') +table.insert(claspects['Knight of Space'].syndromes[7],'SHRINK_III') +table.insert(claspects['Knight of Space'].syndromes[8],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Knight of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Knight of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Witch of Space'].syndromes[1],'GROW_I') +table.insert(claspects['Witch of Space'].syndromes[2],'SHRINK_I') +table.insert(claspects['Witch of Space'].syndromes[3],'GROW_II') +table.insert(claspects['Witch of Space'].syndromes[4],'SHRINK_II') +table.insert(claspects['Witch of Space'].syndromes[5],'TELEPORT') +table.insert(claspects['Witch of Space'].syndromes[6],'GROW_III') +table.insert(claspects['Witch of Space'].syndromes[7],'SHRINK_III') +table.insert(claspects['Witch of Space'].syndromes[8],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Witch of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Witch of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Maid of Space'].syndromes[1],'GROW_I') +table.insert(claspects['Maid of Space'].syndromes[2],'SHRINK_I') +table.insert(claspects['Maid of Space'].syndromes[3],'GROW_II') +table.insert(claspects['Maid of Space'].syndromes[4],'TELEPORT') +table.insert(claspects['Maid of Space'].syndromes[5],'SHRINK_II') +table.insert(claspects['Maid of Space'].syndromes[6],'GROW_III') +table.insert(claspects['Maid of Space'].syndromes[7],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Maid of Space'].syndromes[8],'SHRINK_III') +table.insert(claspects['Maid of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Maid of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Page of Space'].syndromes[2],'GROW_I') +table.insert(claspects['Page of Space'].syndromes[2],'SHRINK_I') +table.insert(claspects['Page of Space'].syndromes[4],'GROW_II') +table.insert(claspects['Page of Space'].syndromes[6],'TELEPORT') +table.insert(claspects['Page of Space'].syndromes[6],'SHRINK_II') +table.insert(claspects['Page of Space'].syndromes[8],'GROW_III') +table.insert(claspects['Page of Space'].syndromes[8],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Page of Space'].syndromes[9],'SHRINK_III') +table.insert(claspects['Page of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Page of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Page of Space'].syndromes[10],'SHRINK_IV') +table.insert(claspects['Prince of Space'].syndromes[1],'GROW_I') +table.insert(claspects['Prince of Space'].syndromes[2],'SHRINK_I') +table.insert(claspects['Prince of Space'].syndromes[3],'GROW_II') +table.insert(claspects['Prince of Space'].syndromes[4],'TELEPORT') +table.insert(claspects['Prince of Space'].syndromes[5],'SHRINK_II') +table.insert(claspects['Prince of Space'].syndromes[6],'GROW_III') +table.insert(claspects['Prince of Space'].syndromes[7],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Prince of Space'].syndromes[8],'SHRINK_III') +table.insert(claspects['Prince of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Prince of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Rogue of Space'].syndromes[1],'SHRINK_I') +table.insert(claspects['Rogue of Space'].syndromes[2],'GROW_I') +table.insert(claspects['Rogue of Space'].syndromes[3],'SHRINK_II') +table.insert(claspects['Rogue of Space'].syndromes[4],'GROW_II') +table.insert(claspects['Rogue of Space'].syndromes[5],'TELEPORT') +table.insert(claspects['Rogue of Space'].syndromes[6],'SHRINK_III') +table.insert(claspects['Rogue of Space'].syndromes[7],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Rogue of Space'].syndromes[8],'GROW_III') +table.insert(claspects['Rogue of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Rogue of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Thief of Space'].syndromes[1],'SHRINK_I') +table.insert(claspects['Thief of Space'].syndromes[2],'GROW_I') +table.insert(claspects['Thief of Space'].syndromes[3],'SHRINK_II') +table.insert(claspects['Thief of Space'].syndromes[4],'GROW_II') +table.insert(claspects['Thief of Space'].syndromes[5],'TELEPORT') +table.insert(claspects['Thief of Space'].syndromes[6],'SHRINK_III') +table.insert(claspects['Thief of Space'].syndromes[7],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Thief of Space'].syndromes[8],'GROW_III') +table.insert(claspects['Thief of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Thief of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Sylph of Space'].skills[1],{name='SURGERY', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[2],{name='SURGERY', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[6],{name='SURGERY', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[7],{name='SURGERY', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[8],{name='SURGERY', bonus=700}) +table.insert(claspects['Sylph of Space'].skills[9],{name='SURGERY', bonus=900}) +table.insert(claspects['Sylph of Space'].skills[10],{name='SURGERY', bonus=1100}) +table.insert(claspects['Sylph of Space'].skills[1],{name='SUTURE', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[2],{name='SUTURE', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[6],{name='SUTURE', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[7],{name='SUTURE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[8],{name='SUTURE', bonus=700}) +table.insert(claspects['Sylph of Space'].skills[9],{name='SUTURE', bonus=900}) +table.insert(claspects['Sylph of Space'].skills[10],{name='SUTURE', bonus=1100}) +table.insert(claspects['Sylph of Space'].skills[1],{name='DIAGNOSE', bonus=900}) +table.insert(claspects['Sylph of Space'].skills[2],{name='DRESS_WOUNDS', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[3],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[4],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[5],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[6],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[7],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[8],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[9],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[10],{name='DRESS_WOUNDS', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[11],{name='DRESS_WOUNDS', bonus=700}) +table.insert(claspects['Sylph of Space'].skills[2],{name='SET_BONE', bonus=500}) +table.insert(claspects['Sylph of Space'].skills[3],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[4],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[5],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[6],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[7],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[8],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[9],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[10],{name='SET_BONE', bonus=600}) +table.insert(claspects['Sylph of Space'].skills[11],{name='SET_BONE', bonus=700}) +table.insert(claspects['Sylph of Space'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Bard of Space'].attributes[2],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[3],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[4],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[5],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[6],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[7],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[2],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[3],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[4],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[5],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[6],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].attributes[7],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Bard of Space'].skills[2],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[3],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[4],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[5],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[6],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[7],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[8],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[9],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[10],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].skills[11],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Space'].syndromes[8],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Bard of Space'].syndromes[9],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Bard of Space'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Mage of Space'].attributes[2],{name='SPATIAL_SENSE', bonus=1000}) +table.insert(claspects['Mage of Space'].attributes[3],{name='SPATIAL_SENSE', bonus=2000}) +table.insert(claspects['Mage of Space'].attributes[6],{name='SPATIAL_SENSE', bonus=7000}) +table.insert(claspects['Mage of Space'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Space'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Space'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=800}) +table.insert(claspects['Mage of Space'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Space'].syndromes[2],'TELEPORT') +table.insert(claspects['Mage of Space'].syndromes[6],'SHRINK_II') +table.insert(claspects['Mage of Space'].syndromes[8],'GROW_II') +table.insert(claspects['Mage of Space'].syndromes[9],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Mage of Space'].syndromes[10],'SHRINK_III') +table.insert(claspects['Heir of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Heir of Life'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Heir of Life'].syndromes[4],'HEAL_MILD_I') +table.insert(claspects['Heir of Life'].syndromes[5],'HEAL_MILD_II') +table.insert(claspects['Heir of Life'].attributes[2],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Heir of Life'].attributes[4],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Heir of Life'].attributes[5],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Heir of Life'].attributes[7],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Heir of Life'].attributes[8],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Heir of Life'].attributes[9],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Heir of Life'].attributes[10],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Heir of Life'].attributes[11],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Seer of Life'].skills[1],{name='PLANT', bonus=500}) +table.insert(claspects['Seer of Life'].skills[2],{name='PLANT', bonus=500}) +table.insert(claspects['Seer of Life'].skills[6],{name='PLANT', bonus=500}) +table.insert(claspects['Seer of Life'].skills[7],{name='PLANT', bonus=600}) +table.insert(claspects['Seer of Life'].skills[8],{name='PLANT', bonus=700}) +table.insert(claspects['Seer of Life'].skills[9],{name='PLANT', bonus=900}) +table.insert(claspects['Seer of Life'].skills[10],{name='PLANT', bonus=1100}) +table.insert(claspects['Seer of Life'].skills[1],{name='HERBALISM', bonus=500}) +table.insert(claspects['Seer of Life'].skills[2],{name='HERBALISM', bonus=500}) +table.insert(claspects['Seer of Life'].skills[6],{name='HERBALISM', bonus=500}) +table.insert(claspects['Seer of Life'].skills[7],{name='HERBALISM', bonus=600}) +table.insert(claspects['Seer of Life'].skills[8],{name='HERBALISM', bonus=700}) +table.insert(claspects['Seer of Life'].skills[9],{name='HERBALISM', bonus=900}) +table.insert(claspects['Seer of Life'].skills[10],{name='HERBALISM', bonus=1100}) +table.insert(claspects['Seer of Life'].skills[1],{name='MILK', bonus=500}) +table.insert(claspects['Seer of Life'].skills[2],{name='MILK', bonus=500}) +table.insert(claspects['Seer of Life'].skills[6],{name='MILK', bonus=500}) +table.insert(claspects['Seer of Life'].skills[7],{name='MILK', bonus=600}) +table.insert(claspects['Seer of Life'].skills[8],{name='MILK', bonus=700}) +table.insert(claspects['Seer of Life'].skills[9],{name='MILK', bonus=900}) +table.insert(claspects['Seer of Life'].skills[10],{name='MILK', bonus=1100}) +table.insert(claspects['Seer of Life'].skills[2],{name='ANIMALTRAIN', bonus=500}) +table.insert(claspects['Seer of Life'].skills[3],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[4],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[5],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[6],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[7],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[8],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[9],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[10],{name='ANIMALTRAIN', bonus=600}) +table.insert(claspects['Seer of Life'].skills[11],{name='ANIMALTRAIN', bonus=700}) +table.insert(claspects['Seer of Life'].skills[2],{name='BUTCHER', bonus=500}) +table.insert(claspects['Seer of Life'].skills[3],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[4],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[5],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[6],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[7],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[8],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[9],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[10],{name='BUTCHER', bonus=600}) +table.insert(claspects['Seer of Life'].skills[11],{name='BUTCHER', bonus=700}) +table.insert(claspects['Seer of Life'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Knight of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Knight of Life'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Knight of Life'].syndromes[4],'HEAL_MILD_I') +table.insert(claspects['Knight of Life'].syndromes[5],'HEAL_MILD_II') +table.insert(claspects['Knight of Life'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Life'].attributes[4],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Life'].attributes[5],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Life'].attributes[7],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Life'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Life'].attributes[9],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Life'].attributes[10],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Life'].attributes[11],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Witch of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Witch of Life'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Witch of Life'].syndromes[2],'HEAL_MILD_II') +table.insert(claspects['Witch of Life'].syndromes[3],'HEAL_MILD_III') +table.insert(claspects['Witch of Life'].syndromes[4],'DEUNDEAD_FRIENDS') +table.insert(claspects['Witch of Life'].syndromes[5],'REMOVE_BLOOD_I') +table.insert(claspects['Witch of Life'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Witch of Life'].syndromes[7],'REMOVE_BLOOD_II') +table.insert(claspects['Witch of Life'].syndromes[8],'REMOVE_BLOOD_III') +table.insert(claspects['Witch of Life'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Witch of Life'].syndromes[10],'DESTROY_LIFE_II') +table.insert(claspects['Maid of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Maid of Life'].syndromes[2],'DEUNDEAD_ENEMIES') +table.insert(claspects['Maid of Life'].syndromes[4],'HEAL_MILD_I') +table.insert(claspects['Maid of Life'].syndromes[5],'HEAL_MILD_II') +table.insert(claspects['Maid of Life'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Life'].attributes[4],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Life'].attributes[5],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Life'].attributes[7],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Life'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Life'].attributes[9],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Life'].attributes[10],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Life'].attributes[11],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Page of Life'].syndromes[2],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Page of Life'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Page of Life'].syndromes[4],'DEUNDEAD_FRIENDS') +table.insert(claspects['Page of Life'].syndromes[5],'HEAL_MILD_II') +table.insert(claspects['Page of Life'].syndromes[7],'HEAL_MILD_III') +table.insert(claspects['Page of Life'].syndromes[7],'REMOVE_BLOOD_I') +table.insert(claspects['Page of Life'].syndromes[8],'HEAL_FULL_I') +table.insert(claspects['Page of Life'].syndromes[8],'REMOVE_BLOOD_II') +table.insert(claspects['Page of Life'].syndromes[9],'REMOVE_BLOOD_III') +table.insert(claspects['Page of Life'].syndromes[10],'HEAL_FULL_II') +table.insert(claspects['Page of Life'].syndromes[10],'DESTROY_LIFE_V') +table.insert(claspects['Page of Life'].syndromes[10],'REMOVE_BLOOD_IV') +table.insert(claspects['Page of Life'].syndromes[10],'AUTOREVIVE_OTHERS_ONCE') +table.insert(claspects['Prince of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Prince of Life'].syndromes[1],'DESTROY_LIFE_I') +table.insert(claspects['Prince of Life'].syndromes[2],'REMOVE_BLOOD_I') +table.insert(claspects['Prince of Life'].syndromes[3],'DESTROY_LIFE_II') +table.insert(claspects['Prince of Life'].syndromes[4],'REMOVE_BLOOD_II') +table.insert(claspects['Prince of Life'].syndromes[5],'DESTROY_LIFE_III') +table.insert(claspects['Prince of Life'].syndromes[8],'REMOVE_BLOOD_III') +table.insert(claspects['Prince of Life'].syndromes[9],'REMOVE_BLOOD_IV') +table.insert(claspects['Prince of Life'].syndromes[10],'DESTROY_LIFE_IV') +table.insert(claspects['Prince of Life'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Rogue of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Rogue of Life'].syndromes[1],'REMOVE_BLOOD_I') +table.insert(claspects['Rogue of Life'].syndromes[2],'HEAL_MILD_I') +table.insert(claspects['Rogue of Life'].syndromes[3],'REMOVE_BLOOD_II') +table.insert(claspects['Rogue of Life'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Rogue of Life'].syndromes[5],'DEUNDEAD_ENEMIES') +table.insert(claspects['Rogue of Life'].syndromes[6],'DEUNDEAD_FRIENDS') +table.insert(claspects['Rogue of Life'].syndromes[8],'HEAL_MILD_III') +table.insert(claspects['Rogue of Life'].syndromes[9],'DESTROY_LIFE_II') +table.insert(claspects['Rogue of Life'].syndromes[10],'HEAL_FULL_I') +table.insert(claspects['Thief of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Thief of Life'].syndromes[1],'REMOVE_BLOOD_I') +table.insert(claspects['Thief of Life'].syndromes[2],'HEAL_MILD_I') +table.insert(claspects['Thief of Life'].syndromes[3],'REMOVE_BLOOD_II') +table.insert(claspects['Thief of Life'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Thief of Life'].syndromes[5],'DEUNDEAD_ENEMIES') +table.insert(claspects['Thief of Life'].syndromes[6],'DESTROY_LIFE_I') +table.insert(claspects['Thief of Life'].syndromes[8],'HEAL_MILD_III') +table.insert(claspects['Thief of Life'].syndromes[9],'DESTROY_LIFE_II') +table.insert(claspects['Thief of Life'].syndromes[10],'HEAL_FULL_I') +table.insert(claspects['Sylph of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Sylph of Life'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Life'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Life'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Life'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Life'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Sylph of Life'].syndromes[10],'AUTOREVIVE_OTHERS_ONCE') +table.insert(claspects['Sylph of Life'].attributes[2],{name='RECUPERATION', bonus=1000}) +table.insert(claspects['Sylph of Life'].attributes[3],{name='RECUPERATION', bonus=1000}) +table.insert(claspects['Sylph of Life'].attributes[8],{name='RECUPERATION', bonus=3000}) +table.insert(claspects['Sylph of Life'].attributes[9],{name='RECUPERATION', bonus=5000}) +table.insert(claspects['Bard of Life'].syndromes[1],'AUTOREVIVE_SELF_ONCE') +table.insert(claspects['Bard of Life'].attributes[1],{name='STRENGTH', bonus=1}) +table.insert(claspects['Bard of Life'].attributes[2],{name='STRENGTH', bonus=499}) +table.insert(claspects['Bard of Life'].attributes[3],{name='STRENGTH', bonus=500}) +table.insert(claspects['Bard of Life'].attributes[4],{name='STRENGTH', bonus=500}) +table.insert(claspects['Bard of Life'].attributes[5],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Bard of Life'].attributes[6],{name='STRENGTH', bonus=1500}) +table.insert(claspects['Bard of Life'].attributes[7],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Life'].attributes[8],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Bard of Life'].attributes[9],{name='STRENGTH', bonus=3500}) +table.insert(claspects['Bard of Life'].attributes[10],{name='STRENGTH', bonus=4000}) +table.insert(claspects['Bard of Life'].attributes[11],{name='STRENGTH', bonus=7500}) +table.insert(claspects['Bard of Life'].attributes[1],{name='ENDURANCE', bonus=1}) +table.insert(claspects['Bard of Life'].attributes[2],{name='ENDURANCE', bonus=499}) +table.insert(claspects['Bard of Life'].attributes[3],{name='ENDURANCE', bonus=500}) +table.insert(claspects['Bard of Life'].attributes[4],{name='ENDURANCE', bonus=500}) +table.insert(claspects['Bard of Life'].attributes[5],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Bard of Life'].attributes[6],{name='ENDURANCE', bonus=1500}) +table.insert(claspects['Bard of Life'].attributes[7],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Life'].attributes[8],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Bard of Life'].attributes[9],{name='ENDURANCE', bonus=3500}) +table.insert(claspects['Bard of Life'].attributes[10],{name='ENDURANCE', bonus=4000}) +table.insert(claspects['Bard of Life'].attributes[11],{name='ENDURANCE', bonus=7500}) +table.insert(claspects['Mage of Life'].skills[1],{name='PLANT', bonus=500}) +table.insert(claspects['Mage of Life'].skills[2],{name='PLANT', bonus=500}) +table.insert(claspects['Mage of Life'].skills[6],{name='PLANT', bonus=500}) +table.insert(claspects['Mage of Life'].skills[7],{name='PLANT', bonus=600}) +table.insert(claspects['Mage of Life'].skills[8],{name='PLANT', bonus=700}) +table.insert(claspects['Mage of Life'].skills[9],{name='PLANT', bonus=900}) +table.insert(claspects['Mage of Life'].skills[10],{name='PLANT', bonus=1100}) +table.insert(claspects['Mage of Life'].skills[1],{name='HERBALISM', bonus=500}) +table.insert(claspects['Mage of Life'].skills[2],{name='HERBALISM', bonus=500}) +table.insert(claspects['Mage of Life'].skills[6],{name='HERBALISM', bonus=500}) +table.insert(claspects['Mage of Life'].skills[7],{name='HERBALISM', bonus=600}) +table.insert(claspects['Mage of Life'].skills[8],{name='HERBALISM', bonus=700}) +table.insert(claspects['Mage of Life'].skills[9],{name='HERBALISM', bonus=900}) +table.insert(claspects['Mage of Life'].skills[10],{name='HERBALISM', bonus=1100}) +table.insert(claspects['Mage of Life'].skills[1],{name='MILK', bonus=500}) +table.insert(claspects['Mage of Life'].skills[2],{name='MILK', bonus=500}) +table.insert(claspects['Mage of Life'].skills[6],{name='MILK', bonus=500}) +table.insert(claspects['Mage of Life'].skills[7],{name='MILK', bonus=600}) +table.insert(claspects['Mage of Life'].skills[8],{name='MILK', bonus=700}) +table.insert(claspects['Mage of Life'].skills[9],{name='MILK', bonus=900}) +table.insert(claspects['Mage of Life'].skills[10],{name='MILK', bonus=1100}) +table.insert(claspects['Mage of Life'].skills[2],{name='BUTCHER', bonus=500}) +table.insert(claspects['Mage of Life'].skills[3],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[4],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[5],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[6],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[7],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[8],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[9],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[10],{name='BUTCHER', bonus=600}) +table.insert(claspects['Mage of Life'].skills[11],{name='BUTCHER', bonus=700}) +table.insert(claspects['Mage of Life'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Mage of Life'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Heir of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Heir of Hope'].attributes[3],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Heir of Hope'].syndromes[3],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Heir of Hope'].syndromes[4],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Heir of Hope'].syndromes[5],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Heir of Hope'].syndromes[6],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Heir of Hope'].syndromes[8],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Heir of Hope'].syndromes[9],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Heir of Hope'].syndromes[10],'GIVE_FRIENDS_HOPE_IV') +table.insert(claspects['Seer of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[3],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[4],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[6],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[7],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[8],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[9],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[10],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[11],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[2],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[3],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[4],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[5],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[6],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[7],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[8],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[9],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[10],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[11],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[2],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Seer of Hope'].attributes[4],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Seer of Hope'].attributes[6],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Seer of Hope'].attributes[8],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Seer of Hope'].attributes[10],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Seer of Hope'].syndromes[6],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Seer of Hope'].syndromes[8],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Knight of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Knight of Hope'].attributes[4],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[6],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[8],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[10],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[2],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Knight of Hope'].attributes[4],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[6],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[8],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Knight of Hope'].attributes[10],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Knight of Hope'].syndromes[2],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Knight of Hope'].syndromes[4],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Knight of Hope'].syndromes[7],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Knight of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Witch of Hope'].syndromes[1],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Witch of Hope'].syndromes[2],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Witch of Hope'].syndromes[3],'GIVE_ENEMIES_HOPELESSNESS_I') +table.insert(claspects['Witch of Hope'].syndromes[4],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Witch of Hope'].syndromes[5],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Witch of Hope'].syndromes[6],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Witch of Hope'].syndromes[7],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Witch of Hope'].syndromes[8],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Witch of Hope'].syndromes[9],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Witch of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Maid of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Maid of Hope'].attributes[3],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Maid of Hope'].syndromes[3],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Maid of Hope'].syndromes[4],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Maid of Hope'].syndromes[5],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Maid of Hope'].syndromes[6],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Maid of Hope'].syndromes[8],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Maid of Hope'].syndromes[9],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Maid of Hope'].syndromes[10],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Page of Hope'].syndromes[1],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Page of Hope'].syndromes[3],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Page of Hope'].syndromes[3],'GIVE_ENEMIES_HOPELESSNESS_I') +table.insert(claspects['Page of Hope'].syndromes[6],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Page of Hope'].syndromes[6],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Page of Hope'].syndromes[6],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Page of Hope'].syndromes[9],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Page of Hope'].syndromes[9],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Page of Hope'].syndromes[9],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Page of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Page of Hope'].syndromes[10],'GIVE_ENEMIES_HOPELESSNESS_IV') +table.insert(claspects['Page of Hope'].syndromes[10],'GIVE_FRIENDS_HOPE_IV') +table.insert(claspects['Page of Hope'].attributes[1],{name='WILLPOWER', bonus=1}) +table.insert(claspects['Page of Hope'].attributes[2],{name='WILLPOWER', bonus=2}) +table.insert(claspects['Page of Hope'].attributes[3],{name='WILLPOWER', bonus=6}) +table.insert(claspects['Page of Hope'].attributes[4],{name='WILLPOWER', bonus=18}) +table.insert(claspects['Page of Hope'].attributes[5],{name='WILLPOWER', bonus=54}) +table.insert(claspects['Page of Hope'].attributes[6],{name='WILLPOWER', bonus=162}) +table.insert(claspects['Page of Hope'].attributes[7],{name='WILLPOWER', bonus=486}) +table.insert(claspects['Page of Hope'].attributes[8],{name='WILLPOWER', bonus=1458}) +table.insert(claspects['Page of Hope'].attributes[9],{name='WILLPOWER', bonus=4374}) +table.insert(claspects['Page of Hope'].attributes[10],{name='WILLPOWER', bonus=13122}) +table.insert(claspects['Page of Hope'].attributes[11],{name='WILLPOWER', bonus=39366}) +table.insert(claspects['Prince of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Prince of Hope'].syndromes[2],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Prince of Hope'].syndromes[3],'GIVE_ENEMIES_HOPELESSNESS_I') +table.insert(claspects['Prince of Hope'].syndromes[4],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Prince of Hope'].syndromes[5],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Prince of Hope'].syndromes[7],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Prince of Hope'].syndromes[8],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Prince of Hope'].syndromes[9],'GIVE_ENEMIES_HOPELESSNESS_IV') +table.insert(claspects['Prince of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Rogue of Hope'].syndromes[1],'GIVE_ENEMIES_HOPELESSNESS_I') +table.insert(claspects['Rogue of Hope'].syndromes[2],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Rogue of Hope'].syndromes[3],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Rogue of Hope'].syndromes[4],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Rogue of Hope'].syndromes[5],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Rogue of Hope'].syndromes[6],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Rogue of Hope'].syndromes[7],'GIVE_ENEMIES_HOPELESSNESS_IV') +table.insert(claspects['Rogue of Hope'].syndromes[8],'GIVE_FRIENDS_HOPE_IV') +table.insert(claspects['Rogue of Hope'].syndromes[9],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Rogue of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Thief of Hope'].syndromes[1],'GIVE_ENEMIES_HOPELESSNESS_I') +table.insert(claspects['Thief of Hope'].syndromes[2],'SHOOT_WITH_HOPE_I') +table.insert(claspects['Thief of Hope'].syndromes[3],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Thief of Hope'].syndromes[4],'SHOOT_WITH_HOPE_II') +table.insert(claspects['Thief of Hope'].syndromes[5],'GIVE_ENEMIES_HOPELESSNESS_III') +table.insert(claspects['Thief of Hope'].syndromes[6],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Thief of Hope'].syndromes[7],'GIVE_ENEMIES_HOPELESSNESS_IV') +table.insert(claspects['Thief of Hope'].syndromes[8],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Thief of Hope'].syndromes[9],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Thief of Hope'].syndromes[10],'GIVE_FRIENDS_HOPE_IV') +table.insert(claspects['Sylph of Hope'].syndromes[1],'GIVE_FRIENDS_HOPE_I') +table.insert(claspects['Sylph of Hope'].syndromes[2],'HEAL_MILD_I') +table.insert(claspects['Sylph of Hope'].syndromes[3],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Sylph of Hope'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Hope'].syndromes[5],'GIVE_FRIENDS_HOPE_III') +table.insert(claspects['Sylph of Hope'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Hope'].syndromes[7],'HEAL_MILD_III') +table.insert(claspects['Sylph of Hope'].syndromes[8],'HEAL_FULL_II') +table.insert(claspects['Sylph of Hope'].syndromes[9],'GIVE_FRIENDS_HOPE_IV') +table.insert(claspects['Sylph of Hope'].syndromes[10],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Bard of Hope'].attributes[1],{name='WILLPOWER', bonus=1}) +table.insert(claspects['Bard of Hope'].attributes[2],{name='WILLPOWER', bonus=499}) +table.insert(claspects['Bard of Hope'].attributes[3],{name='WILLPOWER', bonus=500}) +table.insert(claspects['Bard of Hope'].attributes[4],{name='WILLPOWER', bonus=500}) +table.insert(claspects['Bard of Hope'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Bard of Hope'].attributes[6],{name='WILLPOWER', bonus=1500}) +table.insert(claspects['Bard of Hope'].attributes[7],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Bard of Hope'].attributes[8],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Bard of Hope'].attributes[9],{name='WILLPOWER', bonus=3500}) +table.insert(claspects['Bard of Hope'].attributes[10],{name='WILLPOWER', bonus=4000}) +table.insert(claspects['Bard of Hope'].attributes[11],{name='WILLPOWER', bonus=7500}) +table.insert(claspects['Bard of Hope'].attributes[1],{name='ENDURANCE', bonus=1}) +table.insert(claspects['Bard of Hope'].attributes[2],{name='ENDURANCE', bonus=499}) +table.insert(claspects['Bard of Hope'].attributes[3],{name='ENDURANCE', bonus=500}) +table.insert(claspects['Bard of Hope'].attributes[4],{name='ENDURANCE', bonus=500}) +table.insert(claspects['Bard of Hope'].attributes[5],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Bard of Hope'].attributes[6],{name='ENDURANCE', bonus=1500}) +table.insert(claspects['Bard of Hope'].attributes[7],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Hope'].attributes[8],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Bard of Hope'].attributes[9],{name='ENDURANCE', bonus=3500}) +table.insert(claspects['Bard of Hope'].attributes[10],{name='ENDURANCE', bonus=4000}) +table.insert(claspects['Bard of Hope'].attributes[11],{name='ENDURANCE', bonus=7500}) +table.insert(claspects['Bard of Hope'].skills[1],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[2],{name='PERSUASION', bonus=600}) +table.insert(claspects['Bard of Hope'].skills[3],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[4],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[5],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[6],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[7],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[8],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[9],{name='PERSUASION', bonus=500}) +table.insert(claspects['Bard of Hope'].skills[10],{name='PERSUASION', bonus=600}) +table.insert(claspects['Bard of Hope'].skills[11],{name='PERSUASION', bonus=700}) +table.insert(claspects['Mage of Hope'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[3],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[4],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[6],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[7],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[8],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[9],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[10],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[11],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[2],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[3],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[4],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[5],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[6],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[7],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[8],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[9],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[10],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].attributes[11],{name='CREATIVITY', bonus=1000}) +table.insert(claspects['Mage of Hope'].syndromes[4],'GIVE_ENEMIES_HOPELESSNESS_II') +table.insert(claspects['Mage of Hope'].syndromes[6],'GIVE_FRIENDS_HOPE_II') +table.insert(claspects['Mage of Hope'].syndromes[8],'SHOOT_WITH_HOPE_III') +table.insert(claspects['Mage of Hope'].syndromes[10],'SHOOT_WITH_HOPE_IV') +table.insert(claspects['Heir of Void'].syndromes[1],'HIDE') +table.insert(claspects['Heir of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Heir of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Heir of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Heir of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Heir of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Heir of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Heir of Void'].skills[3],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Heir of Void'].skills[5],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Heir of Void'].skills[6],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Heir of Void'].skills[9],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Heir of Void'].skills[11],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Heir of Void'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Heir of Void'].attributes[3],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[4],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[5],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[6],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[7],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Heir of Void'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[9],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[10],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Heir of Void'].attributes[11],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Seer of Void'].syndromes[1],'HIDE') +table.insert(claspects['Seer of Void'].syndromes[4],'LIGHT_SEE_CREATURES') +table.insert(claspects['Seer of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Seer of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Seer of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Seer of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Seer of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Seer of Void'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Void'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Void'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Void'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Void'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Void'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Void'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Void'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Void'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Void'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Knight of Void'].syndromes[1],'HIDE') +table.insert(claspects['Knight of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Knight of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Knight of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Knight of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Knight of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Knight of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Knight of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Knight of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Knight of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Knight of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Knight of Void'].skills[3],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Void'].skills[5],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Void'].skills[6],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Void'].skills[9],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Void'].skills[11],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Knight of Void'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Knight of Void'].attributes[3],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[4],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[5],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[6],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[7],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Knight of Void'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[9],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[10],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Knight of Void'].attributes[11],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Witch of Void'].syndromes[1],'HIDE') +table.insert(claspects['Witch of Void'].syndromes[2],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Witch of Void'].syndromes[3],'TELEPORT') +table.insert(claspects['Witch of Void'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Witch of Void'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Witch of Void'].syndromes[6],'MAKE_ENEMIES_DISAPPEAR_I') +table.insert(claspects['Witch of Void'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Witch of Void'].syndromes[8],'MAKE_ENEMIES_DISAPPEAR_II') +table.insert(claspects['Witch of Void'].syndromes[9],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Witch of Void'].skills[11],{name='MAGIC_NATURE', bonus=1900}) +table.insert(claspects['Maid of Void'].syndromes[1],'HIDE') +table.insert(claspects['Maid of Void'].syndromes[3],'TELEPORT') +table.insert(claspects['Maid of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Maid of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Maid of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Maid of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Maid of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Maid of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Maid of Void'].skills[3],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Maid of Void'].skills[5],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Maid of Void'].skills[6],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Maid of Void'].skills[9],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Maid of Void'].skills[11],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Maid of Void'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Maid of Void'].attributes[3],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[4],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[5],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[6],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[7],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Maid of Void'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[9],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[10],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Maid of Void'].attributes[11],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Page of Void'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Page of Void'].syndromes[1],'HIDE') +table.insert(claspects['Page of Void'].syndromes[2],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Page of Void'].syndromes[7],'MAKE_ENEMIES_DISAPPEAR_I') +table.insert(claspects['Page of Void'].syndromes[8],'MAKE_ENEMIES_DISAPPEAR_II') +table.insert(claspects['Page of Void'].syndromes[9],'MAKE_ENEMIES_DISAPPEAR_III') +table.insert(claspects['Page of Void'].syndromes[10],'REPLACE_HEAD_WITH_SPACE') +table.insert(claspects['Page of Void'].syndromes[10],'REPLACE_ARMS_WITH_SPACE') +table.insert(claspects['Page of Void'].syndromes[10],'REPLACE_LEGS_WITH_SPACE') +table.insert(claspects['Page of Void'].syndromes[10],'TIME_AGE_ENEMIES_III') +table.insert(claspects['Prince of Void'].skills[2],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Prince of Void'].skills[3],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].skills[4],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Prince of Void'].skills[5],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Prince of Void'].skills[6],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Prince of Void'].skills[7],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].skills[8],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].skills[9],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].skills[10],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].skills[11],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Void'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Prince of Void'].attributes[3],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[4],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[5],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[6],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[7],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Prince of Void'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[9],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[10],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[11],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[2],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Prince of Void'].attributes[3],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[4],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[5],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[6],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[7],{name='TOUGHNESS', bonus=3000}) +table.insert(claspects['Prince of Void'].attributes[8],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[9],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[10],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[11],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[2],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Prince of Void'].attributes[3],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[4],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[5],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[6],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[7],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Prince of Void'].attributes[8],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[9],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[10],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].attributes[11],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Prince of Void'].skills[7],{name='MAGIC_NATURE', bonus=900}) +table.insert(claspects['Prince of Void'].skills[9],{name='MAGIC_NATURE', bonus=1400}) +table.insert(claspects['Rogue of Void'].syndromes[1],'HIDE') +table.insert(claspects['Rogue of Void'].syndromes[4],'TELEPORT') +table.insert(claspects['Rogue of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Rogue of Void'].skills[7],{name='MAGIC_NATURE', bonus=900}) +table.insert(claspects['Rogue of Void'].skills[9],{name='MAGIC_NATURE', bonus=1400}) +table.insert(claspects['Thief of Void'].syndromes[1],'HIDE') +table.insert(claspects['Thief of Void'].syndromes[4],'TELEPORT') +table.insert(claspects['Thief of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Thief of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Thief of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Thief of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Thief of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Thief of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Thief of Void'].skills[7],{name='MAGIC_NATURE', bonus=900}) +table.insert(claspects['Thief of Void'].skills[9],{name='MAGIC_NATURE', bonus=1400}) +table.insert(claspects['Sylph of Void'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Void'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Void'].skills[1],{name='DIAGNOSE', bonus=900}) +table.insert(claspects['Sylph of Void'].skills[2],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[3],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[4],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[5],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[6],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[7],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[8],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[9],{name='DIAGNOSE', bonus=500}) +table.insert(claspects['Sylph of Void'].skills[10],{name='DIAGNOSE', bonus=600}) +table.insert(claspects['Sylph of Void'].skills[7],{name='MAGIC_NATURE', bonus=900}) +table.insert(claspects['Sylph of Void'].skills[9],{name='MAGIC_NATURE', bonus=1400}) +table.insert(claspects['Bard of Void'].skills[2],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Bard of Void'].skills[3],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].skills[4],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Void'].skills[5],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Void'].skills[6],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Bard of Void'].skills[7],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].skills[8],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].skills[9],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].skills[10],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].skills[11],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Bard of Void'].attributes[2],{name='STRENGTH', bonus=1000}) +table.insert(claspects['Bard of Void'].attributes[3],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[4],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[5],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[6],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[7],{name='STRENGTH', bonus=3000}) +table.insert(claspects['Bard of Void'].attributes[8],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[9],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[10],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[11],{name='STRENGTH', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[2],{name='TOUGHNESS', bonus=1000}) +table.insert(claspects['Bard of Void'].attributes[3],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[4],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[5],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[6],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[7],{name='TOUGHNESS', bonus=3000}) +table.insert(claspects['Bard of Void'].attributes[8],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[9],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[10],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[11],{name='TOUGHNESS', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[2],{name='ENDURANCE', bonus=1000}) +table.insert(claspects['Bard of Void'].attributes[3],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[4],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[5],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[6],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[7],{name='ENDURANCE', bonus=3000}) +table.insert(claspects['Bard of Void'].attributes[8],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[9],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[10],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[11],{name='ENDURANCE', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[2],{name='AGILITY', bonus=1000}) +table.insert(claspects['Bard of Void'].attributes[3],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[4],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[5],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[6],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[7],{name='AGILITY', bonus=3000}) +table.insert(claspects['Bard of Void'].attributes[8],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[9],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[10],{name='AGILITY', bonus=2000}) +table.insert(claspects['Bard of Void'].attributes[11],{name='AGILITY', bonus=2000}) +table.insert(claspects['Mage of Void'].syndromes[1],'HIDE') +table.insert(claspects['Mage of Void'].syndromes[4],'LIGHT_SEE_CREATURES') +table.insert(claspects['Mage of Void'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Void'].skills[4],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Void'].skills[5],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Void'].skills[6],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Void'].skills[11],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Void'].skills[3],{name='SNEAK', bonus=700}) +table.insert(claspects['Mage of Void'].skills[5],{name='SNEAK', bonus=700}) +table.insert(claspects['Mage of Void'].skills[6],{name='SNEAK', bonus=700}) +table.insert(claspects['Mage of Void'].skills[9],{name='SNEAK', bonus=700}) +table.insert(claspects['Mage of Void'].skills[11],{name='SNEAK', bonus=700}) +table.insert(claspects['Mage of Void'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Void'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Void'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Void'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Void'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Void'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Void'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Void'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Void'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Void'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Heir of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Heir of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Heir of Heart'].syndromes[5],'ENJOY_II') +table.insert(claspects['Heir of Heart'].syndromes[6],'AGONY_IV') +table.insert(claspects['Heir of Heart'].syndromes[9],'INSANITY_I') +table.insert(claspects['Heir of Heart'].syndromes[10],'INSANITY_II') +table.insert(claspects['Heir of Heart'].skills[1],{name='DISCIPLINE', bonus=700}) +table.insert(claspects['Heir of Heart'].skills[4],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Heir of Heart'].skills[5],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Heir of Heart'].skills[8],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Heir of Heart'].skills[9],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Heir of Heart'].skills[10],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Heir of Heart'].skills[11],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Seer of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Seer of Heart'].syndromes[9],'INSANITY_I') +table.insert(claspects['Seer of Heart'].attributes[2],{name='SOCIAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Heart'].attributes[4],{name='SOCIAL_AWARENESS', bonus=300}) +table.insert(claspects['Seer of Heart'].attributes[5],{name='SOCIAL_AWARENESS', bonus=200}) +table.insert(claspects['Seer of Heart'].attributes[8],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Heart'].attributes[9],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Heart'].attributes[2],{name='EMPATHY', bonus=500}) +table.insert(claspects['Seer of Heart'].attributes[4],{name='EMPATHY', bonus=300}) +table.insert(claspects['Seer of Heart'].attributes[5],{name='EMPATHY', bonus=200}) +table.insert(claspects['Seer of Heart'].attributes[8],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Heart'].attributes[9],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Knight of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Knight of Heart'].syndromes[3],'DESKILL_I') +table.insert(claspects['Knight of Heart'].syndromes[4],'DEATTRIBUTE_I') +table.insert(claspects['Knight of Heart'].syndromes[5],'ENJOY_II') +table.insert(claspects['Knight of Heart'].syndromes[6],'AGONY_IV') +table.insert(claspects['Knight of Heart'].syndromes[7],'DEATTRIBUTE_II') +table.insert(claspects['Knight of Heart'].syndromes[8],'DESKILL_II') +table.insert(claspects['Knight of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Knight of Heart'].skills[1],{name='DISCIPLINE', bonus=500}) +table.insert(claspects['Knight of Heart'].skills[2],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Knight of Heart'].skills[10],{name='DISCIPLINE', bonus=900}) +table.insert(claspects['Witch of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Witch of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Witch of Heart'].syndromes[3],'DESKILL_I') +table.insert(claspects['Witch of Heart'].syndromes[4],'DEATTRIBUTE_I') +table.insert(claspects['Witch of Heart'].syndromes[5],'ENJOY_II') +table.insert(claspects['Witch of Heart'].syndromes[6],'AGONY_IV') +table.insert(claspects['Witch of Heart'].syndromes[7],'DEATTRIBUTE_II') +table.insert(claspects['Witch of Heart'].syndromes[8],'DESKILL_II') +table.insert(claspects['Witch of Heart'].syndromes[9],'TEAR_OUT_SOUL') +table.insert(claspects['Witch of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Maid of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Maid of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Maid of Heart'].syndromes[5],'AGONY_II') +table.insert(claspects['Maid of Heart'].syndromes[6],'AGONY_III') +table.insert(claspects['Maid of Heart'].syndromes[8],'AGONY_V') +table.insert(claspects['Maid of Heart'].syndromes[9],'INSANITY_I') +table.insert(claspects['Maid of Heart'].syndromes[10],'INSANITY_II') +table.insert(claspects['Maid of Heart'].skills[1],{name='DISCIPLINE', bonus=700}) +table.insert(claspects['Maid of Heart'].skills[4],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Maid of Heart'].skills[5],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Maid of Heart'].skills[8],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Maid of Heart'].skills[9],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Maid of Heart'].skills[10],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Maid of Heart'].skills[11],{name='DISCIPLINE', bonus=600}) +table.insert(claspects['Page of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Page of Heart'].syndromes[4],'ENJOY_I') +table.insert(claspects['Page of Heart'].syndromes[4],'DESKILL_I') +table.insert(claspects['Page of Heart'].syndromes[4],'DEATTRIBUTE_I') +table.insert(claspects['Page of Heart'].syndromes[6],'ENJOY_II') +table.insert(claspects['Page of Heart'].syndromes[6],'AGONY_III') +table.insert(claspects['Page of Heart'].syndromes[8],'DEATTRIBUTE_II') +table.insert(claspects['Page of Heart'].syndromes[8],'DESKILL_II') +table.insert(claspects['Page of Heart'].syndromes[8],'AGONY_IV') +table.insert(claspects['Page of Heart'].syndromes[9],'TEAR_OUT_SOUL') +table.insert(claspects['Page of Heart'].syndromes[9],'INSANITY_I') +table.insert(claspects['Page of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Page of Heart'].syndromes[10],'INSANITY_II') +table.insert(claspects['Prince of Heart'].syndromes[1],'AGONY_I') +table.insert(claspects['Prince of Heart'].syndromes[2],'DESKILL_I') +table.insert(claspects['Prince of Heart'].syndromes[3],'AGONY_II') +table.insert(claspects['Prince of Heart'].syndromes[4],'DEATTRIBUTE_I') +table.insert(claspects['Prince of Heart'].syndromes[5],'DESKILL_II') +table.insert(claspects['Prince of Heart'].syndromes[6],'DEATTRIBUTE_II') +table.insert(claspects['Prince of Heart'].syndromes[7],'AGONY_III') +table.insert(claspects['Prince of Heart'].syndromes[8],'AGONY_IV') +table.insert(claspects['Prince of Heart'].syndromes[9],'TEAR_OUT_SOUL') +table.insert(claspects['Prince of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Rogue of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Rogue of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Rogue of Heart'].syndromes[3],'AGONY_I') +table.insert(claspects['Rogue of Heart'].syndromes[4],'ENJOY_II') +table.insert(claspects['Rogue of Heart'].syndromes[5],'AGONY_II') +table.insert(claspects['Rogue of Heart'].syndromes[6],'ENJOY_III') +table.insert(claspects['Rogue of Heart'].syndromes[7],'AGONY_III') +table.insert(claspects['Rogue of Heart'].syndromes[8],'ENJOY_IV') +table.insert(claspects['Rogue of Heart'].syndromes[9],'AGONY_IV') +table.insert(claspects['Rogue of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Thief of Heart'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Thief of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Thief of Heart'].syndromes[3],'AGONY_I') +table.insert(claspects['Thief of Heart'].syndromes[4],'ENJOY_II') +table.insert(claspects['Thief of Heart'].syndromes[5],'AGONY_II') +table.insert(claspects['Thief of Heart'].syndromes[6],'ENJOY_III') +table.insert(claspects['Thief of Heart'].syndromes[7],'AGONY_III') +table.insert(claspects['Thief of Heart'].syndromes[8],'ENJOY_IV') +table.insert(claspects['Thief of Heart'].syndromes[9],'AGONY_IV') +table.insert(claspects['Thief of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Sylph of Heart'].skills[2],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[3],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[4],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[5],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[6],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[7],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[8],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[9],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[10],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[11],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Heart'].attributes[2],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[3],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[4],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[5],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[6],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[7],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[8],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[9],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[10],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[11],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[1],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[2],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[3],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[4],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[5],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[6],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Heart'].attributes[7],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[8],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[9],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[10],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Sylph of Heart'].attributes[11],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Sylph of Heart'].skills[2],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[3],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[4],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[5],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[6],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Heart'].skills[7],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[8],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[9],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[10],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Heart'].skills[11],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Heart'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Sylph of Heart'].syndromes[6],'UNINSANE') +table.insert(claspects['Bard of Heart'].syndromes[1],'AGONY_I') +table.insert(claspects['Bard of Heart'].syndromes[2],'DESKILL_I') +table.insert(claspects['Bard of Heart'].syndromes[3],'AGONY_II') +table.insert(claspects['Bard of Heart'].syndromes[4],'DEATTRIBUTE_I') +table.insert(claspects['Bard of Heart'].syndromes[5],'DESKILL_II') +table.insert(claspects['Bard of Heart'].syndromes[6],'INSANITY_I') +table.insert(claspects['Bard of Heart'].syndromes[7],'AGONY_III') +table.insert(claspects['Bard of Heart'].syndromes[8],'AGONY_IV') +table.insert(claspects['Bard of Heart'].syndromes[9],'INSANITY_II') +table.insert(claspects['Bard of Heart'].syndromes[10],'AGONY_V') +table.insert(claspects['Mage of Heart'].syndromes[2],'ENJOY_I') +table.insert(claspects['Mage of Heart'].syndromes[6],'AGONY_III') +table.insert(claspects['Mage of Heart'].syndromes[9],'AGONY_V') +table.insert(claspects['Mage of Heart'].attributes[2],{name='SOCIAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Heart'].attributes[4],{name='SOCIAL_AWARENESS', bonus=300}) +table.insert(claspects['Mage of Heart'].attributes[5],{name='SOCIAL_AWARENESS', bonus=200}) +table.insert(claspects['Mage of Heart'].attributes[8],{name='SOCIAL_AWARENESS', bonus=1500}) +table.insert(claspects['Mage of Heart'].attributes[9],{name='SOCIAL_AWARENESS', bonus=1500}) +table.insert(claspects['Mage of Heart'].attributes[2],{name='EMPATHY', bonus=500}) +table.insert(claspects['Mage of Heart'].attributes[4],{name='EMPATHY', bonus=300}) +table.insert(claspects['Mage of Heart'].attributes[5],{name='EMPATHY', bonus=200}) +table.insert(claspects['Mage of Heart'].attributes[8],{name='EMPATHY', bonus=1500}) +table.insert(claspects['Mage of Heart'].attributes[9],{name='EMPATHY', bonus=1500}) +table.insert(claspects['Heir of Blood'].syndromes[1],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Heir of Blood'].syndromes[2],'SHOOT_BLOOD_I') +table.insert(claspects['Heir of Blood'].syndromes[3],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Heir of Blood'].syndromes[4],'SHOOT_BLOOD_II') +table.insert(claspects['Heir of Blood'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Heir of Blood'].syndromes[7],'SHOOT_BLOOD_III') +table.insert(claspects['Heir of Blood'].syndromes[8],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Heir of Blood'].syndromes[9],'SHOOT_BLOOD_IV') +table.insert(claspects['Heir of Blood'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Seer of Blood'].attributes[2],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Seer of Blood'].attributes[3],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[4],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[5],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[6],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[7],{name='EMPATHY', bonus=3000}) +table.insert(claspects['Seer of Blood'].attributes[8],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[9],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[10],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[11],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[2],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Seer of Blood'].attributes[3],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[4],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[5],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[6],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[7],{name='SOCIAL_AWARENESS', bonus=3000}) +table.insert(claspects['Seer of Blood'].attributes[8],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[9],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[10],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].attributes[11],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Seer of Blood'].skills[2],{name='LEADERSHIP', bonus=500}) +table.insert(claspects['Seer of Blood'].skills[3],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[4],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[5],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[6],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[7],{name='LEADERSHIP', bonus=700}) +table.insert(claspects['Seer of Blood'].skills[8],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[9],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[10],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[11],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[2],{name='WRITING', bonus=500}) +table.insert(claspects['Seer of Blood'].skills[3],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[4],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[5],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[6],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[7],{name='WRITING', bonus=700}) +table.insert(claspects['Seer of Blood'].skills[8],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[9],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[10],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[11],{name='WRITING', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[2],{name='PROSE', bonus=500}) +table.insert(claspects['Seer of Blood'].skills[3],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[4],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[5],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[6],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[7],{name='PROSE', bonus=700}) +table.insert(claspects['Seer of Blood'].skills[8],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[9],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[10],{name='PROSE', bonus=600}) +table.insert(claspects['Seer of Blood'].skills[11],{name='PROSE', bonus=600}) +table.insert(claspects['Knight of Blood'].syndromes[1],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Knight of Blood'].syndromes[2],'CARING_I') +table.insert(claspects['Knight of Blood'].syndromes[3],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Knight of Blood'].syndromes[4],'CARING_II') +table.insert(claspects['Knight of Blood'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Knight of Blood'].syndromes[6],'CARING_III') +table.insert(claspects['Knight of Blood'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Knight of Blood'].syndromes[8],'CARING_IV') +table.insert(claspects['Knight of Blood'].syndromes[9],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Knight of Blood'].syndromes[10],'CARING_V') +table.insert(claspects['Witch of Blood'].syndromes[1],'SHOOT_BLOOD_I') +table.insert(claspects['Witch of Blood'].syndromes[2],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Witch of Blood'].syndromes[3],'SHOOT_BLOOD_II') +table.insert(claspects['Witch of Blood'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Witch of Blood'].syndromes[5],'SHOOT_BLOOD_III') +table.insert(claspects['Witch of Blood'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Witch of Blood'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Witch of Blood'].syndromes[8],'SHOOT_BLOOD_IV') +table.insert(claspects['Witch of Blood'].syndromes[9],'SHOOT_BLOOD_V') +table.insert(claspects['Witch of Blood'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Maid of Blood'].syndromes[1],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Maid of Blood'].syndromes[2],'CARING_I') +table.insert(claspects['Maid of Blood'].syndromes[3],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Maid of Blood'].syndromes[4],'CARING_II') +table.insert(claspects['Maid of Blood'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Maid of Blood'].syndromes[6],'CARING_III') +table.insert(claspects['Maid of Blood'].syndromes[7],'CARING_IV') +table.insert(claspects['Maid of Blood'].syndromes[8],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Maid of Blood'].syndromes[9],'CARING_V') +table.insert(claspects['Maid of Blood'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Page of Blood'].syndromes[1],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Page of Blood'].syndromes[2],'CARING_I') +table.insert(claspects['Page of Blood'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Page of Blood'].syndromes[5],'CARING_II') +table.insert(claspects['Page of Blood'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Page of Blood'].syndromes[6],'CARING_III') +table.insert(claspects['Page of Blood'].syndromes[6],'HATRED_I') +table.insert(claspects['Page of Blood'].syndromes[7],'CARING_IV') +table.insert(claspects['Page of Blood'].syndromes[7],'HATRED_II') +table.insert(claspects['Page of Blood'].syndromes[7],'REMOVE_BLOOD_I') +table.insert(claspects['Page of Blood'].syndromes[8],'HATRED_III') +table.insert(claspects['Page of Blood'].syndromes[8],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Page of Blood'].syndromes[8],'REMOVE_BLOOD_II') +table.insert(claspects['Page of Blood'].syndromes[9],'HATRED_IV') +table.insert(claspects['Page of Blood'].syndromes[9],'CARING_V') +table.insert(claspects['Page of Blood'].syndromes[9],'REMOVE_BLOOD_III') +table.insert(claspects['Page of Blood'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Page of Blood'].syndromes[10],'HATRED_V') +table.insert(claspects['Page of Blood'].syndromes[10],'REMOVE_BLOOD_IV') +table.insert(claspects['Page of Blood'].syndromes[10],'TEAR_OUT_SOUL') +table.insert(claspects['Prince of Blood'].syndromes[1],'SHOOT_BLOOD_I') +table.insert(claspects['Prince of Blood'].syndromes[2],'REMOVE_BLOOD_I') +table.insert(claspects['Prince of Blood'].syndromes[3],'SHOOT_BLOOD_II') +table.insert(claspects['Prince of Blood'].syndromes[4],'REMOVE_BLOOD_II') +table.insert(claspects['Prince of Blood'].syndromes[5],'SHOOT_BLOOD_III') +table.insert(claspects['Prince of Blood'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Prince of Blood'].syndromes[7],'REMOVE_BLOOD_III') +table.insert(claspects['Prince of Blood'].syndromes[8],'SHOOT_BLOOD_IV') +table.insert(claspects['Prince of Blood'].syndromes[9],'SHOOT_BLOOD_V') +table.insert(claspects['Prince of Blood'].syndromes[10],'REMOVE_BLOOD_IV') +table.insert(claspects['Rogue of Blood'].syndromes[1],'HATRED_I') +table.insert(claspects['Rogue of Blood'].syndromes[2],'CARING_I') +table.insert(claspects['Rogue of Blood'].syndromes[3],'HATRED_II') +table.insert(claspects['Rogue of Blood'].syndromes[4],'CARING_II') +table.insert(claspects['Rogue of Blood'].syndromes[5],'HATRED_III') +table.insert(claspects['Rogue of Blood'].syndromes[6],'CARING_III') +table.insert(claspects['Rogue of Blood'].syndromes[7],'CARING_IV') +table.insert(claspects['Rogue of Blood'].syndromes[8],'HATRED_IV') +table.insert(claspects['Rogue of Blood'].syndromes[9],'CARING_V') +table.insert(claspects['Rogue of Blood'].syndromes[10],'HATRED_V') +table.insert(claspects['Thief of Blood'].syndromes[1],'HATRED_I') +table.insert(claspects['Thief of Blood'].syndromes[2],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Thief of Blood'].syndromes[3],'HATRED_II') +table.insert(claspects['Thief of Blood'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Thief of Blood'].syndromes[5],'HATRED_III') +table.insert(claspects['Thief of Blood'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Thief of Blood'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Thief of Blood'].syndromes[8],'HATRED_IV') +table.insert(claspects['Thief of Blood'].syndromes[9],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Thief of Blood'].syndromes[10],'HATRED_V') +table.insert(claspects['Sylph of Blood'].syndromes[3],'HEAL_MILD_I') +table.insert(claspects['Sylph of Blood'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Blood'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Blood'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Blood'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Sylph of Blood'].attributes[2],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Blood'].attributes[3],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Sylph of Blood'].attributes[8],{name='EMPATHY', bonus=3000}) +table.insert(claspects['Sylph of Blood'].attributes[9],{name='EMPATHY', bonus=5000}) +table.insert(claspects['Sylph of Blood'].skills[2],{name='PACIFY', bonus=100400}) +table.insert(claspects['Sylph of Blood'].skills[3],{name='PACIFY', bonus=100400}) +table.insert(claspects['Sylph of Blood'].skills[8],{name='PACIFY', bonus=300400}) +table.insert(claspects['Sylph of Blood'].skills[9],{name='PACIFY', bonus=500400}) +table.insert(claspects['Bard of Blood'].syndromes[1],'HATRED_I') +table.insert(claspects['Bard of Blood'].syndromes[2],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Bard of Blood'].syndromes[3],'HATRED_II') +table.insert(claspects['Bard of Blood'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Bard of Blood'].syndromes[5],'HATRED_III') +table.insert(claspects['Bard of Blood'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Bard of Blood'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Bard of Blood'].syndromes[8],'HATRED_IV') +table.insert(claspects['Bard of Blood'].syndromes[9],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Bard of Blood'].syndromes[10],'HATRED_V') +table.insert(claspects['Bard of Blood'].syndromes[10],'INSANITY_I') +table.insert(claspects['Mage of Blood'].attributes[2],{name='EMPATHY', bonus=1000}) +table.insert(claspects['Mage of Blood'].attributes[3],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[4],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[5],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[6],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[7],{name='EMPATHY', bonus=3000}) +table.insert(claspects['Mage of Blood'].attributes[8],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[9],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[10],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[11],{name='EMPATHY', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[2],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Mage of Blood'].attributes[3],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[4],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[5],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[6],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[7],{name='SOCIAL_AWARENESS', bonus=3000}) +table.insert(claspects['Mage of Blood'].attributes[8],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[9],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[10],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].attributes[11],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Mage of Blood'].skills[2],{name='LEADERSHIP', bonus=500}) +table.insert(claspects['Mage of Blood'].skills[3],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[4],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[5],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[6],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[7],{name='LEADERSHIP', bonus=700}) +table.insert(claspects['Mage of Blood'].skills[8],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[9],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[10],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].skills[11],{name='LEADERSHIP', bonus=600}) +table.insert(claspects['Mage of Blood'].syndromes[6],'CARING_III') +table.insert(claspects['Heir of Doom'].syndromes[1],'STAVE_DOOM_I') +table.insert(claspects['Heir of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Heir of Doom'].syndromes[3],'STAVE_DOOM_II') +table.insert(claspects['Heir of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Heir of Doom'].syndromes[5],'HEAL_MILD_I') +table.insert(claspects['Heir of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Heir of Doom'].syndromes[7],'HEAL_MILD_III') +table.insert(claspects['Heir of Doom'].syndromes[8],'DOOM_ENEMIES_I') +table.insert(claspects['Heir of Doom'].syndromes[9],'HEAL_FULL_I') +table.insert(claspects['Heir of Doom'].syndromes[10],'DOOM_ENEMIES_II') +table.insert(claspects['Seer of Doom'].syndromes[1],'DETECT_LORD_ENGLISH') +table.insert(claspects['Seer of Doom'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Doom'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[5],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[7],{name='DODGING', bonus=700}) +table.insert(claspects['Seer of Doom'].skills[8],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[9],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[10],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[11],{name='DODGING', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Doom'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Doom'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Doom'].attributes[3],{name='KINESTHETIC_SENSE', bonus=1500}) +table.insert(claspects['Seer of Doom'].attributes[4],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[5],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[6],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[7],{name='KINESTHETIC_SENSE', bonus=1500}) +table.insert(claspects['Seer of Doom'].attributes[8],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[9],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[10],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Seer of Doom'].attributes[11],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Knight of Doom'].syndromes[1],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Knight of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Knight of Doom'].syndromes[3],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Knight of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Knight of Doom'].syndromes[5],'DOOM_ENEMIES_I') +table.insert(claspects['Knight of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Knight of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Knight of Doom'].syndromes[8],'DOOM_ENEMIES_II') +table.insert(claspects['Knight of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Knight of Doom'].syndromes[10],'DOOM_ENEMIES_III') +table.insert(claspects['Witch of Doom'].syndromes[1],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Witch of Doom'].syndromes[1],'STAVE_DOOM_I') +table.insert(claspects['Witch of Doom'].syndromes[3],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Witch of Doom'].syndromes[4],'STAVE_DOOM_II') +table.insert(claspects['Witch of Doom'].syndromes[5],'DOOM_ENEMIES_I') +table.insert(claspects['Witch of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Witch of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Witch of Doom'].syndromes[8],'DOOM_ENEMIES_II') +table.insert(claspects['Witch of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Witch of Doom'].syndromes[10],'DOOM_ENEMIES_III') +table.insert(claspects['Maid of Doom'].syndromes[1],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Maid of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Maid of Doom'].syndromes[3],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Maid of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Maid of Doom'].syndromes[5],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Maid of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Maid of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Maid of Doom'].syndromes[8],'DOOM_ENEMIES_I') +table.insert(claspects['Maid of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_V') +table.insert(claspects['Maid of Doom'].syndromes[10],'DOOM_ENEMIES_II') +table.insert(claspects['Page of Doom'].syndromes[4],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Page of Doom'].syndromes[4],'DEUNDEAD_FRIENDS') +table.insert(claspects['Page of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Page of Doom'].syndromes[5],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Page of Doom'].syndromes[6],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Page of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Page of Doom'].syndromes[7],'STAVE_DOOM_I') +table.insert(claspects['Page of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Page of Doom'].syndromes[8],'DOOM_ENEMIES_I') +table.insert(claspects['Page of Doom'].syndromes[8],'DOOM_ENEMIES_II') +table.insert(claspects['Page of Doom'].syndromes[8],'STAVE_DOOM_II') +table.insert(claspects['Page of Doom'].syndromes[9],'DOOM_ENEMIES_III') +table.insert(claspects['Page of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_V') +table.insert(claspects['Page of Doom'].syndromes[10],'DOOM_ENEMIES_IV') +table.insert(claspects['Page of Doom'].syndromes[10],'DOOM_ENEMIES_V') +table.insert(claspects['Prince of Doom'].syndromes[1],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Prince of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Prince of Doom'].syndromes[3],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Prince of Doom'].syndromes[4],'DOOM_ENEMIES_I') +table.insert(claspects['Prince of Doom'].syndromes[5],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Prince of Doom'].syndromes[6],'DOOM_ENEMIES_II') +table.insert(claspects['Prince of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Prince of Doom'].syndromes[8],'DOOM_ENEMIES_III') +table.insert(claspects['Prince of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_V') +table.insert(claspects['Prince of Doom'].syndromes[10],'DOOM_ENEMIES_IV') +table.insert(claspects['Rogue of Doom'].syndromes[1],'STAVE_DOOM_I') +table.insert(claspects['Rogue of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Rogue of Doom'].syndromes[3],'STAVE_DOOM_II') +table.insert(claspects['Rogue of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Rogue of Doom'].syndromes[5],'DOOM_ENEMIES_I') +table.insert(claspects['Rogue of Doom'].syndromes[6],'DETECT_LORD_ENGLISH') +table.insert(claspects['Rogue of Doom'].syndromes[7],'HEAL_MILD_III') +table.insert(claspects['Rogue of Doom'].syndromes[8],'DOOM_ENEMIES_II') +table.insert(claspects['Rogue of Doom'].syndromes[9],'HEAL_FULL_I') +table.insert(claspects['Rogue of Doom'].syndromes[10],'DOOM_ENEMIES_III') +table.insert(claspects['Thief of Doom'].syndromes[1],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Thief of Doom'].syndromes[2],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Thief of Doom'].syndromes[3],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Thief of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Thief of Doom'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Thief of Doom'].syndromes[6],'DOOM_ENEMIES_I') +table.insert(claspects['Thief of Doom'].syndromes[7],'DOOM_ENEMIES_II') +table.insert(claspects['Thief of Doom'].syndromes[8],'DOOM_ENEMIES_III') +table.insert(claspects['Thief of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_V') +table.insert(claspects['Thief of Doom'].syndromes[10],'DOOM_ENEMIES_IV') +table.insert(claspects['Sylph of Doom'].syndromes[1],'STAVE_DOOM_I') +table.insert(claspects['Sylph of Doom'].syndromes[2],'HEAL_MILD_I') +table.insert(claspects['Sylph of Doom'].syndromes[3],'STAVE_DOOM_II') +table.insert(claspects['Sylph of Doom'].syndromes[4],'HEAL_MILD_II') +table.insert(claspects['Sylph of Doom'].syndromes[5],'HEAL_MILD_III') +table.insert(claspects['Sylph of Doom'].syndromes[6],'HEAL_FULL_I') +table.insert(claspects['Sylph of Doom'].syndromes[7],'TIME_AGE_DOWN') +table.insert(claspects['Sylph of Doom'].syndromes[9],'HEAL_FULL_II') +table.insert(claspects['Bard of Doom'].syndromes[1],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Bard of Doom'].syndromes[2],'DEUNDEAD_FRIENDS') +table.insert(claspects['Bard of Doom'].syndromes[3],'INCREASE_FORCE_ENEMY_II') +table.insert(claspects['Bard of Doom'].syndromes[4],'DEUNDEAD_ENEMIES') +table.insert(claspects['Bard of Doom'].syndromes[5],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Bard of Doom'].syndromes[6],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Bard of Doom'].syndromes[7],'INCREASE_FORCE_ENEMY_IV') +table.insert(claspects['Bard of Doom'].syndromes[8],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Bard of Doom'].syndromes[9],'INCREASE_FORCE_ENEMY_V') +table.insert(claspects['Bard of Doom'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Mage of Doom'].syndromes[1],'DETECT_LORD_ENGLISH') +table.insert(claspects['Mage of Doom'].syndromes[3],'STAVE_DOOM_I') +table.insert(claspects['Mage of Doom'].syndromes[5],'STAVE_DOOM_II') +table.insert(claspects['Mage of Doom'].skills[3],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Doom'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[5],{name='DODGING', bonus=500}) +table.insert(claspects['Mage of Doom'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[7],{name='DODGING', bonus=700}) +table.insert(claspects['Mage of Doom'].skills[8],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[9],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[10],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[11],{name='DODGING', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Doom'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Doom'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Doom'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].skills[11],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Doom'].attributes[3],{name='KINESTHETIC_SENSE', bonus=1500}) +table.insert(claspects['Mage of Doom'].attributes[4],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Mage of Doom'].attributes[5],{name='KINESTHETIC_SENSE', bonus=500}) +table.insert(claspects['Mage of Doom'].attributes[6],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Mage of Doom'].attributes[7],{name='KINESTHETIC_SENSE', bonus=1500}) +table.insert(claspects['Mage of Doom'].attributes[8],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Mage of Doom'].attributes[9],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Mage of Doom'].attributes[10],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Mage of Doom'].attributes[11],{name='KINESTHETIC_SENSE', bonus=1000}) +table.insert(claspects['Heir of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Heir of Mind'].syndromes[3],'EUSTRESS_I') +table.insert(claspects['Heir of Mind'].syndromes[4],'DISTRESS_I') +table.insert(claspects['Heir of Mind'].syndromes[5],'DISTRESS_II') +table.insert(claspects['Heir of Mind'].syndromes[6],'EUSTRESS_II') +table.insert(claspects['Heir of Mind'].syndromes[7],'DISTRESS_III') +table.insert(claspects['Heir of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Heir of Mind'].syndromes[10],'EUSTRESS_III') +table.insert(claspects['Seer of Mind'].attributes[2],{name='ANALYTICAL_ABILITY', bonus=500}) +table.insert(claspects['Seer of Mind'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Seer of Mind'].attributes[4],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Seer of Mind'].attributes[5],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Seer of Mind'].attributes[8],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Seer of Mind'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Seer of Mind'].attributes[10],{name='ANALYTICAL_ABILITY', bonus=5000}) +table.insert(claspects['Seer of Mind'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Mind'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Mind'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Seer of Mind'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Mind'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Mind'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Seer of Mind'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Mind'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Seer of Mind'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=900}) +table.insert(claspects['Seer of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Knight of Mind'].skills[1],{name='DODGING', bonus=500}) +table.insert(claspects['Knight of Mind'].skills[3],{name='DODGING', bonus=600}) +table.insert(claspects['Knight of Mind'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Knight of Mind'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Knight of Mind'].skills[1],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Knight of Mind'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Knight of Mind'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Knight of Mind'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Knight of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Knight of Mind'].syndromes[4],'DISTRESS_I') +table.insert(claspects['Knight of Mind'].syndromes[6],'DISTRESS_II') +table.insert(claspects['Knight of Mind'].syndromes[7],'INSANITY_I') +table.insert(claspects['Knight of Mind'].syndromes[8],'DISTRESS_III') +table.insert(claspects['Knight of Mind'].syndromes[9],'INSANITY_II') +table.insert(claspects['Knight of Mind'].syndromes[10],'DISTRESS_IV') +table.insert(claspects['Witch of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Witch of Mind'].syndromes[2],'EUSTRESS_I') +table.insert(claspects['Witch of Mind'].syndromes[3],'DISTRESS_I') +table.insert(claspects['Witch of Mind'].syndromes[4],'DISTRESS_II') +table.insert(claspects['Witch of Mind'].syndromes[5],'EUSTRESS_II') +table.insert(claspects['Witch of Mind'].syndromes[6],'DISTRESS_III') +table.insert(claspects['Witch of Mind'].syndromes[7],'INSANITY_I') +table.insert(claspects['Witch of Mind'].syndromes[8],'DISTRESS_IV') +table.insert(claspects['Witch of Mind'].syndromes[9],'EUSTRESS_III') +table.insert(claspects['Witch of Mind'].syndromes[10],'INSANITY_II') +table.insert(claspects['Maid of Mind'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Maid of Mind'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Maid of Mind'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=4000}) +table.insert(claspects['Maid of Mind'].syndromes[3],'EUSTRESS_I') +table.insert(claspects['Maid of Mind'].syndromes[4],'DISTRESS_I') +table.insert(claspects['Maid of Mind'].syndromes[5],'DISTRESS_II') +table.insert(claspects['Maid of Mind'].syndromes[6],'EUSTRESS_II') +table.insert(claspects['Maid of Mind'].syndromes[7],'DISTRESS_III') +table.insert(claspects['Maid of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Maid of Mind'].syndromes[10],'EUSTRESS_III') +table.insert(claspects['Page of Mind'].syndromes[1],'EUSTRESS_SELF') +table.insert(claspects['Page of Mind'].syndromes[5],'EUSTRESS_I') +table.insert(claspects['Page of Mind'].syndromes[5],'DISTRESS_I') +table.insert(claspects['Page of Mind'].syndromes[6],'DISTRESS_II') +table.insert(claspects['Page of Mind'].syndromes[6],'EUSTRESS_II') +table.insert(claspects['Page of Mind'].syndromes[7],'DISTRESS_III') +table.insert(claspects['Page of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Page of Mind'].syndromes[9],'INSANITY_I') +table.insert(claspects['Page of Mind'].syndromes[10],'EUSTRESS_III') +table.insert(claspects['Page of Mind'].syndromes[10],'INSANITY_II') +table.insert(claspects['Page of Mind'].syndromes[10],'UNINSANE') +table.insert(claspects['Page of Mind'].syndromes[10],'AGONY_V') +table.insert(claspects['Page of Mind'].syndromes[10],'DESKILL_II') +table.insert(claspects['Page of Mind'].syndromes[10],'DEATTRIBUTE_II') +table.insert(claspects['Prince of Mind'].skills[1],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Prince of Mind'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[10],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Prince of Mind'].skills[1],{name='DODGING', bonus=500}) +table.insert(claspects['Prince of Mind'].skills[3],{name='DODGING', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[4],{name='DODGING', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[6],{name='DODGING', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[10],{name='DODGING', bonus=700}) +table.insert(claspects['Prince of Mind'].skills[1],{name='MELEE_COMBAT', bonus=500}) +table.insert(claspects['Prince of Mind'].skills[3],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[4],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[6],{name='MELEE_COMBAT', bonus=600}) +table.insert(claspects['Prince of Mind'].skills[10],{name='MELEE_COMBAT', bonus=700}) +table.insert(claspects['Prince of Mind'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Prince of Mind'].attributes[3],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Prince of Mind'].attributes[4],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Prince of Mind'].attributes[6],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Prince of Mind'].attributes[10],{name='WILLPOWER', bonus=3000}) +table.insert(claspects['Prince of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Prince of Mind'].syndromes[3],'DISTRESS_I') +table.insert(claspects['Prince of Mind'].syndromes[4],'DISTRESS_II') +table.insert(claspects['Prince of Mind'].syndromes[6],'DISTRESS_III') +table.insert(claspects['Prince of Mind'].syndromes[7],'INSANITY_I') +table.insert(claspects['Prince of Mind'].syndromes[8],'DISTRESS_IV') +table.insert(claspects['Prince of Mind'].syndromes[10],'INSANITY_II') +table.insert(claspects['Rogue of Mind'].syndromes[1],'DEATTRIBUTE_I') +table.insert(claspects['Rogue of Mind'].syndromes[2],'EUSTRESS_SELF') +table.insert(claspects['Rogue of Mind'].syndromes[3],'DISTRESS_I') +table.insert(claspects['Rogue of Mind'].syndromes[4],'EUSTRESS_I') +table.insert(claspects['Rogue of Mind'].syndromes[5],'DISTRESS_II') +table.insert(claspects['Rogue of Mind'].syndromes[6],'EUSTRESS_II') +table.insert(claspects['Rogue of Mind'].syndromes[7],'DESKILL_I') +table.insert(claspects['Rogue of Mind'].syndromes[8],'DISTRESS_III') +table.insert(claspects['Rogue of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Rogue of Mind'].syndromes[10],'EUSTRESS_III') +table.insert(claspects['Thief of Mind'].syndromes[1],'DEATTRIBUTE_I') +table.insert(claspects['Thief of Mind'].syndromes[2],'EUSTRESS_SELF') +table.insert(claspects['Thief of Mind'].syndromes[3],'DISTRESS_I') +table.insert(claspects['Thief of Mind'].syndromes[4],'DISTRESS_II') +table.insert(claspects['Thief of Mind'].syndromes[5],'DESKILL_I') +table.insert(claspects['Thief of Mind'].syndromes[6],'DISTRESS_III') +table.insert(claspects['Thief of Mind'].syndromes[7],'DESKILL_II') +table.insert(claspects['Thief of Mind'].syndromes[8],'DEATTRIBUTE_II') +table.insert(claspects['Thief of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Thief of Mind'].syndromes[10],'INSANITY_II') +table.insert(claspects['Sylph of Mind'].skills[2],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[3],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[4],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[5],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[6],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[7],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[8],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[9],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[10],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[11],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Mind'].attributes[2],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[3],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[4],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[5],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[6],{name='SOCIAL_AWARENESS', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[7],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[8],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[9],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[10],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[11],{name='SOCIAL_AWARENESS', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[1],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[2],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[4],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[5],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[6],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Sylph of Mind'].attributes[7],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[8],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[10],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Sylph of Mind'].attributes[11],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Sylph of Mind'].skills[2],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[3],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[4],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[5],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[6],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Mind'].skills[7],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[8],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[9],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[10],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Mind'].skills[11],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Mind'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Sylph of Mind'].syndromes[6],'UNINSANE') +table.insert(claspects['Bard of Mind'].syndromes[1],'DEATTRIBUTE_I') +table.insert(claspects['Bard of Mind'].syndromes[2],'INSANITY_I') +table.insert(claspects['Bard of Mind'].syndromes[3],'DISTRESS_I') +table.insert(claspects['Bard of Mind'].syndromes[4],'DISTRESS_II') +table.insert(claspects['Bard of Mind'].syndromes[5],'DESKILL_I') +table.insert(claspects['Bard of Mind'].syndromes[6],'DISTRESS_III') +table.insert(claspects['Bard of Mind'].syndromes[7],'DESKILL_II') +table.insert(claspects['Bard of Mind'].syndromes[8],'DEATTRIBUTE_II') +table.insert(claspects['Bard of Mind'].syndromes[9],'DISTRESS_IV') +table.insert(claspects['Bard of Mind'].syndromes[10],'INSANITY_II') +table.insert(claspects['Mage of Mind'].attributes[2],{name='ANALYTICAL_ABILITY', bonus=500}) +table.insert(claspects['Mage of Mind'].attributes[3],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Mage of Mind'].attributes[4],{name='ANALYTICAL_ABILITY', bonus=250}) +table.insert(claspects['Mage of Mind'].attributes[5],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Mage of Mind'].attributes[8],{name='ANALYTICAL_ABILITY', bonus=2000}) +table.insert(claspects['Mage of Mind'].attributes[9],{name='ANALYTICAL_ABILITY', bonus=1000}) +table.insert(claspects['Mage of Mind'].attributes[10],{name='ANALYTICAL_ABILITY', bonus=5000}) +table.insert(claspects['Mage of Mind'].skills[2],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Mind'].skills[3],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Mind'].skills[4],{name='SITUATIONAL_AWARENESS', bonus=500}) +table.insert(claspects['Mage of Mind'].skills[5],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Mind'].skills[6],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Mind'].skills[7],{name='SITUATIONAL_AWARENESS', bonus=600}) +table.insert(claspects['Mage of Mind'].skills[8],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Mind'].skills[9],{name='SITUATIONAL_AWARENESS', bonus=700}) +table.insert(claspects['Mage of Mind'].syndromes[1],'TIME_INCREASE_LUCK_SELF') +table.insert(claspects['Mage of Mind'].syndromes[10],'INSANITY_I') +table.insert(claspects['Heir of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Heir of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Heir of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Heir of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Heir of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Heir of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Heir of Rage'].syndromes[7],'BLISS_II') +table.insert(claspects['Heir of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Heir of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Heir of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Seer of Rage'].syndromes[3],'DETECT_LORD_ENGLISH') +table.insert(claspects['Seer of Rage'].attributes[2],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[3],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[4],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[5],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[6],{name='FOCUS', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[7],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[8],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[9],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[10],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[11],{name='FOCUS', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[2],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[3],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[4],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[6],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Seer of Rage'].attributes[7],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[8],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[9],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[10],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Seer of Rage'].attributes[11],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Knight of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Knight of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Knight of Rage'].syndromes[3],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Knight of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Knight of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Knight of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Knight of Rage'].syndromes[7],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Knight of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Knight of Rage'].syndromes[9],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Knight of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Witch of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Witch of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Witch of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Witch of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Witch of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Witch of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Witch of Rage'].syndromes[7],'BLISS_II') +table.insert(claspects['Witch of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Witch of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Witch of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Maid of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Maid of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Maid of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Maid of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Maid of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Maid of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Maid of Rage'].syndromes[7],'BLISS_II') +table.insert(claspects['Maid of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Maid of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Maid of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Page of Rage'].syndromes[3],'ENRAGE_I') +table.insert(claspects['Page of Rage'].syndromes[3],'ENRAGE_II') +table.insert(claspects['Page of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Page of Rage'].syndromes[6],'ENRAGE_III') +table.insert(claspects['Page of Rage'].syndromes[6],'ENRAGE_IV') +table.insert(claspects['Page of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Page of Rage'].syndromes[8],'BLISS_II') +table.insert(claspects['Page of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Page of Rage'].syndromes[10],'BLISS_III') +table.insert(claspects['Page of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Page of Rage'].syndromes[10],'INSANITY_II') +table.insert(claspects['Prince of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Prince of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Prince of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Prince of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Prince of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Prince of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Prince of Rage'].syndromes[7],'BLISS_II') +table.insert(claspects['Prince of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Prince of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Prince of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Rogue of Rage'].syndromes[1],'BLISS_I') +table.insert(claspects['Rogue of Rage'].syndromes[2],'ENRAGE_I') +table.insert(claspects['Rogue of Rage'].syndromes[3],'BLISS_II') +table.insert(claspects['Rogue of Rage'].syndromes[4],'ENRAGE_II') +table.insert(claspects['Rogue of Rage'].syndromes[5],'ENRAGE_III') +table.insert(claspects['Rogue of Rage'].syndromes[6],'ENRAGE_IV') +table.insert(claspects['Rogue of Rage'].syndromes[7],'ENRAGE_V') +table.insert(claspects['Rogue of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Rogue of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Rogue of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Thief of Rage'].syndromes[1],'BLISS_I') +table.insert(claspects['Thief of Rage'].syndromes[2],'REDUCE_FORCE_SELF_I') +table.insert(claspects['Thief of Rage'].syndromes[3],'BLISS_II') +table.insert(claspects['Thief of Rage'].syndromes[4],'REDUCE_FORCE_SELF_II') +table.insert(claspects['Thief of Rage'].syndromes[5],'REDUCE_FORCE_SELF_III') +table.insert(claspects['Thief of Rage'].syndromes[6],'INCREASE_FORCE_ENEMY_I') +table.insert(claspects['Thief of Rage'].syndromes[7],'REDUCE_FORCE_SELF_IV') +table.insert(claspects['Thief of Rage'].syndromes[8],'INCREASE_FORCE_ENEMY_III') +table.insert(claspects['Thief of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Thief of Rage'].syndromes[10],'REDUCE_FORCE_SELF_V') +table.insert(claspects['Sylph of Rage'].skills[2],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[3],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[4],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[5],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[6],{name='CONSOLE', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[7],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[8],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[9],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[10],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[11],{name='CONSOLE', bonus=600}) +table.insert(claspects['Sylph of Rage'].attributes[2],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[3],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[4],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[6],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[7],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[8],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[9],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[10],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[11],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[1],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[2],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[3],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[4],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[5],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[6],{name='FOCUS', bonus=1000}) +table.insert(claspects['Sylph of Rage'].attributes[7],{name='FOCUS', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[8],{name='FOCUS', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[9],{name='FOCUS', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[10],{name='FOCUS', bonus=2000}) +table.insert(claspects['Sylph of Rage'].attributes[11],{name='FOCUS', bonus=2000}) +table.insert(claspects['Sylph of Rage'].skills[2],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[3],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[4],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[5],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[6],{name='PACIFY', bonus=500}) +table.insert(claspects['Sylph of Rage'].skills[7],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[8],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[9],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[10],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Rage'].skills[11],{name='PACIFY', bonus=600}) +table.insert(claspects['Sylph of Rage'].syndromes[1],'HEAL_MILD_I') +table.insert(claspects['Sylph of Rage'].syndromes[6],'UNINSANE') +table.insert(claspects['Bard of Rage'].syndromes[1],'ENRAGE_I') +table.insert(claspects['Bard of Rage'].syndromes[2],'ENRAGE_II') +table.insert(claspects['Bard of Rage'].syndromes[3],'BLISS_I') +table.insert(claspects['Bard of Rage'].syndromes[4],'ENRAGE_III') +table.insert(claspects['Bard of Rage'].syndromes[5],'ENRAGE_IV') +table.insert(claspects['Bard of Rage'].syndromes[6],'ENRAGE_V') +table.insert(claspects['Bard of Rage'].syndromes[7],'BLISS_II') +table.insert(claspects['Bard of Rage'].syndromes[8],'ENRAGE_VI') +table.insert(claspects['Bard of Rage'].syndromes[9],'BLISS_III') +table.insert(claspects['Bard of Rage'].syndromes[10],'ENRAGE_VII') +table.insert(claspects['Mage of Rage'].syndromes[3],'DETECT_LORD_ENGLISH') +table.insert(claspects['Mage of Rage'].syndromes[9],'ENRAGE_V') +table.insert(claspects['Mage of Rage'].syndromes[10],'BLISS_III') +table.insert(claspects['Mage of Rage'].attributes[2],{name='FOCUS', bonus=2000}) +table.insert(claspects['Mage of Rage'].attributes[3],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[4],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[5],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[6],{name='FOCUS', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[7],{name='FOCUS', bonus=2000}) +table.insert(claspects['Mage of Rage'].attributes[8],{name='FOCUS', bonus=2000}) +table.insert(claspects['Mage of Rage'].attributes[2],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Mage of Rage'].attributes[3],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[4],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[5],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[6],{name='WILLPOWER', bonus=1000}) +table.insert(claspects['Mage of Rage'].attributes[7],{name='WILLPOWER', bonus=2000}) +table.insert(claspects['Mage of Rage'].attributes[8],{name='WILLPOWER', bonus=2000}) + +dfhack.script_environment('modtools/putnam_skills').addSkills(claspects) \ No newline at end of file diff --git a/raw/scripts/fortbent/extra_gui.lua b/raw/scripts/fortbent/extra_gui.lua index 5a93c3f..4c7a201 100644 --- a/raw/scripts/fortbent/extra_gui.lua +++ b/raw/scripts/fortbent/extra_gui.lua @@ -2,7 +2,7 @@ local gui=require('gui') local widgets=require('gui.widgets') -local roses = dfhack.script_environment('base/roses-table').loadRosesTable() +local putnamSkills=dfhack.script_environment('modtools/putnam_skills') local TransparentScreen=defclass(TransparentScreen,gui.Screen) @@ -19,50 +19,45 @@ function TransparentScreen:onRender() end local sburbColors={ - BREATH={fg=COLOR_LIGHTCYAN,bg=COLOR_BLACK}, - LIGHT={fg=COLOR_YELLOW,bg=COLOR_BLACK}, - TIME={fg=COLOR_LIGHTRED,bg=COLOR_BLACK}, - SPACE={fg=COLOR_WHITE,bg=COLOR_BLACK}, - LIFE={fg=COLOR_LIGHTGREEN,bg=COLOR_BLACK}, - HOPE={fg=COLOR_YELLOW,bg=COLOR_BLACK}, - VOID={fg=COLOR_BLUE,bg=COLOR_BLACK}, - HEART={fg=COLOR_MAGENTA,bg=COLOR_BLACK}, - BLOOD={fg=COLOR_RED,bg=COLOR_BLACK}, - DOOM={fg=COLOR_GREEN,bg=COLOR_BLACK}, - MIND={fg=COLOR_CYAN,bg=COLOR_BLACK}, - RAGE={fg=COLOR_LIGHTMAGENTA,bg=COLOR_BLACK} + Breath={fg=COLOR_LIGHTCYAN,bg=COLOR_BLACK}, + Light={fg=COLOR_YELLOW,bg=COLOR_BLACK}, + Time={fg=COLOR_LIGHTRED,bg=COLOR_BLACK}, + Space={fg=COLOR_WHITE,bg=COLOR_BLACK}, + Life={fg=COLOR_LIGHTGREEN,bg=COLOR_BLACK}, + Hope={fg=COLOR_YELLOW,bg=COLOR_BLACK}, + Void={fg=COLOR_BLUE,bg=COLOR_BLACK}, + Heart={fg=COLOR_MAGENTA,bg=COLOR_BLACK}, + Blood={fg=COLOR_RED,bg=COLOR_BLACK}, + Doom={fg=COLOR_GREEN,bg=COLOR_BLACK}, + Mind={fg=COLOR_CYAN,bg=COLOR_BLACK}, + Rage={fg=COLOR_LIGHTMAGENTA,bg=COLOR_BLACK} } local sburbTiles={ - BREATH=0, - LIGHT=3, - TIME=1, - SPACE=2, - LIFE=7, - HOPE=8, - VOID=9, --the arbitrary numbers come from my arbitrary graphics page - HEART=6, - BLOOD=5, - DOOM=11, - MIND=10, - RAGE=4} + Breath=0, + Light=3, + Time=1, + Space=2, + Life=7, + Hope=8, + Void=9, --the arbitrary numbers come from my arbitrary graphics page + Heart=6, + Blood=5, + Doom=11, + Mind=10, + Rage=4} function getClaspect(unit) - local unitTable=roses.UnitTable[tostring(unit.id)] - if not unitTable then return {class=nil,color=nil} end - local unitClasses = roses.UnitTable[tostring(unit.id)]['Classes'] - if not unitClasses then return {class=nil,color=nil} end - local currentClass = unitClasses['Current'] - if not currentClass then return {class=nil,color=nil} end - local classes = roses.ClassTable - local currentClassName = currentClass['Name'] - if not unitClasses[currentClassName] then return {class=nil,color=nil} end - local currentClassLevel = tonumber(unitClasses[currentClassName]['Level'])+1 - local ofLocations={currentClassName:find('_OF_')} + local currentClass + local currentClasses = putnamSkills.getSkillsFromUnit(unit) + if currentClasses then currentClass=currentClasses[1] else return {class=false} end + local currentClassName = df.musical_form.find(currentClass.id).name.first_name + local currentClassLevel = currentClass.rating + local ofLocations={currentClassName:find(' of ')} local aspectColor=sburbColors[currentClassName:sub(ofLocations[2]+1,-1)] local className=currentClassName:sub(1,1)..currentClassName:sub(2,ofLocations[1]-1):lower() local aspectName=currentClassName:sub(ofLocations[2]+1,ofLocations[2]+1)..currentClassName:sub(ofLocations[2]+2,-1):lower() - local tile=dfhack.screen.findGraphicsTile('PUTNAM_GODTIER',sburbTiles[aspectName:upper()],0) + local tile=dfhack.screen.findGraphicsTile('PUTNAM_GODTIER',sburbTiles[aspectName],0) return {class=className,aspect=aspectName,color=aspectColor,classLength=ofLocations[2],tile=tile} end diff --git a/raw/scripts/fortbent/fraymotif.lua b/raw/scripts/fortbent/fraymotif.lua index 2ae3713..9153d59 100644 --- a/raw/scripts/fortbent/fraymotif.lua +++ b/raw/scripts/fortbent/fraymotif.lua @@ -1,728 +1,705 @@ -fraymotifEffects={} - -fraymotifAffects={} - -fraymotifModifiers={} - -fraymotifNames={} - -fraymotifAdjectives={} - -local claspects=dfhack.script_environment('fortbent/claspects') - -for k,v in ipairs(claspects.aspects) do - fraymotifEffects[v]={} - fraymotifAffects[v]={} - fraymotifModifiers[v]={} - fraymotifNames[v]={} - fraymotifAdjectives[v]={} -end - -fraymotifEffects.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - if affectType=='unit' then - local duration=100 --how long, in ticks, it ought to last - local damage=10 --how much damage it ought to do; also applies to emotion severity and projectile speed. - local tickRate=50 --how often the effect should tick within the duration. - for k,v in ipairs(modifiers) do - if v.duration then duration=duration*v.duration end --more motifers=exponentially more powerful fraymotifs. - if v.strength then damage=damage*v.strength end - if v.speed then tickRate=math.ceil(tickRate/v.speed) end - end - if duration>0 then - for i=tickRate,duration,tickRate do --in the default, this'll increment 50, 100 - dfhack.timeout(i,'ticks',function() defender.body.blood_count=defender.body.blood_count-damage end) - end - else - defender.body.blood_count=defender.body.blood_count-damage - end - end - if affectType=='soul' then - local duration=100 --how long, in ticks, it ought to last - local damage=10 --how much damage it ought to do; also applies to emotion severity and projectile speed. - local tickRate=50 --how often the effect should tick within the duration. - for k,v in ipairs(modifiers) do - if v.duration then duration=duration*v.duration end --more motifers=exponentially more powerful fraymotifs. - if v.strength then damage=damage*v.strength end - if v.speed then tickRate=math.ceil(tickRate/v.speed) end - end - if duration>0 then - for i=tickRate,duration,tickRate do --in the default, this'll increment 50, 100 - dfhack.timeout(i,'ticks',function() defender.status.current_soul.personality.stress_level=defender.status.current_soul.personality.stress_level+damage end) --do you ever wish for some GODDAMN += - end - else - defender.status.current_soul.personality.stress_level=defender.status.current_soul.personality.stress_level+damage - end - end -end - -fraymotifEffects.BREATH.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - if affectType=='unit' then - local speed=100 --how long it'll take to fully change the temperature - local reduction=30 --degrees in Fahrenheit/urists of change in temperature - for k,v in ipairs(modifiers) do - if v.speed then speed=math.ceil(speed/v.speed) end - if v.strength then reduction=math.ceil(reduction*v.strength) end - end - local unitFuncs=dfhack.script_environment('functions/unit') --hey i'm using more of roses stuff now - if speed>0 then - for i=math.floor(speed/reduction),speed,speed/reduction do - dfhack.timeout(math.floor(i),'ticks',function() - for k,v in ipairs(defender.status2.body_part_temperature) do - unitFuncs.changeBody(defender,k,'temperature',-1,0) - end - end) - end - else - for k,v in ipairs(defender.status2.body_part_temperature) do - unitFuncs.changeBody(defender,k,'temperature',-reduction,0) - end - end - elseif affectType=='soul' then - local unitFuncs=dfhack.script_environment('functions/unit') - local duration=1000 - local reduction=500 - for k,v in ipairs(modifiers) do - if v.duration then duration=math.ceil(duration*v.duration) end - if v.strength then reduction=math.ceil(reduction*v.strength) end - end - unitFuncs.changeAttribute(defender,'WILLPOWER',-reduction,duration) - end - return true -end - -fraymotifEffects.LIGHT.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - if affectType=='unit' then - local speed=100 --how long it'll take to fully change the temperature - local addition=30 --degrees in Fahrenheit/urists of change in temperature - for k,v in ipairs(modifiers) do - if v.speed then speed=math.ceil(speed/v.speed) end - if v.strength then addition=math.ceil(addition*v.strength) end - end - local unitFuncs=dfhack.script_environment('functions/unit') --hey i'm using more of roses stuff now - if speed>0 then - for i=math.floor(speed/addition),speed,speed/addition do - dfhack.timeout(math.floor(i),'ticks',function() - for k,v in ipairs(defender.status2.body_part_temperature) do - unitFuncs.changeBody(defender,k,'temperature',1,0) - end - end) - end - else - for k,v in ipairs(defender.status2.body_part_temperature) do - unitFuncs.changeBody(defender,k,'temperature',addition,0) - end - end - elseif affectType=='soul' then - local unitFuncs=dfhack.script_environment('functions/unit') - local duration=1000 - local reduction=500 - for k,v in ipairs(modifiers) do - if v.duration then duration=math.ceil(duration*v.duration) end - if v.strength then reduction=math.ceil(reduction*v.strength) end - end - unitFuncs.changeAttribute(defender,'ANALYTICAL_ABILITY',-reduction,duration) - end - return true -end - -fraymotifEffects.TIME.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - if (specialAffect.seer or specialAffect.mage) and specialAffect.mind then - local radius = {3,3,3} - for k,v in ipairs(modifiers) do - if v.radius then for kk,vv in ipairs(radius) do vv=vv+v.radius end end - end - local wrapper=dfhack.script_environment('functions/wrapper') - local targetList,numFound=wrapper.checkLocation(attacker,radius) - local allies,num_civ=wrapper.checkTarget(attacker,targetList,'civ') - for k,v in ipairs(allies) do - dfhack.run_script('full-heal','-r','-unit',v.id) - end - else - if affectType=='unit' then - local duration=50 - for k,v in ipairs(modifiers) do - if v.strength then duration=math.ceil(duration*v.strength) end - if v.duration then duration=math.ceil(duration*v.duration) end - end - local action_actions={ --i literally copied this all from sparking - Move=function(data) - data.move.timer=duration - end, - Attack=function(data) - if data.attack.timer1>0 then - data.attack.timer1=duration - else - data.attack.timer2=duration - end - end, - HoldTerrain=function(data) - data.holdterrain.timer=duration - end, - Climb=function(data) - data.climb.timer=duration - end, - Unsteady=function(data) - data.unsteady.timer=duration - end, - Recover=function(data) - data.recover.timer=duration - end, - StandUp=function(data) - data.standup.timer=duration - end, - LieDown=function(data) - data.liedown.timer=duration - end, - Job2=function(data) - data.job2.timer=duration - end, - PushObject=function(data) - data.pushobject.timer=duration - end, - SuckBlood=function(data) - data.suckblood.timer=duration - end - } - for _,action in ipairs(defender.actions) do - local func=action_actions[df.unit_action_type[action.type]] - if func then func(action.data) end - end - end - end -end - -fraymotifEffects.SPACE.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - local unitFuncs=dfhack.script_environment('functions/unit') - local velocity=1 - for k,v in ipairs(modifiers) do - if v.strength then velocity=v.strength*velocity end - end - unitFuncs.makeProjectile(defender,{0,0,velocity}) -end - ---life is generic - ---i actually sorta made the generic one to be like life anyway lol - ---i should probably come up with different fraymotifs for more specific life ones though - -local function hopeSplode(hopePerson,victim,power,range) - local deltaCoords={x=hopePerson.pos.x-victim.pos.x,y=hopePerson.pos.y-victim.pos.y,z=hopePerson.pos.z-victim.pos.z} - local biggestCoord=math.max(deltaCoords.x,deltaCoords.y,deltaCoords.z) - if biggestCoord==0 then biggestCoord=1 deltaCoords.z=1 end - local direction={x=deltaCoords.x/biggestCoord,y=deltaCoords.y/biggestCoord,z=deltaCoords.z/biggestCoord} --i do not particularly feel like quaternions at the moment - local distance=math.sqrt((deltaCoords.x*2)^2+(deltaCoords.y*2)^2+(deltaCoords.z*3)^2) --tiles are 2x2x3 - local newPower=power/(distance/(2.3333*math.max(0.5,range)))^3 --2.3333 for the proper meter adjustment up there - local unitFuncs=dfhack.script_environment('functions/unit') - unitFuncs.makeProjectile(victim,{direction.x*newPower,direction.y*newPower,direction.z*newPower}) --basically an expanding concussive wave with realistic dropoff -end - -fraymotifEffects.HOPE.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - local power=1 - local range=1 - for k,v in ipairs(modifiers) do - if v.strength then power=v.strength*power end - if v.radius then range=v.radius+range end - end - local wrapper=dfhack.script_environment('functions/wrapper') - local targetList=wrapper.checkLocation(attacker,{50,50,50}) --!!!!! - local enemies,num_enemies_found=wrapper.checkTarget(attacker,targetList,'enemy') - local animals,num_animals_found=wrapper.checkTarget(attacker,targetList,'wild') - for k,v in ipairs(enemies) do - hopeSplode(attacker,defender,power,range) - end - for k,v in ipairs(animals) do - hopeSplode(attacker,defender,power,range) - end -end - -fraymotifEffects.VOID.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) - local chance=0.002 - for k,v in ipairs(modifiers) do - if v.strength then chance=v.strength*chance end - end - local rng=dfhack.random.new() - if rng:drandom0()0 then + for i=tickRate,duration,tickRate do --in the default, this'll increment 50, 100 + dfhack.timeout(i,'ticks',function() defender.body.blood_count=defender.body.blood_count-damage end) + end + else + defender.body.blood_count=defender.body.blood_count-damage + end + end + if affectType=='soul' then + local duration=100 --how long, in ticks, it ought to last + local damage=10 --how much damage it ought to do; also applies to emotion severity and projectile speed. + local tickRate=50 --how often the effect should tick within the duration. + for k,v in ipairs(modifiers) do + if v.duration then duration=duration*v.duration end --more motifers=exponentially more powerful fraymotifs. + if v.strength then damage=damage*v.strength end + if v.speed then tickRate=math.ceil(tickRate/v.speed) end + end + if duration>0 then + for i=tickRate,duration,tickRate do --in the default, this'll increment 50, 100 + dfhack.timeout(i,'ticks',function() defender.status.current_soul.personality.stress_level=defender.status.current_soul.personality.stress_level+damage end) --do you ever wish for some GODDAMN += + end + else + defender.status.current_soul.personality.stress_level=defender.status.current_soul.personality.stress_level+damage + end + end +end + +fraymotifEffects.Breath.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + if affectType=='unit' then + local speed=100 --how long it'll take to fully change the temperature + local reduction=30 --degrees in Fahrenheit/urists of change in temperature + for k,v in ipairs(modifiers) do + if v.speed then speed=math.ceil(speed/v.speed) end + if v.strength then reduction=math.floor(reduction*v.strength+0.5) end + end + if speed>0 then + for i=math.floor(speed/reduction),speed,speed/reduction do + dfhack.timeout(math.floor(i),'ticks',function() + for k,v in ipairs(defender.status2.body_part_temperature) do + v.whole=math.max(0,math.min(65535,v.whole-1)) + end + end) + end + else + for k,v in ipairs(defender.status2.body_part_temperature) do + v.whole=math.max(0,math.min(65535,v.whole-reduction)) + end + end + elseif affectType=='soul' then + local duration=1000 + local reduction=500 + for k,v in ipairs(modifiers) do + if v.duration then duration=math.ceil(duration*v.duration) end + if v.strength then reduction=math.ceil(reduction*v.strength) end + end + fraymotifFuncs.changeAttribute(defender,'WILLPOWER',-reduction,duration) + end + return true +end + +fraymotifEffects.Light.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + if affectType=='unit' then + local speed=100 --how long it'll take to fully change the temperature + local addition=30 --degrees in Fahrenheit/urists of change in temperature + for k,v in ipairs(modifiers) do + if v.speed then speed=math.ceil(speed/v.speed) end + if v.strength then addition=math.ceil(addition*v.strength) end + end + if speed>0 then + for i=math.floor(speed/addition),speed,speed/addition do + dfhack.timeout(math.floor(i),'ticks',function() + for k,v in ipairs(defender.status2.body_part_temperature) do + v.whole=math.max(0,math.min(65535,v.whole+1)) + end + end) + end + else + for k,v in ipairs(defender.status2.body_part_temperature) do + v.whole=math.max(0,math.min(65535,v.whole+addition)) + end + end + elseif affectType=='soul' then + local duration=1000 + local reduction=500 + for k,v in ipairs(modifiers) do + if v.duration then duration=math.ceil(duration*v.duration) end + if v.strength then reduction=math.ceil(reduction*v.strength) end + end + fraymotifFuncs.changeAttribute(defender,'ANALYTICAL_ABILITY',-reduction,duration) + end + return true +end + +fraymotifEffects.Time.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + if (specialAffect.seer or specialAffect.mage) and specialAffect.mind then + local radius = {3,3,3} + for k,v in ipairs(modifiers) do + if v.radius then for kk,vv in ipairs(radius) do vv=vv+v.radius end end + end + local targetList,numFound=fraymotifFuncs.checkLocation(attacker,radius) + local allies,num_allies_found=fraymotifFuncs.checkTarget(attacker,targetList,'civ') + for k,v in ipairs(allies) do + dfhack.run_script('full-heal','-r','-unit',v.id) + end + else + if affectType=='unit' then + local duration=50 + for k,v in ipairs(modifiers) do + if v.strength then duration=math.ceil(duration*v.strength) end + if v.duration then duration=math.ceil(duration*v.duration) end + end + local action_actions={ --i literally copied this all from sparking + Move=function(data) + data.move.timer=duration + end, + Attack=function(data) + if data.attack.timer1>0 then + data.attack.timer1=duration + else + data.attack.timer2=duration + end + end, + HoldTerrain=function(data) + data.holdterrain.timer=duration + end, + Climb=function(data) + data.climb.timer=duration + end, + Unsteady=function(data) + data.unsteady.timer=duration + end, + Recover=function(data) + data.recover.timer=duration + end, + StandUp=function(data) + data.standup.timer=duration + end, + LieDown=function(data) + data.liedown.timer=duration + end, + Job2=function(data) + data.job2.timer=duration + end, + PushObject=function(data) + data.pushobject.timer=duration + end, + SuckBlood=function(data) + data.suckblood.timer=duration + end + } + for _,action in ipairs(defender.actions) do + local func=action_actions[df.unit_action_type[action.type]] + if func then func(action.data) end + end + end + end +end + +fraymotifEffects.Space.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + local velocity=1 + for k,v in ipairs(modifiers) do + if v.strength then velocity=v.strength*velocity end + end + fraymotifFuncs.makeProjectile(defender,{0,0,velocity}) +end + +--life is generic + +--i actually sorta made the generic one to be like life anyway lol + +--i should probably come up with different fraymotifs for more specific life ones though + +local function hopeSplode(hopePerson,victim,power,range) + local deltaCoords={x=hopePerson.pos.x-victim.pos.x,y=hopePerson.pos.y-victim.pos.y,z=hopePerson.pos.z-victim.pos.z} + local biggestCoord=math.max(deltaCoords.x,deltaCoords.y,deltaCoords.z) + if biggestCoord==0 then biggestCoord=1 deltaCoords.z=1 end + local direction={x=deltaCoords.x/biggestCoord,y=deltaCoords.y/biggestCoord,z=deltaCoords.z/biggestCoord} + local distance=math.sqrt((deltaCoords.x*2)^2+(deltaCoords.y*2)^2+(deltaCoords.z*3)^2) --tiles are 2x2x3 + local newPower=power/(distance/(2.3333*math.max(0.5,range)))^3 --2.3333 for the proper meter adjustment up there + fraymotifFuncs.makeProjectile(victim,{direction.x*newPower,direction.y*newPower,direction.z*newPower}) --basically an expanding concussive wave with realistic dropoff +end + +fraymotifEffects.Hope.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + local power=1 + local range=1 + for k,v in ipairs(modifiers) do + if v.strength then power=v.strength*power end + if v.radius then range=v.radius+range end + end + local targetList=fraymotifFuncs.checkLocation(attacker,{50,50,50}) --!!!!! + local enemies,num_enemies_found=fraymotifFuncs.checkTarget(attacker,targetList,'enemy') + local animals,num_animals_found=fraymotifFuncs.checkTarget(attacker,targetList,'wild') + for k,v in ipairs(enemies) do + hopeSplode(attacker,defender,power,range) + end + for k,v in ipairs(animals) do + hopeSplode(attacker,defender,power,range) + end +end + +fraymotifEffects.Void.GENERIC=function(attacker,defender,modifiers,affectType,specialAffect) + local chance=0.002 + for k,v in ipairs(modifiers) do + if v.strength then chance=v.strength*chance end + end + local rng=dfhack.random.new() + if rng:drandom0()0 then + dfhack.script_environment('modtools/persist_timeout').persistTimeout(duration,'fortbent/fraymotifFuncs','changeAttribute',{unit,attribute,-amount,0}) + end + elseif df.mental_attribute_type[attribute] then + unit.status.current_soul.mental_attrs[attribute].value=unit.status.current_soul.mental_attrs[attribute].value+amount + if duration>0 then + dfhack.script_environment('modtools/persist_timeout').persistTimeout(duration,'fortbent/fraymotifFuncs','changeAttribute',{unit,attribute,-amount,0}) + end + end +end + +--i do not feel particularly insane today, so i'll just copy+paste roses version here. + +function makeProjectile(unit,velocityVector) + if tonumber(unit) then + unit = df.unit.find(tonumber(unit)) + end + local vx = velocityVector[1] + local vy = velocityVector[2] + local vz = velocityVector[3] + local count=0 + local l = df.global.world.proj_list + local lastlist=l + l=l.next + while l do + count=count+1 + if l.next==nil then + lastlist=l + end + l = l.next + end + newlist = df.proj_list_link:new() + lastlist.next=newlist + newlist.prev=lastlist + proj = df.proj_unitst:new() + newlist.item=proj + proj.link=newlist + proj.id=df.global.proj_next_id + df.global.proj_next_id=df.global.proj_next_id+1 + proj.unit=unit + proj.origin_pos.x=unit.pos.x + proj.origin_pos.y=unit.pos.y + proj.origin_pos.z=unit.pos.z + proj.prev_pos.x=unit.pos.x + proj.prev_pos.y=unit.pos.y + proj.prev_pos.z=unit.pos.z + proj.cur_pos.x=unit.pos.x + proj.cur_pos.y=unit.pos.y + proj.cur_pos.z=unit.pos.z + proj.flags.no_impact_destroy=true + proj.flags.piercing=true + proj.flags.parabolic=true + proj.flags.unk9=true + proj.speed_x=vx + proj.speed_y=vy + proj.speed_z=vz + unitoccupancy = dfhack.maps.ensureTileBlock(unit.pos).occupancy[unit.pos.x%16][unit.pos.y%16] + if not unit.flags1.on_ground then + unitoccupancy.unit = false + else + unitoccupancy.unit_grounded = false + end + unit.flags1.projectile=true + unit.flags1.on_ground=false +end + +--Again, these next two are from Roses. I don't feel like reinventing the wheel. + +function checkLocation(center,radius) + if radius then + rx = tonumber(radius.x) or tonumber(radius[1]) or -1 + ry = tonumber(radius.y) or tonumber(radius[2]) or -1 + rz = tonumber(radius.z) or tonumber(radius[3]) or -1 + else + rx = -1 + ry = -1 + rz = -1 + end + local targetList = {} + local selected = {} + + n = 1 + unitList = df.global.world.units.active + if rx < 0 and ry < 0 and rz < 0 then + targetList[n] = center + else + local xmin = center.pos.x - rx + local ymin = center.pos.y - ry + local zmin = center.pos.z - rz + local xmax = center.pos.x + rx + local ymax = center.pos.y + ry + local zmax = center.pos.z + rz + targetList[n] = center + for i,unit in ipairs(unitList) do + if unit.pos.x <= xmax and unit.pos.x >= xmin and unit.pos.y <= ymax and unit.pos.y >= ymin and unit.pos.z <= zmax and unit.pos.z >= zmin and unit ~= center then + n = n + 1 + targetList[n] = unit + end + end + end + return targetList,n +end + +function checkTarget(source,targetList,target) + if not target then target = 'all' end + n = 0 + list = {} + + for i,unit in pairs(targetList) do + if target == 'enemy' then + if unit.invasion_id > 0 then + n = n + 1 + list[n] = unit + end + elseif target == 'friendly' then + if unit.invasion_id == -1 and unit.civ_id ~= -1 then + n = n + 1 + list[n] = unit + end + elseif target == 'civ' then + if source.civ_id == unit.civ_id then + n = n + 1 + list[n] = unit + end + elseif target == 'race' then + if source.race == unit.race then + n = n + 1 + list[n] = unit + end + elseif target == 'caste' then + if source.race == unit.race and source.caste == unit.caste then + n = n + 1 + list[n] = unit + end + elseif target == 'gender' then + if source.sex == unit.sex then + n = n + 1 + list[n] = unit + end + elseif target == 'wild' then + if unit.training_level == 9 and unit.civ_id == -1 then + n = n + 1 + list[n] = unit + end + elseif target == 'domestic' then + if unit.training_level == 7 and unit.civ_id == source.civ_id then + n = n + 1 + list[n] = unit + end + elseif target == 'all' then + n = #targetList + list = targetList + break + end + end + return list,n +end \ No newline at end of file diff --git a/raw/scripts/fortbent/grist.lua b/raw/scripts/fortbent/grist.lua index 280c687..faf215b 100644 --- a/raw/scripts/fortbent/grist.lua +++ b/raw/scripts/fortbent/grist.lua @@ -51,45 +51,4 @@ local function gristTorrent() grist:save() end -local function getClaspect(unit) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable=roses.UnitTable[tostring(unit.id)] - if not unitTable then return {class=nil,color=nil} end - local unitClasses = roses.UnitTable[tostring(unit.id)]['Classes'] - if not unitClasses then return {class=nil,color=nil} end - local currentClass = unitClasses['Current'] - if not currentClass then return {class=nil,color=nil} end - local classes = roses.ClassTable - local currentClassName = currentClass['Name'] - if not unitClasses[currentClassName] then return {class=nil,color=nil} end - local currentClassLevel = tonumber(unitClasses[currentClassName]['Level'])+1 - local ofLocations={currentClassName:find('_OF_')} - local className=currentClassName:sub(1,1)..currentClassName:sub(2,ofLocations[1]-1):lower() - local aspectName=currentClassName:sub(ofLocations[2]+1,ofLocations[2]+1)..currentClassName:sub(ofLocations[2]+2,-1):lower() - return {class=className,aspect=aspectName,level=currentClassLevel} -end - -local function experienceTorrent() - local timeout_tick=1 - local stealy_void_hero=false - local seery_doom_hero=false - for k,v in ipairs(df.global.world.units.active) do - if dfhack.units.isCitizen(v) then - local claspect=getClaspect(v) - if not seery_doom_hero and (claspect.aspect=='Doom' and (claspect.class=='Seer' or claspect.class=='Mage')) and claspect.level>5 then - seery_doom_hero=v - elseif not stealy_void_hero and claspect.aspect=='Void' and (claspect.class=='Rogue' or claspect.class=='Thief') and claspect.level>5 then - stealy_void_hero=v - end - dfhack.timeout(math.floor(timeout_tick),'ticks',function() pcall(function() dfhack.run_script('classes/add-experience','-unit',v.id,'-amount',1) end) end) - timeout_tick=timeout_tick+.5 - end - end - if stealy_void_hero and seery_doom_hero then - dfhack.run_script('fortbent/caledfwlch_event','-void',stealy_void_hero.id,'-doom',seery_doom_hero.id) - end -end - -require('repeat-util').scheduleUnlessAlreadyScheduled('GristTorrent',7,'days',gristTorrent) - -require('repeat-util').scheduleUnlessAlreadyScheduled('ExperienceTorrent',28,'days',experienceTorrent) \ No newline at end of file +require('repeat-util').scheduleUnlessAlreadyScheduled('GristTorrent',7,'days',gristTorrent) \ No newline at end of file diff --git a/raw/scripts/functions/building.lua b/raw/scripts/functions/building.lua deleted file mode 100644 index bd22739..0000000 --- a/raw/scripts/functions/building.lua +++ /dev/null @@ -1,124 +0,0 @@ -function addItem(building,item,dur) - if tonumber(building) then - building = df.building.find(tonumber(building)) - end - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - dfhack.items.moveToBuilding(item,building,2) - item.flags.in_building = true - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/building','removeItem',{building.id,item.id,0}) - end -end - -function removeItem(building,item,dur) - if tonumber(building) then - building = df.building.find(tonumber(building)) - end - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - item.flags.in_building = false - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/building','addItem',{building.id,item.id,0}) - end -end - -function changeSubtype(building,subtype,dur) - if tonumber(building) then - building = df.building.find(tonumber(building)) - end - - save = df.global.world.raws.buildings.all[building.custom_type].code - for _,x in ipairs(df.global.world.raws.buildings.all) do - if x.code == subtype then ctype = x.id end - end - if ctype == nil then - print('Cant find upgrade building') - return false - end - building.custom_type=ctype - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/building','changeSubtype',{building.id,save,0}) - end - - return true -end - -function findBuilding(search) - local primary = search[1] - local secondary = search[2] or 'NONE' - local tertiary = search[3] or 'NONE' - local quaternary = search[4] or 'NONE' - local buildingList = df.global.world.buildings.all - local targetList = {} - local target = nil - local n = 0 - if primary == 'RANDOM' then - if secondary == 'NONE' or secondary == 'ALL' then - for i,x in pairs(buildingList) do - n = n + 1 - targetList[n] = x - end - elseif secondary == 'WORKSHOP' then - for i,x in pairs(buildingList) do - if df.building_workshopst:is_instance(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'FURNACE' then - for i,x in pairs(buildingList) do - if df.building_furnacest:is_instance(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'TRADE_DEPOT' then - for i,x in pairs(buildingList) do - if df.building_tradedepotst:is_instance(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'STOCKPILE' then - for i,x in pairs(buildingList) do - if df.building_stockpilest:is_instance(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'ZONE' then - for i,x in pairs(buildingList) do - if df.building_civzonest:is_instance(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'CUSTOM' then - for i,x in pairs(buildingList) do - if df.building_workshopst:is_instance(x) or df.building_furnacest:is_instance(x) then - if ctype >= 0 then - if df.global.world.raws.buildings.all[ctype].code == tertiary then - n = n+1 - targetList[n] = x - end - end - end - end - end - end - if n > 0 then - targetList = dfhack.script_environment('functions/misc').permute(targetList) - target = targetList[1] - return target - else - print('No valid building found for event') - return nil - end -end \ No newline at end of file diff --git a/raw/scripts/functions/civilization.lua b/raw/scripts/functions/civilization.lua deleted file mode 100644 index 762706e..0000000 --- a/raw/scripts/functions/civilization.lua +++ /dev/null @@ -1,171 +0,0 @@ -function changeLevel(entity,amount,verbose) - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - civid = entity.id - end - key = tostring(civid) - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - entityTable = roses.EntityTable - if not entityTable[key] then - dfhack.script_environment('functions/tables').makeEntityTable(key) - end - entityTable = roses.EntityTable[key] - entity = df.global.world.entities.all[civid].entity_raw.code - civilizationTable = roses.CivilizationTable[entity] - if civilizationTable then - if civilizationTable.Level then - currentLevel = tonumber(entityTable.Civilization.Level) - nextLevel = currentLevel + amount - if nextLevel > tonumber(civilizationTable.Levels) then nextLevel = tonumber(civilizationTable.Levels) end - if nextLevel < 0 then nextLevel = 0 end - if amount > 0 then - for i = currentLevel+1,nextLevel,1 do - if civilizationTable.Level[tostring(i)] then - for _,mtype in pairs(civilizationTable.Level[tostring(i)].Remove) do - depth1 = civilizationTable.Level[tostring(i)].Remove[mtype] - for _,stype in pairs(depth1) do - depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,-1,verbose) - end - end - end - for _,mtype in pairs(civilizationTable.Level[tostring(i)].Add) do - depth1 = civilizationTable.Level[tostring(i)].Add[mtype] - for _,stype in pairs(depth1) do - depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,1,verbose) - end - end - end - for _,position in pairs(civilizationTable.Level[tostring(i)].RemovePosition) do - dfhack.script_environment('functions/entity').changeNoble(key,position,-1,verbose) - end - for _,position in pairs(civilizationTable.Level[tostring(i)].AddPosition) do - dfhack.script_environment('functions/entity').changeNoble(key,position,1,verbose) - end - if civilizationTable.Level[tostring(i)].LevelMethod then - entityTable.Civilization.CurrentMethod = civilizationTable.Level[tostring(i)].LevelMethod - entityTable.Civilization.CurrentPercent = civilizationTable.Level[tostring(i)].Levelchance - end - end - end - elseif amount <0 then - for i = currentLevel,nextLevel,-1 do - if civilizationTable.Level[tostring(i)] then - for _,mtype in pairs(civilizationTable.Level[tostring(i)].Remove) do - depth1 = civilizationTable.Level[tostring(i)].Remove[mtype] - for _,stype in pairs(depth1) do - depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,1,verbose) - end - end - end - for _,mtype in pairs(civilizationTable.Level[tostring(i)].Add) do - depth1 = civilizationTable.Level[tostring(i)].Add[mtype] - for _,stype in pairs(depth1) do - depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,-1,verbose) - end - end - end - for _,position in pairs(civilizationTable.Level[tostring(i)].RemovePosition) do - dfhack.script_environment('functions/entity').changeNoble(key,position,1,verbose) - end - for _,position in pairs(civilizationTable.Level[tostring(i)].AddPosition) do - dfhack.script_environment('functions/entity').changeNoble(key,position,-1,verbose) - end - if civilizationTable.Level[tostring(i)].LevelMethod then - entityTable.Civilization.CurrentMethod = civilizationTable.Level[tostring(i)].LevelMethod - entityTable.Civilization.CurrentPercent = civilizationTable.Level[tostring(i)].Levelchance - end - end - end - end - end - end -end - -function checkEntity(id,method,verbose) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - civilizationTable = roses.EntityTable[id].Civilization - - leveled = false - - -- check for non-time based checks - if method ~= civilizationTable.CurrentMethod then - entityTable = roses.EntityTable[id] - method = civilizationTable.CurrentMethod - chance = tonumber(civilizationTable.CurrentPercent) - if method == 'KILLs' then - number = tonumber(entityTable.Kills.Total) - elseif method == 'DEATHS' then - number = tonumber(entityTable.Deaths.Total) - elseif method == 'SIEGES' then - number = tonumber(entityTable.Sieges.Total) - elseif method == 'TRADES' then - number = tonumber(entityTable.Trades.Total) - end - if number >= chance then leveled = true end - else - chance = civilizationTable.CurrentPercent - local rand = dfhack.random.new() - rnum = rand:random(100)+1 - if rnum <= chance then leveled = true end - end - - if leveled then - changeLevel(id,1,verbose) - if verbose then print('Civilization leveled up') end - method = civilizationTable.CurrentMethod - end - - queueCheck(id,method,verbose) -end - -function queueCheck(id,method,verbose) - - if method == 'YEARLY' then - curtick = df.global.cur_year_tick - ticks = 1200*28*3*4-curtick - if ticks <= 0 then ticks = 1200*28*3*4 end - checkEntity(id,'YEARLY',verbose) - elseif method == 'SEASON' then - curtick = df.global.cur_season_tick*10 - ticks = 1200*28*3-curtick - if ticks <= 0 then ticks = 1200*28*3 end - checkEntity(id,'SEASON',verbose) - elseif method == 'MONTHLY' then - curtick = df.global.cur_year_tick - moy = curtick/(1200*28) - ticks = math.ceil(moy)*1200*28 - curtick - checkEntity(id,'MONTHLY',verbose) - elseif method == 'WEEKLY' then - curtick = df.global.cur_year_tick - woy = curtick/(1200*7) - ticks = math.ceil(woy)*1200*7 - curtick - dcheckEntity(id,'WEEKLY',verbose) - elseif method == 'DAILY' then - curtick = df.global.cur_year_tick - doy = curtick/1200 - ticks = math.ceil(doy)*1200 - curtick - checkEntity(id,'DAILY',verbose) - else - curtick = df.global.cur_season_tick*10 - ticks = 1200*28*3-curtick - if ticks <= 0 then ticks = 1200*28*3 end - checkEntity(id,'SEASON',verbose) - end - -end \ No newline at end of file diff --git a/raw/scripts/functions/class.lua b/raw/scripts/functions/class.lua deleted file mode 100644 index baff788..0000000 --- a/raw/scripts/functions/class.lua +++ /dev/null @@ -1,536 +0,0 @@ -function addExperience(unit,amount,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - local unitID = unit.id - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[tostring(unitID)] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - unitTable = roses.UnitTable[tostring(unitID)] - local unitClasses = unitTable.Classes - local currentClass = unitClasses.Current - local classTable = roses.ClassTable - currentClass.TotalExp = tostring(tonumber(currentClass.TotalExp)+amount) - currentClass.SkillExp = tostring(tonumber(currentClass.SkillExp)+amount) - if currentClass.Name ~= 'NONE' then - local currentClassName = currentClass.Name - unitClasses[currentClassName].Experience = tostring(unitClasses[currentClassName].Experience + amount) - local currentClassLevel = tonumber(unitClasses[currentClassName].Level) - if currentClassLevel < tonumber(classTable[currentClassName].Levels) then - classExpLevel = tonumber(classTable[currentClassName].Experience[tostring(currentClassLevel+1)]) - if tonumber(unitClasses[currentClassName].Experience) >= classExpLevel then - if verbose then - print('LEVEL UP! '..currentClassName..' LEVEL '..tostring(currentClassLevel+1)) - changeLevel(unitID,1,true) - else - changeLevel(unitID,1,false) - end - end - end - end -end - -function changeClass(unit,change,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - local key = tostring(unit.id) - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] --- Change the units class - local currentClass = unitTable.Classes.Current - local nextClass = unitTable.Classes[change] - if not nextClass then - print('No such class to change into: '..change) - return false - end - local classes = roses.ClassTable - if currentClass.Name == change then - print('Already this class') - return false - end - local storeName = 'NONE' - if currentClass.Name ~= 'NONE' then - local storeClass = unitTable.Classes[currentClass.Name] - storeName = currentClass.Name - local currentClassLevel = storeClass.Level - -- Remove Class Name From Unit - changeName(unit,currentClass.Name,'remove') - -- Remove Physical Attribute Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusPhysical) do - local attrTable = classes[currentClass.Name].BonusPhysical[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,-tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Remove Mental Attribute Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusMental) do - local attrTable = classes[currentClass.Name].BonusMental[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,-tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Remove Skill Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusSkill) do - local attrTable = classes[currentClass.Name].BonusSkill[attr] - dfhack.script_environment('functions/unit').changeSkill(unit,attr,-tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Remove Trait Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusTrait) do - local attrTable = classes[currentClass.Name].BonusTrait[attr] - dfhack.script_environment('functions/unit').changeTrait(unit,attr,-tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Remove Spells and Abilities - for _,spell in pairs(classes[currentClass.Name].Spells) do - changeSpell(unit,spell,'remove',verbose) - end - end - -- Change Current Class Table - currentClass.Name = change - currentClassLevel = nextClass.Level - -- Add Class Name to Unit - changeName(unit,currentClass.Name,'add') - -- Add Physical Attribute Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusPhysical) do - local attrTable = classes[currentClass.Name].BonusPhysical[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Add Mental Attribute Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusMental) do - local attrTable = classes[currentClass.Name].BonusMental[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Add Skill Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusSkill) do - local attrTable = classes[currentClass.Name].BonusSkill[attr] - dfhack.script_environment('functions/unit').changeSkill(unit,attr,tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Add Trait Bonuses - for _,attr in pairs(classes[currentClass.Name].BonusTrait) do - local attrTable = classes[currentClass.Name].BonusTrait[attr] - dfhack.script_environment('functions/unit').changeTrait(unit,attr,tonumber(attrTable[currentClassLevel+1]),0,'class') - end - -- Add Spells and Abilities - for _,spell in ipairs(classes[currentClass.Name].Spells) do - local spellTable = classes[currentClass.Name].Spells[spell] - if (tonumber(spellTable.RequiredLevel) <= tonumber(currentClassLevel)) and spellTable.AutoLearn then - unitTable.Spells[spell] = '1' - end - if unitTable.Spells[spell] == '1' then - changeSpell(unit,spell,'add',verbose) - end - end - if verbose then print('Class change successful! '..storeName..' -> '..currentClass.Name) end - return true -end - -function changeLevel(unit,amount,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - local key = tostring(unit.id) - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] - local currentClass = unitTable.Classes.Current - if currentClass.Name == 'NONE' then - if verbose then print('Unit does not have a current class assigned. Can not change level') end - return - end - local name = currentClass.Name - local level = tonumber(unitTable.Classes[name].Level) - local class = roses.ClassTable[name] - local maxLevel = false - - if amount > 0 then - if level + amount >= tonumber(class.Levels) then - unitTable.Classes[name].Level = class.Levels - newLevel = tonumber(class.Levels) - maxLevel = true - else - unitTable.Classes[name].Level = tostring(level+amount) - newLevel = level + amount - end - elseif amount < 0 then - if level + amount <= 0 then - unitTable.Classes[name].Level = '0' - newLevel = 0 - else - unitTable.Classes[name].Level = tostring(level+amount) - newLevel = level + amount - end - end - - --Add/Subtract temporary level bonuses - for _,attr in pairs(class.BonusPhysical) do - local bonus = class.BonusPhysical[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,bonus[newLevel+1]-bonus[level+1],0,'class') - end - for _,attr in pairs(class.BonusMental) do - local bonus = class.BonusMental[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,bonus[newLevel+1]-bonus[level+1],0,'class') - end - for _,skill in pairs(class.BonusSkill) do - local bonus = class.BonusSkill[skill] - dfhack.script_environment('functions/unit').changeSkill(unit,skill,bonus[newLevel+1]-bonus[level+1],0,'class') - end - for _,trait in pairs(class.BonusTrait) do - local bonus = class.BonusTrait[trait] - dfhack.script_environment('functions/unit').changeTrait(unit,trait,bonus[newLevel+1]-bonus[level+1],0,'class') - end - - --Add/Subtract permanent level bonuses ---Add/Subtract permanent level bonuses - if class.LevelBonus.Physical then - for _,attr in pairs(class.LevelBonus.Physical) do - local amount = class.LevelBonus.Physical[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,amount,0,'track') - end - end - if class.LevelBonus.Mental then - for _,attr in pairs(class.LevelBonus.Mental) do - local amount = class.LevelBonus.Mental[attr] - dfhack.script_environment('functions/unit').changeAttribute(unit,attr,amount,0,'track') - end - end - if class.LevelBonus.Skill then - for _,skill in pairs(class.LevelBonus.Skill) do - local amount = class.LevelBonus.Skill[skill] - dfhack.script_environment('functions/unit').changeSkill(unit,skill,amount,0,'track') - end - end - if class.LevelBonus.Trait then - for _,trait in pairs(class.LevelBonus.Trait) do - local amount = class.LevelBonus.Trait[trait] - dfhack.script_environment('functions/unit').changeTrait(unit,trait,amount,0,'track') - end - end - - --Learn/Unlearn Skills - for _,spell in pairs(class.Spells) do - local spellTable = class.Spells[spell] - if amount > 0 and tonumber(spellTable.RequiredLevel) <= newLevel then - if spellTable.AutoLearn then - changeSpell(unit,spell,'learn',verbose) - end - elseif amount < 0 and tonumber(spellTable.RequiredLevel) > newLevel then - changeSpell(unit,spell,'unlearn',verbose) - end - end - - if maxLevel then - if verbose then print('Maximum level for class '..name..' reached!') end - if class.AutoUpgrade then - if verbose then print('Auto upgrading class to '..class.AutoUpgrade) end - changeClass(unit,class.AutoUpgrade,verbose) - end - end -end - -function changeName(unit,name,direction) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local synUtils = require 'syndrome-util' - if direction == 'add' then - for _,syn in ipairs(df.global.world.raws.syndromes.all) do - if syn.syn_name == name then - syndrome = syn - break - end - end - if not syndrome then - print('No valid name syndrome for changing class name') - return - end - synUtils.infectWithSyndrome(unit,syndrome) - elseif direction == 'remove' then - for _,syn in ipairs(df.global.world.raws.syndromes.all) do - if syn.syn_name == name then - syndrome = syn - break - end - end - if not syndrome then - print('No valid name syndrome for changing class name') - return - end - synUtils.eraseSyndromes(unit,syndrome.id) - elseif direction == 'removeall' then - synUtils.eraseSyndromeClass(unit,'CLASS_NAME') - end -end - -function changeSpell(unit,spell,direction,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local synUtils = require 'syndrome-util' - if direction == 'add' then - for _,syn in ipairs(df.global.world.raws.syndromes.all) do - if syn.syn_name == spell then - syndrome = syn - break - end - end - if not syndrome then - print('No valid name syndrome for changing spell') - return - end - synUtils.infectWithSyndrome(unit,syndrome) - elseif direction == 'remove' then - for _,syn in ipairs(df.global.world.raws.syndromes.all) do - if syn.syn_name == spell then - syndrome = syn - break - end - end - if not syndrome then - print('No valid name syndrome for changing spell') - return - end - synUtils.eraseSyndromes(unit,syndrome.id) - elseif direction == 'removeall' then - synUtils.eraseSyndromeClass(unit,'CLASS_SPELL') - elseif direction == 'learn' then - local key = tostring(unit.id) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] - if unitTable.Spells[spell] == '1' then - if verbose then print('Spell already known, adding to unit') end - else - if verbose then print('Spell learned, adding to unit') end - unitTable.Spells[spell] = '1' - end - changeSpell(unit,spell,'add',verbose) - if unitTable.Classes.Current.Name ~= 'NONE' then - unitTable.Classes.Current.SkillExp = tostring(unitTable.Classes.Current.SkillExp - roses.ClassTable[unitTable.Classes.Current.Name].Spells[spell].Cost) - end - elseif direction == 'unlearn' then - local key = tostring(unit.id) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] - if unitTable.Spells[spell] == '1' then - if verbose then print('Spell loss, removing from unit') end - unitTable.Spells[spell] = '0' - else - if verbose then print('Spell not known') end - end - changeSpell(unit,spell,'remove',verbose) - end -end - -function checkRequirementsClass(unit,class,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - local key = tostring(unit.id) - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] - - local unitClasses = unitTable.Classes - local unitCounters = unitTable.Counters - local currentClass = unitClasses.Current - local classTable = roses.ClassTable[class] - if not classTable then - if verbose then print ('No specified class to check for requirements') end - return false - end --- local currentClassName = currentClass.Name --- local currentClassLevel = unitClasses[currentClass.Name].Level --- Check for Required Class - for _,class in pairs(classTable.RequiredClass) do - local check = unitClasses[class].Level - local level = classTable.RequiredClass[class] - if tonumber(check) < tonumber(level) then - if verbose then print('Class requirements not met. '..class..' level '..level..' needed. Current level is '..tostring(check)) end - return false - end - end --- Check for Forbidden Class - for _,class in pairs(classTable.ForbiddenClass) do - local check = unitClasses[class] - local level = classTable.ForbiddenClass[class] - if tonumber(check.Level) >= tonumber(level) and tonumber(level) ~= 0 then - if verbose then print('Already a member of a forbidden class. '..class) end - return false - elseif tonumber(level) == 0 and tonumber(check.Experience) > 0 then - if verbose then print('Already a member of a forbidden class. '..class) end - return false - end - end --- Check for Required Counters (not currently working) - --[[ - for _,x in pairs(classTable.RequiredCounter) do - local i = classes[change]['RequiredCounter'][x] - if unitCounters[x] then - if tonumber(unitCounters[x]['Value']) < tonumber(x) then - if verbose then print('Counter requirements not met. '..i..x..' needed. Current amount is '..unitCounters[i]['Value']) end - yes = false - end - else - if verbose then print('Counter requirements not met. '..i..x..' needed. No current counter on the unit') end - yes = false - end - end -]] --- Check for Required Physical Attributes - for _,attr in pairs(classTable.RequiredPhysical) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackAttribute(unit,attr,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = classTable.RequiredPhysical[attr] - if currentStat < tonumber(value) then - if verbose then print('Stat requirements not met. '..value..' '..attr..' needed. Current amount is '..tostring(check)) end - return false - end - end --- Check for Required Mental Attributes - for _,attr in pairs(classTable.RequiredMental) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackAttribute(unit,attr,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = classTable.RequiredMental[attr] - if currentStat < tonumber(value) then - if verbose then print('Stat requirements not met. '..value..' '..attr..' needed. Current amount is '..tostring(check)) end - return false - end - end --- Check for Required Skills - for _,skill in pairs(classTable.RequiredSkill) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackSkill(unit,skill,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = classTable.RequiredSkill[skill] - if currentSkill < tonumber(value) then - if verbose then print('Skill requirements not met. '..value..' '..skill..' needed. Current amount is '..tostring(check)) end - yes = false - end - end --- Check for Required Traits - for _,trait in pairs(classTable.RequiredTrait) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackTrait(unit,trait,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = classTable.RequiredTrait[trait] - if currentTrait < tonumber(value) then - if verbose then print('Trait requirements not met. '..value..' '..trait..' needed. Current amount is '..tostring(check)) end - return false - end - end - return true -end - -function checkRequirementsSpell(unit,spell,verbose) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - local key = tostring(unit.id) - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local unitTable = roses.UnitTable - if not unitTable[key] then - dfhack.script_environment('functions/tables').makeUnitTable(unit) - end - local unitTable = roses.UnitTable[key] - - - local unitClasses = unitTable.Classes - local unitCounters = unitTable.Counters - local currentClass = unitClasses.Current - local currentClassName = currentClass.Name - local currentClassLevel = unitClasses[currentClass.Name].Level - local classTable = roses.ClassTable[currentClassName] - if not classTable then - if verbose then print ('No specified class to check for requirements') end - return false - end - - local found = false - local upgrade = false - local spellTable = classTable.Spells[spell] - if spellTable then --- Check for Required Class - if currentClassLevel < tonumber(spellTable.RequiredLevel) then - if verbose then print('Class requirements not met. '..currentClassName..' level '..spellTable.RequiredLevel..' needed. Current level is '..tostring(currentClassLevel)) end - return false - end --- Check for Forbidden Class - for _,class in pairs(spellTable.ForbiddenClass) do - local check = unitClasses[class] - local level = spellTable.ForbiddenClass[class] - if tonumber(check.Level) >= tonumber(level) and tonumber(level) ~= 0 then - if verbose then print('Already a member of a forbidden class. '..class) end - return false - elseif tonumber(level) == 0 and tonumber(check.Experience) > 0 then - if verbose then print('Already a member of a forbidden class. '..class) end - return false - end - end --- Check for Forbidden Spell - local synUtils = require 'syndrome-util' - for _,i in pairs(spellTable.ForbiddenSpell) do - for _,syn in ipairs(df.global.world.raws.syndromes.all) do - local x = spellTable.ForbiddenSpell[i] - if syn.syn_name == x then - oldsyndrome = synUtils.findUnitSyndrome(unit,syn.id) - if oldsyndrome then - if verbose then print('Knows a forbidden spell. '..x) end - return false - end - end - end - end --- Check for Required Physical Attributes - for _,attr in pairs(spellTable.RequiredPhysical) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackAttribute(unit,attr,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = spellTable.RequiredPhysical[attr] - if currentStat < tonumber(value) then - if verbose then print('Stat requirements not met. '..value..' '..attr..' needed. Current amount is '..tostring(check)) end - return false - end - end --- Check for Required Mental Attributes - for _,attr in pairs(spellTable.RequiredMental) do - local total,base,change,class,syndrome = dfhack.script_environment('functions/unit').trackAttribute(unit,attr,0,0,0,0,'get') - local check = total-change-class-syndrome - local value = spellTable.RequiredMental[attr] - if currentStat < tonumber(value) then - if verbose then print('Stat requirements not met. '..value..' '..attr..' needed. Current amount is '..tostring(check)) end - return false - end - end --- Check for Cost - if spellTable.Cost then - if tonumber(currentClass.SkillExp) < tonumber(spellTable.Cost) then - if verbose then print('Not enough points to learn spell. Needed '..spellTable.Cost..' currently have '..currentClass.SkillExp) end - return false - end - end - if spellTable.Upgrade then upgrade = spellTable.Upgrade end - else - if verbose then print(spell..' not learnable by '..currentClassName) end - return false - end - return true, upgrade -end diff --git a/raw/scripts/functions/entity.lua b/raw/scripts/functions/entity.lua deleted file mode 100644 index 0b30149..0000000 --- a/raw/scripts/functions/entity.lua +++ /dev/null @@ -1,916 +0,0 @@ -function changeCreature(entity,stype,mobj,sobj,direction,verbose) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - creature = {} - check = false - if string.upper(mobj) == 'ALL' then - for i,x in ipairs(df.global.world.raws.creatures.all) do - creature[i] = {} - end - check = true - else - mobj_id = -1 - for i,x in ipairs(df.global.world.raws.creatures.all) do - if string.upper(mobj) == x.creature_id then - mobj_id = i - check = true - creature[mobj_id] = {} - break - end - end - end - if not check then - if verbose then print('Creature not found '..mobj) end - return - end - check = false - if string.upper(sobj) == 'ALL' then - for i,x in pairs(creature) do - for j,y in pairs(df.global.world.raws.creatures.all[i].caste) do - creature[i][j] = j - end - end - check = true - else - for i,x in pairs(creature) do - sobj_id = -1 - for j,y in ipairs(df.global.world.raws.creatures.all[i].caste) do - if string.upper(sobj) == y.caste_id then - sobj_id = j - creature[i][sobj_id] = sobj_id - check = true - break - end - end - end - end - if not check then - if verbose then print('Caste not found '..sobj) end - return - end - if string.upper(stype) == 'ALL' then - if verbose then print('-type CREATURE:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif string.upper(stype) == 'PET' then - races = resources.animals.pet_races - castes = resources.animals.pet_castes - elseif string.upper(stype) == 'WAGON' then - races = resources.animals.wagon_puller_races - castes = resources.animals.wagon_puller_castes - elseif string.upper(stype) == 'MOUNT' then - races = resources.animals.mount_races - castes = resources.animals.mount_castes - elseif string.upper(stype) == 'PACK' then - races = resources.animals.pack_animal_races - castes = resources.animals.pack_animal_castes - elseif string.upper(stype) == 'MINION' then - races = resources.animals.minion_races - castes = resources.animals.minion_castes - elseif string.upper(stype) == 'EXOTIC' then - races = resources.animals.exotic_pet_races - castes = resources.animals.exotic_pet_castes - elseif string.upper(stype) == 'FISH' then - races = resources.fish_races - castes = resources.fish_castes - elseif string.upper(stype) == 'EGG' then - races = resources.egg_races - castes = resources.egg_castes - else - if verbose then print('Not a valid type') end - end - - if direction == -1 then - local int = 1 - removing = {} - for i,x in pairs(races) do - if creature[x] then - if creature[x][castes[i]] then - removing[int] = i - int = int + 1 - if verbose then print('Removing CREATURE:CASTE '..x..':'..i..' from '..stype) end - end - end - end - for i = #removing,1,-1 do - races:erase(removing[i]) - castes:erase(removing[i]) - end - elseif direction == 1 then - for i,x in pairs(creature) do - for j,y in pairs(x) do - races:insert('#',i) - castes:insert('#',y) - if verbose then print('Adding CREATURE:CASTE '..i..':'..y..' to '..stype) end - end - end - end - -end - -function changeInorganic(entity,stype,mobj,sobj,direction,verbose) - stype = string.upper(stype) - mobj = string.upper(mobj) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - if stype == 'ALL' then - if verbose then print('-type INORGANIC:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'METAL' then - inorganic = resources.metals - check = 'IS_METAL' - elseif stype == 'STONE' then - inorganic = resources.stones - check = 'IS_STONE' - elseif stype == 'GEM' then - inorganic = resources.gems - check = 'IS_GEM' - else - if verbose then print('Not a valid type') end - return - end - if mobj == 'ALL' then - if direction == -1 then - for i=#inorganic-1,0,-1 do - inorganic:erase(i) - if verbose then print('Removing inorganic TYPE:SUBTYPE'..stype..':'..i) end - end - elseif direction == 1 then - for i,x in pairs(df.global.world.raws.inorganics) do - if x.material.flags[check] then - inorganic:insert('#',dfhack.matinfo.find(x.id).index) - if verbose then print('Adding inorganic TYPE:SUBTYPE'..stype..':'..dfhack.matinfo.find(x.id).index) end - end - end - end - else - mat_id = dfhack.matinfo.find(mobj).index - if dfhack.matinfo.decode(0,mat_id).material.flags[check] then - if direction == -1 then - for i=#inorganic-1,0,-1 do - if inorganic[i] == mat_id then - inorganic:erase(i) - if verbose then print('Removing inorganic TYPE:SUBTYPE'..stype..':'..mat_id) end - break - end - end - elseif direction == 1 then - inorganic:insert('#',mat_id) - if verbose then print('Adding inorganic TYPE:SUBTYPE'..stype..':'..mat_id) end - end - else - if verbose then print('Material not valid ['..check..'] material') end - end - end - -end - -function changeItem(entity,stype,mobj,sobj,direction,verbose) - stype = string.upper(stype) - mobj = string.upper(mobj) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - if stype == 'ALL' then - if verbose then print('-type ITEM:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'WEAPON' then - ind = df.item_type['WEAPON'] - items = resources.weapon_type - elseif stype == 'SHIELD' then - ind = df.item_type['SHIELD'] - items = resources.shield_type - elseif stype == 'AMMO' then - ind = df.item_type['AMMO'] - items = resources.ammo_type - elseif stype == 'HELM' then - ind = df.item_type['HELM'] - items = resources.helm_type - elseif stype == 'ARMOR' then - ind = df.item_type['ARMOR'] - items = resources.armor_type - elseif stype == 'PANTS' then - ind = df.item_type['PANTS'] - items = resources.pants_type - elseif stype == 'SHOES' then - ind = df.item_type['SHOES'] - items = resources.shoes_type - elseif stype == 'GLOVES' then - ind = df.item_type['GLOVES'] - items = resources.gloves_type - elseif stype == 'TRAP' then - ind = df.item_type['TRAPCOMP'] - items = resources.trapcomp_type - elseif stype == 'SIEGE' then - ind = df.item_type['SIEGEAMMO'] - items = resources.siegeammo_type - elseif stype == 'TOY' then - ind = df.item_type['TOY'] - items = resources.toy_type - elseif stype == 'INSTRUMENT' then - ind = df.item_type['INSTRUMENT'] - items = resources.instrument_type - elseif stype == 'TOOL' then - ind = df.item_type['TOOL'] - items = resources.tool_type - elseif stype == 'DIGGER' then - --Don't know what the item_type of digger is - elseif stype == 'TRAINING' then - --Don't know what the item_type of training is - else - if verbose then print('Not a valid item type') end - return - end --- Add or remove item - if mobj == 'ALL' then - if direction == -1 then - for i=#items-1,0,-1 do - items:erase(i) - if verbose then print('Removing item TYPE:SUBTYPE '..stype..':'..i) end - end - elseif direction == 1 then - for i=0,dfhack.items.getSubtypeCount(ind)-1 do - local item_subtype = dfhack.items.getSubtypeDef(ind,i).subtype - items:insert('#',item_subtype) - if verbose then print('Adding item TYPE:SUBTYPE '..stype..':'..item_subtype) end - end - end - else - for i=0,dfhack.items.getSubtypeCount(ind)-1 do - local item_sub = dfhack.items.getSubtypeDef(ind,i) - if item_sub.id == mobj then - item_subtype = item_sub.subtype - break - end - end - if direction == -1 then - for i=#items-1,0,-1 do - if item_subtype == items[i] then - items:erase(i) - if verbose then print('Removing item TYPE:SUBTYPE '..stype..':'..item_subtype) end - end - end - elseif direction == 1 then - items:insert('#',item_subtype) - if verbose then print('Adding item TYPE:SUBTYPE '..stype..':'..item_subtype) end - end - end - -end - -function changeMisc(entity,stype,mobj,sobj,direction,verbose) - stype = string.upper(stype) - mobj = string.upper(mobj) - sobj = string.upper(sobj) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - if stype == 'ALL' then - if verbose then print('-type MISC:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'OTHER' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'GLASS' then - check = 'IS_GLASS' - misc = resources.misc_mat.glass - elseif stype == 'SAND' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'CLAY' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'CRAFTS' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'GLASS_UNUSED' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'BARRELS' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'FLASKS' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'QUIVERS' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'BACKPACKS' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'CAGES' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'WOOD2' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'ROCK_METAL' then - if verbose then print('-type MISC:'..stype..' IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'BOOZE' then - check = 'ALCOHOL' - misc = resources.misc_mat.booze - elseif stype == 'CHEESE' then - check = 'CHEESE' - misc = resources.misc_mat.cheese - elseif stype == 'POWDER' then - check = 'POWDER_MISC' - misc = resources.misc_mat.powders - elseif stype == 'EXTRACT' then - check = 'LIQUID_MISC' - misc = resources.misc_mat.extracts - elseif stype == 'MEAT' then - check = 'MEAT' - misc = resources.misc_mat.meat - else - if verbose then print('Not a valid type') end - return - end - if mobj == 'ALL' then - if direction == -1 then - for i=#misc.mat_type-1,0,-1 do - misc.mat_type:erase(i) - end - for i=#misc.mat_index-1,0,-1 do - misc.mat_index:erase(i) - end - elseif direction == 1 then - if verbose then print('ALL:ALL IS NOT CURRENTLY SUPPORTED') end - return - end - else - mat_type = dfhack.matinfo.find(mobj..':'..sobj).type - mat_index = dfhack.matinfo.find(mobj..':'..sobj).index - if dfhack.matinfo.decode(mat_type,mat_index).material.flags[check] then - if direction == -1 then - for i=#refuse.mat_type-1,0,-1 do - if misc.mat_type[i] == mat_type then - if misc.mat_index[i] == mat_index then - misc.mat_type:erase(i) - misc.mat_index:erase(i) - if verbose then print('Removing misc '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - end - end - elseif direction == 1 then - misc.mat_type:insert('#',mat_type) - misc.mat_index:insert('#',mat_index) - if verbose then print('Adding misc '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - else - if verbose then print('Material not valid ['..check..'] material') end - end - end - -end - -function changeNoble(entity,position,direction,verbose) - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - civid = entity.id - end - positions = civ.positions - - if direction == -1 then - for i,x in pairs(positions.own) do - if position == x.code then - positions.own:erase(i) - end - end - for i,x in pairs(positions.site) do - if position == x.code then - positions.site:erase(i) - end - end - for i,x in pairs(positions.conquered_site) do - if position == x.code then - positions.conquered_site:erase(i) - end - end - elseif direction == 1 then - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - entity = civ.entity_raw.code - civilizationTable = roses.CivilizationTable[entity] - if civilizationTable then - if civilizationTable.Nobles then - if civilizationTable.Nobles[position] then - positionTable = civilizationTable.Nobles[position] - pos = df['entity_position']:new() - pos.code = position - pos.id = positions.next_position_id - positions.next_position_id = positions.next_position_id + 1 - for _,creature in pairs(positionTable.AllowedCreature) do - local caste = positionTable.AllowedCreature[creature] - for _,w in pairs(df.global.world.raws.creatures.all) do - if creature == w.creature_id then - for _,v in pairs(w.caste) do - if caste == v.caste_id then - pos.allowed_creature:insert('#',v.index) - end - end - end - end - end - for _,creature in pairs(positionTable.RejectedCreature) do - local caste = positionTable.RejectedCreature[creature] - for _,w in pairs(df.global.world.raws.creatures.all) do - if creature == w.creature_id then - for _,v in pairs(w.caste) do - if caste == v.caste_id then - pos.rejected_creature:insert('#',v.index) - end - end - end - end - end - for _,k in pairs(positionTable.AllowedClass) do - local class = positionTable.AllowedClass[k] - pos.allowed_class:insert('#',class) - end - for _,k in pairs(positionTable.RejectedClass) do - local class = positionTable.RejectedClass[k] - pos.rejected_class:insert('#',class) - end - if positionTable.Name then - pos.name[0] = split(positionTable.Name,':')[1] - pos.name[1] = split(positionTable.Name,':')[2] - pos.name_female[0] = '' - pos.name_female[1] = '' - pos.name_male[0] = '' - pos.name_male[1] = '' - else - pos.name[0] = '' - pos.name[1] = '' - pos.name_female[0] = '' - pos.name_female[1] = '' - pos.name_male[0] = '' - pos.name_male[1] = '' - end - if positionTable.NameFemale then - pos.name_female[0] = split(positionTable.NameFemale,':')[1] - pos.name_female[1] = split(positionTable.NameFemale,':')[2] - end - if positionTable.NameMale then - pos.name_male[0] = split(positionTable.NameMale,':')[1] - pos.name_male[1] = split(positionTable.NameMale,':')[2] - end - if positionTable.Spouse then - pos.spouse[0] = split(positionTable.Spouse,':')[1] - pos.spouse[1] = split(positionTable.Spouse,':')[2] - pos.spouse_female[0] = '' - pos.spouse_female[1] = '' - pos.spouse_male[0] = '' - pos.spouse_male[1] = '' - else - pos.spouse[0] = '' - pos.spouse[1] = '' - pos.spouse_female[0] = '' - pos.spouse_female[1] = '' - pos.spouse_male[0] = '' - pos.spouse_male[1] = '' - end - if positionTable.SpouseFemale then - pos.spouse_female[0] = split(y['SpouseFemale'],':')[1] - pos.spouse_female[1] = split(y['SpouseFemale'],':')[2] - end - if positionTable.SpouseMale then - pos.spouse_male[0] = split(positionTable.SpouseMale,':')[1] - pos.spouse_male[1] = split(positionTable.SpouseMale,':')[2] - end - if positionTable.Squad then - pos.squad_size = tonumber(split(positionTable.Squad,':')[1]) - pos.squad[0] = split(positionTable.Squad,':')[2] - pos.squad[1] = split(positionTable.Squad,':')[3] - else - pos.squad[0] = '' - pos.squad[1] = '' - pos.squad_size = 0 - end - if positionTable.LandName then - pos.land_name = positionTable.LandName - else - pos.land_name = '' - end - if positionTable.LandHolder then - pos.land_holder = tonumber(positionTable.LandHolder) - else - pos.land_holder = 0 - end - if positionTable.RequiredBoxes then - pos.required_boxes = tonumber(positionTable.RequiredBoxes) - else - pos.required_boxes = 0 - end - if positionTable.RequiredCabinets then - pos.required_cabinets = tonumber(positionTable.RequiredCabinets) - else - pos.required_cabinets = 0 - end - if positionTable.RequiredRacks then - pos.required_racks = tonumber(positionTable.RequiredRacks) - else - pos.required_racks = 0 - end - if positionTable.RequiredStands then - pos.required_stands = tonumber(positionTable.RequiredStands) - else - pos.required_stands = 0 - end - if positionTable.RequiredOffice then - pos.required_office = tonumber(positionTable.RequiredOffice) - else - pos.required_office = 0 - end - if positionTable.RequiredBedroom then - pos.required_bedroom = tonumber(positionTable.RequiredBedroom) - else - pos.required_bedroom = 0 - end - if positionTable.RequiredDining then - pos.required_dining = tonumber(positionTable.RequiredDining) - else - pos.required_dining = 0 - end - if positionTable.RequiredTomb then - pos.required_tomb = tonumber(positionTable.RequiredTomb) - else - pos.required_tomb = 0 - end - if positionTable.MandateMax then - pos.mandate_max = tonumber(positionTable.MandateMax) - else - pos.mandate_max = 0 - end - if positionTable.DemandMax then - pos.demand_max = tonumber(positionTable.DemandMax) - else - pos.demand_max = 0 - end - if positionTable.Color then - pos.color[0] = split(positionTable.Color,':')[1] - pos.color[1] = split(positionTable.Color,':')[2] - pos.color[2] = split(positionTable.Color,':')[3] - else - pos.color[0] = 5 - pos.color[1] = 0 - pos.color[2] = 0 - end - if positionTable.Precedence then - pos.precedence = tonumber(positionTable.Precedence) - else - pos.precedence = -1 - end - for v,w in pairs(pos.responsibilities) do - if positionTable.Responsibility[v] then - pos.responsibilities[v] = true - else - pos.responsibilities[v] = false - end - end - for v,w in pairs(pos.flags) do - if positionTable[v] then - pos.flags[v] = true - else - pos.flags[v] = false - end - end - if positionTable.Flags then - for _,v in pairs(positionTable.Flags) do - local w = positionTable.Flags[v] - if pos.flags[v] then pos.flags[v] = true end - end - end - if positionTable.Number then - pos.number = tonumber(positionTable.Number) - else - pos.number = -1 - end - for _,v in pairs(positionTable.AppointedBy) do - p = -1 - own = false - site = false - for s,t in pairs(positions.own) do - if v == t.code then - p = t.id - own = true - break - end - end - if p == -1 then - for s,t in pairs(positions.site) do - if v == t.code then - p = t.id - site = true - break - end - end - end - if p == -1 then - for s,t in pairs(positions.conquered_site) do - if v == t.code then - p = t.id - break - end - end - end - if p == -1 then - print('No valid APPOINTED_BY position found') - else - pos.appointed_by:insert('#',p) - if own then pos.appointed_by_civ:insert('#',civid) end - if site then pos.appointed_by_civ:insert('#',-1) end - end - end - if positionTable.Commander then - v = split(positionTable.Commander,':')[1] - p = -1 - own = false - site = false - for s,t in pairs(positions.own) do - if v == t.code then - p = t.id - own = true - break - end - end - if p == -1 then - for s,t in pairs(positions.site) do - if v == t.code then - p = t.id - site = true - break - end - end - end - if p == -1 then - for s,t in pairs(positions.conquered_site) do - if v == t.code then - p = t.id - break - end - end - end - if p == -1 then - print('No valid COMMANDER position found') - else - pos.commander_id:insert('#',p) - pos.commander_types:insert('#',0) - if own then pos.commander_civ:insert('#',civid) end - if site then pos.commander_civ:insert('#',-1) end - end - end - if positionTable.ReplacedBy then - v = positionTable.ReplacedBy - p = -1 - own = false - site = false - for s,t in pairs(positions.own) do - if v == t.code then - p = t.id - own = true - break - end - end - if p == -1 then - for s,t in pairs(positions.site) do - if v == t.code then - p = t.id - site = true - break - end - end - end - if p == -1 then - for s,t in pairs(positions.conquered_site) do - if v == t.code then - p = t.id - break - end - end - end - if p == -1 then - print('No valid REPLACED_BY position found') - else - pos.replaced_by = p - end - else - pos.replaced_by = -1 - end - positions.own:insert('#',pos) - else - print('No valid position found in civilization.txt') - return - end - end - end - end -end - -function changeOrganic(entity,stype,mobj,sobj,direction,verbose) - stype = string.upper(stype) - mobj = string.upper(mobj) - sobj = string.upper(sobj) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - if stype == 'ALL' then - if verbose then print('-type ORGANIC:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'LEATHER' then - organic = resources.organic.leather - check = 'LEATHER' - elseif stype == 'FIBER' then - organic = resources.organic.fiber - check = 'THREAD_PLANT' - elseif stype == 'SILK' then - organic = resources.organic.silk - check = 'SILK' - elseif stype == 'WOOL' then - organic = resources.organic.wool - check = 'YARN' - elseif stype == 'WOOD' then - organic = resources.organic.wood - check = 'WOOD' - elseif stype == 'PLANT' then - organic = resources.plants - check = 'STRUCTURAL_PLANT_MAT' - elseif stype == 'SEED' then - organic = resources.seeds - check = 'SEED_MAT' - else - if verbose then print('Not a valid type') end - return - end - if mobj == 'ALL' then - if direction == -1 then - for i=#organic.mat_type-1,0,-1 do - organic.mat_type:erase(i) - end - for i=#organic.mat_index-1,0,-1 do - organic.mat_index:erase(i) - end - elseif direction == 1 then - for i,x in pairs(df.global.world.raws.creatures.all) do - for j,y in pairs(x.material) do - if y.flags[check] then - organic.mat_type:insert('#',dfhack.matinfo.find(x.creature_id..':'..y.id).type) - organic.mat_index:insert('#',dfhack.matinfo.find(x.creature_id..':'..y.id).index) - end - end - end - end - else - mat_type = dfhack.matinfo.find(mobj..':'..sobj).type - mat_index = dfhack.matinfo.find(mobj..':'..sobj).index - if dfhack.matinfo.decode(mat_type,mat_index).material.flags[check] then - if direction == -1 then - for i=#organic.mat_type-1,0,-1 do - if organic.mat_type[i] == mat_type then - if organic.mat_index[i] == mat_index then - organic.mat_type:erase(i) - organic.mat_index:erase(i) - if verbose then print('Removing organic '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - end - end - elseif direction == 1 then - organic.mat_type:insert('#',mat_type) - organic.mat_index:insert('#',mat_index) - if verbose then print('Adding organic '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - else - if verbose then print('Material not valid ['..check..'] material') end - end - end -end - -function changeRefuse(entity,stype,mobj,sobj,direction,verbose) - stype = string.upper(stype) - mobj = string.upper(mobj) - sobj = string.upper(sobj) - - if tonumber(entity) then - civid = tonumber(entity) - civ = df.global.world.entities.all[civid] - else - civ = entity - end - resources = civ.resources - - if stype == 'ALL' then - if verbose then print('-type REFUSE:ALL IS NOT CURRENTLY SUPPORTED') end - return - elseif stype == 'BONE' then - check = 'BONE' - refuse = resources.refuse.bone - elseif stype == 'SHELL' then - check = 'SHELL' - refuse = resources.refuse.shell - elseif stype == 'PEARL' then - check = 'PEARL' - refuse = resources.refuse.pearl - elseif stype == 'IVORY' then - check = 'TOOTH' - refuse = resources.refuse.ivory - elseif stype == 'HORN' then - check = 'HORN' - refuse = resources.refuse.horn - else - if verbose then print('Not a valid type') end - return - end - if mobj == 'ALL' then - if direction == -1 then - for i=#refuse.mat_type-1,0,-1 do - refuse.mat_type:erase(i) - end - for i=#refuse.mat_index-1,0,-1 do - refuse.mat_index:erase(i) - end - elseif direction == 1 then - for i,x in pairs(df.global.world.raws.creatures.all) do - for j,y in pairs(x.material) do - if y.flags[check] then - refuse.mat_type:insert('#',dfhack.matinfo.find(x.creature_id..':'..y.id).type) - refuse.mat_index:insert('#',dfhack.matinfo.find(x.creature_id..':'..y.id).index) - end - end - end - end - else - mat_type = dfhack.matinfo.find(mobj..':'..sobj).type - mat_index = dfhack.matinfo.find(mobj..':'..sobj).index - if dfhack.matinfo.decode(mat_type,mat_index).material.flags[check] then - if direction == -1 then - for i=#refuse.mat_type-1,0,-1 do - if refuse.mat_type[i] == mat_type then - if refuse.mat_index[i] == mat_index then - refuse.mat_type:erase(i) - refuse.mat_index:erase(i) - if verbose then print('Removing refuse '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - end - end - elseif direction == 1 then - refuse.mat_type:insert('#',mat_type) - refuse.mat_index:insert('#',mat_index) - if verbose then print('Adding refuse '..stype..' TYPE:SUBTYPE '..mat_type..':'..mat_index) end - end - else - if verbose then print('Material not valid ['..check..'] material') end - end - end -end - -function changeResources(entity,mtype,stype,mobj,sobj,direction,verbose) - if string.upper(mtype) == 'CREATURE' then - changeCreature(entity,stype,mobj,sobj,direction,verbose) - elseif string.upper(mtype) == 'INORGANIC' then - changeInorganic(entity,stype,mobj,sobj,direction,verbose) - elseif string.upper(mtype) == 'ITEM' then - changeItem(entity,stype,mobj,sobj,direction,verbose) - elseif string.upper(mtype) == 'MISC' then - changeMisc(entity,stype,mobj,sobj,direction,verbose) - elseif string.upper(mtype) == 'ORGANIC' then - changeOrganic(entity,stype,mobj,sobj,direction,verbose) - elseif string.upper(mtype) == 'REFUSE' then - changeRefuse(entity,stype,mobj,sobj,direction,verbose) - else - if verbose then print('No valid resource type to add') end - return - end -end \ No newline at end of file diff --git a/raw/scripts/functions/event.lua b/raw/scripts/functions/event.lua deleted file mode 100644 index 5f2f64c..0000000 --- a/raw/scripts/functions/event.lua +++ /dev/null @@ -1,117 +0,0 @@ -function checkRequirements(event,effect,verbose) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - event = roses.EventTable[event] - if not event then - return false - end - yes = true - if effect == 0 or effect = nil then - check = event.Required - else - check = event.Effect[tostring(effect)].Required - end - --- Check for chance occurance - local chance = check.Chance - local rand = dfhack.random.new() - local rnum = rand:random(100)+1 - if rnum > chance then - return false - end - --- Check for amount of time passed - if check.Time then - local x = check.Time - local time_played = df.global.ui.fortress_age - if time_played < tonumber(x) then - return false - end - end - --- Check for fortress wealth - if check.Wealth then - for _,wtype in pairs(check.Wealth) do - local amount = check.Wealth[wtype] - if df.global.ui.tasks.wealth[string.lower(wtype)] then - if df.global.ui.tasks.wealth[string.lower(wtype)] < tonumber(amount) then - return false - end - end - end - end - --- Check for fortress population - if check.Population then - local x = check.Population - local population = df.global.ui.tasks.population - if population < tonumber(x) then - return false - end - end - - -end - -function triggerEvent(event,effect,verbose) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - eventTable = roses.EventTable[event] - - -end - -function checkEvent(id,method,verbose) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local eventTable = roses.EventTable[id] - local triggered = {} - - if checkRequirements(id,0,verbose) then - triggered[0] = true - for _,i in pairs(eventTable.Effect) do - if checkRequirements(event,tonumber(i),verbose) then - contingency = tonumber(eventTable.Effect[i].Contingent) or 0 - if triggered[contingency] then - triggered[tonumber(i)] = true - triggerEvent(event,tonumber(i),verbose) - if verbose then print('Event effect triggered '..id) end - end - end - end - end - - queueCheck(id,method,verbose) -end - -function queueCheck(id,method,verbose) - - if method == 'YEARLY' then - curtick = df.global.cur_year_tick - ticks = 1200*28*3*4-curtick - if ticks <= 0 then ticks = 1200*28*3*4 end - checkEvent(id,'YEARLY',verbose) - elseif method == 'SEASON' then - curtick = df.global.cur_season_tick*10 - ticks = 1200*28*3-curtick - if ticks <= 0 then ticks = 1200*28*3 end - checkEvent(id,'SEASON',verbose) - elseif method == 'MONTHLY' then - curtick = df.global.cur_year_tick - moy = curtick/(1200*28) - ticks = math.ceil(moy)*1200*28 - curtick - checkEvent(id,'MONTHLY',verbose) - elseif method == 'WEEKLY' then - curtick = df.global.cur_year_tick - woy = curtick/(1200*7) - ticks = math.ceil(woy)*1200*7 - curtick - dcheckEvent(id,'WEEKLY',verbose) - elseif method == 'DAILY' then - curtick = df.global.cur_year_tick - doy = curtick/1200 - ticks = math.ceil(doy)*1200 - curtick - checkEvent(id,'DAILY',verbose) - else - curtick = df.global.cur_season_tick*10 - ticks = 1200*28*3-curtick - if ticks <= 0 then ticks = 1200*28*3 end - checkEnvent(id,'SEASON',verbose) - end -end \ No newline at end of file diff --git a/raw/scripts/functions/item.lua b/raw/scripts/functions/item.lua deleted file mode 100644 index 2c686e9..0000000 --- a/raw/scripts/functions/item.lua +++ /dev/null @@ -1,456 +0,0 @@ -function trackMaterial(itemID,change,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local itemTable = roses.ItemTable - if not itemTable[tostring(itemID)] then - dfhack.script_environment('functions/tables').makeItemTable(itemID) - end - if alter == 'track' then - local materialTable = itemTable[tostring(itemID)].Material - materialTable.Current = change - if dur >= 0 then - local statusTable = materialTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = change - else - materialTable.Base = change - end - elseif alter == 'end' then - local materialTable = itemTable[tostring(itemID)].Material - materialTable.Current = change - local statusTable = materialTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - end -end - -function trackQuality(itemID,change,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local itemTable = roses.ItemTable - if not itemTable[tostring(itemID)] then - dfhack.script_environment('functions/tables').makeItemTable(itemID) - end - if alter == 'track' then - local qualityTable = itemTable[tostring(itemID)].Quality - qualityTable.Current = tostring(change) - if dur >= 0 then - local statusTable = qualityTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = tostring(change) - else - qualityTable.Base = tostring(change) - end - elseif alter == 'end' then - local qualityTable = itemTable[tostring(itemID)].Quality - qualityTable.Current = tostring(change) - local statusTable = qualityTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - end -end - -function trackSubtype(itemID,change,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local itemTable = roses.ItemTable - if not itemTable[tostring(itemID)] then - dfhack.script_environment('functions/tables').makeItemTable(itemID) - end - if alter == 'track' then - local subtypeTable = itemTable[tostring(itemID)].Quality - subtypeTable.Current = tostring(change) - if dur >= 0 then - local statusTable = subtypeTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = tostring(change) - else - subtypeTable.Base = tostring(change) - end - elseif alter == 'end' then - local subtypeTable = itemTable[tostring(itemID)].Quality - subtypeTable.Current = tostring(change) - local statusTable = subtypeTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - end -end - -function changeMaterial(item,material,dur,track) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - mat = dfhack.matinfo.find(material) - save = dfhack.matinfo.getToken(item.mat_type,item.mat_index) - item.mat_type = mat.type - item.mat_index = mat.index - - if tonumber(dur) and tonumber(dur) > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/item','changeMaterial',{item.id,save,0,'end'}) - end - - if track then - trackMaterial(item.id,material,dur,track) - end -end - -function changeQuality(item,quality,dur,track) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - save = item.quality - item:setQuality(quality) - - if tonumber(dur) and tonumber(dur) > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/item','changeQuality',{item.id,save,0,'end'}) - end - - if track then - trackQuality(item.id,quality,dur,track) - end -end - -function changeSubtype(item,subtype,dur,track) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - local itemType = item:getType() - local itemSubtype = item:getSubtype() - itemSubtype = dfhack.items.getSubtypeDef(itemType,itemSubtype).id - local found = false - for i=0,dfhack.items.getSubtypeCount(itemType)-1,1 do - local item_sub = dfhack.items.getSubtypeDef(itemType,i) - if item_sub.id == subtype then - item:setSubtype(item_sub.subtype) - found = true - end - end - - if tonumber(dur) and tonumber(dur) > 0 and found then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/item','changeSubtype',{item.id,itemSubtype,0,'end'}) - elseif not found then - print('Incompatable item type and subtype') - end - - if track and found then - trackSubtype(item.id,subtype,dur,track) - end -end - -function create(item,material,options) --from modtools/create-item - options = options or {} - quality = options.quality or 0 - creatorID = options.creator or -1 - if tonumber(creatorID) and tonumber(creatorID) >= 0then - creator = df.unit.find(creatorID) - else - creator = creatorID - creatorID = creator.id - end - dur = options.dur or 0 - - itemType = dfhack.items.findType(item) - if itemType == -1 then - error 'Invalid item.' - end - local itemSubtype = dfhack.items.findSubtype(item) - - material = dfhack.matinfo.find(material) - if not material then - error 'Invalid material.' - end - - if tonumber(creatorID) >= 0 then - item = dfhack.items.createItem(itemType, itemSubtype, material.type, material.index, creator) - else - item = dfhack.items.createItem(itemType, itemSubtype, material.type, material.index, df.unit.find(0)) - item = df.item.find(item) - item.maker_race = -1 - item.maker = -1 - item = item.id - end - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/item','removal',{item}) - end - - return item - -end - -function equip(item, unit, bodyPart, mode) --from modtools/equip-item - --it is assumed that the item is on the ground - --taken from expwnent - item.flags.on_ground = false - item.flags.in_inventory = true - local block = dfhack.maps.getTileBlock(item.pos) - local occupancy = block.occupancy[item.pos.x%16][item.pos.y%16] - for k,v in ipairs(block.items) do - --local blockItem = df.item.find(v) - if v == item.id then - block.items:erase(k) - break - end - end - local foundItem = false - for k,v in ipairs(block.items) do - local blockItem = df.item.find(v) - if blockItem.pos.x == item.pos.x and blockItem.pos.y == item.pos.y then - foundItem = true - break - end - end - if not foundItem then - occupancy.item = false - end - - local inventoryItem = df.unit_inventory_item:new() - inventoryItem.item = item - inventoryItem.mode = mode - inventoryItem.body_part_id = bodyPart - unit.inventory:insert(#unit.inventory,inventoryItem) -end - -function makeProjectileFall(item,origin,velocity) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - proj = dfhack.items.makeProjectile(item) - proj.origin_pos.x=origin[1] - proj.origin_pos.y=origin[2] - proj.origin_pos.z=origin[3] - proj.prev_pos.x=origin[1] - proj.prev_pos.y=origin[2] - proj.prev_pos.z=origin[3] - proj.cur_pos.x=origin[1] - proj.cur_pos.y=origin[2] - proj.cur_pos.z=origin[3] - proj.flags.no_impact_destroy=false - proj.flags.bouncing=true - proj.flags.piercing=true - proj.flags.parabolic=true - proj.flags.unk9=true - proj.flags.no_collide=true - proj.speed_x=velocity[1] - proj.speed_y=velocity[2] - proj.speed_z=velocity[3] - -end - -function makeProjectileShot(item,origin,target,options) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - - velocity = options.velocity or 20 - hit_chance = options.accuracy or 50 - max_range = options.range or 10 - min_range = options.minimum or 1 - - proj = dfhack.items.makeProjectile(item) - proj.origin_pos.x=origin[1] - proj.origin_pos.y=origin[2] - proj.origin_pos.z=origin[3] - proj.prev_pos.x=origin[1] - proj.prev_pos.y=origin[2] - proj.prev_pos.z=origin[3] - proj.cur_pos.x=origin[1] - proj.cur_pos.y=origin[2] - proj.cur_pos.z=origin[3] - proj.target_pos.x=target[1] - proj.target_pos.y=target[2] - proj.target_pos.z=target[3] - proj.flags.no_impact_destroy=false - proj.flags.bouncing=false - proj.flags.piercing=false - proj.flags.parabolic=false - proj.flags.unk9=false - proj.flags.no_collide=false --- Need to figure out these numbers!!! - proj.distance_flown=0 -- Self explanatory - proj.fall_threshold=max_range -- Seems to be able to hit units further away with larger numbers - proj.min_hit_distance=min_range -- Seems to be unable to hit units closer than this value - proj.min_ground_distance=max_range-1 -- No idea - proj.fall_counter=0 -- No idea - proj.fall_delay=0 -- No idea - proj.hit_rating=hit_chance -- I think this is how likely it is to hit a unit (or to go where it should maybe?) - proj.unk22 = velocity - proj.speed_x=0 - proj.speed_y=0 - proj.speed_z=0 - -end - -function removal(item) - - if tonumber(item) then - item = df.item.find(item) - end - - dfhack.items.remove(item) - -end - -function findItem(search) - local primary = search[1] - local secondary = search[2] or 'NONE' - local tertiary = search[3] or 'NONE' - local quaternary = search[4] or 'NONE' - local itemList = df.global.world.items.all - local targetList = {} - local target = nil - local n = 0 - if primary == 'RANDOM' then - if secondary == 'NONE' or secondary == 'ALL' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'WEAPON' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_weaponst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'ARMOR' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_armorst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'HELM' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_helmst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'SHIELD' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_shieldst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'GLOVE' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_glovesst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'SHOE' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_shoesst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'PANTS' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_pantsst:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'AMMO' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and df.item_ammost:is_instance(x) then - if x.subtype then - if tertiary == x.subtype.id or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - elseif secondary == 'MATERIAL' then - local mat_type = dfhack.matinfo.find(tertiary).type - local mat_index = dfhack.matinfo.find(tertiary).index - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and x.mat_type == mat_type and x.mat_index == mat_index then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'VALUE' then - if tertiary == 'LESS_THAN' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and dfhack.items.getValue(x) <= tonumber(quaternary) then - n = n + 1 - targetList[n] = x - end - end - elseif tertiary == 'GREATER_THAN' then - for i,x in pairs(itemList) do - if dfhack.items.getPosition(x) and dfhack.items.getValue(x) >= tonumber(quaternary) then - n = n + 1 - targetList[n] = x - end - end - end - end - end - if n > 0 then - targetList = dfhack.script_environment('functions/misc').permute(targetList) - target = targetList[1] - return target - else - print('No valid item found for event') - return nil - end -end \ No newline at end of file diff --git a/raw/scripts/functions/map.lua b/raw/scripts/functions/map.lua deleted file mode 100644 index 068f639..0000000 --- a/raw/scripts/functions/map.lua +++ /dev/null @@ -1,644 +0,0 @@ -function changeInorganic(x,y,z,inorganic,dur) - if y == nil and z == nil then - pos = x - else - pos = {x = x, y = y, z = z} - end - - local block=dfhack.maps.ensureTileBlock(pos) - local current_inorganic = 'clear' - for k = #block.block_events-1,0,-1 do - if df.block_square_event_mineralst:is_instance(block.block_events[k]) then - if current_inorganic == 'clear' then current_inorganic = block.block_events[k].inorganic_mat end - b.block_events:erase(k) - end - end - if inorganic == 'clear' then - return - else - if tonumber(inorganic) then - inorganic = tonumber(inorganic) - else - inorganic = dfhack.matinfo.find(inorganic).index - end - ev=df.block_square_event_mineralst:new() - ev.inorganic_mat=inorganic - ev.flags.vein=true - block.block_events:insert("#",ev) - dfhack.maps.setTileAssignment(ev.tile_bitmask,math.fmod(pos.x,16),math.fmod(pos.y,16),true) - end - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/map','changeInorganic',{pos.x,pos.y,pos.z,current_inorganic,0}) - end -end - -function changeTemperature(x,y,z,temperature,dur) - if y == nil and z == nil then - pos = x - else - pos = {x = x, y = y, z = z} - end - - local block = dfhack.maps.ensureTileBlock(pos) - local current_temperature = block.temperature_2[x%16][y%16] - - block.temperature_1[x%16][y%16] = temperature - if dur > 0 then - block.temperature_2[x%16][y%16] = temperature - block.flags.update_temperature = false - end - - if dur > 0 then - dfhack.script_environment('persistDelay').environmentDelay(dur,'functions/map','changeTemperature',{pos.x,pos.y,pos.z,current_temperature,0}) - end -end - -function checkBounds(pos) - local mapx, mapy, mapz = dfhack.maps.getTileSize() - if pos.x < 1 then pos.x = 1 end - if pos.x > mapx-1 then pos.x = mapx-1 end - if pos.y < 1 then pos.y = 1 end - if pos.y > mapy-1 then pos.y = mapy-1 end - if pos.z < 1 then pos.z = 1 end - if pos.z > mapz-1 then pos.z = mapz-1 end - - return pos -end - -function getEdgesPosition(pos,radius) - - local edges = {} - local rx = radius.x or radius[1] or 0 - local ry = radius.y or radius[2] or 0 - local rz = radius.z or radius[3] or 0 - local xpos = pos.x or pos[1] - local ypos = pos.y or pos[2] - local zpos = pos.z or pos[3] - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - edges.xmin = xpos - rx - edges.xmax = xpos + rx - edges.ymin = ypos - ry - edges.ymax = ypos + ry - edges.zmax = zpos + rz - edges.zmin = zpos - rz - if edges.xmin < 1 then edges.xmin = 1 end - if edges.ymin < 1 then edges.ymin = 1 end - if edges.zmin < 1 then edges.zmin = 1 end - if edges.xmax > mapx then edges.xmax = mapx-1 end - if edges.ymax > mapy then edges.ymax = mapy-1 end - if edges.zmax > mapz then edges.zmax = mapz-1 end - - return edges -end - -function getFillPosition(pos,radius) - - local positions = {} - local rx = radius.x or radius[1] or 0 - local ry = radius.y or radius[2] or 0 - local rz = radius.z or radius[3] or 0 - local xpos = pos.x or pos[1] - local ypos = pos.y or pos[2] - local zpos = pos.z or pos[3] - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - n = 0 - for k = 0,rz,1 do - for j = 0,ry,1 do - for i = 0,rx,1 do - n = n+1 - positions[n] = {x = xpos+i, y = ypos+j, z = zpos+k} - if positions[n].x < 1 then positions[n].x = 1 end - if positions[n].y < 1 then positions[n].y = 1 end - if positions[n].z < 1 then positions[n].z = 1 end - if positions[n].x > mapx then positions[n].x = mapx-1 end - if positions[n].y > mapy then positions[n].y = mapy-1 end - if positions[n].z > mapz then positions[n].z = mapz-1 end - end - end - end - - return positions,n -end - -function getPositionPlan(file,target,origin) - - local xtar = target.x or target[1] - local ytar = target.y or target[2] - local ztar = target.z or target[3] - - local utils = require 'utils' - local split = utils.split_string - - local iofile = io.open(file,"r") - local data = iofile:read("*all") - iofile:close() - local splitData = split(data,',') - - local x = {} - local y = {} - local t = {} - local xi = 0 - local yi = 1 - local xT = -1 - local yT = -1 - local xS = -1 - local yS = -1 - local xC = -1 - local yC = -1 - local n = 0 - local locations = {} - - for i,v in ipairs(splitData) do - if split(v,'\n')[1] ~= v then - xi = 1 - yi = yi + 1 - else - xi = xi + 1 - end - if v == 'T' or v == '\nT' then - xT = xi - yT = yi - end - if v == 'S' or v == '\nS' then - xS = xi - yS = yi - end - if v == 'C' or v == '\nC' then - xC = xi - yC = yi - end - if v == 'T' or v == '\nT' or v == '1' or v == '\n1' or v == 'C' or v == '\nC' then - t[i] = true - else - t[i] = false - end - x[i] = xi - y[i] = yi - end - - if origin then - xorg = origin.x or origin[1] - yorg = origin.y or origin[2] - zorg = origin.z or origin[3] - xdis = math.abs(xorg-xtar) - ydis = math.abs(yorg-ytar) - if ztar ~= zorg then return locations,n end - if xdis ~= 0 then - xface = (xorg-xtar)/math.abs(xorg-xtar) - else - xface = 0 - end - if ydis ~= 0 then - yface = (yorg-ytar)/math.abs(yorg-ytar) - else - yface = 0 - end - if xface == 0 and yface == 0 then - xface = 0 - yface = 1 - end - if xT == -1 and xS > 0 then - for i,v in ipairs(x) do - if t[i] then - n = n + 1 - xO = x[i] - xS - yO = y[i] - yS - xpos = -yface*xO+xface*yO - ypos = xface*xO+yface*yO - locations[n] = {x = xorg + xpos, y = yorg + ypos, z = zorg} - if (xface == 1 and yface == 1) or (xface == -1 and yface == 1) or (xface == 1 and yface == -1) or (xface == -1 and yface == -1) then - if xO ~= 0 and yO ~= 0 and (xO+yO) ~= 0 and (xO-yO) ~= 0 then - n = n + 1 - if yO < 0 and xO < 0 then - locations[n] = {x = xorg + xpos + (xface-yface)*xface*xface/2, y = yorg + ypos + (xface+yface)*xface*yface/2, z = zorg} - elseif yO < 0 and xO > 0 then - locations[n] = {x = xorg + xpos + (xface+yface)*xface*xface/2, y = yorg + ypos + (xface-yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO > 0 then - locations[n] = {x = xorg + xpos - (xface-yface)*xface*xface/2, y = yorg + ypos - (xface+yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO < 0 then - locations[n] = {x = xorg + xpos - (xface+yface)*xface*xface/2, y = yorg + ypos - (xface-yface)*xface*yface/2, z = zorg} - end - end - end - end - end - elseif xT > 0 and xS == -1 then - for i,v in ipairs(x) do - if t[i] then - n = n + 1 - xO = x[i] - xT - yO = y[i] - yT - xpos = -yface*xO+xface*yO - ypos = xface*xO+yface*yO - locations[n] = {x = xorg + xpos, y = yorg + ypos, z = zorg} - if (xface == 1 and yface == 1) or (xface == -1 and yface == 1) or (xface == 1 and yface == -1) or (xface == -1 and yface == -1) then - if xO ~= 0 and yO ~= 0 and (xO+yO) ~= 0 and (xO-yO) ~= 0 then - n = n + 1 - if yO < 0 and xO < 0 then - locations[n] = {x = xorg + xpos + (xface-yface)*xface*xface/2, y = yorg + ypos + (xface+yface)*xface*yface/2, z = zorg} - elseif yO < 0 and xO > 0 then - locations[n] = {x = xorg + xpos + (xface+yface)*xface*xface/2, y = yorg + ypos + (xface-yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO > 0 then - locations[n] = {x = xorg + xpos - (xface-yface)*xface*xface/2, y = yorg + ypos - (xface+yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO < 0 then - locations[n] = {x = xorg + xpos - (xface+yface)*xface*xface/2, y = yorg + ypos - (xface-yface)*xface*yface/2, z = zorg} - end - end - end - end - end - elseif xT > 0 and xS > 0 then -- For now just use the same case as above, in the future should add a way to check for both - for i,v in ipairs(x) do - if t[i] then - n = n + 1 - xO = x[i] - xT - yO = y[i] - yT - xpos = -yface*xO+xface*yO - ypos = xface*xO+yface*yO - locations[n] = {x = xorg + xpos, y = yorg + ypos, z = zorg} - if (xface == 1 and yface == 1) or (xface == -1 and yface == 1) or (xface == 1 and yface == -1) or (xface == -1 and yface == -1) then - if xO ~= 0 and yO ~= 0 and (xO+yO) ~= 0 and (xO-yO) ~= 0 then - n = n + 1 - if yO < 0 and xO < 0 then - locations[n] = {x = xorg + xpos + (xface-yface)*xface*xface/2, y = yorg + ypos + (xface+yface)*xface*yface/2, z = zorg} - elseif yO < 0 and xO > 0 then - locations[n] = {x = xorg + xpos + (xface+yface)*xface*xface/2, y = yorg + ypos + (xface-yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO > 0 then - locations[n] = {x = xorg + xpos - (xface-yface)*xface*xface/2, y = yorg + ypos - (xface+yface)*xface*yface/2, z = zorg} - elseif yO > 0 and xO < 0 then - locations[n] = {x = xorg + xpos - (xface+yface)*xface*xface/2, y = yorg + ypos - (xface-yface)*xface*yface/2, z = zorg} - end - end - end - end - end - end - else - for i,v in ipairs(x) do - if t[i] then - n = n + 1 - locations[n] = {x = xtar + x[i] - xT, y = ytar + y[i] - yT, z = ztar} - end - end - end - - return locations,n -end - -function getPositionCenter(radius) - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - if tonumber(radius) then - radius = tonumber(radius) - else - radius = 0 - end - - x = math.floor(mapx/2) - y = math.floor(mapy/2) - pos.x = rand:random(radius) + (rand:random(2)-1)*x - pos.y = rand:random(radius) + (rand:random(2)-1)*y - pos.z = rand:random(mapz) - - return pos -end - -function getPositionEdge() - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - roll = rand:random(2) - if roll == 1 then - pos.x = 2 - else - pos.x = mapx-1 - end - roll = rand:random(2) - if roll == 1 then - pos.y = 2 - else - pos.y = mapy-1 - end - pos.z = rand:random(mapy) - - return pos -end - -function getPositionRandom() - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - pos.x = rand:random(mapx) - pos.y = rand:random(mapy) - pos.z = rand:random(mapz) - - return pos -end - -function getPositionCavern(number) - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - for i = 1,mapx,1 do - for j = 1,mapy,1 do - for k = 1,mapz,1 do - if dfhack.maps.getTileFlags(i,j,k).subterranean then - if dfhack.maps.getTileBlock(i,j,k).global_feature >= 0 then - for l,v in pairs(df.global.world.features.feature_global_idx) do - if v == dfhack.maps.getTileBlock(i,j,k).global_feature then - feature = df.global.world.features.map_features[l] - if feature.start_depth == tonumber(quaternary) or quaternary == 'NONE' then - if df.tiletype.attrs[dfhack.maps.getTileType(i,j,k)].caption == 'stone floor' then - n = n+1 - targetList[n] = {x = i, y = j, z = k} - end - end - end - end - end - else - break - end - end - end - end - - pos = dfhack.script_environment('functions/misc').permute(targetList) - return pos[1] -end - -function getPositionSurface(location) - local pos = {} - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - pos.x = location.x or location[1] - pos.y = location.y or location[2] - pos.z = mapz - 1 - - local j = 0 - while dfhack.maps.ensureTileBlock(pos.x,pos.y,pos.z-j).designation[pos.x%16][pos.y%16].outside do - j = j + 1 - end - pos.z = pos.z - j - - pos = checkBounds(pos) - return pos -end - -function getPositionSky(location) - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - pos.x = location.x or location[1] - pos.y = location.y or location[2] - pos.z = mapz - 1 - - local j = 0 - while dfhack.maps.ensureTileBlock(pos.x,pos.y,pos.z-j).designation[pos.x%16][pos.y%16].outside do - j = j + 1 - end - pos.z = rand:random(mapz-j)+j - - pos = checkBounds(pos) - return pos -end - -function getPositionUnderground(location) - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - - pos.x = location.x or location[1] - pos.y = location.y or location[2] - pos.z = mapz - 1 - - local j = 0 - while dfhack.maps.ensureTileBlock(pos.x,pos.y,pos.z-j).designation[pos.x%16][pos.y%16].outside do - j = j + 1 - end - pos.z = rand:random(j-1) - - pos = checkBounds(pos) - return pos -end - -function getPositionLocationRandom(location,radius) - lx = location.x or location[1] - ly = location.y or location[2] - lz = location.z or location[3] - - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - local rx = radius.x or radius[1] or 0 - local ry = radius.y or radius[2] or 0 - local rz = radius.z or radius[3] or 0 - local xmin = lx - rx - local ymin = ly - ry - local zmin = lz - rz - local xmax = lx + rx - local ymax = ly + ry - local zmax = lz + rz - - pos.x = rand:random(xmax-xmin) + xmin - pos.y = rand:random(ymax-ymin) + ymin - pos.z = rand:random(zmax-zmin) + zmin - - pos = checkBounds(pos) - return pos -end - -function getPositionUnitRandom(unit,radius) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local pos = {} - local rand = dfhack.random.new() - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - local rx = radius.x or radius[1] or 0 - local ry = radius.y or radius[2] or 0 - local rz = radius.z or radius[3] or 0 - local xmin = unit.pos.x - rx - local ymin = unit.pos.y - ry - local zmin = unit.pos.z - rz - local xmax = unit.pos.x + rx - local ymax = unit.pos.y + ry - local zmax = unit.pos.z + rz - - pos.x = rand:random(xmax-xmin) + xmin - pos.y = rand:random(ymax-ymin) + ymin - pos.z = rand:random(zmax-zmin) + zmin - - pos = checkBounds(pos) - return pos -end - -function spawnFlow(edges,offset,flowType,inorganic,density,static) - local ox = offset.x or offset[1] or 0 - local oy = offset.y or offset[2] or 0 - local oz = offset.z or offset[3] or 0 - if edges.xmin then - xmin = edges.xmin + ox - xmax = edges.xmax + ox - ymin = edges.ymin + oy - ymax = edges.ymax + oy - zmin = edges.zmin + oz - zmax = edges.zmax + oz - else - xmin = edges.x + ox or edges[1] + ox - ymin = edges.y + oy or edges[2] + oy - zmin = edges.z + oz or edges[3] + oz - xmax = edges.x + ox or edges[1] + ox - ymax = edges.y + oy or edges[2] + oy - zmax = edges.z + oz or edges[3] + oz - end - - for x = xmin, xmax, 1 do - for y = ymin, ymax, 1 do - for z = zmin, zmax, 1 do - block = dfhack.maps.ensureTileBlock(x,y,z) - dsgn = block.designation[x%16][y%16] - if not dsgn.hidden then - flow = dfhack.maps.spawnFlow({x=x,y=y,z=z},flowType,0,inorganic,density) - if static then flow.expanding = false end - end - end - end - end -end - -function spawnLiquid(edges,offset,depth,magma,circle,taper) - local ox = offset.x or offset[1] or 0 - local oy = offset.y or offset[2] or 0 - local oz = offset.z or offset[3] or 0 - if edges.xmin then - xmin = edges.xmin + ox - xmax = edges.xmax + ox - ymin = edges.ymin + oy - ymax = edges.ymax + oy - zmin = edges.zmin + oz - zmax = edges.zmax + oz - else - xmin = edges.x + ox or edges[1] + ox - ymin = edges.y + oy or edges[2] + oy - zmin = edges.z + oz or edges[3] + oz - xmax = edges.x + ox or edges[1] + ox - ymax = edges.y + oy or edges[2] + oy - zmax = edges.z + oz or edges[3] + oz - end - - for x = xmin, xmax, 1 do - for y = ymin, ymax, 1 do - for z = zmin, zmax, 1 do - if circle then - if (math.abs(x-(xmax+xmin)/2)+math.abs(y-(ymax+ymin)/2)+math.abs(z-(zmax+zmin)/2)) <= math.sqrt((xmax-xmin)^2/4+(ymax-ymin)^2/4+(zmax-zmin)^2/4) then - block = dfhack.maps.ensureTileBlock(x,y,z) - dsgn = block.designation[x%16][y%16] - if not dsgn.hidden then - if taper then - size = math.floor(depth-((xmax-xmin)*math.abs((xmax+xmin)/2-x)+(ymax-ymin)*math.abs((ymax+ymin)/2-y)+(zmax-zmin)*math.abs((zmax+zmin)/2-z))/depth) - if size < 0 then size = 0 end - else - size = depth - end - dsgn.flow_size = size - if magma then dsgn.liquid_type = true end - flow = block.liquid_flow[x%16][y%16] - flow.temp_flow_timer = 10 - flow.unk_1 = 10 - block.flags.update_liquid = true - block.flags.update_liquid_twice = true - end - end - else - block = dfhack.maps.ensureTileBlock(x,y,z) - dsgn = block.designation[x%16][y%16] - if not dsgn.hidden then - if taper then - size = math.floor(depth-((xmax-xmin)*math.abs((xmax+xmin)/2-x)+(ymax-ymin)*math.abs((ymax+ymin)/2-y)+(zmax-zmin)*math.abs((zmax+zmin)/2-z))/depth) - if size < 0 then size = 0 end - else - size = depth - end - flow = block.liquid_flow[x%16][y%16] - flow.temp_flow_timer = 10 - flow.unk_1 = 10 - dsgn.flow_size = size - if magma then dsgn.liquid_type = true end - block.flags.update_liquid = true - block.flags.update_liquid_twice = true - end - end - end - end - end -end - -function findLocation(search) - local primary = search[1] - local secondary = search[2] or 'NONE' - local tertiary = search[3] or 'NONE' - local quaternary = search[4] or 'NONE' - local x_map, y_map, z_map = dfhack.maps.getTileSize() - x_map = x_map - 1 - y_map = y_map - 1 - z_map = z_map - 1 - local targetList = {} - local target = nil - local found = false - local n = 1 - local rando = dfhack.random.new() - if primary == 'RANDOM' then - if secondary == 'NONE' or secondary == 'ALL' then - n = 1 - targetList = {{x = rando:random(x_map-1)+1,y = rando:random(y_map-1)+1,z = rando:random(z_map-1)+1}} - elseif secondary == 'SURFACE' then - if tertiary == 'ALL' or tertiary == 'NONE' then - targetList[n] = getPositionRandom() - targetList[n] = getPositionSurface(target[n]) - elseif tertiary == 'EDGE' then - targetList[n] = getPositionEdge() - targetList[n] = getPositionSurface(target[n]) - elseif tertiary == 'CENTER' then - targetList[n] = getPositionCenter(quaternary) - targetList[n] = getPositionSurface(target[n]) - end - elseif secondary == 'UNDERGROUND' then - if tertiary == 'ALL' or tertiary == 'NONE' then - targetList[n] = getPositionRandom() - targetList[n] = getPositionUnderground(target[n]) - elseif tertiary == 'CAVERN' then - targetList[n] = getPositionCavern(quaternary) - end - elseif secondary == 'SKY' then - if tertiary == 'ALL' or tertiary == 'NONE' then - targetList[n] = getPositionRandom() - targetList[n] = getPositionSky(target[n]) - elseif tertiary == 'EDGE' then - targetList[n] = getPositionEdge() - targetList[n] = getPositionSky(target[n]) - elseif tertiary == 'CENTER' then - targetList[n] = getPositionCenter(quaternary) - targetList[n] = getPositionSky(target[n]) - end - end - end - target = targetList[1] - return target -end \ No newline at end of file diff --git a/raw/scripts/functions/misc.lua b/raw/scripts/functions/misc.lua deleted file mode 100644 index 0971b84..0000000 --- a/raw/scripts/functions/misc.lua +++ /dev/null @@ -1,118 +0,0 @@ - -function permute(tab) - -- Randomly permutes a given table. Returns permuted table - n = #tab - for i = 1, n do - local j = math.random(i, n) - tab[i], tab[j] = tab[j], tab[i] - end - return tab -end - -function changeCounter(counter,amount,extra) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local roses = roses - if not roses then return end - - local utils = require 'utils' - local split = utils.split_string - - counterTable = roses.CounterTable - counters = split(counter,':') - - for i,x in pairs(counters) do - if not counterTable[x] then - if i ~= 1 then - if tonumber(counterTable) then - print('Higher level counter already set') - print('Counter = '..counters[i-1],'Sub-counter = '..counters[i]) - print('Can not set a value to a sub-counter with an already set counter') - return - end - end - if i ~= #counters then - counterTable[x] = {} - else - counterTable[x] = '0' - break - end - else - if tonumber(counterTable[x]) and i == #counters then - break - elseif i == #counters then - print('Sub-counter already set') - print('Counter = '..counters[i],'Sub-counter = '..counterTable[x][1]) - print('Can not set a value of a counter with already set sub-counters') - return - end - end - counterTable = counterTable[x] - if (x == 'UNIT' or x == 'BUILDING' or x == 'ITEM') and i == 1 then - if not counterTable[tostring(extra)] then - counterTable[tostring(extra)] = {} - end - counterTable = counterTable[tostring(extra)] - end - end - - if not tonumber(counterTable[counters[#counters]]) then - counterTable[counters[#counters]] = '0' - end - - counterTable[counters[#counters]] = tostring(counterTable[counters[#counters]] + amount) - - return counterTable[counters[#counters]] -end - -function getCounter(counter,extra) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local roses = roses - if not roses then return end - - local utils = require 'utils' - local split = utils.split_string - - counterTable = roses.CounterTable - counters = split(counter,':') - - for i,x in pairs(counters) do - if not counterTable[x] then - if i ~= 1 then - if tonumber(counterTable) then - print('Higher level counter already set') - print('Counter = '..counters[i-1],'Sub-counter = '..counters[i]) - print('Can not get a value to a sub-counter with an already set counter') - return - end - end - if i ~= #counters then - counterTable[x] = {} - else - counterTable[x] = '0' - break - end - else - if tonumber(counterTable[x]) and i == #counters then - break - elseif i == #counters then - print('Sub-counter already set') - print('Counter = '..counters[i],'Sub-counter = '..counterTable[x][1]) - print('Can not get a value of a counter with already set sub-counters') - return - end - end - counterTable = counterTable[x] - if (x == 'UNIT' or x == 'BUILDING' or x == 'ITEM') and i == 1 then - if not counterTable[tostring(extra)] then - counterTable[tostring(extra)] = {} - end - counterTable = counterTable[tostring(extra)] - end - end - - if not tonumber(counterTable[counters[#counters]]) then - counterTable[counters[#counters]] = '0' - end - - return counterTable[counters[#counters]] -end diff --git a/raw/scripts/functions/tables.lua b/raw/scripts/functions/tables.lua deleted file mode 100644 index 3d5976e..0000000 --- a/raw/scripts/functions/tables.lua +++ /dev/null @@ -1,908 +0,0 @@ -function makeCivilizationTable() - - function tchelper(first, rest) - return first:upper()..rest:lower() - end - - local utils = require 'utils' - local split = utils.split_string - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.CivilizationTable = {} - - print('Searching for civilization files') - local files = {} - local dir = dfhack.getDFPath() - local n = 1 - local location = dir.."/raw/objects/" - for _,fname in pairs(dfhack.internal.getDir(location)) do - if (split(fname,'_')[1] == 'civilizations' or fname == 'civilizations.txt') then - files[n] = location..fname - n = n + 1 - end - end - - if #files >= 1 then - print('Civilization files found:') - printall(files) - else - print('No Civilization files found') - return false - end - - civilizations = roses.CivilizationTable - for _,file in ipairs(files) do - - local data = {} - local iofile = io.open(file,"r") - local lineCount = 1 - while true do - local line = iofile:read("*line") - if line == nil then break end - data[lineCount] = line - lineCount = lineCount + 1 - end - iofile:close() - - local dataInfo = {} - local count = 1 - for i,line in ipairs(data) do - if split(line,':')[1] == '[CIVILIZATION' then - dataInfo[count] = {split(split(line,':')[2],']')[1],i,0} - count = count + 1 - end - end - - for i,x in ipairs(dataInfo) do - civilizationToken = x[1] - startLine = x[2]+1 - if i ==#dataInfo then - endLine = #data - else - endLine = dataInfo[i+1][2]-1 - end - civilizations[civilizationToken] = {} - civilization = civilizations[civilizationToken] - civilization.Level = {} - civilization.Positions = {} - for j = startLine,endLine,1 do - test = data[j]:gsub("%s+","") - test = split(test,':')[1] - array = split(data[j],':') - for k = 1, #array, 1 do - array[k] = split(array[k],']')[1] - end - if test == '[NAME' then - civilization.Name = array[2] - elseif test == '[LEVELS' then - civilization.Levels = array[2] - elseif test == '[LEVEL_METHOD' then - civilization.LevelMethod = array[2] - civilization.LevelPercent = array[3] - elseif test == '[LEVEL' then - level = array[2] - civilization.Level[level] = {} - civsLevel = civilization.Level[level] - civsLevel.Ethics = {} - civsLevel.RemovePosition = {} - civsLevel.AddPosition = {} - civsLevel.Remove = {} - civsLevel.Remove.Creature = {} - civsLevel.Remove.Organic = {} - civsLevel.Remove.Inorganic = {} - civsLevel.Remove.Refuse = {} - civsLevel.Remove.Item = {} - civsLevel.Remove.Misc = {} - civsLevel.Add = {} - civsLevel.Add.Creature = {} - civsLevel.Add.Organic = {} - civsLevel.Add.Inorganic = {} - civsLevel.Add.Refuse = {} - civsLevel.Add.Item = {} - civsLevel.Add.Misc = {} - elseif test == '[LEVEL_NAME' then - civsLevel.Name = array[2] - elseif test == '[LEVEL_REMOVE' then - subType = array[3]:gsub("(%a)([%w_']*)", tchelper) - if array[2] == 'CREATURE' then - civsLevel.Remove.Creature[subType] = civsLevel.Remove.Creature[subType] or {} - civsLevel.Remove.Creature[subType][array[4]] = array[5] - elseif array[2] == 'INORGANIC' then - civsLevel.Remove.Inorganic[subType] = civsLevel.Remove.Inorganic[subType] or {} - civsLevel.Remove.Inorganic[subType][array[4]] = array[4] - elseif array[2] == 'ORGANIC' then - civsLevel.Remove.Organic[subType] = civsLevel.Remove.Organic[subType] or {} - civsLevel.Remove.Organic[subType][array[4]] = array[5] - elseif array[2] == 'REFUSE' then - civsLevel.Remove.Refuse[subType] = civsLevel.Remove.Refuse[subType] or {} - civsLevel.Remove.Refuse[subType][array[4]] = array[5] - elseif array[2] == 'ITEM' then - civsLevel.Remove.Item[subType] = civsLevel.Remove.Item[subType] or {} - civsLevel.Remove.Item[subType][array[4]] = array[4] - elseif array[2] == 'MISC' then - civsLevel.Remove.Misc[subType] = civsLevel.Remove.Misc[subType] or {} - civsLevel.Remove.Misc[subType][array[4]] = array[5] - end - elseif test == '[LEVEL_ADD' then - subType = array[3]:gsub("(%a)([%w_']*)", tchelper) - if array[2] == 'CREATURE' then - civsLevel.Add.Creature[subType] = civsLevel.Add.Creature[subType] or {} - civsLevel.Add.Creature[subType][array[4]] = array[5] - elseif array[2] == 'INORGANIC' then - civsLevel.Add.Inorganic[subType] = civsLevel.Add.Inorganic[subType] or {} - civsLevel.Add.Inorganic[subType][array[4]] = array[4] - elseif array[2] == 'ORGANIC' then - civsLevel.Add.Organic[subType] = civsLevel.Add.Organic[subType] or {} - civsLevel.Add.Organic[subType][array[4]] = array[5] - elseif array[2] == 'REFUSE' then - civsLevel.Add.Refuse[subType] = civsLevel.Add.Refuse[subType] or {} - civsLevel.Add.Refuse[subType][array[4]] = array[5] - elseif array[2] == 'ITEM' then - civsLevel.Add.Item[subType] = civsLevel.Add.Item[subType] or {} - civsLevel.Add.Item[subType][array[4]] = array[4] - elseif array[2] == 'MISC' then - civsLevel.Add.Misc[subType] = civsLevel.Add.Misc[subType] or {} - civsLevel.Add.Misc[subType][array[4]] = array[5] - end - elseif testa== '[LEVEL_CHANGE_ETHIC' then - civsLevel.Ethics[array[2]:gsub("(%a)([%w_']*)", tchelper)] = array[3] - elseif test == '[LEVEL_CHANGE_METHOD' then - civsLevel.LevelMethod = array[2] - civsLevel.LevelPercent = array[3] - elseif test == '[LEVEL_REMOVE_POSITION' then - civsLevel.RemovePosition[array[2]] = array[2] - elseif test == '[LEVEL_ADD_POSITION' then - position = array[2] - civsLevel.AddPosition[position] = position - civilization.Positions[position] = {} - civsAddPosition = civilization.Positions[position] - civsAddPosition.AllowedCreature = {} - civsAddPosition.AllowedClass = {} - civsAddPosition.RejectedCreature = {} - civsAddPosition.RejectedClass = {} - civsAddPosition.Responsibility = {} - civsAddPosition.AppointedBy = {} - civsAddPosition.Flags = {} - elseif test == '[ALLOWED_CREATURE' then - civsAddPosition.AllowedCreature[array[2]] = array[3] - elseif test == '[REJECTED_CREATURE' then - civsAddPosition.RejectedCreature[array[2]] = array[3] - elseif test == '[ALLOWED_CLASS' then - civsAddPosition.AllowedClass[array[2]] = array[2] - elseif test == '[REJECTED_CLASS' then - civsAddPosition.RejectedClass[array[2]] = array[2] - elseif test == '[NAME' then - civsAddPosition.Name = array[2]..':'..array[3] - elseif test == '[NAME_MALE' then - civsAddPosition.NameMale = array[2]..':'..array[3] - elseif test == '[NAME_FEMALE' then - civsAddPosition.NameFemale = array[2]..':'..array[3] - elseif test == '[SPOUSE' then - civsAddPosition.Spouse = array[2]..':'..array[3] - elseif test == '[SPOUSE_MALE' then - civsAddPosition.SpouseMale = array[2]..':'..array[3] - elseif test == '[SPOUSE_FEMALE' then - civsAddPosition.SpouseFemale = array[2]..':'..array[3] - elseif test == '[NUMBER' then - civsAddPosition.Number = array[2] - elseif test == '[SUCCESSION' then - civsAddPosition.Sucession = array[2] - elseif test == '[LAND_HOLDER' then - civsAddPosition.LandHolder = array[2] - elseif test == '[LAND_NAME' then - civsAddPosition.LandName = array[2] - elseif test == '[APPOINTED_BY' then - civsAddPosition.AppointedBy[array[2]] = array[2] - elseif test == '[REPLACED_BY' then - civsAddPosition.ReplacedBy = array[2] - elseif test == '[RESPONSIBILITY' then - civsAddPosition.Responsibility[array[2]] = array[2] - elseif test == '[PRECEDENCE' then - civsAddPosition.Precedence = array[2] - elseif test == '[REQUIRES_POPULATION' then - civsAddPosition.RequiresPopulation = array[2] - elseif test == '[REQUIRED_BOXES' then - civsAddPosition.RequiredBoxes = array[2] - elseif test == '[REQUIRED_CABINETS' then - civsAddPosition.RequiredCabinets = array[2] - elseif test == '[REQUIRED_RACKS' then - civsAddPosition.RequiredRacks = array[2] - elseif test == '[REQUIRED_STANDS' then - civsAddPosition.RequiredStands = array[2] - elseif test == '[REQUIRED_OFFICE' then - civsAddPosition.RequiredOffice = array[2] - elseif test == '[REQUIRED_BEDROOM' then - civsAddPosition.RequiredBedroom = array[2] - elseif test == '[REQUIRED_DINING' then - civsAddPosition.RequiredDining = array[2] - elseif test == '[REQUIRED_TOMB' then - civsAddPosition.RequiredTomb = array[2] - elseif test == '[MANDATE_MAX' then - civsAddPosition.MandateMax = array[2] - elseif test == '[DEMAND_MAX' then - civsAddPosition.DemandMax = array[2] - elseif test == '[COLOR' then - civsAddPosition.Color = array[2]..':'..array[3]..':'..array[4] - elseif test == '[SQUAD' then - civsAddPosition.Squad = array[2]..':'..array[3]..':'..array[4] - elseif test == '[COMMANDER' then - civsAddPosition.Commander = array[2]..':'..array[3] - elseif test == '[FLAGS' then - civsAddPosition.Flags[array[2]] = 'true' - else - if position then civsAddPosition[split(split(data[j],']')[1],'%[')[2]] = 'true' end - end - end - end - end - - for id,entity in pairs(df.global.world.entities.all) do - makeEntityTable(id) - end - - return true -end - -function makeClassTable() - local utils = require 'utils' - local split = utils.split_string - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.ClassTable = {} - - print('Searching for class files') - local files = {} - local dir = dfhack.getDFPath() - local n = 1 - local location = dir.."/raw/objects/" - for _,fname in pairs(dfhack.internal.getDir(location)) do - if (split(fname,'_')[1] == 'classes' or fname == 'classes.txt') then - files[n] = location..fname - n = n + 1 - end - end - - if #files >= 1 then - print('Class files found:') - printall(files) - else - print('No Class files found') - return false - end - - classes = roses.ClassTable - for _,file in ipairs(files) do - - local data = {} - local iofile = io.open(file,"r") - local lineCount = 1 - while true do - local line = iofile:read("*line") - if line == nil then break end - data[lineCount] = line - lineCount = lineCount + 1 - end - iofile:close() - - local dataInfo = {} - local count = 1 - for i,line in ipairs(data) do - if split(line,':')[1] == '[CLASS' then - dataInfo[count] = {split(split(line,':')[2],']')[1],i,0} - count = count + 1 - end - end - - for i,x in ipairs(dataInfo) do - classToken = x[1] - startLine = x[2]+1 - if i ==#dataInfo then - endLine = #data - else - endLine = dataInfo[i+1][2]-1 - end - classes[classToken] = {} - class = classes[classToken] - for j = startLine,endLine,1 do - test = data[j]:gsub("%s+","") - test = split(test,':')[1] - if test == '[NAME' then - class.Name = split(split(data[j],':')[2],']')[1] - elseif test == '[LEVELS' then - class.Levels = split(split(data[j],':')[2],']')[1] - end - if class.Name and class.Levels then break end - end - class.Experience = {} - class.LevelBonus = {} - class.RequiredClass = {} - class.RequiredPhysical = {} - class.RequiredCounter = {} - class.RequiredMental = {} - class.RequiredCreature = {} - class.BonusPhysical = {} - class.BonusMental = {} - class.RequiredSkill = {} - class.RequiredTrait = {} - class.ForbiddenClass = {} - class.BonusSkill = {} - class.BonusTrait = {} - class.Spells = {} - for j = startLine,endLine,1 do - test = data[j]:gsub("%s+","") - test = split(test,':')[1] - array = split(data[j],':') - for k = 1, #array, 1 do - array[k] = split(array[k],']')[1] - end - if test == '[AUTO_UPGRADE' then - class.AutoUpgrade = array[2] - elseif test == '[EXP' then - local temptable = {select(2,table.unpack(array))} - strint = '1' - for _,v in pairs(temptable) do - class.Experience[strint] = v - strint = tostring(strint+1) - end - if tonumber(strint)-1 < tonumber(class.Levels) then --- print('Incorrect amount of experience numbers, must be equal to number of levels. Assuming linear progression for next experience level') - while (tonumber(strint)-1) < tonumber(class.Levels) do --- print('Incorrect amount of experience numbers, must be equal to number of levels. Assuming linear progression for next experience level') - class.Experience[strint] = tostring(2*tonumber(class.Experience[tostring(strint-1)])-tonumber(class.Experience[tostring(strint-2)])) - strint = tostring(tonumber(strint)+1) - end - end - elseif test == '[REQUIREMENT_CLASS' then - class.RequiredClass[array[2]] = array[3] - elseif test == '[FORBIDDEN_CLASS' then - class.ForbiddenClass[array[2]] = array[3] - elseif test == '[REQUIREMENT_SKILL' then - class.RequiredSkill[array[2]] = array[3] - elseif test == '[REQUIREMENT_TRAIT' then - class.RequiredTrait[array[2]] = array[3] - elseif test == '[REQUIREMENT_COUNTER' then - class.RequiredCounter[array[2]] = array[3] - elseif test == '[REQUIREMENT_PHYS' then - class.RequiredPhysical[array[2]] = array[3] - elseif test == '[REQUIREMENT_MENT' then - class.RequiredMental[array[2]] = array[3] - elseif test == '[REQUIREMENT_CREATURE' then - class.RequiredCreature[array[2]] = array[3] - elseif test == '[LEVELING_BONUS' then - class.LevelBonus.Physical = class.LevelBonus.Physical or {} - class.LevelBonus.Mental = class.LevelBonus.Mental or {} - class.LevelBonus.Skill = class.LevelBonus.Skill or {} - class.LevelBonus.Trait = class.LevelBonus.Trait or {} - if array[2] == 'PHYSICAL' then - class.LevelBonus.Physical[array[3]] = array[4] - elseif array[2] == 'MENTAL' then - class.LevelBonus.Mental[array[3]] = array[4] - elseif array[2] == 'SKILL' then - class.LevelBonus.Skill[array[3]] = array[4] - elseif array[2] == 'TRAIT' then - class.LevelBonus.Trait[array[3]] = array[4] - end - elseif test == '[BONUS_PHYS' then - local temptable = {select(3,table.unpack(array))} - local strint = '1' - class.BonusPhysical[array[2]] = {} - for _,v in pairs(temptable) do - class.BonusPhysical[array[2]][strint] = v - strint = tostring(strint+1) - end - if tonumber(strint)-1 < tonumber(class.Levels)+1 then --- print('Incorrect amount of physical bonus numbers, must be equal to number of levels + 1. Assuming previous physical bonus') - while tonumber(strint)-1 < tonumber(class.Levels)+1 do - class.BonusPhysical[array[2]][strint] = class.BonusPhysical[array[2]][tostring(strint-1)] - strint = tostring(strint+1) - end - end - elseif test == '[BONUS_TRAIT' then - local temptable = {select(3,table.unpack(array))} - local strint = '1' - class.BonusTrait[array[2]] = {} - for _,v in pairs(temptable) do - class.BonusTrait[array[2]][strint] = v - strint = tostring(strint+1) - end - if tonumber(strint)-1 < tonumber(class.Levels)+1 then --- print('Incorrect amount of trait bonus numbers, must be equal to number of levels + 1. Assuming previous trait bonus') - while tonumber(strint)-1 < tonumber(class.Levels)+1 do - class.BonusTrait[array[2]][strint] = class.BonusTrait[array[2]][tostring(strint-1)] - strint = tostring(strint+1) - end - end - elseif test == '[BONUS_SKILL' then - local temptable = {select(3,table.unpack(array))} - local strint = '1' - class.BonusSkill[array[2]] = {} - for _,v in pairs(temptable) do - class.BonusSkill[array[2]][strint] = v - strint = tostring(strint+1) - end - if tonumber(strint)-1 < tonumber(class.Levels)+1 then --- print('Incorrect amount of skill bonus numbers, must be equal to number of levels + 1. Assuming previous skill bonus') - while tonumber(strint)-1 < tonumber(class.Levels)+1 do - class.BonusSkill[array[2]][strint] = class.BonusSkill[array[2]][tostring(strint-1)] - strint = tostring(strint+1) - end - end - elseif test == '[BONUS_MENT' then - local temptable = {select(3,table.unpack(array))} - local strint = '1' - class.BonusMental[array[2]] = {} - for _,v in pairs(temptable) do - class.BonusMental[array[2]][strint] = v - strint = tostring(strint+1) - end - if tonumber(strint)-1 < tonumber(class.Levels)+1 then --- print('Incorrect amount of mental bonus numbers, must be equal to number of levels + 1. Assuming previous mental bonus') - while tonumber(strint)-1 < tonumber(class.Levels)+1 do - class.BonusMental[array[2]][strint] = class.BonusMental[array[2]][tostring(strint-1)] - strint = tostring(strint+1) - end - end - elseif test == '[SPELL' then - spell = array[2] - class.Spells[spell] = {} - spells = class.Spells[spell] - spells.RequiredLevel = array[3] - spells.Cost = '0' - spells.RequiredPhysical = {} - spells.RequiredMental = {} - spells.ForbiddenSpell = {} - spells.ForbiddenClass = {} - if spells.RequiredLevel == 'AUTO' then - spells.RequiredLevel = '0' - spells.AutoLearn = 'true' - end - elseif test == '[SPELL_REQUIRE_PHYS' then - spells.RequiredPhysical[array[2]] = array[3] - elseif test == '[SPELL_REQUIRE_MENT' then - spells.RequiredMental[array[2]] = array[3] - elseif test == '[SPELL_FORBIDDEN_SPELL' then - spells.ForbiddenSpell[array[2]] = array[2] - elseif test == '[SPELL_FORBIDDEN_CLASS' then - spells.ForbiddenClass[array[2]] = array[3] - elseif test == '[SPELL_UPGRADE' then - spells.Upgrade = array[2] - elseif test == '[SPELL_COST' then - spells.Cost = array[2] - elseif test == '[SPELL_EXP_GAIN' then - spells.ExperienceGain = array[2] - elseif test == '[SPELL_AUTO_LEARN]' then - spells.AutoLearn = 'true' - end - end - end - end - return true -end - -function makeEntityTable(entity) - - if tonumber(entity) then - civid = tonumber(entity) - else - civid = entity.id - end - key = tostring(civid) - entity = civid>-1 and df.historical_entity.find(civid) or entity - if type(entity)~='userdata' then return end - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local key = tostring(entity.id) - local entity = entity.entity_raw.code - local civilizations = roses.CivilizationTable - local entityTable = roses.EntityTable - if entityTable[key] then - return - else - entityTable[key] = {} - entityTable = entityTable[key] - entityTable.Kills = {} - entityTable.Deaths = {} - entityTable.Trades = '0' - entityTable.Sieges = '0' - if civilizations then - if civilizations[entity] then - entityTable.Civilization = {} - entityTable.Civilization.Name = entity - entityTable.Civilization.Level = '0' - entityTable.Civilization.CurrentMethod = civilizations[entity].LevelMethod - entityTable.Civilization.CurrentPercent = civilizations[entity].LevelPercent - if civilizations[entity].Level then - if civilizations[entity].Level['0'] then - for _,mtype in pairs(civilizations[entity].Level['0'].Remove) do - local depth1 = civilizations[entity].Level['0'].Remove[mtype] - for _,stype in pairs(depth1) do - local depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - local sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,-1,true) - end - end - end - for _,mtype in pairs(civilizations[entity].Level['0'].Add) do - local depth1 = civilizations[entity].Level['0'].Add[mtype] - for _,stype in pairs(depth1) do - local depth2 = depth1[stype] - for _,mobj in pairs(depth2) do - local sobj = depth2[mobj] - dfhack.script_environment('functions/entity').changeResources(key,mtype,stype,mobj,sobj,1,true) - end - end - end - end - end - end - end - end -end - -function makeEventTable() - local utils = require 'utils' - local split = utils.split_string - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.EventTable = {} - - print('Searching for event files') - local files = {} - local dir = dfhack.getDFPath() - local n = 1 - local location = dir.."/raw/objects/" - for _,fname in pairs(dfhack.internal.getDir(location)) do - if (split(fname,'_')[1] == 'events' or fname == 'events.txt') then - files[n] = location..fname - n = n + 1 - end - end - - if #files >= 1 then - print('Event files found:') - printall(files) - else - print('No Event files found') - return false - end - - events = roses.EventTable - for _,file in ipairs(files) do - - local data = {} - local iofile = io.open(file,"r") - local lineCount = 1 - while true do - local line = iofile:read("*line") - if line == nil then break end - data[lineCount] = line - lineCount = lineCount + 1 - end - iofile:close() - - local dataInfo = {} - local count = 1 - for i,line in ipairs(data) do - if split(line,':')[1] == '[EVENT' then - dataInfo[count] = {split(split(line,':')[2],']')[1],i,0} - count = count + 1 - end - end - - for i,x in ipairs(dataInfo) do - eventToken = x[1] - startLine = x[2]+1 - if i ==#dataInfo then - endLine = #data - else - endLine = dataInfo[i+1][2]-1 - end - events[eventToken] = {} - event = events[eventToken] - event.Effect = {} - event.Required = {} - event.Delay = {} - numberOfEffects = 0 - for j = startLine,endLine,1 do - test = data[j]:gsub("%s+","") - test = split(test,':')[1] - array = split(data[j],':') - for k = 1, #array, 1 do - array[k] = split(array[k],']')[1] - end - if test == '[NAME' then - event.Name = array[2] - elseif test == '[CHECK' then - event.Check = array[2] - elseif test == '[CHANCE' then - event.Chance = array[2] - elseif test == '[DELAY' then - event.Delay[array[2]] = array[3] - elseif test == '[REQUIREMENT' then - if array[2] == 'COUNTER' then - event.Required.Counter = event.Required.Counter or {} - event.Required.Counter[array[3]] = array[4] - elseif array[2] == 'TIME' then - event.Required.Time = array[3] - elseif array[2] == 'POPULATION' then - event.Required.Population = array[3] - elseif array[2] == 'WEALTH' then - event.Required.Wealth = event.Required.Wealth or {} - event.Required.Wealth[array[3]] = array[4] - elseif array[2] == 'BUILDING' then - event.Required.Building = event.Required.Building or {} - event.Required.Building[array[3]] = array[4] - elseif array[2] == 'SKILL' then - event.Required.Skill = event.Required.Skill or {} - event.Required.Skill[array[3]] = array[4] - elseif array[2] == 'CLASS' then - event.Required.Class = event.Required.Class or {} - event.Required.Class[array[3]] = array[4] - elseif array[2] == 'KILLS' then - event.Required.Kills = event.Required.Kills or {} - event.Required.Kills[array[3]] = array[4] - elseif array[2] == 'DEATHS' then - event.Required.Deaths = event.Required.Deaths or {} - event.Required.Deaths[array[3]] = array[4] - elseif array[2] == 'TRADES' then - event.Required.Trades = event.Required.Trades or {} - event.Required.Trades[array[3]] = array[4] - elseif array[2] == 'SIEGES' then - event.Required.Sieges = event.Required.Sieges or {} - event.Required.Sieges[array[3]] = array[4] - end - elseif test == '[EFFECT' then - number = array[2] - numberOfEffects = numberOfEffects + 1 - event.Effect[number] = {} - effect = event.Effect[number] - effect.Arguments = '0' - effect.Argument = {} - effect.Required = {} - effect.Script = {} - effect.Delay = {} - effect.Scripts = '0' - elseif test == '[EFFECT_NAME' then - effect.Name = array[2] - elseif test == '[EFFECT_CHANCE' then - effect.Chance = array[2] - elseif test == '[EFFECT_CONTINGENT_ON' then - effect.Contingent = array[2] - elseif test == '[EFFECT_DELAY' then - effect.Delay[array[2]] = array[3] - elseif test == '[EFFECT_REQUIREMENT' then - if array[2] == 'COUNTER' then - effect.Required.Counter = effect.Required.Counter or {} - effect.Required.Counter[array[3]] = array[4] - elseif array[2] == 'TIME' then - effect.Required.Time = array[3] - elseif array[2] == 'POPULATION' then - effect.Required.Population = array[3] - elseif array[2] == 'WEALTH' then - effect.Required.Wealth = effect.Required.Wealth or {} - effect.Required.Wealth[array[3]] = array[4] - elseif array[2] == 'BUILDING' then - effect.Required.Building = effect.Required.Building or {} - effect.Required.Building[array[3]] = array[4] - elseif array[2] == 'SKILL' then - effect.Required.Skill = effect.Required.Skill or {} - effect.Required.Skill[array[3]] = array[4] - elseif array[2] == 'CLASS' then - effect.Required.Class = effect.Required.Class or {} - effect.Required.Class[array[3]] = array[4] - elseif array[2] == 'KILLS' then - effect.Required.Kills = effect.Required.Kills or {} - effect.Required.Kills[array[3]] = array[4] - elseif array[2] == 'DEATHS' then - effect.Required.Deaths = effect.Required.Deaths or {} - effect.Required.Deaths[array[3]] = array[4] - elseif array[2] == 'TRADES' then - effect.Required.Trades = effect.Required.Trades or {} - effect.Required.Trades[array[3]] = array[4] - elseif array[2] == 'SIEGES' then - effect.Required.Sieges = effect.Required.Sieges or {} - effect.Required.Sieges[array[3]] = array[4] - end - elseif test == '[EFFECT_UNIT' then - effect.Unit = {} - local temptable = {select(2,table.unpack(array))} - strint = '1' - for _,v in pairs(temptable) do - effect.Unit[strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_LOCATION' then - effect.Location = {} - local temptable = {select(2,table.unpack(array))} - strint = '1' - for _,v in pairs(temptable) do - effect.Location[strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_BUILDING' then - effect.Building = {} - local temptable = {select(2,table.unpack(array))} - strint = '1' - for _,v in pairs(temptable) do - effect.Building[strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_ITEM' then - effect.Item = {} - local temptable = {select(2,table.unpack(array))} - strint = '1' - for _,v in pairs(temptable) do - effect.Item[strint] = v - strint = tostring(strint+1) - end - elseif test == '[EFFECT_ARGUMENT' then - argnumber = array[2] - effect.Arguments = tostring(effect.Arguments + 1) - effect.Argument[argnumber] = {} - argument = effect.Argument[argnumber] - elseif test == '[ARGUMENT_WEIGHTING' then - argument.Weighting = array[2] - elseif test == '[ARGUMENT_EQUATION' then - argument.Equation = array[2] - elseif test == '[ARGUMENT_VARIABLE' then - argument.Variable = array[2] - elseif test == '[EFFECT_SCRIPT' then - effect.Scripts = tostring(effect.Scripts + 1) - effect.Script[effect.Scripts] = array[2] - end - end - event.Effects = tostring(numberOfEffects) - end - end -end - -function makeGlobalTable() - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.GlobalTable = {} - roses.GlobalTable.Kills = {} - roses.GlobalTable.Deaths = {} - roses.GlobalTable.Trades = {} - roses.GlobalTable.Sieges = {} -end - -function makeItemTable(item) - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - itemID = item.id - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.ItemTable[tostring(itemID)] = {} - itemTable = roses.ItemTable[tostring(itemID)] - - itemTable.Material = {} - itemTable.Material.Base = dfhack.matinfo.getToken(item.mat_type,item.mat_index) - itemTable.Material.Current = dfhack.matinfo.getToken(item.mat_type,item.mat_index) - itemTable.Material.StatusEffects = {} - - itemTable.Quality = {} - itemTable.Quality.Base = item.quality - itemTable.Quality.Current = item.quality - itemTable.Quality.StatusEffects = {} - - itemTable.Subtype = {} - itemTable.Subtype.Base = dfhack.items.getSubtypeDef(item:getType(),item:getSubtype()).id - itemTable.Subtype.Current = dfhack.items.getSubtypeDef(item:getType(),item:getSubtype()).id - itemTable.Subtype.StatusEffects = {} - - itemTable.Stats = {} - itemTable.Stats.Kills = '0' -end - -function makeUnitTable(unit) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - unitID = unit.id - - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - roses.UnitTable[tostring(unitID)] = {} - unitTable = roses.UnitTable[tostring(unitID)] - - unitTable.Attributes = {} - for i = 0,5,1 do - attribute = df.physical_attribute_type[i] - unitTable.Attributes[attribute] = {} - unitTable.Attributes[attribute].Base = tostring(unit.body.physical_attrs[attribute].value) - unitTable.Attributes[attribute].Change = tostring(0) - unitTable.Attributes[attribute].Class = tostring(0) - unitTable.Attributes[attribute].Item = tostring(0) - unitTable.Attributes[attribute].StatusEffects = {} - end - for i = 0,12,1 do - attribute = df.mental_attribute_type[i] - unitTable.Attributes[attribute] = {} - unitTable.Attributes[attribute].Base = tostring(unit.status.current_soul.mental_attrs[attribute].value) - unitTable.Attributes[attribute].Change = tostring(0) - unitTable.Attributes[attribute].Class = tostring(0) - unitTable.Attributes[attribute].Item = tostring(0) - unitTable.Attributes[attribute].StatusEffects = {} - end - - unitTable.Skills = {} - for i = 0,134,1 do - skill = df.job_skill[i] - unitTable.Skills[skill] = {} - unitTable.Skills[skill].Base = tostring(0) - unitTable.Skills[skill].Change = tostring(0) - unitTable.Skills[skill].Class = tostring(0) - unitTable.Skills[skill].Item = tostring(0) - unitTable.Skills[skill].StatusEffects = {} - end - for _,x in ipairs(unit.status.current_soul.skills) do - unitTable.Skills[df.job_skill[x.id]].Base = tostring(x.rating) - unitTable.Skills[df.job_skill[x.id]].Current = tostring(x.rating) - end - - unitTable.Traits = {} - for trait,x in pairs(unit.status.current_soul.personality.traits) do - unitTable.Traits[trait] = {} - unitTable.Traits[trait].Base = tostring(x) - unitTable.Traits[trait].Change = tostring(0) - unitTable.Traits[trait].Class = tostring(0) - unitTable.Traits[trait].Item = tostring(0) - unitTable.Traits[trait].StatusEffects = {} - end - ---[[ unitTable.Resistances = {} - - physicalResistances = {'All','Blunt','Pierce','Slash'} - unitTable.Resistances.Physical = {} - for _,resistance in pairs(physicalResistances) do - unitTable.Resistances.Physical[resistance] = {} - unitTable.Resistances.Physical[resistance].Base = tostring(0) - unitTable.Resistances.Physical[resistance].Change = tostring(0) - unitTable.Resistances.Physical[resistance].Class = tostring(0) - unitTable.Resistances.Physical[resistance].Item = tostring(0) - unitTable.Resistances.Physical[resistance].StatusEffects = {} - end - - magicalResistances = { - Elemental = {'All','Fire','Water','Air','Earth','Smoke','Ice','Storm','Metal'}, - Arcane = {'All','Time','Space','Force','Aegis'}, - Mental = {'All','Illusion','Thought','Mind','Emotion'}, - Nature = {'All','Animal','Plant','Ground','Spirit'}, - Divine = {'All','Light','Dark','Void','Shadow'} - } - unitTable.Resistances.Magical = {} - for resistance,subresist in pairs(magicalResistances) do - unitTable.Resistances.Magical[resistance] = {} - for _,subresistance in pairs(subresist) do - unitTable.Resistances.Magical[resistance][subresistance] = {} - unitTable.Resistances.Magical[resistance][subresistance].Base = tostring(0) - unitTable.Resistances.Magical[resistance][subresistance].Change = tostring(0) - unitTable.Resistances.Magical[resistance][subresistance].Class = tostring(0) - unitTable.Resistances.Magical[resistance][subresistance].Item = tostring(0) - unitTable.Resistances.Magical[resistance][subresistance].StatusEffects = {} - end - end]] - - unitTable.Stats = {} - unitTable.Stats.Kills = '0' - unitTable.Stats.Deaths = '0' - - if roses.ClassTable then - unitTable.Classes = {} - unitTable.Classes.Current = {} - unitTable.Classes.Current.Name = 'NONE' - unitTable.Classes.Current.TotalExp = tostring(0) - unitTable.Classes.Current.SkillExp = tostring(0) - for i,x in pairs(roses.ClassTable) do - unitTable.Classes[i] = {} - unitTable.Classes[i].Level = tostring(0) - unitTable.Classes[i].Experience = tostring(0) - end - end - - if roses.SpellTable then - unitTable.Spells = {} - unitTable.Spells.Active = {} - for i,x in pairs(roses.SpellTable) do - unitTable.Spells[i] = tostring(0) - end - end - -end diff --git a/raw/scripts/functions/unit.lua b/raw/scripts/functions/unit.lua deleted file mode 100644 index a641e23..0000000 --- a/raw/scripts/functions/unit.lua +++ /dev/null @@ -1,1103 +0,0 @@ -function trackAttribute(unitID,attribute,current,change,value,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - if not roses then - return "base/roses-init not loaded" - end - - if not tonumber(unitID) then - unitID = unitID.id - end - - local unitTable = roses.UnitTable - if not unitTable[tostring(unitID)] then - dfhack.script_environment('functions/tables').makeUnitTable(unitID) - end - - local attributeTable = unitTable[tostring(unitID)].Attributes[attribute] - if alter == 'track' then - if dur > 0 then - attributeTable.Change = tostring(attributeTable.Change + change) - local statusTable = attributeTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = tostring(change) - else - attributeTable.Base = tostring(value) - end - elseif alter == 'end' then - attributeTable.Change = tostring(attributeTable.Change - change) - local statusTable = attributeTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - elseif alter == 'class' then - attributeTable.Class = tostring(change + attributeTable.Class) - elseif alter == 'item' then - attributeTable.Item = tostring(change + attributeTable.Item) - elseif alter == 'get' then - local unit = df.unit.find(unitID) - local base = tonumber(attributeTable.Base) - local change = tonumber(attributeTable.Change) - local class = tonumber(attributeTable.Class) - local item = tonumber(attributeTable.Item) - local total = 0 - local syndrome = 0 - if df.physical_attribute_type[attribute] then - if unit.curse.attr_change then - total = (unit.body.physical_attrs[attribute].value+unit.curse.attr_change.phys_att_add[attribute])*unit.curse.attr_change.phys_att_perc[attribute]/100 - syndrome = total - unit.body.physical_attrs[attribute].value - else - total = unit.body.physical_attrs[attribute].value - end - elseif df.mental_attribute_type[attribute] then - if unit.curse.attr_change then - total = (unit.status.current_soul.mental_attrs[attribute].value+unit.curse.attr_change.ment_att_add[attribute])*unit.curse.attr_change.ment_att_perc[attribute]/100 - syndrome = total - unit.status.current_soul.mental_attrs[attribute].value - else - total = unit.status.current_soul.mental_attrs[attribute].value - end - end - return total,base,change,class,item,syndrome - end -end - -function trackSkill(unitID,skill,current,change,value,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - if not roses then - return - end - - if not tonumber(unitID) then - unitID = unitID.id - end - - local unitTable = roses.UnitTable - if not unitTable[tostring(unitID)] then - dfhack.script_environment('functions/tables').makeUnitTable(unitID) - end - - local skillTable = unitTable[tostring(unitID)].Skills[skill] - if alter == 'track' then - if dur > 0 then - skillTable.Change = tostring(skillTable.Change + change) - local statusTable = skillTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = change - else - skillTable.Base = tostring(value) - end - elseif alter == 'end' then - skillTable.Change = tostring(skillTable.Change - change) - local statusTable = skillTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - elseif alter == 'class' then - skillTable.Class = tostring(change + skillTable.Class) - elseif alter == 'item' then - skillTable.Item = tostring(change + skillTable.Item) - elseif alter == 'get' then - local unit = df.unit.find(unitID) - local base = tonumber(skillTable.Base) - local change = tonumber(skillTable.Change) - local class = tonumber(skillTable.Class) - local item = tonumber(skillTable.Item) - local total = dfhack.units.getNominalSkill(unit,df.job_skill[skill]) - local syndrome = 0 - return total,base,change,class,item,syndrome - end -end - -function trackResistance(unitID,resistance,current,change,value,dur,alter) - local utils = require 'utils' - local split = utils.split_string - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - if not roses then - return - end - - if not tonumber(unitID) then - unitID = unitID.id - end - - local unitTable = roses.UnitTable - if not unitTable[tostring(unitID)] then - dfhack.script_environment('functions/tables').makeUnitTable(unitID) - end - unitTable = roses.UnitTable[tostring(unitID)] - - resistance = resistance:gsub('%.',':') - array = split(resistance,':') - resistanceTable = unitTable - for i,entry in pairs(array) do - array[i] = string.lower(entry):gsub("^%l",string.upper) - if array[i] == 'Resistance' then array[i] = "Resistances" end - if array[#array] ~= 'All' and tonumber(i) == #array then - allTable = resistanceTable.All - end - if resistanceTable[array[i]] then resistanceTable = resistanceTable[array[i]] end - end - - if alter == 'track' then - if dur > 0 then - resistanceTable.Change = tostring(resistanceTable.Change + change) - local statusTable = resistanceTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = change - else - resistanceTable.Base = tostring(value) - end - elseif alter == 'end' then - resistanceTable.Change = tostring(resistanceTable.Change - change) - local statusTable = resistanceTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - elseif alter == 'class' then - resistanceTable.Class = tostring(change + resistanceTable.Class) - elseif alter == 'item' then - resistanceTable.Item = tostring(change + resistanceTable.Item) - elseif alter == 'get' then - if allTable then - base = tonumber(resistanceTable.Base)+allTable.Base - change = tonumber(resistanceTable.Change)+allTable.Change - class = tonumber(resistanceTable.Class)+allTable.Class - item = tonumber(resistanceTable.Item)+allTable.Item - total = base+change+class+item - syndrome = 0 - else - base = tonumber(resistanceTable.Base) - change = tonumber(resistanceTable.Change) - class = tonumber(resistanceTable.Class) - item = tonumber(resistanceTable.Item) - total = base+change+class+item - syndrome = 0 - end - return total,base,change,class,item,syndrome - end -end - -function trackTrait(unitID,trait,current,change,value,dur,alter) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - if not roses then - return - end - - if not tonumber(unitID) then - unitID = unitID.id - end - - local unitTable = roses.UnitTable - if not unitTable[tostring(unitID)] then - dfhack.script_environment('functions/tables').makeUnitTable(unitID) - end - - local traitTable = unitTable[tostring(unitID)].Traits[trait] - if alter == 'track' then - if dur > 0 then - traitTable.Change = tostring(traitTable.Change + change) - local statusTable = traitTable.StatusEffects - local number = #statusTable - statusTable[tostring(number+1)] = {} - statusTable[tostring(number+1)].End = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick + dur - statusTable[tostring(number+1)].Change = change - else - traitTable.Base = tostring(value) - end - elseif alter == 'end' then - traitTable.Change = tostring(skillTable.Change - change) - local statusTable = traitTable.StatusEffects - for i = #statusTable,1,-1 do - if statusTable[i] then - if statusTable[i].End <= 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick then - statusTable[i] = nil - end - end - end - elseif alter == 'class' then - traitTable.Class = tostring(change + traitTable.Class) - elseif alter == 'item' then - traitTable.Item = tostring(change + traitTable.Item) - elseif alter == 'get' then - local unit = df.unit.find(unitID) - local base = tonumber(traitTable.Base) - local change = tonumber(traitTable.Change) - local class = tonumber(traitTable.Class) - local item = tonumber(traitTable.Item) - local total = unit.status.current_soul.personality.traits[trait] - local syndrome = 0 - return total,base,change,class,item,syndrome - end -end - -function getCounter(unitID,counter) - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - if (counter == 'webbed' or counter == 'stunned' or counter == 'winded' or counter == 'unconscious' - or counter == 'pain' or counter == 'nausea' or counter == 'dizziness') then - location = unit.counters - elseif (counter == 'paralysis' or counter == 'numbness' or counter == 'fever' or counter == 'exhaustion' - or counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness' or oounter == 'hunger_timer' - or counter == 'thirst_timer' or counter == 'sleepiness_timer') then - if (counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness') then counter = counter .. '_timer' end - location = unit.counters2 - elseif counter == 'blood' or counter == 'infection' then - location = unit.body - else - return 0 - end - - return location[counter] -end - -function changeAttribute(unit,attribute,change,dur,track) - -- Add/Subtract given amount from declared attribute of a unit. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local int16 = 30000000 - local current = 0 - local value = 0 - - if df.physical_attribute_type[attribute] then - current = unit.body.physical_attrs[attribute].value - value = math.floor(current + change) - if value > int16 then - change = int16 - current - value = int16 - end - if value < 0 then - change = current - value = 0 - end - unit.body.physical_attrs[attribute].value = value - current = unit.body.physical_attrs[attribute].value - elseif df.mental_attribute_type[attribute] then - current = unit.status.current_soul.mental_attrs[attribute].value - value = math.floor(current+change) - if value > int16 then - change = int16 - current - value = int16 - end - if value < 0 then - change = current - value = 0 - end - unit.status.current_soul.mental_attrs[attribute].value = value - current = unit.status.current_soul.mental_attrs[attribute].value - else - print('Invalid attribute id') - return - end - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeAttribute',{unit.id,attribute,-change,0,'end'}) - end - - if track then - trackAttribute(unit.id,attribute,current,change,value,dur,track) - end -end - -function changeBody(unit,part,changeType,strength,dur) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - if changeType == "temperature" then - if strength == 'fire' then - unit.body.components.body_part_status[part].on_fire = not unit.body.components.body_part_status[part].on_fire - unit.flags3.body_temp_in_range = not unit.flags3.body_temp_in_range - change = 'fire' - else - change = tostring(-strength) - unit.status2.body_part_temperature[part].whole=unit.status2.body_part_temperature[part].whole+strength - end - end - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeBody',{unit.id,part,changeType,change}) - end -end - -function changeCounter(unit,counter,change,dur) - -- Add/Subtract given amount from declared counter of a unit. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local value = 0 - local int16 = 3000000 - local current = 0 - - if (counter == 'webbed' or counter == 'stunned' or counter == 'winded' or counter == 'unconscious' - or counter == 'pain' or counter == 'nausea' or counter == 'dizziness') then - location = unit.counters - elseif (counter == 'paralysis' or counter == 'numbness' or counter == 'fever' or counter == 'exhaustion' - or counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness' or oounter == 'hunger_timer' - or counter == 'thirst_timer' or counter == 'sleepiness_timer') then - if (counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness') then counter = counter .. '_timer' end - location = unit.counters2 - elseif counter == 'blood' or counter == 'infection' then - location = unit.body - else - print('Invalid counter token declared') - return - end - current = location[counter] - - value = math.floor(current + change) - if value > int16 then - change = int16 - current - value = int16 - end - if value < 0 then - change = current - value = 0 - end - location[counter] = value - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeCounter',{unit.id,counter,-change}) - end -end - -function changeFlag(unit,flag,clear) -- from modtools/create-unit - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - for _,k in ipairs(df.unit_flags1) do - if flag == k then - if clear then - unit.flags1[k] = false - else - unit.flags1[k] = true - end - end - end - for _,k in ipairs(df.unit_flags2) do - if flag == k then - if clear then - unit.flags2[k] = false - else - unit.flags2[k] = true - end - end - end - for _,k in ipairs(df.unit_flags3) do - if flag == k then - if clear then - unit.flags3[k] = false - else - unit.flags3[k] = true - end - end - end - -end - -function changeSkill(unit,skill,change,dur,track) - -- Add/Subtract given amount from declared skill of a unit. - local utils=require('utils') - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local skills = unit.status.current_soul.skills - local skillid = df.job_skill[skill] - local value = 0 - local found = false - local current = 0 - - for i,x in ipairs(skills) do - if x.id == skillid then - found = true - token = x - current = token.rating - break - end - end - if not found then - utils.insert_or_update(unit.status.current_soul.skills,{new = true, id = skillid, rating = 0},'id') - skills = unit.status.current_soul.skills - for i,x in ipairs(skills) do - if x.id == skillid then - found = true - token = x - current = token.rating - break - end - end - end - - value = math.floor(current+change) - if value > 20 then - change = 20 - current - value = 20 - end - if value < 0 then - change = current - value = 0 - end - token.rating = value - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeSkill',{unit.id,skill,-change,0,'end'}) - end - - if track then - trackSkill(unit.id,skill,current,change,value,dur,track) - end -end - -function changeResistance(unit,resistance,change,dur,track) - -- Add/Subtract given amount from declared attribute of a unit. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - --- For if Toady ever implements actual in game resistances - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeAttribute',{unit.id,attribute,-change,0,'end'}) - end - - if track then - trackAttribute(unit.id,attribute,current,change,value,dur,track) - end -end - -function changeTrait(unit,trait,change,dur,track) - -- Add/Subtract given amount from declared trait of a unit. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local value = 0 - local current = 0 - - current = unit.status.current_soul.personality.traits[trait] - - value = math.floor(current + change) - if value > 100 then - change = 100 - current - value = 100 - end - if value < 0 then - change = current - value = 0 - end - unit.status.current_soul.personality.traits[trait] = value - - if dur > 0 then - dfhack.script_environment('persist-delay').environmentDelay(dur,'functions/unit','changeTrait',{unit.id,trait,-change,0,'end'}) - end - - if track then - trackTrait(unit.id,trait,current,change,value,dur,track) - end -end - -function checkBodyCategory(unit,category) - -- Check a unit for body parts that match a given category(s). Returns a list of body part numbers. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(category) == 'string' then category = {category} end - - local parts = {} - local body = unit.body.body_plan.body_parts - local a = 1 - for j,y in ipairs(body) do - for _,x in ipairs(category) do - if y.category == x and not unit.body.components.body_part_status[j].missing then - parts[a] = j - a = a + 1 - end - end - end - return parts -end - -function checkBodyToken(unit,token) - -- Check a unit for body parts that match a given token(s). Returns a list of body part numbers. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(token) == 'string' then token = {token} end - - local parts = {} - local body = unit.body.body_plan.body_parts - local a = 1 - for j,y in ipairs(body) do - for _,x in ipairs(token) do - if y.token == x and not unit.body.components.body_part_status[j].missing then - parts[a] = j - a = a + 1 - end - end - end - return parts -end - -function checkBodyFlag(unit,flag) - -- Check a unit for body parts that match a given flag(s). Returns a list of body part numbers. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(flag) == 'string' then flag = {flag} end - - local parts = {} - local body = unit.body.body_plan.body_parts - local a = 1 - for j,y in ipairs(body) do - for _,x in ipairs(flag) do - if y.flags[x] and not unit.body.components.body_part_status[j].missing then - parts[a] = j - a = a + 1 - end - end - end - return parts -end - -function checkClass(unit,class) - check, x = checkCreatureClass(unit,class) - if check then return true,x end - check, x = checkCreatureSyndrome(unit,class) - if check then return true,x end - return false,'' -end - -function checkCreatureClass(unit,class) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(class) ~= 'table' then class = {class} end - - local unitraws = df.creature_raw.find(unit.race) - local casteraws = unitraws.caste[unit.caste] - local unitracename = unitraws.creature_id - local castename = casteraws.caste_id - local unitclasses = casteraws.creature_class - for _,unitclass in ipairs(unitclasses) do - for _,x in ipairs(class) do - if x == unitclass.value then - return true, x - end - end - end - return false, '' -end - -function checkCreatureRace(unit,creature) - local utils = require 'utils' - local split = utils.split_string - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(creature) ~= 'table' then creature = {creature} end - - local unitraws = df.creature_raw.find(unit.race) - local casteraws = unitraws.caste[unit.caste] - local unitracename = unitraws.creature_id - local castename = casteraws.caste_id - for _,x in ipairs(creature) do - local xsplit = split(x,':') - if xsplit[1] == unitracename and (xsplit[2] == castename or xsplit[2] == 'ANY') then - return true - end - end - return false -end - -function checkCreatureSyndrome(unit,class) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(class) ~= 'table' then class = {class} end - - local actives = unit.syndromes.active - for _,x in ipairs(actives) do - local synclass=syndromes[x.type].syn_class - for _,y in ipairs(synclass) do - for _,z in ipairs(class) do - if z == y.value then - return true, z - end - end - end - end - return false, '' -end - -function checkCreatureToken(unit,token) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(token) ~= 'table' then token = {token} end - - local unitraws = df.creature_raw.find(unit.race) - local casteraws = unitraws.caste[unit.caste] - local flags1 = unitraws.flags - local flags2 = casteraws.flags - local tokens = {} - for k,v in pairs(flags1) do - tokens[k] = v - end - for k,v in pairs(flags2) do - tokens[k] = v - end - - for _,x in ipairs(token) do - if tokens[x] then - return true - end - end - return false -end - -function checkDistance(unit,location,distance) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if tonumber(distance) then - distance = {distance, distance, distance} - end - - local mapx, mapy, mapz = dfhack.maps.getTileSize() - local x = location[1] - local y = location[2] - local z = location[3] - local rx = distance[1] - local ry = distance[2] - local rz = distance[3] - - local xmin = x - rx - local xmax = x + rx - local ymin = y - ry - local ymax = y + ry - local zmin = z - rz - local zmax = z + rz - if xmin < 1 then xmin = 1 end - if ymin < 1 then ymin = 1 end - if zmin < 1 then zmin = 1 end - if xmax > mapx then xmax = mapx-1 end - if ymax > mapy then ymax = mapy-1 end - if zmax > mapz then zmax = mapz-1 end - if (unit.pos.x >= xmin and unit.pos.x <= xmax and unit.pos.y >= ymin and unit.pos.y <= ymax and unit.pos.z >= zmin and unit.pos.z <= zmax) then - return true - end - return false -end - -function checkInventoryType(unit,item_type) - -- Check a unit for any inventory items of a given type(s). Returns a list of item id numbers. - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - if type(item_type) == 'string' then item_type = {item_type} end - - local items = {} - local inventory = unit.inventory - local a = 1 - for _,x in ipairs(inventory) do - for _,y in ipairs(item_type) do - if df.item_type[x.item:getType()] == y then - items[a] = x.item.id - a = a + 1 - end - end - end - return items -end - -function create(race,caste,options) --from modtools/create-unit - - local function allocateNewChunk(hist_entity) - hist_entity.save_file_id=df.global.unit_chunk_next_id - df.global.unit_chunk_next_id=df.global.unit_chunk_next_id+1 - hist_entity.next_member_idx=0 - print("allocating chunk:",hist_entity.save_file_id) - end - - local function allocateIds(nemesis_record,hist_entity) - if hist_entity.next_member_idx==100 then - allocateNewChunk(hist_entity) - end - nemesis_record.save_file_id=hist_entity.save_file_id - nemesis_record.member_idx=hist_entity.next_member_idx - hist_entity.next_member_idx=hist_entity.next_member_idx+1 - end - - local function createFigure(trgunit,he,he_group) - local hf=df.historical_figure:new() - hf.id=df.global.hist_figure_next_id - hf.race=trgunit.race - hf.caste=trgunit.caste - hf.profession = trgunit.profession - hf.sex = trgunit.sex - df.global.hist_figure_next_id=df.global.hist_figure_next_id+1 - hf.appeared_year = df.global.cur_year - - hf.born_year = trgunit.birth_year - hf.born_seconds = trgunit.birth_time - hf.curse_year = trgunit.curse_year - hf.curse_seconds = trgunit.curse_time - hf.birth_year_bias = trgunit.birth_year_bias - hf.birth_time_bias = trgunit.birth_time_bias - hf.old_year = trgunit.old_year - hf.old_seconds = trgunit.old_time - hf.died_year = -1 - hf.died_seconds = -1 - hf.name:assign(trgunit.name) - hf.civ_id = trgunit.civ_id - hf.population_id = trgunit.population_id - hf.breed_id = -1 - hf.unit_id = trgunit.id - - df.global.world.history.figures:insert("#",hf) - - hf.info = df.historical_figure_info:new() - hf.info.unk_14 = df.historical_figure_info.T_unk_14:new() -- hf state? - --unk_14.region_id = -1; unk_14.beast_id = -1; unk_14.unk_14 = 0 - hf.info.unk_14.unk_18 = -1; hf.info.unk_14.unk_1c = -1 - -- set values that seem related to state and do event - --change_state(hf, dfg.ui.site_id, region_pos) - - - --lets skip skills for now - --local skills = df.historical_figure_info.T_skills:new() -- skills snap shot - -- ... - hf.info.skills = {new=true} - - - he.histfig_ids:insert('#', hf.id) - he.hist_figures:insert('#', hf) - if he_group then - he_group.histfig_ids:insert('#', hf.id) - he_group.hist_figures:insert('#', hf) - hf.entity_links:insert("#",{new=df.histfig_entity_link_memberst,entity_id=he_group.id,link_strength=100}) - end - trgunit.flags1.important_historical_figure = true - trgunit.flags2.important_historical_figure = true - trgunit.hist_figure_id = hf.id - trgunit.hist_figure_id2 = hf.id - - hf.entity_links:insert("#",{new=df.histfig_entity_link_memberst,entity_id=trgunit.civ_id,link_strength=100}) - - --add entity event - local hf_event_id=df.global.hist_event_next_id - df.global.hist_event_next_id=df.global.hist_event_next_id+1 - df.global.world.history.events:insert("#",{new=df.history_event_add_hf_entity_linkst,year=trgunit.birth_year, - seconds=trgunit.birth_time,id=hf_event_id,civ=hf.civ_id,histfig=hf.id,link_type=0}) - return hf - end - - if options then - dur = options.dur or 0 - civ_id = options.civ_id or -1 - group_id = options.group_id or -1 - end - - local curViewscreen = dfhack.gui.getCurViewscreen() - local dwarfmodeScreen = df.viewscreen_dwarfmodest:new() - curViewscreen.child = dwarfmodeScreen - dwarfmodeScreen.parent = curViewscreen - local oldMode = df.global.ui.main.mode - df.global.ui.main.mode = df.ui_sidebar_mode.LookAround - - local gui = require 'gui' - - df.global.world.arena_spawn.race:resize(0) - df.global.world.arena_spawn.race:insert(0,race) --df.global.ui.race_id) - - df.global.world.arena_spawn.caste:resize(0) - df.global.world.arena_spawn.caste:insert(0,caste) - - df.global.world.arena_spawn.creature_cnt:resize(0) - df.global.world.arena_spawn.creature_cnt:insert(0,0) - - df.global.gametype = 4 - - gui.simulateInput(dfhack.gui.getCurViewscreen(), 'D_LOOK_ARENA_CREATURE') - gui.simulateInput(dfhack.gui.getCurViewscreen(), 'SELECT') - - df.global.gametype = 0 - - curViewscreen.child = nil - dwarfmodeScreen:delete() - df.global.ui.main.mode = oldMode - - local unitId = df.global.unit_next_id-1 - - if civ_id >= 0 then - trgunit = df.unit.find(unitId) - local id=df.global.nemesis_next_id - local nem=df.nemesis_record:new() - - nem.id=id - nem.unit_id=trgunit.id - nem.unit=trgunit - nem.flags:resize(4) - --not sure about these flags... - -- [[ - nem.flags[4]=true - nem.flags[5]=true - nem.flags[6]=true - nem.flags[7]=true - nem.flags[8]=true - nem.flags[9]=true - --]] - --[[for k=4,8 do - nem.flags[k]=true - end]] - nem.unk10=-1 - nem.unk11=-1 - nem.unk12=-1 - df.global.world.nemesis.all:insert("#",nem) - df.global.nemesis_next_id=id+1 - trgunit.general_refs:insert("#",{new=df.general_ref_is_nemesisst,nemesis_id=id}) - trgunit.flags1.important_historical_figure=true - - nem.save_file_id=-1 - - local he=df.historical_entity.find(civ_id) - he.nemesis_ids:insert("#",id) - he.nemesis:insert("#",nem) - local he_group - if group_id and group_id~=-1 then - he_group=df.historical_entity.find(group_id) - end - if he_group then - he_group.nemesis_ids:insert("#",id) - he_group.nemesis:insert("#",nem) - end - allocateIds(nem,he) - nem.figure=createFigure(trgunit,he,he_group) - end - return unitId -end - -function domesticate(unit,group_id) --from modtools/create-unit - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - group_id = group_id or df.global.ui.group_id - -- If a friendly animal, make it domesticated. From Boltgun & Dirst - local caste=df.creature_raw.find(unit.race).caste[unit.caste] - if not(caste.flags.CAN_SPEAK and caste.flags.CAN_LEARN) then - -- Fix friendly animals (from Boltgun) - unit.flags2.resident = false; - unit.flags3.body_temp_in_range = true; - unit.population_id = -1 - unit.status.current_soul.unit_id = unit.id - - unit.animal.population.region_x = -1 - unit.animal.population.region_y = -1 - unit.animal.population.unk_28 = -1 - unit.animal.population.population_idx = -1 - unit.animal.population.depth = -1 - - unit.counters.soldier_mood_countdown = -1 - unit.counters.death_cause = -1 - - unit.enemy.anon_4 = -1 - unit.enemy.anon_5 = -1 - unit.enemy.anon_6 = -1 - - -- And make them tame (from Dirst) - unit.flags1.tame = true - unit.training_level = 7 - end -end - -function makeProjectile(unit,velocity) - - if tonumber(unit) then - unit = df.unit.find(tonumber(unit)) - end - - local vx = velocity[1] - local vy = velocity[2] - local vz = velocity[3] - - local count=0 - local l = df.global.world.proj_list - local lastlist=l - l=l.next - while l do - count=count+1 - if l.next==nil then - lastlist=l - end - l = l.next - end - - newlist = df.proj_list_link:new() - lastlist.next=newlist - newlist.prev=lastlist - proj = df.proj_unitst:new() - newlist.item=proj - proj.link=newlist - proj.id=df.global.proj_next_id - df.global.proj_next_id=df.global.proj_next_id+1 - proj.unit=unit - proj.origin_pos.x=unit.pos.x - proj.origin_pos.y=unit.pos.y - proj.origin_pos.z=unit.pos.z - proj.prev_pos.x=unit.pos.x - proj.prev_pos.y=unit.pos.y - proj.prev_pos.z=unit.pos.z - proj.cur_pos.x=unit.pos.x - proj.cur_pos.y=unit.pos.y - proj.cur_pos.z=unit.pos.z - proj.flags.no_impact_destroy=true - proj.flags.piercing=true - proj.flags.parabolic=true - proj.flags.unk9=true - proj.speed_x=vx - proj.speed_y=vy - proj.speed_z=vz - unitoccupancy = dfhack.maps.ensureTileBlock(unit.pos).occupancy[unit.pos.x%16][unit.pos.y%16] - if not unit.flags1.on_ground then - unitoccupancy.unit = false - else - unitoccupancy.unit_grounded = false - end - unit.flags1.projectile=true - unit.flags1.on_ground=false -end - -function findUnit(search) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local primary = search[1] - local secondary = search[2] or 'NONE' - local tertiary = search[3] or 'NONE' - local quaternary = search[4] or 'NONE' - local unitList = df.global.world.units.active - local targetList = {} - local target = nil - local n = 0 - if primary == 'RANDOM' then - if secondary == 'NONE' or secondary == 'ALL' then - n = 1 - targetList = unitList - elseif secondary == 'POPULATION' then - for i,x in pairs(unitList) do - if dfhack.units.isCitizen(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'CIVILIZATION' then - for i,x in pairs(unitList) do - if x.civ_id == df.global.ui.civ_id then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'INVADER' then - for i,x in pairs(unitList) do - if x.invasion_id >= 0 then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'MALE' then - for i,x in pairs(unitList) do - if x.sex == 0 then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'FEMALE' then - for i,x in pairs(unitList) do - if x.sex == 1 then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'PROFESSION' then - for i,x in pairs(unitList) do - if tertiary == dfhack.units.getProfessionName(x) then - n = n + 1 - targetList[n] = x - end - end - elseif secondary == 'CLASS' then - for i,x in pairs(unitList) do - if roses.UnitTable[x.id] then - if roses.UnitTable[x.id].Classes.Current.Name == tertiary then - n = n + 1 - targetList[n] = x - end - end - end - elseif secondary == 'SKILL' then - for i,x in pairs(unitList) do - if dfhack.units.getEffectiveSkill(x,df.job_skill[tertiary]) >= tonumber(quaternary) then - n = n + 1 - targetList[n] = x - end - end - else - for i,x in pairs(unitList) do - creature = df.global.world.raws.creatures.all[x.race].creature_id - caste = df.global.world.raws.creatures.all[x.race].caste[x.caste].caste_id - if secondary == creature then - if tertiary == caste or tertiary == 'NONE' then - n = n + 1 - targetList[n] = x - end - end - end - end - end - if n > 0 then - targetList = dfhack.script_environment('functions/misc').permute(targetList) - target = targetList[1] - return target - else - print('No valid unit found for event') - return nil - end -end \ No newline at end of file diff --git a/raw/scripts/functions/wrapper.lua b/raw/scripts/functions/wrapper.lua deleted file mode 100644 index 5562cba..0000000 --- a/raw/scripts/functions/wrapper.lua +++ /dev/null @@ -1,478 +0,0 @@ -function checkLocation(center,radius) - if radius then - rx = tonumber(radius.x) or tonumber(radius[1]) or -1 - ry = tonumber(radius.y) or tonumber(radius[2]) or -1 - rz = tonumber(radius.z) or tonumber(radius[3]) or -1 - else - rx = -1 - ry = -1 - rz = -1 - end - local targetList = {} - local selected = {} - - n = 1 - unitList = df.global.world.units.active - if rx < 0 and ry < 0 and rz < 0 then - targetList[n] = center - else - local xmin = center.pos.x - rx - local ymin = center.pos.y - ry - local zmin = center.pos.z - rz - local xmax = center.pos.x + rx - local ymax = center.pos.y + ry - local zmax = center.pos.z + rz - targetList[n] = center - for i,unit in ipairs(unitList) do - if unit.pos.x <= xmax and unit.pos.x >= xmin and unit.pos.y <= ymax and unit.pos.y >= ymin and unit.pos.z <= zmax and unit.pos.z >= zmin and unit ~= center then - n = n + 1 - targetList[n] = unit - end - end - end - return targetList,n -end - -function checkTarget(source,targetList,target) - if not target then target = 'all' end - n = 0 - list = {} - - for i,unit in pairs(targetList) do - if target == 'enemy' then - if unit.invasion_id > 0 then - n = n + 1 - list[n] = unit - end - elseif target == 'friendly' then - if unit.invasion_id == -1 and unit.civ_id ~= -1 then - n = n + 1 - list[n] = unit - end - elseif target == 'civ' then - if source.civ_id == unit.civ_id then - n = n + 1 - list[n] = unit - end - elseif target == 'race' then - if source.race == unit.race then - n = n + 1 - list[n] = unit - end - elseif target == 'caste' then - if source.race == unit.race and source.caste == unit.caste then - n = n + 1 - list[n] = unit - end - elseif target == 'gender' then - if source.sex == unit.sex then - n = n + 1 - list[n] = unit - end - elseif target == 'wild' then - if unit.training_level == 9 and unit.civ_id == -1 then - n = n + 1 - list[n] = unit - end - elseif target == 'domestic' then - if unit.training_level == 7 and unit.civ_id == source.civ_id then - n = n + 1 - list[n] = unit - end - elseif target == 'all' then - n = #targetList - list = targetList - break - end - end - return list,n -end - -function checkAge(source,target,argument,relation) - local selected = true - sage = dfhack.units.getAge(source) - tage = dfhack.units.getAge(target) - - value = tonumber(argument) - if relation == 'max' then - if tage > value then return false end - elseif relation == 'min' then - if tage < value then return false end - elseif relation == 'greater' then - if tage/sage < value then return false end - elseif relation == 'less' then - if sage/tage < value then return false end - end - - return selected -end - -function checkAttribute(source,target,argument,relation) - local utils = require 'utils' - local split = utils.split_string - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in pairs(argument) do - attribute = split(x,':')[1] - value = tonumber(split(x,':')[2]) - sattribute = dfhack.script_environment('functions/unit').trackAttribute(source,attribute,nil,nil,nil,nil,'get') - tattribute = dfhack.script_environment('functions/unit').trackAttribute(target,attribute,nil,nil,nil,nil,'get') - if relation == 'max' then - if tattribute > value then return false end - elseif relation == 'min' then - if tattribute < value then return false end - elseif relation == 'greater' then - if tattribute/sattribute < value then return false end - elseif relation == 'less' then - if sattribute/tattribute < value then return false end - end - end - - return true -end - -function checkClass(source,target,argument,relation) - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - selected = dfhack.script_environment('functions/unit').checkCreatureClass(target,x) - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkCreature(source,target,argument,relation) - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - selected = dfhack.script_environment('functions/unit').checkCreatureRace(target,x) - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkEntity(source,target,argument,relation) --- sentity = df.global.world.entities[source.civ_id].entity_raw.code - if target.civ_id < 0 then return false end - tentity = df.global.world.entities[target.civ_id].entity_raw.code - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - selected = x == tentity - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkNoble(source,target,argument,relation) --- snoble = dfhack.units.getNoblePositions(source) - tnoble = dfhack.units.getNoblePositions(target) - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in pairs(argument) do - if tnoble then - for j,y in pairs(tnoble) do - position = y.position.code - selected = position == x - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - else - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkProfession(source,target,argument,relation) --- sprof = source.profession - tprof = target.profession - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - n = df.profession[x] - selected = n == tprof - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkSkill(source,target,argument,relation) - local utils = require 'utils' - local split = utils.split_string - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in pairs(argument) do - skill = split(x,':')[1] - value = tonumber(split(x,':')[2]) - sskill = dfhack.script_environment('functions/unit').trackSkill(source,skill,nil,nil,nil,nil,'get') - tskill = dfhack.script_environment('functions/unit').trackSkill(target,skill,nil,nil,nil,nil,'get') - if relation == 'max' then - if tskill > value then return false end - elseif relation == 'min' then - if tskill < value then return false end - elseif relation == 'greater' then - if tskill/sskill < value then return false end - elseif relation == 'less' then - if sskill/tskill < value then return false end - end - end - - return true -end - -function checkSpeed(source,target,argument,relation) - sspeed = dfhack.units.computeMovementSpeed(source) - tspeed = dfhack.units.computeMovementSpeed(target) - - value = tonumber(argument) - if relation == 'max' then - if tspeed > value then return false end - elseif relation == 'min' then - if tspeed < value then return false end - elseif relation == 'greater' then - if tspeed/sspeed < value then return false end - elseif relation == 'less' then - if sspeed/tspeed < value then return false end - end - - return true -end - -function checkSyndrome(source,target,argument,relation) - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - selected = dfhack.script_environment('functions/unit').checkCreatureSyndrome(target,x) - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkToken(source,target,argument,relation) - if type(argument) ~= 'table' then argument = {argument} end - for i,x in ipairs(argument) do - selected = dfhack.script_environment('functions/unit').checkCreatureToken(target,x) - if relation == 'required' then - if selected then return true end - elseif relation == 'immune' then - if selected then return false end - end - end - - if relation == 'required' then - return false - elseif relation == 'immune' then - return true - end -end - -function checkTrait(source,target,argument,relation) - local utils = require 'utils' - local split = utils.split_string - - if type(argument) ~= 'table' then argument = {argument} end - for i,x in pairs(argument) do - trait = split(x,':')[1] - value = tonumber(split(x,':')[2]) - strait = dfhack.script_environment('functions/unit').trackTrait(source,trait,nil,nil,nil,nil,'get') - ttrait = dfhack.script_environment('functions/unit').trackTrait(target,trait,nil,nil,nil,nil,'get') - if relation == 'max' then - if ttrait > value then return false end - elseif relation == 'min' then - if ttrait < value then return false end - elseif relation == 'greater' then - if ttrait/strait < value then return false end - elseif relation == 'less' then - if strait/ttrait < value then return false end - end - end - - return true -end - -function getValue(equation,target,source,center,targetList,selected) - local utils = require 'utils' - local split = utils.split_string - - check = {'source','SOURCE','target','TARGET'} - for _,unit in pairs(check) do - if unit == 'SOURCE' or unit == 'source' then unitID = source.id end - if unit == 'TARGET' or unit == 'target' then unitID = target.id end - while equation:find(unit) do - look = string.match(equation..'+',unit..".(.-)[+%-*/]") - array = split(look,"%.") - if string.upper(array[1]) == 'ATTRIBUTE' then - total = dfhack.script_environment('functions/unit').trackAttribute(unitID,string.upper(array[2]),nil,nil,nil,nil,"get") - equation = equation:gsub(string.match(equation..'+',"("..unit..".-)[+%-*/]"),tostring(total)) - elseif string.upper(array[1]) == 'SKILL' then - total = dfhack.script_environment('functions/unit').trackSkill(unitID,string.upper(array[2]),nil,nil,nil,nil,"get") - equation = equation:gsub(string.match(equation..'+',"("..unit..".-)[+%-*/]"),tostring(total)) - elseif string.upper(array[1]) == 'TRAIT' then - total = dfhack.script_environment('functions/unit').trackTrait(unitID,string.upper(array[2]),nil,nil,nil,nil,"get") - equation = equation:gsub(string.match(equation..'+',"("..unit..".-)[+%-*/]"),tostring(total)) - elseif string.upper(array[1]) == 'COUNTER' then - total = dfhack.script_environment('functions/unit').getCounter(unitID,string.lower(array[2])) - equation = equation:gsub(string.match(equation..'+',"("..unit..".-)[+%-*/]"),tostring(total)) - elseif string.upper(array[1]) == 'RESISTANCE' then - total = dfhack.script_environment('functions/unit').trackResistance(unitID,look,nil,nil,nil,nil,"get") - equation = equation:gsub(string.match(equation..'+',"("..unit..".-)[+%-*/]"),tostring(total)) - end - end - end - - equals = assert(load("return "..equation)) - value = equals() - return value -end - -function isSelected(source,unit,args) - local selected = true - - if args.maxphysical and selected then - selected = checkAttribute(source,unit,args.maxphysical,'max') - end - if args.minphysical and selected then - selected = checkAttribute(source,unit,args.minphysical,'min') - end - - if args.maxmental and selected then - selected = checkAttribute(source,unit,args.maxmental,'max') - end - if args.minmental and selected then - selected = checkAttribute(source,unit,args.minmental,'min') - end - - if args.maxskill and selected then - selected = checkSkill(source,unit,args.maxskill,'max') - end - if args.minskill and selected then - selected = checkSkill(source,unit,args.minskill,'min') - end - - if args.maxtrait and selected then - selected = checkTrait(source,unit,args.maxtrait,'max') - end - if args.mintrait and selected then - selected = checkTrait(source,unit,args.mintrait,'min') - end - - if args.maxage and selected then - selected = checkAge(source,unit,args.maxage,'max') - end - if args.minage and selected then - selected = checkAge(source,unit,args.minage,'min') - end - - if args.maxspeed and selected then - selected = checkSpeed(source,unit,args.maxspeed,'max') - end - if args.minspeed and selected then - selected = checkSpeed(source,unit,args.minspeed,'min') - end - - if args.rclass and selected then - selected = checkClass(source,unit,args.rclass,'required') - end - if args.iclass and selected then - selected = checkClass(source,unit,args.iclass,'immune') - end - - if args.rcreature and selected then - selected = checkCreature(source,unit,args.rcreature,'required') - end - if args.icreature and selected then - selected = checkCreature(source,unit,args.icreature,'immune') - end - - if args.rsyndrome and selected then - selected = checkSyndrome(source,unit,args.rsyndrome,'required') - end - if args.isyndrome and selected then - selected = checkSyndrome(source,unit,args.isyndrome,'immune') - end - - if args.rtoken and selected then - selected = checkToken(source,unit,args.rtoken,'required') - end - if args.itoken and selected then - selected = checkToken(source,unit,args.itoken,'immune') - end - - if args.rnoble and selected then - selected = checkNoble(source,unit,args.rnoble,'required') - end - if args.inoble and selected then - selected = checkNoble(source,unit,args.inoble,'immune') - end - - if args.rprofession and selected then - selected = checkProfession(source,unit,args.rprofession,'required') - end - if args.iprofession and selected then - selected = checkProfession(source,unit,args.iprofession,'immune') - end - - if args.rentity and selected then - selected = checkEntity(source,unit,args.rentity,'required') - end - if args.ientity and selected then - selected = checkEntity(source,unit,args.ientity,'immune') - end - - return selected -end \ No newline at end of file diff --git a/raw/scripts/item/create.lua b/raw/scripts/item/create.lua deleted file mode 100644 index aeb9bd6..0000000 --- a/raw/scripts/item/create.lua +++ /dev/null @@ -1,64 +0,0 @@ ---item/create.lua v1.0 ---author expwnent, modified by roses ---creates an item of a given type and material - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'creator', - 'material', - 'item', - 'matchingGloves', - 'matchingShoes', - 'dur', - 'quality', -}) - -local args = utils.processArgs({...}, validArgs) - -if args.help then - print( -[[item/create.lua -arguments: - -help - print this help message - -creator id - specify the id of the unit who will create the item - examples: - 0 - 2 - -material matstring - specify the material of the item to be created - examples: - INORGANIC:IRON - CREATURE_MAT:DWARF:BRAIN - PLANT_MAT:MUSHROOM_HELMET_PLUMP:DRINK - -item itemstr - specify the itemdef of the item to be created - examples: - WEAPON:ITEM_WEAPON_PICK - -matchingShoes - create two of this item - -matchingGloves - create two of this item, and set handedness appropriately - -dur # - length of time, in in-game ticks, for the item to exist - 0 means the item is permanent - DEFAULT: 0 - ]]) - return -end - -local item1 = dfhack.script_environment('functions/item').create(args.item,args.material,{creator=args.creator,quality=args.quality,dur=args.dur}) -if args.matchingGloves or args.matchingShoes then - if args.matchingGloves then - item1 = df.item.find(item1) - item1:setGloveHandedness(1); - end - local item2 = dfhack.script_environment('functions/item').create(args.item,args.material,{creator=args.creator,quality=args.quality,dur=args.dur}) - if args.matchingGloves then - item2 = df.item.find(item2) - item2:setGloveHandedness(2); - end -end \ No newline at end of file diff --git a/raw/scripts/item/material-change.lua b/raw/scripts/item/material-change.lua deleted file mode 100644 index 29217e1..0000000 --- a/raw/scripts/item/material-change.lua +++ /dev/null @@ -1,94 +0,0 @@ ---item/material-change.lua v1.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'item', - 'weapon', - 'armor', - 'helm', - 'shoes', - 'shield', - 'gloves', - 'pants', - 'ammo', - 'mat', - 'dur', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[item/material-change.lua - Change the material a equipped item is made out of - arguments: - -help - print this help message - -unit id \ - id of the target unit | - -item id | Must have one and only one of them - id of the target item / - -weapon \ - change weapons | - -armor | - change armor | - -helm | - change helm | - -shoes | - change shoes | Must have at least one of these arguments if using -unit - -shield | - change shield | - -gloves | - change gloves | - -pants | - change pants | - -ammo | - change ammo / - -mat matstring - specify the material of the item to be changed to - examples: - INORGANIC:IRON - CREATURE_MAT:DWARF:BRAIN - PLANT_MAT:MUSHROOM_HELMET_PLUMP:DRINK - -dur # - length of time, in in-game ticks, for the material change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - item/material-change -unit \\UNIT_ID -weapon -ammo -mat INORGANIC:IMBUE_FIRE -dur 3600 - item/material-change -unit \\UNIT_ID -armor -helm -shoes -pants -gloves -mat INORGANIC:IMBUE_STONE -dur 1000 - item/material-change -unit \\UNIT_ID -shield -mat INORGANIC:IMBUE_AIR - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) - local types = {} - if args.weapon then types[1] = 'WEAPON' end - if args.armor then types[2] = 'ARMOR' end - if args.helm then types[3] = 'HELM' end - if args.shoes then types[4] = 'SHOES' end - if args.shield then types[5] = 'SHIELD' end - if args.gloves then types[6] = 'GLOVES' end - if args.pants then types[7] = 'PANTS' end - if args.ammo then types[8] = 'AMMO' end - items = dfhack.script_environment('functions/unit').checkInventoryType(unit,types) -else - if args.item and tonumber(args.item) then - items = {df.item.find(tonumber(args.item))} - else - print('No unit or item selected') - return - end -end - -dur = tonumber(args.dur) or 0 -track = nil -if args.track then track = 'track' end - -for _,item in pairs(items) do - dfhack.script_environment('functions/item').changeMaterial(item,args.mat,dur,track) -end diff --git a/raw/scripts/item/projectile.lua b/raw/scripts/item/projectile.lua deleted file mode 100644 index fa0bc95..0000000 --- a/raw/scripts/item/projectile.lua +++ /dev/null @@ -1,191 +0,0 @@ ---special-projectile.lua v1.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unitSource', - 'unitTarget', - 'locationSource', - 'locationTarget', - 'creator', - 'mat', - 'item', - 'number', - 'maxrange', - 'velocity', - 'minrange', - 'hitchance', - 'height', - 'equipped', - 'type', - 'quality', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[item/projectile.lua - Creates an item that shoots as a projectile - arguments: - -help - print this help message - -unitSource id \ - id of the unit to use for position of origin of projectile | - -locationSource [#,#,#] | Must have one and only one of these arguments, if both, ignore -locationSource - x,y,z coordinates to use for position for origin of projectile / - -unitTarget id \ - id of the unit to use for position of target of projectile | - -locationTarget [#,#,#] | Must have one and only one of these arguments, if both, ignore -locationTarget - x,y,z coordinates to use for position of target of projectile / - -creator id - id of unit to use as creator of item, if not included assumes unitSource as creator - -item itemstr - specify the itemdef of the item to be created or checked for - examples: - WEAPON:ITEM_WEAPON_PICK - AMMO:ITEM_AMMO_BOLT - -mat matstring - specify the material of the item to be created - examples: - INORGANIC:IRON - CREATURE_MAT:DWARF:BRAIN - PLANT_MAT:MUSHROOM_HELMET_PLUMP:DRINK - -number # - number of items to fire as projectiles - DEFAULT 1 - -maxrange # - maximum range in tiles that the projectile can travel to hit its target - DEFAULT 10 - -minrange # - minimum range in tiles that the projectile needs to travel to hit its target - DEFAULT 1 - -velocity # for shooting mechanics, [ # # # ] for falling mechanics - speed of projectile (does not affect how fast it moves across the map, only force that it hits the target with) - DEFAULT 20 or [ 0 0 0 ] - -hitchance # - chance for projectile to hit target (assume %?) - DEFAULT 50 - -height # - height above the source location to start the item - DEFAULT 0 - -equipped - whether to check unitSource (or creatore) for the equipped item, if absent assumes you want the item to be created - examples: - item/projectile -unit_source \\UNIT_ID -location_target [\\LOCATION] -item AMMO:ITEM_AMMO_ARROWS -mat STEEL -number 10 -maxrange 50 -minrange 10 -velocity 30 -hitchance 10 - ]]) - return -end - -if args.unitSource and args.locationSource then - print("Can't have unit and location specified as source at same time") - args.locationSource = nil -end -if args.unitTarget and args.locationTarget then - print("Can't have unit and location specified as target at same time") - args.locationTarget = nil -end -if args.unitSource then -- Check for source declaration !REQUIRED - origin = df.unit.find(tonumber(args.unitSource)).pos -elseif args.locationSource then - origin = {x=args.locationSource[1],y=args.locationSource[2],z=args.locationSource[3]} -else - print('No source specified') - return -end - -if args.unitTarget then -- Check for target declaration !REQUIRED - target = df.unit.find(tonumber(args.unitTarget)).pos -elseif args.locationTarget then - target = {x=args.locationTarget[1],y=args.locationTarget[2],z=args.locationTarget[3]} -elseif args.falling then - target = origin -else - print('No target specified') - return -end - -if not args.item then - print('No item specified') - return -end - -local itemType = dfhack.items.findType(args.item) -if itemType == -1 then - print('Invalid item') - return -end -local itemSubtype = dfhack.items.findSubtype(args.item) -local create = true -if args.equipped and (not args.unitSource and not args.creator) then - print('No unit to check for equipment') - return -elseif args.equipped and args.unitSource then - create = false - if args.unitSource and not args.creator then - args.creator = args.unitSource - end -end - -if not args.creator or not tonumber(args.creator) or not df.unit.find(tonumber(args.creator)) then - if args.unitSource then - args.creator = args.unitSource - else - print('Invalid creator') - return - end -end -args.creator = df.unit.find(tonumber(args.creator)) - -number = tonumber(args.number) or 1 -- Specify number of projectiles (default 1) -for n = 1, number, 1 do - item = nil - if create then - if not args.mat or not dfhack.matinfo.find(args.mat) then - print('Invalid material') - return - end - item = dfhack.script_environment('functions/item').create(args.item,args.mat,{creator=args.creator,quality=args.quality}) - item = df.item.find(item) - else - local inventory = args.creator.inventory - for k,v in ipairs(inventory) do - if v.item:getType() == itemType and v.item:getSubtype() == itemSubtype then - item = v.item - break - else - for l,w in ipairs(dfhack.items.getContainedItems(v.item)) do - if w:getType() == itemType and w:getSubtype() == itemSubtype then - item = w - break - end - end - end - end - if not item then - print('Needed item not equipped') - return - end - if item.stack_size == 1 then - break - else - item.stack_size = item.stack_size - 1 - item = dfhack.script_environment('functions/item').create(args.item,dfhack.matinfo.getToken(item.mat_type,item.mat_index),{creator=dfhack.items.getHolderUnit(item),quality=item.quality}) - item = df.item.find(item) - end - end - - if args.type == 'falling' then - velocity = args.velocity or {0,0,0} - height = tonumber(args.height) or 0 - dfhack.items.moveToGround(item,{x=tonumber(target.x),y=tonumber(target.y),z=tonumber(target.z+height)}) - dfhack.script_environment('functions/item').makeProjectileFall(item,{target.x,target.y,target.z+height},velocity) - else - velocity = tonumber(args.velocity) or 20 -- Specify velocity of projectiles (default 20) - hit_chance = tonumber(args.hitchance) or 50 -- Specify hit percent of projectiles (default 50) - max_range = tonumber(args.maxrange) or 10 -- Specify max range of projectiles (default 10) - min_range = tonumber(args.minrange) or 1 -- Specify minimum range of projectiles (default 1) - height = tonumber(args.height) or 0 - dfhack.items.moveToGround(item,{x=tonumber(origin.x),y=tonumber(origin.y),z=tonumber(origin.z+height)}) - dfhack.script_environment('functions/item').makeProjectileShot(item,{origin.x,origin.y,origin.z+height},{target.x,target.y,target.z},{velocity=velocity,accuracy=hit_chance,range=max_range,minimum=min_range}) - end -end diff --git a/raw/scripts/item/quality-change.lua b/raw/scripts/item/quality-change.lua deleted file mode 100644 index b3a75ec..0000000 --- a/raw/scripts/item/quality-change.lua +++ /dev/null @@ -1,123 +0,0 @@ - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'item', - 'type', - 'weapon', - 'armor', - 'helm', - 'shoes', - 'shield', - 'gloves', - 'pants', - 'ammo', - 'quality', - 'dur', - 'upgrade', - 'downgrade', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[item/subtype-change.lua - Change the quality of an item - arguments: - -help - print this help message - -unit id \ - id of the target unit inventory to check | - -item id | - id of the target item | - -type itemstr | Must have one and only one of these arguments - specify the itemdef of the item to be checked for | - examples: | - WEAPON:ITEM_WEAPON_PICK | - AMMO:ITEM_AMMO_BOLT / - -weapon \ - change weapons | - -armor | - change armor | - -helm | - change helm | - -shoes | - change shoes | Must have at least one of these arguments when using -unit - -shield | - change shield | - -gloves | - change gloves | - -pants | - change pants | - -ammo | - change ammo / - -upgrade \ - upgrade the quality of the item by 1 | - -downgrade | - downgrade the quality of the item by 1 | Must have one and only one of these arguments - -quality # | - set the quality to a specified level / - -dur # - length of time, in in-game ticks, for the quality change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - item/quality-change -unit \\UNIT_ID -weapon -quality 6 -dur 1000 - item/quality-change -type WEAPON:ITEM_WEAPON_GIANTS -downgrade - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) - local types = {} - if args.weapon then types[1] = 'WEAPON' end - if args.armor then types[2] = 'ARMOR' end - if args.helm then types[3] = 'HELM' end - if args.shoes then types[4] = 'SHOES' end - if args.shield then types[5] = 'SHIELD' end - if args.gloves then types[6] = 'GLOVES' end - if args.pants then types[7] = 'PANTS' end - if args.ammo then types[8] = 'AMMO' end - items = dfhack.script_environment('functions/unit').checkInventoryType(unit,types) -elseif args.item and tonumber(args.item) then - items = {df.item.find(tonumber(args.item))} -elseif args.type then - local itemType = dfhack.items.findType(args.type) - if itemType == -1 then - print('Invalid item') - return - end - local itemSubtype = dfhack.items.findSubtype(args.type) - local itemList = df.global.world.items.all - local k = 1 - for i,x in ipairs(itemList) do - if x:getType() == itemType and x:getSubtype() == itemSubtype then - items[k] = itemList[i] - k = k + 1 - end - end -else - print('No unit or item selected') - return -end - -dur = tonumber(args.dur) or 0 -track = nil -if args.track then track = 'track' end - -for _,item in pairs(items) do - if args.upgrade then - quality = item.quality + 1 - elseif args.downgrade then - quality = item.quality - 1 - elseif args.quality then - quality = tonumber(args.quality) - else - print('No quality specified') - return - end - dfhack.script_environment('functions/item').changeQuality(item,quality,dur,track) -end diff --git a/raw/scripts/item/subtype-change.lua b/raw/scripts/item/subtype-change.lua deleted file mode 100644 index b388dac..0000000 --- a/raw/scripts/item/subtype-change.lua +++ /dev/null @@ -1,138 +0,0 @@ ---item/subtype-change.lua v1.0 - -local utils = require 'utils' -local split = utils.split_string - -validArgs = validArgs or utils.invert({ - 'help', - 'unit', - 'item', - 'type', - 'weapon', - 'armor', - 'helm', - 'shoes', - 'shield', - 'gloves', - 'pants', - 'ammo', - 'subtype', - 'dur', - 'upgrade', - 'downgrade', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[item/subtype-change.lua - Change the subtype of an item - arguments: - -help - print this help message - -unit id \ - id of the target unit inventory to check | - -item id | - id of the target item | - -type itemstr | Must have one and only one of these arguments - specify the itemdef of the item to be checked for | - examples: | - WEAPON:ITEM_WEAPON_PICK | - AMMO:ITEM_AMMO_BOLT / - -weapon SUBTYPE or ALL \ - change weapons | - -armor SUBTYPE or ALL | - change armor | - -helm SUBTYPE or ALL | - change helm | - -shoes SUBTYPE or ALL | - change shoes | Must have at least one of these arguments - -shield SUBTYPE or ALL | - change shield | - -gloves SUBTYPE or ALL | - change gloves | - -pants SUBTYPE or ALL | - change pants | - -ammo SUBTYPE or ALL | - change ammo / - -upgrade \ - increase the number of the item SUBTYPE by 1 | - (i.e. ITEM_WEAPON_DAGGER_1 -> ITEM_WEAPON_DAGGER_2) | - -downgrade | - decrease the number of the item SUBTYPE by 1 | Must have one and only one of these arguments - (i.e. ITEM_WEAPON_DAGGER_2 -> ITEM_WEAPON_DAGGER_1) | - -subtype SUBTYPE | - change the item to the new SUBTYPE / - -dur # - length of time, in in-game ticks, for the quality change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - item/subtype-change -unit \\UNIT_ID -weapon -upgrade -dur 1000 - item/subtype-change -type WEAPON:ITEM_WEAPON_GIANTS -subtype ITEM_WEAPON_GIANTS_WEAK -dur 1000 - item/subtype-change -unit \\UNIT_ID -armor -pants -helm -shoes -gloves -downgrade -dur 3600 - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) - local types = {} - if args.weapon then types[1] = 'WEAPON' end - if args.armor then types[2] = 'ARMOR' end - if args.helm then types[3] = 'HELM' end - if args.shoes then types[4] = 'SHOES' end - if args.shield then types[5] = 'SHIELD' end - if args.gloves then types[6] = 'GLOVES' end - if args.pants then types[7] = 'PANTS' end - if args.ammo then types[8] = 'AMMO' end - items = dfhack.script_environment('functions/unit').checkInventoryType(unit,types) -elseif args.item and tonumber(args.item) then - items = {df.item.find(tonumber(args.item))} -elseif args.type then - local itemType = dfhack.items.findType(args.type) - if itemType == -1 then - print('Invalid item') - return - end - local itemSubtype = dfhack.items.findSubtype(args.type) - local itemList = df.global.world.items.all - local k = 1 - for i,x in ipairs(itemList) do - if x:getType() == itemType and x:getSubtype() == itemSubtype then - items[k] = itemList[i] - k = k + 1 - end - end -else - print('No unit or item selected') - return -end - -dur = tonumber(args.dur) or 0 -track = nil -if args.track then track = 'track' end - -for _,item in pairs(items) do - if tonumber(item) then - item = df.item.find(tonumber(item)) - end - local name = item.subtype.id - local namea = split(name,'_') - local num = tonumber(namea[#namea]) - if args.upgrade then - num = num + 1 - namea[#namea] = tostring(num) - subtype = table.concat(namea,'_') - elseif args.downgrade then - num = num - 1 - namea[#namea] = tostring(num) - subtype = table.concat(namea,'_') - elseif args.subtype then - subtype = args.subtype - else - print('No subtype specified') - return - end - dfhack.script_environment('functions/item').changeSubtype(item,subtype,dur,track) -end \ No newline at end of file diff --git a/raw/scripts/modtools/df_date.lua b/raw/scripts/modtools/df_date.lua new file mode 100644 index 0000000..95654d9 --- /dev/null +++ b/raw/scripts/modtools/df_date.lua @@ -0,0 +1,95 @@ +local df_date={} + +df_date.new=function(number) + local newDate={year=1,year_tick=number} + setmetatable(newDate,df_date) + return newDate:fix() +end + +df_date.fix=function(dfDate) + while dfDate.year_tick>=403200 do + dfDate.year=dfDate.year+1 + dfDate.year_tick=dfDate.year_tick-403200 + end + while dfDate.year_tick<0 do + dfDate.year=newDate.year-1 + dfDate.year_tick=dfDate.year_tick+403200 + end + return dfDate +end + +df_date.__eq=function(date1,date2) + return date1.year==date2.year and date1.year_tick==date2.year_tick +end + +df_date.__lt=function(date1,date2) + if date1.yeardate2.year then return false end + if date1.year==date2.year then + return date1.year_tickdate2.year then return false end + if date1.year==date2.year then + return date1.year_tick<=date2.year_tick + end +end + +df_date.__sub=function(date1,date2) + if type(date1)=='number' then + date1=df_date.new(date1) + end + if type(date2)=='number' then + date2=df_date.new(date2) + end + local newDate={year=date1.year-date2.year,year_tick=date1.year_tick-date2.year_tick} + setmetatable(newDate,df_date) + return newDate:fix() +end + +df_date.__add=function(date1,date2) + if type(date1)=='number' then + date1=df_date.new(date1) + end + if type(date2)=='number' then + date2=df_date.new(date2) + end + local newDate={year=date1.year+date2.year,year_tick=date1.year_tick+date2.year_tick} + setmetatable(newDate,df_date) + return newDate:fix() +end + +df_date.ticks=function(dfDate) + return (dfDate.year*403200)+dfDate.year_tick +end + +df_date.dayOfWeek=function(dfDate) + return (math.floor(dfDate.year_tick/1200)%7)+1 +end + +df_date.monthOfYear=function(dfDate) + return math.floor(dfDate.year_tick/33600)+1 +end + +df_date.dayOfYear=function(dfDate) + return math.floor(dfDate.year_tick/1200) +end + +df_date.dayOfMonth=function(dfDate) + return (math.floor(dfDate.year_tick/1200)%28)+1 +end + +df_date.__index=df_date + +df_date.now=function() + local newDate={year=df.global.cur_year,year_tick=df.global.cur_year_tick} + setmetatable(newDate,df_date) + return newDate +end + +new=df_date.new + +now=df_date.now \ No newline at end of file diff --git a/raw/scripts/modtools/persist_timeout.lua b/raw/scripts/modtools/persist_timeout.lua new file mode 100644 index 0000000..e7b2249 --- /dev/null +++ b/raw/scripts/modtools/persist_timeout.lua @@ -0,0 +1,51 @@ +--Absolutely based on roses' persist-delay. + +local persistTable=require('persist-table') + +if not persistTable.GlobalTable.persistTimeout then persistTable.GlobalTable.persistTimeout={} end + +local persistTimeoutTable=persistTable.GlobalTable.persistTimeout + +persistTimeoutTable['nextTimeoutId']=persistTimeoutTable['nextTimeoutId'] or '1' --yeah sorry lua arrays + +local df_date=dfhack.script_environment('modtools/df_date') + +function persistTimeout(ticks,env,func,args) + local timeout=dfhack.timeout(ticks,'ticks',function() dfhack.script_environment(env)[func](table.unpack(args)) end) + local currentTime=df_date.now() + local runTime=currentTime+ticks + local currentPersistNumber=tostring(persistTimeoutTable['nextTimeoutId']) + persistTimeoutTable[currentPersistNumber]={} + persistTimeoutTable[currentPersistNumber].ID=timeout + persistTimeoutTable[currentPersistNumber].Tick=tostring(runTime:ticks()) + persistTimeoutTable[currentPersistNumber].Environment=env + persistTimeoutTable[currentPersistNumber].Function=func + persistTimeoutTable[currentPersistNumber].Arguments={} + for k,v in ipairs(args) do + persistTimeoutTable[currentPersistNumber].Arguments[tostring(k)]=tostring(v) + end + persistTimeoutTable['nextTimeoutId']=tostring(math.floor(persistTimeoutTable['nextTimeoutId']+1)) + return timeout +end + +function onLoad() + local listToCull={} + local listOfTimeouts={} + for _,v in pairs(persistTimeoutTable._children) do + local actualTable=persistTimeoutTable[v] + if actualTable then + if (df_date.now()0 and returnTable or false +end + +local function addSyndromesToUnit(syndromes,unit) + for k,syndrome in ipairs(syndromes) do + dfhack.run_script('modtools/add-syndrome','-target',unit.id,'-syndrome',syndrome,'-resetPolicy','DoNothing') + end +end + +local function addAttributesToUnit(attributes,unit) + for k,v in ipairs(attributes) do + if df.physical_attribute_type[v.name] then + local unitPhysicalAttr=unit.body.physical_attrs[v.name] + unitPhysicalAttr.value=math.max(0,unitPhysicalAttr.value+v.bonus) + unitPhysicalAttr.max_value=math.max(0,unitPhysicalAttr.max_value+(v.bonus*2)) + elseif df.mental_attribute_type[v.name] then + local unitMentalAttr=unit.status.current_soul.mental_attrs[v.name] + unitMentalAttr.value=math.max(0,unitMentalAttr.value+v.bonus) + unitMentalAttr.max_value=math.max(0,unitMentalAttr.max_value+(v.bonus*2)) + else + print('Unrecognized attribute! '..v.name) + end + end +end + +local function addRealSkillsToUnit(realSkills,unit) + for k,skill in ipairs(realSkills) do + dfhack.run_script('modtools/skill-change','-unit',unit.id,'-value',skill.bonus,'-mode','add','-granularity','experience','-skill',skill.name) + end +end + +local function levelSkill(unit,skill,level) --local because all leveling should go through the much more proper channel of addExperienceToSkill + if skill.levelfuncs and skill.levelfuncs[level] then + skill.levelfuncs[level](unit) + end + if skill.syndromes and skill.syndromes[level] then + addSyndromesToUnit(skill.syndromes[level],unit) + end + if skill.attributes and skill.attributes[level] then + addAttributesToUnit(skill.attributes[level],unit) + end + if skill.skills and skill.skills[level] then + addRealSkillsToUnit(skill.skills[level],unit) + end +end + +function addExperienceToSkill(unit,skill,amount) + --will add experience to unit and level up if it reaches a level up threshold defined in the data files + --return false on failure, true on success + local unitSkill=getSkillFromUnit(unit,skill) + if not unitSkill then return false end --skills should only be explicitly added + unitSkill.experience=unitSkill.experience+amount + local putnamSkill=skills[skill] + local levelThreshold=putnamSkill.levelUpThresholds[unitSkill.rating+1] or 1/0 --[[IEEE 754 standard, so this is positive infinity, which, fun fact, lua counts as more than any integer. + Like any clever hack, this is actually quite stupid, but I was feeling lazy.]] + while unitSkill.experience>levelThreshold do + unitSkill.experience=unitSkill.experience-levelThreshold + levelSkill(unit,putnamSkill,unitSkill.rating+1) + unitSkill.rating=unitSkill.rating+1 + end + return true +end + +local function canGainExperienceWithCriterion(skill,criterion) + for k,v in pairs(skill.experienceCriteria) do + if v==criterion then return true end + end + return false +end + +function addExperienceToAllSkillsWithLevelCriterion(unit,amount,criterion) + for k,v in ipairs(unit.status.current_soul.performance_skills.musical_forms) do + local musicalForm=df.musical_form.find(v.id) + if musicalForm.name.unknown==magicIdentifier and canGainExperienceWithCriterion(skills[musicalForm.name.first_name],criterion) then + addExperienceToSkill(unit,musicalForm.name.first_name,amount) + end + end +end diff --git a/raw/scripts/persist-delay.lua b/raw/scripts/persist-delay.lua deleted file mode 100644 index f4acba2..0000000 --- a/raw/scripts/persist-delay.lua +++ /dev/null @@ -1,38 +0,0 @@ -function commandDelay(ticks,script) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local currentTick = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick - local runTick = currentTick + ticks - local persistDelay = roses.CommandDelay - local number = #persistDelay - persistDelay[tostring(number+1)] = {} - persistDelay[tostring(number+1)].Tick = tostring(runTick) - persistDelay[tostring(number+1)].Command = script - dfhack.timeout(ticks,'ticks', - function () - dfhack.run_command(script) - end - ) -end - -function environmentDelay(ticks,environment,functions,arguments) - id = dfhack.timeout(ticks,'ticks', - function () - dfhack.script_environment(environment)[functions](table.unpack(arguments)) - end - ) - local roses = dfhack.script_environment('base/roses-table').loadRosesTable() - local currentTick = 1200*28*3*4*df.global.cur_year + df.global.cur_year_tick - local runTick = currentTick + ticks - local persistDelay = roses.EnvironmentDelay - local number = #persistDelay - persistDelay[tostring(number+1)] = {} - persistDelay[tostring(number+1)].ID = tostring(id) - persistDelay[tostring(number+1)].Tick = tostring(runTick) - persistDelay[tostring(number+1)].Environment = environment - persistDelay[tostring(number+1)].Function = functions - persistDelay[tostring(number+1)].Arguments = {} - for i,x in ipairs(arguments) do - persistDelay[tostring(number+1)].Arguments[tostring(i)] = tostring(x) - end - return id -end \ No newline at end of file diff --git a/raw/scripts/tile/material-change.lua b/raw/scripts/tile/material-change.lua deleted file mode 100644 index 7b1ec4e..0000000 --- a/raw/scripts/tile/material-change.lua +++ /dev/null @@ -1,76 +0,0 @@ ---material-change.lua v1.0 - -validArgs = validArgs or utils.invert({ - 'help', - 'plan', - 'location', - 'material', - 'dur', - 'unit', - 'floor', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[tile/material-change.lua - Change a tiles material - arguments: - -help - print this help message - -unit id - id of the unit to center on - required if using -plan - -plan filename \ - filename of plan to use (without .txt) | - -location [ # # # ] | Must have at least one of these - x,y,z coordinates to use for position / - -material INORGANIC_TOKEN - material to set tile to - examples: - STEEL - GRANITE - RUBY - -floor - targets the z-level below the specified location(s) - -dur # - length of time for tile change to last - 0 means the change is natural and will revert back to normal temperature - DEFAULT 0 - examples: - tile/material-change -location [ \\LOCATION ] -material RUBY - tile/material-change -plan 5x5_X -unit \\UNIT_ID -material SLADE -floor -dur 3000 - ]]) - return -end - -if not args.material then - print('No material declaration') - return -end - -dur = tonumber(args.dur) or 0 - -if args.plan then - if args.unit and tonumber(args.unit) then - pos = df.unit.find(tonumber(args.unit)).pos - elseif args.location then - pos = args.location - else - print('No center decleration, need -unit or -location') - return - end - locations,n = dfhack.script_environment('functions/map').getPositionPlan(file,pos) - for i,loc in ipairs(locations) do - if args.floor then - loc.z = loc.z - 1 - end - dfhack.script_environment('functions/map').changeInorganic(loc,nil,nil,args.material,dur) - end -end -if args.location then - if args.floor then - args.location[3] = args.location[3] - 1 - end - dfhack.script_environment('functions/map').changeInorganic(args.location,nil,nil,args.material,dur) -end - diff --git a/raw/scripts/tile/temperature-change.lua b/raw/scripts/tile/temperature-change.lua deleted file mode 100644 index 6e2cd31..0000000 --- a/raw/scripts/tile/temperature-change.lua +++ /dev/null @@ -1,59 +0,0 @@ ---temperature-change.lua v1.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'plan', - 'location', - 'temperature', - 'dur', - 'unit', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[tile/temperature-change.lua - Changes a tiles temperature - arguments: - -help - print this help message - -unit id - id of the unit to center on - required if using -plan - -plan filename \ - filename of plan to use (without .txt) | - -location [# # #] | Must have at least one of these - x,y,z coordinates to use for position / - -temperature # - temperature to set tile to - -dur # - length of time for tile change to last - 0 means the change is natural and will revert back to normal temperature - DEFAULT 0 - examples: - tile/temperature-change -unit \\UNIT_ID -plan 5x5_X -temperature 15000 -dur 1000 - tile/temperature-change -location [ \\LOCATION ] -temperature 8000 - ]]) - return -end - -dur = tonumber(args.dur) or 0 -- Check if there is a duration (default 0) - -if args.plan then - if args.unit and tonumber(args.unit) then - pos = df.unit.find(tonumber(args.unit)).pos - elseif args.location then - pos = args.location - else - print('No center decleration, need -unit or -location') - return - end - locations,n = dfhack.script_environment('functions/map').getPositionPlan(file,pos) - for i,loc in ipairs(locations) do - dfhack.script_environment('functions/map').changeTemperature(loc,nil,nil,args.temperature,dur) - end -end -if args.location then - dfhack.script_environment('functions/map').changeTemperature(args.location[1],args.location[2],args.location[3],args.temperature,dur) -end \ No newline at end of file diff --git a/raw/scripts/unit/attribute-change.lua b/raw/scripts/unit/attribute-change.lua deleted file mode 100644 index 79f05ee..0000000 --- a/raw/scripts/unit/attribute-change.lua +++ /dev/null @@ -1,93 +0,0 @@ ---unit/attribute-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'attribute', - 'fixed', - 'percent', - 'set', - 'dur', - 'unit', - 'announcement', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/attribute-change.lua - Change the attribute(s) of a unit - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -attribute ATTRIBUTE_ID - attribute(s) to be changed - -fixed # \ - change attribute by fixed amount | - -percent # | - change attribute by percentage amount | Must have one and only one of these arguments - -set # | - set attribute to this value / - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - -announcement string - optional argument to create an announcement and combat log report - examples: - unit/attribute-change -unit \\UNIT_ID -fixed 100 -attribute STRENGTH - unit/attribute-change -unit \\UNIT_ID -percent [ 10 10 10 ] -attribute [ ENDURANCE TOUGHNESS WILLPOWER ] -dur 3600 - unit/attribute-change -unit \\UNIT_ID -set 5000 -attribute WILLPOWER -dur 1000 - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -value = args.fixed or args.percent or args.set - -dur = tonumber(args.dur) or 0 -if type(value) == 'string' then value = {value} end -if type(args.attribute) == 'string' then args.attribute = {args.attribute} end -if #value ~= #args.attribute then - print('Mismatch between number of attributes declared and number of changes declared') - return -end - -track = nil -if args.track then track = 'track' end - -for i,attribute in ipairs(args.attribute) do - if df.physical_attribute_type[attribute] then - current = unit.body.physical_attrs[attribute].value - elseif df.mental_attribute_type[attribute] then - current = unit.status.current_soul.mental_attrs[attribute].value - else - print('Invalid attribute id') - return - end - if args.fixed then - change = tonumber(value[i]) - elseif args.percent then - local percent = (100+tonumber(value[i]))/100 - change = current*percent - current - elseif args.set then - change = tonumber(value[i]) - current - else - print('No method for change defined') - return - end - dfhack.script_environment('functions/unit').changeAttribute(unit,attribute,change,dur,track) -end -if args.announcement then ---add announcement information -end \ No newline at end of file diff --git a/raw/scripts/unit/body-change.lua b/raw/scripts/unit/body-change.lua deleted file mode 100644 index 014a14f..0000000 --- a/raw/scripts/unit/body-change.lua +++ /dev/null @@ -1,98 +0,0 @@ ---unit/body-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'temperature', - 'category', - 'token', - 'flag', - 'all', - 'dur', - 'unit', - 'announcement', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[body-change.lua - Change the body parts of a unit (currently only supports changing temperature or setting on fire) - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -all \ - change all units body parts | - -category TYPE | - change body parts of specific category | - examples: | - TENTACLE | - HOOF_REAR | - HEAD | - -token TYPE | - change body parts by specific token | Must at least one of these arguments - examples: | - UB | - LB | - REYE | - -flag FLAG | - change body parts by specific flag | - examples: | - SIGHT | - LIMB | - SMALL / - -temperature # - temperature to set body parts to - special token: - fire - sets the body part on fire - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - unit/body-change -unit \\UNIT_ID -flag GRASP -temperature fire -dur 1000 - unit/body-change -unit \\UNIT_ID -category LEG_LOWER -temperature 8000 - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -if args.temperature then - strength = args.temperature - changeType = 'temperature' -else - print('No temperature declared') - return -end - -parts = {} -if args.all then - body = unit.body.body_plan.body_parts - for k,v in ipairs(body) do - parts[k] = k - end -elseif args.category then - parts = dfhack.script_environment('functions/unit').checkBodyCategory(unit,args.category) -elseif args.token then - parts = dfhack.script_environment('functions/unit').checkBodyToken(unit,args.token) -elseif args.flag then - parts = dfhack.script_environment('functions/unit').checkBodyFlag(unit,args.flag) -else - print('No body parts declared') - return -end - -dur = tonumber(args.dur) or 0 - -for _,part in ipairs(parts) do - dfhack.script_environment('functions/unit').changeBody(unit,part,changeType,strength,dur) -end \ No newline at end of file diff --git a/raw/scripts/unit/counter-change.lua b/raw/scripts/unit/counter-change.lua deleted file mode 100644 index b4a1be5..0000000 --- a/raw/scripts/unit/counter-change.lua +++ /dev/null @@ -1,113 +0,0 @@ ---unit/counter-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'token', - 'fixed', - 'percent', - 'set', - 'dur', - 'unit', - 'argument' -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/counter-change.lua - Change the value(s) of a unit - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -token TYPE - REQUIRED - token to be changed - valid types: - webbed - stunned - winded - unconscious - pain - nausea - dizziness - paralysis - numbness - fever - exhaustion - hunger - thirst - sleepiness - blood - infection - -fixed # \ - change token value by fixed amount | - -percent # | - change token value by percentage amount | Must have one and only one of these arguments - -set # | - set token value to this value / - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - unit/counter-change -unit \\UNIT_ID -fixed 10000 -token stunned -dur 10 - unit/counter-change -unit \\UNIT_ID -set [ 0 0 0 0 ] -token [ nausea dizziness numbness fever ] - unit/counter-change -unit \\UNIT_ID -percent \-100 -token blood - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -value = args.fixed or args.percent or args.set - -dur = tonumber(args.dur) or 0 -if type(value) == 'string' then value = {value} end -if type(args.token) == 'string' then args.token = {args.token} end -if #value ~= #args.token then - print('Mismatch between number of tokens declared and number of changes declared') - return -end - -for i,counter in ipairs(args.token) do - if (counter == 'webbed' or counter == 'stunned' or counter == 'winded' or counter == 'unconscious' - or counter == 'pain' or counter == 'nausea' or counter == 'dizziness') then - location = unit.counters - elseif (counter == 'paralysis' or counter == 'numbness' or counter == 'fever' or counter == 'exhaustion' - or counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness' or oounter == 'hunger_timer' - or counter == 'thirst_timer' or counter == 'sleepiness_timer') then - if (counter == 'hunger' or counter == 'thirst' or counter == 'sleepiness') then counter = counter .. '_timer' end - location = unit.counters2 - elseif counter == 'blood' or counter == 'infection' then - location = unit.body - else - print('Invalid counter token declared') - return - end - current = location[counter] - - if args.fixed then - change = tonumber(value[i]) - elseif args.percent then - local percent = (100+tonumber(value[i]))/100 - change = current*percent - current - elseif args.set then - change = tonumber(value[i]) - current - else - print('No method for change defined') - return - end - dfhack.script_environment('functions/unit').changeCounter(unit,counter,change,dur) - if args.announcement then ---add announcement information - end -end \ No newline at end of file diff --git a/raw/scripts/unit/propel.lua b/raw/scripts/unit/propel.lua deleted file mode 100644 index 07db558..0000000 --- a/raw/scripts/unit/propel.lua +++ /dev/null @@ -1,107 +0,0 @@ ---unit/propel.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unitSource', - 'unitTarget', - 'velocity', - 'fixed', - 'random', - 'relative', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/propel.lua - Flings a unit by turning them into a projectile - arguments: - -help - print this help message - -unitTarget id - REQUIRED - id of the unit to use turn into a projectile - -unitSource id - id of the unit to use to use for positioning - required if using -relative - -velocity [ # # # ] - velocity in x,y,z coordinates - DEFAULT 1,1,1 - -fixed \ - turns the unit into a projectile and gives the unit the specified velocity | - -random | - turns the unit into a projectile and gives the unit a random velocity up to +/- the specified velocity | Must have one and only one of these arguments - -relative | - turns the unit into a projectile and gives the unit the specified velocity relative to the -unitSource / - ]]) - return -end - -if args.fixed then - propelType = 'fixed' -elseif args.random then - propelType = 'random' -elseif args.relative then - propelType = 'relative' -else - propelType = 'fixed' -end - -if args.unitTarget and tonumber(args.unitTarget) then - unit = df.unit.find(tonumber(args.unitTarget)) -else - print('No target specified') - return -end -if args.unitSource and tonumber(args.unitSource) then - unitSource = df.unit.find(tonumber(args.unitSource)) -else - unitSource = nil -end - -strength = args.velocity or {0,0,0} -local vx = strength[1] -local vy = strength[2] -local vz = strength[3] - -if propelType == 'random' then - local rando = dfhack.random.new() - rollx = rando:unitrandom()*vx - rolly = rando:unitrandom()*vy - rollz = rando:unitrandom()*vz - resultx = math.floor(rollx) - resulty = math.floor(rolly) - resultz = math.floor(rollz) -elseif propelType == 'fixed' then - resultx = vx - resulty = vy - resultz = vz -elseif propelType == 'relative' then - if unitSource then - difx = unit.pos.x - unitSource.pos.x - dify = unit.pos.y - unitSource.pos.y - difz = unit.pos.z - unitSource.pos.z - totvel = math.sqrt(vx*vx+vy*vy+vz*vz) - totdis = math.sqrt(difx*difx+dify*dify+difz*difz) - dx = difx/totdis - dy = dify/totdis - dz = difz/totdis - if difx == 0 and dify == 0 and difz == 0 then - dx = (rando:random(3) - 1)/math.sqrt(3) - dy = (rando:random(3) - 1)/math.sqrt(3) - dz = (rando:random(3) - 1)/math.sqrt(3) - end - else - print('Relative velocity selected, but no source declared') - return - end - resultx = math.floor(totvel*dx+0.5) - resulty = math.floor(totvel*dy+0.5) - resultz = math.floor(totvel*dz+0.5) -else - print('Not a valid type') - return -end - -dfhack.script_environment('functions/unit').makeProjectile(unit,{resultx,resulty,resultz}) diff --git a/raw/scripts/unit/resistance-change.lua b/raw/scripts/unit/resistance-change.lua deleted file mode 100644 index 6896565..0000000 --- a/raw/scripts/unit/resistance-change.lua +++ /dev/null @@ -1,126 +0,0 @@ ---unit/resistance-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'resistance', - 'fixed', - 'percent', - 'set', - 'dur', - 'unit', - 'announcement', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/attribute-change.lua - Change the attribute(s) of a unit - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -resistance RESISTANCE_ID - resistance(s) to be changed - valid arguments: - PHYSICAL:ALL - PHYSICAL:BLUNT - PHYSICAL:PIERCE - PHYSICAL:SLASH - MAGICAL:ALL - MAGICAL:ELEMENTAL:ALL - MAGICAL:ELEMENTAL:FIRE - MAGICAL:ELEMENTAL:WATER - MAGICAL:ELEMENTAL:AIR - MAGICAL:ELEMENTAL:EARTH - MAGICAL:ELEMENTAL:SMOKE - MAGICAL:ELEMENTAL:ICE - MAGICAL:ELEMENTAL:STORM - MAGICAL:ELEMENTAL:METAL - MAGICAL:ARCANE:ALL - MAGICAL:ARCANE:FORCE - MAGICAL:ARCANE:TIME - MAGICAL:ARCANE:SPACE - MAGICAL:ARCANE:AEGIS - MAGICAL:MENTAL:ALL - MAGICAL:MENTAL:ILLUSION - MAGICAL:MENTAL:THOUGHT - MAGICAL:MENTAL:EMOTION - MAGICAL:MENTAL:MIND - MAGICAL:NATURE:ALL - MAGICAL:NATURE:ANIMAL - MAGICAL:NATURE:PLANT - MAGICAL:NATURE:GROUND - MAGICAL:NATURE:SPIRIT - MAGICAL:DIVINE:ALL - MAGICAL:DIVINE:LIGHT - MAGICAL:DIVINE:DARK - MAGICAL:DIVINE:VOID - MAGICAL:DIVINE:SHADOW - -fixed # \ - change attribute by fixed amount | - -percent # | - change attribute by percentage amount | Must have one and only one of these arguments - -set # | - set attribute to this value / - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - -announcement string - optional argument to create an announcement and combat log report - examples: - unit/attribute-change -unit \\UNIT_ID -fixed 100 -attribute STRENGTH - unit/attribute-change -unit \\UNIT_ID -percent [ 10 10 10 ] -attribute [ ENDURANCE TOUGHNESS WILLPOWER ] -dur 3600 - unit/attribute-change -unit \\UNIT_ID -set 5000 -attribute WILLPOWER -dur 1000 - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -value = args.fixed or args.percent or args.set - -dur = tonumber(args.dur) or 0 -if type(value) == 'string' then value = {value} end -if type(args.attribute) == 'string' then args.attribute = {args.attribute} end -if #value ~= #args.attribute then - print('Mismatch between number of attributes declared and number of changes declared') - return -end - -track = nil -if args.track then track = 'track' end - -for i,resistance in ipairs(args.resistance) do - array = split(resistance,':') - for i,entry in pairs(array) do - array[i] = string.lower(entry):gsub("^%l",string.upper) - end - resistance = "Resistances"..table.concat(array,':') - current = dfhack.script_environment('functions/misc').getCounter("UNIT:"..resistance..":Base",unit.id) - if args.fixed then - change = tonumber(value[i]) - elseif args.percent then - local percent = (100+tonumber(value[i]))/100 - change = current*percent - current - elseif args.set then - change = tonumber(value[i]) - current - else - print('No method for change defined') - return - end - dfhack.script_environment('functions/unit').changeResistance(unit,resistance,change,dur,track) -end -if args.announcement then ---add announcement information -end \ No newline at end of file diff --git a/raw/scripts/unit/skill-change.lua b/raw/scripts/unit/skill-change.lua deleted file mode 100644 index 4af2281..0000000 --- a/raw/scripts/unit/skill-change.lua +++ /dev/null @@ -1,107 +0,0 @@ ---unit/skill-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'skill', - 'fixed', - 'percent', - 'set', - 'dur', - 'unit', - 'announcment', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/skill-change.lua - Change the skill(s) of a unit - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -skill SKILL_TOKEN - REQUIRED - skill to be changed - -fixed # \ - change skill by fixed amount | - -percent # | - change skill by percentage amount | Must have one and only one of these arguments - -set # | - set skill to this value / - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - unit/skill-change -unit \\UNIT_ID -fixed 1 -skill ALCHEMY - unit/skill-change -unit \\UNIT_ID -set [ 0 0 0 ] -skill [ GRASP_STRIKE STANCE_STRIKE DODGER ] - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -value = args.fixed or args.percent or args.set - -dur = tonumber(args.dur) or 0 -if type(value) == 'string' then value = {value} end -if type(args.skill) == 'string' then args.skill = {args.skill} end -if #value ~= #args.skill then - print('Mismatch between number of skills declared and number of changes declared') - return -end - -track = nil -if args.track then track = 'track' end - -for i,skill in ipairs(args.skill) do - local skills = unit.status.current_soul.skills - local skillid = df.job_skill[skill] - local found = false - for i,x in ipairs(skills) do - if x.id == skillid then - found = true - token = x - current = token.rating - break - end - end - if not found then - utils.insert_or_update(unit.status.current_soul.skills,{new = true, id = skillid, rating = 0},'id') - skills = unit.status.current_soul.skills - for i,x in ipairs(skills) do - if x.id == skillid then - found = true - token = x - current = token.rating - break - end - end - end - - if args.fixed then - change = tonumber(value[i]) - elseif args.percent then - local percent = (100+tonumber(value[i]))/100 - change = current*percent - current - elseif args.set then - change = tonumber(value[i]) - current - else - print('No method for change declared') - return - end - dfhack.script_environment('functions/unit').changeSkill(unit,skill,change,dur,track) -end -if args.announcement then ---add announcement information -end \ No newline at end of file diff --git a/raw/scripts/unit/trait-change.lua b/raw/scripts/unit/trait-change.lua deleted file mode 100644 index ac813dc..0000000 --- a/raw/scripts/unit/trait-change.lua +++ /dev/null @@ -1,85 +0,0 @@ ---unit/trait-change.lua v2.0 - -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'trait', - 'fixed', - 'percent', - 'set', - 'dur', - 'unit', - 'announcement', - 'track', -}) -local args = utils.processArgs({...}, validArgs) - -if args.help then -- Help declaration - print([[unit/trait-change.lua - Change the trait(s) of a unit - arguments: - -help - print this help message - -unit id - REQUIRED - id of the target unit - -trait TRAIT_TOKEN - REQUIRED - trait to be changed - -fixed # \ - change trat by fixed amount | - -percent # | - change trait by percentage amount | Must have one and only one of these arguments - -set # | - set trait to this value / - -dur # - length of time, in in-game ticks, for the change to last - 0 means the change is permanent - DEFAULT: 0 - examples: - unit/trait-change -unit \\UNIT_ID -fixed \-10 -trait ANGER - unit/trait-change -unit \\UNIT_ID -set 100 -trait DEPRESSION - ]]) - return -end - -if args.unit and tonumber(args.unit) then - unit = df.unit.find(tonumber(args.unit)) -else - print('No unit selected') - return -end - -value = args.fixed or args.percent or args.set - -dur = tonumber(args.dur) or 0 -if type(value) == 'string' then value = {value} end -if type(args.trait) == 'string' then args.trait = {args.trait} end -if #value ~= #args.trait then - print('Mismatch between number of skills declared and number of changes declared') - return -end - -track = nil -if args.track then track = 'track' end - -for i,trait in ipairs(args.trait) do - current = unit.status.current_soul.personality.traits[trait] - - if args.fixed then - change = tonumber(value[i]) - elseif args.percent then - local percent = (100+tonumber(value[i]))/100 - change = current*percent - current - elseif args.set then - change = tonumber(value[i]) - current - else - print('No method for change declared') - return - end - dfhack.script_environment('functions/unit').changeTrait(unit,trait,change,dur,track) -end -if args.announcement then ---add announcement information -end \ No newline at end of file diff --git a/raw/scripts/wrapper.lua b/raw/scripts/wrapper.lua deleted file mode 100644 index 9a04454..0000000 --- a/raw/scripts/wrapper.lua +++ /dev/null @@ -1,177 +0,0 @@ -local utils = require 'utils' - -validArgs = validArgs or utils.invert({ - 'help', - 'unitSource', - 'unitTarget', - 'locTarget', - 'locCheck', - 'script', - 'chain', - 'value', - 'maxtargets', - 'delay', - 'radius', - 'target', - 'rclass', - 'rcreature', - 'rsyndrome', - 'rtoken', - 'rnoble', - 'rprofession', - 'rentity', - 'iclass', - 'icreature', - 'isyndrome', - 'itoken', - 'inoble', - 'iprofession', - 'ientity', - 'maxphysical', - 'maxmental', - 'maxskills', - 'maxtraits', - 'maxage', - 'maxspeed', - 'minphysical', - 'minmental', - 'minskills', - 'mintraits', - 'minage', - 'minspeed', - 'reflect', - 'silence', - 'center', -}) -local args = utils.processArgs({...}, validArgs) - -if not args.script then - print('No script provided to run') - return -end -if not string.find(args.script[1],' ') then args.script = {table.concat(args.script, ' ')} end - -if args.unitSource and tonumber(args.unitSource) and df.unit.find(tonumber(args.unitSource)) then - source = df.unit.find(tonumber(args.unitSource)) -else - print('No valid source unit declared') - return -end - --- Check if the casting unit is silenced -if args.silence then - if dfhack.script_environment('functions/unit').checkClass(source,args.silence) then - print('unit is prevented from using interaction (SILENCED)') - return - end -end - -args.chain = tonumber(args.chain) or 0 -args.maxTargets = tonumber(args.maxTargets) or 0 -args.delay = tonumber(args.delay) or 0 - -if ((args.unitTarget and tonumber(args.unitTarget) and df.unit.find(tonumber(args.unitTarget))) or args.center) and not args.locTarget then - center = target - - if args.center then - center = source - end - - for count = 0, args.chain, 1 do - if count >= 0 then - -- Step 1: Check for reflection - if args.reflect then - if dfhack.script_environment('functions/unit').checkClass(target,args.reflect) then - save = source - source = center - center = save - end - end - -- Step 2: Determine targets based on location and spell target - targetList,n = dfhack.script_environment('functions/wrapper').checkLocation(center,args.radius) - targetList,n = dfhack.script_environment('functions/wrapper').checkTarget(source,targetList,args.target) - -- Step 3: Determine eligible targets from list based on age/speed/attributes/skills/etc... - selected = {} - for n,unit in pairs(targetList) do - selected[n] = dfhack.script_environment('functions/wrapper').isSelected(source,unit,args) - end - -- Step 4: Pick targets from eligible list (between 1 and args.maxTargets) - targets,i = {},0 - for n,unit in pairs(targetList) do - if selected[n] then - i = i + 1 - targets[i] = unit - end - end - if i == 0 then return end - if args.maxTargets == 0 or args.maxTargets >= i then - targets = targets - else - targets = dfhack.script_environment('functions/misc').permute(targets) - targets = {selected(#targets-args.maxTargets+1,table.unpack(targets))} - end - -- Step 5: Run Scripts - for _,unit in ipairs(targets) do - for _,script in ipairs(args.script) do - script = script:gsub('\\TARGET',tostring(unit.id)) - script = script:gsub('\\SOURCE',tostring(source.id)) - script = script:gsub('\\CENTER',tostring(center.id)) - if args.value then - if type(args.value) ~= 'table' then args.value = {args.value} end - for n,equation in pairs(args.value) do - script = script:gsub('\\VALUE_'..tostring(n),dfhack.script_environment('functions/wrapper').getValue(equation,unit,source,center,targetList,selected)) - end - end - if args.delay == 0 then - dfhack.run_command(script) - else - dfhack.script_environment('persist-delay').delayCommand(script) - end - end - end - center = targets[1] - end - end -elseif args.locTarget then - if args.unitTarget and tonumber(args.unitTarget) and df.unit.find(tonumber(args.unitTarget)) then - center = df.unit.find(tonumber(args.unitTarget)) - else - center = source - end - if type(args.locTarget) == 'table' then - if args.radius then - positions = dfhack.script_environment('functions/map').getFillPosition(args.locTarget,args.radius) - else - positions = {{x=args.locTarget[1],y=args.locTarget[2],z=args.locTarget[3]}} - end - elseif tonumber(args.locTarget) then - if args.radius then - positions = dfhack.script_environment('functions/map').getFillPosition(df.unit.find(tonumber(args.locTarget)).pos,args.radius) - else - positions = {df.unit.find(tonumber(args.locTarget)).pos} - end - elseif type(args.locTarget) == 'string' then - positions = dfhack.script_environment('functions/map').getPositionPlan(args.locTarget,center,source) - end - if args.locCheck == 'unit' then - elseif args.locCheck == 'tile' then - end - for _,pos in ipairs(positions) do - for _,script in ipairs(args.script) do - script = script:gsub('\\LOCATION',"[ "..tostring(pos.x).." "..tostring(pos.y).." "..tostring(pos.z).." ]") - script = script:gsub('\\TARGET',"[ "..tostring(center.pos.x).." "..tostring(center.pos.y).." "..tostring(center.pos.z).." ]") - script = script:gsub('\\SOURCE',"[ "..tostring(source.pos.x).." "..tostring(source.pos.y).." "..tostring(source.pos.z).." ]") - if args.value then - if type(args.value) ~= 'table' then args.value = {args.value} end - for n,equation in pairs(args.value) do - script = script:gsub('\\VALUE_'..tostring(n),dfhack.script_environment('functions/wrapper').getValue(equation,unit,source,center,targetList,selected)) - end - end - if args.delay == 0 then - dfhack.run_command(script) - else - dfhack.script_environment('persist-delay').delayCommand(script) - end - end - end -end \ No newline at end of file