a
    w^iA                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlZe	e
ZG dd dZG dd	 d	ZG d
d deZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZdS )a[  
Core Game Model Classes

This file contains the core data model classes for BaoLife (formerly Project Lichun).
These classes define the fundamental game entities including players, characters,
locations, activities, schedules, and relationships.

Classes:
    - locationClass: Represents a location in the game world
    - ActivityRecord: Base class for tracking activities
    - EducationRecord: Tracks education activities (extends ActivityRecord)
    - dailyEvent: Represents a scheduled daily event
    - playerClass: Main player/game state container
    - personClass: Represents any character (player or NPC)
    - oneTimeEvent: Represents a one-time scheduled event
    - scheduleDays: Defines days/times for scheduled events
    - scheduler: Manages recurring schedules for characters
    - relationshipClass: Tracks relationships between characters
    N)date)SimpleNamespace)configc                   @   s   e Zd ZdddZdS )locationClassNc                 C   s(   || _ || _|| _d| _g | _d| _d S )N ZlocationObject)idtypeimagedescriptionZpeople)selfr   r   r	    r   ,/var/www/lichun.app/lichun/ws/core/models.py__init__%   s    zlocationClass.__init__)N__name__
__module____qualname__r   r   r   r   r   r   $   s   r   c                   @   s   e Zd Zdd ZdS )ActivityRecordc                 C   s.   || _ || _|| _g | _d| _d | _d| _d S )N2   ZBalanced)r   r   ZdateStartedZachievementsperformancelevelfocus)r   r   r   r   r   r   r   r   /   s    zActivityRecord.__init__Nr   r   r   r   r   r   .   s   r   c                       s   e Zd Z fddZ  ZS )EducationRecordc                    s.   t  |jd| || _d | _d | _d| _d S )N	educationK   )superr   r   educationLevelmajorminorZGPA)r   r   locationr   	__class__r   r   r   :   s
    zEducationRecord.__init__)r   r   r   r   __classcell__r   r   r    r   r   9   s   r   c                   @   s   e Zd Zdd ZdS )
dailyEventc                 C   s   || _ d| _d| _|| _d S )Nr   )timetitlenamer   )r   r$   r   r   r   r   r   C   s    zdailyEvent.__init__Nr   r   r   r   r   r#   B   s   r#   c                   @   s   e Zd Zdd ZdS )playerClassc                 C   s  ddl m} ddlm}m}m}m}m} ddlm	}m
} ddlm}	 ddlm}
 d| _d| _d	| _d
| _d| _d| _t | _t | _g | _g | _g | _| jd g | _tdd| _tj | _!tj | _"d| _#d| _$d| _%t&t'( )d| _*t&t'( )d| _+|| j+| _,t-t'( )d| _'d| _.d| _/d| _0t'( 1 | _2d	| _3d| _4d| _5d| _6d	| _7g d| _8| d | _9| d | _:| | _;|| j;| _<| | _=| | _>| | _?|	 | _@| | _A|
 | _Bg d| _Cg d| _DtE | _Fd| jF_Gg | _Hg | _Ig | _Jd| _Kd S )Nr   )
get_season)
getSchoolsgetColleges	getMajors
getFocusesgetExtraCurriculars)getStoreItemsgetInAppPurchaseItems)getHealthConditions)getDateIdeasZinactive	connectedFZcreatingr   z(Welcome to BaoLife! Your journey awaits.)ZminutesOffline   z%jz%m%m-%dCalmZStressedZ	ExhaustedZ	FulfilledZ	DepressedZHappy   )ZbobZbunZcurlyZlong_not_too_longZshaggyZ
straight_1Z
straight_2)ZbuzzcutZ
short_flatZshort_roundZshort_wavedZsidesZplayerObject)Lutils.helpersr(   education.education_managerr)   r*   r+   r,   r-   shop.shop_managerr.   r/   health.health_managerr0   "relationships.relationship_managerr1   
controller
connectionupdateClientstatusdayEventdeviceTokenseteventsaskedQuestionsconversationsactiveDilemmasmessageQueueappendZ
messageLogr   ZofflineStatsr   SPEED_DEFAULT	gameSpeedpreviousGameSpeedZmessageEnergyCostticksZfpsintr   todaystrftime	dayOfYearmonthOfYearZseasonstrZminuteOfHour	hourOfDayZ	dayOfWeekweekdayZweekDayweekendZweekDayTextZdaysSinceSchoolStartedZdaysUntilSchoolEndsZsummerVacationZmoodselementary_schoolshigh_schoolscollegesmajorsZfocusesZ
storeItemsZinAppPurchaseshealthConditionsextraCurricularsZ	dateIdeasZfemale_hair_typesZmale_hair_typespersonClasscr	   rlrelDatar   )r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   r   r   K   sp    


zplayerClass.__init__Nr   r   r   r   r   r'   J   s   r'   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r]   c           
   	   C   s8  ddl m} ddlm} ddlm}m}m}m} t	
 j| _d| _g | _d| _| | _tdd}dd	g| | _d
dg| | _d| _d| _d| _d| _d| _d| _d| _d| _|| j| _d| _d| _d| _ d| _!d| _"d| _#d| _$d| _%d| _&tdd| _'d| _(d| _)d| _*d| _+g dtdd | _,g | _-d| _.d | _/d | _0d | _1d | _2d| _3d| _4d | _5d | _6d | _7g | _8g | _9g | _:g | _;g | _<g | _=d| _>tddd | _?d| _@d| _Ag | _Bg | _Cg | _Dd| _Ed| _Fd| _GtHtIg d| || d|| || | J d| _Kd| _ddlLmM}mN}	 | | _O|	 | _Pd S )Nr   )get_lastname)getWeightType)get_skin_colorget_hair_typeget_facial_hairget_accessoryZpersonObjectr   r7   MaleFemaleHeSheFz*https://api.dicebear.com/7.x/avataaars/svgr6   7   d   #   home)ZfrugalZnormalZextravagant   None	preschoolr      alive)ZblazerAndShirtZblazerAndSweaterZcollarAndSweaterZgraphicShirtZhoodieZshirtCrewNeckZshirtScoopNeckZ
shirtVNeckZAUBURN)ZclothingZ
skin_colorZhairZ
hair_colorZfacial_hairZ	accessoryZmouth)initialize_messaging_traitsinitialize_messaging_patterns)Qcharacter.character_managerrb   r;   rc   character.appearancerd   re   rf   rg   uuiduuid4hexr   r   relationships	firstnamelastnamerandomrandintsexpronounmessageZageHoursageDaysageYearsr	   moodZmoneyweightZ
weightTypeZhungerZthirstenergyZ
calcEnergyZ
peakEnergyZprestigeZdiamondsstresssocial	happinessr   healthZdeathChancefamilyLevelZspendingHabitsactivityRecordsr   current_educationelementary_schoolhigh_schoolcollegeactScore
occupationjobr   r   
activitieshabitsr[   dislikeslikesitemscanDriveaffinityfamiliarityr@   Z	dailyPlan	schedulesoneTimeEventsZintraDayMessagetryingForChildpartnerr   choiceget_mouth_typeZavatar_settingsmessaging_styleru   rv   messaging_traitsmessaging_patterns)
r   rb   rc   rd   re   rf   rg   indexru   rv   r   r   r   r      s    zpersonClass.__init__c                 C   s   | j dkrd| _nd| _d S )Nrh   rj   rk   )r   r   )r   r   r   r   
setPronoun   s    
zpersonClass.setPronounc                 C   s    ddddddd}| | jdS )z
        Get mouth expression type based on current mood.

        Returns:
            str: Mouth expression type for avatar
        defaultZ	concernedZseriousZsmileZsadr5   )getr   )r   Zmood_mouth_mappingr   r   r   r      s    

zpersonClass.get_mouth_typeN)r   r   r   r   r   r   r   r   r   r   r]      s   Tr]   c                   @   s4   e Zd Zddddddi fddZdd	 Zd
d ZdS )oneTimeEventFr   r   Nr   c                 C   sx   t  j| _|| _|| _|| _|| _|| _|| _	d| _
|| _|	| _|
| _| jdkrZ|| _n| jdkrt|| _|  | _d S )NZoneTimeEventObjectr   daysFromNow)ry   rz   r{   r   r   r%   dateTypedateModifierhourr   r   completionFunccompletionArgscompletionKwargsr   findDate)r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r      s     

zoneTimeEvent.__init__c                 C   s~   | j dkr| jS | j dkrz| jrzddlm}m} |  jd| j7  _|| jd}||| jd }|	d| _| jS d S )	Nr   r   r   )datetime	timedeltaz-{}z%m-%d-%Y)daysr4   )
r   r   r   r   r   formatnowyearstrptimerP   )r   r   r   Zdate_objectZnew_date_objectr   r   r   r     s    
zoneTimeEvent.findDatec                 C   s&   | j r"| j |g| jR i | j d S N)r   r   r   )r   playerr   r   r   run_func  s    zoneTimeEvent.run_func)r   r   r   r   r   r   r   r   r   r   r      s
   
r   c                   @   s   e Zd Zdd ZdS )scheduleDaysc                 C   s   || _ || _|| _d S r   )Z
daysOfWeekr   r   )r   r   r   r   r   r   r   r   !  s    zscheduleDays.__init__Nr   r   r   r   r   r      s   r   c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )	schedulerr3   c                 C   sN   |t  j | _|| _d| _|| _|| _|| _g d| _	d| _
| || _d S )Nr   )onceweeklydaily
twice-weekthrice-weekmorning	afternooneveningnightrV   rU   workdayschoolr   workro   outZschedulerObject)ry   rz   r{   r   r%   Z
executionsdurationr   
conditionsZconditionsOptionsr   findWeekDaysr   )r   personZplannamer   r   r   r   r   r   r   (  s    
zscheduler.__init__c                 C   s4  |dkr|dk o|dkS |dkr0|dk o.|dkS |dkrH|dkoF|dkS |dkr`|dko^|d	k S |d
krx|dkov|d	k S |dkr|dko|d	k S |dkr|dkS |dkr|dk S |dkr|dk o|j dkS |dkrd|jv S |dk rd|jv S |dkrd|jv S |dkrd|jv S |dkr,d|jvS dS d S )Nr         r      r      r      afterSchool   Z	afterWork   rV   r3   rU   r   r   r   r   ro   r   F)r   r   )r   dayr$   r   	conditionr   r   r   parseConditions5  s:    








zscheduler.parseConditionsc                 C   sn   t dt| jD ]X}| j| dkr| j| dkr| j| dkr| j| dkr| |||| j| r dS qdS )Nr   r   r   r   r   TF)rangelenr   r   )r   ZdayTestZhourTestr   ir   r   r   checkConditionsV  s    zscheduler.checkConditionsc                 C   s  d| j v rPtddD ]:}tddD ]*}| |||r"tt||d    S q"qd| j v rtddD ]:}tddD ]*}| |||rrtt||d    S qrqdn8d| j v rd}tddD ]2}tddD ]"}| |||r|t| } qqqt||dS d	| j v rld}tddD ]H}tddD ]6}| |||r$t|d
k r$|t| } qq$qt||d	S d| j v rd}tddD ]H}tddD ]6}| |||rt|dk r|t| } qqqt||dS dS )Nr   r7      r   r   r   r   r   r   rp   r      F)r   r   r   r   rS   r   )r   r   r   r   Z	daysFoundr   r   r   r   ^  sF    

 
zscheduler.findWeekDaysN)r3   )r   r   r   r   r   r   r   r   r   r   r   r   '  s   
!r   c                   @   s"   e Zd ZdddZedd ZdS )relationshipClassNc                 C   s   t  j| _|| _|| _|| _|| _|| _|| _	g | _
|d urB|n
tdd| _g | _g | _g | _ddddddddddd
| _d S )Nr7   rm   r   neutral)
	verbosityZinquisitivenessZexpressivenessZresponsivenessZopennessZemoji_usageZ	formalityZresponse_timingZ
mood_stateZcurrent_topic_engagement)ry   rz   r{   r   person1person2	startDateanniversaryDaterelationshipStatusrelationshipNotes	eventsLogr   r   relationshipScorecommonInterests
challengesfuturePlansmessaging_modifiers)r   r   r   r   r   r   scorer   r   r   r     s.    zrelationshipClass.__init__c                 C   sj   | |d |d |d |d |d |d }|d |_ |d |_|d	 |_|d
 |_|d |_|d |_|S )Nr   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )clsdatarelationshipr   r   r   	from_dict  s    





zrelationshipClass.from_dict)N)r   r   r   r   classmethodr   r   r   r   r   r     s   
r   )__doc__r   ry   r   r   typesr   r   logging	getLoggerr   loggerr   r   r   r#   r'   r]   r   r   r   r   r   r   r   r   <module>   s$   

	?q&a