Files
igncore/modules/standard/alien/alien_bio_controller.py
T

230 lines
10 KiB
Python

import math
from core.chat_blob import ChatBlob
from core.command_param_types import Any, Item, Int
from core.decorators import instance, command
from core.text import Text
from core.translation_service import TranslationService
@instance()
class AlienBioController:
def __init__(self):
self.ofab_armor_types = ["64", "295", "468", "935"]
self.ofab_weapon_types = ["18", "34", "687", "812"]
self.alien_armor_types = ["mutated", "pristine"]
self.alien_weapon_types = ["1", "2", "3", "4", "5", "12", "13", "48", "76", "112", "240", "880", "992"]
def inject(self, registry):
self.db = registry.get_instance("db")
self.text: Text = registry.get_instance("text")
self.util = registry.get_instance("util")
self.items_controller = registry.get_instance("items_controller")
self.command_alias_service = registry.get_instance("command_alias_service")
self.ts: TranslationService = registry.get_instance("translation_service")
self.getresp = self.ts.get_response
def pre_start(self):
self.db.load_sql_file(self.module_dir + "/sql/alien_weapons.sql", pre_optimized=True)
self.db.create_view("alien_weapon_specials")
self.db.create_view("alien_weapons")
def start(self):
self.command_alias_service.add_alias("clump", "bio")
self.command_alias_service.add_alias("b", "bio")
@command(command="bio", params=[Item("bio_material")], access_level="member",
description="Show info about Kyr'Ozch Bio-Material")
def bio_command(self, request, item):
high_id = item.high_id
ql = item.ql
if high_id == 247707 or high_id == 247708:
bio_type = "1"
elif high_id == 247709 or high_id == 247710:
bio_type = "2"
elif high_id == 247717 or high_id == 247718:
bio_type = "3"
elif high_id == 247711 or high_id == 247712:
bio_type = "4"
elif high_id == 247713 or high_id == 247714:
bio_type = "5"
elif high_id == 247715 or high_id == 247716:
bio_type = "12"
elif high_id == 247719 or high_id == 247720:
bio_type = "13"
elif high_id == 288699 or high_id == 288700:
bio_type = "48"
elif high_id == 247697 or high_id == 247698:
bio_type = "76"
elif high_id == 247699 or high_id == 247700:
bio_type = "112"
elif high_id == 247701 or high_id == 247702:
bio_type = "240"
elif high_id == 247703 or high_id == 247704:
bio_type = "880"
elif high_id == 247705 or high_id == 247706:
bio_type = "992"
elif high_id == 247102 or high_id == 247103:
bio_type = "pristine"
elif high_id == 247104 or high_id == 247105:
bio_type = "mutated"
elif high_id == 247764 or high_id == 254804:
bio_type = "serum"
else:
bio_type = "unknown"
bio_info = self.get_bio_info(bio_type, ql)
if bio_info:
return bio_info
else:
return "Bio-Material type unknown or not a bio-material."
@command(command="bioinfo", params=[], access_level="member",
description="Show list of Kyr'Ozch Bio-Material types")
def bioinfo_list_command(self, request):
return ChatBlob(self.getresp("module/alien", "bioinfo_list_title"),
self.getresp("module/alien", "bioinfo_list", {
"ofab_armor": self.get_type_blob(self.ofab_armor_types),
"ofab_weap": self.get_type_blob(self.ofab_weapon_types),
"ai_armor": self.get_type_blob(self.alien_armor_types),
"ai_weap": self.get_type_blob(self.alien_weapon_types),
"serum": self.get_type_blob(["serum"]),
}))
def get_type_blob(self, bio_types):
blob = ""
for bio_type in bio_types:
blob += self.text.make_tellcmd(bio_type, "bioinfo %s" % bio_type) + "\n"
return blob
@command(command="bioinfo", params=[Any("bio_type"), Int("ql", is_optional=True)], access_level="member",
description="Show info about a bio-material type")
def bioinfo_show_command(self, request, bio_type, ql):
ql = ql or 300
bio_info = self.get_bio_info(bio_type, ql)
if bio_info:
return bio_info
else:
return self.getresp("module/alien", "bioinfo_unknown_type", {"type": bio_type})
def get_bio_info(self, bio_type, ql):
if bio_type in self.ofab_armor_types:
return self.ofab_armor_bio(bio_type, ql)
elif bio_type in self.ofab_weapon_types:
return self.ofab_weapon_bio(bio_type, ql)
elif bio_type in self.alien_armor_types:
return self.alien_armor_bio(bio_type, ql)
elif bio_type in self.alien_weapon_types:
return self.alien_weapon_bio(bio_type, ql)
elif bio_type == "serum":
return self.serum_bio(ql)
else:
return None
def ofab_armor_bio(self, bio_type, ql):
name = "Kyr'Ozch Bio-Material - Type %s" % bio_type
data = self.db.query("SELECT * FROM ofab_armor_type WHERE type = ?", [bio_type])
item = self.items_controller.find_by_name(name, ql)
upgrades = ""
for row in data:
upgrades += self.text.make_tellcmd(row.profession, "ofabarmor %s" % row.profession) + "\n"
return ChatBlob(self.getresp("module/alien", "bioinfo_unknown_type",
{"type": bio_type, "ql": ql}),
self.getresp("module/alien", "ofab_armor_bio",
{"type": bio_type, **self.text.generate_item(item, ql), "upgrades": upgrades}))
def ofab_weapon_bio(self, bio_type, ql):
name = "Kyr'Ozch Bio-Material - Type %s" % bio_type
data = self.db.query("SELECT * FROM ofab_weapons WHERE type = ?", [bio_type])
blob = self.display_item(name, ql) + "\n\n"
blob += "<highlight>Upgrades Ofab Weapons for:</highlight>\n"
for row in data:
blob += self.text.make_tellcmd("Ofab %s Mk 1" % row.name, "ofabweapons %s" % row.name) + "\n"
return ChatBlob("%s (QL %d)" % (name, ql), blob)
def alien_armor_bio(self, bio_type, ql):
min_ql = math.floor(ql * 0.8)
if ql <= 240:
max_ql = math.floor(ql / 0.8)
else:
max_ql = 300
cl = math.floor(min_ql * 4.5)
pharma = math.floor(ql * 6)
nano_prog = math.floor(min_ql * 6)
psyco = math.floor(ql * 6)
max_psyco = math.floor(max_ql * 6)
ts_bio = math.floor(ql * 4.5)
if bio_type == "mutated":
name = "Mutated Kyr'Ozch Bio-Material"
chem = math.floor(ql * 7)
chem_msg = "7 * QL"
extra_info = self.getresp("module/alien", "alien_armor_bio_extra_info_mutated")
elif bio_type == "pristine":
name = "Pristine Kyr'Ozch Bio-Material"
chem = math.floor(ql * 4.5)
chem_msg = "4.5 * QL"
extra_info = self.getresp("module/alien", "alien_armor_bio_extra_info_pristine")
else:
return None
return ChatBlob("%s (QL %d)" % (name, ql),
self.getresp("module/alien", "alien_armor_bio",
{"item": self.display_item(name, ql),
"ee_cl_req": ts_bio, "ql": ql, "cl_req": cl, "chem_req": chem,
"chem_info": chem_msg, "chem_extra_info": extra_info, "nano_prog_req": nano_prog,
"pt_req": pharma, "psyco_req": psyco, "min_ql": min_ql, "max_ql": max_ql,
"max_psyco": max_psyco}))
def alien_weapon_bio(self, bio_type, ql):
name = "Kyr'Ozch Bio-Material - Type %s" % bio_type
# Ensures that the maximum AI weapon that combines into doesn't go over QL 300
# when the user presents a QL 271+ bio-material
max_ai_type = math.floor(ql / 0.9)
if max_ai_type > 300 or max_ai_type < 1:
max_ai_type = 300
specials = self.db.query_single("SELECT specials FROM alien_weapon_specials WHERE type = ?",
[bio_type]).specials
data = self.db.query("SELECT * FROM alien_weapons WHERE type = ?", [bio_type])
display_blob = ""
for row in data:
display_blob += self.display_item(row.name, max_ai_type) + "\n"
return ChatBlob("%s (QL %d)" % (name, ql),
self.getresp("module/alien", "alien_weapon_bio",
{"item_display": self.display_item(name, ql),
"ee_cl_req": math.floor(ql * 4.5),
"specials": specials,
"display_blob": display_blob,
"weapon_info": self.get_weapon_info(max_ai_type)
}))
def serum_bio(self, ql):
name = "Kyr'Ozch Viral Serum"
return ChatBlob("%s (QL %d)" % (name, ql),
self.getresp("module/alien", "serum_bio",
{"item_display": self.display_item(name, ql),
"ee_cl_req": math.floor(ql * 4.5),
"pt_req": (math.floor(ql * 3.5) if math.floor(ql * 3.5) > 400 else 400),
"chem_me_req": (math.floor(ql * 4) if math.floor(ql * 4) > 400 else 400),
"cl_req": math.floor(ql * 5)
}))
def get_weapon_info(self, ql):
return self.getresp("module/alien", "weapon_info",
{"ql": ql,
"bump": ("" if ql == 300 else self.getresp("module/alien", "weapon_bump")),
"me_ws_req": math.floor(ql * 6)})
def display_item(self, name, ql):
return self.text.format_item(self.items_controller.find_by_name(name, ql), ql)