4.60 star(s) 45 Votes

saneulae

Member
Sep 18, 2020
115
62
Ive added a few more vendors to the BBS. Just because some of them buy bots, does not mean they will buy ALL bots. They know what they want, and they won't buy anything else.
There is a random vendor or two in the junk list.
All together, this isn't much. But it can help fluff up the game while Radnor continues his excellent work.

 
Last edited:

Otherguy2012

Active Member
Aug 21, 2021
573
649
Well business is going great. Once things became more organized.
What is in a name? So you have tons of bots in your store room. What can you tell about them just looking?
I have renamed my bots.
For example.
JKB-SeSSob This tells me she has an S in sex and B in social.
I use Se for sex. So for social. Me Mechanical. El for electrical. Co for combat.
Only my personal bots get names and this little naming for organizing thing works(trust me when you have 50+ fully repaired bots in storage it is worth it.
I try to not store models without any skill,but if I do I just name them by base model(JKB for example) and at Harem Inc we never store damaged bots.

Back to work. Someone has to train all these bots how to have better sex(anyone have spare skin?)

Day 340 of being my own man.

Two things that could really be improved.
Inventory. Not Sorting but Numbers. For example you are working on a bot and need to replace an arm(anything really)and you have one,but how many do you actually have? You could have 1 or you could have 100. You have no way of knowing without going through your inventory and counting them. So number of parts available.

Next is Bot storage. Can we at least sort by model type?
 
Last edited:

wlam

New Member
Aug 19, 2021
1
1
Question for Radnor:

I would be interested in mods for minor factions and related events.
The basic idea would be a random event in 2 screens :
- screen 1 : demand >> you can accept or refuse
>> if accepted : consequence [1]
>> if refused : test vs your bots capabilities // 2 exit status : win [2] or loss [3]...
- result of the event is defined by the mod by type

The mod would contain:
Root : faction name and description, faction base reputation
And then, for each event :
- event probability (based on main quest stage & reputation)
- event trigger event (end of day period, at night, when visiting junkyard, when visiting flea market, when visiting brothel...)
- challenge type (sex, social, combat, mechanic, electronic, hacking)
- challenge requirements
- event description (page 1) with image
- challenge failed description (page 2) with image or video
- challenge passed description (page 3) with image or video


Examples:

Faction : Local mob
Event : they come and ask money for "protection" - you can pay or combat
If reputation is very bad, they send goons who attack you and take money
If reputation is good, they send stolen bot parts for very cheap prices or ask you for untraceable combat mods

Faction : Dirty vice cops
Event : idem, but sex oriented
If reputation is very bad, they force you to watch while fucking your bots
If reputation is good, they give you their discarded playthings (broken high-end sex bots)

Faction : Local clinic
Dr Monroe is trying to maintain a clinic for the homeless and the junkies in the area but she doesn't have a lot of money. She comes and ask help (money, reparation of medical equipment...) and pays with her body if reputation is high enough (and challenge and rewards may raise with reputation).

etc...

I think it would be a great way for others to expand content without breaking the game or the main quest.
 
  • Like
Reactions: nadawer

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Rad, are we able to disable training functions on altered bots? Hu-cows would be fun to sex and all, but would you teach them how to fight or be social? (yeah, sure, just dont give them that role). But what about bots that would be better if sex wasnt an option.. Arachia or Lamia for example.. or this Beholder that is my store clerk.
If no disable capable, how about just a 'good idea, bad idea' message to tag in a placeholder?
You can white/black list actions with bot roles for now. May add model/part/trait specific lists too, i guess, but can't promise right now.
Check repair_order role in base_content.zip. allowed_actions and blocked_actions lists.
Another option would be setting bot model xp_mult to dict with 0.01 mult for skills you want almost disabled. Or just 0 to disable xp gains completely, this way you can train bot, but skill will not advance.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Are the selling prices of bots supposed to be capped now? Best I can get for a bot at the flea market is 30K and 75K on the grey net. If that is the case it means that some of the modded bots are not even worth getting now as I've seen them selling at the flea market for 385 to 500K with only only C rank parts and no skills, meaning I can never make a profit selling them. Also makes it so I can get more cash buy just stripping bots fro parts and selling those.
Yes, i added 30k cap at flea market, it really didn't made any sense you can go to slums with ultralux bot and local cheap traders would pay you couple of millions just like that.
Will move these caps, and maybe traders conditions/tables to mods too, so if you don't like it you will be able to change to fit your playstyle better.
Until proper factions added, Grey Market BBS will be one of main ways to sell bots for profit.
 
  • Like
Reactions: GrooveDaddy

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Code:
I'm sorry, but an uncaught exception occurred.

While running game code:
  File "game/modules/0020_dscs/game/locations/dump_site/dump_site_scavenge.rpy", line 33, in <module>
  File "game/modules/0010_dscs_base/game/characters/bot_base/part.rpy", line 147, in apply_damage
  File "game/modules/0005_core/core/utils.rpy", line 89, in randwchoice
ValueError: empty range for randrange() (0,0, 0)

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "modules/0005_core/core/main_loop.rpyc", line 62, in script call
  File "modules/0020_dscs/game/locations/dump_site/dump_site_scavenge.rpyc", line 25, in script
  File "renpy/ast.py", line 928, in execute
    renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
  File "renpy/python.py", line 2245, in py_exec_bytecode
    exec(bytecode, globals, locals)
  File "game/modules/0020_dscs/game/locations/dump_site/dump_site_scavenge.rpy", line 33, in <module>
  File "game/modules/0010_dscs_base/game/characters/bot_base/part.rpy", line 147, in apply_damage
  File "game/modules/0005_core/core/utils.rpy", line 89, in randwchoice
  File "/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python2.7/random.py", line 244, in randint
  File "/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python2.7/random.py", line 220, in randrange
ValueError: empty range for randrange() (0,0, 0)

Windows-10-10.0.19041
Ren'Py 7.4.10.2178
DSCS 0.3.1
Sun Feb 13 07:52:28 2022
I keep getting this when I configure my altered bot.
Keep some possible defect for every integrity level. Defaults are None and destroyed. If you remove destroyed, you will also need to remove None,0,0 or add some weight to it, otherwise it will break things as in your traceback, i believe. Will look to add some safeguards to avoid crashes, by defaulting to None in such cases.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Question : Approximately when will the next version will be available? No rush just asking :)
Second half of February, first half of March. Approximately :D
Really don't want to give any update promises, don't want rush of 0.3. Sometimes things happens and i can't work on game for days, maybe even week. So if i promise some date or feature and something unexpected happens irl i will be unable to deliver, people will complain etc. So, i work on game when i have time, my plan of 1-3 updates per month is something i can follow, i believe, when big enough update is ready i will release it.
 

saneulae

Member
Sep 18, 2020
115
62
Keep some possible defect for every integrity level. Defaults are None and destroyed. If you remove destroyed, you will also need to remove None,0,0 or add some weight to it, otherwise it will break things as in your traceback, i believe. Will look to add some safeguards to avoid crashes, by defaulting to None in such cases.
hmm... I was using a mod version of destroyed at first, then removed it during troubleshooting. Good to know how they pair up.
 
  • Like
Reactions: Radnor

Radnor

Member
Game Developer
Nov 9, 2021
365
942
I thought of another useful feature that could be added:
Right now we can choose to have DNS on or off. I would like to be able to have it on and set a quality level threshold. I can't really play with it turned on because of the chance of my best parts being sold. It would be upsetting to have a NeuroTech v7 be sold when they are kind of hard to come by. This feature would still be of limited use because there are still only quality D eyes and quality D,E, & F skins, but when those parts have higher quality versions available, this feature will be quite useful for me.
Yep, i have more detailed DNS settings screen on todo. Hate to manually mark parts myself.
Likely will replace DNS button at workshop page with link to settings screen with toggles for rates, defects, integrity etc. Also likely will change how part dns works, instead of marking specific part, it will mark every same id part. Idea is if you want to keep 1 v4 CPU, it is likely you want to keep all of them and sell manually if really want.
 
  • Like
Reactions: Frurose

Radnor

Member
Game Developer
Nov 9, 2021
365
942
hmm... I was using a mod version of destroyed at first, then removed it during troubleshooting. Good to know how they pair up.
I posted possible_defects testing script somewhere on this thread, i think. It will run through 100-0 integrity and list which defects are possible. Try searching for it, may make modding bit easier. Eventually may make some sort of mod editor "game", which will make testing/editing mods easier, but this is surely not any soon, just an idea of something i think will be useful.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
This is a surprisingly good time. By which I mean I expected it to be casually fun, but then I found myself really enjoying the gameplay loop. And there's so much potential. Even after the regular part hierarchy is complete, with parts from E to S for each category, there are also sidegrades - parts that are better for specific roles. Which lends itself to customising bots for specific roles above and beyond their intended role. Like making a JKB into an assassin with high combat and specialised limbs or the like.

Which then lends itself to different events, different buyers, different reasons to retain various bots for yourself. Having a bodyguard bot might be a good idea in the future, be it protection from rivals or megacorps, or getting shaken down by street gangs. A hacking/EW bot might be a thing to introduce. So much potential.

I think more variability in the market needs to be a thing though, different (randomised?) sellers and a range of prices for the same item. Make the world feel more organic.

Excellent work, again. I'm really looking forward to the future here.
Thanks!
Yep, lots of possibilities, trying to code stuff in generic/flexible way so when appropriate modding will be added it will allow as wide range of content as possible. Can't say i always manage to do so, but i try :D
Events/offers variations are possible, i think even now, but yes, this is something i would like myself.
 
  • Like
Reactions: ArghDoe

saneulae

Member
Sep 18, 2020
115
62
Rad I have noticed that the minimal_integrity for BBS requests is a little off.. say minimal is set at 80, it doesnt accept the request unless the bot is above 80. small issue in the grand scheme.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Well business is going great. Once things became more organized.
What is in a name? So you have tons of bots in your store room. What can you tell about them just looking?
I have renamed my bots.
For example.
JKB-SeSSob This tells me she has an S in sex and B in social.
I use Se for sex. So for social. Me Mechanical. El for electrical. Co for combat.
Only my personal bots get names and this little naming for organizing thing works(trust me when you have 50+ fully repaired bots in storage it is worth it.
I try to not store models without any skill,but if I do I just name them by base model(JKB for example) and at Harem Inc we never store damaged bots.

Back to work. Someone has to train all these bots how to have better sex(anyone have spare skin?)

Day 340 of being my own man.

Two things that could really be improved.
Inventory. Not Sorting but Numbers. For example you are working on a bot and need to replace an arm(anything really)and you have one,but how many do you actually have? You could have 1 or you could have 100. You have no way of knowing without going through your inventory and counting them. So number of parts available.

Next is Bot storage. Can we at least sort by model type?
Valid ideas, added to todo, can't promise when/how i will implement these, but will think about it.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Question for Radnor:

I would be interested in mods for minor factions and related events.
The basic idea would be a random event in 2 screens :
- screen 1 : demand >> you can accept or refuse
>> if accepted : consequence [1]
>> if refused : test vs your bots capabilities // 2 exit status : win [2] or loss [3]...
- result of the event is defined by the mod by type

The mod would contain:
Root : faction name and description, faction base reputation
And then, for each event :
- event probability (based on main quest stage & reputation)
- event trigger event (end of day period, at night, when visiting junkyard, when visiting flea market, when visiting brothel...)
- challenge type (sex, social, combat, mechanic, electronic, hacking)
- challenge requirements
- event description (page 1) with image
- challenge failed description (page 2) with image or video
- challenge passed description (page 3) with image or video


Examples:

Faction : Local mob
Event : they come and ask money for "protection" - you can pay or combat
If reputation is very bad, they send goons who attack you and take money
If reputation is good, they send stolen bot parts for very cheap prices or ask you for untraceable combat mods

Faction : Dirty vice cops
Event : idem, but sex oriented
If reputation is very bad, they force you to watch while fucking your bots
If reputation is good, they give you their discarded playthings (broken high-end sex bots)

Faction : Local clinic
Dr Monroe is trying to maintain a clinic for the homeless and the junkies in the area but she doesn't have a lot of money. She comes and ask help (money, reparation of medical equipment...) and pays with her body if reputation is high enough (and challenge and rewards may raise with reputation).

etc...

I think it would be a great way for others to expand content without breaking the game or the main quest.
Events, especially moddable, surely would make game richer and more fun to play, it is high enough priority thing, so probably will work on it sooner than later.
Your idea of events template sounds more or less as i imagined it to be, so yep, something is surely will be implemented. Eventually.
And event examples are entertaining too, can see it making game more entertaining.
 

Radnor

Member
Game Developer
Nov 9, 2021
365
942
Rad I was thinking another 'what if'.. being able to limit or raise repair_task chances per bot, based on mc rep or skill on that bot. Customers are more likely to bring you higher spec bots after you have higher skill with that model.
It is more of content question i guess, but yes, it does make sense and likely to be implemented some day.

Im failing to understand this price multiplier in the grey market.
"bot_social": (2.0,"mul_exp3",0.1,3.0), - Changes reward value based on social skill, but what is that range?
Price function is big and somewhat convoluted thing.
Doubt i can explain it good, so here is code, enjoy/suffer :p
Code:
define default_bot_price_skill_mods={
  "bot_combat":      (1.0,"mul_exp3",0.0,5.0),
  "bot_electronics": (1.0,"mul_exp3",0.0,5.0),
  "bot_mechanics":   (1.0,"mul_exp3",0.0,5.0),
  "bot_sex":         (1.0,"mul_exp3",0.0,5.0),
  "bot_social":      (1.0,"mul_exp3",0.0,5.0),
  }

define bot_price_skills_unimportant={
  "bot_combat":      (1.0,"mul_exp3",0.0,1.0),
  "bot_electronics": (1.0,"mul_exp3",0.0,1.0),
  "bot_mechanics":   (1.0,"mul_exp3",0.0,1.0),
  "bot_sex":         (1.0,"mul_exp3",0.0,1.0),
  "bot_social":      (1.0,"mul_exp3",0.0,1.0),
  }

define bot_price_ignore_skills={
  }

init python:
  def bot_price_function(bot,**kwargs):
    """
    base_price_mult: float, default 1.0
    skill_mods: dict of skill: (skill_mod,mod_type,min_level_mod,max_level_mod)
    part_price_mult: float, default 1.0
    part_low_bound: int, default 25
    chassis_integrity_mult: float, default 0.5
    """

#    print("bot price",bot)
    ## start with base model price
    base_price_mult=kwargs.get("base_price_mult",1.0)
    price=int(round(bot.base_price*base_price_mult))
#    print("  base price",price)
    ## apply skill level mods, if any
    skill_mods=kwargs.get("skill_mods",default_bot_price_skill_mods)
    for skill_id,(skill_mod,mod_type,min_level_mod,max_level_mod) in sorted(skill_mods.items()):
      max_level=getattr(bot,skill_id).max_level
      min_level=getattr(bot,skill_id).min_level
      level=getattr(bot,skill_id).level
      price_mod=(max_level_mod-min_level_mod)*(level-min_level)/float(max_level-min_level)+min_level_mod
      neg_price_mod=price_mod<0
      price_mod=abs(price_mod)
      if mod_type=="add":
        price_mod=price_mod*skill_mod
      elif mod_type=="add_exp2":
        price_mod=price_mod**2*skill_mod
      elif mod_type=="add_exp3":
        price_mod=price_mod**3*skill_mod
      elif mod_type in ("mul","mult"):
        price_mod=1.0+(price_mod-1.0)*skill_mod
      elif mod_type in ("mul_exp2","mult_exp2"):
        price_mod=1.0+(price_mod**2-1.0)*skill_mod
      elif mod_type in ("mul_exp3","mult_exp3"):
        price_mod=1.0+(price_mod**3-1.0)*skill_mod
      if neg_price_mod:
        price_mod=-price_mod
      if mod_type in ("add","add_exp2","add_exp3"):
#        print("  skill",skill_id,level,"+",int(round(price_mod)))
        price=int(round(price+price_mod))
      elif mod_type in ("mul","mult","mul_exp2","mult_exp2","mul_exp3","mult_exp3"):
#        print("  skill",skill_id,level,getattr(bot,skill_id).level_name,"*",price_mod)
        price+=int(round(bot.base_price*price_mod))
    ## apply chassis parts mods
    part_price_mult=kwargs.get("part_price_mult",1.0)
    part_low_bound=kwargs.get("part_low_bound",25)
    for slot in bot.outfit_slots:
      part=bot.item_on_slot(slot)
      if part and part.integrity>=part_low_bound:
        price_mod=part.base_price*(1.0+(part.integrity/100.0-1.0)*part_price_mult)
        for defect in part.defects:
          price_mod*=defect.part_price_mult
        price=int(round(price+price_mod))
#        print("  part",part,"+",int(round(price_mod)))
    ## apply chassis integrity mod
    chassis_integrity_mult=kwargs.get("chassis_integrity_mult",0.5)
    price_mod=1.0+(bot.chassis.integrity/100.0-1.0)*chassis_integrity_mult
#    print("  chassis mult *",price_mod)
    price=int(round(price*price_mod))
    ## apply psychocore traits mods
    ## TODO
    ## apply psychocore stability mod
    ## TODO
#    print("  final price",price)
    return price

  def bot_part_price_function(part,flat_price_below=0):
    integrity=max(flat_price_below,part.integrity)
    price=part.base_price*(integrity/100.0)**2
    for defect in part.defects:
      price*=defect.part_price_mult
    return price
 

Otherguy2012

Active Member
Aug 21, 2021
573
649
If anyone is curious here is a save of 365 game days. 8 racks of bots(all 100%) in storage and 25 shelves of inventory(all 100% parts).Right at 1.5 million in cash.
In the game world I have a patent pending on the name Harem Inc. :p Plus Randor you can see how skills are working out. This is without a mod.
 
Last edited:

saneulae

Member
Sep 18, 2020
115
62
It is more of content question i guess, but yes, it does make sense and likely to be implemented some day.


Price function is big and somewhat convoluted thing.
Doubt i can explain it good, so here is code, enjoy/suffer :p
Code:
define default_bot_price_skill_mods={
  "bot_combat":      (1.0,"mul_exp3",0.0,5.0),
  "bot_electronics": (1.0,"mul_exp3",0.0,5.0),
  "bot_mechanics":   (1.0,"mul_exp3",0.0,5.0),
  "bot_sex":         (1.0,"mul_exp3",0.0,5.0),
  "bot_social":      (1.0,"mul_exp3",0.0,5.0),
  }

define bot_price_skills_unimportant={
  "bot_combat":      (1.0,"mul_exp3",0.0,1.0),
  "bot_electronics": (1.0,"mul_exp3",0.0,1.0),
  "bot_mechanics":   (1.0,"mul_exp3",0.0,1.0),
  "bot_sex":         (1.0,"mul_exp3",0.0,1.0),
  "bot_social":      (1.0,"mul_exp3",0.0,1.0),
  }

define bot_price_ignore_skills={
  }

init python:
  def bot_price_function(bot,**kwargs):
    """
    base_price_mult: float, default 1.0
    skill_mods: dict of skill: (skill_mod,mod_type,min_level_mod,max_level_mod)
    part_price_mult: float, default 1.0
    part_low_bound: int, default 25
    chassis_integrity_mult: float, default 0.5
    """

#    print("bot price",bot)
    ## start with base model price
    base_price_mult=kwargs.get("base_price_mult",1.0)
    price=int(round(bot.base_price*base_price_mult))
#    print("  base price",price)
    ## apply skill level mods, if any
    skill_mods=kwargs.get("skill_mods",default_bot_price_skill_mods)
    for skill_id,(skill_mod,mod_type,min_level_mod,max_level_mod) in sorted(skill_mods.items()):
      max_level=getattr(bot,skill_id).max_level
      min_level=getattr(bot,skill_id).min_level
      level=getattr(bot,skill_id).level
      price_mod=(max_level_mod-min_level_mod)*(level-min_level)/float(max_level-min_level)+min_level_mod
      neg_price_mod=price_mod<0
      price_mod=abs(price_mod)
      if mod_type=="add":
        price_mod=price_mod*skill_mod
      elif mod_type=="add_exp2":
        price_mod=price_mod**2*skill_mod
      elif mod_type=="add_exp3":
        price_mod=price_mod**3*skill_mod
      elif mod_type in ("mul","mult"):
        price_mod=1.0+(price_mod-1.0)*skill_mod
      elif mod_type in ("mul_exp2","mult_exp2"):
        price_mod=1.0+(price_mod**2-1.0)*skill_mod
      elif mod_type in ("mul_exp3","mult_exp3"):
        price_mod=1.0+(price_mod**3-1.0)*skill_mod
      if neg_price_mod:
        price_mod=-price_mod
      if mod_type in ("add","add_exp2","add_exp3"):
#        print("  skill",skill_id,level,"+",int(round(price_mod)))
        price=int(round(price+price_mod))
      elif mod_type in ("mul","mult","mul_exp2","mult_exp2","mul_exp3","mult_exp3"):
#        print("  skill",skill_id,level,getattr(bot,skill_id).level_name,"*",price_mod)
        price+=int(round(bot.base_price*price_mod))
    ## apply chassis parts mods
    part_price_mult=kwargs.get("part_price_mult",1.0)
    part_low_bound=kwargs.get("part_low_bound",25)
    for slot in bot.outfit_slots:
      part=bot.item_on_slot(slot)
      if part and part.integrity>=part_low_bound:
        price_mod=part.base_price*(1.0+(part.integrity/100.0-1.0)*part_price_mult)
        for defect in part.defects:
          price_mod*=defect.part_price_mult
        price=int(round(price+price_mod))
#        print("  part",part,"+",int(round(price_mod)))
    ## apply chassis integrity mod
    chassis_integrity_mult=kwargs.get("chassis_integrity_mult",0.5)
    price_mod=1.0+(bot.chassis.integrity/100.0-1.0)*chassis_integrity_mult
#    print("  chassis mult *",price_mod)
    price=int(round(price*price_mod))
    ## apply psychocore traits mods
    ## TODO
    ## apply psychocore stability mod
    ## TODO
#    print("  final price",price)
    return price

  def bot_part_price_function(part,flat_price_below=0):
    integrity=max(flat_price_below,part.integrity)
    price=part.base_price*(integrity/100.0)**2
    for defect in part.defects:
      price*=defect.part_price_mult
    return price

yep, nope. That explains why my values were hit or miss.
I was hoping it was some simplified min/max based on request ranks or skills assigned... request rank: DCBA / reward price: min=D, max=A.
Definitely need more coffee for that laundrymat.. But having this in the open could offer some robust mods
 
Last edited:

layer1avn

Member
Aug 24, 2021
178
304
Clicking buttons is a little slow in this game. For example, there's a slight pause when you repeat an action--maybe a quarter of a second max. I'm not complaining; just wondering if that's typical of renpy when multiple sections of a page have to be updated.
 
4.60 star(s) 45 Votes