|
Saros Newbie
Joined: 19 May 2016 Posts: 9
|
Posted: Fri May 20, 2016 5:30 pm
DB var with room names as key, list of zones as value |
This script seems to work, but also throws a strange parsing error about painting to a canvas OR access violation on the roomzonelist variable.
Is there a better way to do this?
Code: |
#loop %numrooms {
#if (!@roomzonelist.%ROOMNAME(%i)) {
#addkey {roomzonelist} %ROOMNAME(%i) %ZONENAME(%ROOMZONE(%i))
} {
$list=@roomzonelist.%ROOMNAME(%i)
#if (!%ismember(%ZONENAME(%ROOMZONE(%i),$list))) {
#additem $list %ZONENAME(%ROOMZONE(%i))
#addkey {roomzonelist} %ROOMNAME(%i) $list}
}
} |
|
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4692 Location: Pensacola, FL, USA
|
Posted: Fri May 20, 2016 8:43 pm |
You could use #MAPQUERY to perform a SQL search on the map database, if you are familiar with that.
Also, %zonename and %roomname need to be lowercase to evaluate out properly, unless I am mistaken. |
|
_________________ Discord: Shalimarwildcat |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Fri May 20, 2016 9:11 pm |
I have a general distrust of using the dot notation when there is a complex item as in:
@roomzonelist.%ROOMNAME(%i)
My preference, as it will always produce a good result, would be:
%db(@roomzonelist,%ROOMNAME(%i))
But you can also use something like this to help ensure the correct result:
@{roomzonelist.%ROOMNAME(%i)}
Given that %roomname will have complex results I would go even further:
@{roomzonelist.{%ROOMNAME(%i)}}
Again, I think using the %db function is best.
Your #LOOP is running over the range 1 to %numrooms. If a particular value does not exist, for example you deleted a room, then all the various %roomXXXX functions will fail on that number. I am not entirely sure what you are doing so I can't suggest a solution.
Your indentation pattern is not consistent. It should not cause an problems in the script you provided, but it can be confusing for a human. The #SWITCH command is only command where CMud gets very picky about indentation/format.
In general parameters that can be multiple words should be encapsulated with braces. Nothing in your script would be an issue, but having the habit of using best practices can save hours of trying to find a bug when you do write something that might be an issue.
Bad: #addkey {roomzonelist} %ROOMNAME(%i) %ZONENAME(%ROOMZONE(%i))
Good: #addkey roomzonelist {%ROOMNAME(%i)} {%ZONENAME(%ROOMZONE(%i))}
Great: #addkey {roomzonelist} {%ROOMNAME(%i)} {%ZONENAME(%ROOMZONE(%i))} |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
Saros Newbie
Joined: 19 May 2016 Posts: 9
|
Posted: Sat May 21, 2016 8:14 pm |
Thanks for your input! With your help, I came up with the following..
Sorry about my indentation pattern!
Code: |
#loop 9811 { //9811 being the greatest room number currently used by the mapper
#if (%roomname(%i)!=%null) { //skip rooms with null room names
#if (%zonename(%roomzone(%i))!=%null) { //skip rooms with null zone names
#if (!@roomzonelist.%roomname( %i)) {#addkey {roomzonelist} %roomname( %i) %zonename( %roomzone( %i))} {
$list=@roomzonelist.%roomname( %i)
#if (!%ismember( %zonename( %roomzone( %i), $list))) {
#additem $list %zonename( %roomzone( %i))
#addkey {roomzonelist} %roomname( %i) $list
}
}
}
}
} |
Why? Not everyone uses the mapper, I can share this variable and provide them with similar lookup functionality. #Kludge |
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4692 Location: Pensacola, FL, USA
|
Posted: Sat May 21, 2016 8:44 pm |
Code: |
#LOOP %numrooms {
$name=%roomname(%mapvnum(%i))
$zone=%zonename(%mapvnum(%i))
#IF (($name!=%null)&&($zone!=%null)) {
$zone=%additem(%delitem(%db(@roomListZone, $name), $zone), $zone)
#ADDKEY roomListZone $name $zone
}
} |
%delitem inside the %additem to ensure no duplicates. |
|
_________________ Discord: Shalimarwildcat |
|
|
|
Saros Newbie
Joined: 19 May 2016 Posts: 9
|
Posted: Mon May 23, 2016 3:54 pm |
Slick! Thanks again.
|
|
|
|
|
|