void neighborhood_init(n_byte2 * seed, n_vect2 * location) { n_int park_count = 0; n_int twoblock_count = 0; n_int py = -4; while (py < 4) { n_int px = -4; while (px < 4) { n_vect2 additional; n_byte2 park_probabilty = math_random(seed) & 255; additional.x = location->x + (px * 3400); additional.y = location->y + (py * 3400); if (twoblock_count == (64-8)) { park_probabilty = 255; } if (park_count == 8) { park_probabilty = 0; } if (park_probabilty > 207) { park_init(seed, &additional, &park[park_count++]); } else { twoblock_init(seed, &additional, &twoblock[twoblock_count++]); } px++; } py++; } fences[0].points[0].x = CITY_BOTTOM_LEFT_X; fences[0].points[0].y = CITY_BOTTOM_LEFT_Y; fences[0].points[1].x = CITY_TOP_RIGHT_X; fences[0].points[1].y = CITY_BOTTOM_LEFT_Y; fences[1].points[0].x = CITY_TOP_RIGHT_X; fences[1].points[0].y = CITY_BOTTOM_LEFT_Y; fences[1].points[1].x = CITY_TOP_RIGHT_X; fences[1].points[1].y = CITY_TOP_RIGHT_Y; fences[2].points[0].x = CITY_TOP_RIGHT_X; fences[2].points[0].y = CITY_TOP_RIGHT_Y; fences[2].points[1].x = CITY_BOTTOM_LEFT_X; fences[2].points[1].y = CITY_TOP_RIGHT_Y; fences[3].points[0].x = CITY_BOTTOM_LEFT_X; fences[3].points[0].y = CITY_TOP_RIGHT_Y; fences[3].points[1].x = CITY_BOTTOM_LEFT_X; fences[3].points[1].y = CITY_BOTTOM_LEFT_Y; }
/** * Copy an episodic memory (an anecdote) from one ape to another during chat. * @param local_sim Pointer to the simulation * @param local Pointer to the ape conveying the anecdote * @param other Pointer to the ape to which the anecdote will be copied * @return Returns 1 if the copy was successful, 0 otherwise */ n_byte episodic_anecdote( noble_simulation * local_sim, noble_being * local, noble_being * other) { episodic_memory * local_episodic = GET_EPI(local_sim, local); episodic_memory * other_episodic = GET_EPI(local_sim, other); n_int affect; n_byte event; n_int replace,mult=1; if (local_episodic == 0L || other_episodic == 0L || local == other) { return 0; } affect = (n_int)(local_episodic[GET_A(local,ATTENTION_EPISODE)].affect)-EPISODIC_AFFECT_ZERO; event = local_episodic[GET_A(local,ATTENTION_EPISODE)].event; /** both protagonists must be awake */ if ((event==0) || (being_awake_local(local_sim, local)==FULLY_ASLEEP) || (being_awake_local(local_sim, other)==FULLY_ASLEEP)) { return 0; } if (being_awake_local(local_sim, local)!=FULLY_AWAKE) { /** more likely to make errors while drowsy */ mult=2; } /** mutate with some probability */ if (math_random(local->seed) < (ANECDOTE_EVENT_MUTATION_RATE+ (local->learned_preference[PREFERENCE_ANECDOTE_EVENT_MUTATION])*100)*mult) { event = (n_byte)(math_random(local->seed) % EVENTS); } if (math_random(local->seed) < (ANECDOTE_AFFECT_MUTATION_RATE+ (local->learned_preference[PREFERENCE_ANECDOTE_AFFECT_MUTATION])*100)*mult) { /** affect gets exaggerated or downplayed */ affect = (affect * (64 + (n_int)(math_random(local->seed) & 127))) / 128; /** keep affect within range */ if (affect<-32000) affect=-32000; if (affect>32000) affect=32000; } /** find an index within the other episodic memory in which to insert */ replace = episodic_memory_replace_index( event,affect, local_episodic[GET_A(local,ATTENTION_EPISODE)].first_name[BEING_MEETER], local_episodic[GET_A(local,ATTENTION_EPISODE)].family_name[BEING_MEETER], local_episodic[GET_A(local,ATTENTION_EPISODE)].first_name[BEING_MET], local_episodic[GET_A(local,ATTENTION_EPISODE)].family_name[BEING_MET], local,local_sim); if (replace==-1) return 0; other_episodic[replace] = local_episodic[GET_A(local,ATTENTION_EPISODE)]; other_episodic[replace].event = event; other_episodic[replace].affect = (n_byte2)(affect+EPISODIC_AFFECT_ZERO); /** other ape pays attention to the incoming anecdote */ GET_A(local,ATTENTION_EPISODE) = (n_byte)replace; return 1; }