NokiMo
vrengames
vrengames

patreon


Lab Rats 2 v0.49.0 Release! Try it Now!

Lab Rats 2 v0.49.0 is Out! Download it Now!

PC: Lab Rats 2 v0.49.0a-PC
Mac: Lab Rats 2 v0.49.0a-Mac
Android: Lab Rats 2 v0.49.0a-Android 

LR 2 v0.49.0 is finished and ready for it's week of bug testing! This update adds the ability to hire Jennifer, Lily, Gabrielle, and Rebecca onto your Pharmaceutical business team! Each girl has unique requirements that you will need to meet (or subvert) to convince her to join you. That addition required a major rework of how NPC scheduling and jobs worked, so while I was at it I also made (almost) all other NPC's hirable as well! Now you can invite your favourite NPC's from around town to fill critical business positions.

Now that every NPC is a valid recruit the default method of accepting applications felt a little tame. A whole batch of business policies have been added to let you screen your applicants, only accepting applications from women who fit your specific criteria. Each enabled filtering policy increases the cost of finding new recruits, but with enough money you can now narrow down your search for the perfect ~bimbo secretary~ quality employee!

There have been a whole collection of other fixes, improvements, typo corrections, and tweaks. Serum price calculations were about 50% bugged, so that's been resolved. Girlfriends can now be invited on fuck-dates if their Sluttiness is high enough, and without the risk of someone interrupting you. The business policy UI now displays what prerequisites are required before something can be purchased. Strippers can now give you a private dance at the strip club, if you're willing to pay for it. Several business policies that mention seeking more or less experienced candidates now adjust the age range of the candidate that will be found.

Enjoy, and here's a changelog with the full list of changes!

*CHANGES AND ADDITIONS*

- Added list_of_instantiation_labels, useful for mods to instantate saveable constructs or modify existing lists.

- Added Job class. Each job has a title and related Role that is given when a Person starts that job. Each Person can have only one job.

- Added on_hire and on_fire functions to Job class. Called when a person's job is changed, in case special variables need to be set up.

- Added "job_known" field in event_triggers_dict. If True, you know what a person's new job is, otherwise listed as Unknown.

- Added strippler_role and stripper_job.

- Added stripper role to Gabrielle when you find her at the stripclub.

- Added ability to ask for a private dance from strippers when they are at work.

- Added special private dance branch for Gabrielle when she's working as a stripper.

- Added Schedule class to centralise weekly and daily planning functionality.

- Added DailySchedule class to hold information about location plans for a specific day.

- Removed old schedule Dict from Person class. Now stores an instance of Schedule with the non-work locations that person would like to be at for each day/time.

- Added Job class. A "Job" is a collection of a Role, map location, and Schedule.

- Each Person now stores a Job (unemployeed is it's own "job" for coding purposes). Each person can only have one job at a time.

- Added Jobs for each of the core business jobs (research, marketing, production, supply, HR)

- Added Jobs for many special roles (stripper, prostitute, and similar).

- Added special Jobs for most of the special characters (Jennifer, Lily, Rebecca, Nora, Alexia, etc.) 

- Added multiple unimportant jobs for random characters to have (barista, cashier, etc.)

- Girls will check their Job schedule, if one exists, to see where they should be. If their job doesn't require them to be somewhere they will fall back to their normal schedule.

- Added override schedule, which has the highest destination priority. Used when a character needs to be forced to a location, is very pregnant, etc.

- Added "Offer to hire her" option to most job roles. Requires 20 Love to ask, and some jobs will require extra motivation to convince the girl to leave.

- Updated all events that maniuplated someone's schedule to work with the new Schedule system.

- Added event to have Gabrielle quit her job at the strip club and come work for you.

- Added recruitment critiera business policies, letting you only recruit applicants with tiny/small/large/huge breasts.

- Added recruit sex skill improvement policy.

- Many business policies now modify the age cap and floor of a new recruit.

- Added exclusive_tag to policies. When a policy is toggled on it will toggle off any policies with the same tag. 

- Added recruitment criteria business policies for candidate age.

- Added recruitment criteria business policies for candidate relationship status.

- Added recruitment criteria business policies for candidate height.

- Added recruitment criteria business policy for candidate mother/childless status.

- Refactored Policy class. Added own_requirement and active_requirement lists, which hold business policies that msut be owned/active to purchse.

- Policy.requirement can now be used for a generic non-policy based requirement. If a string is returned that string is displayed on the business policy UI. 

- Business policy UI now display what prerequisits you need before you can purchase a locked policy.

- Added ability to convince Jennifer to quit her job, and optionally hire her to your business.

- Updated many of Jennifer's work based events to check if she is actually at work.

- Added event to convince Lily to drop out of school and work for your business.

- Added event to convince Rebecca to come work for you.

- Added fuck date to girlfriend (and girlfriend-like) date list.

- Added a pregnancy related sex goal. Only generated if pregnancy content is turned on.

- Added unit tests for Job, Schedule, DailySchedule classes.

- Updated unit tests for Person class to cover new schedule functionality.

- Added a "salary_modifier" field to Person class. Modifies the amount of pay a character would demand from it's base theoretical amount.

Comments

``` I'm sorry, but an uncaught exception occurred. While running game code: File "game/script.rpy", line 257, in script call call talk_person(picked_option) from _call_talk_person File "game/script.rpy", line 374, in script call $ _return.call_action(the_person) File "game/game_roles/role_sister/role_sister_taboo_quests.rpy", line 722, in script $ test_person.give_serum(the_serum, add_to_log = False) File "game/game_roles/role_sister/role_sister_taboo_quests.rpy", line 722, in $ test_person.give_serum(the_serum, add_to_log = False) File "game/major_game_classes/character_related/Person.rpy", line 1258, in give_serum the_serum_design.run_on_apply(self) File "game/major_game_classes/serum_related/SerumDesign.rpy", line 133, in run_on_apply trait.run_on_apply(the_person, self) File "game/major_game_classes/serum_related/SerumTrait.rpy", line 67, in run_on_apply self.on_apply(the_person, the_serum, add_to_log) File "game/major_game_classes/serum_related/_serum_traits.rpy", line 197, in fertility_enhancement_on_apply mc.log_event(the_person.title + ": +20 Fertility", "float_text_red") TypeError: unsupported operand type(s) for +: 'NoneType' and 'unicode' -- Full Traceback ------------------------------------------------------------ Full traceback: File "game/script.rpy", line 257, in script call call talk_person(picked_option) from _call_talk_person File "game/script.rpy", line 374, in script call $ _return.call_action(the_person) File "game/game_roles/role_sister/role_sister_taboo_quests.rpy", line 722, in script $ test_person.give_serum(the_serum, add_to_log = False) File "/home/f229m776/Games/LR2/0.49.0/renpy/ast.py", line 923, in execute renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store) File "/home/f229m776/Games/LR2/0.49.0/renpy/python.py", line 2235, in py_exec_bytecode exec(bytecode, globals, locals) File "game/game_roles/role_sister/role_sister_taboo_quests.rpy", line 722, in $ test_person.give_serum(the_serum, add_to_log = False) File "game/major_game_classes/character_related/Person.rpy", line 1258, in give_serum the_serum_design.run_on_apply(self) File "game/major_game_classes/serum_related/SerumDesign.rpy", line 133, in run_on_apply trait.run_on_apply(the_person, self) File "game/major_game_classes/serum_related/SerumTrait.rpy", line 67, in run_on_apply self.on_apply(the_person, the_serum, add_to_log) File "game/major_game_classes/serum_related/_serum_traits.rpy", line 197, in fertility_enhancement_on_apply mc.log_event(the_person.title + ": +20 Fertility", "float_text_red") TypeError: unsupported operand type(s) for +: 'NoneType' and 'unicode' Linux-5.15.15-76051515-generic-x86_64-with-debian-11.0 Ren'Py 7.4.8.1895 Lab Rats 2 - Down to Business v0.49.0 Thu Feb 3 10:40:27 2022 ```

Sidrew

i've not managed to hire one yet :-(

philip ash

Made a mistake in the above fix. I edited it out, but in case someone read it already, do not change line 309.

There was a big change in serum selling since v0.47, so if you're coming since before then, you may have to adjust to the new system. Are you doing "Find new clients." at all? If you don't at all, then yeah it can quickly become more cost than profit because of production costs after selling like 100-200 serums I think, even faster if there are any side effects in the serums which can absolutely bring a serum to actually cost money to sell. New research won't help in this case because that just increases the amount of aspect in the serum, not bring the aspect price back up, which is what market reach is for. Aspect price is sort of related to (Market Reach)/(Amount Aspect Sold). To summarize what I think is the result of the current code: Aspect price = 10/(1+(AAS/MR)) If you are finding new clients as well and still getting negative serums, then I'm stumped. More info would be appreciated on what you are selling, how much, how much market reach you have, any side effects in the serums, anything else you might think would effect it.

Been having trouble getting my reply post to stick. Putting it here as well. Does Patreon have a character limit or something for comments or replies? Issues with the mom's interview events are that the requirement functions for the events were not updated to include the mom's Person object as an argument. This can be gotten away with for LTE's and actions associated with a specific person, since 'the_person' is already defined in those cases, however it breaks these particular events. This requires changes in a few places. This is a pain to try and fix for a current game, but I'll include that too. Vren, please be more careful when changing event arguments or event requirement functions! To fix the requirement functions themselves. role_mother_work.rpy line 15 def mom_work_promotion_one_before_requirement(start_day): should be def mom_work_promotion_one_before_requirement(the_person, start_day): line 33 def mom_work_promotion_two_intro_requirement(start_day): should be def mom_work_promotion_two_intro_requirement(the_person, start_day): To fix when the events are created during the game. role_mother_work.rpy line 174 $ mom_work_promotion_one_before_crisis = Action("mom work promotion one before", mom_work_promotion_one_before_requirement, "mom_work_promotion_one_before", args = the_person, requirement_args = renpy.random.randint(day+3, day+8)) should be $ mom_work_promotion_one_before_crisis = Action("mom work promotion one before", mom_work_promotion_one_before_requirement, "mom_work_promotion_one_before", args = the_person, requirement_args = [the_person, renpy.random.randint(day+3, day+8)]) line 343 $ mom_work_promotion_two_intro_crisis = Action("mom work promotion two intro crisis", mom_work_promotion_two_intro_requirement, "mom_work_promotion_two_intro", args = the_person, requirement_args = renpy.random.randint(day+2, day+4)) should be $ mom_work_promotion_two_intro_crisis = Action("mom work promotion two intro crisis", mom_work_promotion_two_intro_requirement, "mom_work_promotion_two_intro", args = the_person, requirement_args = [the_person,renpy.random.randint(day+2, day+4)]) For games where you already stated going through these events, then the previous change will not fix it. I'll include the fix for after the first event, before the actual interview which is when it seems everyone is erroring or never triggering mom going to the interview (my case). If you somehow got past this, you can do something similar, but using the other event's name and Action creation. You can run the following lines in the dev console or by putting them somewhere in the code you can trigger manually. temp = [crisis for crisis in mc.business.mandatory_morning_crises_list if crisis.name == 'mom work promotion one before'][0] mc.business.mandatory_morning_crises_list.remove(temp) mom_work_promotion_one_before_crisis = Action("mom work promotion one before", mom_work_promotion_one_before_requirement, "mom_work_promotion_one_before", args = the_person, requirement_args = [mom]+temp.requirement_args) mc.business.mandatory_morning_crises_list.append(mom_work_promotion_one_before_crisis) del temp

Fixing this is annoying, but I go through it in my fourth reply to my "Putting my bug reports as replies here." comment.

The fix for this is in my third reply for my "Putting my bug reports as replies here." comment.

The fix for this is in my third reply for my "Putting my bug reports as replies here." comment.

The new candidate recruitment policies don't work because the function that uses them to generate candidate requirements (generate_candidate_requirements at the end of Business.rpy) is never used. To fix, add it in business_actions.rpy label interview_action_description business_actions.rpy line 170 for x in range(0,count+1): #NOTE: count is given +1 because the screen tries to pre-calculate the result of button presses. This leads to index out-of-bounds, unless we pad it with an extra character (who will not be reached). candidates.append(make_person()) should be: for x in range(0,count+1): #NOTE: count is given +1 because the screen tries to pre-calculate the result of button presses. This leads to index out-of-bounds, unless we pad it with an extra character (who will not be reached). candidate_requirements = mc.business.generate_candidate_requirements() candidates.append(make_person(candidate_requirements))

Found this issue related to no work walk in events. Please look at the second reply in the post below, don't want to copy the long set of text here.

The work walk-in LTE doesn't trigger anymore. I think the changes to how to handle schedule and hiring have broken the person_at_work function (crises.rpy line 164). This is also breaking a few other things, like moving an employee to a different division, the spank at work LTE, and others. I think this at least fixes the person_at_work function: crises.rpy line 164: def person_at_work(the_person): #Returns True if the_person is at whatever location their work location is if the_person.work is not None and the_person.work.has_person(the_person): return True else: return False changed to def person_at_work(the_person): #Returns True if the_person is at whatever location their work location is if the_person.job is not None and the_person.job.job_location.has_person(the_person): return True else: return False This still leaves problems, as moving employess is currently broken with only this change (It ends up with a new copy of them, or at least put into 2 locations, instead of moving them). I think move_person should be used instead of add_person since you commented out the remove_employee as it's only for firing now. role_employee.rpy line 790 ish menu: "Research and Development.": $ mc.business.add_employee_research(the_person) $ mc.business.r_div.add_person(the_person) "Production.": $ mc.business.add_employee_production(the_person) $ mc.business.p_div.add_person(the_person) "Supply Procurement.": $ mc.business.add_employee_supply(the_person) $ mc.business.s_div.add_person(the_person) "Marketing.": $ mc.business.add_employee_marketing(the_person) $ mc.business.m_div.add_person(the_person) "Human Resources.": $ mc.business.add_employee_hr(the_person) $ mc.business.h_div.add_person(the_person) I changed to: menu: "Research and Development.": $ mc.business.add_employee_research(the_person) $ mc.business.move_person(the_person,mc.business.r_div) "Production.": $ mc.business.add_employee_production(the_person) $ mc.business.move_person(the_person,mc.business.p_div) "Supply Procurement.": $ mc.business.add_employee_supply(the_person) $ mc.business.move_person(the_person,mc.business.s_div) "Marketing.": $ mc.business.add_employee_marketing(the_person) $ mc.business.move_person(the_person,mc.business.m_div) "Human Resources.": $ mc.business.add_employee_hr(the_person) $ mc.business.move_person(the_person,mc.business.h_div) I think there is still some clean up work needed to replace anything affected by the old set_work function into the new add_job function.

The larger tits recruitment policies are using a non-existent (get_random_big_tits) random generator function. line 884 ish: if recruitment_big_tits_policy.is_active(): candidate_dict["tits"] = get_random_big_tits() elif recruitment_huge_tits_policy.is_active(): candidate_dict["tits"] = get_random_big_tits() should be: if recruitment_big_tits_policy.is_active(): candidate_dict["tits"] = get_random_big_tit() elif recruitment_huge_tits_policy.is_active(): candidate_dict["tits"] = get_random_huge_tit()

Putting my bug reports as replies here.

Not possible to move employees?

I think theres also something wrong with the way serums work now. the price they sell for keep going down until it goes past zero and into the negative range for each sale. i hope this is not a way to make the game more challenging for us because at this point i had to start the game over at least five times because i quickly run out of money i cant build up clarity fast enough to unlock new things and even when i unlock new things the price expectancy for each serum is very low to $1 - $3 i hope this is fixed.

Tencho1998

Yup... hit that one too.

Sidrew

[code] I'm sorry, but an uncaught exception occurred. While running game code: File "game/script.rpy", line 310, in script call call advance_time from _call_advance_time_15 File "game/script.rpy", line 476, in script if crisis.is_action_enabled(): File "game/script.rpy", line 476, in if crisis.is_action_enabled(): File "game/major_game_classes/game_logic/Action.rpy", line 63, in is_action_enabled requirement_return = self.check_requirement(extra_args) File "game/major_game_classes/game_logic/Action.rpy", line 60, in check_requirement return self.requirement(*extra_args) File "game/game_roles/role_mother/role_mother_work.rpy", line 16, in mom_work_promotion_one_before_requirement if not the_person.has_job(mom_associate_job): AttributeError: 'NoneType' object has no attribute 'has_job' -- Full Traceback ------------------------------------------------------------ Full traceback: File "game/script.rpy", line 310, in script call call advance_time from _call_advance_time_15 File "game/script.rpy", line 476, in script if crisis.is_action_enabled(): File "renpy/ast.py", line 1893, in execute if renpy.python.py_eval(condition): File "renpy/python.py", line 2266, in py_eval return py_eval_bytecode(code, globals, locals) File "renpy/python.py", line 2259, in py_eval_bytecode return eval(bytecode, globals, locals) File "game/script.rpy", line 476, in if crisis.is_action_enabled(): File "game/major_game_classes/game_logic/Action.rpy", line 63, in is_action_enabled requirement_return = self.check_requirement(extra_args) File "game/major_game_classes/game_logic/Action.rpy", line 60, in check_requirement return self.requirement(*extra_args) File "game/game_roles/role_mother/role_mother_work.rpy", line 16, in mom_work_promotion_one_before_requirement if not the_person.has_job(mom_associate_job): AttributeError: 'NoneType' object has no attribute 'has_job' Windows-10-10.0.22000 Ren'Py 7.4.8.1895 Lab Rats 2 - Down to Business v0.49.0 Tue Feb 1 16:32:34 2022 [/code]

Tencho1998

Rebecca stuck in the same room after moving to the appartment? No drink wine event.

The teenage worker policy isn't working for new recruits...

Sidrew

Is anyone able to get the lap dance from a stripper? I'm not seeing the option. I also didn't see any difference at work between family members and other employees.

NuTrix

"Now you can invite your favourite NPC's from around town to fill critical business positions." Thumbs up

Initial Testing 'Teen' requirement does seem to work. (with all 'improvement' options enabled, and only screening teenager active (for critieria) still get full random ages. Likewise with 'Old' get numerous people under 40. Still trying to do testing, but thinking it might be if the old selection matches, increase age floor, then "if age is None: age = renpy.random.randint(age_floor,age_ceiling)" is breaking if age_floor > age_ceiling

Laughingowl

Please consider adding an option to enter a number in the auto-sell for production line.

Laughingowl

It's one of the quests that comes up to give you skill points. You have to impregnate a certain amount of people, I assume.

IgnusObscuro

What is the pregnancy goal?


Related Creators