Introduction
Statistics
Contact
Development
Disclaimer
Help
mport sys;
mport random;
mport math;
ef total_spite(num_dice):
dice_array = range(num_dice); # Initialize array
dice_array = [random.randint(1,6) for die in dice_array];
total = 0;
spite = 0;
for die in dice_array:
total = total+die;
if (die==6):
spite = spite + 1;
return (total,spite);
um_trials = 10;
f (len(sys.argv) == 1):
print "Usage: python tnt_combat.py <combat_file> [number trials]"
sys.exit(0)
ombat_filename = sys.argv[1];
f (len(sys.argv)>2):
num_trials=int(sys.argv[2]);
n_lost = range(num_trials); # Hold CN lost for each trial
ounds_fighting = range(num_trials); # Count how many rounds it takes
c_lost = range(num_trials); # How many times PCs lost
pc_lost = range(num_trials); # How many times monster lost
Parse combat file
ombat_file = open(combat_filename, "r");
ine_idx = 0;
c_dice = 0;
c_adds = 0;
c_armor = 0;
c_cn = 0;
pc_mr = 0;
pc_armor = 0;
or line in combat_file:
if line.startswith("#"): # Comment line
continue;
curr_line = line.split(","); # Comma-separated
if (line_idx == 0): # PC Line
pc_dice = int(curr_line[0]);
pc_adds = int(curr_line[1]);
pc_armor = int(curr_line[2]);
pc_cn = int(curr_line[3]);
line_idx = line_idx + 1 ; # Next parse NPC line
elif (line_idx == 1):
npc_mr = int(curr_line[0]);
npc_armor = int(curr_line[1]);
ombat_file.close();
or combat_idx in range(num_trials): # Iterate over all trials
cn_lost[combat_idx] = 0; # Blank out CN lost
rounds_fighting[combat_idx] = 0; # Blank out number of rounds
pc_lost[combat_idx] = 0;
npc_lost[combat_idx] = 0; # Blank out losing record
round_idx = 0; # No rounds yet
curr_pc_dice = pc_dice;
curr_pc_adds = pc_adds;
curr_pc_armor = pc_armor;
curr_pc_cn = pc_cn;
curr_npc_mr = npc_mr;
curr_npc_armor = npc_armor;
curr_npc_dice = (curr_npc_mr / 10)+1;
print "*************"
while ((curr_pc_cn > 0) and (curr_npc_mr > 0)):
round_idx = round_idx+1; # Increment round counter
print "Round {}".format(round_idx);
print "************"
curr_npc_adds = int(math.ceil(curr_npc_mr/2.0));
pc_roll = total_spite(curr_pc_dice);
pc_hpt = pc_roll[0]+curr_pc_adds;
pc_spite = pc_roll[1];
npc_roll = total_spite(curr_npc_dice);
npc_hpt = npc_roll[0]+curr_npc_adds;
npc_spite = npc_roll[1];
print "PCs rolled: {}\nNPCs rolled: {}".format(pc_roll,npc_roll);
print "PC, NPC HPTs are: {},{}".format(pc_hpt, npc_hpt);
# Apply spite damage
cn_lost[combat_idx] += npc_spite; # Log damage taken
curr_pc_cn = curr_pc_cn - npc_spite;
curr_npc_mr = curr_npc_mr - pc_spite;
# Now compute HPT losses
pc_margin = pc_hpt - npc_hpt;
print "HPT Margin: {}".format(pc_margin);
if (pc_margin > 0): # Players won round
npc_damage = pc_margin - curr_npc_armor;
if (npc_damage > 0): # Exceeded armor
print "Net NPC damage: {}".format(npc_damage);
curr_npc_mr = curr_npc_mr - npc_damage;
else:
print "No net damage to NPC."
elif (pc_margin < 0): #Players lost round
pc_damage = (-pc_margin)-curr_pc_armor; # Need to invert HPT differe…
if (pc_damage > 0): # Exceeded armor
print "Net PC damage: {}".format(pc_damage);
curr_pc_cn = curr_pc_cn - pc_damage;
cn_lost[combat_idx] += pc_damage;
else:
print "No net damage to PCs."
else:
pass # Equal HPTs, so do nothing
print "New Health: {},{}".format(curr_pc_cn, curr_npc_mr);
if (curr_pc_cn <= 0):
pc_lost[combat_idx] = 1;
print "PC Lost";
if (curr_npc_mr <= 0):
npc_lost[combat_idx] = 1;
print "Monster Lost";
rounds_fighting[combat_idx] = round_idx;
rint "*******************\nSummary\n*****************"
Now gather statistics
otal_lost = 0;
otal_won = 0;
oth_lost = 0;
inning_cn_lost_sum = 0;
ounds_fighting_sum = 0;
or combat_idx in range(num_trials):
if ((pc_lost[combat_idx] !=0) and (npc_lost[combat_idx] != 0)):
both_lost = both_lost + 1;
if ((pc_lost[combat_idx] != 0) and (npc_lost[combat_idx] == 0)): # PC Lost
total_lost = total_lost + 1;
if (pc_lost[combat_idx] == 0): # PC Won
total_won = total_won + 1; # Increment count
winning_cn_lost_sum = winning_cn_lost_sum + cn_lost[combat_idx];
rounds_fighting_sum = rounds_fighting_sum + rounds_fighting[combat_idx];
rint "Both Lost: {}, %{}".format(both_lost, int(((both_lost+0.0)/num_trials)*10…
rint "PC Lost: {}, %{}".format(total_lost, int(((total_lost+0.0)/num_trials)*10…
rint "PC Won: {}, %{}".format(total_won, int(((total_won+0.0)/num_trials)*100));
f (total_won > 0):
print "Average Damage Taken on Win: {}".format((winning_cn_lost_sum+0.0)/tot…
print "Average Rounds Fought for Win: {}".format((rounds_fighting_sum+0.0)/t…