Re: [Circle] [Code] Bad Code but does work ok. Any fixes?

From: Johan Dustler (Johan.Dustler@epk.ericsson.se)
Date: 11/20/96


If you do it like this instead you don't need the goto statements, and you
can remove the state CON_CLASS_CHECK


case CON_QRACE:
  int_arg = atoi (arg);  // This converts the string to an integer value.
  load_result = parse_race(int_arg);
  if (load_result == RACE_UNDEFINED) {
    SEND_TO_Q("\nThat is an Invalid Race ... *sigh*\n", d);

    return;
  }
  else {
    GET_RACE(d->character) = load_result;
  }

 /* Here you roll the abilities */
    do_start_I(d->character);

 /* And print the result of the rolls */
 /* Then show what classes are availabe */
    parse_class_II(d->character);

 /* Ask the player if he want to keep the stats etc. */
  SEND_TO_Q("Please type [Y]es to re-roll, [R]ace to select another race,\n"
         "[Q]uit to Wimp out or any other key to *accept* these rolls and\n"
	 "continue... [Y/R/Q]:-", d);

  /* Now set STATE */
  STATE(d) = CON_ROLLS;

  break;


CASE CON_ROLLS:

  switch (*arg) {
  case 'y':
  case 'Y':
/* Reroll the abilities */
    do_start_I(d->character);

/* Show the abilities and available classes */
    parse_class_II(d->character);

/* Ask the player if he want to keep the stats etc. */
    SEND_TO_Q("Please type [Y]es to re-roll, [R]ace to select another race,\n"
         "[Q]uit to Wimp out or any other key to *accept* these rolls and\n"
	 "continue... [Y/R/Q]:-", d)

    break;

  case 'r':
  case 'R':
    SEND_TO_Q(race_menu, d);
    SEND_TO_Q("\nWhich Race do you wish to select ? :", d);
    STATE(d) = CON_QRACE;
    break;

  case 'Q':
  case 'q':
    SEND_TO_Q("\nFair Enough .... WIMP! Have fun in reality ...\n\n", d);
    STATE(d) = CON_CLOSE;
    break;

  default:
    SEND_TO_Q(class_menu, d);
    SEND_TO_Q("Please select a class :-", d);
    STATE(d) = CON_QCLASS;
    break;
  }

break;



-Johan



> From: "DJ Pure" <pure@ozramp.net.au>
> 
> G'Day all.
> 	I wanted to add a re-roll function in the Nanny() function.
> I added it fine (after hours of trying to figure out STATE and all this
> other stuff, but I REALLY REALLY don't like MY OWN CODE.
> 
> ** I had to use two *GOTO* statements, and i don't want to (bad programming
> practice ... ****
> 
> Any helps would be appreciated.
> 
> 		Jussy.
> 
> NOTE : The code DOES run fine.
> NOTE 2 : I sorta cannot understand the STATE thingy. As far as I know /
> understand, it checks the roots of the program for the current state it's
> in (like a Finite State machine or something). And if it's not connected it
> goes back to the last state until it gets out of nanny (ie connected and
> playing). But in that loop, it also waits for a user input, which is
> something I DON'T want.
> 
> anyways .. here's my code .. Good Luck! and thanks in advance for any
> helpful idea's
> 
> ----------8<           snip      snip      >8---------------
> <in interpreter.c .. in the nanny function ..>
> ...
> case CON_QRACE:
> 	int_arg = atoi (arg);  // This converts the string to an integer value.
> 	load_result = parse_race(int_arg);
> 	if (load_result == RACE_UNDEFINED)
> 	{
> 		SEND_TO_Q("\nThat is an Invalid Race ... *sigh*\n", d);
> 		SEND_TO_Q("Ok .. Now lets try that again ...\n",d);
> 		return;
> 	}
> 	else {
> 		GET_RACE(d->character) = load_result;
> 	}
> 
> 	// Now lets roll the players abilities.
> 	// Jus - 12/10/96
> 	goto forced_to_do_con_rolls;
> 	//STATE(d) = CON_ROLLS; 
> 	// If i use the STATE .. then i waits for the player to give some input,
> which i 
>             // don't want ...
> break;
> 	
> 
> case CON_ROLLS :
> forced_to_do_con_rolls:		// Unwanted Label added here .. out of necessity
> =(.
> 
> // This is case statement for controlling the players ability to choose
> // their characters ability rolls.
> // Jus - 12/10/96
> 
> 	//Ok. Lets create a new character.
> 	if (!GET_LEVEL(d->character)){
> 		do_start_I(d->character);  // Rolls the die
> 	}
> 
> 	sprintf (buf, "\nCharacter's Rolls -: \n");
> 	// <blahblahblahblah .. lots of sprintf's with ability rolls>
> 	send_to_char(buf, d->character);
> 
> 	// Test for valid classes.
> 	// This function just determins what classes are available to the player,
> dependant
>             // upon RACE and ROLLS (they are displayed to the screen)
> 	parse_class_II(d->character);
> 
> 	SEND_TO_Q("Please type [Y]es to re-roll, [R]ace to select another race,\n"
> 		"[Q]uit to Wimp out or any other key to *accept* these rolls and\n"
> 		"continue... [Y/R/Q]:-", d);
> 	STATE(d) = CON_CLASS_CHECK;
> 	break;
> 
> 
> 	// This Checks to see if the user wants to continue or not.
> case CON_CLASS_CHECK:	
> 	switch (*arg) {
> 	case 'Y' : case 'YE' : case 'YES' : case 'y' : case 'ye' : 
> 	case 'yes' : case 'Yes' :
> 		send_to_char ("Ok. Re-rolling your character ...", d->character);
> 		d->character->player.level = 0;
> 		goto forced_to_do_con_rolls;
> // I DON'T WANT THAT GOTO ADDED HERE ALSO, but i need it .. =(
> 		break;
> 
> 	case 'Q' : case 'q' : case 'quit' : case 'Quit' :
> 		send_to_char ("\nFair Enough .... WIMP! Have fun in reality ...\n\n",
> 		d->character);
> 		close_socket(d); break;
> 
> 	case 'R' : case 'r' : case 'race' : case 'Race' :
> 		SEND_TO_Q(race_menu, d);
> 		SEND_TO_Q("\nWhich Race do you wish to select ? :", d);
> 		STATE(d) = CON_QRACE;
> 		break;
> 
> 	default :
> 		SEND_TO_Q(class_menu, d);
> 		SEND_TO_Q("Please Select a Class :-", d);
> 		STATE(d) = CON_QCLASS;
> 		break;
> 	}
> break;
> 
> 
> 
>   case CON_QCLASS:
> 	etc etc etc etc ..
> 
> thanks and good luck.
> 
> +-----------------------------------------------------------+
> | Ensure that you have read the CircleMUD Mailing List FAQ: |
> |   http://cspo.queensu.ca/~fletcher/Circle/list_faq.html   |
> +-----------------------------------------------------------+
> 
> 
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   http://cspo.queensu.ca/~fletcher/Circle/list_faq.html   |
+-----------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/18/00 PST