예제 #1
0
def get_retail_objects(_connection=None):
    automation_output = sims4.commands.AutomationOutput(_connection)
    automation_output('GetRetailObjects; Status:Begin')
    for obj in RetailUtils.get_all_retail_objects():
        automation_output('GetRetailObjects; Status:Data, ObjId:{}'.format(
            obj.id))
    automation_output('GetRetailObjects; Status:End')
 def _try_find_object_and_push_buy_affordance(self):
     (min_price, max_price) = self.owner._get_min_max_price_range()
     found_object = None
     objects_in_price_range = []
     other_potential_objects = []
     for found_object in RetailUtils.all_retail_objects_gen(
             allow_sold=False):
         if found_object.in_use and not found_object.in_use_by(
                 self.owner._customer):
             continue
         sell_price = found_object.retail_component.get_sell_price()
         if min_price <= sell_price <= max_price:
             objects_in_price_range.append(found_object)
         else:
             other_potential_objects.append(found_object)
     random.shuffle(objects_in_price_range)
     for price_range_object in objects_in_price_range:
         (_, result) = self._test_execute_buy_affordance(price_range_object)
         if result:
             return (price_range_object, result)
     random.shuffle(other_potential_objects)
     num_objects_tested = 0
     for potential_object in other_potential_objects:
         if num_objects_tested >= _BuyState.MAX_BUY_OBJECT_TESTS:
             logger.warn(
                 'Retail Customer {} hit MAX_BUY_OBJECT_TESTS when looking for an object to buy.',
                 owner='rmccord')
             return (None, False)
         (_, result) = self._test_execute_buy_affordance(potential_object)
         if result:
             return (potential_object, result)
         num_objects_tested += 1
     return (None, False)
예제 #3
0
 def has_any_object_for_sale(self):
     for retail_obj in RetailUtils.all_retail_objects_gen(
             allow_not_for_sale=True):
         if retail_obj.retail_component.is_for_sale:
             return True
         if retail_obj.is_in_inventory():
             return True
     return False
예제 #4
0
 def _open_household_owned_npc_store(self):
     should_open = False
     for retail_obj in RetailUtils.all_retail_objects_gen(
             allow_not_for_sale=True):
         self._adjust_commodities_if_necessary(retail_obj)
         if not should_open:
             if not retail_obj.retail_component.is_not_for_sale:
                 should_open = True
     self.set_open(should_open)
예제 #5
0
 def _do_behavior(self):
     customer = self.interaction.get_participant(self.customer)
     if customer is None:
         logger.error('Got a None customer trying to run a RetailCustomerAction element.')
         return False
     situation = RetailUtils.get_retail_customer_situation_from_sim(customer)
     if situation is None:
         logger.warn("Trying to run a customer action on a sim that isn't running a retail situation.")
         return False
     for action in self.actions:
         action.apply_action(customer, situation)
예제 #6
0
 def on_zone_load(self):
     super().on_zone_load()
     for obj in RetailUtils.get_all_retail_objects():
         self._fixup_placard_if_necessary(obj)
     if services.current_zone_id() != self._zone_id:
         return
     tracker = services.active_lot().commodity_tracker
     advertising_commodities = RetailTuning.ADVERTISING_COMMODITY_MAP.values(
     )
     for advertising_commodity in advertising_commodities:
         commodity = tracker.get_statistic(advertising_commodity)
         if commodity is not None:
             commodity.decay_enabled = True
예제 #7
0
 def get_median_item_value(self):
     values = [
         obj.retail_component.get_retail_value()
         for obj in RetailUtils.all_retail_objects_gen()
     ]
     if not values:
         return 0
     values.sort()
     count = len(values)
     midpoint = count // 2
     if count % 2:
         return values[midpoint]
     return (values[midpoint] + values[midpoint - 1]) / 2
예제 #8
0
 def _open_pure_npc_store(self, is_premade):
     has_retail_obj = False
     for retail_obj in RetailUtils.all_retail_objects_gen(
             allow_not_for_sale=True):
         self._adjust_commodities_if_necessary(retail_obj)
         obj_retail_component = retail_obj.retail_component
         if obj_retail_component.is_for_sale or retail_obj.is_in_inventory(
         ):
             has_retail_obj = True
         else:
             if is_premade:
                 set_for_sale = retail_obj.has_tag(
                     self.NPC_STORE_FOR_SALE_TAG)
             else:
                 set_for_sale = obj_retail_component.is_sold
             if set_for_sale:
                 obj_retail_component.set_for_sale()
                 has_retail_obj = True
             if retail_obj.has_tag(self.NPC_STORE_MANNEQUIN_TAG):
                 self._set_up_mannequin_during_open(retail_obj)
                 has_retail_obj = True
     self.set_open(has_retail_obj)
예제 #9
0
 def get_curb_appeal(self):
     total_curb_appeal = sum(
         obj.retail_component.get_current_curb_appeal()
         for obj in RetailUtils.get_all_retail_objects())
     return total_curb_appeal + self._get_lot_advertising_commodity_sum()
예제 #10
0
 def update_retail_objects_commodities(self):
     for retail_obj in RetailUtils.all_retail_objects_gen(allow_sold=False):
         retail_obj.update_component_commodity_flags()
예제 #11
0
 def toggle_for_sale_vfx(self):
     self._for_sale_vfx_toggle_value = not self._for_sale_vfx_toggle_value
     for item in RetailUtils.all_retail_objects_gen(
             allow_sold=False, include_inventories=False):
         self._update_for_sale_vfx_for_object(
             item, self._for_sale_vfx_toggle_value)