Register to post in forums, or Log in to your existing account
 

Play RetroMUD
Post new topic  Reply to topic     Home » Forums » CMUD General Discussion
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Sun May 09, 2021 1:06 pm   

Nested SWITCHes
 
If anyone can see why the nested switch statements are not being tested, I'd appreciate it. I cannot see anything amiss.

I inserted some write statements and the outer SWITCH is being tested fine. I am certain I have used such a structure in the past.

Code:
$charLev=@char_VARS/charLev
$potBag=aardbag4
$batch=25
#LOCAL $num
#LOCAL $shop
#LOCAL $object
#LOCAL $keyword
#LOCAL $potLev

#IF ((%numparam()=1) OR (%param(2)=1)) {$num=$batch} {$num=(%param(2) * $batch)}

#SWITCH (%1)
  ("arm") {$keyword="resistance";$shop=26331;$potLev=10}
  ("bls") {
    #SWITCH ($charLev)
      ($charLev<15) {$keyword="prayer";$shop=32476;$potLev=7}
      ($charLev<25) {$keyword="blessing";$shop=32172;$potLev=15}
      ($charLev<57) {$keyword="special";$shop=26275;$potLev=25}
      ($charLev>=57) {$keyword="embrace";$shop=32408;$potLev=57}
    }
  ("fly") {$keyword="griffon";$shop=32476;$potLev=1}
  ("hp") {
    #IF (@baseLev<201) {
      #SWITCH ($charLev)
        ($charLev<10) {$keyword "relief";$shop=32476;$potLev=1}
        ($charLev<20) {$keyword "elixir";$shop=37894;$potLev=10}
        ($charLev<40) {$keyword "serious";$shop=32476;$potLev=20}
        ($charLev<60) {$keyword "care";$shop=32476;$potLev=40}
        ($charLev>=60) {$keyword "duff";$shop=23160;$potLev=60}
      } {$keyword="strawberry";$shop=52684;$potLev=201}
    }
  ("invis") {$keyword="beyond";$shop=32476;$potLev=1}
  ("mn") {
    #SWITCH ($charLev)
      ($charLev<20) {$keyword="rush";$shop=32476;$potLev=1}
      ($charLev<40) {$keyword="lotus";$shop=49497;$potLev=20}
      ($charLev<60) {$keyword="penguin";$shop=14696;$potLev=40}
      ($charLev<80) {$keyword="raspberry";$shop=52684;$potLev=60}
      ($charLev<100) {$keyword="hukomana";$shop=52871;$potLev=80}
      ($charLev<120) {$keyword="vodka";$shop=23160;$potLev=100}
      ($charLev<150) {$keyword="cupcake";$shop=52684;$potLev=120}
      ($charLev<175) {$keyword="vitae";$shop=52143;$potLev=150}
      ($charLev<200) {$keyword="phyltre";$shop=45179;$potLev=175}
      ($charLev>=200) {$keyword="jack";$shop=23160;$potLev=200}
    }
  ("mv") {
    #SWITCH ($charLev)
      ($charLev<10) {$keyword="tea";$shop=32476;$potLev=1}
      ($charLev<30) {$keyword="cactus";$shop=5924;$potLev=10}
      ($charLev<60) {$keyword="cocoa";$shop=14696;$potLev=30}
      ($charLev<80) {$keyword="wind";$shop=50238;$potLev=60}
      ($charLev<90) {$keyword="yellow";$shop=52871;$potLev=80}
      ($charLev>=90) {$keyword="moonshine";$shop=23160;$potLev=90}
    }
  ("sanc") {$keyword="goose";$shop=50290;$potLev=30}
  ("str") {
    #SWITCH ($charLev)
      ($charLev<40) {$keyword="strike";$shop=31123;$potLev=25}
      ($charLev<60) {$keyword="strength";$shop=26321;$potLev=40}
      ($charLev<80) {$keyword="prowess";$shop=14141;$potLev=60}
      ($charLev<100) {$keyword="noble";$shop=14141;$potLev=80}
      ($charLev>=100) {$keyword="handbook";$shop=14141;$potLev=100}
    }
   
#ADDKEY $object keyword $keyword
#ADDKEY $object level $potLev
#ADDKEY Pot_VARS/currentPotions %1 $object

#WAL %roomkey($shop)
buy $num $keyword

#SWITCH (%1)
  ("hp") {qmn}
  ("mn") {qmn}
  ("mv") {qmv}
 
Reply with quote
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Mon May 10, 2021 3:55 pm   
 
In the cold light of day, and minus the copious amount of vodka I consumed, I spotted that i left '=' out of a bunch of assignments.

However, even after correcting this, inside switches are still being ignored.

I have also tried

(eg)
Code:

#SWITCH
  ("mn") {
      #SWITCH ($charlev<20) {<commands>}
        ($charLev<40) {<commands>}
        etc
Reply with quote
shalimar
GURU


Joined: 04 Aug 2002
Posts: 4662
Location: Pensacola, FL, USA

PostPosted: Mon May 10, 2021 7:43 pm   
 
Nested switches do work:

$a=1
$b=2
#SWITCH ($a) (1) {#SWITCH ($b) (2) {#SAY hi}}

As far as the error in your script... did you try using the syntax checker? it might be able to find it for you.
ctrl +k is the shortcut, or you can select it from the editor menu of the settings editor
_________________
Discord: Shalimarwildcat
Reply with quote
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Tue May 11, 2021 5:38 am   
 
Syntax check raised no errors.

Incidentally, a couple of weeks ago I had to also modify this:

#IF ($charLev<20) {cast 'cure critical';#EXIT}
#IF ($charLev>=20) {cast 'heal'}

as it would not work written as:

#IF ($charLev<20) {cast 'cure critical'} {cast 'heal'}

I have checked the state of $charLev and it DOES have a value. I also tried using the permanent version, AND using a set figure (in this case 73) but the inner SWITCHes are just not playing ball despite all variations producing the same figure.
Reply with quote
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Tue May 11, 2021 10:33 am   
 
I tried using IF instead of the nested switch. Problem now is that #BREAK or #EXIT will end the entire script, anything else just runs through all the remaining IF, executing each one in turn and thereby changing the potion matching a character level for a higher level potion...which cannot be used.

It is going to be messy to have to fully quantify every IF

#IF (($charLev>1) AND ($charLev<20) {}
etc


UPDATE:
Code:

#SWITCH ($charLev)
...
  ("mn") {
    #IF (($charLev>=1) AND ($charLev<20)) {$keyword="rush";$shop=32476;$potLev=1}
    #IF (($charLev>=20) AND ($charLev<40)) {$keyword="lotus";$shop=49497;$potLev=20}
    #IF (($charLev>=40) AND ($charLev<60)) {$keyword="penguin";$shop=14696;$potLev=40}
    #IF (($charLev>=60) AND ($charLev<80)) {$keyword="raspberry";$shop=52684;$potLev=60}
    #IF (($charLev>=80) AND ($charLev<100)) {$keyword="hukomana";$shop=52871;$potLev=80}
    #IF (($charLev>=100) AND ($charLev<120)) {$keyword="vodka";$shop=23160;$potLev=100}
    #IF (($charLev>=120) AND ($charLev<150)) {$keyword="cupcake";$shop=52684;$potLev=120}
    #IF (($charLev>=150) AND ($charLev<175)) {$keyword="vitae";$shop=52143;$potLev=150}
    #IF (($charLev>=175) AND ($charLev<200)) {$keyword="phyltre";$shop=45179;$potLev=175}
    #IF ($charLev>=200) {$keyword="jack";$shop=23160;$potLev=200}
    }
...

does not work either. Definitely something screwy going on.


Last edited by hpoonis2010 on Tue May 11, 2021 11:21 am; edited 1 time in total
Reply with quote
shalimar
GURU


Joined: 04 Aug 2002
Posts: 4662
Location: Pensacola, FL, USA

PostPosted: Tue May 11, 2021 11:08 am   
 
This might be a situation where a dbVar comes in handy.

#LOCAL $this
$pot=%db(@potions, %1)
#FORALL %dbkeys($pot) {#IF (($charLev >= %i) AND ($charLev <= %db(%db($pot, %i), Max)) {$this=%db($pot, %i}}
#WALK %roomkey(%db($this, Shop))
etc
_________________
Discord: Shalimarwildcat
Reply with quote
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Tue May 11, 2021 11:23 am   
 
I tried something similar initially...ran into problems trying to sort out logic for:

if I already have a batch of potions at a previous level, continue using those

...and it also started to get a bit logically messy.
Reply with quote
shalimar
GURU


Joined: 04 Aug 2002
Posts: 4662
Location: Pensacola, FL, USA

PostPosted: Tue May 11, 2021 11:30 am   
 
It would likely be easier to fix that than the nested switch scenario (especially given that syntactically it should work already.)
_________________
Discord: Shalimarwildcat
Reply with quote
Tarn
GURU


Joined: 10 Oct 2000
Posts: 867
Location: USA

PostPosted: Tue May 11, 2021 6:48 pm   
 
This seems like what the database is for.

You're trying to search for a value by two fields (category like "arm" or "invis" and level).

Could you make a table with those values and then use %query to get the matching record?

You might need a min level and max level column for each row to make it easy.

http://forums.zuggsoft.com/modules/mx_kb/kb.php?page=3&mode=doc&k=2348
Reply with quote
hpoonis2010
Adept


Joined: 18 Jun 2019
Posts: 279

PostPosted: Thu May 13, 2021 2:05 pm   
 
We avoid the databases as that is not a completely useful module.

Using dbvars also has it's downside in that I am also using the lookups to populate buttons which is best done with proper vars. Furthermore, I already had a dbvar looking like:

bls="7="keyword=prayer|shop=32476"|15="keyword=blessing|shop=32172"|25="keyword=special|shop=26275"|57="keyword=embrace|shop=32408""

but I could NOT make it cough up the proper sub-key pair for love nor money.

In the end I simplified the entire thing by splitting each potion out to its own var

eg.,

blsPotTbl

1=data
10=data
35=data

and just looped around inside it with @{%1PotTbl}.%i.key

and dropped the data into button-use variables

So client is currently is happy with

forall
if

but not

switch
switch

or

switch
if
Reply with quote
Tarn
GURU


Joined: 10 Oct 2000
Posts: 867
Location: USA

PostPosted: Thu May 13, 2021 8:00 pm   
 
hpoonis2010 wrote:
We avoid the databases as that is not a completely useful module.
...
So client is currently is happy with

forall
if

but not

switch
switch

or

switch
if


Ok on the db.

So far as nested switches, I did manage to get this to work:
<func name="nested" id="53">
<value>#switch ($cat1=1) { #switch ($cat2 = 1) {#return (1)} ($cat2 = 2) {#return (2)}} {#switch ($cat2 = 1) {#return (3)} ($cat2 = 2) {#return (4)}}</value>
<arglist>$cat1,$cat2</arglist>
</func>


#echo %nested(1,1)
returns 1 as expected
#echo %nested(1,2)
returns 2 as expected
#echo %nested(2,1)
returns 3 as expected
#echo %nested(2,2)
returns 4 as expected

But it was extremely fiddly to get right: spacing, and the editor got a bit upset if I split it onto multiple lines.
Reply with quote
Display posts from previous:   
Post new topic   Reply to topic     Home » Forums » CMUD General Discussion All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© 2009 Zugg Software. Hosted by Wolfpaw.net