Advertisement
Guest User

Untitled

a guest
Jun 24th, 2014
1,205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- ui_itm_cooking
  2. -- ponney68
  3. --[[
  4. Copyright (C) 2012 Alundaio
  5. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License-]]
  6. --]]
  7. -------------------------------------------------------------------
  8. class "load_item" (CUIListBoxItem)
  9. function load_item:__init(height) super(height)
  10.     self.file_name      = "filename"
  11.  
  12.     self:SetTextColor(GetARGB(255, 170, 170, 170))
  13.  
  14.     self.fn = self:GetTextItem()
  15.     self.fn:SetFont(GetFontLetterica18Russian())
  16.     self.fn:SetEllipsis(true)
  17. end
  18.  
  19. function load_item:__finalize()
  20. end
  21.  
  22. -------------------------------------------------------------------
  23. class "cooking_ui" (CUIScriptWnd)
  24.  
  25. function cooking_ui:__init(owner,section) super()
  26.     self.owner = owner
  27.     self.section = section
  28.  
  29.     self.use_parts = alun_utils.read_from_ini(nil,section,"cooking_use_parts","bool",false)
  30.     self.cooking_type = alun_utils.read_from_ini(nil,section,"cooking_type","string","weapon")
  31.  
  32.     self.cooking_only = alun_utils.parse_list(nil,section,"cooking_only",true)
  33.     self.cooking_refuse = alun_utils.parse_list(nil,section,"cooking_refuse",true)
  34.  
  35.     self.parts_include = alun_utils.parse_list(nil,section,"cooking_parts_include",true)
  36.     self.parts_exclude = alun_utils.parse_list(nil,section,"cooking_parts_exclude",true)
  37.  
  38.     self.use_actor_effects = alun_utils.read_from_ini(nil,section,"cooking_use_actor_effects","bool",false)
  39.  
  40.     self:InitControls()
  41.     self:InitCallBacks()
  42. end
  43.  
  44. function cooking_ui:__finalize()
  45. end
  46.  
  47. function cooking_ui:FillList()
  48.     self.list_box:RemoveAll()
  49.  
  50.     local function fill_list(actor,obj)
  51.         if (obj) and (self.cooking_only and self.cooking_only[obj:section()]) or (self.cooking_refuse == nil) or (self.cooking_refuse[obj:section()] == nil) then
  52.             if (self.cooking_type == "fuel" and alun_utils.item_is_explosive(obj)) then
  53.  
  54.                     self:AddItemToList(obj,self.list_box)
  55.  
  56.             end
  57.         end
  58.     end
  59.  
  60.     db.actor:iterate_inventory(fill_list,db.actor)
  61. end
  62.  
  63. function cooking_ui:FillPartsList()
  64.     self.list_box_parts:RemoveAll()
  65.  
  66.     if self.list_box:GetSize()==0 then return end
  67.  
  68.     local item = self.list_box:GetSelectedItem()
  69.     if not (item) then
  70.         return
  71.     end
  72.  
  73.     local obj = level.object_by_id(item.item_id)
  74.     local function fill_list(actor,itm)
  75.         if (itm and itm:id() ~= item.item_id) then
  76.             if (self.parts_include and self.parts_include[itm:section()]) or (self.parts_exclude == nil and string.find(obj:section(),itm:section())) or (self.parts_exclude and self.parts_exclude[itm:section()] == nil and string.find(obj:section(),itm:section())) then
  77.                 self:AddItemToList(itm,self.list_box_parts,alun_utils.read_from_ini(nil,itm:section(),"float",nil))
  78.             end
  79.         end
  80.     end
  81.  
  82.     db.actor:iterate_inventory(fill_list,db.actor)
  83. end
  84.  
  85. function cooking_ui:InitControls()
  86.     self:SetWndRect         (Frect():set(0,0,1024,768))
  87.  
  88.     self:SetAutoDelete(true)
  89.  
  90.     self.xml                = CScriptXmlInit()
  91.     local ctrl
  92.     self.xml:ParseFile          ("ui_itm_main.xml")
  93.  
  94.     ctrl                    = CUIWindow()
  95.     self.xml:InitWindow         ("itm_cooking:file_item:main",0,ctrl)
  96.  
  97.     self.file_item_main_sz  = vector2():set(ctrl:GetWidth(),ctrl:GetHeight())
  98.  
  99.     self.xml:InitWindow         ("itm_cooking:file_item:fn",0,ctrl)
  100.     self.file_item_fn_sz    = vector2():set(ctrl:GetWidth(),ctrl:GetHeight())
  101.  
  102.     self.xml:InitWindow         ("itm_cooking:file_item:fd",0,ctrl)
  103.     self.file_item_fd_sz    = vector2():set(ctrl:GetWidth(),ctrl:GetHeight())
  104.  
  105.     self.form               = self.xml:InitStatic("itm_cooking:form",self)
  106.     --self.form:SetWndPos(vector2():set(device().width/2-(self.form:GetWidth()+70), device().height/2 - self.form:GetHeight()))
  107.     self.form:SetWndPos(vector2():set(0, 0))
  108.  
  109.     -- Background for forms
  110.     --self.xml:InitStatic("itm_cooking:form:list_background",self.form)
  111.  
  112.     if (self.use_parts) then
  113.         --self.xml:InitStatic("itm_cooking:form:list_parts_background",self.form)
  114.     end
  115.  
  116.     -- Item picture
  117.     self.picture            = self.xml:InitStatic("itm_cooking:form:icon",self.form)
  118.     self.picture_parts      = self.xml:InitStatic("itm_cooking:form:icon_parts",self.form)
  119.  
  120.     -- cooking tool picture
  121.     self.pic = self.xml:InitStatic("itm_cooking:form:icon_tool",self.form)
  122.  
  123.     local inv_grid_width = alun_utils.read_from_ini(ini,self.section,"inv_grid_width","float",0)
  124.     local inv_grid_height = alun_utils.read_from_ini(ini,self.section,"inv_grid_height","float",0)
  125.     local inv_grid_x = alun_utils.read_from_ini(ini,self.section,"inv_grid_x","float",0)
  126.     local inv_grid_y = alun_utils.read_from_ini(ini,self.section,"inv_grid_y","float",0)
  127.  
  128.     local x1 = inv_grid_x*50
  129.     local y1 = inv_grid_y*50
  130.  
  131.     local w = inv_grid_width*50
  132.     local h = inv_grid_height*50
  133.  
  134.     local x2 = x1 + w
  135.     local y2 = y1 + h
  136.  
  137.     local w,h = w,h
  138.     if (utils.is_widescreen()) then
  139.     w,h = w/1.5,h/1.2
  140.     else
  141.     w,h = w/1.3,h/1.3
  142.     end
  143.     self.pic:InitTexture("ui\\ui_icon_equipment")
  144.     self.pic:SetTextureRect(Frect():set(x1,y1,x2,y2))
  145.     self.pic:SetWndSize(vector2():set(w,h))
  146.  
  147.     if not (self.pic.x) then
  148.         local pos = self.pic:GetWndPos()
  149.         local posform = self.form:GetWndPos()
  150.         self.pic.x = pos.x + posform.x
  151.         self.pic.y = pos.y + posform.y
  152.     end
  153.  
  154.     self.pic:SetWndPos(vector2():set(self.pic.x-w/2, self.pic.y-h/2))
  155.  
  156.     -- Caption
  157.     self.caption_parts      = self.xml:InitTextWnd("itm_cooking:form:caption_parts",self.form)
  158.     self.caption_cooking        = self.xml:InitTextWnd("itm_cooking:form:caption_cooking",self.form)
  159.  
  160.     -- List Box
  161.     self.xml:InitFrame          ("itm_cooking:form:list_frame",self.form)
  162.  
  163.     self.list_box           = self.xml:InitListBox("itm_cooking:form:list",self.form)
  164.  
  165.     self.list_box:ShowSelectedItem  (true)
  166.     self:Register           (self.list_box, "list_window")
  167.  
  168.     if (self.use_parts) then
  169.         -- Parts List Box
  170.         self.list_pos = self.list_box:GetWndPos()
  171.  
  172.         self.list_box_parts         = self.xml:InitListBox("itm_cooking:form:list_parts",self.form)
  173.         --self.list_box_parts:SetWndPos(vector2():set(self.list_pos.x+self.list_box:GetWidth()+5, self.list_pos.y))
  174.  
  175.         local frame = self.xml:InitFrame("itm_cooking:form:list_frame_parts",self.form)
  176.         --frame:SetWndPos(vector2():set(self.list_pos.x+self.list_box:GetWidth()+5, self.list_pos.y))
  177.  
  178.         self.list_box_parts:ShowSelectedItem(true)
  179.         self:Register(self.list_box_parts, "list_window_parts")
  180.     else
  181.         --self.form:SetWndSize(vector2():set(self.list_box:GetWidth()+35, self.form:GetHeight()))
  182.     end
  183.     -- Button cooking
  184.     ctrl                    = self.xml:Init3tButton("itm_cooking:form:btn_cooking", self.form)
  185.     self:Register           (ctrl, "button_cooking")
  186.  
  187.     -- Button Cancel
  188.     ctrl = self.xml:Init3tButton    ("itm_cooking:form:btn_cancel", self.form)
  189.     self:Register           (ctrl, "button_back")
  190. end
  191.  
  192. function cooking_ui:InitCallBacks()
  193.     self:AddCallback("button_cooking",      ui_events.BUTTON_CLICKED,         self.OnButton_cooking,            self)
  194.     self:AddCallback("button_back",     ui_events.BUTTON_CLICKED,             self.OnButton_back_clicked,   self)
  195.  
  196.     self:AddCallback("list_window", ui_events.LIST_ITEM_CLICKED,              self.OnListItemClicked,       self)
  197.     self:AddCallback("list_window", ui_events.WINDOW_LBUTTON_DB_CLICK,        self.OnListItemDbClicked,     self)
  198.  
  199.     self:AddCallback("list_window_parts", ui_events.LIST_ITEM_CLICKED,        self.OnPartsListItemClicked,      self)
  200.     self:AddCallback("list_window_parts", ui_events.WINDOW_LBUTTON_DB_CLICK,  self.OnPartsListItemDbClicked,    self)
  201. end
  202.  
  203. function cooking_ui:OnPartsListItemClicked()
  204.     if self.list_box_parts:GetSize()==0 then return end
  205.  
  206.     local item = self.list_box_parts:GetSelectedItem()
  207.     if not (item) then
  208.         self.picture_parts:SetTextureRect(Frect():set(0,0,0,0))
  209.         self.caption_parts:SetText("")
  210.         return
  211.     end
  212.  
  213.     local se_item = item.item_id and alife():object(item.item_id)
  214.     if (se_item == nil or not db.actor:object(se_item:section_name())) then
  215.         self.list_box_parts:RemoveItem(item)
  216.         return
  217.     end
  218.  
  219.     local sec = se_item:section_name()
  220.  
  221.     local w,h = item.width,item.height
  222.     if (utils.is_widescreen()) then
  223.     w,h = item.width/1.5,item.height/1.2
  224.     else
  225.     w,h = item.width/1.2,item.height/1.2
  226.     end
  227.     self.picture_parts:InitTexture("ui\\ui_icon_equipment")
  228.     self.picture_parts:SetTextureRect(Frect():set(item.x1,item.y1,item.x2,item.y2))
  229.     self.picture_parts:SetWndSize(vector2():set(w,h))
  230.  
  231.     if not (self.picture_parts.x) then
  232.         local pos = self.picture_parts:GetWndPos()
  233.         self.picture_parts.x = pos.x
  234.         self.picture_parts.y = pos.y
  235.     end
  236.  
  237.     self.picture_parts:SetWndPos(vector2():set(self.picture_parts.x-w/2, self.picture_parts.y-h/2))
  238.  
  239.     self.caption_parts:SetText(string.format("Selected (x%d)",self:GetPartCount(sec)))
  240.  
  241. end
  242.  
  243. function cooking_ui:OnPartsListItemDbClicked()
  244.     self:OnButton_cooking()
  245. end
  246.  
  247. function cooking_ui:OnListItemClicked()
  248.     if self.list_box:GetSize()==0 then return end
  249.  
  250.     local item = self.list_box:GetSelectedItem()
  251.  
  252.     if not (item) then
  253.         self.picture:SetTextureRect(Frect():set(0,0,0,0))
  254.         return
  255.     end
  256.  
  257.     local se_item = alife():object(item.item_id)
  258.     if (se_item == nil or not db.actor:object(se_item:section_name())) then
  259.         self.list_box:RemoveItem(item)
  260.         return
  261.     end
  262.  
  263.     local w,h = item.width,item.height
  264.     if (utils.is_widescreen()) then
  265.     w,h = item.width/1.5,item.height/1.2
  266.     else
  267.     w,h = item.width/1.2,item.height/1.2
  268.     end
  269.     self.picture:InitTexture("ui\\ui_icon_equipment")
  270.     self.picture:SetTextureRect(Frect():set(item.x1,item.y1,item.x2,item.y2))
  271.     self.picture:SetWndSize(vector2():set(w,h))
  272.  
  273.     if not (self.picture.x) then
  274.         local pos = self.picture:GetWndPos()
  275.         self.picture.x = pos.x
  276.         self.picture.y = pos.y
  277.     end
  278.  
  279.     self.picture:SetWndPos(vector2():set(self.picture.x-w/2, self.picture.y-h/2))
  280.  
  281.     self.caption_cooking:SetText(string.format("Selected (x%d)",self:GetFuelCharges(se_item)))
  282.  
  283.     if (self.use_parts) then
  284.         self.picture_parts:SetTextureRect(Frect():set(0,0,0,0))
  285.         self.caption_parts:SetText("")
  286.         self:FillPartsList()
  287.     end
  288. end
  289.  
  290. function cooking_ui:OnButton_back_clicked()
  291.     alife():create(self.section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
  292.     self:HideDialog()
  293. end
  294.  
  295. function cooking_ui:OnKeyboard(dik, keyboard_action)
  296.     CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
  297.     if (keyboard_action == ui_events.WINDOW_KEY_PRESSED) then
  298.         if (dik == DIK_keys.DIK_RETURN) then
  299.  
  300.         elseif (dik == DIK_keys.DIK_ESCAPE) then
  301.             self:OnButton_back_clicked()
  302.         end
  303.     end
  304.     return true
  305. end
  306.  
  307. -- Drengor - multi-cook
  308. function cooking_ui:GetPartCount(part_name)
  309.     local cnt = 0
  310.  
  311.     local function countparts(npc, item)
  312.         if item:section() == part_name then
  313.             cnt = cnt + 1
  314.         end
  315.     end
  316.  
  317.     db.actor:iterate_inventory(countparts, nil)
  318.  
  319.     alun_utils.printf("Counted %d %s",cnt,part_name);
  320.  
  321.     return cnt
  322. end
  323.  
  324. function cooking_ui:GetFuelCharges(fuel_item)
  325.     -- fuel_name begins with fuel type, and optionally has a 2-8 on the end indicating reduced charges
  326.     local fuel_name = fuel_item:section_name()
  327.     local last_char = fuel_name:byte(fuel_name:len())
  328.     local base_charges = 1
  329.     local charge_adjust = 0
  330.  
  331.     if(last_char > 49) and (last_char < 57) then
  332.         charge_adjust = last_char - 49
  333.     end
  334.  
  335.     if(alun_utils.startsWith(fuel_name,"kerosene")) then base_charges = 5 end
  336.     if(alun_utils.startsWith(fuel_name,"charcoal")) then base_charges = 3 end
  337.     if(alun_utils.startsWith(fuel_name,"explo_jerrycan_fuel"))  then base_charges = 8 end
  338.     if(alun_utils.startsWith(fuel_name,"explo_balon_gas"))  then base_charges = 8 end
  339.  
  340.     return base_charges - charge_adjust
  341. end
  342.  
  343. function cooking_ui:MakeFuelCharges(fuel_item,charges)
  344.     -- fuel_name begins with fuel type, and optionally has a 2-8 on the end indicating reduced charges, or _empty
  345.     local fuel_name = fuel_item:section_name()
  346.     local last_char = fuel_name:byte(fuel_name:len())
  347.     local base_charges = 1
  348.  
  349.     if(last_char > 49) and (last_char < 57) then
  350.         fuel_name = fuel_name:sub(1,fuel_name:len()-1)
  351.     end
  352.  
  353.     if(fuel_name == "kerosene") then base_charges = 5 end
  354.     if(fuel_name == "charcoal") then base_charges = 3 end
  355.     if(fuel_name == "explo_jerrycan_fuel") then base_charges = 8 end
  356.     if(fuel_name == "explo_balon_gas") then base_charges = 8 end
  357.  
  358.     if (charges > 0) then
  359.         fuel_name = string.format("%s%d",fuel_name,base_charges + 1 - charges)
  360.     else
  361.         fuel_name = string.format("%s%s",fuel_name,"_empty")
  362.     end
  363.  
  364.     alife():create(fuel_name, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  365. end
  366.  
  367. function cooking_ui:ConsumeFuel(fuel_item, charges)
  368.     local c = self:GetFuelCharges(fuel_item) - charges
  369.     local fuel_name = fuel_item:section_name()
  370.  
  371.     if(c > 0 or (alun_utils.startsWith(fuel_name,"explo_jerrycan_fuel") or alun_utils.startsWith(fuel_name,"explo_balon_gas"))) then
  372.         self:MakeFuelCharges(fuel_item,c)
  373.     end
  374.  
  375.     alife():release(fuel_item,true)
  376. end
  377.  
  378. function cooking_ui:ConsumePart(part, count)
  379.     local part_name = part:section_name()
  380.     local cnt = 0
  381.  
  382.     local function consumeparts(npc, item)
  383.         if cnt < count and item:section() == part_name then
  384.             alife():release(alife():object(item:id()),true)
  385.             cnt = cnt + 1
  386.         end
  387.     end
  388.  
  389.     db.actor:iterate_inventory(consumeparts, nil)
  390. end
  391.  
  392. function cooking_ui:CreateMeal(part_name,count)
  393.     for i=1,count,1 do
  394.         alife():create(part_name, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  395.     end
  396. end
  397. -- end Drengor - multi-cook
  398.  
  399. function cooking_ui:OnButton_cooking()
  400.     index = self.list_box_parts:GetSelectedIndex()
  401.     if (index ~= -1) then
  402.         item = self.list_box_parts:GetItemByIndex(index)
  403.         local se_parts = item and item.item_id and alife():object(item.item_id)
  404.         if not (se_parts) then
  405.             return
  406.         end
  407.     end
  408.  
  409.     local index = self.list_box:GetSelectedIndex()
  410.     if index == -1 then return end
  411.     local item  = self.list_box:GetItemByIndex(index)
  412.  
  413.     local obj = item and level.object_by_id(item.item_id)
  414.     local se_obj = item and item.item_id and alife():object(item.item_id)
  415.  
  416.     if not (obj) then
  417.         return
  418.     end
  419.  
  420.     if (self.list_box_parts) then
  421.         if (index ~= -1) then
  422.             index = self.list_box_parts:GetSelectedIndex()
  423.             item = self.list_box_parts:GetItemByIndex(index)
  424.             local se_parts = item and item.item_id and alife():object(item.item_id)
  425.             local sec = se_parts:section_name()
  426.  
  427.             if (se_parts) then
  428.  
  429.                 -- Drengor - multi-cook
  430.                 local part_count = self:GetPartCount(sec)
  431.                 local fuel_charges = self:GetFuelCharges(se_obj)
  432.                 local cook_count = part_count
  433.  
  434.                 if(part_count >= fuel_charges) then cook_count = fuel_charges end
  435.                 -- end Drengor - multi-cook
  436.  
  437.                 -- ponney68 cooking item
  438.                 if self.section =="fieldcooker" then
  439.                 alife():create("fieldcooker", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  440.                 end
  441.                 if self.section =="wood_stove" then
  442.                 alife():create("wood_stove", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  443.                 end
  444.                 -- End ponney68
  445.  
  446.                 -- Drengor - multi-cook
  447.                 -- mutant_part_tushkano_meat
  448.                 if(sec=="mutant_part_tushkano_meat")then self:CreateMeal("meat_tushkano",cook_count) end
  449.                 -- mutant_part_flesh_meat
  450.                 if(sec=="mutant_part_flesh_meat")then self:CreateMeal("meat_flesh",cook_count) end
  451.                 -- mutant_part_boar_chop
  452.                 if(sec=="mutant_part_boar_chop")then self:CreateMeal("meat_boar",cook_count) end
  453.                 -- mutant_part_dog_meat
  454.                 if(sec=="mutant_part_dog_meat")then self:CreateMeal("meat_dog",cook_count) end
  455.                 -- mutant_part_psevdodog_meat
  456.                 if(sec=="mutant_part_psevdodog_meat")then self:CreateMeal("meat_pseudodog",cook_count) end
  457.                 -- mutant_part_krovosos_meat
  458.                 if(sec=="mutant_part_krovosos_meat")then self:CreateMeal("meat_bloodsucker",cook_count) end
  459.                 -- mutant_part_snork_hand
  460.                 if(sec=="mutant_part_snork_hand")then self:CreateMeal("meat_snork",cook_count) end
  461.                 -- mutant_part_chimera_meat
  462.                 if(sec=="mutant_part_chimera_meat")then self:CreateMeal("meat_chimera",cook_count) end
  463.                 -- mutant_part_crow_beak
  464.                 if(sec=="mutant_part_crow_beak")then self:CreateMeal("drink_crow",cook_count) end
  465.  
  466.                 self:ConsumeFuel(se_obj,cook_count)
  467.                 self:ConsumePart(se_parts,cook_count)
  468.                 -- end Drengor - multi-cook
  469.             end
  470.         end
  471.     end
  472.  
  473.     self:HideDialog()
  474.  
  475.     if (self.use_actor_effects and actor_effects) then
  476.         actor_effects.use_item(self.section.."_dummy")
  477.         level_weathers.get_weather_manager():forced_weather_change()
  478.     end
  479. end
  480.  
  481. function cooking_ui:AddItemToList(item,listbox)
  482.  
  483.     local _itm          = load_item(self.file_item_main_sz.y)
  484.     local sec = item and item:section()
  485.     local inv_name      = item and game.translate_string(alun_utils.read_from_ini(nil,sec,"inv_name","string","error")) or "none"
  486.  
  487.     _itm:SetWndSize     (self.file_item_main_sz)
  488.  
  489.     _itm.fn:SetWndPos(vector2():set(0,0))
  490.     _itm.fn:SetWndSize  (self.file_item_fn_sz)
  491.     _itm.fn:SetText     (inv_name)
  492.  
  493.     if (item) then
  494.         _itm.item_id = item:id()
  495.  
  496.         local inv_grid_width = alun_utils.read_from_ini(ini,sec,"inv_grid_width","float",0)
  497.         local inv_grid_height = alun_utils.read_from_ini(ini,sec,"inv_grid_height","float",0)
  498.         local inv_grid_x = alun_utils.read_from_ini(ini,sec,"inv_grid_x","float",0)
  499.         local inv_grid_y = alun_utils.read_from_ini(ini,sec,"inv_grid_y","float",0)
  500.  
  501.         _itm.x1 = inv_grid_x*50
  502.         _itm.y1 = inv_grid_y*50
  503.  
  504.         _itm.width = inv_grid_width*50
  505.         _itm.height = inv_grid_height*50
  506.  
  507.         _itm.x2 = _itm.x1 + _itm.width
  508.         _itm.y2 = _itm.y1 + _itm.height
  509.     end
  510.  
  511.     --[[
  512.     _itm.picture = self.xml:InitStatic("itm_cooking:form:picture",self.form)
  513.     _itm.picture:InitTexture("ui\\ui_icon_equipment")
  514.     _itm.picture:SetTextureRect(Frect():set(_itm.x1,_itm.y1,_itm.x2,_itm.y2))
  515.     _itm.picture:SetWndSize(vector2():set(inv_grid_width*50,inv_grid_height*50))
  516.     --]]
  517.  
  518.     listbox:AddExistingItem(_itm)
  519. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement