summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorjj2012-08-11 22:25:40 +0200
committerjj2012-08-11 22:25:40 +0200
commit85f1a6fa6ac2248f3d4b867c70e220fbed55c651 (patch)
tree0b7cb574deafab1d08f6e752e4360bf14f40a41a /scripts
parent2362bb8eea2d45352fc42c995d8aa2d0fb2b4689 (diff)
downloaddfhack-85f1a6fa6ac2248f3d4b867c70e220fbed55c651.tar.gz
dfhack-85f1a6fa6ac2248f3d4b867c70e220fbed55c651.tar.bz2
dfhack-85f1a6fa6ac2248f3d4b867c70e220fbed55c651.tar.xz
add fix/loyaltycascade script
Diffstat (limited to 'scripts')
-rw-r--r--scripts/fix/loyaltycascade.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/scripts/fix/loyaltycascade.rb b/scripts/fix/loyaltycascade.rb
new file mode 100644
index 00000000..632f8024
--- /dev/null
+++ b/scripts/fix/loyaltycascade.rb
@@ -0,0 +1,51 @@
+# script to fix loyalty cascade, when you order your militia to kill friendly units
+
+def fixunit(u)
+ return if u.race != df.ui.race_id or u.civ_id != df.ui.civ_id
+ links = u.hist_figure_tg.entity_links
+ fixed = false
+
+ if i1 = links.index { |l|
+ l.kind_of?(DFHack::HistfigEntityLinkFormerMemberst) and
+ l.entity_id == df.ui.civ_id
+ } and i2 = links.index { |l|
+ l.kind_of?(DFHack::HistfigEntityLinkEnemyst) and
+ l.entity_id == df.ui.civ_id
+ }
+ fixed = true
+ i1, i2 = i2, i1 if i1 > i2
+ links.delete_at i2
+ links.delete_at i1
+ links << DFHack::HistfigEntityLinkMemberst.cpp_new(:entity_id => df.ui.civ_id, :link_strength => 100)
+ df.add_announcement "fixloyalty: #{u.name} is now a member of #{df.ui.civ_tg.name} again"
+ end
+
+ if i1 = links.index { |l|
+ l.kind_of?(DFHack::HistfigEntityLinkFormerMemberst) and
+ l.entity_id == df.ui.group_id
+ } and i2 = links.index { |l|
+ l.kind_of?(DFHack::HistfigEntityLinkEnemyst) and
+ l.entity_id == df.ui.group_id
+ }
+ fixed = true
+ i1, i2 = i2, i1 if i1 > i2
+ links.delete_at i2
+ links.delete_at i1
+ links << DFHack::HistfigEntityLinkMemberst.cpp_new(:entity_id => df.ui.group_id, :link_strength => 100)
+ df.add_announcement "fixloyalty: #{u.name} is now a member of #{df.ui.group_tg.name} again"
+ end
+
+ fixed
+end
+
+fixed = 0
+df.unit_citizens.each { |u|
+ fixed += 1 if fixunit(u)
+}
+
+if fixed > 0
+ df.popup_announcement "Fixed a loyalty cascade, you should save and reload now"
+ puts "loyalty cascade fixed (#{fixed} dwarves), you should save and reload"
+else
+ puts "no loyalty cascade found"
+end